netbox-plugin-dns 0.21.4__py3-none-any.whl → 1.4.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.
Files changed (232) hide show
  1. netbox_dns/__init__.py +106 -41
  2. netbox_dns/api/field_serializers.py +25 -0
  3. netbox_dns/api/nested_serializers.py +95 -52
  4. netbox_dns/api/serializers.py +14 -296
  5. netbox_dns/api/serializers_/__init__.py +0 -0
  6. netbox_dns/api/serializers_/dnssec_key_template.py +69 -0
  7. netbox_dns/api/serializers_/dnssec_policy.py +165 -0
  8. netbox_dns/api/serializers_/nameserver.py +56 -0
  9. netbox_dns/api/serializers_/prefix.py +18 -0
  10. netbox_dns/api/serializers_/record.py +105 -0
  11. netbox_dns/api/serializers_/record_template.py +71 -0
  12. netbox_dns/api/serializers_/registrar.py +45 -0
  13. netbox_dns/api/serializers_/registration_contact.py +50 -0
  14. netbox_dns/api/serializers_/view.py +81 -0
  15. netbox_dns/api/serializers_/zone.py +247 -0
  16. netbox_dns/api/serializers_/zone_template.py +157 -0
  17. netbox_dns/api/urls.py +13 -2
  18. netbox_dns/api/views.py +96 -58
  19. netbox_dns/choices/__init__.py +4 -0
  20. netbox_dns/choices/dnssec_key_template.py +67 -0
  21. netbox_dns/choices/dnssec_policy.py +40 -0
  22. netbox_dns/choices/record.py +104 -0
  23. netbox_dns/choices/utilities.py +4 -0
  24. netbox_dns/choices/zone.py +119 -0
  25. netbox_dns/fields/__init__.py +4 -0
  26. netbox_dns/fields/address.py +22 -16
  27. netbox_dns/fields/choice_array.py +33 -0
  28. netbox_dns/fields/ipam.py +15 -0
  29. netbox_dns/fields/network.py +42 -18
  30. netbox_dns/fields/rfc2317.py +97 -0
  31. netbox_dns/fields/timeperiod.py +33 -0
  32. netbox_dns/filters.py +7 -0
  33. netbox_dns/filtersets/__init__.py +12 -0
  34. netbox_dns/filtersets/dnssec_key_template.py +57 -0
  35. netbox_dns/filtersets/dnssec_policy.py +101 -0
  36. netbox_dns/filtersets/nameserver.py +46 -0
  37. netbox_dns/filtersets/record.py +135 -0
  38. netbox_dns/filtersets/record_template.py +59 -0
  39. netbox_dns/{filters → filtersets}/registrar.py +8 -1
  40. netbox_dns/{filters/contact.py → filtersets/registration_contact.py} +9 -3
  41. netbox_dns/filtersets/view.py +45 -0
  42. netbox_dns/filtersets/zone.py +254 -0
  43. netbox_dns/filtersets/zone_template.py +165 -0
  44. netbox_dns/forms/__init__.py +5 -1
  45. netbox_dns/forms/dnssec_key_template.py +250 -0
  46. netbox_dns/forms/dnssec_policy.py +654 -0
  47. netbox_dns/forms/nameserver.py +121 -27
  48. netbox_dns/forms/record.py +215 -104
  49. netbox_dns/forms/record_template.py +285 -0
  50. netbox_dns/forms/registrar.py +108 -31
  51. netbox_dns/forms/registration_contact.py +282 -0
  52. netbox_dns/forms/view.py +331 -20
  53. netbox_dns/forms/zone.py +769 -373
  54. netbox_dns/forms/zone_template.py +463 -0
  55. netbox_dns/graphql/__init__.py +25 -22
  56. netbox_dns/graphql/enums.py +41 -0
  57. netbox_dns/graphql/filter_lookups.py +13 -0
  58. netbox_dns/graphql/filters/__init__.py +12 -0
  59. netbox_dns/graphql/filters/dnssec_key_template.py +63 -0
  60. netbox_dns/graphql/filters/dnssec_policy.py +124 -0
  61. netbox_dns/graphql/filters/nameserver.py +32 -0
  62. netbox_dns/graphql/filters/record.py +89 -0
  63. netbox_dns/graphql/filters/record_template.py +55 -0
  64. netbox_dns/graphql/filters/registrar.py +30 -0
  65. netbox_dns/graphql/filters/registration_contact.py +27 -0
  66. netbox_dns/graphql/filters/view.py +28 -0
  67. netbox_dns/graphql/filters/zone.py +147 -0
  68. netbox_dns/graphql/filters/zone_template.py +97 -0
  69. netbox_dns/graphql/schema.py +89 -7
  70. netbox_dns/graphql/types.py +355 -0
  71. netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
  72. netbox_dns/locale/en/LC_MESSAGES/django.mo +0 -0
  73. netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
  74. netbox_dns/management/commands/cleanup_database.py +175 -156
  75. netbox_dns/management/commands/cleanup_rrset_ttl.py +64 -0
  76. netbox_dns/management/commands/rebuild_dnssync.py +23 -0
  77. netbox_dns/management/commands/setup_dnssync.py +140 -0
  78. netbox_dns/migrations/0001_squashed_netbox_dns_0_15.py +0 -27
  79. netbox_dns/migrations/0001_squashed_netbox_dns_0_22.py +557 -0
  80. netbox_dns/migrations/{0013_add_nameserver_zone_record_description.py → 0002_contact_description_registrar_description.py} +4 -9
  81. netbox_dns/migrations/0003_default_view.py +15 -0
  82. netbox_dns/migrations/0004_create_and_assign_default_view.py +26 -0
  83. netbox_dns/migrations/0005_alter_zone_view_not_null.py +18 -0
  84. netbox_dns/migrations/0006_templating.py +172 -0
  85. netbox_dns/migrations/0007_alter_ordering_options.py +25 -0
  86. netbox_dns/migrations/0008_view_prefixes.py +18 -0
  87. netbox_dns/migrations/0009_rename_contact_registrationcontact.py +36 -0
  88. netbox_dns/migrations/0010_view_ip_address_filter.py +18 -0
  89. netbox_dns/migrations/0011_rename_related_fields.py +63 -0
  90. netbox_dns/migrations/0012_natural_ordering.py +88 -0
  91. netbox_dns/migrations/0013_zonetemplate_soa_mname_zonetemplate_soa_rname.py +30 -0
  92. netbox_dns/migrations/0014_alter_unique_constraints_lowercase.py +42 -0
  93. netbox_dns/migrations/0015_dnssec.py +168 -0
  94. netbox_dns/migrations/{0015_add_record_status.py → 0016_dnssec_policy_status.py} +5 -4
  95. netbox_dns/migrations/0017_dnssec_policy_zone_zone_template.py +41 -0
  96. netbox_dns/migrations/0018_zone_domain_status_zone_expiration_date.py +23 -0
  97. netbox_dns/migrations/0019_dnssecpolicy_parental_agents.py +25 -0
  98. netbox_dns/migrations/0020_netbox_3_4.py +1 -1
  99. netbox_dns/migrations/0020_remove_dnssecpolicy_parental_agents_and_more.py +29 -0
  100. netbox_dns/migrations/0021_alter_record_ptr_record.py +25 -0
  101. netbox_dns/migrations/0021_record_ip_address.py +1 -1
  102. netbox_dns/migrations/0022_alter_record_ipam_ip_address.py +26 -0
  103. netbox_dns/migrations/0023_disable_ptr_false.py +27 -0
  104. netbox_dns/migrations/0024_zonetemplate_parental_agents.py +25 -0
  105. netbox_dns/migrations/0025_remove_zone_inline_signing_and_more.py +22 -0
  106. netbox_dns/migrations/0026_alter_dnssecpolicy_nsec3_opt_out.py +18 -0
  107. netbox_dns/migrations/0026_domain_registration.py +1 -1
  108. netbox_dns/migrations/0027_zone_comments.py +18 -0
  109. netbox_dns/migrations/0028_alter_zone_default_ttl_alter_zone_soa_minimum_and_more.py +54 -0
  110. netbox_dns/migrations/0028_rfc2317_fields.py +44 -0
  111. netbox_dns/migrations/0029_alter_registrationcontact_street.py +18 -0
  112. netbox_dns/migrations/0029_record_fqdn.py +30 -0
  113. netbox_dns/mixins/__init__.py +1 -0
  114. netbox_dns/mixins/object_modification.py +57 -0
  115. netbox_dns/models/__init__.py +5 -1
  116. netbox_dns/models/dnssec_key_template.py +114 -0
  117. netbox_dns/models/dnssec_policy.py +203 -0
  118. netbox_dns/models/nameserver.py +61 -30
  119. netbox_dns/models/record.py +781 -234
  120. netbox_dns/models/record_template.py +198 -0
  121. netbox_dns/models/registrar.py +34 -15
  122. netbox_dns/models/{contact.py → registration_contact.py} +72 -43
  123. netbox_dns/models/view.py +129 -9
  124. netbox_dns/models/zone.py +806 -242
  125. netbox_dns/models/zone_template.py +209 -0
  126. netbox_dns/navigation.py +176 -76
  127. netbox_dns/signals/__init__.py +0 -0
  128. netbox_dns/signals/dnssec.py +32 -0
  129. netbox_dns/signals/ipam_dnssync.py +216 -0
  130. netbox_dns/tables/__init__.py +5 -1
  131. netbox_dns/tables/dnssec_key_template.py +49 -0
  132. netbox_dns/tables/dnssec_policy.py +140 -0
  133. netbox_dns/tables/ipam_dnssync.py +12 -0
  134. netbox_dns/tables/nameserver.py +14 -17
  135. netbox_dns/tables/record.py +117 -59
  136. netbox_dns/tables/record_template.py +91 -0
  137. netbox_dns/tables/registrar.py +20 -10
  138. netbox_dns/tables/{contact.py → registration_contact.py} +22 -11
  139. netbox_dns/tables/view.py +47 -3
  140. netbox_dns/tables/zone.py +62 -31
  141. netbox_dns/tables/zone_template.py +78 -0
  142. netbox_dns/template_content.py +124 -38
  143. netbox_dns/templates/netbox_dns/dnsseckeytemplate.html +70 -0
  144. netbox_dns/templates/netbox_dns/dnssecpolicy.html +163 -0
  145. netbox_dns/templates/netbox_dns/nameserver.html +31 -28
  146. netbox_dns/templates/netbox_dns/record/managed.html +2 -1
  147. netbox_dns/templates/netbox_dns/record/related.html +17 -6
  148. netbox_dns/templates/netbox_dns/record.html +140 -93
  149. netbox_dns/templates/netbox_dns/recordtemplate.html +96 -0
  150. netbox_dns/templates/netbox_dns/registrar.html +41 -34
  151. netbox_dns/templates/netbox_dns/registrationcontact.html +76 -0
  152. netbox_dns/templates/netbox_dns/view/button.html +10 -0
  153. netbox_dns/templates/netbox_dns/view/prefix.html +44 -0
  154. netbox_dns/templates/netbox_dns/view/related.html +33 -0
  155. netbox_dns/templates/netbox_dns/view.html +62 -18
  156. netbox_dns/templates/netbox_dns/zone/base.html +6 -3
  157. netbox_dns/templates/netbox_dns/zone/child.html +6 -5
  158. netbox_dns/templates/netbox_dns/zone/child_zone.html +18 -0
  159. netbox_dns/templates/netbox_dns/zone/delegation_record.html +18 -0
  160. netbox_dns/templates/netbox_dns/zone/managed_record.html +1 -1
  161. netbox_dns/templates/netbox_dns/zone/record.html +6 -5
  162. netbox_dns/templates/netbox_dns/zone/registration.html +43 -24
  163. netbox_dns/templates/netbox_dns/zone/rfc2317_child_zone.html +18 -0
  164. netbox_dns/templates/netbox_dns/zone.html +178 -119
  165. netbox_dns/templates/netbox_dns/zonetemplate/child.html +46 -0
  166. netbox_dns/templates/netbox_dns/zonetemplate.html +124 -0
  167. netbox_dns/templatetags/netbox_dns.py +10 -0
  168. netbox_dns/urls.py +50 -210
  169. netbox_dns/utilities/__init__.py +3 -0
  170. netbox_dns/{utilities.py → utilities/conversions.py} +55 -7
  171. netbox_dns/utilities/dns.py +11 -0
  172. netbox_dns/utilities/ipam_dnssync.py +370 -0
  173. netbox_dns/validators/__init__.py +4 -0
  174. netbox_dns/validators/dns_name.py +116 -0
  175. netbox_dns/validators/dns_value.py +147 -0
  176. netbox_dns/validators/dnssec.py +148 -0
  177. netbox_dns/validators/rfc2317.py +28 -0
  178. netbox_dns/views/__init__.py +5 -1
  179. netbox_dns/views/dnssec_key_template.py +78 -0
  180. netbox_dns/views/dnssec_policy.py +146 -0
  181. netbox_dns/views/nameserver.py +34 -15
  182. netbox_dns/views/record.py +156 -15
  183. netbox_dns/views/record_template.py +93 -0
  184. netbox_dns/views/registrar.py +32 -13
  185. netbox_dns/views/registration_contact.py +101 -0
  186. netbox_dns/views/view.py +58 -14
  187. netbox_dns/views/zone.py +130 -33
  188. netbox_dns/views/zone_template.py +82 -0
  189. netbox_plugin_dns-1.4.7.dist-info/METADATA +132 -0
  190. netbox_plugin_dns-1.4.7.dist-info/RECORD +201 -0
  191. {netbox_plugin_dns-0.21.4.dist-info → netbox_plugin_dns-1.4.7.dist-info}/WHEEL +2 -1
  192. {netbox_plugin_dns-0.21.4.dist-info → netbox_plugin_dns-1.4.7.dist-info/licenses}/LICENSE +2 -1
  193. netbox_plugin_dns-1.4.7.dist-info/top_level.txt +1 -0
  194. netbox_dns/filters/__init__.py +0 -6
  195. netbox_dns/filters/nameserver.py +0 -18
  196. netbox_dns/filters/record.py +0 -53
  197. netbox_dns/filters/view.py +0 -18
  198. netbox_dns/filters/zone.py +0 -112
  199. netbox_dns/forms/contact.py +0 -211
  200. netbox_dns/graphql/contact.py +0 -19
  201. netbox_dns/graphql/nameserver.py +0 -19
  202. netbox_dns/graphql/record.py +0 -19
  203. netbox_dns/graphql/registrar.py +0 -19
  204. netbox_dns/graphql/view.py +0 -19
  205. netbox_dns/graphql/zone.py +0 -19
  206. netbox_dns/management/commands/setup_coupling.py +0 -75
  207. netbox_dns/management/commands/update_soa.py +0 -22
  208. netbox_dns/middleware.py +0 -226
  209. netbox_dns/migrations/0001_initial.py +0 -115
  210. netbox_dns/migrations/0002_zone_default_ttl.py +0 -18
  211. netbox_dns/migrations/0003_soa_managed_records.py +0 -112
  212. netbox_dns/migrations/0004_create_ptr_for_a_aaaa_records.py +0 -80
  213. netbox_dns/migrations/0005_update_ns_records.py +0 -41
  214. netbox_dns/migrations/0006_zone_soa_serial_auto.py +0 -29
  215. netbox_dns/migrations/0007_alter_zone_soa_serial_auto.py +0 -17
  216. netbox_dns/migrations/0008_zone_status_names.py +0 -21
  217. netbox_dns/migrations/0009_netbox32.py +0 -71
  218. netbox_dns/migrations/0010_update_soa_records.py +0 -58
  219. netbox_dns/migrations/0011_add_view_model.py +0 -70
  220. netbox_dns/migrations/0012_adjust_zone_and_record.py +0 -17
  221. netbox_dns/migrations/0014_add_view_description.py +0 -16
  222. netbox_dns/migrations/0016_cleanup_ptr_records.py +0 -38
  223. netbox_dns/migrations/0017_alter_record_ttl.py +0 -17
  224. netbox_dns/migrations/0018_zone_arpa_network.py +0 -51
  225. netbox_dns/migrations/0019_update_ns_ttl.py +0 -19
  226. netbox_dns/templates/netbox_dns/contact.html +0 -71
  227. netbox_dns/templates/netbox_dns/related_dns_objects.html +0 -21
  228. netbox_dns/templatetags/view_helpers.py +0 -15
  229. netbox_dns/validators.py +0 -57
  230. netbox_dns/views/contact.py +0 -83
  231. netbox_plugin_dns-0.21.4.dist-info/METADATA +0 -101
  232. netbox_plugin_dns-0.21.4.dist-info/RECORD +0 -110
