Misc cleanup

This commit is contained in:
jeremystretch 2023-03-24 20:46:08 -04:00
parent e7a26dccc6
commit 76c4ecab2f
7 changed files with 30 additions and 24 deletions

View File

@ -33,3 +33,17 @@ class DataSourceStatusChoices(ChoiceSet):
(COMPLETED, _('Completed'), 'green'), (COMPLETED, _('Completed'), 'green'),
(FAILED, _('Failed'), 'red'), (FAILED, _('Failed'), 'red'),
) )
#
# Managed files
#
class ManagedFileRootPathChoices(ChoiceSet):
SCRIPTS = 'scripts' # settings.SCRIPTS_ROOT
REPORTS = 'reports' # settings.REPORTS_ROOT
CHOICES = (
(SCRIPTS, _('Scripts')),
(REPORTS, _('Reports')),
)

View File

@ -96,6 +96,8 @@ class ManagedFileForm(SyncedDataMixin, NetBoxModelForm):
if self.cleaned_data.get('upload_file') and self.cleaned_data.get('data_file'): if self.cleaned_data.get('upload_file') and self.cleaned_data.get('data_file'):
raise forms.ValidationError("Cannot upload a file and sync from an existing file") raise forms.ValidationError("Cannot upload a file and sync from an existing file")
if not self.cleaned_data.get('upload_file') and not self.cleaned_data.get('data_file'):
raise forms.ValidationError("Must upload a file or select a data file to sync")
return self.cleaned_data return self.cleaned_data

View File

