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,46 @@
1
+ import django_filters
2
+ from django.db.models import Q
3
+ from django.utils.translation import gettext as _
4
+
5
+ from netbox.filtersets import NetBoxModelFilterSet
6
+ from tenancy.filtersets import TenancyFilterSet
7
+
8
+ from netbox_dns.models import NameServer, Zone
9
+
10
+
11
+ __all__ = ("NameServerFilterSet",)
12
+
13
+
14
+ class NameServerFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
15
+ class Meta:
16
+ model = NameServer
17
+
18
+ fields = (
19
+ "id",
20
+ "name",
21
+ "description",
22
+ )
23
+
24
+ zone_id = django_filters.ModelMultipleChoiceFilter(
25
+ field_name="zones",
26
+ queryset=Zone.objects.all(),
27
+ to_field_name="id",
28
+ label=_("Zones"),
29
+ )
30
+ soa_zone_id = django_filters.ModelMultipleChoiceFilter(
31
+ method="filter_soa_zones",
32
+ queryset=Zone.objects.all(),
33
+ label=_("SOA Zones"),
34
+ )
35
+
36
+ def search(self, queryset, name, value):
37
+ if not value.strip():
38
+ return queryset
39
+ qs_filter = Q(Q(name__icontains=value) | Q(description__icontains=value))
40
+ return queryset.filter(qs_filter)
41
+
42
+ def filter_soa_zones(self, queryset, name, value):
43
+ if not value:
44
+ return queryset
45
+ soa_mnames = {zone.soa_mname.pk for zone in value}
46
+ return queryset.filter(pk__in=soa_mnames)
@@ -0,0 +1,135 @@
1
+ import netaddr
2
+
3
+ import django_filters
4
+ from django.db.models import Q
5
+ from django.utils.translation import gettext as _
6
+
7
+ from netbox.filtersets import NetBoxModelFilterSet
8
+ from tenancy.filtersets import TenancyFilterSet
9
+ from utilities.filters import MultiValueCharFilter
10
+
11
+ from ipam.models import IPAddress
12
+
13
+ from netbox_dns.models import View, Zone, Record
14
+ from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices
15
+ from netbox_dns.filters import TimePeriodFilter
16
+
17
+ __all__ = ("RecordFilterSet",)
18
+
19
+
20
+ class RecordFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
21
+ class Meta:
22
+ model = Record
23
+
24
+ fields = (
25
+ "id",
26
+ "name",
27
+ "fqdn",
28
+ "description",
29
+ "ttl",
30
+ "value",
31
+ "disable_ptr",
32
+ "managed",
33
+ )
34
+
35
+ fqdn = MultiValueCharFilter(
36
+ method="filter_fqdn",
37
+ )
38
+ ttl = TimePeriodFilter()
39
+ type = django_filters.MultipleChoiceFilter(
40
+ choices=RecordTypeChoices,
41
+ )
42
+ status = django_filters.MultipleChoiceFilter(
43
+ choices=RecordStatusChoices,
44
+ )
45
+ zone_id = django_filters.ModelMultipleChoiceFilter(
46
+ queryset=Zone.objects.all(),
47
+ label=_("Parent Zone ID"),
48
+ )
49
+ zone = django_filters.ModelMultipleChoiceFilter(
50
+ queryset=Zone.objects.all(),
51
+ field_name="zone__name",
52
+ to_field_name="name",
53
+ label=_("Parent Zone"),
54
+ )
55
+ view_id = django_filters.ModelMultipleChoiceFilter(
56
+ queryset=View.objects.all(),
57
+ field_name="zone__view",
58
+ label=_("ID of the View the Parent Zone belongs to"),
59
+ )
60
+ view = django_filters.ModelMultipleChoiceFilter(
61
+ queryset=View.objects.all(),
62
+ field_name="zone__view__name",
63
+ to_field_name="name",
64
+ label=_("View the Parent Zone belongs to"),
65
+ )
66
+ address_record_id = django_filters.ModelMultipleChoiceFilter(
67
+ field_name="address_records",
68
+ queryset=Record.objects.all(),
69
+ to_field_name="id",
70
+ label=_("Address Records"),
71
+ )
72
+ ptr_record_id = django_filters.ModelMultipleChoiceFilter(
73
+ field_name="ptr_record",
74
+ queryset=Record.objects.all(),
75
+ to_field_name="id",
76
+ label=_("Pointer Record"),
77
+ )
78
+ rfc2317_cname_record_id = django_filters.ModelMultipleChoiceFilter(
79
+ field_name="rfc2317_cname_record",
80
+ queryset=Record.objects.all(),
81
+ to_field_name="id",
82
+ label=_("Pointer Record"),
83
+ )
84
+ ipam_ip_address_id = django_filters.ModelMultipleChoiceFilter(
85
+ field_name="ipam_ip_address",
86
+ queryset=IPAddress.objects.all(),
87
+ to_field_name="id",
88
+ label=_("IPAM IP Address"),
89
+ )
90
+ ip_address = MultiValueCharFilter(
91
+ method="filter_ip_address",
92
+ label=_("IP Address"),
93
+ )
94
+ active = django_filters.BooleanFilter(
95
+ label=_("Record is active"),
96
+ )
97
+
98
+ managed = django_filters.BooleanFilter()
99
+
100
+ def filter_fqdn(self, queryset, name, value):
101
+ if not value:
102
+ return queryset
103
+
104
+ fqdns = []
105
+ for fqdn in value:
106
+ if not fqdn.endswith("."):
107
+ fqdn = fqdn + "."
108
+ fqdns.append(fqdn)
109
+
110
+ return queryset.filter(fqdn__in=fqdns)
111
+
112
+ def filter_ip_address(self, queryset, name, value):
113
+ if not value:
114
+ return queryset
115
+ try:
116
+ ip_addresses = [
117
+ str(netaddr.IPAddress(item)) for item in value if item.strip()
118
+ ]
119
+ if not ip_addresses:
120
+ return queryset
121
+
122
+ return queryset.filter(ip_address__in=ip_addresses)
123
+ except (netaddr.AddrFormatError, ValueError):
124
+ return queryset.none()
125
+
126
+ def search(self, queryset, name, value):
127
+ if not value.strip():
128
+ return queryset
129
+ qs_filter = (
130
+ Q(fqdn__icontains=value)
131
+ | Q(description__icontains=value)
132
+ | Q(value__icontains=value)
133
+ | Q(zone__name__icontains=value)
134
+ )
135
+ return queryset.filter(qs_filter)
@@ -0,0 +1,59 @@
1
+ import django_filters
2
+ from django.db.models import Q
3
+ from django.utils.translation import gettext as _
4
+
5
+ from netbox.filtersets import NetBoxModelFilterSet
6
+ from tenancy.filtersets import TenancyFilterSet
7
+
8
+ from netbox_dns.models import RecordTemplate, ZoneTemplate
9
+ from netbox_dns.choices import RecordTypeChoices, RecordStatusChoices
10
+ from netbox_dns.filters import TimePeriodFilter
11
+
12
+
13
+ __all__ = ("RecordTemplateFilterSet",)
14
+
15
+
16
+ class RecordTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
17
+ class Meta:
18
+ model = RecordTemplate
19
+
20
+ fields = (
21
+ "id",
22
+ "name",
23
+ "record_name",
24
+ "value",
25
+ "description",
26
+ "ttl",
27
+ "disable_ptr",
28
+ )
29
+
30
+ ttl = TimePeriodFilter()
31
+ type = django_filters.MultipleChoiceFilter(
32
+ choices=RecordTypeChoices,
33
+ )
34
+ status = django_filters.MultipleChoiceFilter(
35
+ choices=RecordStatusChoices,
36
+ )
37
+ zone_template = django_filters.ModelMultipleChoiceFilter(
38
+ queryset=ZoneTemplate.objects.all(),
39
+ field_name="zone_templates__name",
40
+ to_field_name="name",
41
+ label=_("Zone Template"),
42
+ )
43
+ zone_template_id = django_filters.ModelMultipleChoiceFilter(
44
+ queryset=ZoneTemplate.objects.all(),
45
+ field_name="zone_templates",
46
+ to_field_name="id",
47
+ label=_("Zone Template ID"),
48
+ )
49
+
50
+ def search(self, queryset, name, value):
51
+ if not value.strip():
52
+ return queryset
53
+ qs_filter = (
54
+ Q(name__icontains=value)
55
+ | Q(description__icontains=value)
56
+ | Q(record_name__icontains=value)
57
+ | Q(value__icontains=value)
58
+ )
59
+ return queryset.filter(qs_filter)
@@ -5,13 +5,19 @@ from netbox.filtersets import NetBoxModelFilterSet
5
5
  from netbox_dns.models import Registrar
