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):