mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-16 04:02:52 -06:00
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:
parent
3f469b0b0a
commit
ed1327eeb7
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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])
|
|
||||||
|
@ -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}/'
|
||||||
|
@ -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'):
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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(
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -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])
|
|
||||||
|
@ -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
|
||||||
|
@ -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(
|
||||||
|
@ -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])
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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])
|
|
||||||
|
@ -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])
|
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user