netbox-plugin-dns 1.2.5__py3-none-any.whl → 1.2.7__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 (77) hide show
  1. netbox_dns/__init__.py +16 -8
  2. netbox_dns/api/field_serializers.py +25 -0
  3. netbox_dns/api/nested_serializers.py +19 -1
  4. netbox_dns/api/serializers.py +3 -0
  5. netbox_dns/api/serializers_/dnssec_key_template.py +59 -0
  6. netbox_dns/api/serializers_/dnssec_policy.py +113 -0
  7. netbox_dns/api/serializers_/record.py +2 -0
  8. netbox_dns/api/serializers_/record_template.py +2 -0
  9. netbox_dns/api/serializers_/zone.py +20 -1
  10. netbox_dns/api/serializers_/zone_template.py +13 -4
  11. netbox_dns/api/urls.py +4 -0
  12. netbox_dns/api/views.py +18 -0
  13. netbox_dns/choices/__init__.py +2 -0
  14. netbox_dns/choices/dnssec_key_template.py +63 -0
  15. netbox_dns/choices/dnssec_policy.py +40 -0
  16. netbox_dns/choices/record.py +2 -25
  17. netbox_dns/choices/utilities.py +26 -0
  18. netbox_dns/choices/zone.py +96 -1
  19. netbox_dns/fields/__init__.py +2 -0
  20. netbox_dns/fields/choice_array.py +33 -0
  21. netbox_dns/fields/timeperiod.py +33 -0
  22. netbox_dns/filtersets/__init__.py +3 -0
  23. netbox_dns/filtersets/dnssec_key_template.py +51 -0
  24. netbox_dns/filtersets/dnssec_policy.py +97 -0
  25. netbox_dns/filtersets/zone.py +30 -6
  26. netbox_dns/filtersets/zone_template.py +13 -2
  27. netbox_dns/forms/__init__.py +2 -0
  28. netbox_dns/forms/dnssec_key_template.py +189 -0
  29. netbox_dns/forms/dnssec_policy.py +593 -0
  30. netbox_dns/forms/nameserver.py +2 -0
  31. netbox_dns/forms/record.py +12 -6
  32. netbox_dns/forms/record_template.py +10 -3
  33. netbox_dns/forms/zone.py +142 -31
  34. netbox_dns/forms/zone_template.py +38 -0
  35. netbox_dns/graphql/__init__.py +7 -3
  36. netbox_dns/graphql/filters.py +16 -0
  37. netbox_dns/graphql/schema.py +20 -0
  38. netbox_dns/graphql/types.py +67 -3
  39. netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
  40. netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
  41. netbox_dns/migrations/0015_dnssec.py +168 -0
  42. netbox_dns/migrations/0016_dnssec_policy_status.py +18 -0
  43. netbox_dns/migrations/0017_dnssec_policy_zone_zone_template.py +41 -0
  44. netbox_dns/migrations/0018_zone_domain_status_zone_expiration_date.py +23 -0
  45. netbox_dns/models/__init__.py +2 -0
  46. netbox_dns/models/dnssec_key_template.py +114 -0
  47. netbox_dns/models/dnssec_policy.py +203 -0
  48. netbox_dns/models/record.py +1 -1
  49. netbox_dns/models/zone.py +74 -19
  50. netbox_dns/models/zone_template.py +17 -7
  51. netbox_dns/navigation.py +49 -0
  52. netbox_dns/signals/dnssec.py +32 -0
  53. netbox_dns/tables/__init__.py +2 -0
  54. netbox_dns/tables/dnssec_key_template.py +48 -0
  55. netbox_dns/tables/dnssec_policy.py +131 -0
  56. netbox_dns/tables/zone.py +23 -2
  57. netbox_dns/tables/zone_template.py +4 -0
  58. netbox_dns/template_content.py +2 -1
  59. netbox_dns/templates/netbox_dns/dnsseckeytemplate.html +70 -0
  60. netbox_dns/templates/netbox_dns/dnssecpolicy.html +155 -0
  61. netbox_dns/templates/netbox_dns/zone/registration.html +19 -0
  62. netbox_dns/templates/netbox_dns/zone.html +16 -0
  63. netbox_dns/templates/netbox_dns/zonetemplate/child.html +46 -0
  64. netbox_dns/templates/netbox_dns/zonetemplate.html +12 -0
  65. netbox_dns/urls.py +23 -0
  66. netbox_dns/utilities/conversions.py +13 -0
  67. netbox_dns/validators/__init__.py +1 -0
  68. netbox_dns/validators/dnssec.py +148 -0
  69. netbox_dns/views/__init__.py +2 -0
  70. netbox_dns/views/dnssec_key_template.py +87 -0
  71. netbox_dns/views/dnssec_policy.py +155 -0
  72. netbox_dns/views/zone.py +11 -1
  73. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7.dist-info}/METADATA +3 -2
  74. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7.dist-info}/RECORD +77 -49
  75. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7.dist-info}/WHEEL +1 -1
  76. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7.dist-info/licenses}/LICENSE +0 -0
  77. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7.dist-info}/top_level.txt +0 -0