@@ -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
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.1.7 on 2025-04-03 13:43
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0017_dnssec_policy_zone_zone_template"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="zone",
15
+ name="domain_status",
16
+ field=models.CharField(blank=True, max_length=50, null=True),
17
+ ),
18
+ migrations.AddField(
19
+ model_name="zone",
20
+ name="expiration_date",
21
+ field=models.DateField(blank=True, null=True),
22
+ ),
23
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 5.2 on 2025-04-22 18:05
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0018_zone_domain_status_zone_expiration_date"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="dnssecpolicy",
16
+ name="parental_agents",
17
+ field=django.contrib.postgres.fields.ArrayField(
18
+ base_field=models.GenericIPAddressField(),
19
+ blank=True,
20
+ default=list,
21
+ null=True,
22
+ size=None,
23
+ ),
24
+ ),
25
+ ]
@@ -6,7 +6,7 @@ import utilities.json
6
6
 
7
7
  class Migration(migrations.Migration):
8
8
  dependencies = [
9
- ("netbox_dns", "0019_update_ns_ttl"),
9
+ ("netbox_dns", "0001_squashed_netbox_dns_0_15"),
10
10
  ]
11
11
 
12
12
  operations = [
@@ -0,0 +1,29 @@
1
+ # Generated by Django 5.1.8 on 2025-04-22 21:45
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0019_dnssecpolicy_parental_agents"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.RemoveField(
15
+ model_name="dnssecpolicy",
16
+ name="parental_agents",
17
+ ),
18
+ migrations.AddField(
19
+ model_name="zone",
20
+ name="parental_agents",
21
+ field=django.contrib.postgres.fields.ArrayField(
22
+ base_field=models.GenericIPAddressField(),
23
+ blank=True,
24
+ default=list,
25
+ null=True,
26
+ size=None,
27
+ ),
28
+ ),
29
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 5.2 on 2025-05-13 09:16
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", "0020_remove_dnssecpolicy_parental_agents_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="record",
16
+ name="ptr_record",
17
+ field=models.ForeignKey(
18
+ blank=True,
19
+ null=True,
20
+ on_delete=django.db.models.deletion.SET_NULL,
21
+ related_name="address_records",
22
+ to="netbox_dns.record",
23
+ ),
24
+ ),
25
+ ]
@@ -5,7 +5,7 @@ import django.db.models.deletion
5
5
  from django.db import migrations, models
