netbox-plugin-dns 1.2.5__py3-none-any.whl → 1.2.7b2__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 (65) hide show
  1. netbox_dns/__init__.py +15 -1
  2. netbox_dns/api/serializers.py +3 -0
  3. netbox_dns/api/serializers_/dnssec_key_template.py +46 -0
  4. netbox_dns/api/serializers_/dnssec_policy.py +83 -0
  5. netbox_dns/api/serializers_/zone.py +10 -0
  6. netbox_dns/api/serializers_/zone_template.py +13 -4
  7. netbox_dns/api/urls.py +4 -0
  8. netbox_dns/api/views.py +18 -0
  9. netbox_dns/choices/__init__.py +2 -0
  10. netbox_dns/choices/dnssec_key_template.py +63 -0
  11. netbox_dns/choices/dnssec_policy.py +40 -0
  12. netbox_dns/choices/record.py +2 -25
  13. netbox_dns/choices/utilities.py +26 -0
  14. netbox_dns/fields/__init__.py +2 -0
  15. netbox_dns/fields/choice_array.py +20 -0
  16. netbox_dns/fields/timeperiod.py +31 -0
  17. netbox_dns/filtersets/__init__.py +3 -0
  18. netbox_dns/filtersets/dnssec_key_template.py +51 -0
  19. netbox_dns/filtersets/dnssec_policy.py +73 -0
  20. netbox_dns/filtersets/zone.py +23 -4
  21. netbox_dns/filtersets/zone_template.py +11 -0
  22. netbox_dns/forms/__init__.py +2 -0
  23. netbox_dns/forms/dnssec_key_template.py +188 -0
  24. netbox_dns/forms/dnssec_policy.py +563 -0
  25. netbox_dns/forms/record.py +12 -6
  26. netbox_dns/forms/record_template.py +9 -3
  27. netbox_dns/forms/zone.py +70 -22
  28. netbox_dns/forms/zone_template.py +29 -0
  29. netbox_dns/graphql/__init__.py +7 -3
  30. netbox_dns/graphql/filters.py +16 -0
  31. netbox_dns/graphql/schema.py +20 -0
  32. netbox_dns/graphql/types.py +67 -3
  33. netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
  34. netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
  35. netbox_dns/migrations/0015_dnssec.py +168 -0
  36. netbox_dns/migrations/0016_dnssec_policy_status.py +18 -0
  37. netbox_dns/migrations/0017_dnssec_policy_zone_zone_template.py +41 -0
  38. netbox_dns/models/__init__.py +2 -0
  39. netbox_dns/models/dnssec_key_template.py +114 -0
  40. netbox_dns/models/dnssec_policy.py +201 -0
  41. netbox_dns/models/zone.py +29 -16
  42. netbox_dns/models/zone_template.py +16 -6
  43. netbox_dns/navigation.py +49 -0
  44. netbox_dns/signals/dnssec.py +32 -0
  45. netbox_dns/tables/__init__.py +2 -0
  46. netbox_dns/tables/dnssec_key_template.py +48 -0
  47. netbox_dns/tables/dnssec_policy.py +131 -0
  48. netbox_dns/tables/zone.py +17 -1
  49. netbox_dns/tables/zone_template.py +4 -0
  50. netbox_dns/templates/netbox_dns/dnsseckeytemplate.html +70 -0
  51. netbox_dns/templates/netbox_dns/dnssecpolicy.html +155 -0
  52. netbox_dns/templates/netbox_dns/zone.html +16 -0
  53. netbox_dns/templates/netbox_dns/zonetemplate/child.html +46 -0
  54. netbox_dns/templates/netbox_dns/zonetemplate.html +12 -0
  55. netbox_dns/urls.py +16 -0
  56. netbox_dns/validators/__init__.py +1 -0
  57. netbox_dns/validators/dnssec.py +146 -0
  58. netbox_dns/views/__init__.py +2 -0
  59. netbox_dns/views/dnssec_key_template.py +87 -0
  60. netbox_dns/views/dnssec_policy.py +153 -0
  61. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7b2.dist-info}/METADATA +2 -2
  62. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7b2.dist-info}/RECORD +65 -39
  63. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7b2.dist-info}/WHEEL +1 -1
  64. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7b2.dist-info}/LICENSE +0 -0
  65. {netbox_plugin_dns-1.2.5.dist-info → netbox_plugin_dns-1.2.7b2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,168 @@
1
+ # Generated by Django 5.1.6 on 2025-03-04 12:09
2
+
3
+ import django.db.models.deletion
4
+ import netbox_dns.fields.choice_array
5
+ import taggit.managers
6
+ import utilities.json
7
+ from django.db import migrations, models
8
+
9
+
10
+ class Migration(migrations.Migration):
11
+
12
+ dependencies = [
13
+ ("extras", "0122_charfield_null_choices"),
14
+ ("netbox_dns", "0014_alter_unique_constraints_lowercase"),
15
+ ("tenancy", "0017_natural_ordering"),
16
+ ]
17
+
18
+ operations = [
19
+ migrations.CreateModel(
20
+ name="DNSSECKeyTemplate",
21
+ fields=[
22
+ (
23
+ "id",
24
+ models.BigAutoField(
25
+ auto_created=True, primary_key=True, serialize=False
26
+ ),
27
+ ),
28
+ ("created", models.DateTimeField(auto_now_add=True, null=True)),
29
+ ("last_updated", models.DateTimeField(auto_now=True, null=True)),
30
+ (
31
+ "custom_field_data",
32
+ models.JSONField(
33
+ blank=True,
34
+ default=dict,
35
+ encoder=utilities.json.CustomFieldJSONEncoder,
36
+ ),
37
+ ),
38
+ ("name", models.CharField(max_length=255)),
39
+ ("description", models.CharField(blank=True, max_length=200)),
40
+ ("type", models.CharField(max_length=3)),
41
+ ("lifetime", models.PositiveIntegerField(blank=True, null=True)),
42
+ ("algorithm", models.CharField()),
43
+ ("key_size", models.PositiveIntegerField(blank=True, null=True)),
44
+ (
45
+ "tags",
46
+ taggit.managers.TaggableManager(
47
+ through="extras.TaggedItem", to="extras.Tag"
48
+ ),
49
+ ),
50
+ (
51
+ "tenant",
52
+ models.ForeignKey(
53
+ blank=True,
54
+ null=True,
55
+ on_delete=django.db.models.deletion.PROTECT,
56
+ related_name="netbox_dns_dnssec_key_templates",
57
+ to="tenancy.tenant",
58
+ ),
59
+ ),
60
+ ],
61
+ options={
62
+ "verbose_name": "DNSSEC Key Template",
63
+ "verbose_name_plural": "DNSSEC Key Templates",
64
+ "ordering": ("name",),
65
+ "unique_together": {("name", "type")},
66
+ },
67
+ ),
68
+ migrations.CreateModel(
69
+ name="DNSSECPolicy",
70
+ fields=[
71
+ (
72
+ "id",
73
+ models.BigAutoField(
74
+ auto_created=True, primary_key=True, serialize=False
75
+ ),
76
+ ),
77
+ ("created", models.DateTimeField(auto_now_add=True, null=True)),
78
+ ("last_updated", models.DateTimeField(auto_now=True, null=True)),
79
+ (
80
+ "custom_field_data",
81
+ models.JSONField(
82
+ blank=True,
83
+ default=dict,
84
+ encoder=utilities.json.CustomFieldJSONEncoder,
85
+ ),
86
+ ),
87
+ ("name", models.CharField(max_length=255, unique=True)),
88
+ ("description", models.CharField(blank=True, max_length=200)),
89
+ ("dnskey_ttl", models.PositiveIntegerField(blank=True, null=True)),
90
+ ("purge_keys", models.PositiveIntegerField(blank=True, null=True)),
91
+ ("publish_safety", models.PositiveIntegerField(blank=True, null=True)),
92
+ ("retire_safety", models.PositiveIntegerField(blank=True, null=True)),
93
+ (
94
+ "signatures_jitter",
95
+ models.PositiveIntegerField(blank=True, null=True),
96
+ ),
97
+ (
98
+ "signatures_refresh",
99
+ models.PositiveIntegerField(blank=True, null=True),
100
+ ),
101
+ (
102
+ "signatures_validity",
103
+ models.PositiveIntegerField(blank=True, null=True),
104
+ ),
105
+ (
106
+ "signatures_validity_dnskey",
107
+ models.PositiveIntegerField(blank=True, null=True),
108
+ ),
109
+ ("max_zone_ttl", models.PositiveIntegerField(blank=True, null=True)),
110
+ (
111
+ "zone_propagation_delay",
112
+ models.PositiveIntegerField(blank=True, null=True),
113
+ ),
114
+ ("create_cdnskey", models.BooleanField(default=True)),
115
+ (
116
+ "cds_digest_types",
117
+ netbox_dns.fields.choice_array.ChoiceArrayField(
118
+ base_field=models.CharField(),
119
+ blank=True,
120
+ default=list,
121
+ null=True,
122
+ size=None,
123
+ ),
124
+ ),
125
+ ("parent_ds_ttl", models.PositiveIntegerField(blank=True, null=True)),
126
+ (
127
+ "parent_propagation_delay",
128
+ models.PositiveIntegerField(blank=True, null=True),
129
+ ),
130
+ ("use_nsec3", models.BooleanField(default=True)),
131
+ (
132
+ "nsec3_iterations",
133
+ models.PositiveIntegerField(blank=True, null=True),
134
+ ),
135
+ ("nsec3_opt_out", models.BooleanField(default=False)),
136
+ ("nsec3_salt_size", models.PositiveIntegerField(blank=True, null=True)),
137
+ (
138
+ "key_templates",
139
+ models.ManyToManyField(
140
+ blank=True,
141
+ related_name="policies",
142
+ to="netbox_dns.dnsseckeytemplate",
143
+ ),
144
+ ),
145
+ (
146
+ "tags",
147
+ taggit.managers.TaggableManager(
148
+ through="extras.TaggedItem", to="extras.Tag"
149
+ ),
150
+ ),
151
+ (
152
+ "tenant",
153
+ models.ForeignKey(
154
+ blank=True,
155
+ null=True,
156
+ on_delete=django.db.models.deletion.PROTECT,
157
+ related_name="netbox_dns_dnssec_policy",
158
+ to="tenancy.tenant",
159
+ ),
160
+ ),
161
+ ],
162
+ options={
163
+ "verbose_name": "DNSSEC Policy",
164
+ "verbose_name_plural": "DNSSEC Policies",
165
+ "ordering": ("name",),
166
+ },
167
+ ),
168
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.1.7 on 2025-03-09 18:23
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0015_dnssec"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="dnssecpolicy",
15
+ name="status",
16
+ field=models.CharField(default="active"),
17
+ ),
18
+ ]
@@ -0,0 +1,41 @@
1
+ # Generated by Django 5.1.6 on 2025-03-10 15:40
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0016_dnssec_policy_status"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="zone",
16
+ name="dnssec_policy",
17
+ field=models.ForeignKey(
18
+ blank=True,
19
+ null=True,
20
+ on_delete=django.db.models.deletion.PROTECT,
21
+ related_name="zones",
22
+ to="netbox_dns.dnssecpolicy",
23
+ ),
24
+ ),
25
+ migrations.AddField(
26
+ model_name="zone",
27
+ name="inline_signing",
28
+ field=models.BooleanField(default=True),
29
+ ),
30
+ migrations.AddField(
31
+ model_name="zonetemplate",
32
+ name="dnssec_policy",
33
+ field=models.ForeignKey(
34
+ blank=True,
35
+ null=True,
36
+ on_delete=django.db.models.deletion.SET_NULL,
37
+ related_name="zone_templates",
38
+ to="netbox_dns.dnssecpolicy",
39
+ ),
40
+ ),
41
+ ]
@@ -6,3 +6,5 @@ from .registration_contact import *
6
6
  from .registrar import *