@@ -23,6 +23,7 @@ from tenancy.forms import TenancyForm, TenancyFilterForm
23
23
  from netbox_dns.models import RecordTemplate, ZoneTemplate
24
24
  from netbox_dns.choices import RecordSelectableTypeChoices, RecordStatusChoices
25
25
  from netbox_dns.utilities import name_to_unicode
26
+ from netbox_dns.fields import TimePeriodField
26
27
 
27
28
 
28
29
  __all__ = (
@@ -50,7 +51,7 @@ class RecordTemplateForm(TenancyForm, NetBoxModelForm):
50
51
  required=False,
51
52
  label=_("Disable PTR"),
52
53
  )
53
- ttl = forms.IntegerField(
54
+ ttl = TimePeriodField(
54
55
  required=False,
55
56
  label=_("TTL"),
56
57
  )
@@ -99,6 +100,7 @@ class RecordTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
99
100
  "type",
100
101
  "value",
101
102
  "status",
103
+ "ttl",
102
104
  "disable_ptr",
103
105
  "description",
104
106
  name=_("Attributes"),
@@ -129,6 +131,10 @@ class RecordTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
129
131
  required=False,
130
132
  label=_("Status"),
131
133
  )
134
+ ttl = TimePeriodField(
135
+ required=False,
136
+ label=_("TTL"),
137
+ )
132
138
  disable_ptr = forms.NullBooleanField(
133
139
  required=False,
134
140
  label=_("Disable PTR"),
@@ -140,6 +146,7 @@ class RecordTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
140
146
  zone_template_id = DynamicModelMultipleChoiceField(
141
147
  queryset=ZoneTemplate.objects.all(),
142
148
  required=False,
149
+ null_option=_("None"),
143
150
  label=_("Zone Templates"),
144
151
  )
145
152
  tag = TagFilterField(RecordTemplate)
@@ -156,7 +163,7 @@ class RecordTemplateImportForm(NetBoxModelImportForm):
156
163
  required=False,
157
164
  label=_("Status"),
158
165
  )
159
- ttl = forms.IntegerField(
166
+ ttl = TimePeriodField(
160
167
  required=False,
161
168
  label=_("TTL"),
162
169
  )
@@ -209,7 +216,7 @@ class RecordTemplateBulkEditForm(NetBoxModelBulkEditForm):
209
216
  required=False,
210
217
  label=_("Status"),
211
218
  )