6
6
 
7
7
 
8
- class RegistrarFilter(NetBoxModelFilterSet):
8
+ __all__ = ("RegistrarFilterSet",)
9
+
10
+
11
+ class RegistrarFilterSet(NetBoxModelFilterSet):
9
12
  class Meta:
10
13
  model = Registrar
14
+
11
15
  fields = (
12
16
  "id",
13
17
  "name",
18
+ "description",
14
19
  "iana_id",
20
+ "address",
15
21
  "referral_url",
16
22
  "whois_server",
17
23
  "abuse_email",
@@ -23,6 +29,7 @@ class RegistrarFilter(NetBoxModelFilterSet):
23
29
  return queryset
24
30
  qs_filter = (
25
31
  Q(name__icontains=value)
32
+ | Q(description__icontains=value)
26
33
  | Q(iana_id=value)
27
34
  | Q(referral_url__icontains=value)
28
35
  | Q(whois_server__icontains=value)
@@ -2,15 +2,20 @@ from django.db.models import Q
2
2
 
3
3
  from netbox.filtersets import NetBoxModelFilterSet
4
4
 
5
- from netbox_dns.models import Contact
5
+ from netbox_dns.models import RegistrationContact
6
6
 
7
7
 
8
- class ContactFilter(NetBoxModelFilterSet):
8
+ __all__ = ("RegistrationContactFilterSet",)
9
+
10
+
11
+ class RegistrationContactFilterSet(NetBoxModelFilterSet):
9
12
  class Meta:
10
- model = Contact
13
+ model = RegistrationContact
14
+
11
15
  fields = (
12
16
  "id",
13
17
  "name",
18
+ "description",
14
19
  "contact_id",
15
20
  "organization",
16
21
  "street",
@@ -30,6 +35,7 @@ class ContactFilter(NetBoxModelFilterSet):
30
35
  return queryset
31
36
  qs_filter = (
32
37
  Q(name__icontains=value)
38
+ | Q(description__icontains=value)
33
39
  | Q(contact_id__icontains=value)
34
40
  | Q(organization__icontains=value)
35
41
  | Q(city__icontains=value)
@@ -0,0 +1,45 @@
1
+ import django_filters
2
+
3
+ from django.db.models import Q
4
+ from django.utils.translation import gettext as _
5
+
6
+ from netbox.filtersets import NetBoxModelFilterSet
7
+ from tenancy.filtersets import TenancyFilterSet
8
+ from ipam.models import Prefix
9
+
10
+ from netbox_dns.models import View
11
+
12
+
13
+ __all__ = ("ViewFilterSet",)
14
+
15
+
16
+ class ViewFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
17
+ class Meta:
18
+ model = View
19
+
20
+ fields = (
21
+ "id",
22
+ "name",
23
+ "default_view",
24
+ "description",
25
+ )
26
+
27
+ prefix_id = django_filters.ModelMultipleChoiceFilter(
28
+ queryset=Prefix.objects.all(),
29
+ field_name="prefixes",
30
+ to_field_name="id",
31
+ label=_("Prefix ID"),
32
+ )
33
+ prefix = django_filters.ModelMultipleChoiceFilter(
34
+ queryset=Prefix.objects.all(),
35
+ field_name="prefixes__prefix",
36
+ to_field_name="prefix",
37
+ label=_("Prefix"),
38
+ )
39
+
40
+ def search(self, queryset, name, value):
41
+ if not value.strip():
42
+ return queryset
43
+ qs_filter = Q(Q(name__icontains=value) | Q(description__icontains=value))
44
+
45
+ return queryset.filter(qs_filter)
@@ -0,0 +1,254 @@
1
+ import netaddr
2
+ from netaddr.core import AddrFormatError
3
+
4
+ import django_filters
5
+ from django.db.models import Q
6
+ from django.utils.translation import gettext as _
7
+
8
+ from netbox.filtersets import NetBoxModelFilterSet
9
+ from tenancy.filtersets import TenancyFilterSet
10
+ from utilities.filters import MultiValueCharFilter
11
+
12
+ from netbox_dns.models import (
13
+ View,
14
+ Zone,
15
+ Registrar,
16
+ RegistrationContact,
17
+ NameServer,
18
+ DNSSECPolicy,
19
+ )
20
+ from netbox_dns.choices import ZoneStatusChoices, ZoneEPPStatusChoices
21
+ from netbox_dns.filters import TimePeriodFilter
22
+
23
+ __all__ = ("ZoneFilterSet",)
24
+
25
+
26
+ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
27
+ class Meta:
28
+ model = Zone
29
+
30
+ fields = (
31
+ "id",
32
+ "name",
33
+ "description",
34
+ "soa_rname",
35
+ "soa_serial",
36
+ "soa_serial_auto",
37
+ "rfc2317_parent_managed",
38
+ "registry_domain_id",
39
+ "domain_status",
40
+ "inline_signing",
41
+ )
42
+
43
+ status = django_filters.MultipleChoiceFilter(
44
+ choices=ZoneStatusChoices,
45
+ )
46
+ view_id = django_filters.ModelMultipleChoiceFilter(
47
+ queryset=View.objects.all(),
48
+ label=_("View ID"),
49
+ )
50
+ view = django_filters.ModelMultipleChoiceFilter(
51
+ queryset=View.objects.all(),
52
+ field_name="view__name",
53
+ to_field_name="name",
54
+ label=_("View"),
55
+ )
56
+ nameserver_id = django_filters.ModelMultipleChoiceFilter(
57
+ queryset=NameServer.objects.all(),
58
+ field_name="nameservers",
59
+ to_field_name="id",
60
+ label=_("Nameservers ID"),
61
+ )
62
+ nameserver = django_filters.ModelMultipleChoiceFilter(
63
+ queryset=NameServer.objects.all(),
64
+ field_name="nameservers__name",
65
+ to_field_name="name",
66
+ label=_("Nameserver"),
67
+ )
68
+ default_ttl = TimePeriodFilter()
69
+ soa_mname_id = django_filters.ModelMultipleChoiceFilter(
70
+ queryset=NameServer.objects.all(),
71
+ label=_("SOA MName ID"),
72
+ )
73
+ soa_mname = django_filters.ModelMultipleChoiceFilter(
74
+ queryset=NameServer.objects.all(),
75
+ field_name="soa_mname__name",
76
+ to_field_name="name",
77
+ label=_("SOA MName"),
78
+ )
79
+ soa_ttl = TimePeriodFilter()
80
+ soa_refresh = TimePeriodFilter()
81
+ soa_retry = TimePeriodFilter()
82
+ soa_expire = TimePeriodFilter()
83
+ soa_minimum = TimePeriodFilter()
84
+ dnssec_policy_id = django_filters.ModelMultipleChoiceFilter(
85
+ queryset=DNSSECPolicy.objects.all(),
86
+ label=_("DNSSEC Policy ID"),
87
+ )
88
+ dnssec_policy = django_filters.ModelMultipleChoiceFilter(
89
+ queryset=DNSSECPolicy.objects.all(),
90
+ field_name="dnssec_policy__name",
91
+ to_field_name="name",
92
+ label=_("DNSSEC Policy"),
93
+ )
94
+ parental_agents = MultiValueCharFilter(
95
+ method="filter_parental_agents",
96
+ label=_("Parental Agents"),
97
+ )
98
+ rfc2317_prefix = MultiValueCharFilter(
99
+ method="filter_rfc2317_prefix",
100
+ label=_("RFC2317 Prefix"),
101
+ )
102
+ rfc2317_parent_zone_id = django_filters.ModelMultipleChoiceFilter(
103
+ queryset=Zone.objects.all(),
104
+ field_name="rfc2317_parent_zone",
105
+ to_field_name="id",
106
+ label=_("RFC2317 Parent Zone"),
107
+ )
108
+ rfc2317_parent_zone = django_filters.ModelMultipleChoiceFilter(
109
+ queryset=Zone.objects.all(),
110
+ field_name="rfc2317_parent_zone__name",
111
+ to_field_name="name",
112
+ label=_("RFC2317 Parent Zone"),
113
+ )
114
+ registrar_id = django_filters.ModelMultipleChoiceFilter(
115
+ queryset=Registrar.objects.all(),
116
+ label=_("Registrar ID"),
117
+ )
118
+ registrar = django_filters.ModelMultipleChoiceFilter(
119
+ queryset=Registrar.objects.all(),
120
+ field_name="registrar__name",
121
+ to_field_name="name",
122
+ label=_("Registrar"),
123
+ )
124
+ expiration_date = django_filters.DateFromToRangeFilter()
125
+ domain_status = django_filters.MultipleChoiceFilter(
126
+ choices=ZoneEPPStatusChoices,
127
+ )
128
+ registrant_id = django_filters.ModelMultipleChoiceFilter(
129
+ queryset=RegistrationContact.objects.all(),
130
+ label=_("Registrant ID"),
131
+ )
132
+ registrant = django_filters.ModelMultipleChoiceFilter(
133
+ queryset=RegistrationContact.objects.all(),
134
+ field_name="registrant__contact_id",
135
+ to_field_name="contact_id",
136
+ label=_("Registrant"),
137
+ )
138
+ admin_c_id = django_filters.ModelMultipleChoiceFilter(
139
+ queryset=RegistrationContact.objects.all(),
140
+ label=_("Administrative Contact ID"),
141
+ )
142
+ admin_c = django_filters.ModelMultipleChoiceFilter(
143
+ queryset=RegistrationContact.objects.all(),
144
+ field_name="admin_c__contact_id",
145
+ to_field_name="contact_id",
146
+ label=_("Administrative Contact"),
147
+ )
148
+ tech_c_id = django_filters.ModelMultipleChoiceFilter(
149
+ queryset=RegistrationContact.objects.all(),
150
+ label=_("Technical Contact ID"),
151
+ )
152
+ tech_c = django_filters.ModelMultipleChoiceFilter(
153
+ queryset=RegistrationContact.objects.all(),
154
+ field_name="tech_c__contact_id",
155
+ to_field_name="contact_id",
156
+ label=_("Technical Contact"),
157
+ )
158
+ billing_c_id = django_filters.ModelMultipleChoiceFilter(
159
+ queryset=RegistrationContact.objects.all(),
160
+ label=_("Billing Contact ID"),
161
+ )
162
+ billing_c = django_filters.ModelMultipleChoiceFilter(
163
+ queryset=RegistrationContact.objects.all(),
164
+ field_name="billing_c__contact_id",
165
+ to_field_name="contact_id",
166
+ label=_("Billing Contact"),
167
+ )
168
+ arpa_network = MultiValueCharFilter(
169
+ method="filter_arpa_network",
170
+ label=_("ARPA Network"),
171
+ )
172
+ active = django_filters.BooleanFilter(
173
+ label=_("Zone is active"),
174
+ )
175
+ inline_signing = django_filters.BooleanFilter(
176
+ label=_("Zone is using a DNSSEC policy with inline signing"),
177
+ method="filter_inline_signing",
178
+ )
179
+
180
+ def filter_parental_agents(self, queryset, name, value):
181
+ if not value:
182
+ return queryset
183
+
184
+ query_values = []
185
+ for v in value:
186
+ try:
187
+ query_values.append(str(netaddr.IPAddress(v)))
188
+ except (AddrFormatError, ValueError):
189
+ pass
190
+
191
+ return queryset.filter(parental_agents__overlap=query_values)
192
+
193
+ def filter_arpa_network(self, queryset, name, value):
194
+ if not value:
195
+ return queryset
196
+ try:
197
+ arpa_networks = [
198
+ str(netaddr.IPNetwork(item)) for item in value if item.strip()
199
+ ]
200
+ if not arpa_networks:
201
+ return queryset
202
+ return queryset.filter(arpa_network__in=arpa_networks)
203
+
204
+ except (netaddr.AddrFormatError, ValueError):
205
+ return queryset.none()
206
+
207
+ def filter_rfc2317_prefix(self, queryset, name, value):
208
+ if not value:
209
+ return queryset
210
+ try:
211
+ rfc2317_prefixes = [
212
+ str(netaddr.IPNetwork(item)) for item in value if item.strip()
213
+ ]
214
+ if not rfc2317_prefixes:
215
+ return queryset
216
+ return queryset.filter(rfc2317_prefix__in=rfc2317_prefixes)
217
+
218
+ except (netaddr.AddrFormatError, ValueError):
219
+ return queryset.none()
220
+
221
+ def filter_inline_signing(self, queryset, name, value):
222
+ if value is None:
223
+ return queryset
224
+
225
+ if value:
226
+ return queryset.filter(
227
+ dnssec_policy__isnull=False, dnssec_policy__inline_signing=True
228
+ )
229
+ else:
230
+ return queryset.filter(
231
+ Q(
232
+ Q(dnssec_policy__isnull=True)
233
+ | Q(dnssec_policy__inline_signing=False)
234
+ )
235
+ )
236
+
237
+ def search(self, queryset, name, value):
238
+ if not value.strip():
239
+ return queryset
240
+ qs_filter = (
241
+ Q(name__icontains=value)
242
+ | Q(description__icontains=value)
243
+ | Q(status__icontains=value)
244
+ | Q(view__name__icontains=value)
245
+ | Q(dnssec_policy__name__icontains=value)
246
+ | Q(registrar__name__icontains=value)
247
+ | Q(registry_domain_id__icontains=value)
248
+ | Q(registrant__name__icontains=value)
249
+ | Q(admin_c__name__icontains=value)
250
+ | Q(tech_c__name__icontains=value)
251
+ | Q(billing_c__name__icontains=value)
252
+ | Q(comments__icontains=value)
253
+ )
254
+ return queryset.filter(qs_filter)