6
6
 
7
7
  import netbox_dns.fields.address
8
- from netbox_dns.models import RecordTypeChoices
8
+ from netbox_dns.choices import RecordTypeChoices
9
9
  from netbox_dns.utilities import arpa_to_prefix
10
10
 
11
11
 
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.2.1 on 2025-05-19 19:34
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
+ ("ipam", "0081_remove_service_device_virtual_machine_add_parent_gfk_index"),
11
+ ("netbox_dns", "0021_alter_record_ptr_record"),
12
+ ]
13
+
14
+ operations = [
15
+ migrations.AlterField(
16
+ model_name="record",
17
+ name="ipam_ip_address",
18
+ field=models.ForeignKey(
19
+ blank=True,
20
+ null=True,
21
+ on_delete=django.db.models.deletion.SET_NULL,
22
+ related_name="netbox_dns_records",
23
+ to="ipam.ipaddress",
24
+ ),
25
+ ),
26
+ ]
@@ -0,0 +1,27 @@
1
+ # Generated by Django 5.2.3 on 2025-07-30 18:54
2
+
3
+ from django.db import migrations
4
+
5
+ from netbox_dns.choices import RecordTypeChoices
6
+
7
+
8
+ def set_disable_ptr_false(apps, schema_editor):
9
+ Record = apps.get_model("netbox_dns", "Record")
10
+
11
+ for record in Record.objects.exclude(
12
+ type__in=(RecordTypeChoices.A, RecordTypeChoices.AAAA)
13
+ ):
14
+ if record.disable_ptr:
15
+ record.disable_ptr = False
16
+ record.save()
17
+
18
+
19
+ class Migration(migrations.Migration):
20
+
21
+ dependencies = [
22
+ ("netbox_dns", "0022_alter_record_ipam_ip_address"),
23
+ ]
24
+
25
+ operations = [
26
+ migrations.RunPython(set_disable_ptr_false),
27
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 5.2.5 on 2025-09-02 15:40
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0023_disable_ptr_false"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="zonetemplate",
16
+ name="parental_agents",
17
+ field=django.contrib.postgres.fields.ArrayField(
18
+ base_field=models.GenericIPAddressField(),
19
+ blank=True,
20
+ default=list,
21
+ null=True,
22
+ size=None,
23
+ ),
24
+ ),
25
+ ]
@@ -0,0 +1,22 @@
1
+ # Generated by Django 5.2.6 on 2025-10-05 16:57
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0024_zonetemplate_parental_agents"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name="zone",
15
+ name="inline_signing",
16
+ ),
17
+ migrations.AddField(
18
+ model_name="dnssecpolicy",
19
+ name="inline_signing",
20
+ field=models.BooleanField(default=True),
21
+ ),
22
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.6 on 2025-10-08 14:04
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0025_remove_zone_inline_signing_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="dnssecpolicy",
15
+ name="nsec3_opt_out",
16
+ field=models.BooleanField(blank=True, null=True),
17
+ ),
18
+ ]
@@ -7,7 +7,7 @@ import utilities.json
7
7
  class Migration(migrations.Migration):