212
- ttl = forms.IntegerField(
219
+ ttl = TimePeriodField(
213
220
  required=False,
214
221
  label=_("TTL"),
215
222
  )
netbox_dns/forms/zone.py CHANGED
@@ -23,7 +23,7 @@ from utilities.forms.fields import (
23
23
  DynamicModelChoiceField,
24
24
  )
25
25
  from utilities.release import load_release_data
26
- from utilities.forms.widgets import BulkEditNullBooleanSelect
26
+ from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker
27
27
  from utilities.forms.rendering import FieldSet
28
28
  from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice
29
29
  from tenancy.models import Tenant, TenantGroup
@@ -36,10 +36,11 @@ from netbox_dns.models import (
36
36
  Registrar,
37
37
  RegistrationContact,
38
38
  ZoneTemplate,
39
+ DNSSECPolicy,
39
40
  )
40
- from netbox_dns.choices import ZoneStatusChoices
41
+ from netbox_dns.choices import ZoneStatusChoices, ZoneEPPStatusChoices
41
42
  from netbox_dns.utilities import name_to_unicode, network_to_reverse
42
- from netbox_dns.fields import RFC2317NetworkFormField
43
+ from netbox_dns.fields import RFC2317NetworkFormField, TimePeriodField
43
44
  from netbox_dns.validators import validate_ipv4, validate_prefix, validate_rfc2317
44
45
 
45
46
 
@@ -58,10 +59,21 @@ class RollbackTransaction(Exception):
58
59
 
59
60
 
60
61
  class ZoneTemplateUpdateMixin:
62
+ def _check_soa_mname(self):
63
+ if (
64
+ self.cleaned_data.get("soa_mname") is None
65
+ and "soa_mname" in self.fields.keys()
66
+ ):
67
+ self.add_error(
68
+ "soa_mname",
69
+ _("soa_mname not set and no template or default value defined"),
70
+ )
71
+
61
72
  def clean(self, *args, **kwargs):
62
73
  super().clean(*args, **kwargs)
63
74
 
64
75
  if (template := self.cleaned_data.get("template")) is None:
76
+ self._check_soa_mname()
65
77
  return
66
78
 
67
79
  if not self.cleaned_data.get("nameservers") and template.nameservers.all():
@@ -76,11 +88,7 @@ class ZoneTemplateUpdateMixin:
76
88
  ) not in (None, ""):
77
89
  self.cleaned_data[field] = getattr(template, field)
78
90
 
79
- if self.cleaned_data.get("soa_mname") is None:
80
- self.add_error(
81
- "soa_mname",
82
- _("soa_mname not set and no template or default value defined"),
83
- )
91
+ self._check_soa_mname()
84
92
 
85
93
  if self.errors:
86
94
  return
@@ -171,7 +179,7 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
171
179
  label=_("Nameservers"),
172
180
  quick_add=QUICK_ADD,
173
181
  )
