mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-17 21:18:16 -06:00
14438 review changes
This commit is contained in:
parent
1ea0b6d83f
commit
af2c642de3
@ -512,12 +512,10 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ScriptSerializer(ValidatedModelSerializer):
|
class ScriptSerializer(ValidatedModelSerializer):
|
||||||
id = serializers.CharField(read_only=True)
|
url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail')
|
||||||
url = serializers.HyperlinkedIdentityField(view_name='extras-api:script-detail',)
|
|
||||||
description = serializers.SerializerMethodField(read_only=True)
|
description = serializers.SerializerMethodField(read_only=True)
|
||||||
vars = serializers.SerializerMethodField(read_only=True)
|
vars = serializers.SerializerMethodField(read_only=True)
|
||||||
result = serializers.SerializerMethodField(read_only=True)
|
result = serializers.SerializerMethodField(read_only=True)
|
||||||
display = serializers.SerializerMethodField(read_only=True)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Script
|
model = Script
|
||||||
|
@ -9,10 +9,9 @@ from rest_framework.generics import RetrieveUpdateDestroyAPIView
|
|||||||
from rest_framework.renderers import JSONRenderer
|
from rest_framework.renderers import JSONRenderer
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.routers import APIRootView
|
from rest_framework.routers import APIRootView
|
||||||
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet, ViewSet
|
from rest_framework.viewsets import ModelViewSet, ReadOnlyModelViewSet
|
||||||
from rq import Worker
|
from rq import Worker
|
||||||
|
|
||||||
from core.choices import JobStatusChoices
|
|
||||||
from core.models import Job
|
from core.models import Job
|
||||||
from extras import filtersets
|
from extras import filtersets
|
||||||
from extras.models import *
|
from extras.models import *
|
||||||
@ -216,7 +215,7 @@ class ConfigTemplateViewSet(SyncedDataMixin, ConfigTemplateRenderMixin, NetBoxMo
|
|||||||
|
|
||||||
class ScriptViewSet(ModelViewSet):
|
class ScriptViewSet(ModelViewSet):
|
||||||
permission_classes = [IsAuthenticatedOrLoginNotRequired]
|
permission_classes = [IsAuthenticatedOrLoginNotRequired]
|
||||||
queryset = Script.objects.all().prefetch_related('jobs')
|
queryset = Script.objects.prefetch_related('jobs')
|
||||||
serializer_class = serializers.ScriptSerializer
|
serializer_class = serializers.ScriptSerializer
|
||||||
# filterset_class = filtersets.ScriptFilterSet
|
# filterset_class = filtersets.ScriptFilterSet
|
||||||
|
|
||||||
@ -225,20 +224,9 @@ class ScriptViewSet(ModelViewSet):
|
|||||||
lookup_value_regex = '[^/]+' # Allow dots
|
lookup_value_regex = '[^/]+' # Allow dots
|
||||||
|
|
||||||
def _get_script(self, pk):
|
def _get_script(self, pk):
|
||||||
# check if includes '.' for old module.script lookup
|
pk = int(pk)
|
||||||
if '.' in pk:
|
script = get_object_or_404(self.queryset, pk=pk)
|
||||||
try:
|
module = script.module
|
||||||
module_name, script_name = pk.split('.', maxsplit=1)
|
|
||||||
except ValueError:
|
|
||||||
raise Http404
|
|
||||||
|
|
||||||
module, script = get_module_and_script(module_name, script_name)
|
|
||||||
if script is None:
|
|
||||||
raise Http404
|
|
||||||
else:
|
|
||||||
pk = int(pk)
|
|
||||||
script = get_object_or_404(self.queryset, pk=pk)
|
|
||||||
module = script.module
|
|
||||||
|
|
||||||
return module, script
|
return module, script
|
||||||
|
|
||||||
|
@ -125,9 +125,9 @@ class Migration(migrations.Migration):
|
|||||||
name='Script',
|
name='Script',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||||
('name', models.CharField(max_length=79)),
|
('name', models.CharField(editable=False, max_length=79)),
|
||||||
('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='scripts', to='extras.scriptmodule')),
|
('module', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.CASCADE, related_name='scripts', to='extras.scriptmodule')),
|
||||||
('is_executable', models.BooleanField(default=True))
|
('is_executable', models.BooleanField(editable=False, default=True))
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'ordering': ('module', 'name'),
|
'ordering': ('module', 'name'),
|
||||||
|
@ -27,15 +27,18 @@ class Script(EventRulesMixin, JobsMixin, models.Model):
|
|||||||
name = models.CharField(
|
name = models.CharField(
|
||||||
verbose_name=_('name'),
|
verbose_name=_('name'),
|
||||||
max_length=79, # Maximum length for a Python class name
|
max_length=79, # Maximum length for a Python class name
|
||||||
|
editable=False,
|
||||||
)
|
)
|
||||||
module = models.ForeignKey(
|
module = models.ForeignKey(
|
||||||
to='extras.ScriptModule',
|
to='extras.ScriptModule',
|
||||||
on_delete=models.CASCADE,
|
on_delete=models.CASCADE,
|
||||||
related_name='scripts'
|
related_name='scripts',
|
||||||
|
editable=False
|
||||||
)
|
)
|
||||||
is_executable = models.BooleanField(
|
is_executable = models.BooleanField(
|
||||||
default=True,
|
default=True,
|
||||||
verbose_name=_('is executable')
|
verbose_name=_('is executable'),
|
||||||
|
editable=False
|
||||||
)
|
)
|
||||||
events = GenericRelation(
|
events = GenericRelation(
|
||||||
'extras.EventRule',
|
'extras.EventRule',
|
||||||
@ -51,7 +54,7 @@ class Script(EventRulesMixin, JobsMixin, models.Model):
|
|||||||
constraints = (
|
constraints = (
|
||||||
models.UniqueConstraint(
|
models.UniqueConstraint(
|
||||||
fields=('name', 'module'),
|
fields=('name', 'module'),
|
||||||
name='%(app_label)s_%(class)s_unique_name_module'
|
name='extras_script_unique_name_module'
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
verbose_name = _('script')
|
verbose_name = _('script')
|
||||||
@ -65,7 +68,7 @@ class Script(EventRulesMixin, JobsMixin, models.Model):
|
|||||||
return self.module.get_module_scripts.get(self.name)
|
return self.module.get_module_scripts.get(self.name)
|
||||||
|
|
||||||
def delete_if_no_jobs(self):
|
def delete_if_no_jobs(self):
|
||||||
if self.jobs.all():
|
if self.jobs.exists():
|
||||||
self.is_executable = False
|
self.is_executable = False
|
||||||
self.save()
|
self.save()
|
||||||
else:
|
else:
|
||||||
@ -122,15 +125,11 @@ class ScriptModule(PythonModuleMixin, JobsMixin, ManagedFile):
|
|||||||
return scripts
|
return scripts
|
||||||
|
|
||||||
def sync_classes(self):
|
def sync_classes(self):
|
||||||
db_classes = {}
|
db_classes = {
|
||||||
for obj in self.scripts.filter(module=self):
|
script.name: script for script in self.scripts.all()
|
||||||
db_classes[obj.name] = obj
|
}
|
||||||
|
db_classes_set = set(db_classes.keys())
|
||||||
db_classes_set = {k for k in db_classes.keys()}
|
module_classes_set = set(self.get_module_scripts.keys())
|
||||||
|
|
||||||
module_scripts = self.get_module_scripts
|
|
||||||
|
|
||||||
module_classes_set = {k for k in module_scripts.keys()}
|
|
||||||
|
|
||||||
# remove any existing db classes if they are no longer in the file
|
# remove any existing db classes if they are no longer in the file
|
||||||
removed = db_classes_set - module_classes_set
|
removed = db_classes_set - module_classes_set
|
||||||
|
@ -1069,11 +1069,6 @@ class BaseScriptView(ContentTypePermissionRequiredMixin, generic.ObjectView):
|
|||||||
self.script = get_object_or_404(Script.objects.all(), pk=pk)
|
self.script = get_object_or_404(Script.objects.all(), pk=pk)
|
||||||
return self._init_vars(request)
|
return self._init_vars(request)
|
||||||
|
|
||||||
def get_script_by_module_name(self, request, module, name):
|
|
||||||
module = get_script_module(module, request)
|
|
||||||
self.script = get_object_or_404(Script.objects.all(), module=module, name=name)
|
|
||||||
return self._init_vars(request)
|
|
||||||
|
|
||||||
|
|
||||||
class ScriptView(BaseScriptView):
|
class ScriptView(BaseScriptView):
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user