1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00
Files
netbox-community-netbox/netbox/ipam/models/fhrp.py
Jeremy Stretch caedc8dbe3 Closes #13352: Translation support for model verbose names (#13354)
* Update verbose_name & verbose_name_plural Meta attributes on all models

* Alter makemigrations to ignore verbose_name & verbose_name_plural changes
2023-08-03 10:41:10 -04:00

122 lines
3.5 KiB
Python

from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from netbox.models import ChangeLoggedModel, PrimaryModel
from ipam.choices import *
from ipam.constants import *
__all__ = (
'FHRPGroup',
'FHRPGroupAssignment',
)
class FHRPGroup(PrimaryModel):
"""
A grouping of next hope resolution protocol (FHRP) peers. (For instance, VRRP or HSRP.)
"""
group_id = models.PositiveSmallIntegerField(
verbose_name=_('group ID')
)
name = models.CharField(
verbose_name=_('name'),
max_length=100,
blank=True
)
protocol = models.CharField(
verbose_name=_('protocol'),
max_length=50,
choices=FHRPGroupProtocolChoices
)
auth_type = models.CharField(
max_length=50,
choices=FHRPGroupAuthTypeChoices,
blank=True,
verbose_name=_('authentication type')
)
auth_key = models.CharField(
max_length=255,
blank=True,
verbose_name=_('authentication key')
)
ip_addresses = GenericRelation(
to='ipam.IPAddress',
content_type_field='assigned_object_type',
object_id_field='assigned_object_id',
related_query_name='fhrpgroup'
)
clone_fields = ('protocol', 'auth_type', 'auth_key', 'description')
class Meta:
ordering = ['protocol', 'group_id', 'pk']
verbose_name = _('FHRP group')
verbose_name_plural = _('FHRP groups')
def __str__(self):
name = ''
if self.name:
name = f'{self.name} '
name += f'{self.get_protocol_display()}: {self.group_id}'
# Append the first assigned IP addresses (if any) to serve as an additional identifier
if self.pk:
ip_address = self.ip_addresses.first()
if ip_address:
return f"{name} ({ip_address})"
return name
def get_absolute_url(self):
return reverse('ipam:fhrpgroup', args=[self.pk])
class FHRPGroupAssignment(ChangeLoggedModel):
interface_type = models.ForeignKey(
to=ContentType,
on_delete=models.CASCADE
)
interface_id = models.PositiveBigIntegerField()
interface = GenericForeignKey(
ct_field='interface_type',
fk_field='interface_id'
)
group = models.ForeignKey(
to='ipam.FHRPGroup',
on_delete=models.CASCADE
)
priority = models.PositiveSmallIntegerField(
verbose_name=_('priority'),
validators=(
MinValueValidator(FHRPGROUPASSIGNMENT_PRIORITY_MIN),
MaxValueValidator(FHRPGROUPASSIGNMENT_PRIORITY_MAX)
)
)
clone_fields = ('interface_type', 'interface_id')
class Meta:
ordering = ('-priority', 'pk')
constraints = (
models.UniqueConstraint(
fields=('interface_type', 'interface_id', 'group'),
name='%(app_label)s_%(class)s_unique_interface_group'
),
)
verbose_name = _('FHRP group assignment')
verbose_name_plural = _('FHRP group assignments')
def __str__(self):
return f'{self.interface}: {self.group} ({self.priority})'
def get_absolute_url(self):
# Used primarily for redirection after creating a new assignment
if self.interface:
return self.interface.get_absolute_url()
return None