8
8
  dependencies = [
9
9
  ("netbox_dns", "0025_ipam_coupling_cf"),
10
- ("extras", "0098_webhook_custom_field_data_webhook_tags"),
10
+ ("extras", "0092_delete_jobresult"),
11
11
  ]
12
12
 
13
13
  operations = [
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.7 on 2025-10-24 12:10
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0026_alter_dnssecpolicy_nsec3_opt_out"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="zone",
15
+ name="comments",
16
+ field=models.TextField(blank=True),
17
+ ),
18
+ ]
@@ -0,0 +1,54 @@
1
+ # Generated by Django 5.2.7 on 2025-11-11 14:35
2
+
3
+ import django.core.validators
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0027_zone_comments"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="zone",
16
+ name="default_ttl",
17
+ field=models.PositiveIntegerField(
18
+ blank=True,
19
+ validators=[django.core.validators.MaxValueValidator(2147483647)],
20
+ ),
21
+ ),
22
+ migrations.AlterField(
23
+ model_name="zone",
24
+ name="soa_minimum",
25
+ field=models.PositiveIntegerField(
26
+ validators=[django.core.validators.MaxValueValidator(2147483647)]
27
+ ),
28
+ ),
29
+ migrations.AlterField(
30
+ model_name="zone",
31
+ name="soa_ttl",
32
+ field=models.PositiveIntegerField(
33
+ validators=[django.core.validators.MaxValueValidator(2147483647)]
34
+ ),
35
+ ),
36
+ migrations.AlterField(
37
+ model_name="record",
38
+ name="ttl",
39
+ field=models.PositiveIntegerField(
40
+ blank=True,
41
+ null=True,
42
+ validators=[django.core.validators.MaxValueValidator(2147483647)],
43
+ ),
44
+ ),
45
+ migrations.AlterField(
46
+ model_name="recordtemplate",
47
+ name="ttl",
48
+ field=models.PositiveIntegerField(
49
+ blank=True,
50
+ null=True,
51
+ validators=[django.core.validators.MaxValueValidator(2147483647)],
52
+ ),
53
+ ),
54
+ ]
@@ -0,0 +1,44 @@
1
+ from django.db import migrations, models
2
+ import django.db.models.deletion
3
+ import netbox_dns.fields.rfc2317
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+ dependencies = [
8
+ ("netbox_dns", "0027_alter_registrar_iana_id"),
9
+ ]
10
+
11
+ operations = [
12
+ migrations.AddField(
13
+ model_name="zone",
14
+ name="rfc2317_prefix",
15
+ field=netbox_dns.fields.rfc2317.RFC2317NetworkField(blank=True, null=True),
16
+ ),
17
+ migrations.AddField(
18
+ model_name="zone",
19
+ name="rfc2317_parent_managed",
20
+ field=models.BooleanField(default=False),
21
+ ),
22
+ migrations.AddField(
23
+ model_name="zone",
24
+ name="rfc2317_parent_zone",
25
+ field=models.ForeignKey(
26
+ blank=True,
27
+ null=True,
28
+ on_delete=django.db.models.deletion.SET_NULL,
29
+ related_name="rfc2317_child_zones",
30
+ to="netbox_dns.zone",
31
+ ),
32
+ ),
33
+ migrations.AddField(
34
+ model_name="record",
35
+ name="rfc2317_cname_record",
36
+ field=models.ForeignKey(
37
+ blank=True,
38
+ null=True,
39
+ on_delete=django.db.models.deletion.SET_NULL,
40
+ related_name="rfc2317_ptr_records",
41
+ to="netbox_dns.record",
42
+ ),
43
+ ),
44
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.9 on 2026-01-05 14:51
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("netbox_dns", "0028_alter_zone_default_ttl_alter_zone_soa_minimum_and_more"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name="registrationcontact",
15
+ name="street",
16
+ field=models.CharField(blank=True, max_length=255),
17
+ ),
18
+ ]
@@ -0,0 +1,30 @@
1
+ from dns import name as dns_name
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ def update_record_fqdn(apps, schema_editor):
7
+ Record = apps.get_model("netbox_dns", "Record")
8
+
9
+ for record in Record.objects.filter(fqdn__isnull=True):
10
+ zone = dns_name.from_text(record.zone.name, origin=dns_name.root)
11
+ fqdn = dns_name.from_text(record.name, origin=zone)
12
+
13
+ record.fqdn = fqdn.to_text()
14
+
15
+ record.save()
16
+
17
+
18
+ class Migration(migrations.Migration):
19
+ dependencies = [
20
+ ("netbox_dns", "0028_rfc2317_fields"),
21
+ ]
22
+
23
+ operations = [
24
+ migrations.AddField(
25
+ model_name="record",
26
+ name="fqdn",
27
+ field=models.CharField(default=None, max_length=255, null=True, blank=True),
28
+ ),
29
+ migrations.RunPython(update_record_fqdn),
30
+ ]
@@ -0,0 +1 @@
1
+ from .object_modification import *
@@ -0,0 +1,57 @@
1
+ from netbox.models import NetBoxModel
2
+
3
+
4
+ __all__ = ("ObjectModificationMixin",)
5
+
6
+
7
+ class ObjectModificationMixin:
8
+ def __init__(self, *args, **kwargs):
9
+ super().__init__(*args, **kwargs)
10
+
11
+ if not hasattr(self.__class__, "check_fields"):
12
+ self.__class__.check_fields = (
13
+ {field.name for field in self._meta.fields}
14
+ - {field.name for field in NetBoxModel._meta.fields}
15
+ - {"id"}
16
+ )
17
+
18
+ self.__class__.check_fields.add("custom_field_data")
19
+
20
+ self._save_field_values()
21
+
22
+ def _save_field_values(self):
23
+ for field in self.check_fields:
24
+ if field == "custom_field_data":
25
+ self._saved_custom_field_data = self.custom_field_data.copy()
26
+ continue
27
+
28
+ if f"{field}_id" in self.__dict__:
29
+ setattr(self, f"_saved_{field}_id", self.__dict__.get(f"{field}_id"))
30
+ else:
31
+ setattr(self, f"_saved_{field}", self.__dict__.get(field))
32
+
33
+ def save(self, *args, **kwargs):
34
+ super().save(*args, **kwargs)
35
+
36
+ self._save_field_values()
37
+
38
+ @property
39
+ def changed_fields(self):
40
+ if self._state.adding:
41
+ return None
42
+
43
+ _changed_fields = set()
44
+ for field in self.check_fields:
45
+ if f"_saved_{field}_id" in self.__dict__:
46
+ if self.__dict__.get(f"_saved_{field}_id") != self.__dict__.get(
47
+ f"{field}_id"
48
+ ):
49
+ _changed_fields.add(field)
50
+ else:
51
+ if self.__dict__.get(f"_saved_{field}") != self.__dict__.get(field):
52
+ _changed_fields.add(field)
53
+
54
+ return _changed_fields
55
+
56
+ def get_saved_value(self, field):
57
+ return self.__dict__.get(f"_saved_{field}")
@@ -2,5 +2,9 @@ from .zone import *
2
2
  from .nameserver import *
