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,148 @@
1
+ from django.core.exceptions import ValidationError
2
+ from django.utils.translation import gettext_lazy as _
3
+
4
+ from netbox_dns.choices import (
5
+ DNSSECKeyTemplateTypeChoices,
6
+ DNSSECKeyTemplateAlgorithmChoices,
7
+ DNSSECKeyTemplateKeySizeChoices,
8
+ )
9
+
10
+ __all__ = (
11
+ "validate_key_template",
12
+ "validate_key_template_assignment",
13
+ "validate_key_template_lifetime",
14
+ )
15
+
16
+
17
+ def validate_key_template(key_template):
18
+ if key_template.key_size is None:
19
+ return
20
+
21
+ if key_template.key_size not in DNSSECKeyTemplateKeySizeChoices.values():
22
+ raise ValidationError(
23
+ {
24
+ "key_size": _("{key_size} is not a supported key size.").format(
25
+ key_size=key_template.key_size
26
+ )
27
+ }
28
+ )
29
+
30
+ if key_template.algorithm != DNSSECKeyTemplateAlgorithmChoices.RSASHA256:
31
+ raise ValidationError(
32
+ {
33
+ "key_size": _(
34
+ "Specifying the key size is not supported for algorithm {algorithm}."
35
+ ).format(algorithm=key_template.algorithm)
36
+ }
37
+ )
38
+
39
+
40
+ def validate_key_template_assignment(key_templates):
41
+ if key_templates is None:
42
+ return
43
+
44
+ csk = key_templates.filter(type=DNSSECKeyTemplateTypeChoices.TYPE_CSK)
45
+ ksk = key_templates.filter(type=DNSSECKeyTemplateTypeChoices.TYPE_KSK)
46
+ zsk = key_templates.filter(type=DNSSECKeyTemplateTypeChoices.TYPE_ZSK)
47
+
48
+ if csk and (ksk or zsk):
49
+ raise ValidationError(
50
+ {
51
+ "key_templates": _(
52
+ "Specifying a CSK together with any other key template type is not allowed."
53
+ )
54
+ }
55
+ )
56
+
57
+ if any(
58
+ (
59
+ csk.count() > 1,
60
+ ksk.count() > 1,
61
+ zsk.count() > 1,
62
+ )
63
+ ):
64
+ raise ValidationError(
65
+ {
66
+ "key_templates": _(
67
+ "At most one key template per type (CSK, KSK and ZSK) is allowed."
68
+ )
69
+ }
70
+ )
71
+
72
+ if (ksk and zsk) and (ksk.first().algorithm != zsk.first().algorithm):
73
+ raise ValidationError(
74
+ {"key_templates": _("KSK and ZSK must use the same algorithm.")}
75
+ )
76
+
77
+
78
+ def validate_key_template_lifetime(key_template, policy, raise_exception=True):
79
+ key_lifetime = key_template.lifetime
80
+
81
+ if not key_lifetime:
82
+ return
83
+
84
+ dnskey_ttl = policy.get_effective_value("dnskey_ttl")
85
+ publish_safety = policy.get_effective_value("publish_safety")
86
+ zone_propagation_delay = policy.get_effective_value("zone_propagation_delay")
87
+ max_zone_ttl = policy.get_effective_value("max_zone_ttl")
88
+ retire_safety = policy.get_effective_value("retire_safety")
89
+
90
+ validation_errors = []
91
+
92
+ if (
93
+ dnskey_ttl is not None
94
+ and publish_safety is not None
95
+ and zone_propagation_delay is not None
96
+ and key_lifetime < (dnskey_ttl + publish_safety + zone_propagation_delay)
97
+ ):
98
+ validation_errors.append(
99
+ _(
100
+ "Key Lifetime {lifetime} is less than DNSKEY TTL + Publish Safety + Zone Propagation Delay."
101
+ ).format(lifetime=key_lifetime)
102
+ )
103
+
104
+ if (
105
+ max_zone_ttl is not None
106
+ and retire_safety is not None
107
+ and zone_propagation_delay is not None
108
+ and key_lifetime < (max_zone_ttl + retire_safety + zone_propagation_delay)
109
+ ):
110
+ validation_errors.append(
111
+ _(
112
+ "Key Lifetime {lifetime} is less than Max Zone TTL + Retire Safety + Zone Propagation Delay."
113
+ ).format(lifetime=key_lifetime)
114
+ )
115
+
116
+ if key_template.type == DNSSECKeyTemplateTypeChoices.TYPE_ZSK:
117
+ signatures_validity = policy.get_effective_value("signatures_validity")
118
+ signatures_refresh = policy.get_effective_value("signatures_refresh")
119
+
120
+ if (
121
+ signatures_validity is not None
122
+ and signatures_validity is not None
123
+ and key_lifetime < signatures_validity - signatures_refresh
124
+ ):
125
+ validation_errors.append(
126
+ _(
127
+ "Key Lifetime {lifetime} is less than Signatures Validity - Signatures Refresh."
128
+ )
129
+ ).format(lifetime=key_lifetime)
130
+ else:
131
+ parent_ds_ttl = policy.get_effective_value("parent_ds_ttl")
132
+ parent_propagation_delay = policy.get_effective_value(
133
+ "parent_propagation_delay"
134
+ )
135
+
136
+ if (
137
+ parent_ds_ttl is not None
138
+ and retire_safety is not None
139
+ and parent_propagation_delay is not None
140
+ and parent_ds_ttl < retire_safety + parent_propagation_delay
141
+ ):
142
+ validation_errors.append(
143
+ _(
144
+ "Key Lifetime {lifetime} is less than Parent DS TTL + Retire Safety + Parent Propagation Delay."
145
+ ).format(lifetime=key_lifetime)
146
+ )
147
+
148
+ return validation_errors
@@ -0,0 +1,28 @@
1
+ from django.core.exceptions import ValidationError
2
+ from django.utils.translation import gettext as _
3
+
4
+
5
+ __all__ = (
6
+ "validate_prefix",
7
+ "validate_ipv4",
8
+ "validate_rfc2317",
9
+ )
10
+
11
+
12
+ def validate_prefix(prefix):
13
+ if prefix.ip != prefix.cidr.ip:
14
+ raise ValidationError(
15
+ _("{prefix} is not a valid prefix. Did you mean {cidr}?").format(
16
+ prefix=prefix, cidr=prefix.cidr
17
+ )
18
+ )
19
+
20
+
21
+ def validate_ipv4(prefix):
22
+ if prefix.version != 4:
23
+ raise ValidationError(_("RFC2317 requires an IPv4 prefix."))
24
+
25
+
26
+ def validate_rfc2317(prefix):
27
+ if prefix.prefixlen <= 24:
28
+ raise ValidationError(_("RFC2317 requires at least 25 bit prefix length."))
@@ -2,5 +2,9 @@ from .view import *
2
2
  from .zone import *
