netbox-plugin-dns 1.1.3__py3-none-any.whl → 1.1.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of netbox-plugin-dns might be problematic. Click here for more details.

netbox_dns/__init__.py CHANGED
@@ -4,9 +4,9 @@ from django.utils.translation import gettext_lazy as _
4
4
  from netbox.plugins import PluginConfig
5
5
  from ipam.choices import IPAddressStatusChoices
6
6
 
7
- from netbox_dns.choices import RecordTypeChoices
7
+ from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices, ZoneStatusChoices
8
8
 
9
- __version__ = "1.1.3"
9
+ __version__ = "1.1.4"
10
10
 
11
11
 
12
12
  class DNSConfig(PluginConfig):
@@ -26,6 +26,13 @@ class DNSConfig(PluginConfig):
26
26
  "zone_soa_retry": 7200,
27
27
  "zone_soa_expire": 2419200,
28
28
  "zone_soa_minimum": 3600,
29
+ "zone_active_status": [
30
+ ZoneStatusChoices.STATUS_ACTIVE,
31
+ ZoneStatusChoices.STATUS_DYNAMIC,
32
+ ],
33
+ "record_active_status": [
34
+ RecordStatusChoices.STATUS_ACTIVE,
35
+ ],
29
36
  "dnssync_disabled": False,
30
37
  "dnssync_ipaddress_active_status": [
31
38
  IPAddressStatusChoices.STATUS_ACTIVE,
@@ -13,10 +13,12 @@ class ZoneStatusChoices(ChoiceSet):
13
13
  STATUS_RESERVED = "reserved"
14
14
  STATUS_DEPRECATED = "deprecated"
15
15
  STATUS_PARKED = "parked"
16
+ STATUS_DYNAMIC = "dynamic"
16
17
 
17
18
  CHOICES = [
18
19
  (STATUS_ACTIVE, _("Active"), "blue"),
19
20
  (STATUS_RESERVED, _("Reserved"), "cyan"),
20
21
  (STATUS_DEPRECATED, _("Deprecated"), "red"),
21
22
  (STATUS_PARKED, _("Parked"), "gray"),
23
+ (STATUS_DYNAMIC, _("Dynamic"), "orange"),
22
24
  ]
@@ -1,31 +1,13 @@
1
- from django import forms
2
1
  from django.db import models
3
2
  from django.core.exceptions import ValidationError
4
3
  from django.utils.translation import gettext_lazy as _
5
4
 
6
5
  from netaddr import AddrFormatError, IPAddress
7
6
 
7
+ from ipam.formfields import IPAddressFormField
8
8
 
9
- __all__ = (
10
- "AddressFormField",
11
- "AddressField",
12
- )
13
9
 
14
-
15
- class AddressFormField(forms.Field):
16
- def to_python(self, value):
17
- if not value:
18
- return None
19
-
20
- if isinstance(value, IPAddress):
21
- return value
22
-
23
- try:
24
- ip_address = IPAddress(value)
25
- except AddrFormatError as exc:
26
- raise ValidationError(exc)
27
-
28
- return ip_address
10
+ __all__ = ("AddressField",)
29
11
 
30
12
 
31
13
  class AddressField(models.Field):
@@ -58,7 +40,7 @@ class AddressField(models.Field):
58
40
  return str(self.to_python(value))
59
41
 
60
42
  def form_class(self):
61
- return AddressFormField
43
+ return IPAddressFormField
62
44
 
63
45
  def formfield(self, **kwargs):
64
46
  defaults = {"form_class": self.form_class()}
@@ -76,6 +76,9 @@ class RecordFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
76
76
  method="filter_ip_address",
77
77
  label=_("IP Address"),
78
78
  )
79
+ active = django_filters.BooleanFilter(
80
+ label=_("Record is active"),
81
+ )
79
82
 
80
83
  managed = django_filters.BooleanFilter()
81
84
 
@@ -89,6 +92,7 @@ class RecordFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
89
92
  "ttl",
90
93
  "value",
91
94
  "disable_ptr",
95
+ "active",
92
96
  "managed",
93
97
  )
94
98
 
@@ -38,12 +38,6 @@ class RecordForm(TenancyForm, NetBoxModelForm):
38
38
  def __init__(self, *args, **kwargs):
39
39
  super().__init__(*args, **kwargs)
40
40
 
