diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 6b912c627..23b9c0acd 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1084,6 +1084,9 @@ class ConsolePort(models.Model): def __str__(self): return self.name + def get_absolute_url(self): + return self.device.get_absolute_url() + # Used for connections export def to_csv(self): return csv_format([ @@ -1125,6 +1128,9 @@ class ConsoleServerPort(models.Model): def __str__(self): return self.name + def get_absolute_url(self): + return self.device.get_absolute_url() + def clean(self): # Check that the parent device's DeviceType is a console server @@ -1161,6 +1167,9 @@ class PowerPort(models.Model): def __str__(self): return self.name + def get_absolute_url(self): + return self.device.get_absolute_url() + # Used for connections export def to_csv(self): return csv_format([ @@ -1202,6 +1211,9 @@ class PowerOutlet(models.Model): def __str__(self): return self.name + def get_absolute_url(self): + return self.device.get_absolute_url() + def clean(self): # Check that the parent device's DeviceType is a PDU @@ -1281,6 +1293,9 @@ class Interface(models.Model): def __str__(self): return self.name + def get_absolute_url(self): + return self.parent.get_absolute_url() + def clean(self): # Check that the parent device's DeviceType is a network device @@ -1443,6 +1458,9 @@ class DeviceBay(models.Model): def __str__(self): return '{} - {}'.format(self.device.name, self.name) + def get_absolute_url(self): + return self.device.get_absolute_url() + def clean(self): # Validate that the parent Device can have DeviceBays @@ -1488,6 +1506,9 @@ class InventoryItem(models.Model): def __str__(self): return self.name + def get_absolute_url(self): + return self.device.get_absolute_url() + # # Virtual chassis diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index f72c2d71a..7e635e979 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -24,8 +24,8 @@ from ipam.models import Prefix, Service, VLAN from utilities.forms import ConfirmationForm from utilities.paginator import EnhancedPaginator from utilities.views import ( - BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, ComponentDeleteView, - ComponentEditView, ObjectDeleteView, ObjectEditView, ObjectListView, + BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, ObjectDeleteView, + ObjectEditView, ObjectListView, ) from virtualization.models import VirtualMachine from . import filters, forms, tables @@ -1098,17 +1098,15 @@ def consoleport_disconnect(request, pk): }) -class ConsolePortEditView(PermissionRequiredMixin, ComponentEditView): +class ConsolePortEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_consoleport' model = ConsolePort - parent_field = 'device' model_form = forms.ConsolePortForm -class ConsolePortDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class ConsolePortDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_consoleport' model = ConsolePort - parent_field = 'device' class ConsolePortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): @@ -1218,17 +1216,15 @@ def consoleserverport_disconnect(request, pk): }) -class ConsoleServerPortEditView(PermissionRequiredMixin, ComponentEditView): +class ConsoleServerPortEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_consoleserverport' model = ConsoleServerPort - parent_field = 'device' model_form = forms.ConsoleServerPortForm -class ConsoleServerPortDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class ConsoleServerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_consoleserverport' model = ConsoleServerPort - parent_field = 'device' class ConsoleServerPortBulkDisconnectView(PermissionRequiredMixin, BulkDisconnectView): @@ -1337,17 +1333,15 @@ def powerport_disconnect(request, pk): }) -class PowerPortEditView(PermissionRequiredMixin, ComponentEditView): +class PowerPortEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_powerport' model = PowerPort - parent_field = 'device' model_form = forms.PowerPortForm -class PowerPortDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class PowerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_powerport' model = PowerPort - parent_field = 'device' class PowerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): @@ -1457,17 +1451,15 @@ def poweroutlet_disconnect(request, pk): }) -class PowerOutletEditView(PermissionRequiredMixin, ComponentEditView): +class PowerOutletEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_poweroutlet' model = PowerOutlet - parent_field = 'device' model_form = forms.PowerOutletForm -class PowerOutletDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class PowerOutletDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_poweroutlet' model = PowerOutlet - parent_field = 'device' class PowerOutletBulkDisconnectView(PermissionRequiredMixin, BulkDisconnectView): @@ -1502,18 +1494,16 @@ class InterfaceCreateView(PermissionRequiredMixin, ComponentCreateView): template_name = 'dcim/device_component_add.html' -class InterfaceEditView(PermissionRequiredMixin, ComponentEditView): +class InterfaceEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_interface' model = Interface - parent_field = 'device' model_form = forms.InterfaceForm template_name = 'dcim/interface_edit.html' -class InterfaceDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class InterfaceDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_interface' model = Interface - parent_field = 'device' class InterfaceBulkDisconnectView(PermissionRequiredMixin, BulkDisconnectView): @@ -1557,17 +1547,15 @@ class DeviceBayCreateView(PermissionRequiredMixin, ComponentCreateView): template_name = 'dcim/device_component_add.html' -class DeviceBayEditView(PermissionRequiredMixin, ComponentEditView): +class DeviceBayEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_devicebay' model = DeviceBay - parent_field = 'device' model_form = forms.DeviceBayForm -class DeviceBayDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class DeviceBayDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_devicebay' model = DeviceBay - parent_field = 'device' @permission_required('dcim.change_devicebay') @@ -1835,10 +1823,9 @@ class InterfaceConnectionsListView(ObjectListView): # Inventory items # -class InventoryItemEditView(PermissionRequiredMixin, ComponentEditView): +class InventoryItemEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_inventoryitem' model = InventoryItem - parent_field = 'device' model_form = forms.InventoryItemForm def alter_obj(self, obj, request, url_args, url_kwargs): @@ -1847,10 +1834,9 @@ class InventoryItemEditView(PermissionRequiredMixin, ComponentEditView): return obj -class InventoryItemDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class InventoryItemDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_inventoryitem' model = InventoryItem - parent_field = 'device' # diff --git a/netbox/templates/dcim/inc/interface.html b/netbox/templates/dcim/inc/interface.html index e43956c98..b48d6ee6f 100644 --- a/netbox/templates/dcim/inc/interface.html +++ b/netbox/templates/dcim/inc/interface.html @@ -107,16 +107,16 @@ - + {% else %} - + {% endif %} {% endif %} - + {% endif %} @@ -126,7 +126,7 @@ {% else %} - + {% endif %} diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index eda51eff4..40e48c877 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -802,20 +802,6 @@ class ComponentCreateView(View): }) -class ComponentEditView(ObjectEditView): - parent_field = None - - def get_return_url(self, request, obj): - return getattr(obj, self.parent_field).get_absolute_url() - - -class ComponentDeleteView(ObjectDeleteView): - parent_field = None - - def get_return_url(self, request, obj): - return getattr(obj, self.parent_field).get_absolute_url() - - class BulkComponentCreateView(View): """ Add one or more components (e.g. interfaces, console ports, etc.) to a set of Devices or VirtualMachines. diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 4f2981748..6f897bed6 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -11,8 +11,8 @@ from dcim.models import Device, Interface from dcim.tables import DeviceTable from ipam.models import Service from utilities.views import ( - BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, ComponentDeleteView, - ComponentEditView, ObjectDeleteView, ObjectEditView, ObjectListView, + BulkComponentCreateView, BulkDeleteView, BulkEditView, BulkImportView, ComponentCreateView, ObjectDeleteView, + ObjectEditView, ObjectListView, ) from . import filters, forms, tables from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine @@ -331,17 +331,15 @@ class InterfaceCreateView(PermissionRequiredMixin, ComponentCreateView): template_name = 'virtualization/virtualmachine_component_add.html' -class InterfaceEditView(PermissionRequiredMixin, ComponentEditView): +class InterfaceEditView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.change_interface' model = Interface - parent_field = 'virtual_machine' model_form = forms.InterfaceForm -class InterfaceDeleteView(PermissionRequiredMixin, ComponentDeleteView): +class InterfaceDeleteView(PermissionRequiredMixin, ObjectDeleteView): permission_required = 'dcim.delete_interface' model = Interface - parent_field = 'virtual_machine' class InterfaceBulkEditView(PermissionRequiredMixin, BulkEditView):