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,165 @@
1
+ import netaddr
2
+ from netaddr.core import AddrFormatError
3
+
4
+ import django_filters
5
+
6
+ from django.db.models import Q
7
+ from django.utils.translation import gettext as _
8
+
9
+ from netbox.filtersets import NetBoxModelFilterSet
10
+ from tenancy.filtersets import TenancyFilterSet
11
+ from utilities.filters import MultiValueCharFilter
12
+
13
+ from netbox_dns.models import (
14
+ ZoneTemplate,
15
+ RecordTemplate,
16
+ Registrar,
17
+ RegistrationContact,
18
+ NameServer,
19
+ DNSSECPolicy,
20
+ )
21
+
22
+
23
+ __all__ = ("ZoneTemplateFilterSet",)
24
+
25
+
26
+ class ZoneTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
27
+ class Meta:
28
+ model = ZoneTemplate
29
+
30
+ fields = (
31
+ "id",
32
+ "name",
33
+ "description",
34
+ "soa_rname",
35
+ )
36
+
37
+ record_template_id = django_filters.ModelMultipleChoiceFilter(
38
+ queryset=RecordTemplate.objects.all(),
39
+ field_name="record_templates",
40
+ to_field_name="id",
41
+ label=_("Record Template ID"),
42
+ )
43
+ record_template = django_filters.ModelMultipleChoiceFilter(
44
+ queryset=RecordTemplate.objects.all(),
45
+ field_name="record_templates__name",
46
+ to_field_name="name",
47
+ label=_("Record Template"),
48
+ )
49
+ nameserver_id = django_filters.ModelMultipleChoiceFilter(
50
+ queryset=NameServer.objects.all(),
51
+ field_name="nameservers",
52
+ to_field_name="id",
53
+ label=_("Nameservers ID"),
54
+ )
55
+ nameserver = django_filters.ModelMultipleChoiceFilter(
56
+ queryset=NameServer.objects.all(),
57
+ field_name="nameservers__name",
58
+ to_field_name="name",
59
+ label=_("Nameserver"),
60
+ )
61
+ soa_mname_id = django_filters.ModelMultipleChoiceFilter(
62
+ queryset=NameServer.objects.all(),
63
+ field_name="soa_mname",
64
+ to_field_name="id",
65
+ label=_("SOA MName ID"),
66
+ )
67
+ soa_mname = django_filters.ModelMultipleChoiceFilter(
68
+ queryset=NameServer.objects.all(),
69
+ field_name="soa_mname__name",
70
+ to_field_name="name",
71
+ label=_("SOA MName"),
72
+ )
73
+ dnssec_policy_id = django_filters.ModelMultipleChoiceFilter(
74
+ queryset=DNSSECPolicy.objects.all(),
75
+ label=_("DNSSEC Policy ID"),
76
+ )
77
+ dnssec_policy = django_filters.ModelMultipleChoiceFilter(
78
+ queryset=DNSSECPolicy.objects.all(),
79
+ field_name="dnssec_policy__name",
80
+ to_field_name="name",
81
+ label=_("DNSSEC Policy"),
82
+ )
83
+ parental_agents = MultiValueCharFilter(
84
+ method="filter_parental_agents",
85
+ label=_("Parental Agents"),
86
+ )
87
+ registrar_id = django_filters.ModelMultipleChoiceFilter(
88
+ queryset=Registrar.objects.all(),
89
+ label=_("Registrar ID"),
90
+ )
91
+ registrar = django_filters.ModelMultipleChoiceFilter(
92
+ queryset=Registrar.objects.all(),
93
+ field_name="registrar__name",
94
+ to_field_name="name",
95
+ label=_("Registrar"),
96
+ )
97
+ registrant_id = django_filters.ModelMultipleChoiceFilter(
98
+ queryset=RegistrationContact.objects.all(),
99
+ label=_("Registrant ID"),
100
+ )
101
+ registrant = django_filters.ModelMultipleChoiceFilter(
102
+ queryset=RegistrationContact.objects.all(),
103
+ field_name="registrant__contact_id",
104
+ to_field_name="contact_id",
105
+ label=_("Registrant"),
106
+ )
107
+ admin_c_id = django_filters.ModelMultipleChoiceFilter(
108
+ queryset=RegistrationContact.objects.all(),
109
+ label=_("Administrative Contact ID"),
110
+ )
111
+ admin_c = django_filters.ModelMultipleChoiceFilter(
112
+ queryset=RegistrationContact.objects.all(),
113
+ field_name="admin_c__contact_id",
114
+ to_field_name="contact_id",
115
+ label=_("Administrative Contact"),
116
+ )
117
+ tech_c_id = django_filters.ModelMultipleChoiceFilter(
118
+ queryset=RegistrationContact.objects.all(),
119
+ label=_("Technical Contact ID"),
120
+ )
121
+ tech_c = django_filters.ModelMultipleChoiceFilter(
122
+ queryset=RegistrationContact.objects.all(),
123
+ field_name="tech_c__contact_id",
124
+ to_field_name="contact_id",
125
+ label=_("Technical Contact"),
126
+ )
127
+ billing_c_id = django_filters.ModelMultipleChoiceFilter(
128
+ queryset=RegistrationContact.objects.all(),
129
+ label=_("Billing Contact ID"),
130
+ )
131
+ billing_c = django_filters.ModelMultipleChoiceFilter(
132
+ queryset=RegistrationContact.objects.all(),
133
+ field_name="billing_c__contact_id",
134
+ to_field_name="contact_id",
135
+ label=_("Billing Contact"),
136
+ )
137
+
138
+ def filter_parental_agents(self, queryset, name, value):
139
+ if not value:
140
+ return queryset
141
+
142
+ query_values = []
143
+ for v in value:
144
+ try:
145
+ query_values.append(str(netaddr.IPAddress(v)))
146
+ except (AddrFormatError, ValueError):
147
+ pass
148
+
149
+ return queryset.filter(parental_agents__overlap=query_values)
150
+
151
+ def search(self, queryset, name, value):
152
+ if not value.strip():
153
+ return queryset
154
+ qs_filter = (
155
+ Q(name__icontains=value)
156
+ | Q(description__icontains=value)
157
+ | Q(soa_rname__icontains=value)
158
+ | Q(registrar__name__icontains=value)
159
+ | Q(registry_domain_id__icontains=value)
160
+ | Q(registrant__name__icontains=value)
161
+ | Q(admin_c__name__icontains=value)
162
+ | Q(tech_c__name__icontains=value)
163
+ | Q(billing_c__name__icontains=value)
164
+ )
165
+ return queryset.filter(qs_filter)
@@ -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,250 @@
1
+ from django import forms
2
+ from django.contrib.postgres.forms import SimpleArrayField
3
+ from django.utils.translation import gettext_lazy as _
4
+
5
+ from netbox.forms import (
6
+ NetBoxModelBulkEditForm,
7
+ NetBoxModelFilterSetForm,
8
+ NetBoxModelImportForm,
9
+ NetBoxModelForm,
10
+ )
11
+ from utilities.forms.fields import (
12
+ TagFilterField,
13
+ CSVModelChoiceField,
14
+ DynamicModelChoiceField,
15
+ DynamicModelMultipleChoiceField,
16
+ )
17
+ from utilities.forms.rendering import FieldSet
18
+ from utilities.forms.widgets import HTMXSelect
19
+ from utilities.forms import add_blank_choice, get_field_value
20
+ from tenancy.models import Tenant, TenantGroup
21
+ from tenancy.forms import TenancyForm, TenancyFilterForm
22
+
23
+ from netbox_dns.models import DNSSECKeyTemplate, DNSSECPolicy
24
+ from netbox_dns.choices import (
25
+ DNSSECKeyTemplateTypeChoices,
26
+ DNSSECKeyTemplateAlgorithmChoices,
27
+ DNSSECKeyTemplateKeySizeChoices,
28
+ )
29
+ from netbox_dns.fields import TimePeriodField
30
+
31
+
32
+ __all__ = (
33
+ "DNSSECKeyTemplateForm",
34
+ "DNSSECKeyTemplateFilterForm",
35
+ "DNSSECKeyTemplateImportForm",
36
+ "DNSSECKeyTemplateBulkEditForm",
37
+ )
38
+
39
+
40
+ class DNSSECKeyTemplateForm(TenancyForm, NetBoxModelForm):
41
+ class Meta:
42
+ model = DNSSECKeyTemplate
43
+
44
+ fields = (
45
+ "name",
46
+ "description",
47
+ "type",
48
+ "lifetime",
49
+ "key_size",
50
+ "algorithm",
51
+ "tenant_group",
52
+ "tenant",
53
+ "tags",
54
+ )
55
+
56
+ widgets = {
57
+ "algorithm": HTMXSelect(),
58
+ }
59
+
60
+ fieldsets = (
61
+ FieldSet(
62
+ "name",
63
+ "description",
64
+ name=_("Attributes"),
65
+ ),
66
+ FieldSet(
67
+ "type",
68
+ "lifetime",
69
+ "algorithm",
70
+ "key_size",
71
+ name=_("Key Properties"),
72
+ ),
73
+ FieldSet(
74
+ "tenant_group",
75
+ "tenant",
76
+ name=_("Tenancy"),
77
+ ),
78
+ FieldSet(
79
+ "tags",
80
+ name=_("Tags"),
81
+ ),
82
+ )
83
+
84
+ def __init__(self, *args, **kwargs):
85
+ super().__init__(*args, **kwargs)
86
+
87
+ algorithm = get_field_value(self, "algorithm")
88
+ if algorithm != DNSSECKeyTemplateAlgorithmChoices.RSASHA256:
89
+ del self.fields["key_size"]
90
+
91
+ lifetime = TimePeriodField(
92
+ required=False,
93
+ )
94
+
95
+
96
+ class DNSSECKeyTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
97
+ model = DNSSECKeyTemplate
98
+
99
+ fieldsets = (
100
+ FieldSet(
101
+ "q",
102
+ "filter_id",
103
+ "tag",
104
+ ),
105
+ FieldSet(
106
+ "name",
107
+ "description",
108
+ name=_("Attributes"),
109
+ ),
110
+ FieldSet(
111
+ "policy_id",
112
+ name=_("Policies"),
113
+ ),
114
+ FieldSet(
115
+ "type",
116
+ "lifetime",
117
+ "algorithm",
118
+ "key_size",
119
+ name=_("Key Properties"),
120
+ ),
121
+ FieldSet(
122
+ "tenant_group_id",
123
+ "tenant_id",
124
+ name=_("Tenancy"),
125
+ ),
126
+ )
127
+
128
+ name = forms.CharField(
129
+ required=False,
130
+ )
131
+ description = forms.CharField(
132
+ required=False,
133
+ )
134
+ policy_id = DynamicModelMultipleChoiceField(
135
+ queryset=DNSSECPolicy.objects.all(),
136
+ required=False,
137
+ null_option=_("None"),
138
+ label=_("Policy"),
139
+ )
140
+ type = forms.MultipleChoiceField(
141
+ choices=DNSSECKeyTemplateTypeChoices,
142
+ required=False,
143
+ )
144
+ lifetime = TimePeriodField(
145
+ label=_("Lifetime"),
146
+ )
147
+ algorithm = forms.MultipleChoiceField(
148
+ choices=DNSSECKeyTemplateAlgorithmChoices,
149
+ required=False,
150
+ )
151
+ key_size = SimpleArrayField(
152
+ base_field=forms.ChoiceField(
153
+ choices=DNSSECKeyTemplateKeySizeChoices,
154
+ ),
155
+ required=False,
156
+ help_text=_("Enter a list of integer key sizes, separated by comma (,)"),
157
+ )
158
+ tag = TagFilterField(DNSSECKeyTemplate)
159
+
160
+
161
+ class DNSSECKeyTemplateImportForm(NetBoxModelImportForm):
162
+ class Meta:
163
+ model = DNSSECKeyTemplate
164
+
165
+ fields = (
166
+ "name",
167
+ "description",
168
+ "type",
169
+ "lifetime",
170
+ "algorithm",
171
+ "key_size",
172
+ "tenant",
173
+ "tags",
174
+ )
175
+
176
+ lifetime = TimePeriodField(
177
+ required=False,
178
+ label=_("Lifetime"),
179
+ )
180
+ tenant = CSVModelChoiceField(
181
+ queryset=Tenant.objects.all(),
182
+ to_field_name="name",
183
+ required=False,
184
+ label=_("Tenant"),
185
+ )
186
+
187
+
188
+ class DNSSECKeyTemplateBulkEditForm(NetBoxModelBulkEditForm):
189
+ model = DNSSECKeyTemplate
190
+
191
+ fieldsets = (
192
+ FieldSet(
193
+ "description",
194
+ name=_("Attributes"),
195
+ ),
196
+ FieldSet(
197
+ "type",
198
+ "lifetime",
199
+ "algorithm",
200
+ "key_size",
201
+ name=_("Key Properties"),
202
+ ),
203
+ FieldSet(
204
+ "tenant_group",
205
+ "tenant",
206
+ name=_("Tenancy"),
207
+ ),
208
+ )
209
+
210
+ nullable_fields = (
211
+ "description",
212
+ "tenant",
213
+ "lifetime",
214
+ "key_size",
215
+ )
216
+
217
+ description = forms.CharField(
218
+ max_length=200,
219
+ required=False,
220
+ label=_("Description"),
221
+ )
222
+ type = forms.ChoiceField(
223
+ choices=add_blank_choice(DNSSECKeyTemplateTypeChoices),
224
+ required=False,
225
+ label=_("Key Type"),
226
+ )
227
+ lifetime = TimePeriodField(
228
+ required=False,
229
+ label=_("Lifetime"),
230
+ )
231
+ algorithm = forms.ChoiceField(
232
+ choices=add_blank_choice(DNSSECKeyTemplateAlgorithmChoices),
233
+ required=False,
234
+ label=_("Algorithm"),
235
+ )
236
+ key_size = forms.ChoiceField(
237
+ choices=add_blank_choice(DNSSECKeyTemplateKeySizeChoices),
238
+ required=False,
239
+ label=_("Key Size"),
240
+ )
241
+ tenant_group = DynamicModelChoiceField(
242
+ queryset=TenantGroup.objects.all(),
243
+ required=False,
244
+ label=_("Tenant Group"),
245
+ )
246
+ tenant = DynamicModelChoiceField(
247
+ queryset=Tenant.objects.all(),
248
+ required=False,
249
+ label=_("Tenant"),
250
+ )