Просмотр исходного кода

Refactor device component views

jeremystretch 4 лет назад
Родитель
Сommit
7b70129974
1 измененных файлов с 53 добавлено и 171 удалено
  1. 53 171
      netbox/dcim/views.py

+ 53 - 171
netbox/dcim/views.py

@@ -36,6 +36,29 @@ from .models import (
 )
 
 
+class DeviceComponentsView(generic.ObjectView):
+    queryset = Device.objects.all()
+    model = None
+    table = None
+
+    def get_components(self, request, instance):
+        return self.model.objects.restrict(request.user, 'view').filter(device=instance)
+
+    def get_extra_context(self, request, instance):
+        components = self.get_components(request, instance)
+        table = self.table(data=components, user=request.user)
+        change_perm = f'{self.model._meta.app_label}.change_{self.model._meta.model_name}'
+        delete_perm = f'{self.model._meta.app_label}.delete_{self.model._meta.model_name}'
+        if request.user.has_perm(change_perm) or request.user.has_perm(delete_perm):
+            table.columns.show('pk')
+        paginate_table(table, request)
+
+        return {
+            f'{self.model._meta.model_name}_table': table,
+            'active_tab': f"{self.model._meta.verbose_name_plural.replace(' ', '-')}",
+        }
+
+
 class BulkDisconnectView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
     """
     An extendable view for disconnection console/power/interface components in bulk.
@@ -1306,206 +1329,65 @@ class DeviceView(generic.ObjectView):
         }
 
 
-class DeviceConsolePortsView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceConsolePortsView(DeviceComponentsView):
+    model = ConsolePort
+    table = tables.DeviceConsolePortTable
     template_name = 'dcim/device/consoleports.html'
 
-    def get_extra_context(self, request, instance):
-        consoleports = ConsolePort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
-            'cable', '_path__destination',
-        )
-        consoleport_table = tables.DeviceConsolePortTable(
-            data=consoleports,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_consoleport') or request.user.has_perm('dcim.delete_consoleport'):
-            consoleport_table.columns.show('pk')
-        paginate_table(consoleport_table, request)
-
-        return {
-            'consoleport_table': consoleport_table,
-            'active_tab': 'console-ports',
-        }
 
-
-class DeviceConsoleServerPortsView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceConsoleServerPortsView(DeviceComponentsView):
+    model = ConsoleServerPort
+    table = tables.DeviceConsoleServerPortTable
     template_name = 'dcim/device/consoleserverports.html'
 
-    def get_extra_context(self, request, instance):
-        consoleserverports = ConsoleServerPort.objects.restrict(request.user, 'view').filter(
-            device=instance
-        ).prefetch_related(
-            'cable', '_path__destination',
-        )
-        consoleserverport_table = tables.DeviceConsoleServerPortTable(
-            data=consoleserverports,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_consoleserverport') or \
-                request.user.has_perm('dcim.delete_consoleserverport'):
-            consoleserverport_table.columns.show('pk')
-        paginate_table(consoleserverport_table, request)
-
-        return {
-            'consoleserverport_table': consoleserverport_table,
-            'active_tab': 'console-server-ports',
-        }
-
 
-class DevicePowerPortsView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DevicePowerPortsView(DeviceComponentsView):
+    model = PowerPort
+    table = tables.DevicePowerPortTable
     template_name = 'dcim/device/powerports.html'
 
-    def get_extra_context(self, request, instance):
-        powerports = PowerPort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
-            'cable', '_path__destination',
-        )
-        powerport_table = tables.DevicePowerPortTable(
-            data=powerports,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_powerport') or request.user.has_perm('dcim.delete_powerport'):
-            powerport_table.columns.show('pk')
-        paginate_table(powerport_table, request)
 
-        return {
-            'powerport_table': powerport_table,
-            'active_tab': 'power-ports',
-        }
-
-
-class DevicePowerOutletsView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DevicePowerOutletsView(DeviceComponentsView):
+    model = PowerOutlet
+    table = tables.DevicePowerOutletTable
     template_name = 'dcim/device/poweroutlets.html'
 
-    def get_extra_context(self, request, instance):
-        poweroutlets = PowerOutlet.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
-            'cable', 'power_port', '_path__destination',
-        )
-        poweroutlet_table = tables.DevicePowerOutletTable(
-            data=poweroutlets,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_poweroutlet') or request.user.has_perm('dcim.delete_poweroutlet'):
-            poweroutlet_table.columns.show('pk')
-        paginate_table(poweroutlet_table, request)
 
-        return {
-            'poweroutlet_table': poweroutlet_table,
-            'active_tab': 'power-outlets',
-        }
-
-
-class DeviceInterfacesView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceInterfacesView(DeviceComponentsView):
+    model = Interface
+    table = tables.DeviceInterfaceTable
     template_name = 'dcim/device/interfaces.html'
 
-    def get_extra_context(self, request, instance):
-        interfaces = instance.vc_interfaces().restrict(request.user, 'view').prefetch_related(
+    def get_components(self, request, instance):
+        return instance.vc_interfaces().restrict(request.user, 'view').prefetch_related(
             Prefetch('ip_addresses', queryset=IPAddress.objects.restrict(request.user)),
-            Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user)),
-            'lag', 'cable', '_path__destination', 'tags',
-        )
-        interface_table = tables.DeviceInterfaceTable(
-            data=interfaces,
-            user=request.user
+            Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user))
         )
-        if request.user.has_perm('dcim.change_interface') or request.user.has_perm('dcim.delete_interface'):
-            interface_table.columns.show('pk')
-        paginate_table(interface_table, request)
 
-        return {
-            'interface_table': interface_table,
-            'active_tab': 'interfaces',
-        }
 
-
-class DeviceFrontPortsView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceFrontPortsView(DeviceComponentsView):
+    model = FrontPort
+    table = tables.DeviceFrontPortTable
     template_name = 'dcim/device/frontports.html'
 
-    def get_extra_context(self, request, instance):
-        frontports = FrontPort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
-            'rear_port', 'cable',
-        )
-        frontport_table = tables.DeviceFrontPortTable(
-            data=frontports,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_frontport') or request.user.has_perm('dcim.delete_frontport'):
-            frontport_table.columns.show('pk')
-        paginate_table(frontport_table, request)
 
-        return {
-            'frontport_table': frontport_table,
-            'active_tab': 'front-ports',
-        }
-
-
-class DeviceRearPortsView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceRearPortsView(DeviceComponentsView):
+    model = RearPort
+    table = tables.DeviceRearPortTable
     template_name = 'dcim/device/rearports.html'
 
-    def get_extra_context(self, request, instance):
-        rearports = RearPort.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related('cable')
-        rearport_table = tables.DeviceRearPortTable(
-            data=rearports,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_rearport') or request.user.has_perm('dcim.delete_rearport'):
-            rearport_table.columns.show('pk')
-        paginate_table(rearport_table, request)
-
-        return {
-            'rearport_table': rearport_table,
-            'active_tab': 'rear-ports',
-        }
-
 
-class DeviceDeviceBaysView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceDeviceBaysView(DeviceComponentsView):
+    model = DeviceBay
+    table = tables.DeviceDeviceBayTable
     template_name = 'dcim/device/devicebays.html'
 
-    def get_extra_context(self, request, instance):
-        devicebays = DeviceBay.objects.restrict(request.user, 'view').filter(device=instance).prefetch_related(
-            'installed_device__device_type__manufacturer',
-        )
-        devicebay_table = tables.DeviceDeviceBayTable(
-            data=devicebays,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_devicebay') or request.user.has_perm('dcim.delete_devicebay'):
-            devicebay_table.columns.show('pk')
-        paginate_table(devicebay_table, request)
-
-        return {
-            'devicebay_table': devicebay_table,
-            'active_tab': 'device-bays',
-        }
 
-
-class DeviceInventoryView(generic.ObjectView):
-    queryset = Device.objects.all()
+class DeviceInventoryView(DeviceComponentsView):
+    model = InventoryItem
+    table = tables.DeviceInventoryItemTable
     template_name = 'dcim/device/inventory.html'
 
-    def get_extra_context(self, request, instance):
-        inventoryitems = InventoryItem.objects.restrict(request.user, 'view').filter(
-            device=instance
-        ).prefetch_related('manufacturer')
-        inventoryitem_table = tables.DeviceInventoryItemTable(
-            data=inventoryitems,
-            user=request.user
-        )
-        if request.user.has_perm('dcim.change_inventoryitem') or request.user.has_perm('dcim.delete_inventoryitem'):
-            inventoryitem_table.columns.show('pk')
-        paginate_table(inventoryitem_table, request)
-
-        return {
-            'inventoryitem_table': inventoryitem_table,
-            'active_tab': 'inventory',
-        }
-
 
 class DeviceStatusView(generic.ObjectView):
     additional_permissions = ['dcim.napalm_read_device']