16546 define get_absolute_url method in NetBoxModel (#17693)

* 16546 define get_absolute_url method in NetBoxModel

* 16546 define get_absolute_url method in NetBoxModel

* 16546 define get_absolute_url method in NetBoxModel

* 16546 move get_absolute_url to NetBoxFeatureSet

* 16546 fix CircuitTermination

* Fix linebreaks

---------

Co-authored-by: Jeremy Stretch <jstretch@netboxlabs.com>
This commit is contained in:
Arthur Hanson 2024-10-10 06:59:19 -07:00 committed by GitHub
parent 3f469b0b0a
commit ed1327eeb7
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
24 changed files with 4 additions and 228 deletions

View File

@ -28,9 +28,6 @@ class CircuitType(OrganizationalModel):
blank=True blank=True
) )
def get_absolute_url(self):
return reverse('circuits:circuittype', args=[self.pk])
class Meta: class Meta:
ordering = ('name',) ordering = ('name',)
verbose_name = _('circuit type') verbose_name = _('circuit type')
@ -140,9 +137,6 @@ class Circuit(ContactsMixin, ImageAttachmentsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.cid return self.cid
def get_absolute_url(self):
return reverse('circuits:circuit', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return CircuitStatusChoices.colors.get(self.status) return CircuitStatusChoices.colors.get(self.status)
@ -173,9 +167,6 @@ class CircuitGroup(OrganizationalModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('circuits:circuitgroup', args=[self.pk])
class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel):
""" """

View File

@ -45,9 +45,6 @@ class Provider(ContactsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('circuits:provider', args=[self.pk])
class ProviderAccount(ContactsMixin, PrimaryModel): class ProviderAccount(ContactsMixin, PrimaryModel):
""" """
@ -91,9 +88,6 @@ class ProviderAccount(ContactsMixin, PrimaryModel):
return f'{self.account} ({self.name})' return f'{self.account} ({self.name})'
return f'{self.account}' return f'{self.account}'
def get_absolute_url(self):
return reverse('circuits:provideraccount', args=[self.pk])
class ProviderNetwork(PrimaryModel): class ProviderNetwork(PrimaryModel):
""" """
@ -128,6 +122,3 @@ class ProviderNetwork(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('circuits:providernetwork', args=[self.pk])

View File

@ -84,9 +84,6 @@ class DataSource(JobsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return f'{self.name}' return f'{self.name}'
def get_absolute_url(self):
return reverse('core:datasource', args=[self.pk])
@property @property
def docs_url(self): def docs_url(self):
return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/' return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/'

View File

@ -116,9 +116,6 @@ class Cable(PrimaryModel):
pk = self.pk or self._pk pk = self.pk or self._pk
return self.label or f'#{pk}' return self.label or f'#{pk}'
def get_absolute_url(self):
return reverse('dcim:cable', args=[self.pk])
@property @property
def a_terminations(self): def a_terminations(self):
if hasattr(self, '_a_terminations'): if hasattr(self, '_a_terminations'):

View File

@ -301,9 +301,6 @@ class ConsolePort(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracki
verbose_name = _('console port') verbose_name = _('console port')
verbose_name_plural = _('console ports') verbose_name_plural = _('console ports')
def get_absolute_url(self):
return reverse('dcim:consoleport', kwargs={'pk': self.pk})
class ConsoleServerPort(ModularComponentModel, CabledObjectModel, PathEndpoint, TrackingModelMixin): class ConsoleServerPort(ModularComponentModel, CabledObjectModel, PathEndpoint, TrackingModelMixin):
""" """
@ -330,9 +327,6 @@ class ConsoleServerPort(ModularComponentModel, CabledObjectModel, PathEndpoint,
verbose_name = _('console server port') verbose_name = _('console server port')
verbose_name_plural = _('console server ports') verbose_name_plural = _('console server ports')
def get_absolute_url(self):
return reverse('dcim:consoleserverport', kwargs={'pk': self.pk})
# #
# Power components # Power components
@ -370,9 +364,6 @@ class PowerPort(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracking
verbose_name = _('power port') verbose_name = _('power port')
verbose_name_plural = _('power ports') verbose_name_plural = _('power ports')
def get_absolute_url(self):
return reverse('dcim:powerport', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -492,9 +483,6 @@ class PowerOutlet(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracki
verbose_name = _('power outlet') verbose_name = _('power outlet')
verbose_name_plural = _('power outlets') verbose_name_plural = _('power outlets')
def get_absolute_url(self):
return reverse('dcim:poweroutlet', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -750,9 +738,6 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd
verbose_name = _('interface') verbose_name = _('interface')
verbose_name_plural = _('interfaces') verbose_name_plural = _('interfaces')
def get_absolute_url(self):
return reverse('dcim:interface', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -1011,9 +996,6 @@ class FrontPort(ModularComponentModel, CabledObjectModel, TrackingModelMixin):
verbose_name = _('front port') verbose_name = _('front port')
verbose_name_plural = _('front ports') verbose_name_plural = _('front ports')
def get_absolute_url(self):
return reverse('dcim:frontport', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -1069,9 +1051,6 @@ class RearPort(ModularComponentModel, CabledObjectModel, TrackingModelMixin):
verbose_name = _('rear port') verbose_name = _('rear port')
verbose_name_plural = _('rear ports') verbose_name_plural = _('rear ports')
def get_absolute_url(self):
return reverse('dcim:rearport', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -1128,9 +1107,6 @@ class ModuleBay(ModularComponentModel, TrackingModelMixin, MPTTModel):
class MPTTMeta: class MPTTMeta:
order_insertion_by = ('module',) order_insertion_by = ('module',)
def get_absolute_url(self):
return reverse('dcim:modulebay', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -1169,9 +1145,6 @@ class DeviceBay(ComponentModel, TrackingModelMixin):
verbose_name = _('device bay') verbose_name = _('device bay')
verbose_name_plural = _('device bays') verbose_name_plural = _('device bays')
def get_absolute_url(self):
return reverse('dcim:devicebay', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -1215,9 +1188,6 @@ class InventoryItemRole(OrganizationalModel):
verbose_name = _('inventory item role') verbose_name = _('inventory item role')
verbose_name_plural = _('inventory item roles') verbose_name_plural = _('inventory item roles')
def get_absolute_url(self):
return reverse('dcim:inventoryitemrole', args=[self.pk])
class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin): class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin):
""" """
@ -1311,9 +1281,6 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin):
verbose_name = _('inventory item') verbose_name = _('inventory item')
verbose_name_plural = _('inventory items') verbose_name_plural = _('inventory items')
def get_absolute_url(self):
return reverse('dcim:inventoryitem', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()

View File

@ -54,9 +54,6 @@ class Manufacturer(ContactsMixin, OrganizationalModel):
verbose_name = _('manufacturer') verbose_name = _('manufacturer')
verbose_name_plural = _('manufacturers') verbose_name_plural = _('manufacturers')
def get_absolute_url(self):
return reverse('dcim:manufacturer', args=[self.pk])
class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
""" """
@ -217,9 +214,6 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
self._original_front_image = self.__dict__.get('front_image') self._original_front_image = self.__dict__.get('front_image')
self._original_rear_image = self.__dict__.get('rear_image') self._original_rear_image = self.__dict__.get('rear_image')
def get_absolute_url(self):
return reverse('dcim:devicetype', args=[self.pk])
@property @property
def full_name(self): def full_name(self):
return f"{self.manufacturer} {self.model}" return f"{self.manufacturer} {self.model}"
@ -414,9 +408,6 @@ class ModuleType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
def __str__(self): def __str__(self):
return self.model return self.model
def get_absolute_url(self):
return reverse('dcim:moduletype', args=[self.pk])
@property @property
def full_name(self): def full_name(self):
return f"{self.manufacturer} {self.model}" return f"{self.manufacturer} {self.model}"
@ -497,9 +488,6 @@ class DeviceRole(OrganizationalModel):
verbose_name = _('device role') verbose_name = _('device role')
verbose_name_plural = _('device roles') verbose_name_plural = _('device roles')
def get_absolute_url(self):
return reverse('dcim:devicerole', args=[self.pk])
class Platform(OrganizationalModel): class Platform(OrganizationalModel):
""" """
@ -527,9 +515,6 @@ class Platform(OrganizationalModel):
verbose_name = _('platform') verbose_name = _('platform')
verbose_name_plural = _('platforms') verbose_name_plural = _('platforms')
def get_absolute_url(self):
return reverse('dcim:platform', args=[self.pk])
def update_interface_bridges(device, interface_templates, module=None): def update_interface_bridges(device, interface_templates, module=None):
""" """
@ -823,9 +808,6 @@ class Device(
return f'{self.device_type.manufacturer} {self.device_type.model} ({self.pk})' return f'{self.device_type.manufacturer} {self.device_type.model} ({self.pk})'
return super().__str__() return super().__str__()
def get_absolute_url(self):
return reverse('dcim:device', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -1192,9 +1174,6 @@ class Module(PrimaryModel, ConfigContextModel):
def __str__(self): def __str__(self):
return f'{self.module_bay.name}: {self.module_type} ({self.pk})' return f'{self.module_bay.name}: {self.module_type} ({self.pk})'
def get_absolute_url(self):
return reverse('dcim:module', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return ModuleStatusChoices.colors.get(self.status) return ModuleStatusChoices.colors.get(self.status)
@ -1343,9 +1322,6 @@ class VirtualChassis(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('dcim:virtualchassis', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -1445,9 +1421,6 @@ class VirtualDeviceContext(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('dcim:virtualdevicecontext', kwargs={'pk': self.pk})
def get_status_color(self): def get_status_color(self):
return VirtualDeviceContextStatusChoices.colors.get(self.status) return VirtualDeviceContextStatusChoices.colors.get(self.status)

View File

@ -58,9 +58,6 @@ class PowerPanel(ContactsMixin, ImageAttachmentsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('dcim:powerpanel', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -167,9 +164,6 @@ class PowerFeed(PrimaryModel, PathEndpoint, CabledObjectModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('dcim:powerfeed', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()

View File

@ -165,9 +165,6 @@ class RackType(RackBase):
def __str__(self): def __str__(self):
return self.model return self.model
def get_absolute_url(self):
return reverse('dcim:racktype', args=[self.pk])
@property @property
def full_name(self): def full_name(self):
return f"{self.manufacturer} {self.model}" return f"{self.manufacturer} {self.model}"
@ -230,9 +227,6 @@ class RackRole(OrganizationalModel):
verbose_name = _('rack role') verbose_name = _('rack role')
verbose_name_plural = _('rack roles') verbose_name_plural = _('rack roles')
def get_absolute_url(self):
return reverse('dcim:rackrole', args=[self.pk])
class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase): class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase):
""" """
@ -364,9 +358,6 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase):
return f'{self.name} ({self.facility_id})' return f'{self.name} ({self.facility_id})'
return self.name return self.name
def get_absolute_url(self):
return reverse('dcim:rack', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -699,9 +690,6 @@ class RackReservation(PrimaryModel):
def __str__(self): def __str__(self):
return "Reservation for rack {}".format(self.rack) return "Reservation for rack {}".format(self.rack)
def get_absolute_url(self):
return reverse('dcim:rackreservation', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()

View File

@ -62,9 +62,6 @@ class Region(ContactsMixin, NestedGroupModel):
verbose_name = _('region') verbose_name = _('region')
verbose_name_plural = _('regions') verbose_name_plural = _('regions')
def get_absolute_url(self):
return reverse('dcim:region', args=[self.pk])
def get_site_count(self): def get_site_count(self):
return Site.objects.filter( return Site.objects.filter(
Q(region=self) | Q(region=self) |
@ -115,9 +112,6 @@ class SiteGroup(ContactsMixin, NestedGroupModel):
verbose_name = _('site group') verbose_name = _('site group')
verbose_name_plural = _('site groups') verbose_name_plural = _('site groups')
def get_absolute_url(self):
return reverse('dcim:sitegroup', args=[self.pk])
def get_site_count(self): def get_site_count(self):
return Site.objects.filter( return Site.objects.filter(
Q(group=self) | Q(group=self) |
@ -241,9 +235,6 @@ class Site(ContactsMixin, ImageAttachmentsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('dcim:site', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return SiteStatusChoices.colors.get(self.status) return SiteStatusChoices.colors.get(self.status)
@ -322,9 +313,6 @@ class Location(ContactsMixin, ImageAttachmentsMixin, NestedGroupModel):
verbose_name = _('location') verbose_name = _('location')
verbose_name_plural = _('locations') verbose_name_plural = _('locations')
def get_absolute_url(self):
return reverse('dcim:location', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return LocationStatusChoices.colors.get(self.status) return LocationStatusChoices.colors.get(self.status)

View File

@ -54,9 +54,6 @@ class ASNRange(OrganizationalModel):
def __str__(self): def __str__(self):
return f'{self.name} ({self.range_as_string()})' return f'{self.name} ({self.range_as_string()})'
def get_absolute_url(self):
return reverse('ipam:asnrange', args=[self.pk])
@property @property
def range(self): def range(self):
return range(self.start, self.end + 1) return range(self.start, self.end + 1)
@ -128,9 +125,6 @@ class ASN(PrimaryModel):
def __str__(self): def __str__(self):
return f'AS{self.asn_with_asdot}' return f'AS{self.asn_with_asdot}'
def get_absolute_url(self):
return reverse('ipam:asn', args=[self.pk])
@property @property
def asn_asdot(self): def asn_asdot(self):
""" """

View File

@ -71,9 +71,6 @@ class FHRPGroup(PrimaryModel):
return name return name
def get_absolute_url(self):
return reverse('ipam:fhrpgroup', args=[self.pk])
class FHRPGroupAssignment(ChangeLoggedModel): class FHRPGroupAssignment(ChangeLoggedModel):
interface_type = models.ForeignKey( interface_type = models.ForeignKey(

View File

@ -71,9 +71,6 @@ class RIR(OrganizationalModel):
verbose_name = _('RIR') verbose_name = _('RIR')
verbose_name_plural = _('RIRs') verbose_name_plural = _('RIRs')
def get_absolute_url(self):
return reverse('ipam:rir', args=[self.pk])
class Aggregate(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): class Aggregate(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel):
""" """
@ -118,9 +115,6 @@ class Aggregate(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel):
def __str__(self): def __str__(self):
return str(self.prefix) return str(self.prefix)
def get_absolute_url(self):
return reverse('ipam:aggregate', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -203,9 +197,6 @@ class Role(OrganizationalModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('ipam:role', args=[self.pk])
class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel):
""" """
@ -303,9 +294,6 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel):
def __str__(self): def __str__(self):
return str(self.prefix) return str(self.prefix)
def get_absolute_url(self):
return reverse('ipam:prefix', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -551,9 +539,6 @@ class IPRange(ContactsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('ipam:iprange', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -798,9 +783,6 @@ class IPAddress(ContactsMixin, PrimaryModel):
self._original_assigned_object_id = self.__dict__.get('assigned_object_id') self._original_assigned_object_id = self.__dict__.get('assigned_object_id')
self._original_assigned_object_type_id = self.__dict__.get('assigned_object_type_id') self._original_assigned_object_type_id = self.__dict__.get('assigned_object_type_id')
def get_absolute_url(self):
return reverse('ipam:ipaddress', args=[self.pk])
def get_duplicates(self): def get_duplicates(self):
return IPAddress.objects.filter( return IPAddress.objects.filter(
vrf=self.vrf, vrf=self.vrf,

View File

@ -59,9 +59,6 @@ class ServiceTemplate(ServiceBase, PrimaryModel):
verbose_name = _('service template') verbose_name = _('service template')
verbose_name_plural = _('service templates') verbose_name_plural = _('service templates')
def get_absolute_url(self):
return reverse('ipam:servicetemplate', args=[self.pk])
class Service(ContactsMixin, ServiceBase, PrimaryModel): class Service(ContactsMixin, ServiceBase, PrimaryModel):
""" """
@ -102,9 +99,6 @@ class Service(ContactsMixin, ServiceBase, PrimaryModel):
verbose_name = _('service') verbose_name = _('service')
verbose_name_plural = _('services') verbose_name_plural = _('services')
def get_absolute_url(self):
return reverse('ipam:service', args=[self.pk])
@property @property
def parent(self): def parent(self):
return self.device or self.virtual_machine return self.device or self.virtual_machine

View File

@ -84,9 +84,6 @@ class VLANGroup(OrganizationalModel):
verbose_name = _('VLAN group') verbose_name = _('VLAN group')
verbose_name_plural = _('VLAN groups') verbose_name_plural = _('VLAN groups')
def get_absolute_url(self):
return reverse('ipam:vlangroup', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -237,9 +234,6 @@ class VLAN(PrimaryModel):
def __str__(self): def __str__(self):
return f'{self.name} ({self.vid})' return f'{self.name} ({self.vid})'
def get_absolute_url(self):
return reverse('ipam:vlan', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()

View File

@ -67,9 +67,6 @@ class VRF(PrimaryModel):
return f'{self.name} ({self.rd})' return f'{self.name} ({self.rd})'
return self.name return self.name
def get_absolute_url(self):
return reverse('ipam:vrf', args=[self.pk])
class RouteTarget(PrimaryModel): class RouteTarget(PrimaryModel):
""" """
@ -96,6 +93,3 @@ class RouteTarget(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('ipam:routetarget', args=[self.pk])

View File

@ -3,6 +3,7 @@ from django.contrib.contenttypes.fields import GenericForeignKey
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from django.core.validators import ValidationError from django.core.validators import ValidationError
from django.db import models from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from mptt.models import MPTTModel, TreeForeignKey from mptt.models import MPTTModel, TreeForeignKey
@ -40,6 +41,9 @@ class NetBoxFeatureSet(
def docs_url(self): def docs_url(self):
return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/' return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/'
def get_absolute_url(self):
return reverse(f'{self._meta.app_label}:{self._meta.model_name}', args=[self.pk])
# #
# Base model classes # Base model classes

View File

@ -32,17 +32,11 @@ class ContactGroup(NestedGroupModel):
verbose_name = _('contact group') verbose_name = _('contact group')
verbose_name_plural = _('contact groups') verbose_name_plural = _('contact groups')
def get_absolute_url(self):
return reverse('tenancy:contactgroup', args=[self.pk])
class ContactRole(OrganizationalModel): class ContactRole(OrganizationalModel):
""" """
Functional role for a Contact assigned to an object. Functional role for a Contact assigned to an object.
""" """
def get_absolute_url(self):
return reverse('tenancy:contactrole', args=[self.pk])
class Meta: class Meta:
ordering = ('name',) ordering = ('name',)
verbose_name = _('contact role') verbose_name = _('contact role')
@ -106,9 +100,6 @@ class Contact(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('tenancy:contact', args=[self.pk])
class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel):
object_type = models.ForeignKey( object_type = models.ForeignKey(

View File

@ -32,9 +32,6 @@ class TenantGroup(NestedGroupModel):
verbose_name = _('tenant group') verbose_name = _('tenant group')
verbose_name_plural = _('tenant groups') verbose_name_plural = _('tenant groups')
def get_absolute_url(self):
return reverse('tenancy:tenantgroup', args=[self.pk])
class Tenant(ContactsMixin, PrimaryModel): class Tenant(ContactsMixin, PrimaryModel):
""" """
@ -90,6 +87,3 @@ class Tenant(ContactsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('tenancy:tenant', args=[self.pk])

View File

@ -25,9 +25,6 @@ class ClusterType(OrganizationalModel):
verbose_name = _('cluster type') verbose_name = _('cluster type')
verbose_name_plural = _('cluster types') verbose_name_plural = _('cluster types')
def get_absolute_url(self):
return reverse('virtualization:clustertype', args=[self.pk])
class ClusterGroup(ContactsMixin, OrganizationalModel): class ClusterGroup(ContactsMixin, OrganizationalModel):
""" """
@ -45,9 +42,6 @@ class ClusterGroup(ContactsMixin, OrganizationalModel):
verbose_name = _('cluster group') verbose_name = _('cluster group')
verbose_name_plural = _('cluster groups') verbose_name_plural = _('cluster groups')
def get_absolute_url(self):
return reverse('virtualization:clustergroup', args=[self.pk])
class Cluster(ContactsMixin, PrimaryModel): class Cluster(ContactsMixin, PrimaryModel):
""" """
@ -124,9 +118,6 @@ class Cluster(ContactsMixin, PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('virtualization:cluster', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return ClusterStatusChoices.colors.get(self.status) return ClusterStatusChoices.colors.get(self.status)

View File

@ -172,9 +172,6 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('virtualization:virtualmachine', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -377,9 +374,6 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin):
verbose_name = _('interface') verbose_name = _('interface')
verbose_name_plural = _('interfaces') verbose_name_plural = _('interfaces')
def get_absolute_url(self):
return reverse('virtualization:vminterface', kwargs={'pk': self.pk})
def clean(self): def clean(self):
super().clean() super().clean()
@ -437,6 +431,3 @@ class VirtualDisk(ComponentModel, TrackingModelMixin):
class Meta(ComponentModel.Meta): class Meta(ComponentModel.Meta):
verbose_name = _('virtual disk') verbose_name = _('virtual disk')
verbose_name_plural = _('virtual disks') verbose_name_plural = _('virtual disks')
def get_absolute_url(self):
return reverse('virtualization:virtualdisk', args=[self.pk])

View File

@ -62,9 +62,6 @@ class IKEProposal(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('vpn:ikeproposal', args=[self.pk])
class IKEPolicy(PrimaryModel): class IKEPolicy(PrimaryModel):
name = models.CharField( name = models.CharField(
@ -107,9 +104,6 @@ class IKEPolicy(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('vpn:ikepolicy', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -167,9 +161,6 @@ class IPSecProposal(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('vpn:ipsecproposal', args=[self.pk])
def clean(self): def clean(self):
super().clean() super().clean()
@ -212,9 +203,6 @@ class IPSecPolicy(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('vpn:ipsecpolicy', args=[self.pk])
class IPSecProfile(PrimaryModel): class IPSecProfile(PrimaryModel):
name = models.CharField( name = models.CharField(
@ -252,6 +240,3 @@ class IPSecProfile(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('vpn:ipsecprofile', args=[self.pk])

View File

@ -68,9 +68,6 @@ class L2VPN(ContactsMixin, PrimaryModel):
return f'{self.name} ({self.identifier})' return f'{self.name} ({self.identifier})'
return f'{self.name}' return f'{self.name}'
def get_absolute_url(self):
return reverse('vpn:l2vpn', args=[self.pk])
@cached_property @cached_property
def can_add_termination(self): def can_add_termination(self):
if self.type in L2VPNTypeChoices.P2P and self.terminations.count() >= 2: if self.type in L2VPNTypeChoices.P2P and self.terminations.count() >= 2:
@ -121,9 +118,6 @@ class L2VPNTermination(NetBoxModel):
return f'{self.assigned_object} <> {self.l2vpn}' return f'{self.assigned_object} <> {self.l2vpn}'
return super().__str__() return super().__str__()
def get_absolute_url(self):
return reverse('vpn:l2vpntermination', args=[self.pk])
def clean(self): def clean(self):
# Only check is assigned_object is set. Required otherwise we have an Integrity Error thrown. # Only check is assigned_object is set. Required otherwise we have an Integrity Error thrown.
if self.assigned_object: if self.assigned_object:

View File

@ -26,9 +26,6 @@ class TunnelGroup(OrganizationalModel):
verbose_name = _('tunnel group') verbose_name = _('tunnel group')
verbose_name_plural = _('tunnel groups') verbose_name_plural = _('tunnel groups')
def get_absolute_url(self):
return reverse('vpn:tunnelgroup', args=[self.pk])
class Tunnel(PrimaryModel): class Tunnel(PrimaryModel):
name = models.CharField( name = models.CharField(
@ -97,9 +94,6 @@ class Tunnel(PrimaryModel):
def __str__(self): def __str__(self):
return self.name return self.name
def get_absolute_url(self):
return reverse('vpn:tunnel', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return TunnelStatusChoices.colors.get(self.status) return TunnelStatusChoices.colors.get(self.status)

View File

@ -69,9 +69,6 @@ class WirelessLANGroup(NestedGroupModel):
verbose_name = _('wireless LAN group') verbose_name = _('wireless LAN group')
verbose_name_plural = _('wireless LAN groups') verbose_name_plural = _('wireless LAN groups')
def get_absolute_url(self):
return reverse('wireless:wirelesslangroup', args=[self.pk])
class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): class WirelessLAN(WirelessAuthenticationBase, PrimaryModel):
""" """
@ -119,9 +116,6 @@ class WirelessLAN(WirelessAuthenticationBase, PrimaryModel):
def __str__(self): def __str__(self):
return self.ssid return self.ssid
def get_absolute_url(self):
return reverse('wireless:wirelesslan', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return WirelessLANStatusChoices.colors.get(self.status) return WirelessLANStatusChoices.colors.get(self.status)
@ -222,9 +216,6 @@ class WirelessLink(WirelessAuthenticationBase, PrimaryModel):
def __str__(self): def __str__(self):
return self.ssid or f'#{self.pk}' return self.ssid or f'#{self.pk}'
def get_absolute_url(self):
return reverse('wireless:wirelesslink', args=[self.pk])
def get_status_color(self): def get_status_color(self):
return LinkStatusChoices.colors.get(self.status) return LinkStatusChoices.colors.get(self.status)