From 5f73b556230953b6c1179d1ba5448b6c62c951af Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 7 Feb 2023 15:12:49 -0500 Subject: [PATCH] Add bulk sync view for config contexts --- netbox/extras/tables/tables.py | 11 ++++--- netbox/extras/urls.py | 1 + netbox/extras/views.py | 7 ++++- netbox/netbox/models/features.py | 4 +++ netbox/netbox/views/generic/feature_views.py | 30 ++++++++++++++++++- netbox/templates/extras/configcontext.html | 2 +- .../templates/extras/configcontext_list.html | 10 +++++++ 7 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 netbox/templates/extras/configcontext_list.html diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 37d5be9b9..51443ad87 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -200,15 +200,18 @@ class ConfigContextTable(NetBoxTable): is_active = columns.BooleanColumn( verbose_name='Active' ) + is_synced = columns.BooleanColumn( + verbose_name='Synced' + ) class Meta(NetBoxTable.Meta): model = ConfigContext fields = ( - 'pk', 'id', 'name', 'weight', 'is_active', 'description', 'regions', 'sites', 'locations', 'roles', - 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', 'data_source', - 'data_file', 'data_synced', 'created', 'last_updated', + 'pk', 'id', 'name', 'weight', 'is_active', 'is_synced', 'description', 'regions', 'sites', 'locations', + 'roles', 'platforms', 'cluster_types', 'cluster_groups', 'clusters', 'tenant_groups', 'tenants', + 'data_source', 'data_file', 'data_synced', 'created', 'last_updated', ) - default_columns = ('pk', 'name', 'weight', 'is_active', 'description') + default_columns = ('pk', 'name', 'weight', 'is_active', 'is_synced', 'description') class ObjectChangeTable(NetBoxTable): diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index f41a45f5a..6fd178284 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -60,6 +60,7 @@ urlpatterns = [ path('config-contexts/add/', views.ConfigContextEditView.as_view(), name='configcontext_add'), path('config-contexts/edit/', views.ConfigContextBulkEditView.as_view(), name='configcontext_bulk_edit'), path('config-contexts/delete/', views.ConfigContextBulkDeleteView.as_view(), name='configcontext_bulk_delete'), + path('config-contexts/sync/', views.ConfigContextBulkSyncDataView.as_view(), name='configcontext_bulk_sync'), path('config-contexts//', include(get_model_urls('extras', 'configcontext'))), # Image attachments diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 2d2608ae8..c46890c19 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -352,7 +352,8 @@ class ConfigContextListView(generic.ObjectListView): filterset = filtersets.ConfigContextFilterSet filterset_form = forms.ConfigContextFilterForm table = tables.ConfigContextTable - actions = ('add', 'bulk_edit', 'bulk_delete') + template_name = 'extras/configcontext_list.html' + actions = ('add', 'bulk_edit', 'bulk_delete', 'bulk_sync') @register_model_view(ConfigContext) @@ -416,6 +417,10 @@ class ConfigContextBulkDeleteView(generic.BulkDeleteView): table = tables.ConfigContextTable +class ConfigContextBulkSyncDataView(generic.BulkSyncDataView): + queryset = ConfigContext.objects.all() + + class ObjectConfigContextView(generic.ObjectView): base_template = None template_name = 'extras/object_configcontext.html' diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index af2f82e45..f31b6e071 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -349,6 +349,10 @@ class SyncedDataMixin(models.Model): class Meta: abstract = True + @property + def is_synced(self): + return self.data_file and self.data_synced >= self.data_file.last_updated + def clean(self): if self.data_file: self.sync_data() diff --git a/netbox/netbox/views/generic/feature_views.py b/netbox/netbox/views/generic/feature_views.py index 9adf4c44c..403cefe71 100644 --- a/netbox/netbox/views/generic/feature_views.py +++ b/netbox/netbox/views/generic/feature_views.py @@ -1,5 +1,6 @@ from django.contrib.contenttypes.models import ContentType from django.contrib import messages +from django.db import transaction from django.db.models import Q from django.shortcuts import get_object_or_404, redirect, render from django.utils.translation import gettext as _ @@ -7,9 +8,12 @@ from django.views.generic import View from extras import forms, tables from extras.models import * -from utilities.views import ViewTab +from utilities.permissions import get_permission_for_model +from utilities.views import GetReturnURLMixin, ViewTab +from .base import BaseMultiObjectView __all__ = ( + 'BulkSyncDataView', 'ObjectChangeLogView', 'ObjectJournalView', 'ObjectSyncDataView', @@ -150,3 +154,27 @@ class ObjectSyncDataView(View): messages.success(request, f"Synchronized data for {model._meta._verbose_name} {obj}.") return redirect(obj.get_absolute_url()) + + +class BulkSyncDataView(GetReturnURLMixin, BaseMultiObjectView): + """ + Synchronize multiple instances of a model inheriting from SyncedDataMixin. + """ + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'change') + + def post(self, request): + selected_objects = self.queryset.filter( + pk__in=request.POST.getlist('pk'), + data_file__isnull=False + ) + + with transaction.atomic(): + for obj in selected_objects: + obj.sync_data() + obj.save() + + model_name = self.queryset.model._meta.verbose_name_plural + messages.success(request, f"Synced {len(selected_objects)} {model_name}") + + return redirect(self.get_return_url(request)) diff --git a/netbox/templates/extras/configcontext.html b/netbox/templates/extras/configcontext.html index 758c0c905..a60caab87 100644 --- a/netbox/templates/extras/configcontext.html +++ b/netbox/templates/extras/configcontext.html @@ -42,7 +42,7 @@ {{ object.data_file }} {% elif object.data_path %}
- +
{{ object.data_path }} {% else %} diff --git a/netbox/templates/extras/configcontext_list.html b/netbox/templates/extras/configcontext_list.html new file mode 100644 index 000000000..374048538 --- /dev/null +++ b/netbox/templates/extras/configcontext_list.html @@ -0,0 +1,10 @@ +{% extends 'generic/object_list.html' %} + +{% block bulk_buttons %} + {% if perms.extras.change_configcontext %} + + {% endif %} + {{ block.super }} +{% endblock %}