41
- initial_zone_id = self.initial.get("zone")
42
- if initial_zone_id is not None:
43
- self.initial["view"] = Zone.objects.get(pk=initial_zone_id).view
44
- else:
45
- self.initial["view"] = View.get_default_view()
46
-
47
41
  initial_name = self.initial.get("name")
48
42
  if initial_name:
49
43
  self.initial["name"] = name_to_unicode(initial_name)
@@ -51,6 +45,9 @@ class RecordForm(TenancyForm, NetBoxModelForm):
51
45
  view = DynamicModelChoiceField(
52
46
  queryset=View.objects.all(),
53
47
  required=False,
48
+ initial_params={
49
+ "zone": "$zone",
50
+ },
54
51
  label=_p("DNS", "View"),
55
52
  )
56
53
  zone = DynamicModelChoiceField(
@@ -111,6 +108,7 @@ class RecordFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
111
108
  fieldsets = (
112
109
  FieldSet("q", "filter_id", "tag"),
113
110
  FieldSet(
111
+ "view_id",
114
112
  "zone_id",
115
113
  "name",
116
114
  "fqdn",
@@ -118,6 +116,7 @@ class RecordFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
118
116
  "value",
119
117
  "disable_ptr",
120
118
  "status",
119
+ "active",
121
120
  "description",
122
121
  name=_("Attributes"),
123
122
  ),
@@ -151,10 +150,23 @@ class RecordFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
151
150
  required=False,
152
151
  label=_("Status"),
153
152
  )
153
+ view_id = DynamicModelMultipleChoiceField(
154
+ queryset=View.objects.all(),
155
+ required=False,
156
+ label=_("View"),
157
+ )
154
158
  zone_id = DynamicModelMultipleChoiceField(
155
159
  queryset=Zone.objects.all(),
156
160
  required=False,
157
161
  label=_("Zone"),
162
+ query_params={
163
+ "view_id": "$view_id",
164
+ },
165
+ )
166
+ active = forms.NullBooleanField(
167
+ required=False,
168
+ widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
169
+ label=_("Active"),
158
170
  )
159
171
  description = forms.CharField(
160
172
  required=False,
netbox_dns/forms/zone.py CHANGED
@@ -354,6 +354,7 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
354
354
  "status",
355
355
  "name",
356
356
  "nameserver_id",
357
+ "active",
357
358
  "description",
358
359
  name=_("Attributes"),
359
360
  ),
@@ -400,6 +401,11 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
400
401
  required=False,
401
402
  label=_("Nameservers"),
402
403
  )