@ -6,6 +6,7 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from ..choices import ManagedFileRootPathChoices
from netbox.models.features import SyncedDataMixin from netbox.models.features import SyncedDataMixin
from utilities.querysets import RestrictedQuerySet from utilities.querysets import RestrictedQuerySet
@ -15,15 +16,11 @@ __all__ = (
logger = logging.getLogger('netbox.core.files') logger = logging.getLogger('netbox.core.files')
ROOT_PATH_CHOICES = (
('scripts', 'Scripts Root'),
('reports', 'Reports Root'),
)
class ManagedFile(SyncedDataMixin, models.Model): class ManagedFile(SyncedDataMixin, models.Model):
""" """
Database representation for a file on disk. Database representation for a file on disk. This class is typically wrapped by a proxy class (e.g. ScriptModule)
to provide additional functionality.
""" """
created = models.DateTimeField( created = models.DateTimeField(
auto_now_add=True auto_now_add=True
@ -35,7 +32,7 @@ class ManagedFile(SyncedDataMixin, models.Model):
) )
file_root = models.CharField( file_root = models.CharField(
max_length=1000, max_length=1000,
choices=ROOT_PATH_CHOICES choices=ManagedFileRootPathChoices
) )
file_path = models.FilePathField( file_path = models.FilePathField(
editable=False, editable=False,

View File

@ -17,10 +17,6 @@ WEBHOOK_EVENT_TYPES = {
EVENT_JOB_END: 'job_ended', EVENT_JOB_END: 'job_ended',
} }
# Managed files
REPORTS_ROOT_NAME = 'reports'
SCRIPTS_ROOT_NAME = 'scripts'
# Dashboard # Dashboard
DEFAULT_DASHBOARD = [ DEFAULT_DASHBOARD = [
{ {

View File

@ -5,6 +5,7 @@ import uuid
from functools import cached_property from functools import cached_property
from pkgutil import ModuleInfo, get_importer from pkgutil import ModuleInfo, get_importer
import django_rq
from django.conf import settings from django.conf import settings
from django.contrib import admin from django.contrib import admin
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -20,12 +21,12 @@ from django.utils import timezone
from django.utils.formats import date_format from django.utils.formats import date_format
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from rest_framework.utils.encoders import JSONEncoder from rest_framework.utils.encoders import JSONEncoder
import django_rq
from core.choices import ManagedFileRootPathChoices
from core.models import ManagedFile from core.models import ManagedFile
from extras.choices import * from extras.choices import *
from extras.constants import *
from extras.conditions import ConditionSet from extras.conditions import ConditionSet
from extras.constants import *
from extras.utils import FeatureQuery, image_upload, is_report, is_script from extras.utils import FeatureQuery, image_upload, is_report, is_script
from netbox.config import get_config from netbox.config import get_config
from netbox.constants import RQ_QUEUE_DEFAULT from netbox.constants import RQ_QUEUE_DEFAULT
@ -853,7 +854,7 @@ class Script(JobResultsMixin, WebhooksMixin, models.Model):
class ScriptModuleManager(models.Manager.from_queryset(RestrictedQuerySet)): class ScriptModuleManager(models.Manager.from_queryset(RestrictedQuerySet)):
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(file_root='scripts') return super().get_queryset().filter(file_root=ManagedFileRootPathChoices.SCRIPTS)
class ScriptModule(PythonModuleMixin, ManagedFile): class ScriptModule(PythonModuleMixin, ManagedFile):
@ -888,7 +889,7 @@ class ScriptModule(PythonModuleMixin, ManagedFile):
return scripts return scripts
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.file_root = SCRIPTS_ROOT_NAME self.file_root = ManagedFileRootPathChoices.SCRIPTS
return super().save(*args, **kwargs) return super().save(*args, **kwargs)
@ -907,7 +908,7 @@ class Report(JobResultsMixin, WebhooksMixin, models.Model):
class ReportModuleManager(models.Manager.from_queryset(RestrictedQuerySet)): class ReportModuleManager(models.Manager.from_queryset(RestrictedQuerySet)):
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(file_root='reports') return super().get_queryset().filter(file_root=ManagedFileRootPathChoices.REPORTS)
class ReportModule(PythonModuleMixin, ManagedFile): class ReportModule(PythonModuleMixin, ManagedFile):
@ -942,5 +943,5 @@ class ReportModule(PythonModuleMixin, ManagedFile):
return reports return reports
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
self.file_root = REPORTS_ROOT_NAME self.file_root = ManagedFileRootPathChoices.REPORTS
return super().save(*args, **kwargs) return super().save(*args, **kwargs)

View File

@ -1,13 +1,9 @@
import threading
from django.db.models import Q from django.db.models import Q
from django.utils.deconstruct import deconstructible from django.utils.deconstruct import deconstructible
from taggit.managers import _TaggableManager from taggit.managers import _TaggableManager
from netbox.registry import registry from netbox.registry import registry
lock = threading.Lock()
def is_taggable(obj): def is_taggable(obj):
""" """

View File

@ -7,6 +7,7 @@ from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse from django.urls import reverse
from django.views.generic import View from django.views.generic import View
from core.choices import ManagedFileRootPathChoices
from core.forms import ManagedFileForm from core.forms import ManagedFileForm
from extras.dashboard.forms import DashboardWidgetAddForm, DashboardWidgetForm from extras.dashboard.forms import DashboardWidgetAddForm, DashboardWidgetForm
from extras.dashboard.utils import get_widget_class from extras.dashboard.utils import get_widget_class
@ -19,7 +20,6 @@ from utilities.utils import copy_safe_request, count_related, get_viewname, norm
from utilities.views import ContentTypePermissionRequiredMixin, register_model_view from utilities.views import ContentTypePermissionRequiredMixin, register_model_view
from . import filtersets, forms, tables from . import filtersets, forms, tables
from .choices import JobResultStatusChoices from .choices import JobResultStatusChoices
from .constants import SCRIPTS_ROOT_NAME, REPORTS_ROOT_NAME
from .forms.reports import ReportForm from .forms.reports import ReportForm
from .models import * from .models import *
from .reports import get_report, run_report from .reports import get_report, run_report
@ -798,7 +798,7 @@ class ReportModuleCreateView(generic.ObjectEditView):
form = ManagedFileForm form = ManagedFileForm
def alter_object(self, obj, *args, **kwargs): def alter_object(self, obj, *args, **kwargs):
obj.file_root = REPORTS_ROOT_NAME obj.file_root = ManagedFileRootPathChoices.REPORTS
return obj return obj
@ -937,7 +937,7 @@ class ScriptModuleCreateView(generic.ObjectEditView):
form = ManagedFileForm form = ManagedFileForm
def alter_object(self, obj, *args, **kwargs): def alter_object(self, obj, *args, **kwargs):
obj.file_root = SCRIPTS_ROOT_NAME obj.file_root = ManagedFileRootPathChoices.SCRIPTS
return obj return obj