3
3
  from .record import *
4
4
  from .view import *
5
- from .contact import *
5
+ from .registration_contact import *
6
6
  from .registrar import *
7
+ from .zone_template import *
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.utils.translation import gettext_lazy as _
3
+
4
+ from netbox.models import NetBoxModel
5
+ from netbox.search import SearchIndex, register_search
6
+ from netbox.models.features import ContactsMixin
7
+
8
+ from netbox_dns.choices import (
9
+ DNSSECKeyTemplateTypeChoices,
10
+ DNSSECKeyTemplateAlgorithmChoices,
11
+ DNSSECKeyTemplateKeySizeChoices,
12
+ )
13
+ from netbox_dns.validators import validate_key_template
14
+
15
+
16
+ __all__ = (
17
+ "DNSSECKeyTemplate",
18
+ "DNSSECKeyTemplateIndex",
19
+ )
20
+
21
+
22
+ class DNSSECKeyTemplate(ContactsMixin, NetBoxModel):
23
+ class Meta:
24
+ verbose_name = _("DNSSEC Key Template")
25
+ verbose_name_plural = _("DNSSEC Key Templates")
26
+
27
+ unique_together = (
28
+ "name",
29
+ "type",
30
+ )
31
+
32
+ ordering = ("name",)
33
+
34
+ clone_fields = (
35
+ "description",
36
+ "type",
37
+ "lifetime",
38
+ "algorithm",
39
+ "key_size",
40
+ "tenant",
41
+ )
42
+
43
+ def __str__(self):
44
+ return f"{str(self.name)} [{self.type}]"
45
+
46
+ name = models.CharField(
47
+ verbose_name=_("Name"),
48
+ max_length=255,
49
+ )
50
+ description = models.CharField(
51
+ verbose_name=_("Description"),
52
+ max_length=200,
53
+ blank=True,
54
+ )
55
+
56
+ type = models.CharField(
57
+ verbose_name=_("Type"),
58
+ choices=DNSSECKeyTemplateTypeChoices,
59
+ max_length=3,
60
+ blank=False,
61
+ null=False,
62
+ )
63
+ lifetime = models.PositiveIntegerField(
64
+ verbose_name=_("Lifetime"),
65
+ blank=True,
66
+ null=True,
67
+ )
68
+ algorithm = models.CharField(
69
+ verbose_name=_("Algorithm"),
70
+ choices=DNSSECKeyTemplateAlgorithmChoices,
71
+ blank=False,
72
+ null=False,
73
+ )
74
+ key_size = models.PositiveIntegerField(
75
+ verbose_name=_("Key Size"),
76
+ choices=DNSSECKeyTemplateKeySizeChoices,
77
+ blank=True,
78
+ null=True,
79
+ )
80
+
81
+ tenant = models.ForeignKey(
82
+ verbose_name=_("Tenant"),
83
+ to="tenancy.Tenant",
84
+ on_delete=models.PROTECT,
85
+ related_name="netbox_dns_dnssec_key_templates",
86
+ blank=True,
87
+ null=True,
88
+ )
89
+
90
+ def get_type_color(self):
91
+ return DNSSECKeyTemplateTypeChoices.colors.get(self.type)
92
+
93
+ def clean(self, *args, **kwargs):
94
+ if self.algorithm != DNSSECKeyTemplateAlgorithmChoices.RSASHA256:
95
+ self.key_size = self._meta.get_field("key_size").get_default()
96
+
97
+ super().clean(*args, **kwargs)
98
+
99
+ validate_key_template(self)
100
+
101
+ def save(self, *args, **kwargs):
102
+ validate_key_template(self)
103
+
104
+ super().save(*args, **kwargs)
105
+
106
+
107
+ @register_search
108
+ class DNSSECKeyTemplateIndex(SearchIndex):
109
+ model = DNSSECKeyTemplate
110
+
111
+ fields = (
112
+ ("name", 100),
113
+ ("description", 500),
114
+ )