3
3
  from .nameserver import *
4
4
  from .record 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,78 @@
1
+ from netbox.views import generic
2
+ from utilities.views import register_model_view
3
+
4
+ from netbox_dns.filtersets import DNSSECKeyTemplateFilterSet
5
+ from netbox_dns.forms import (
6
+ DNSSECKeyTemplateImportForm,
7
+ DNSSECKeyTemplateFilterForm,
8
+ DNSSECKeyTemplateForm,
9
+ DNSSECKeyTemplateBulkEditForm,
10
+ )
11
+ from netbox_dns.models import DNSSECKeyTemplate
12
+ from netbox_dns.tables import DNSSECKeyTemplateTable, DNSSECPolicyDisplayTable
13
+
14
+
15
+ __all__ = (
16
+ "DNSSECKeyTemplateView",
17
+ "DNSSECKeyTemplateListView",
18
+ "DNSSECKeyTemplateEditView",
19
+ "DNSSECKeyTemplateDeleteView",
20
+ "DNSSECKeyTemplateBulkEditView",
21
+ "DNSSECKeyTemplateBulkImportView",
22
+ "DNSSECKeyTemplateBulkDeleteView",
23
+ )
24
+
25
+
26
+ @register_model_view(DNSSECKeyTemplate, "list", path="", detail=False)
27
+ class DNSSECKeyTemplateListView(generic.ObjectListView):
28
+ queryset = DNSSECKeyTemplate.objects.all()
29
+ filterset = DNSSECKeyTemplateFilterSet
30
+ filterset_form = DNSSECKeyTemplateFilterForm
31
+ table = DNSSECKeyTemplateTable
32
+
33
+
34
+ @register_model_view(DNSSECKeyTemplate)
35
+ class DNSSECKeyTemplateView(generic.ObjectView):
36
+ queryset = DNSSECKeyTemplate.objects.prefetch_related("policies")
37
+
38
+ def get_extra_context(self, request, instance):
39
+ if instance.policies.exists():
40
+ policy_table = DNSSECPolicyDisplayTable(data=instance.policies.all())
41
+ policy_table.configure(request)
42
+ return {"policy_table": policy_table}
43
+
44
+ return {}
45
+
46
+
47
+ @register_model_view(DNSSECKeyTemplate, "add", detail=False)
48
+ @register_model_view(DNSSECKeyTemplate, "edit")
49
+ class DNSSECKeyTemplateEditView(generic.ObjectEditView):
50
+ queryset = DNSSECKeyTemplate.objects.all()
51
+ form = DNSSECKeyTemplateForm
52
+
53
+
54
+ @register_model_view(DNSSECKeyTemplate, "delete")
55
+ class DNSSECKeyTemplateDeleteView(generic.ObjectDeleteView):
56
+ queryset = DNSSECKeyTemplate.objects.all()
57
+
58
+
59
+ @register_model_view(DNSSECKeyTemplate, "bulk_import", detail=False)
60
+ class DNSSECKeyTemplateBulkImportView(generic.BulkImportView):
61
+ queryset = DNSSECKeyTemplate.objects.all()
62
+ model_form = DNSSECKeyTemplateImportForm
63
+ table = DNSSECKeyTemplateTable
64
+
65
+
66
+ @register_model_view(DNSSECKeyTemplate, "bulk_edit", path="edit", detail=False)
67
+ class DNSSECKeyTemplateBulkEditView(generic.BulkEditView):
68
+ queryset = DNSSECKeyTemplate.objects.all()
69
+ filterset = DNSSECKeyTemplateFilterSet
70
+ table = DNSSECKeyTemplateTable
71
+ form = DNSSECKeyTemplateBulkEditForm
72
+
73
+
74
+ @register_model_view(DNSSECKeyTemplate, "bulk_delete", path="delete", detail=False)
75
+ class DNSSECKeyTemplateBulkDeleteView(generic.BulkDeleteView):
76
+ queryset = DNSSECKeyTemplate.objects.all()
77
+ filterset = DNSSECKeyTemplateFilterSet
78
+ table = DNSSECKeyTemplateTable
@@ -0,0 +1,146 @@
1
+ from django.utils.translation import gettext_lazy as _
2
+
3
+ from netbox.views import generic
4
+ from utilities.views import ViewTab, register_model_view
5
+
6
+ from netbox_dns.filtersets import (
7
+ DNSSECPolicyFilterSet,
8
+ ZoneFilterSet,
9
+ ZoneTemplateFilterSet,
10
+ )
11
+ from netbox_dns.forms import (
12
+ DNSSECPolicyImportForm,
13
+ DNSSECPolicyFilterForm,
14
+ DNSSECPolicyForm,
15
+ DNSSECPolicyBulkEditForm,
16
+ )
17
+ from netbox_dns.models import DNSSECPolicy, Zone, ZoneTemplate
18
+ from netbox_dns.tables import (
19
+ DNSSECPolicyTable,
20
+ ZoneDisplayTable,
21
+ ZoneTemplateDisplayTable,
22
+ )
23
+ from netbox_dns.validators import validate_key_template_lifetime
24
+ from netbox_dns.choices import DNSSECKeyTemplateTypeChoices
25
+
26
+
27
+ __all__ = (
28
+ "DNSSECPolicyView",
29
+ "DNSSECPolicyListView",
30
+ "DNSSECPolicyEditView",
31
+ "DNSSECPolicyDeleteView",
32
+ "DNSSECPolicyBulkEditView",
33
+ "DNSSECPolicyBulkImportView",
34
+ "DNSSECPolicyBulkDeleteView",
35
+ )
36
+
37
+
38
+ @register_model_view(DNSSECPolicy, "list", path="", detail=False)
39
+ class DNSSECPolicyListView(generic.ObjectListView):
40
+ queryset = DNSSECPolicy.objects.all()
41
+ filterset = DNSSECPolicyFilterSet
42
+ filterset_form = DNSSECPolicyFilterForm
43
+ table = DNSSECPolicyTable
44
+
45
+
46
+ @register_model_view(DNSSECPolicy)
47
+ class DNSSECPolicyView(generic.ObjectView):
48
+ queryset = DNSSECPolicy.objects.prefetch_related(
49
+ "key_templates", "zones", "zone_templates"
50
+ )
51
+
52
+ def get_extra_context(self, request, instance):
53
+ context = {}
54
+
55
+ key_errors = {
56
+ key_template.pk: validate_key_template_lifetime(key_template, instance)
57
+ for key_template in instance.key_templates.all()
58
+ }
59
+
60
+ context["key_template_errors"] = key_errors
61
+
62
+ if not instance.key_templates.filter(
63
+ type__in=(
64
+ DNSSECKeyTemplateTypeChoices.TYPE_ZSK,
65
+ DNSSECKeyTemplateTypeChoices.TYPE_CSK,
66
+ )
67
+ ).exists():
68
+ context["policy_warning"] = _(
69
+ "No key for signing zones (CSK or ZSK) is assigned."
70
+ )
71
+
72
+ return context
73
+
74
+
75
+ @register_model_view(DNSSECPolicy, "add", detail=False)
76
+ @register_model_view(DNSSECPolicy, "edit")
77
+ class DNSSECPolicyEditView(generic.ObjectEditView):
78
+ queryset = DNSSECPolicy.objects.all()
79
+ form = DNSSECPolicyForm
80
+
81
+
82
+ @register_model_view(DNSSECPolicy, "delete")
83
+ class DNSSECPolicyDeleteView(generic.ObjectDeleteView):
84
+ queryset = DNSSECPolicy.objects.all()
85
+
86
+
87
+ @register_model_view(DNSSECPolicy, "bulk_import", detail=False)
88
+ class DNSSECPolicyBulkImportView(generic.BulkImportView):
89
+ queryset = DNSSECPolicy.objects.all()
90
+ model_form = DNSSECPolicyImportForm
91
+ table = DNSSECPolicyTable
92
+
93
+
94
+ @register_model_view(DNSSECPolicy, "bulk_edit", path="edit", detail=False)
95
+ class DNSSECPolicyBulkEditView(generic.BulkEditView):
96
+ queryset = DNSSECPolicy.objects.all()
97
+ filterset = DNSSECPolicyFilterSet
98
+ table = DNSSECPolicyTable
99
+ form = DNSSECPolicyBulkEditForm
100
+
101
+
102
+ @register_model_view(DNSSECPolicy, "bulk_delete", path="delete", detail=False)
103
+ class DNSSECPolicyBulkDeleteView(generic.BulkDeleteView):
104
+ queryset = DNSSECPolicy.objects.all()
105
+ filterset = DNSSECPolicyFilterSet
106
+ table = DNSSECPolicyTable
107
+
108
+
109
+ @register_model_view(DNSSECPolicy, "zones")
110
+ class DNSSECPolicyZoneListView(generic.ObjectChildrenView):
111
+ queryset = DNSSECPolicy.objects.all()
112
+ child_model = Zone
113
+ table = ZoneDisplayTable
114
+ filterset = ZoneFilterSet
115
+ template_name = "netbox_dns/zone/child.html"
116
+ hide_if_empty = True
117
+
118
+ tab = ViewTab(
119
+ label=_("Zones"),
120
+ permission="netbox_dns.view_zones",
121
+ badge=lambda obj: obj.zones.count(),
122
+ hide_if_empty=True,
123
+ )
124
+
125
+ def get_children(self, request, parent):
126
+ return parent.zones.restrict(request.user, "view")
127
+
128
+
129
+ @register_model_view(DNSSECPolicy, "zonetemplates")
130
+ class DNSSECPolicyZoneTemplateListView(generic.ObjectChildrenView):
131
+ queryset = DNSSECPolicy.objects.all()
132
+ child_model = ZoneTemplate
133
+ table = ZoneTemplateDisplayTable
134
+ filterset = ZoneTemplateFilterSet
135
+ template_name = "netbox_dns/zonetemplate/child.html"
136
+ hide_if_empty = True
137
+
138
+ tab = ViewTab(
139
+ label=_("Zone Templates"),
140
+ permission="netbox_dns.view_zonetemplates",
141
+ badge=lambda obj: obj.zone_templates.count(),
142
+ hide_if_empty=True,
143
+ )
144
+
145
+ def get_children(self, request, parent):
146
+ return parent.zone_templates.restrict(request.user, "view")
@@ -1,9 +1,11 @@
1
1
  from dns import name as dns_name