7
7
  from .zone_template import *
8
8
  from .record_template import *
9
+ from .dnssec_key_template import *
10
+ from .dnssec_policy import *
@@ -0,0 +1,114 @@
1
+ from django.db import models
2
+ from django.urls import reverse
3
+ from django.utils.translation import gettext_lazy as _
4
+
5
+ from netbox.models import NetBoxModel
6
+ from netbox.search import SearchIndex, register_search
7
+ from netbox.models.features import ContactsMixin
8
+
9
+ from netbox_dns.choices import (
10
+ DNSSECKeyTemplateTypeChoices,
11
+ DNSSECKeyTemplateAlgorithmChoices,
12
+ DNSSECKeyTemplateKeySizeChoices,
13
+ )
14
+ from netbox_dns.validators import validate_key_template
15
+
16
+
17
+ __all__ = (
18
+ "DNSSECKeyTemplate",
19
+ "DNSSECKeyTemplateIndex",
20
+ )
21
+
22
+
23
+ class DNSSECKeyTemplate(ContactsMixin, NetBoxModel):
24
+ name = models.CharField(
25
+ verbose_name=_("Name"),
26
+ max_length=255,
27
+ )
28
+ description = models.CharField(
29
+ verbose_name=_("Description"),
30
+ max_length=200,
31
+ blank=True,
32
+ )
33
+
34
+ type = models.CharField(
35
+ verbose_name=_("Type"),
36
+ choices=DNSSECKeyTemplateTypeChoices,
37
+ max_length=3,
38
+ blank=False,
39
+ null=False,
40
+ )
41
+ lifetime = models.PositiveIntegerField(
42
+ verbose_name=_("Lifetime"),
43
+ blank=True,
44
+ null=True,
45
+ )
46
+ algorithm = models.CharField(
47
+ verbose_name=_("Algorithm"),
48
+ choices=DNSSECKeyTemplateAlgorithmChoices,
49
+ blank=False,
50
+ null=False,
51
+ )
52
+ key_size = models.PositiveIntegerField(
53
+ verbose_name=_("Key Size"),
54
+ choices=DNSSECKeyTemplateKeySizeChoices,
55
+ blank=True,
56
+ null=True,
57
+ )
58
+
59
+ tenant = models.ForeignKey(
60
+ verbose_name=_("Tenant"),
61
+ to="tenancy.Tenant",
62
+ on_delete=models.PROTECT,
63
+ related_name="netbox_dns_dnssec_key_templates",
64
+ blank=True,
65
+ null=True,
66
+ )
67
+
68
+ clone_fields = (
69
+ "description",
70
+ "type",
71
+ "lifetime",
72
+ "algorithm",
73
+ "key_size",
74
+ "tenant",
75
+ )
76
+
77
+ class Meta:
78
+ verbose_name = _("DNSSEC Key Template")
79
+ verbose_name_plural = _("DNSSEC Key Templates")
80
+ unique_together = (
81
+ "name",
82
+ "type",
83
+ )
84
+
85
+ ordering = ("name",)
86
+
87
+ def __str__(self):
88
+ return f"{str(self.name)} [{self.type}]"
89
+
90
+ # TODO: Remove in version 1.3.0 (NetBox #18555)
91
+ def get_absolute_url(self):
92
+ return reverse("plugins:netbox_dns:dnsseckeytemplate", kwargs={"pk": self.pk})
93
+
94
+ def get_type_color(self):
95
+ return DNSSECKeyTemplateTypeChoices.colors.get(self.type)
96
+
97
+ def clean(self, *args, **kwargs):
98
+ super().clean(*args, **kwargs)
99
+
100
+ validate_key_template(self)
101
+
102
+ def save(self, *args, **kwargs):
103
+ validate_key_template(self)
104
+
105
+ super().save(*args, **kwargs)
106
+
107
+
108
+ @register_search
109
+ class DNSSECKeyTemplateIndex(SearchIndex):
110
+ model = DNSSECKeyTemplate
111
+ fields = (
112
+ ("name", 100),
113
+ ("description", 500),
114
+ )
@@ -0,0 +1,201 @@
1
+ from django.db import models
2
+ from django.urls import reverse
3
+ from django.utils.translation import gettext_lazy as _
4
+
5
+ from netbox.models import NetBoxModel
6
+ from netbox.search import SearchIndex, register_search
7
+ from netbox.models.features import ContactsMixin
8
+ from netbox.plugins.utils import get_plugin_config
9
+
10
+ from netbox_dns.choices import DNSSECPolicyDigestChoices, DNSSECPolicyStatusChoices
11
+ from netbox_dns.fields import ChoiceArrayField
12
+
13
+
14
+ __all__ = (
15
+ "DNSSECPolicy",
16
+ "DNSSECPolicyIndex",
17
+ )
18
+
19
+
20
+ class DNSSECPolicy(ContactsMixin, NetBoxModel):
21
+ name = models.CharField(
22
+ verbose_name=_("Name"),
23
+ max_length=255,
24
+ unique=True,
25
+ )
26
+ description = models.CharField(
27
+ verbose_name=_("Description"),
28
+ max_length=200,
29
+ blank=True,
30
+ )
31
+ status = models.CharField(
32
+ verbose_name=_("Status"),
33
+ choices=DNSSECPolicyStatusChoices,
34
+ default=DNSSECPolicyStatusChoices.STATUS_ACTIVE,
35
+ blank=False,
36
+ null=False,
37
+ )
38
+
39
+ key_templates = models.ManyToManyField(
40
+ verbose_name=_("Key Templates"),
41
+ to="DNSSECKeyTemplate",
42
+ related_name="policies",
43
+ blank=True,
44
+ )
45
+ dnskey_ttl = models.PositiveIntegerField(
46
+ verbose_name=_("DNSKEY TTL"),
47
+ blank=True,
48
+ null=True,
49
+ )
50
+ purge_keys = models.PositiveIntegerField(
51
+ verbose_name=_("Purge Keys"),
52
+ blank=True,
53
+ null=True,
54
+ )
55
+ publish_safety = models.PositiveIntegerField(
56
+ verbose_name=_("Publish Safety"),
57
+ blank=True,
58
+ null=True,
59
+ )
60
+ retire_safety = models.PositiveIntegerField(
61
+ verbose_name=_("Retire Safety"),
62
+ blank=True,
63
+ null=True,
64
+ )
65
+ signatures_jitter = models.PositiveIntegerField(
66
+ verbose_name=_("Signatures Jitter"),
67
+ blank=True,
68
+ null=True,
69
+ )
70
+ signatures_refresh = models.PositiveIntegerField(
71
+ verbose_name=_("Signatures Refresh"),
72
+ blank=True,
73
+ null=True,
74
+ )
75
+ signatures_validity = models.PositiveIntegerField(
76
+ verbose_name=_("Signatures Validity"),
77
+ blank=True,
78
+ null=True,
79
+ )
80
+ signatures_validity_dnskey = models.PositiveIntegerField(
81
+ verbose_name=_("Signatures Validity for DNSKEY"),
82
+ blank=True,
83
+ null=True,
84
+ )
85
+ max_zone_ttl = models.PositiveIntegerField(
86
+ verbose_name=_("Max Zone TTL"),
87
+ blank=True,
88
+ null=True,
89
+ )
90
+ zone_propagation_delay = models.PositiveIntegerField(
91
+ verbose_name=_("Zone Propagation Delay"),
92
+ blank=True,
93
+ null=True,
94
+ )
95
+
96
+ create_cdnskey = models.BooleanField(
97
+ verbose_name=_("Create CDNSKEY"),
98
+ null=False,
99
+ default=True,
100
+ )
101
+ cds_digest_types = ChoiceArrayField(
102
+ base_field=models.CharField(
103
+ choices=DNSSECPolicyDigestChoices,
104
+ ),
105
+ verbose_name=_("CDS Digest Types"),
106
+ blank=True,
107
+ null=True,
108
+ default=list,
109
+ )
110
+ parent_ds_ttl = models.PositiveIntegerField(
111
+ verbose_name=_("Parent DS TTL"),
112
+ blank=True,
113
+ null=True,
114
+ )
115
+ parent_propagation_delay = models.PositiveIntegerField(
116
+ verbose_name=_("Parent Propagation Delay"),
117
+ blank=True,
118
+ null=True,
119
+ )
120
+
121
+ use_nsec3 = models.BooleanField(
122
+ verbose_name=_("Use NSEC3"),
123
+ null=False,
124
+ default=True,
125
+ )
126
+ nsec3_iterations = models.PositiveIntegerField(
127
+ verbose_name=_("NSEC3 Iterations"),
128
+ blank=True,
129
+ null=True,
130
+ )
131
+ nsec3_opt_out = models.BooleanField(
132
+ verbose_name=_("NSEC3 Opt-Out"),
133
+ blank=False,
134
+ null=False,
135
+ default=False,
136
+ )
137
+ nsec3_salt_size = models.PositiveIntegerField(
138
+ verbose_name=_("NSEC3 Salt Size"),
139
+ blank=True,
140
+ null=True,
141
+ )
142
+
143
+ tenant = models.ForeignKey(
144
+ verbose_name=_("Tenant"),
145
+ to="tenancy.Tenant",
146
+ on_delete=models.PROTECT,
147
+ related_name="netbox_dns_dnssec_policy",
148
+ blank=True,
149
+ null=True,
150
+ )
151
+
152
+ clone_fields = (
153
+ "name",
154
+ "key_templates",
155
+ "description",
156
+ "tenant",
157
+ )
158
+
159
+ class Meta:
160
+ verbose_name = _("DNSSEC Policy")
161
+ verbose_name_plural = _("DNSSEC Policies")
162
+
163
+ ordering = ("name",)
164
+
165
+ def __str__(self):
166
+ return str(self.name)
167
+
168
+ def get_status_color(self):
169
+ return DNSSECPolicyStatusChoices.colors.get(self.status)
170
+
171
+ # TODO: Remove in version 1.3.0 (NetBox #18555)
172
+ def get_absolute_url(self):
173
+ return reverse("plugins:netbox_dns:dnssecpolicy", kwargs={"pk": self.pk})
174
+
175
+ @property
176
+ def purge_keys_value(self):
177
+ return self.purge_keys if self.purge_keys is not None else 776000
178
+
179
+ @property
180
+ def publish_safety_value(self):
181
+ return self.publish_safety if self.publish_safety is not None else 3600
182
+
183
+ def get_effective_value(self, attribute):
184
+ default_value = get_plugin_config("netbox_dns", f"dnssec_{attribute}", None)
185
+
186
+ if not hasattr(self, attribute):
187
+ raise AttributeError(f"DNSSECPolicy does not have attribute {attribute}")
188
+
189
+ if (value := getattr(self, attribute)) is None:
190
+ return default_value
191
+
192
+ return value
193
+
194
+
195
+ @register_search
196
+ class DNSSECPolicyIndex(SearchIndex):
197
+ model = DNSSECPolicy
198
+ fields = (
199
+ ("name", 100),
200
+ ("description", 500),
201
+ )
netbox_dns/models/zone.py CHANGED
@@ -97,6 +97,11 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
97
97
  max_length=255,
