From 5e1a0733e4b439137e2e671b9b7404375db70809 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 7 Oct 2022 12:14:19 -0400 Subject: [PATCH] Replace active_tab context for object views --- netbox/dcim/views.py | 9 ------ netbox/extras/views.py | 1 - netbox/ipam/urls.py | 2 -- netbox/ipam/views.py | 31 ++++++++------------ netbox/netbox/views/generic/base.py | 1 + netbox/netbox/views/generic/feature_views.py | 4 +-- netbox/netbox/views/generic/object_views.py | 3 +- netbox/templates/generic/object.html | 2 +- netbox/templates/ipam/vlan/base.html | 24 --------------- netbox/utilities/templatetags/tabs.py | 6 ++-- netbox/virtualization/views.py | 15 ---------- 11 files changed, 22 insertions(+), 76 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index e299357d1..d5aed5897 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -46,11 +46,6 @@ class DeviceComponentsView(generic.ObjectChildrenView): def get_children(self, request, parent): return self.child_model.objects.restrict(request.user, 'view').filter(device=parent) - def get_extra_context(self, request, instance): - return { - 'active_tab': f"{self.child_model._meta.verbose_name_plural.replace(' ', '')}", - } - class DeviceTypeComponentsView(DeviceComponentsView): queryset = DeviceType.objects.all() @@ -61,9 +56,7 @@ class DeviceTypeComponentsView(DeviceComponentsView): return self.child_model.objects.restrict(request.user, 'view').filter(device_type=parent) def get_extra_context(self, request, instance): - model_name = self.child_model._meta.verbose_name_plural return { - 'active_tab': f"{model_name.replace(' ', '').replace('template', '')}", 'return_url': reverse(self.viewname, kwargs={'pk': instance.pk}), } @@ -77,9 +70,7 @@ class ModuleTypeComponentsView(DeviceComponentsView): return self.child_model.objects.restrict(request.user, 'view').filter(module_type=parent) def get_extra_context(self, request, instance): - model_name = self.child_model._meta.verbose_name_plural return { - 'active_tab': f"{model_name.replace(' ', '').replace('template', '')}", 'return_url': reverse(self.viewname, kwargs={'pk': instance.pk}), } diff --git a/netbox/extras/views.py b/netbox/extras/views.py index f95b3fb64..e48fd672b 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -352,7 +352,6 @@ class ObjectConfigContextView(generic.ObjectView): 'source_contexts': source_contexts, 'format': format, 'base_template': self.base_template, - 'active_tab': 'configcontext', } diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index c7b60045b..d5594eeb9 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -141,8 +141,6 @@ urlpatterns = [ path('vlans/edit/', views.VLANBulkEditView.as_view(), name='vlan_bulk_edit'), path('vlans/delete/', views.VLANBulkDeleteView.as_view(), name='vlan_bulk_delete'), path('vlans//', views.VLANView.as_view(), name='vlan'), - path('vlans//interfaces/', views.VLANInterfacesView.as_view(), name='vlan_interfaces'), - path('vlans//vm-interfaces/', views.VLANVMInterfacesView.as_view(), name='vlan_vminterfaces'), path('vlans//edit/', views.VLANEditView.as_view(), name='vlan_edit'), path('vlans//delete/', views.VLANDeleteView.as_view(), name='vlan_delete'), path('vlans//', include(get_model_urls('ipam', 'vlan'))), diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index f705664b3..fba577f02 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -319,7 +319,6 @@ class AggregatePrefixesView(generic.ObjectChildrenView): def get_extra_context(self, request, instance): return { 'bulk_querystring': f'within={instance.prefix}', - 'active_tab': 'prefixes', 'first_available_prefix': instance.get_first_available_prefix(), 'show_available': bool(request.GET.get('show_available', 'true') == 'true'), 'show_assigned': bool(request.GET.get('show_assigned', 'true') == 'true'), @@ -502,7 +501,6 @@ class PrefixPrefixesView(generic.ObjectChildrenView): def get_extra_context(self, request, instance): return { 'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&within={instance.prefix}", - 'active_tab': 'prefixes', 'first_available_prefix': instance.get_first_available_prefix(), 'show_available': bool(request.GET.get('show_available', 'true') == 'true'), 'show_assigned': bool(request.GET.get('show_assigned', 'true') == 'true'), @@ -530,7 +528,6 @@ class PrefixIPRangesView(generic.ObjectChildrenView): def get_extra_context(self, request, instance): return { 'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&parent={instance.prefix}", - 'active_tab': 'ipranges', 'first_available_ip': instance.get_first_available_ip(), } @@ -559,7 +556,6 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): def get_extra_context(self, request, instance): return { 'bulk_querystring': f"vrf_id={instance.vrf.pk if instance.vrf else '0'}&parent={instance.prefix}", - 'active_tab': 'ipaddresses', 'first_available_ip': instance.get_first_available_ip(), } @@ -623,11 +619,6 @@ class IPRangeIPAddressesView(generic.ObjectChildrenView): def get_children(self, request, parent): return parent.get_child_ips().restrict(request.user, 'view') - def get_extra_context(self, request, instance): - return { - 'active_tab': 'ipaddresses', - } - class IPRangeEditView(generic.ObjectEditView): queryset = IPRange.objects.all() @@ -1032,37 +1023,39 @@ class VLANView(generic.ObjectView): } +@register_model_view(VLAN, 'interfaces') class VLANInterfacesView(generic.ObjectChildrenView): queryset = VLAN.objects.all() child_model = Interface table = tables.VLANDevicesTable filterset = InterfaceFilterSet template_name = 'ipam/vlan/interfaces.html' + tab = ViewTab( + label=_('Device Interfaces'), + badge=lambda x: x.get_interfaces().count(), + permission='dcim.view_interface' + ) def get_children(self, request, parent): return parent.get_interfaces().restrict(request.user, 'view') - def get_extra_context(self, request, instance): - return { - 'active_tab': 'interfaces', - } - +@register_model_view(VLAN, 'vminterfaces', path='vm-interfaces') class VLANVMInterfacesView(generic.ObjectChildrenView): queryset = VLAN.objects.all() child_model = VMInterface table = tables.VLANVirtualMachinesTable filterset = VMInterfaceFilterSet template_name = 'ipam/vlan/vminterfaces.html' + tab = ViewTab( + label=_('VM Interfaces'), + badge=lambda x: x.get_vminterfaces().count(), + permission='virtualization.view_vminterface' + ) def get_children(self, request, parent): return parent.get_vminterfaces().restrict(request.user, 'view') - def get_extra_context(self, request, instance): - return { - 'active_tab': 'vminterfaces', - } - class VLANEditView(generic.ObjectEditView): queryset = VLAN.objects.all() diff --git a/netbox/netbox/views/generic/base.py b/netbox/netbox/views/generic/base.py index 3ad3bcf67..3a85df618 100644 --- a/netbox/netbox/views/generic/base.py +++ b/netbox/netbox/views/generic/base.py @@ -14,6 +14,7 @@ class BaseObjectView(ObjectPermissionRequiredMixin, View): """ queryset = None template_name = None + tab = None def get_object(self, **kwargs): """ diff --git a/netbox/netbox/views/generic/feature_views.py b/netbox/netbox/views/generic/feature_views.py index 963fad196..ce5b29eb2 100644 --- a/netbox/netbox/views/generic/feature_views.py +++ b/netbox/netbox/views/generic/feature_views.py @@ -62,7 +62,7 @@ class ObjectChangeLogView(View): 'object': obj, 'table': objectchanges_table, 'base_template': self.base_template, - 'active_tab': 'changelog', + 'tab': self.tab, }) @@ -122,5 +122,5 @@ class ObjectJournalView(View): 'form': form, 'table': journalentry_table, 'base_template': self.base_template, - 'active_tab': 'journal', + 'tab': self.tab, }) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index a56a832b6..941eee72e 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -5,7 +5,6 @@ from django.contrib import messages from django.core.exceptions import ObjectDoesNotExist from django.db import transaction from django.db.models import ProtectedError -from django.forms.widgets import HiddenInput from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape @@ -67,6 +66,7 @@ class ObjectView(BaseObjectView): return render(request, self.get_template_name(), { 'object': instance, + 'tab': self.tab, **self.get_extra_context(request, instance), }) @@ -141,6 +141,7 @@ class ObjectChildrenView(ObjectView, ActionsMixin, TableMixin): 'child_model': self.child_model, 'table': table, 'actions': actions, + 'tab': self.tab, **self.get_extra_context(request, instance), }) diff --git a/netbox/templates/generic/object.html b/netbox/templates/generic/object.html index 2c3c76329..023726a30 100644 --- a/netbox/templates/generic/object.html +++ b/netbox/templates/generic/object.html @@ -81,7 +81,7 @@ Context: