From 7ae6d821fa52543823335db0c32ac27d871eb0f2 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 27 Jan 2023 14:39:36 -0500 Subject: [PATCH] Add data file UI view --- netbox/core/filtersets.py | 10 ++-- netbox/core/forms/filtersets.py | 8 +-- netbox/core/models/data.py | 10 ++++ netbox/core/tables/data.py | 3 ++ netbox/core/urls.py | 1 + netbox/core/views.py | 19 +++++-- netbox/templates/core/datafile.html | 77 +++++++++++++++++++++++++++ netbox/templates/core/datasource.html | 2 + 8 files changed, 120 insertions(+), 10 deletions(-) create mode 100644 netbox/templates/core/datafile.html diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index 7bcab60af..64f5052c0 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -3,6 +3,7 @@ from django.utils.translation import gettext as _ import django_filters +from netbox.filtersets import ChangeLoggedModelFilterSet from .models import * __all__ = ( @@ -11,7 +12,7 @@ __all__ = ( ) -class DataSourceFilterSet(django_filters.FilterSet): +class DataSourceFilterSet(ChangeLoggedModelFilterSet): class Meta: model = DataSource @@ -27,11 +28,14 @@ class DataSourceFilterSet(django_filters.FilterSet): class DataFileFilterSet(django_filters.FilterSet): - datasource_id = django_filters.ModelMultipleChoiceFilter( + q = django_filters.CharFilter( + method='search' + ) + source_id = django_filters.ModelMultipleChoiceFilter( queryset=DataSource.objects.all(), label=_('Data source (ID)'), ) - datasource = django_filters.ModelMultipleChoiceFilter( + source = django_filters.ModelMultipleChoiceFilter( field_name='source__name', queryset=DataSource.objects.all(), to_field_name='name', diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index 8f0e98d8d..e71591edd 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -1,4 +1,5 @@ from django import forms +from django.utils.translation import gettext as _ from core.choices import * from core.models import * @@ -38,11 +39,12 @@ class DataFileFilterForm(NetBoxModelFilterSetForm): model = DataFile fieldsets = ( (None, ('q', 'filter_id')), - ('File', ('datasource_id',)), + ('File', ('source_id',)), ) - datasource_id = DynamicModelMultipleChoiceField( + source_id = DynamicModelMultipleChoiceField( queryset=DataSource.objects.all(), - required=False + required=False, + label=_('Data source') ) type = MultipleChoiceField( choices=DataSourceTypeChoices, diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index e84f912a4..e847f83f1 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -306,6 +306,16 @@ class DataFile(models.Model): def __str__(self): return self.path + def get_absolute_url(self): + return reverse('core:datafile', args=[self.pk]) + + @property + def data_as_string(self): + try: + return self.data.tobytes().decode('utf-8') + except UnicodeDecodeError: + return None + def refresh_from_disk(self, source_root): """ Update instance attributes from the file on disk. Returns True if any attribute diff --git a/netbox/core/tables/data.py b/netbox/core/tables/data.py index f31d6bf90..e3e691bdd 100644 --- a/netbox/core/tables/data.py +++ b/netbox/core/tables/data.py @@ -33,6 +33,9 @@ class DataFileTable(NetBoxTable): source = tables.Column( linkify=True ) + path = tables.Column( + linkify=True + ) last_updated = columns.DateTimeColumn() actions = None diff --git a/netbox/core/urls.py b/netbox/core/urls.py index aa24af100..ae9eae9cf 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -16,5 +16,6 @@ urlpatterns = ( # Data files path('data-files/', views.DataFileListView.as_view(), name='datafile_list'), + path('data-files//', include(get_model_urls('core', 'datafile'))), ) diff --git a/netbox/core/views.py b/netbox/core/views.py index 519577c0e..ec398938f 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -1,14 +1,11 @@ from django.contrib import messages -from django.contrib.contenttypes.models import ContentType from django.shortcuts import get_object_or_404, redirect -from extras.models import JobResult from netbox.views import generic from netbox.views.generic.base import BaseObjectView from utilities.utils import count_related from utilities.views import register_model_view -from . import filtersets, forms, jobs, tables -from .choices import * +from . import filtersets, forms, tables from .models import * @@ -29,6 +26,15 @@ class DataSourceListView(generic.ObjectListView): class DataSourceView(generic.ObjectView): queryset = DataSource.objects.all() + def get_extra_context(self, request, instance): + related_models = ( + (DataFile.objects.restrict(request.user, 'view').filter(source=instance), 'source_id'), + ) + + return { + 'related_models': related_models, + } + @register_model_view(DataSource, 'sync') class DataSourceSyncView(BaseObjectView): @@ -94,3 +100,8 @@ class DataFileListView(generic.ObjectListView): filterset_form = forms.DataFileFilterForm table = tables.DataFileTable actions = ('edit',) + + +@register_model_view(DataFile) +class DataFileView(generic.ObjectView): + queryset = DataFile.objects.all() diff --git a/netbox/templates/core/datafile.html b/netbox/templates/core/datafile.html new file mode 100644 index 000000000..0e301ad66 --- /dev/null +++ b/netbox/templates/core/datafile.html @@ -0,0 +1,77 @@ +{% extends 'generic/object.html' %} +{% load custom_links %} +{% load helpers %} +{% load plugins %} + +{% block breadcrumbs %} + {{ block.super }} + +{% endblock %} + +{% block controls %} + {# Clone/Edit/Delete Buttons #} +
+
+ {% plugin_buttons object %} +
+
+ {% custom_links object %} +
+
+{% endblock controls %} + +{% block content %} +
+
+
+
Data File
+
+ + + + + + + + + + + + + + + + + + + + + +
Source{{ object.source }}
Path + {{ object.path }} + + + +
Last Updated{{ object.last_updated }}
Size{{ object.size }} byte{{ object.size|pluralize }}
SHA256 Hash + {{ object.hash }} + + + +
+
+
+
+
Content
+
+
{{ object.data_as_string }}
+
+
+ {% plugin_left_page object %} +
+
+
+
+ {% plugin_full_width_page object %} +
+
+{% endblock %} diff --git a/netbox/templates/core/datasource.html b/netbox/templates/core/datasource.html index ccf202420..e5047849c 100644 --- a/netbox/templates/core/datasource.html +++ b/netbox/templates/core/datasource.html @@ -95,6 +95,8 @@ + + {% include 'inc/panels/related_objects.html' %} {% include 'inc/panels/custom_fields.html' %} {% plugin_right_page object %}