404
+ active = forms.NullBooleanField(
405
+ required=False,
406
+ widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
407
+ label=_("Active"),
408
+ )
403
409
  description = forms.CharField(
404
410
  required=False,
405
411
  label=_("Description"),
@@ -781,7 +787,7 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
781
787
  tenant_group = DynamicModelChoiceField(
782
788
  queryset=TenantGroup.objects.all(),
783
789
  required=False,
784
- label=_("Tenant"),
790
+ label=_("Tenant Group"),
785
791
  )
786
792
  tenant = DynamicModelChoiceField(
787
793
  queryset=Tenant.objects.all(),
Binary file
@@ -34,6 +34,9 @@ __all__ = (
34
34
  "RecordIndex",
35
35
  )
36
36
 
37
+ ZONE_ACTIVE_STATUS_LIST = get_plugin_config("netbox_dns", "zone_active_status")
38
+ RECORD_ACTIVE_STATUS_LIST = get_plugin_config("netbox_dns", "record_active_status")
39
+
37
40
 
38
41
  def min_ttl(*ttl_list):
39
42
  return min((ttl for ttl in ttl_list if ttl is not None), default=None)
@@ -102,14 +105,14 @@ class RecordManager(models.Manager.from_queryset(RestrictedQuerySet)):
102
105
  .annotate(
103
106
  active=ExpressionWrapper(
104
107
  Q(
105
- Q(zone__status__in=zone.Zone.ACTIVE_STATUS_LIST)
108
+ Q(zone__status__in=ZONE_ACTIVE_STATUS_LIST)
106
109
  & Q(
107
110
  Q(address_record__isnull=True)
108
111
  | Q(
109
- address_record__zone__status__in=zone.Zone.ACTIVE_STATUS_LIST
112
+ address_record__zone__status__in=ZONE_ACTIVE_STATUS_LIST
110
113
  )
111
114
  )
112
- & Q(status__in=Record.ACTIVE_STATUS_LIST)
115
+ & Q(status__in=RECORD_ACTIVE_STATUS_LIST)
113
116
  ),
114
117
  output_field=BooleanField(),
115
118
  )
@@ -118,8 +121,6 @@ class RecordManager(models.Manager.from_queryset(RestrictedQuerySet)):
118
121
 
119
122
 
120
123
  class Record(ObjectModificationMixin, ContactsMixin, NetBoxModel):
121
- ACTIVE_STATUS_LIST = (RecordStatusChoices.STATUS_ACTIVE,)
122
-
123
124
  unique_ptr_qs = Q(
124
125
  Q(disable_ptr=False),
125
126
  Q(Q(type=RecordTypeChoices.A) | Q(type=RecordTypeChoices.AAAA)),
@@ -295,8 +296,8 @@ class Record(ObjectModificationMixin, ContactsMixin, NetBoxModel):
295
296
  @property
296
297
  def is_active(self):
297
298
  return (
298
- self.status in Record.ACTIVE_STATUS_LIST
299
- and self.zone.status in zone.Zone.ACTIVE_STATUS_LIST
299
+ self.status in RECORD_ACTIVE_STATUS_LIST
300
+ and self.zone.status in ZONE_ACTIVE_STATUS_LIST
300
301
  )
301
302
 
302
303
  @property
@@ -597,7 +598,7 @@ class Record(ObjectModificationMixin, ContactsMixin, NetBoxModel):
597
598
 
598
599
  def validate_value(self):
599
600
  try:
600
- validate_record_value(self.type, self.value)
601
+ validate_record_value(self)
601
602
  except ValidationError as exc:
602
603
  raise ValidationError({"value": exc})
603
604
 
@@ -616,7 +617,7 @@ class Record(ObjectModificationMixin, ContactsMixin, NetBoxModel):
616
617
  name=self.name,
617
618
  type=self.type,
618
619
  value=self.value,
619
- status__in=Record.ACTIVE_STATUS_LIST,
620
+ status__in=RECORD_ACTIVE_STATUS_LIST,
620
621
  )
621
622
 
622
623
  if not self._state.adding:
@@ -653,7 +654,7 @@ class Record(ObjectModificationMixin, ContactsMixin, NetBoxModel):
653
654
  name=self.name,
654
655
  type=self.type,
655
656
  value=self.value,
656
- status__in=Record.ACTIVE_STATUS_LIST,
657
+ status__in=RECORD_ACTIVE_STATUS_LIST,
657
658
  ipam_ip_address__isnull=True,
658
659
  )
659
660
 
@@ -137,7 +137,7 @@ class RecordTemplate(NetBoxModel):
137
137
 
138
138
  def validate_value(self):
139
139
  try:
140
- validate_record_value(self.type, self.value)
140
+ validate_record_value(self)
141
141
  except ValidationError as exc:
142
142
  raise ValidationError({"value": exc}) from None
143
143
 
netbox_dns/models/zone.py CHANGED
@@ -53,6 +53,9 @@ __all__ = (
53
53
  "ZoneIndex",
54
54
  )
55
55
 
56
+ ZONE_ACTIVE_STATUS_LIST = get_plugin_config("netbox_dns", "zone_active_status")
57
+ RECORD_ACTIVE_STATUS_LIST = get_plugin_config("netbox_dns", "record_active_status")
58
+
56
59
 
57
60
  class ZoneManager(models.Manager.from_queryset(RestrictedQuerySet)):
58
61
  """
@@ -65,15 +68,13 @@ class ZoneManager(models.Manager.from_queryset(RestrictedQuerySet)):
65
68
  .get_queryset()
66
69
  .annotate(
67
70
  active=ExpressionWrapper(
68
- Q(status__in=Zone.ACTIVE_STATUS_LIST), output_field=BooleanField()
71
+ Q(status__in=ZONE_ACTIVE_STATUS_LIST), output_field=BooleanField()
69
72
  )
70
73
  )
71
74
  )
72
75
 
73
76
 
74
77
  class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
75
- ACTIVE_STATUS_LIST = (ZoneStatusChoices.STATUS_ACTIVE,)
76
-
77
78
  def __init__(self, *args, **kwargs):
78
79
  kwargs.pop("template", None)
79
80
 
@@ -299,11 +300,21 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
299
300
 
300
301
  @staticmethod
301
302
  def get_defaults():
303
+ default_fields = (
304
+ "zone_default_ttl",
305
+ "zone_soa_ttl",
306
+ "zone_soa_serial",
307
+ "zone_soa_refresh",
308
+ "zone_soa_retry",
309
+ "zone_soa_expire",
310
+ "zone_soa_minimum",
311
+ "zone_soa_rname",
312
+ )
313
+
302
314
  return {
303
315
  field[5:]: value
304
316
  for field, value in settings.PLUGINS_CONFIG.get("netbox_dns").items()
305
- if field.startswith("zone_")
306
- and field not in ("zone_soa_mname", "zone_nameservers")
317
+ if field in default_fields
307
318
  }
308
319
 
309
320
  @property
@@ -337,7 +348,7 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
337
348
 
338
349
  @property
339
350
  def is_active(self):
340
- return self.status in Zone.ACTIVE_STATUS_LIST
351
+ return self.status in ZONE_ACTIVE_STATUS_LIST
341
352
 
342
353
  @property
343
354
  def is_reverse_zone(self):
@@ -474,7 +485,7 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
474
485
  relative_name = name.relativize(parent).to_text()
475
486
  address_records = Record.objects.filter(
476
487
  Q(zone=ns_zone),
477
- Q(status__in=Record.ACTIVE_STATUS_LIST),
488
+ Q(status__in=RECORD_ACTIVE_STATUS_LIST),
478
489
  Q(Q(name=f"{_nameserver.name}.") | Q(name=relative_name)),
479
490
  Q(Q(type=RecordTypeChoices.A) | Q(type=RecordTypeChoices.AAAA)),
480
491
  )
@@ -63,7 +63,7 @@ def ipam_dnssync_ipaddress_post_clean(instance, **kwargs):
63
63
  {
64
64
  "dns_name": _(
65
65
  "Unique DNS records are enforced and there is already "
66
- "an active IP address {address} with DNS name {name}. Plesase choose "
66
+ "an active IP address {address} with DNS name {name}. Please choose "
67
67
  "a different name or disable record creation for this IP address."
68
68
  ).format(address=instance.address, name=instance.dns_name)
69
69
  }
@@ -1,5 +1,8 @@
1
- import dns
1
+ import re
2
+ import textwrap
3
+
2
4
  from dns import rdata, name as dns_name
5
+ from dns.exception import SyntaxError
3
6
 
4
7
  from django.core.exceptions import ValidationError
5
8
  from django.utils.translation import gettext as _
@@ -11,11 +14,12 @@ from netbox_dns.validators import (
11
14
  validate_generic_name,
12
15
  )
13
16
 
17
+ MAX_TXT_LENGTH = 255
14
18
 
15
19
  __all__ = ("validate_record_value",)
16
20
 
17
21
 
18
- def validate_record_value(record_type, value):
22
+ def validate_record_value(record):
19
23
  def _validate_idn(name):
20
24
  try:
21
25
  name.to_unicode()
@@ -26,16 +30,53 @@ def validate_record_value(record_type, value):
26
30
  )
27
31
  )
28
32
 
33
+ def _split_text_value(value):
34
+ # +
35
+ # Text values longer than 255 characters need to be broken up for TXT and
36
+ # SPF records.
37
+ # First, in case they had been split into separate strings, reassemble the
38
+ # original (long) value, then split it into chunks of a maximum length of
39
+ # 255 (preferably at word boundaries), and then build a sequence of partial
40
+ # strings enclosed in double quotes and separated by space.
41
+ #
42
+ # See https://datatracker.ietf.org/doc/html/rfc4408#section-3.1.3 for details.
43
+ # -
44
+ raw_value = "".join(re.findall(r'"([^"]+)"', value))
45
+ if not raw_value:
46
+ raw_value = value
47
+
48
+ return " ".join(
49
+ f'"{part}"'
50
+ for part in textwrap.wrap(raw_value, MAX_TXT_LENGTH, drop_whitespace=False)
51
+ )
52
+
53
+ if record.type in (RecordTypeChoices.TXT, RecordTypeChoices.SPF):
54
+ if not (record.value.isascii() and record.value.isprintable()):
55
+ raise ValidationError(
56
+ _(
57
+ "Record value {value} for a type {type} record is not a printable ASCII string."
58
+ ).format(value=record.value, type=record.type)
59
+ )
60
+
61
+ if len(record.value) <= MAX_TXT_LENGTH:
62
+ return
63
+
64
+ try:
65
+ rr = rdata.from_text(RecordClassChoices.IN, record.type, record.value)
66
+ except SyntaxError as exc:
67
+ if str(exc) == "string too long":
68
+ record.value = _split_text_value(record.value)
69
+
29
70
  try:
30
- rr = rdata.from_text(RecordClassChoices.IN, record_type, value)
31
- except dns.exception.SyntaxError as exc:
71
+ rr = rdata.from_text(RecordClassChoices.IN, record.type, record.value)
72
+ except SyntaxError as exc:
32
73
  raise ValidationError(
33
74
  _(
34
75
  "Record value {value} is not a valid value for a {type} record: {error}."
35
- ).format(value=value, type=record_type, error=exc)
76
+ ).format(value=record.value, type=record.type, error=exc)
36
77
  )
37
78
 
38
- match record_type:
79
+ match record.type:
39
80
  case RecordTypeChoices.CNAME:
40
81
  _validate_idn(rr.target)
41
82
  validate_domain_name(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: netbox-plugin-dns
3
- Version: 1.1.3
3
+ Version: 1.1.4
4
4
  Summary: NetBox DNS is a NetBox plugin for managing DNS data.
5
5
  Author-email: Peter Eckel <pete@netbox-dns.org>
6
6
  Project-URL: Homepage, https://github.com/peteeckel/netbox-plugin-dns
@@ -32,7 +32,7 @@ The NetBox DNS plugin enables NetBox to manage operational DNS data such as name
32
32
 
33
33
  > [!WARNING]
34
34
  > **As a result of some issues with NetBox Branching still under investigation, NetBox DNS is currently not compatible with the new NetBox Branching plugin.**
35
- > This affects multiple aspects of the branching functionality, and currently (netboxlabs-branching-plugin version 0.4.0) there is no workaround. Do not try to use NetBox Branching together with NetBox DNS until these issues are resolved.
35
+ > This affects multiple aspects of the branching functionality, and currently there is no workaround. Do not try to use NetBox Branching together with NetBox DNS until these issues are resolved.
36
36
  > This warning will be updated as soon as the situation is resolved.
37
37
 
38
38
  ## Objectives
@@ -1,4 +1,4 @@
1
- netbox_dns/__init__.py,sha256=bZFTACSdnnWzW9uVu54HVqyzxT63PmLXws9BUjSSaKc,2045
1
+ netbox_dns/__init__.py,sha256=06f0xcIKeIKEIEPqxPLgJBjTAzntCvaFVzY53B70Kf8,2311
2
2
  netbox_dns/apps.py,sha256=JCW5eS-AQBUubDJve1DjP-IRFKTFGQh1NLGWzJpC5MI,151
3
3
  netbox_dns/navigation.py,sha256=T0-D3KKZLrKT9IuSp5Kh_j7yy-JuWT2b15nwEEJxoTg,6186
4
4
  netbox_dns/template_content.py,sha256=YzE-ZJlERhFybrUKJrmNwHk8_8RPNexkV66x62Sbzic,3718
@@ -18,15 +18,15 @@ netbox_dns/api/serializers_/zone.py,sha256=ELAis8nj9PZlge6zqTQ23P0vC4IJBDa3hh5kZ
18
18
  netbox_dns/api/serializers_/zone_template.py,sha256=w0TsrqS_DgIIAUozCC-gc9lsQ67lpVkvbyphyuRzq6Q,3847
19
19
  netbox_dns/choices/__init__.py,sha256=jOVs2VGV5SVADRlqVnrFeAy26i8BIeEAbGpiX7K8bL8,42
20
20
  netbox_dns/choices/record.py,sha256=wFS44WRyUwiN2ocx-A8ZzVXKpaD9Thb0MrOiMHiqNzU,1175
21
- netbox_dns/choices/zone.py,sha256=UyrTTjUYERInkGyoDmZMg5srtOQrvQ-acKYO6KDV7T0,540
21
+ netbox_dns/choices/zone.py,sha256=Vblm5RUtNtPNkULh8U1NxBMme1iHPllD6B6LkQkWZW4,621
22
22
  netbox_dns/fields/__init__.py,sha256=U1nbFIwwtvr10pp3Sk91jEZeWkVQBSJtr0BVWYgOfiA,89
23
- netbox_dns/fields/address.py,sha256=X973-fu1QBMIFysn9nugf6s5xiGmTZJHnEsBv1Z0W_c,1612
23
+ netbox_dns/fields/address.py,sha256=qNLHmpwwJ3TevljG1QsUr_f2h6NrPsK6wr-R-Ti8eZI,1262
24
24
  netbox_dns/fields/ipam.py,sha256=wla-kBm77BpD0LNQhgRZS1RYbVois7WDqPpyQkUT02k,481
25
25
  netbox_dns/fields/network.py,sha256=a5nTzjscRufxgMjVsf5juszSYuTujU50pQ9P7q4qMVs,3740
26
26
  netbox_dns/fields/rfc2317.py,sha256=y72PZKlXZ8_6P4eeWZ8IF3gqOMjPxW48gk3AB81XboE,2642
27
27
  netbox_dns/filtersets/__init__.py,sha256=f8zJhpC3-TyK1OMgTaXmm1E6C2wUc1mNtoI6LOKkljQ,210
28
28
  netbox_dns/filtersets/nameserver.py,sha256=7hk9Wh4v4-IHP44rQC4nhdvpYbDYNYYf-XZp6Yo72xE,1203
29
- netbox_dns/filtersets/record.py,sha256=pSBoeiiKuEooltwSUl8QIEXuFRu2at-3NEI3r6dskKI,3827
29
+ netbox_dns/filtersets/record.py,sha256=vZC4j4XXLzYZWEWJNs2vKRQvdGaaGWgBnJWaXrq4w9U,3935
30
30
  netbox_dns/filtersets/record_template.py,sha256=wir5s2QWfDnw0M1wWnzJs9im5ok4l5cTbWPMBSM8aEg,1604
31
31
  netbox_dns/filtersets/registrar.py,sha256=Wh_l-IXRHnJhW7Pyokp3czQZISDKzXnWeSQKp512Drc,977
32
32
  netbox_dns/filtersets/registration_contact.py,sha256=903sOcHPRCI0dVzqn1i0pn5VPr_4YpHPh5QE2-akR-Y,1139
@@ -35,18 +35,18 @@ netbox_dns/filtersets/zone.py,sha256=IFJ8OD9qo6OZoWeOJSUWj4-j5g6GLs-1xupiDPS3DeI
35
35
  netbox_dns/filtersets/zone_template.py,sha256=Sm40P33IhN0sOqtjz4JzoBbEK-dTLpfQqYGcM_Xb7KM,3870
36
36
  netbox_dns/forms/__init__.py,sha256=axENVF9vX9BtDKCNxrapRjye1NnygUg9BS0BBj6a0io,209
37
37
  netbox_dns/forms/nameserver.py,sha256=GJe3ece4yIGwMtLZ6wQihBrJu1dk_ZSiwX-vSU0fRa0,3397
38
- netbox_dns/forms/record.py,sha256=WbRftHWCeV_AGxTUxU9dTZJLXaDwGWcLd1m03BoNMMo,7692
38
+ netbox_dns/forms/record.py,sha256=a9LBHp7l9DyZ5ufmnXYBvPhL94DaF4L8BEhMBaVATnc,7927
39
39
  netbox_dns/forms/record_template.py,sha256=iGlBOOsjkXnyLuRyA5DzSXe4syosxzgdWuACtmDq1Vs,6053
40
40
  netbox_dns/forms/registrar.py,sha256=GaRH3w5zlhrpwy_U0pxlrl1DrAEaMB78MUlnGxBRwZI,3949
41
41
  netbox_dns/forms/registration_contact.py,sha256=IhNAqElY7hOdpDG0jwWMdy3y2mB43xmjUhj3lsgJ3SE,5906
42
42
  netbox_dns/forms/view.py,sha256=e5DNKZothUsTpUwL8b0Z3lks9nBLF2rfxwyVHL8HbHg,10410
43
- netbox_dns/forms/zone.py,sha256=Ga_wWBCL4XRBwXtuuaWRyEhRm5HkdCL2UMFe2lA4kNM,24840
43
+ netbox_dns/forms/zone.py,sha256=2GjDchOdr91Yvsj-lCHXZwzW2WMxpmmhJOBT628n9_s,25027
44
44
  netbox_dns/forms/zone_template.py,sha256=x_aufvdDdZmHTPlpcg3-j1DJX2tcRiNnk7M5bP_T0Zg,8560
45
45
  netbox_dns/graphql/__init__.py,sha256=jghYD6uOSAis6YyLbtI3YJGZfwPw1uL2FBRsHs1EhNk,514
46
46
  netbox_dns/graphql/filters.py,sha256=fHCjFIwbPBJJMk2W7HI8LhrfFhCtQtCM9IE8ZMgVafc,1766
47
47
  netbox_dns/graphql/schema.py,sha256=q9DQ_hfRB0e6Znq4-IS6UEeTOfMkZmrWkwxcAql1uOA,2270
48
48
  netbox_dns/graphql/types.py,sha256=24m-qblJoauYzu5n1UDsw_IUvr_r3PRGO-VDt9aKQ3o,6686
49
- netbox_dns/locale/de/LC_MESSAGES/django.mo,sha256=VaKSH5q74PN5L49OfCajM8CBckqbLNsyOa0v3l7jbMM,20358
49
+ netbox_dns/locale/de/LC_MESSAGES/django.mo,sha256=SNx_0uGafEr07KTiR9GakOEAXdRsAygTYfwy5vjFyQQ,20140
50
50
  netbox_dns/locale/en/LC_MESSAGES/django.mo,sha256=GDnSZkfHs3yjtTsll7dksEEej4B50F8pc9RGytZNubM,393
51
51
  netbox_dns/management/commands/cleanup_database.py,sha256=kfnyybudwKGigjJmrOwafPWSUasZr9jQsxN4eWAgMvY,5969
52
52
  netbox_dns/management/commands/cleanup_rrset_ttl.py,sha256=UFRURLBcFeGHUS2lrYFv7UWIebjI72aG1EUQJt0XsXw,2046
@@ -79,15 +79,15 @@ netbox_dns/mixins/__init__.py,sha256=LxTEfpod_RHCyMtnzDljv0_dwqp2z3Q6tqbXW8LTGD8
79
79
  netbox_dns/mixins/object_modification.py,sha256=biLbHOkayEdKPu-wxuYu7ZIXhB3cfv9k07asrQCtFb0,1658
80
80
  netbox_dns/models/__init__.py,sha256=5Ns9RaemTe5L0L3c6a38RxembWhV-sX9cqfjl05aPQw,313
81
81
  netbox_dns/models/nameserver.py,sha256=bL4KSBPKKZH6hDvx6ln5KZCeyrizQpPReFIsqsDfgPk,3462
82
- netbox_dns/models/record.py,sha256=Xv9XoG3rnLNNI3Zkeo_3cpoOn-M6QlicLxEXD8_z1ug,28340
83
- netbox_dns/models/record_template.py,sha256=EkA5RZDyVlMZjfAdUTNpU2w_kJIs0PXH8Cnb61rpeb4,5080
82
+ netbox_dns/models/record.py,sha256=w6myycplbB93eRMh847gO9lYAKHxUnouQep-WH86UY0,28410
83
+ netbox_dns/models/record_template.py,sha256=hRkZg6n93TcZk4cBXtx6i0Xc1y6FZ1Xbbz4zpuUjhj4,5063
84
84
  netbox_dns/models/registrar.py,sha256=90-QYpCYOiaylQJAFsTjH-v_g6Gnik2tgXP-O57ByPI,1853
85
85
  netbox_dns/models/registration_contact.py,sha256=SzBMSDsfkxZGLGvk0nDc92DhHzccgmU_Tz8ZBDXa0H4,3691
86
86
  netbox_dns/models/view.py,sha256=lbtrVtIzxnt3REr7TCsIy9scPiOhWm0BNsLVsDgwmtI,4774
87
- netbox_dns/models/zone.py,sha256=T4W0_eQzegnLSjF9j5FvJW0F58K7LQ2G3PX9oZJWiV4,30520
87
+ netbox_dns/models/zone.py,sha256=w0gMLG3faLhPNNI5HQyq3pTdEGh5wc7QB48ESvffGWc,30838
88
88
  netbox_dns/models/zone_template.py,sha256=tppEGZOuzedRgGQ700gezEVg2aTLnaCi_RVBSVO_tGQ,3908
89
89
  netbox_dns/signals/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
90
- netbox_dns/signals/ipam_dnssync.py,sha256=ZmCCdYwrWmYSXyQiAoO39n6sLxHoipYrBexyip03dGI,8227
90
+ netbox_dns/signals/ipam_dnssync.py,sha256=hyO1q4xKcuAoRCyWUzIdPYwsVgq4N9rp-PKb8hlJQkM,8226
91
91
  netbox_dns/tables/__init__.py,sha256=axENVF9vX9BtDKCNxrapRjye1NnygUg9BS0BBj6a0io,209
92
92
  netbox_dns/tables/ipam_dnssync.py,sha256=7IK95XlA2ter6gsHqXjXPd6WubpOxrV-O5-UT6R1CKU,330
93
93
  netbox_dns/tables/nameserver.py,sha256=Ue1ZTygkgifWbQxvnpIG4PIC2qIWfVZaX_g8OIrRd6Q,739
@@ -132,7 +132,7 @@ netbox_dns/utilities/conversions.py,sha256=NS37SoMqXc13wNWRkKnLfyQbVi6QKD33fu5ov
132
132
  netbox_dns/utilities/ipam_dnssync.py,sha256=3j7FHRPeTBZg95yT6WcHH29pb4fLrUrCEpmsQit-JOY,9625
133
133
  netbox_dns/validators/__init__.py,sha256=Mr8TvmcJTa8Pubj8TzbFBKfbHhEmGcr5JdQvczEJ39A,72
134
134
  netbox_dns/validators/dns_name.py,sha256=D2SVUHkDAdENspDTzvW4qeWdKC_2KcueqNioqgoHrfA,3628
135
- netbox_dns/validators/dns_value.py,sha256=-0zd2Vjsgb-b5ifCsq2iBhJYQuORMxo4ylF3wlXeFZU,2996
135
+ netbox_dns/validators/dns_value.py,sha256=9zCbSLfSYEebn9brcA3Q0vVK2qnvZwlv0HxDoge6Yfs,4586
136
136
  netbox_dns/validators/rfc2317.py,sha256=uKkwxpakiFFKdYA0qy8WSlEnbFwJD4MDw6gGV4F6skg,706
137
137
  netbox_dns/views/__init__.py,sha256=axENVF9vX9BtDKCNxrapRjye1NnygUg9BS0BBj6a0io,209
138
138
  netbox_dns/views/nameserver.py,sha256=H6bNbcntm2KryWqSMCH_9X86Wi5acFg4y8IJ7UPM7A4,3467
@@ -143,8 +143,8 @@ netbox_dns/views/registration_contact.py,sha256=zURc0OhQH18zU6QtfmyLUaaXKLfrTJqg
143
143
  netbox_dns/views/view.py,sha256=u8IxsOWgoSgbgRyz6o3DW58oitLMWPrSSnTeo8naX4M,2957
144
144
  netbox_dns/views/zone.py,sha256=mz0ElySsf4q0VMxRvSdU6DGSSbT1JH4_P75elyXtUGo,5563
145
145
  netbox_dns/views/zone_template.py,sha256=SWU-HcbaJ4xo0QFmh24SLomgfM8YTjizIqP-Rlpti74,2156
146
- netbox_plugin_dns-1.1.3.dist-info/LICENSE,sha256=I3tDu11bZfhFm3EkV4zOD5TmWgLjnUNLEFwrdjniZYs,1112
147
- netbox_plugin_dns-1.1.3.dist-info/METADATA,sha256=WepBh6A9xSmsGc7LKFOSmSSo9WR3CuXApO6E9M4i4Pw,7129
148
- netbox_plugin_dns-1.1.3.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
149
- netbox_plugin_dns-1.1.3.dist-info/top_level.txt,sha256=sA1Rwl1mRKvMC6XHe2ylZ1GF-Q1NGd08XedK9Y4xZc4,11
150
- netbox_plugin_dns-1.1.3.dist-info/RECORD,,
146
+ netbox_plugin_dns-1.1.4.dist-info/LICENSE,sha256=I3tDu11bZfhFm3EkV4zOD5TmWgLjnUNLEFwrdjniZYs,1112
147
+ netbox_plugin_dns-1.1.4.dist-info/METADATA,sha256=3dMbA0mcCZUxjGK1_r8oliknMwLcaPNSu_evXwOvhN8,7085
148
+ netbox_plugin_dns-1.1.4.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
149
+ netbox_plugin_dns-1.1.4.dist-info/top_level.txt,sha256=sA1Rwl1mRKvMC6XHe2ylZ1GF-Q1NGd08XedK9Y4xZc4,11
150
+ netbox_plugin_dns-1.1.4.dist-info/RECORD,,