netbox-plugin-dns 1.3b1__py3-none-any.whl → 1.3.1__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.

Files changed (73) hide show
  1. netbox_dns/__init__.py +3 -2
  2. netbox_dns/api/nested_serializers.py +54 -49
  3. netbox_dns/api/serializers_/dnssec_key_template.py +22 -13
  4. netbox_dns/api/serializers_/dnssec_policy.py +89 -40
  5. netbox_dns/api/serializers_/nameserver.py +25 -13
  6. netbox_dns/api/serializers_/record.py +46 -38
  7. netbox_dns/api/serializers_/record_template.py +21 -12
  8. netbox_dns/api/serializers_/registrar.py +14 -5
  9. netbox_dns/api/serializers_/registration_contact.py +13 -5
  10. netbox_dns/api/serializers_/view.py +28 -19
  11. netbox_dns/api/serializers_/zone.py +87 -62
  12. netbox_dns/api/serializers_/zone_template.py +40 -34
  13. netbox_dns/choices/dnssec_key_template.py +4 -0
  14. netbox_dns/choices/record.py +4 -2
  15. netbox_dns/filtersets/dnssec_key_template.py +10 -4
  16. netbox_dns/filtersets/dnssec_policy.py +2 -0
  17. netbox_dns/filtersets/nameserver.py +9 -4
  18. netbox_dns/filtersets/record.py +16 -15
  19. netbox_dns/filtersets/record_template.py +13 -12
  20. netbox_dns/filtersets/registrar.py +1 -0
  21. netbox_dns/filtersets/registration_contact.py +1 -0
  22. netbox_dns/filtersets/view.py +10 -4
  23. netbox_dns/filtersets/zone.py +39 -20
  24. netbox_dns/filtersets/zone_template.py +10 -9
  25. netbox_dns/forms/dnssec_key_template.py +97 -46
  26. netbox_dns/forms/dnssec_policy.py +124 -105
  27. netbox_dns/forms/nameserver.py +71 -36
  28. netbox_dns/forms/record.py +96 -78
  29. netbox_dns/forms/record_template.py +87 -59
  30. netbox_dns/forms/registrar.py +55 -39
  31. netbox_dns/forms/registration_contact.py +64 -41
  32. netbox_dns/forms/view.py +98 -51
  33. netbox_dns/forms/zone.py +273 -243
  34. netbox_dns/forms/zone_template.py +151 -101
  35. netbox_dns/graphql/types.py +3 -3
  36. netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
  37. netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
  38. netbox_dns/migrations/0019_dnssecpolicy_parental_agents.py +25 -0
  39. netbox_dns/migrations/0020_remove_dnssecpolicy_parental_agents_and_more.py +29 -0
  40. netbox_dns/migrations/0021_alter_record_ptr_record.py +25 -0
  41. netbox_dns/models/dnssec_key_template.py +24 -22
  42. netbox_dns/models/dnssec_policy.py +17 -16
  43. netbox_dns/models/nameserver.py +26 -25
  44. netbox_dns/models/record.py +117 -61
  45. netbox_dns/models/record_template.py +30 -29
  46. netbox_dns/models/registrar.py +13 -12
  47. netbox_dns/models/registration_contact.py +33 -32
  48. netbox_dns/models/view.py +16 -15
  49. netbox_dns/models/zone.py +88 -57
  50. netbox_dns/models/zone_template.py +35 -34
  51. netbox_dns/tables/dnssec_key_template.py +13 -12
  52. netbox_dns/tables/dnssec_policy.py +18 -15
  53. netbox_dns/tables/nameserver.py +10 -8
  54. netbox_dns/tables/record.py +55 -34
  55. netbox_dns/tables/record_template.py +21 -17
  56. netbox_dns/tables/registrar.py +15 -9
  57. netbox_dns/tables/registration_contact.py +15 -9
  58. netbox_dns/tables/view.py +25 -12
  59. netbox_dns/tables/zone.py +23 -21
  60. netbox_dns/tables/zone_template.py +17 -13
  61. netbox_dns/template_content.py +13 -2
  62. netbox_dns/templates/netbox_dns/record.html +13 -11
  63. netbox_dns/templates/netbox_dns/zone.html +10 -0
  64. netbox_dns/validators/dns_name.py +1 -1
  65. netbox_dns/views/dnssec_key_template.py +3 -3
  66. netbox_dns/views/record.py +19 -3
  67. netbox_dns/views/record_template.py +3 -1
  68. netbox_dns/views/zone_template.py +5 -3
  69. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/METADATA +3 -2
  70. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/RECORD +73 -70
  71. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/WHEEL +1 -1
  72. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/licenses/LICENSE +0 -0
  73. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/top_level.txt +0 -0