2
2
 
3
+ from django.utils.translation import gettext_lazy as _
4
+
3
5
  from netbox.views import generic
4
6
  from utilities.views import ViewTab, register_model_view
5
7
 
6
- from netbox_dns.filters import NameServerFilter, ZoneFilter
8
+ from netbox_dns.filtersets import NameServerFilterSet, ZoneFilterSet
7
9
  from netbox_dns.forms import (
8
10
  NameServerImportForm,
9
11
  NameServerFilterForm,
@@ -14,15 +16,28 @@ from netbox_dns.models import Zone, NameServer
14
16
  from netbox_dns.tables import NameServerTable, ZoneTable
15
17
 
16
18
 
19
+ __all__ = (
20
+ "NameServerView",
21
+ "NameServerListView",
22
+ "NameServerEditView",
23
+ "NameServerDeleteView",
24
+ "NameServerBulkEditView",
25
+ "NameServerBulkImportView",
26
+ "NameServerBulkDeleteView",
27
+ )
28
+
29
+
30
+ @register_model_view(NameServer, "list", path="", detail=False)
17
31
  class NameServerListView(generic.ObjectListView):
18
32
  queryset = NameServer.objects.all()
19
- filterset = NameServerFilter
33
+ filterset = NameServerFilterSet
20
34
  filterset_form = NameServerFilterForm
21
35
  table = NameServerTable
22
36
 
23
37
 
38
+ @register_model_view(NameServer)
24
39
  class NameServerView(generic.ObjectView):
25
- queryset = NameServer.objects.all().prefetch_related("zones")
40
+ queryset = NameServer.objects.prefetch_related("zones")
26
41
 
27
42
  def get_extra_context(self, request, instance):
28
43
  name = dns_name.from_text(instance.name)
@@ -34,47 +49,51 @@ class NameServerView(generic.ObjectView):
34
49
  return {}
35
50
 
36
51
 
52
+ @register_model_view(NameServer, "add", detail=False)
53
+ @register_model_view(NameServer, "edit")
37
54
  class NameServerEditView(generic.ObjectEditView):
38
55
  queryset = NameServer.objects.all()
39
56
  form = NameServerForm
40
- default_return_url = "plugins:netbox_dns:nameserver_list"
41
57
 
42
58
 
59
+ @register_model_view(NameServer, "delete")
43
60
  class NameServerDeleteView(generic.ObjectDeleteView):
44
61
  queryset = NameServer.objects.all()
45
- default_return_url = "plugins:netbox_dns:nameserver_list"
46
62
 
47
63
 
64
+ @register_model_view(NameServer, "bulk_import", detail=False)
48
65
  class NameServerBulkImportView(generic.BulkImportView):
49
66
  queryset = NameServer.objects.all()
50
67
  model_form = NameServerImportForm
51
68
  table = NameServerTable
52
- default_return_url = "plugins:netbox_dns:nameserver_list"
53
69
 
54
70
 
71
+ @register_model_view(NameServer, "bulk_edit", path="edit", detail=False)
55
72
  class NameServerBulkEditView(generic.BulkEditView):
56
73
  queryset = NameServer.objects.all()
57
- filterset = NameServerFilter
74
+ filterset = NameServerFilterSet
58
75
  table = NameServerTable
59
76
  form = NameServerBulkEditForm
60
77
 
61
78
 
79
+ @register_model_view(NameServer, "bulk_delete", path="delete", detail=False)
62
80
  class NameServerBulkDeleteView(generic.BulkDeleteView):
63
81
  queryset = NameServer.objects.all()
82
+ filterset = NameServerFilterSet
64
83
  table = NameServerTable
65
84
 
66
85
 
67
86
  @register_model_view(NameServer, "zones")
68
87
  class NameServerZoneListView(generic.ObjectChildrenView):
69
- queryset = NameServer.objects.all().prefetch_related("zones")
88
+ queryset = NameServer.objects.prefetch_related("zones")
70
89
  child_model = Zone
71
90
  table = ZoneTable
72
- filterset = ZoneFilter
91
+ filterset = ZoneFilterSet
73
92
  template_name = "netbox_dns/zone/child.html"
74
93
  hide_if_empty = True
75
94
 
76
95
  tab = ViewTab(
77
- label="Zones",
96
+ label=_("Zones"),
78
97
  permission="netbox_dns.view_zone",
79
98
  badge=lambda obj: obj.zones.count(),
80
99
  hide_if_empty=True,
@@ -86,19 +105,19 @@ class NameServerZoneListView(generic.ObjectChildrenView):
86
105
 
87
106
  @register_model_view(NameServer, "soa_zones")
88
107
  class NameServerSOAZoneListView(generic.ObjectChildrenView):
89
- queryset = NameServer.objects.all().prefetch_related("zones_soa")
108
+ queryset = NameServer.objects.prefetch_related("soa_zones")
90
109
  child_model = Zone
91
110
  table = ZoneTable
92
- filterset = ZoneFilter
111
+ filterset = ZoneFilterSet
93
112
  template_name = "netbox_dns/zone/child.html"
94
113
  hide_if_empty = True
95
114
 
96
115
  tab = ViewTab(
97
- label="SOA Zones",
116
+ label=_("SOA Zones"),
98
117
  permission="netbox_dns.view_zone",
99
- badge=lambda obj: obj.zones_soa.count(),
118
+ badge=lambda obj: obj.soa_zones.count(),
100
119
  hide_if_empty=True,
101
120
  )
102
121
 
103
122
  def get_children(self, request, parent):
104
- return parent.zones_soa
123
+ return parent.soa_zones