to DB driven to permit user modification: modified: netbox_dns_bridge/models.py Add 4 cols for values. modified: netbox_dns_bridge/migrations/0003_catalogzone_and_per_zone_identifier.py Adjust migration. This expects that the last migration the user has is 0002 (<=v1.5.8) modified: netbox_dns_bridge/jobs/notify.py modified: netbox_dns_bridge/management/commands/dns_transfer_endpoint/catalog_zone_manager.py Update to use new db values for SOA creation. Change UI to permit editing for SOA values and disable member identifier editing. modified: netbox_dns_bridge/forms.py modified: netbox_dns_bridge/navigation.py new file: netbox_dns_bridge/templates/netbox_dns_bridge/catalog_zone_edit.html new file: netbox_dns_bridge/templates/netbox_dns_bridge/catalog_zone_list.html new file: netbox_dns_bridge/templates/netbox_dns_bridge/catalog_zone_members.html deleted: netbox_dns_bridge/templates/netbox_dns_bridge/catz_overview.html modified: netbox_dns_bridge/tables.py modified: netbox_dns_bridge/urls.py modified: netbox_dns_bridge/views.py modified: netbox_dns_bridge/filtersets.py GUI components are entirely AI generated. Plumbing also with AI assist but code verified.
86 lines
2.1 KiB
Python
86 lines
2.1 KiB
Python
from django.db import models
|
|
from django.urls import reverse
|
|
|
|
# import netbox.models
|
|
import netbox_dns.models
|
|
|
|
|
|
class CatalogZone(models.Model):
|
|
_netbox_private = True
|
|
|
|
view = models.OneToOneField(
|
|
to=netbox_dns.models.View,
|
|
on_delete=models.CASCADE,
|
|
related_name="catalog_zone",
|
|
)
|
|
soa_serial = models.IntegerField(default=1)
|
|
soa_refresh = models.IntegerField(default=60)
|
|
soa_retry = models.IntegerField(default=10)
|
|
soa_expire = models.IntegerField(default=1209600)
|
|
soa_minimum = models.IntegerField(default=0)
|
|
|
|
class Meta:
|
|
ordering = ("view__name",)
|
|
|
|
def __str__(self):
|
|
return f"{self.view.name}: {self.soa_serial}"
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("plugins:netbox_dns_bridge:catalogzone_edit", args=[self.pk])
|
|
|
|
|
|
class CatalogZoneMemberIdentifier(models.Model):
|
|
_netbox_private = True
|
|
|
|
name = models.CharField(
|
|
max_length=26,
|
|
)
|
|
|
|
zone = models.OneToOneField(
|
|
to=netbox_dns.models.Zone,
|
|
on_delete=models.CASCADE,
|
|
related_name="catz_identifier",
|
|
)
|
|
|
|
catalog_zone = models.ForeignKey(
|
|
to=CatalogZone,
|
|
on_delete=models.CASCADE,
|
|
related_name="member_identifiers",
|
|
)
|
|
|
|
class Meta:
|
|
ordering = ("name",)
|
|
constraints = [
|
|
models.UniqueConstraint(
|
|
fields=["name", "catalog_zone"],
|
|
name="unique_name_per_catalog_zone",
|
|
),
|
|
]
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class SeenTransferClients(models.Model):
|
|
_netbox_private = True
|
|
|
|
source_ip = models.GenericIPAddressField()
|
|
last_seen = models.DateTimeField()
|
|
view = models.ForeignKey(
|
|
to=netbox_dns.models.View,
|
|
on_delete=models.PROTECT,
|
|
related_name="seen_transfer_clients",
|
|
)
|
|
|
|
def __str__(self):
|
|
return f"{self.source_ip} ({self.view.name})"
|
|
|
|
class Meta:
|
|
ordering = ("source_ip",)
|
|
constraints = [
|
|
models.UniqueConstraint(
|
|
fields=["source_ip", "view"],
|
|
name="unique_ip_view_seen_client",
|
|
),
|
|
]
|