netbox_dns/forms/zone.py CHANGED
@@ -1,10 +1,9 @@
1
- from packaging.version import Version
2
-
3
1
  from django import forms
4
2
  from django.db import transaction
5
3
  from django.conf import settings
6
4
  from django.core.validators import MinValueValidator, MaxValueValidator
7
5
  from django.core.exceptions import ValidationError
6
+ from django.contrib.postgres.forms import SimpleArrayField
8
7
  from django.utils.translation import gettext_lazy as _
9
8
 
10
9
  from netbox.forms import (
@@ -22,7 +21,6 @@ from utilities.forms.fields import (
22
21
  CSVModelMultipleChoiceField,
23
22
  DynamicModelChoiceField,
24
23
  )
25
- from utilities.release import load_release_data
26
24
  from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker
27
25
  from utilities.forms.rendering import FieldSet
28
26
  from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice
@@ -51,8 +49,6 @@ __all__ = (
51
49
  "ZoneBulkEditForm",
52
50
  )
53
51
 
54
- QUICK_ADD = Version(load_release_data().version) >= Version("4.2.5")
55
-
56
52
 
57
53
  class RollbackTransaction(Exception):
58
54
  pass
@@ -153,108 +149,59 @@ class ZoneTemplateUpdateMixin:
153
149
 
154
150
 
155
151
  class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
156
- view = DynamicModelChoiceField(
157
- queryset=View.objects.all(),
158
- required=True,
159
- label=_("View"),
160
- quick_add=QUICK_ADD,
161
- )
162
- name = forms.CharField(
163
- required=True,
164
- label=_("Name"),
165
- )
166
- template = DynamicModelChoiceField(
167
- queryset=ZoneTemplate.objects.all(),
168
- required=False,
169
- label=_("Template"),
170
- )
171
- status = forms.ChoiceField(
172
- choices=ZoneStatusChoices,
173
- required=False,
174
- label=_("Status"),
175
- )
176
- nameservers = DynamicModelMultipleChoiceField(
177
- queryset=NameServer.objects.all(),
178
- required=False,
179
- label=_("Nameservers"),
180
- quick_add=QUICK_ADD,
181
- )
182
- default_ttl = TimePeriodField(
183
- required=False,
184
- help_text=_("Default TTL for new records in this zone"),
185
- validators=[MinValueValidator(1)],
186
- label=_("Default TTL"),
187
- )
188
- description = forms.CharField(
189
- required=False,
190
- label=_("Description"),
191
- )
192
- soa_ttl = TimePeriodField(
193
- required=True,
194
- help_text=_("TTL for the SOA record of the zone"),
195
- validators=[MinValueValidator(1)],
196
- label=_("SOA TTL"),
197
- )
198
- soa_mname = DynamicModelChoiceField(
199
- queryset=NameServer.objects.all(),
200
- help_text=_("Primary nameserver this zone"),
201
- required=False,
202
- label=_("SOA MName"),
203
- quick_add=QUICK_ADD,
204
- )
205
- soa_rname = forms.CharField(
206
- required=False,
207
- help_text=_("Mailbox of the zone's administrator"),
208
- label=_("SOA RName"),
209
- )
210
- soa_refresh = TimePeriodField(
211
- required=True,
212
- help_text=_("Refresh interval for secondary nameservers"),
213
- validators=[MinValueValidator(1)],
214
- label=_("SOA Refresh"),
215
- )
216
- soa_retry = TimePeriodField(
217
- required=True,
218
- help_text=_("Retry interval for secondary nameservers"),
219
- validators=[MinValueValidator(1)],
220
- label=_("SOA Retry"),
221
- )
222
- soa_expire = TimePeriodField(
223
- required=True,
224
- validators=[MinValueValidator(1)],
225
- help_text=_("Expire time after which the zone is considered unavailable"),
226
- label=_("SOA Expire"),
227
- )
228
- soa_minimum = TimePeriodField(
229
- required=True,
230
- help_text=_("Minimum TTL for negative results, e.g. NXRRSET, NXDOMAIN"),
231
- validators=[MinValueValidator(1)],
232
- label=_("SOA Minimum TTL"),
233
- )
234
- soa_serial_auto = forms.BooleanField(
235
- required=False,
236
- help_text=_("Automatically generate the SOA serial number"),
237
- label=_("Generate SOA Serial"),
238
- )
239
- soa_serial = forms.IntegerField(
240
- required=False,
241
- validators=[MinValueValidator(1)],
242
- label=_("SOA Serial"),
243
- )
152
+ class Meta:
153
+ model = Zone
244
154
 
245
- rfc2317_prefix = RFC2317NetworkFormField(
246
- required=False,
247
- validators=[validate_ipv4, validate_prefix, validate_rfc2317],
248
- help_text=_("RFC2317 IPv4 prefix with a length of at least 25 bits"),
249
- label=_("RFC2317 Prefix"),
250
- )
251
- rfc2317_parent_managed = forms.BooleanField(
252
- required=False,
253
- help_text=_(
254
- "IPv4 reverse zone for delegating the RFC2317 PTR records is managed in NetBox DNS"
255
- ),
256
- label=_("RFC2317 Parent Managed"),
257
- )
155
+ fields = (
156
+ "name",
157
+ "view",
158
+ "status",
159
+ "template",
160
+ "nameservers",
161
+ "default_ttl",
162
+ "description",
163
+ "soa_ttl",
164
+ "soa_mname",
165
+ "soa_rname",
166
+ "soa_serial_auto",
167
+ "soa_serial",
168
+ "soa_refresh",
169
+ "soa_retry",
170
+ "soa_expire",
171
+ "soa_minimum",
172
+ "rfc2317_prefix",
173
+ "rfc2317_parent_managed",
174
+ "dnssec_policy",
175
+ "inline_signing",
176
+ "parental_agents",
177
+ "registrar",
178
+ "registry_domain_id",
179
+ "expiration_date",
180
+ "domain_status",
181
+ "registrant",
182
+ "admin_c",
183
+ "tech_c",
184
+ "billing_c",
185
+ "tenant_group",
186
+ "tenant",
187
+ "tags",
188
+ )
189
+
190
+ labels = {
191
+ "soa_serial_auto": _("Generate SOA Serial"),
192
+ "rfc2317_parent_managed": _("RFC2317 Parent Managed"),
193
+ }
194
+
195
+ help_texts = {
196
+ "soa_serial_auto": _("Automatically generate the SOA serial number"),
197
+ "rfc2317_parent_managed": _(
198
+ "IPv4 reverse zone for delegating the RFC2317 PTR records is managed in NetBox DNS"
199
+ ),
200
+ }
201
+
202
+ widgets = {
203
+ "expiration_date": DatePicker,
204
+ }
258
205
 
259
206
  fieldsets = (
260
207
  FieldSet(
@@ -282,6 +229,7 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
282
229
  FieldSet(
283
230
  "dnssec_policy",
284
231
  "inline_signing",
232
+ "parental_agents",
285
233
  name=_("DNSSEC"),
286
234
  ),
287
235
  FieldSet(
@@ -300,8 +248,15 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
300
248
  "billing_c",
301
249
  name=_("Domain Registration"),
302
250
  ),
303
- FieldSet("tenant_group", "tenant", name=_("Tenancy")),
304
- FieldSet("tags", name=_("Tags")),
251
+ FieldSet(
252
+ "tenant_group",
253
+ "tenant",
254
+ name=_("Tenancy"),
255
+ ),
256
+ FieldSet(
257
+ "tags",
258
+ name=_("Tags"),
259
+ ),
305
260
  )
306
261
 
307
262
  def __init__(self, *args, **kwargs):
@@ -348,6 +303,96 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
348
303
  name__in=default_nameservers
349
304
  )
350
305
 
306
+ view = DynamicModelChoiceField(
307
+ queryset=View.objects.all(),
308
+ required=True,
309
+ label=_("View"),
310
+ )
311
+ name = forms.CharField(
312
+ required=True,
313
+ label=_("Name"),
314
+ )
315
+ template = DynamicModelChoiceField(
316
+ queryset=ZoneTemplate.objects.all(),
317
+ required=False,
318
+ label=_("Template"),
319
+ )
320
+ status = forms.ChoiceField(
321
+ choices=ZoneStatusChoices,
322
+ required=False,
323
+ label=_("Status"),
324
+ )
325
+ nameservers = DynamicModelMultipleChoiceField(
326
+ queryset=NameServer.objects.all(),
327
+ required=False,
328
+ label=_("Nameservers"),
329
+ )
330
+ default_ttl = TimePeriodField(
331
+ required=False,
332
+ help_text=_("Default TTL for new records in this zone"),
333
+ validators=[MinValueValidator(1)],
334
+ label=_("Default TTL"),
335
+ )
336
+ soa_ttl = TimePeriodField(
337
+ required=True,
338
+ help_text=_("TTL for the SOA record of the zone"),
339
+ validators=[MinValueValidator(1)],
340
+ label=_("SOA TTL"),
341
+ )
342
+ soa_mname = DynamicModelChoiceField(
343
+ queryset=NameServer.objects.all(),
344
+ help_text=_("Primary nameserver this zone"),
345
+ required=False,
346
+ label=_("SOA MName"),
347
+ )
348
+ soa_rname = forms.CharField(
349
+ required=False,
350
+ help_text=_("Mailbox of the zone's administrator"),
351
+ label=_("SOA RName"),
352
+ )
353
+ soa_refresh = TimePeriodField(
354
+ required=True,
355
+ help_text=_("Refresh interval for secondary nameservers"),
356
+ validators=[MinValueValidator(1)],
357
+ label=_("SOA Refresh"),
358
+ )
359
+ soa_retry = TimePeriodField(
360
+ required=True,
361
+ help_text=_("Retry interval for secondary nameservers"),
362
+ validators=[MinValueValidator(1)],
363
+ label=_("SOA Retry"),
364
+ )
365
+ soa_expire = TimePeriodField(
366
+ required=True,
367
+ validators=[MinValueValidator(1)],
368
+ help_text=_("Expire time after which the zone is considered unavailable"),
369
+ label=_("SOA Expire"),
370
+ )
371
+ soa_minimum = TimePeriodField(
372
+ required=True,
373
+ help_text=_("Minimum TTL for negative results, e.g. NXRRSET, NXDOMAIN"),
374
+ validators=[MinValueValidator(1)],
375
+ label=_("SOA Minimum TTL"),
376
+ )
377
+ soa_serial = forms.IntegerField(
378
+ required=False,
379
+ validators=[MinValueValidator(1)],
380
+ label=_("SOA Serial"),
381
+ )
382
+
383
+ parental_agents = SimpleArrayField(
384
+ required=False,
385
+ base_field=forms.GenericIPAddressField(),
386
+ label=_("Parental Agents"),
387
+ )
388
+
389
+ rfc2317_prefix = RFC2317NetworkFormField(
390
+ required=False,
391
+ validators=[validate_ipv4, validate_prefix, validate_rfc2317],
392
+ help_text=_("RFC2317 IPv4 prefix with a length of at least 25 bits"),
393
+ label=_("RFC2317 Prefix"),
394
+ )
395
+
351
396
  def clean_default_ttl(self):
352
397
  return (
353
398
  self.cleaned_data["default_ttl"]
@@ -362,51 +407,16 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
362
407
  else:
363
408
  return name
364
409
 
365
- class Meta:
366
- model = Zone
367
-
368
- fields = (
369
- "name",
370
- "view",
371
- "status",
372
- "template",
373
- "nameservers",
374
- "default_ttl",
375
- "description",
376
- "soa_ttl",
377
- "soa_mname",
378
- "soa_rname",
379
- "soa_serial_auto",
380
- "soa_serial",
381
- "soa_refresh",
382
- "soa_retry",
383
- "soa_expire",
384
- "soa_minimum",
385
- "rfc2317_prefix",
386
- "rfc2317_parent_managed",
387
- "dnssec_policy",
388
- "inline_signing",
389
- "registrar",
390
- "registry_domain_id",
391
- "expiration_date",
392
- "domain_status",
393
- "registrant",
394
- "admin_c",
395
- "tech_c",
396
- "billing_c",
397
- "tenant_group",
398
- "tenant",
399
- "tags",
400
- )
401
- widgets = {
402
- "expiration_date": DatePicker,
403
- }
404
-
405
410
 
406
411
  class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
407
412
  model = Zone
413
+
408
414
  fieldsets = (
409
- FieldSet("q", "filter_id", "tag"),
415
+ FieldSet(
416
+ "q",
417
+ "filter_id",
418
+ "tag",
419
+ ),
410
420
  FieldSet(
411
421
  "view_id",
412
422
  "status",
@@ -425,6 +435,7 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
425
435
  FieldSet(
426
436
  "dnssec_policy_id",
427
437
  "inline_signing",
438
+ "parental_agents",
428
439
  name=_("DNSSEC"),
429
440
  ),
430
441
  FieldSet(
@@ -445,7 +456,11 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
445
456
  "billing_c_id",
446
457
  name=_("Registration"),
447
458
  ),
448
- FieldSet("tenant_group_id", "tenant_id", name=_("Tenancy")),
459
+ FieldSet(
460
+ "tenant_group_id",
461
+ "tenant_id",
462
+ name=_("Tenancy"),
463
+ ),
449
464
  )
450
465
 
451
466
  view_id = DynamicModelMultipleChoiceField(
@@ -517,6 +532,10 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
517
532
  widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
518
533
  label=_("Use Inline Signing"),
519
534
  )
535
+ parental_agents = forms.GenericIPAddressField(
536
+ required=False,
537
+ label=_("Parental Agents"),
538
+ )
520
539
  registrar_id = DynamicModelMultipleChoiceField(
521
540
  queryset=Registrar.objects.all(),
522
541
  required=False,
@@ -570,6 +589,43 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
570
589
 
571
590
 
572
591
  class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
592
+ class Meta:
593
+ model = Zone
594
+
595
+ fields = (
596
+ "view",
597
+ "name",
598
+ "status",
599
+ "template",
600
+ "nameservers",
601
+ "default_ttl",
602
+ "description",
603
+ "soa_ttl",
604
+ "soa_mname",
605
+ "soa_rname",
606
+ "soa_serial_auto",
607
+ "soa_serial",
608
+ "soa_refresh",
609
+ "soa_retry",
610
+ "soa_expire",
611
+ "soa_minimum",
612
+ "dnssec_policy",
613
+ "inline_signing",
614
+ "parental_agents",
615
+ "rfc2317_prefix",
616
+ "rfc2317_parent_managed",
617
+ "registrar",
618
+ "registry_domain_id",
619
+ "expiration_date",
620
+ "domain_status",
621
+ "registrant",
622
+ "admin_c",
623
+ "tech_c",
624
+ "billing_c",
625
+ "tenant",
626
+ "tags",
627
+ )
628
+
573
629
  view = CSVModelChoiceField(
574
630
  queryset=View.objects.all(),
575
631
  required=False,
@@ -734,30 +790,64 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
734
790
  label=_("Template"),
735
791
  )
736
792
 
737
- class Meta:
738
- model = Zone
793
+ def clean_view(self):
794
+ view = self.cleaned_data.get("view")
795
+ if view is None:
796
+ return View.get_default_view()
739
797
 
740
- fields = (
798
+ return view
799
+
800
+ def clean_nameservers(self):
801
+ nameservers = self.cleaned_data.get("nameservers")
802
+ zone_defaults = settings.PLUGINS_CONFIG.get("netbox_dns")
803
+
804
+ if (
805
+ self.data.get("nameservers") is None
806
+ and zone_defaults.get("zone_nameservers") is not None
807
+ ):
808
+ nameservers = NameServer.objects.filter(
809
+ name__in=zone_defaults.get("zone_nameservers")
810
+ )
811
+
812
+ return nameservers
813
+
814
+
815
+ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
816
+ model = Zone
817
+
818
+ fieldsets = (
819
+ FieldSet(
741
820
  "view",
742
- "name",
743
821
  "status",
744
- "template",
745
822
  "nameservers",
746
823
  "default_ttl",
747
824
  "description",
825
+ name=_("Attributes"),
826
+ ),
827
+ FieldSet(
748
828
  "soa_ttl",
749
829
  "soa_mname",
750
830
  "soa_rname",
751
- "soa_serial_auto",
752
- "soa_serial",
753
831
  "soa_refresh",
754
832
  "soa_retry",
755
833
  "soa_expire",
756
834
  "soa_minimum",
835
+ "soa_serial_auto",
836
+ "soa_serial",
837
+ name=_("SOA"),
838
+ ),
839
+ FieldSet(
757
840
  "dnssec_policy",
758
841
  "inline_signing",
842
+ "parental_agents",
843
+ name=_("DNSSEC"),
844
+ ),
845
+ FieldSet(
759
846
  "rfc2317_prefix",
760
847
  "rfc2317_parent_managed",
848
+ name=_("RFC2317"),
849
+ ),
850
+ FieldSet(
761
851
  "registrar",
762
852
  "registry_domain_id",
763
853
  "expiration_date",
@@ -766,33 +856,30 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
766
856
  "admin_c",
767
857
  "tech_c",
768
858
  "billing_c",
859
+ name=_("Domain Registration"),
860
+ ),
861
+ FieldSet(
862
+ "tenant_group",
769
863
  "tenant",
770
- "tags",
771
- )
772
-
773
- def clean_view(self):
774
- view = self.cleaned_data.get("view")
775
- if view is None:
776
- return View.get_default_view()
777
-
778
- return view
779
-
780
- def clean_nameservers(self):
781
- nameservers = self.cleaned_data.get("nameservers")
782
- zone_defaults = settings.PLUGINS_CONFIG.get("netbox_dns")
783
-
784
- if (
785
- self.data.get("nameservers") is None
786
- and zone_defaults.get("zone_nameservers") is not None
787
- ):
788
- nameservers = NameServer.objects.filter(
789
- name__in=zone_defaults.get("zone_nameservers")
790
- )
791
-
792
- return nameservers
864
+ name=_("Tenancy"),
865
+ ),
866
+ )
793
867
 
868
+ nullable_fields = (
869
+ "description",
870
+ "nameservers",
871
+ "rfc2317_prefix",
872
+ "registrar",
873
+ "expiration_date",
874
+ "domain_status",
875
+ "registry_domain_id",
876
+ "registrant",
877
+ "admin_c",
878
+ "tech_c",
879
+ "billing_c",
880
+ "tenant",
881
+ )
794
882
 
795
- class ZoneBulkEditForm(NetBoxModelBulkEditForm):
796
883
  view = DynamicModelChoiceField(
797
884
  queryset=View.objects.all(),
798
885
  required=False,
@@ -886,6 +973,11 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
886
973
  widget=BulkEditNullBooleanSelect(),
887
974
  label=_("Use Inline Signing"),
888
975
  )
976
+ parental_agents = SimpleArrayField(
977
+ required=False,
978
+ base_field=forms.GenericIPAddressField(),
979
+ label=_("Parental Agents"),
980
+ )
889
981
  registrar = DynamicModelChoiceField(
890
982
  queryset=Registrar.objects.all(),
891
983
  required=False,
@@ -935,65 +1027,3 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
935
1027
  required=False,
936
1028
  label=_("Tenant"),
937
1029
  )
938
-
939
- model = Zone
940
-
941
- fieldsets = (
942
- FieldSet(
943
- "view",
944
- "status",
945
- "nameservers",
946
- "default_ttl",
947
- "description",
948
- name=_("Attributes"),
949
- ),
950
- FieldSet(
951
- "soa_ttl",
952
- "soa_mname",
953
- "soa_rname",
954
- "soa_refresh",
955
- "soa_retry",
956
- "soa_expire",
957
- "soa_minimum",
958
- "soa_serial_auto",
959
- "soa_serial",
960
- name=_("SOA"),
961
- ),
962
- FieldSet(
963
- "dnssec_policy",
964
- "inline_signing",
965
- name=_("DNSSEC"),
966
- ),
967
- FieldSet(
968
- "rfc2317_prefix",
969
- "rfc2317_parent_managed",
970
- name=_("RFC2317"),
971
- ),
972
- FieldSet(
973
- "registrar",
974
- "registry_domain_id",
975
- "expiration_date",
976
- "domain_status",
977
- "registrant",
978
- "admin_c",
979
- "tech_c",
980
- "billing_c",
981
- name=_("Domain Registration"),
982
- ),
983
- FieldSet("tenant_group", "tenant", name=_("Tenancy")),
984
- )
985
-
986
- nullable_fields = (
987
- "description",
988
- "nameservers",
989
- "rfc2317_prefix",
990
- "registrar",
991
- "expiration_date",
992
- "domain_status",
993
- "registry_domain_id",
994
- "registrant",
995
- "admin_c",
996
- "tech_c",
997
- "billing_c",
998
- "tenant",
999
- )