98
98
  db_collation="natural_sort",
99
99
  )
100
+ description = models.CharField(
101
+ verbose_name=_("Description"),
102
+ max_length=200,
103
+ blank=True,
104
+ )
100
105
  status = models.CharField(
101
106
  verbose_name=_("Status"),
102
107
  max_length=50,
@@ -170,25 +175,19 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
170
175
  help_text=_("Automatically generate the SOA serial number"),
171
176
  default=True,
172
177
  )
173
- description = models.CharField(
174
- verbose_name=_("Description"),
175
- max_length=200,
176
- blank=True,
177
- )
178
- arpa_network = NetworkField(
179
- verbose_name=_("ARPA Network"),
180
- help_text=_("Network related to a reverse lookup zone (.arpa)"),
181
- blank=True,
182
- null=True,
183
- )
184
- tenant = models.ForeignKey(
185
- verbose_name=_("Tenant"),
186
- to="tenancy.Tenant",
178
+ dnssec_policy = models.ForeignKey(
179
+ verbose_name=_("DNSSEC Policy"),
180
+ to="DNSSECPolicy",
187
181
  on_delete=models.PROTECT,
188
- related_name="netbox_dns_zones",
182
+ related_name="zones",
189
183
  blank=True,
190
184
  null=True,
191
185
  )
186
+ inline_signing = models.BooleanField(
187
+ verbose_name=_("Inline Signing"),
188
+ help_text=_("Use inline signing for DNSSEC"),
189
+ default=True,
190
+ )
192
191
  registrar = models.ForeignKey(
193
192
  verbose_name=_("Registrar"),
194
193
  to="Registrar",
@@ -255,12 +254,27 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
255
254
  blank=True,
256
255
  null=True,
257
256
  )
257
+ arpa_network = NetworkField(
258
+ verbose_name=_("ARPA Network"),
259
+ help_text=_("Network related to a reverse lookup zone (.arpa)"),
260
+ blank=True,
261
+ null=True,
262
+ )
263
+ tenant = models.ForeignKey(
264
+ verbose_name=_("Tenant"),
265
+ to="tenancy.Tenant",
266
+ on_delete=models.PROTECT,
267
+ related_name="netbox_dns_zones",
268
+ blank=True,
269
+ null=True,
270
+ )
258
271
 
259
272
  objects = ZoneManager()
260
273
 
261
274
  clone_fields = (
262
275
  "view",
263
276
  "name",
277
+ "description",
264
278
  "status",
265
279
  "nameservers",
266
280
  "default_ttl",
@@ -271,7 +285,6 @@ class Zone(ObjectModificationMixin, ContactsMixin, NetBoxModel):
271
285
  "soa_retry",
272
286
  "soa_expire",
273
287
  "soa_minimum",
274
- "description",
275
288
  "tenant",
276
289
  )
277
290
 
@@ -55,11 +55,11 @@ class ZoneTemplate(NetBoxModel):
55
55
  related_name="zone_templates",
56
56
  blank=True,
57
57
  )