174
- default_ttl = forms.IntegerField(
182
+ default_ttl = TimePeriodField(
175
183
  required=False,
176
184
  help_text=_("Default TTL for new records in this zone"),
177
185
  validators=[MinValueValidator(1)],
@@ -181,7 +189,7 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
181
189
  required=False,
182
190
  label=_("Description"),
183
191
  )
184
- soa_ttl = forms.IntegerField(
192
+ soa_ttl = TimePeriodField(
185
193
  required=True,
186
194
  help_text=_("TTL for the SOA record of the zone"),
187
195
  validators=[MinValueValidator(1)],
@@ -199,25 +207,25 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
199
207
  help_text=_("Mailbox of the zone's administrator"),
200
208
  label=_("SOA RName"),
201
209
  )
202
- soa_refresh = forms.IntegerField(
210
+ soa_refresh = TimePeriodField(
203
211
  required=True,
204
212
  help_text=_("Refresh interval for secondary nameservers"),
205
213
  validators=[MinValueValidator(1)],
206
214
  label=_("SOA Refresh"),
207
215
  )
208
- soa_retry = forms.IntegerField(
216
+ soa_retry = TimePeriodField(
209
217
  required=True,
210
218
  help_text=_("Retry interval for secondary nameservers"),
211
219
  validators=[MinValueValidator(1)],
212
220
  label=_("SOA Retry"),
213
221
  )
214
- soa_expire = forms.IntegerField(
222
+ soa_expire = TimePeriodField(
215
223
  required=True,
216
224
  validators=[MinValueValidator(1)],
217
225
  help_text=_("Expire time after which the zone is considered unavailable"),
218
226
  label=_("SOA Expire"),
219
227
  )
220
- soa_minimum = forms.IntegerField(
228
+ soa_minimum = TimePeriodField(
221
229
  required=True,
222
230
  help_text=_("Minimum TTL for negative results, e.g. NXRRSET, NXDOMAIN"),
223
231
  validators=[MinValueValidator(1)],
@@ -243,7 +251,7 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
243
251
  rfc2317_parent_managed = forms.BooleanField(
244
252
  required=False,
245
253
  help_text=_(
246
- "IPv4 reverse zone for deletgating the RFC2317 PTR records is managed in NetBox DNS"
254
+ "IPv4 reverse zone for delegating the RFC2317 PTR records is managed in NetBox DNS"
247
255
  ),
248
256
  label=_("RFC2317 Parent Managed"),
249
257
  )
@@ -271,6 +279,11 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
271
279
  "soa_serial",
272
280
  name=_("SOA"),
273
281
  ),
282
+ FieldSet(
283
+ "dnssec_policy",
284
+ "inline_signing",
285
+ name=_("DNSSEC"),
286
+ ),
274
287
  FieldSet(
275
288
  "rfc2317_prefix",
276
289
  "rfc2317_parent_managed",
@@ -279,6 +292,8 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
279
292
  FieldSet(
280
293
  "registrar",
281
294
  "registry_domain_id",
295
+ "expiration_date",
296
+ "domain_status",
282
297
  "registrant",
283
298
  "admin_c",
284
299
  "tech_c",
@@ -369,8 +384,12 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
369
384
  "soa_minimum",
370
385
  "rfc2317_prefix",
371
386
  "rfc2317_parent_managed",
387
+ "dnssec_policy",
388
+ "inline_signing",
372
389
  "registrar",
373
390
  "registry_domain_id",
391
+ "expiration_date",
392
+ "domain_status",
374
393
  "registrant",
375
394
  "admin_c",
376
395
  "tech_c",
@@ -379,8 +398,8 @@ class ZoneForm(ZoneTemplateUpdateMixin, TenancyForm, NetBoxModelForm):
379
398
  "tenant",
380
399
  "tags",
381
400
  )
382
- help_texts = {
383
- "soa_mname": _("Primary nameserver for the zone"),
401
+ widgets = {
402
+ "expiration_date": DatePicker,
384
403
  }
385
404
 
386
405
 
@@ -403,6 +422,11 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
403
422
  "soa_serial_auto",
404
423
  name=_("SOA"),
405
424
  ),
425
+ FieldSet(
426
+ "dnssec_policy_id",
427
+ "inline_signing",
428
+ name=_("DNSSEC"),
429
+ ),
406
430
  FieldSet(
407
431
  "rfc2317_prefix",
408
432
  "rfc2317_parent_managed",
@@ -412,6 +436,9 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
412
436
  FieldSet(
413
437
  "registrar_id",
414
438
  "registry_domain_id",
439
+ "expiration_date_before",
440
+ "expiration_date_after",
441
+ "domain_status",
415
442
  "registrant_id",
416
443
  "admin_c_id",
417
444
  "tech_c_id",
@@ -438,6 +465,7 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
438
465
  nameserver_id = DynamicModelMultipleChoiceField(
439
466
  queryset=NameServer.objects.all(),
440
467
  required=False,
468
+ null_option=_("None"),
441
469
  label=_("Nameservers"),
442
470
  )
443
471
  active = forms.NullBooleanField(
@@ -475,35 +503,67 @@ class ZoneFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
475
503
  rfc2317_parent_zone_id = DynamicModelMultipleChoiceField(
476
504
  queryset=Zone.objects.all(),
477
505
  required=False,
506
+ null_option=_("None"),
478
507
  label=_("Parent Zone"),
479
508
  )
509
+ dnssec_policy_id = DynamicModelMultipleChoiceField(
510
+ queryset=DNSSECPolicy.objects.all(),
511
+ required=False,
512
+ null_option=_("None"),
513
+ label=_("DNSSEC Policy"),
514
+ )
515
+ inline_signing = forms.NullBooleanField(
516
+ required=False,
517
+ widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES),
518
+ label=_("Use Inline Signing"),
519
+ )
480
520
  registrar_id = DynamicModelMultipleChoiceField(
481
521
  queryset=Registrar.objects.all(),
482
522
  required=False,
523
+ null_option=_("None"),
483
524
  label=_("Registrar"),
484
525
  )
485
526
  registry_domain_id = forms.CharField(
486
527
  required=False,
487
528
  label=_("Registry Domain ID"),
488
529
  )
530
+ expiration_date_after = forms.DateField(
531
+ required=False,
532
+ label=_("Expiration Date after"),
533
+ widget=DatePicker,
534
+ )
535
+ expiration_date_before = forms.DateField(
536
+ required=False,
537
+ label=_("Expiration Date before"),
538
+ widget=DatePicker,
539
+ )
540
+ domain_status = forms.MultipleChoiceField(
541
+ choices=ZoneEPPStatusChoices,
542
+ required=False,
543
+ label=_("Domain Status"),
544
+ )
489
545
  registrant_id = DynamicModelMultipleChoiceField(
490
546
  queryset=RegistrationContact.objects.all(),
491
547
  required=False,
548
+ null_option=_("None"),
492
549
  label=_("Registrant"),
493
550
  )
494
551
  admin_c_id = DynamicModelMultipleChoiceField(
495
552
  queryset=RegistrationContact.objects.all(),
496
553
  required=False,
554
+ null_option=_("None"),
497
555
  label=_("Administrative Contact"),
498
556
  )
499
557
  tech_c_id = DynamicModelMultipleChoiceField(
500
558
  queryset=RegistrationContact.objects.all(),
501
559
  required=False,
560
+ null_option=_("None"),
502
561
  label=_("Technical Contact"),
503
562
  )
504
563
  billing_c_id = DynamicModelMultipleChoiceField(
505
564
  queryset=RegistrationContact.objects.all(),
506
565
  required=False,
566
+ null_option=_("None"),
507
567
  label=_("Billing Contact"),
508
568
  )
509
569
  tag = TagFilterField(Zone)
@@ -530,11 +590,11 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
530
590
  required=False,
531
591
  label=_("Nameservers"),
532
592
  )
533
- default_ttl = forms.IntegerField(
593
+ default_ttl = TimePeriodField(
534
594
  required=False,
535
595
  label=_("Default TTL"),
536
596
  )
537
- soa_ttl = forms.IntegerField(
597
+ soa_ttl = TimePeriodField(
538
598
  required=False,
539
599
  help_text=_("TTL for the SOA record of the zone"),
540
600
  label=_("SOA TTL"),
@@ -562,22 +622,22 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
562
622
  required=False,
563
623
  label=_("SOA Serial"),
564
624
  )
565
- soa_refresh = forms.IntegerField(
625
+ soa_refresh = TimePeriodField(
566
626
  required=False,
567
627
  help_text=_("Refresh interval for secondary nameservers"),
568
628
  label=_("SOA Refresh"),
569
629
  )
570
- soa_retry = forms.IntegerField(
630
+ soa_retry = TimePeriodField(
571
631
  required=False,
572
632
  help_text=_("Retry interval for secondary nameservers"),
573
633
  label=_("SOA Retry"),
574
634
  )
575
- soa_expire = forms.IntegerField(
635
+ soa_expire = TimePeriodField(
576
636
  required=False,
577
637
  help_text=_("Expire time after which the zone is considered unavailable"),
578
638
  label=_("SOA Expire"),
579
639
  )
580
- soa_minimum = forms.IntegerField(
640
+ soa_minimum = TimePeriodField(
581
641
  required=False,
582
642
  help_text=_("Minimum TTL for negative results, e.g. NXRRSET, NXDOMAIN"),
583
643
  label=_("SOA Minimum TTL"),
@@ -590,10 +650,23 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
590
650
  rfc2317_parent_managed = forms.BooleanField(
591
651
  required=False,
592
652
  help_text=_(
593
- "IPv4 reverse zone for deletgating the RFC2317 PTR records is managed in NetBox DNS"
653
+ "IPv4 reverse zone for delegating the RFC2317 PTR records is managed in NetBox DNS"
594
654
  ),
595
655
  label=_("RFC2317 Parent Managed"),
596
656
  )
657
+ dnssec_policy = CSVModelChoiceField(
658
+ queryset=DNSSECPolicy.objects.all(),
659
+ required=False,
660
+ to_field_name="name",
661
+ error_messages={
662
+ "invalid_choice": _("DNSSEC policy %(value)s not found"),
663
+ },
664
+ label=_("DNSSEC Policy"),
665
+ )
666
+ inline_signing = forms.BooleanField(
667
+ required=False,
668
+ label=_("Use Inline Signing"),
669
+ )
597
670
  registrar = CSVModelChoiceField(
598
671
  queryset=Registrar.objects.all(),
599
672
  required=False,
@@ -607,6 +680,11 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
607
680
  required=False,
608
681
  label=_("Registry Domain ID"),
609
682
  )
683
+ domain_status = CSVChoiceField(
684
+ choices=ZoneEPPStatusChoices,
685
+ required=False,
686
+ label=_("Domain Status"),
687
+ )
610
688
  registrant = CSVModelChoiceField(
611
689
  queryset=RegistrationContact.objects.all(),
612
690
  required=False,
@@ -676,10 +754,14 @@ class ZoneImportForm(ZoneTemplateUpdateMixin, NetBoxModelImportForm):
676
754
  "soa_retry",
677
755
  "soa_expire",
678
756
  "soa_minimum",
757
+ "dnssec_policy",
758
+ "inline_signing",
679
759
  "rfc2317_prefix",
680
760
  "rfc2317_parent_managed",
681
761
  "registrar",
682
762
  "registry_domain_id",
763
+ "expiration_date",
764
+ "domain_status",
683
765
  "registrant",
684
766
  "admin_c",
685
767
  "tech_c",
@@ -726,7 +808,7 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
726
808
  required=False,
727
809
  label=_("Nameservers"),
728
810
  )
729
- default_ttl = forms.IntegerField(
811
+ default_ttl = TimePeriodField(
730
812
  required=False,
731
813
  validators=[MinValueValidator(1)],
732
814
  label=_("Default TTL"),
@@ -736,7 +818,7 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
736
818
  required=False,
737
819
  label=_("Description"),
738
820
  )
739
- soa_ttl = forms.IntegerField(
821
+ soa_ttl = TimePeriodField(
740
822
  required=False,
741
823
  validators=[MinValueValidator(1)],
742
824
  label=_("SOA TTL"),
@@ -760,22 +842,22 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
760
842
  validators=[MinValueValidator(1), MaxValueValidator(4294967295)],
761
843
  label=_("SOA Serial"),
762
844
  )
763
- soa_refresh = forms.IntegerField(
845
+ soa_refresh = TimePeriodField(
764
846
  required=False,
765
847
  validators=[MinValueValidator(1)],
766
848
  label=_("SOA Refresh"),
767
849
  )
768
- soa_retry = forms.IntegerField(
850
+ soa_retry = TimePeriodField(
769
851
  required=False,
770
852
  validators=[MinValueValidator(1)],
771
853
  label=_("SOA Retry"),
772
854
  )
773
- soa_expire = forms.IntegerField(
855
+ soa_expire = TimePeriodField(
774
856
  required=False,
775
857
  validators=[MinValueValidator(1)],
776
858
  label=_("SOA Expire"),
777
859
  )
778
- soa_minimum = forms.IntegerField(
860
+ soa_minimum = TimePeriodField(
779
861
  required=False,
780
862
  validators=[MinValueValidator(1)],
781
863
  label=_("SOA Minimum TTL"),
@@ -790,10 +872,20 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
790
872
  required=False,
791
873
  widget=BulkEditNullBooleanSelect(),
792
874
  help_text=_(
793
- "IPv4 reverse zone for deletgating the RFC2317 PTR records is managed in NetBox DNS"
875
+ "IPv4 reverse zone for delegating the RFC2317 PTR records is managed in NetBox DNS"
794
876
  ),
795
877
  label=_("RFC2317 Parent Managed"),
796
878
  )
879
+ dnssec_policy = DynamicModelChoiceField(
880
+ queryset=DNSSECPolicy.objects.all(),
881
+ required=False,
882
+ label=_("DNSSEC Policy"),
883
+ )
884
+ inline_signing = forms.NullBooleanField(
885
+ required=False,
886
+ widget=BulkEditNullBooleanSelect(),
887
+ label=_("Use Inline Signing"),
888
+ )
797
889
  registrar = DynamicModelChoiceField(
798
890
  queryset=Registrar.objects.all(),
799
891
  required=False,
@@ -803,6 +895,16 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
803
895
  required=False,
804
896
  label=_("Registry Domain ID"),
805
897
  )
898
+ expiration_date = forms.DateField(
899
+ required=False,
900
+ label=_("Expiration Date"),
901
+ widget=DatePicker,
902
+ )
903
+ domain_status = forms.ChoiceField(
904
+ choices=add_blank_choice(ZoneEPPStatusChoices),
905
+ required=False,
906
+ label=_("Domain Status"),
907
+ )
806
908
  registrant = DynamicModelChoiceField(
807
909
  queryset=RegistrationContact.objects.all(),
808
910
  required=False,
@@ -857,6 +959,11 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
857
959
  "soa_serial",
858
960
  name=_("SOA"),
859
961
  ),
962
+ FieldSet(
963
+ "dnssec_policy",
964
+ "inline_signing",
965
+ name=_("DNSSEC"),
966
+ ),
860
967
  FieldSet(
861
968
  "rfc2317_prefix",
862
969
  "rfc2317_parent_managed",
@@ -865,6 +972,8 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
865
972
  FieldSet(
866
973
  "registrar",
867
974
  "registry_domain_id",
975
+ "expiration_date",
976
+ "domain_status",
868
977
  "registrant",
869
978
  "admin_c",
870
979
  "tech_c",
@@ -879,6 +988,8 @@ class ZoneBulkEditForm(NetBoxModelBulkEditForm):
879
988
  "nameservers",
880
989
  "rfc2317_prefix",
881
990
  "registrar",
991
+ "expiration_date",
992
+ "domain_status",
882
993
  "registry_domain_id",
883
994
  "registrant",
884
995
  "admin_c",
@@ -27,6 +27,7 @@ from netbox_dns.models import (
27
27
  NameServer,
28
28
  Registrar,
29
29
  RegistrationContact,
30
+ DNSSECPolicy,
30
31
  )
31
32
 
32
33
 
@@ -62,6 +63,7 @@ class ZoneTemplateForm(TenancyForm, NetBoxModelForm):
62
63
  FieldSet("name", "description", "nameservers", name=_("Zone Template")),
63
64
  FieldSet("soa_mname", "soa_rname", name=_("SOA")),
64
65
  FieldSet("record_templates", name=_("Record Templates")),
66
+ FieldSet("dnssec_policy", name=_("DNSSEC")),
65
67
  FieldSet(
66
68
  "registrar",
67
69
  "registrant",
@@ -82,6 +84,7 @@ class ZoneTemplateForm(TenancyForm, NetBoxModelForm):
82
84
  "nameservers",
83
85
  "soa_mname",
84
86
  "soa_rname",
87
+ "dnssec_policy",
85
88
  "record_templates",
86
89
  "description",
87
90
  "registrar",
@@ -105,6 +108,7 @@ class ZoneTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
105
108
  FieldSet("name", "nameserver_id", "description", name=_("Attributes")),
106
109
  FieldSet("soa_mname_id", "soa_rname", name=_("SOA")),
107
110
  FieldSet("record_template_id", name=_("Record Templates")),
111
+ FieldSet("dnssec_policy", name=_("DNSSEC")),
108
112
  FieldSet(
109
113
  "registrar_id",
110
114
  "registrant_id",
@@ -123,11 +127,13 @@ class ZoneTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
123
127
  nameserver_id = DynamicModelMultipleChoiceField(
124
128
  queryset=NameServer.objects.all(),
125
129
  required=False,
130
+ null_option=_("None"),
126
131
  label=_("Nameservers"),
127
132
  )
128
133
  soa_mname_id = DynamicModelMultipleChoiceField(
129
134
  queryset=NameServer.objects.all(),
130
135
  required=False,
136
+ null_option=_("None"),
131
137
  label=_("MName"),
132
138
  )
133
139
  soa_rname = forms.CharField(
@@ -137,34 +143,46 @@ class ZoneTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
137
143
  record_template_id = DynamicModelMultipleChoiceField(
138
144
  queryset=RecordTemplate.objects.all(),
139
145
  required=False,
146
+ null_option=_("None"),
140
147
  label=_("Record Templates"),
141
148
  )
142
149
  description = forms.CharField(
143
150
  required=False,
144
151
  )
152
+ dnssec_policy_id = DynamicModelMultipleChoiceField(
153
+ queryset=DNSSECPolicy.objects.all(),
154
+ required=False,
155
+ null_option=_("None"),
156
+ label=_("DNSSEC Policy ID"),
157
+ )
145
158
  registrar_id = DynamicModelMultipleChoiceField(
146
159
  queryset=Registrar.objects.all(),
147
160
  required=False,
161
+ null_option=_("None"),
148
162
  label=_("Registrar"),
149
163
  )
150
164
  registrant_id = DynamicModelMultipleChoiceField(
151
165
  queryset=RegistrationContact.objects.all(),
152
166
  required=False,
167
+ null_option=_("None"),
153
168
  label=_("Registrant"),
154
169
  )
155
170
  admin_c_id = DynamicModelMultipleChoiceField(
156
171
  queryset=RegistrationContact.objects.all(),
157
172
  required=False,
173
+ null_option=_("None"),
158
174
  label=_("Administrative Contact"),
159
175
  )
160
176
  tech_c_id = DynamicModelMultipleChoiceField(
161
177
  queryset=RegistrationContact.objects.all(),
162
178
  required=False,
179
+ null_option=_("None"),
163
180
  label=_("Technical Contact"),
164
181
  )
165
182
  billing_c_id = DynamicModelMultipleChoiceField(
166
183
  queryset=RegistrationContact.objects.all(),
167
184
  required=False,
185
+ null_option=_("None"),
168
186
  label=_("Billing Contact"),
169
187
  )
170
188
  tag = TagFilterField(ZoneTemplate)
@@ -189,6 +207,15 @@ class ZoneTemplateImportForm(NetBoxModelImportForm):
189
207
  required=False,
190
208
  label=_("Record Templates"),
191
209
  )
210
+ dnssec_policy = CSVModelChoiceField(
211
+ queryset=DNSSECPolicy.objects.all(),
212
+ required=False,
213
+ to_field_name="name",
214
+ error_messages={
215
+ "invalid_choice": _("DNSSEC policy %(value)s not found"),
216
+ },
217
+ label=_("DNSSEC Policy"),
218
+ )
192
219
  registrar = CSVModelChoiceField(
193
220
  queryset=Registrar.objects.all(),
194
221
  required=False,
@@ -250,6 +277,7 @@ class ZoneTemplateImportForm(NetBoxModelImportForm):
250
277
  "soa_mname",
251
278
  "soa_rname",
252
279
  "record_templates",
280
+ "dnssec_policy",
253
281
  "description",
254
282
  "registrar",
255
283
  "registrant",
@@ -281,6 +309,11 @@ class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
281
309
  description = forms.CharField(
282
310
  max_length=200, required=False, label=_("Description")
283
311
  )
312
+ dnssec_policy = DynamicModelChoiceField(
313
+ queryset=DNSSECPolicy.objects.all(),
314
+ required=False,
315
+ label=_("DNSSEC Policy"),
316
+ )
284
317
  registrar = DynamicModelChoiceField(
285
318
  queryset=Registrar.objects.all(),
286
319
  required=False,
@@ -334,6 +367,10 @@ class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
334
367
  "record_templates",
335
368
  name=_("Record Templates"),
336
369
  ),
370
+ FieldSet(
371
+ "dnssec_policy",
372
+ name=_("DNSSEC"),
373
+ ),
337
374
  FieldSet(
338
375
  "registrar",
339
376
  "registrant",
@@ -351,6 +388,7 @@ class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
351
388
  "soa_mname",
352
389
  "soa_rname",
353
390
  "record_templates",
391
+ "dnssec_policy",
354
392
  "registrar",
355
393
  "registrant",
356
394
  "admin_c",
@@ -1,10 +1,12 @@
1
1
  from .schema import (
2
- NetBoxDNSViewQuery,
3
2
  NetBoxDNSNameServerQuery,
4
- NetBoxDNSRegistrationContactQuery,
5
- NetBoxDNSRegistrarQuery,
3
+ NetBoxDNSViewQuery,
6
4
  NetBoxDNSZoneQuery,
7
5
  NetBoxDNSRecordQuery,
6
+ NetBoxDNSDNSSECKeyTemplateQuery,
7
+ NetBoxDNSDNSSECPolicyQuery,
8
+ NetBoxDNSRegistrationContactQuery,
9
+ NetBoxDNSRegistrarQuery,
8
10
  NetBoxDNSZoneTemplateQuery,
9
11
  NetBoxDNSRecordTemplateQuery,
10
12
  )
@@ -14,6 +16,8 @@ schema = [
14
16
  NetBoxDNSViewQuery,
15
17
  NetBoxDNSZoneQuery,
16
18
  NetBoxDNSRecordQuery,
19
+ NetBoxDNSDNSSECKeyTemplateQuery,
20
+ NetBoxDNSDNSSECPolicyQuery,
17
21
  NetBoxDNSRegistrationContactQuery,
18
22
  NetBoxDNSRegistrarQuery,
19
23
  NetBoxDNSZoneTemplateQuery,