58
- tenant = models.ForeignKey(
59
- verbose_name=_("Tenant"),
60
- to="tenancy.Tenant",
58
+ dnssec_policy = models.ForeignKey(
59
+ verbose_name=_("DNSSEC Policy"),
60
+ to="DNSSECPolicy",
61
61
  on_delete=models.SET_NULL,
62
- related_name="+",
62
+ related_name="zone_templates",
63
63
  blank=True,
64
64
  null=True,
65
65
  )
@@ -103,28 +103,38 @@ class ZoneTemplate(NetBoxModel):
103
103
  blank=True,
104
104
  null=True,
105
105
  )
106
+ tenant = models.ForeignKey(
107
+ verbose_name=_("Tenant"),
108
+ to="tenancy.Tenant",
109
+ on_delete=models.SET_NULL,
110
+ related_name="+",
111
+ blank=True,
112
+ null=True,
113
+ )
106
114
 
107
115
  clone_fields = (
108
116
  "description",
109
117
  "nameservers",
110
118
  "record_templates",
111
- "tenant",
119
+ "dnssec_policy",
112
120
  "registrar",
113
121
  "registrant",
114
122
  "admin_c",
115
123
  "tech_c",
116
124
  "billing_c",
125
+ "tenant",
117
126
  )
118
127
 
119
128
  template_fields = (
120
129
  "soa_mname",
121
130
  "soa_rname",
122
- "tenant",
131
+ "dnssec_policy",
123
132
  "registrar",
124
133
  "registrant",
125
134
  "admin_c",
126
135
  "tech_c",
127
136
  "billing_c",
137
+ "tenant",
128
138
  )
129
139
 
130
140
  class Meta: