netbox-plugin-dns 1.3b1__py3-none-any.whl → 1.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of netbox-plugin-dns might be problematic. Click here for more details.

Files changed (73) hide show
  1. netbox_dns/__init__.py +3 -2
  2. netbox_dns/api/nested_serializers.py +54 -49
  3. netbox_dns/api/serializers_/dnssec_key_template.py +22 -13
  4. netbox_dns/api/serializers_/dnssec_policy.py +89 -40
  5. netbox_dns/api/serializers_/nameserver.py +25 -13
  6. netbox_dns/api/serializers_/record.py +46 -38
  7. netbox_dns/api/serializers_/record_template.py +21 -12
  8. netbox_dns/api/serializers_/registrar.py +14 -5
  9. netbox_dns/api/serializers_/registration_contact.py +13 -5
  10. netbox_dns/api/serializers_/view.py +28 -19
  11. netbox_dns/api/serializers_/zone.py +87 -62
  12. netbox_dns/api/serializers_/zone_template.py +40 -34
  13. netbox_dns/choices/dnssec_key_template.py +4 -0
  14. netbox_dns/choices/record.py +4 -2
  15. netbox_dns/filtersets/dnssec_key_template.py +10 -4
  16. netbox_dns/filtersets/dnssec_policy.py +2 -0
  17. netbox_dns/filtersets/nameserver.py +9 -4
  18. netbox_dns/filtersets/record.py +16 -15
  19. netbox_dns/filtersets/record_template.py +13 -12
  20. netbox_dns/filtersets/registrar.py +1 -0
  21. netbox_dns/filtersets/registration_contact.py +1 -0
  22. netbox_dns/filtersets/view.py +10 -4
  23. netbox_dns/filtersets/zone.py +39 -20
  24. netbox_dns/filtersets/zone_template.py +10 -9
  25. netbox_dns/forms/dnssec_key_template.py +97 -46
  26. netbox_dns/forms/dnssec_policy.py +124 -105
  27. netbox_dns/forms/nameserver.py +71 -36
  28. netbox_dns/forms/record.py +96 -78
  29. netbox_dns/forms/record_template.py +87 -59
  30. netbox_dns/forms/registrar.py +55 -39
  31. netbox_dns/forms/registration_contact.py +64 -41
  32. netbox_dns/forms/view.py +98 -51
  33. netbox_dns/forms/zone.py +273 -243
  34. netbox_dns/forms/zone_template.py +151 -101
  35. netbox_dns/graphql/types.py +3 -3
  36. netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
  37. netbox_dns/locale/fr/LC_MESSAGES/django.mo +0 -0
  38. netbox_dns/migrations/0019_dnssecpolicy_parental_agents.py +25 -0
  39. netbox_dns/migrations/0020_remove_dnssecpolicy_parental_agents_and_more.py +29 -0
  40. netbox_dns/migrations/0021_alter_record_ptr_record.py +25 -0
  41. netbox_dns/models/dnssec_key_template.py +24 -22
  42. netbox_dns/models/dnssec_policy.py +17 -16
  43. netbox_dns/models/nameserver.py +26 -25
  44. netbox_dns/models/record.py +117 -61
  45. netbox_dns/models/record_template.py +30 -29
  46. netbox_dns/models/registrar.py +13 -12
  47. netbox_dns/models/registration_contact.py +33 -32
  48. netbox_dns/models/view.py +16 -15
  49. netbox_dns/models/zone.py +88 -57
  50. netbox_dns/models/zone_template.py +35 -34
  51. netbox_dns/tables/dnssec_key_template.py +13 -12
  52. netbox_dns/tables/dnssec_policy.py +18 -15
  53. netbox_dns/tables/nameserver.py +10 -8
  54. netbox_dns/tables/record.py +55 -34
  55. netbox_dns/tables/record_template.py +21 -17
  56. netbox_dns/tables/registrar.py +15 -9
  57. netbox_dns/tables/registration_contact.py +15 -9
  58. netbox_dns/tables/view.py +25 -12
  59. netbox_dns/tables/zone.py +23 -21
  60. netbox_dns/tables/zone_template.py +17 -13
  61. netbox_dns/template_content.py +13 -2
  62. netbox_dns/templates/netbox_dns/record.html +13 -11
  63. netbox_dns/templates/netbox_dns/zone.html +10 -0
  64. netbox_dns/validators/dns_name.py +1 -1
  65. netbox_dns/views/dnssec_key_template.py +3 -3
  66. netbox_dns/views/record.py +19 -3
  67. netbox_dns/views/record_template.py +3 -1
  68. netbox_dns/views/zone_template.py +5 -3
  69. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/METADATA +3 -2
  70. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/RECORD +73 -70
  71. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/WHEEL +1 -1
  72. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/licenses/LICENSE +0 -0
  73. {netbox_plugin_dns-1.3b1.dist-info → netbox_plugin_dns-1.3.1.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,34 @@ __all__ = ("ViewSerializer",)
12
12
 
13
13
 
14
14
  class ViewSerializer(NetBoxModelSerializer):
15
+ class Meta:
16
+ model = View
17
+
18
+ fields = (
19
+ "id",
20
+ "url",
21
+ "display",
22
+ "name",
23
+ "default_view",
24
+ "tags",
25
+ "description",
26
+ "created",
27
+ "last_updated",
28
+ "custom_fields",
29
+ "tenant",
30
+ "prefixes",
31
+ "ip_address_filter",
32
+ )
33
+
34
+ brief_fields = (
35
+ "id",
36
+ "url",
37
+ "display",
38
+ "name",
39
+ "default_view",
40
+ "description",
41
+ )
42
+
15
43
  url = serializers.HyperlinkedIdentityField(
16
44
  view_name="plugins-api:netbox_dns-api:view-detail"
17
45
  )
@@ -50,22 +78,3 @@ class ViewSerializer(NetBoxModelSerializer):
50
78
  view.prefixes.set(prefixes)
51
79
 
52
80
  return view
53
-
54
- class Meta:
55
- model = View
56
- fields = (
57
- "id",
58
- "url",
59
- "display",
60
- "name",
61
- "default_view",
62
- "tags",
63
- "description",
64
- "created",
65
- "last_updated",
66
- "custom_fields",
67
- "tenant",
68
- "prefixes",
69
- "ip_address_filter",
70
- )
71
- brief_fields = ("id", "url", "display", "name", "default_view", "description")
@@ -21,6 +21,64 @@ __all__ = ("ZoneSerializer",)
21
21
 
22
22
 
23
23
  class ZoneSerializer(NetBoxModelSerializer):
24
+ class Meta:
25
+ model = Zone
26
+
27
+ fields = (
28
+ "id",
29
+ "url",
30
+ "name",
31
+ "view",
32
+ "display",
33
+ "nameservers",
34
+ "status",
35
+ "description",
36
+ "tags",
37
+ "created",
38
+ "last_updated",
39
+ "default_ttl",
40
+ "soa_ttl",
41
+ "soa_mname",
42
+ "soa_rname",
43
+ "soa_serial",
44
+ "soa_serial_auto",
45
+ "soa_refresh",
46
+ "soa_retry",
47
+ "soa_expire",
48
+ "soa_minimum",
49
+ "rfc2317_prefix",
50
+ "rfc2317_parent_managed",
51
+ "rfc2317_parent_zone",
52
+ "rfc2317_child_zones",
53
+ "dnssec_policy",
54
+ "inline_signing",
55
+ "parental_agents",
56
+ "registrar",
57
+ "registry_domain_id",
58
+ "expiration_date",
59
+ "domain_status",
60
+ "registrant",
61
+ "tech_c",
62
+ "admin_c",
63
+ "billing_c",
64
+ "active",
65
+ "custom_fields",
66
+ "tenant",
67
+ "template",
68
+ )
69
+
70
+ brief_fields = (
71
+ "id",
72
+ "url",
73
+ "name",
74
+ "view",
75
+ "display",
76
+ "status",
77
+ "description",
78
+ "rfc2317_prefix",
79
+ "active",
80
+ )
81
+
24
82
  url = serializers.HyperlinkedIdentityField(
25
83
  view_name="plugins-api:netbox_dns-api:zone-detail"
26
84
  )
@@ -39,8 +97,14 @@ class ZoneSerializer(NetBoxModelSerializer):
39
97
  required=False,
40
98
  help_text=_("Nameservers for the zone"),
41
99
  )
42
- default_ttl = TimePeriodField(required=False, allow_null=True)
43
- soa_ttl = TimePeriodField(required=False, allow_null=True)
100
+ default_ttl = TimePeriodField(
101
+ required=False,
102
+ allow_null=True,
103
+ )
104
+ soa_ttl = TimePeriodField(
105
+ required=False,
106
+ allow_null=True,
107
+ )
44
108
  soa_mname = NameServerSerializer(
45
109
  nested=True,
46
110
  many=False,
@@ -54,10 +118,22 @@ class ZoneSerializer(NetBoxModelSerializer):
54
118
  required=False,
55
119
  help_text=_("Contact email for the zone"),
56
120
  )
57
- soa_refresh = TimePeriodField(required=False, allow_null=True)
58
- soa_retry = TimePeriodField(required=False, allow_null=True)
59
- soa_expire = TimePeriodField(required=False, allow_null=True)
60
- soa_minimum = TimePeriodField(required=False, allow_null=True)
121
+ soa_refresh = TimePeriodField(
122
+ required=False,
123
+ allow_null=True,
124
+ )
125
+ soa_retry = TimePeriodField(
126
+ required=False,
127
+ allow_null=True,
128
+ )
129
+ soa_expire = TimePeriodField(
130
+ required=False,
131
+ allow_null=True,
132
+ )
133
+ soa_minimum = TimePeriodField(
134
+ required=False,
135
+ allow_null=True,
136
+ )
61
137
  rfc2317_parent_zone = NestedZoneSerializer(
62
138
  many=False,
63
139
  read_only=True,
@@ -124,7 +200,11 @@ class ZoneSerializer(NetBoxModelSerializer):
124
200
  read_only=True,
125
201
  allow_null=True,
126
202
  )
127
- tenant = TenantSerializer(nested=True, required=False, allow_null=True)
203
+ tenant = TenantSerializer(
204
+ nested=True,
205
+ required=False,
206
+ allow_null=True,
207
+ )
128
208
 
129
209
  def validate(self, data):
130
210
  if isinstance(data, dict) and (template := data.get("template")) is not None:
@@ -159,58 +239,3 @@ class ZoneSerializer(NetBoxModelSerializer):
159
239
  template.apply_to_zone_relations(zone)
160
240
 
161
241
  return zone
162
-
163
- class Meta:
164
- model = Zone
165
- fields = (
166
- "id",
167
- "url",
168
- "name",
169
- "view",
170
- "display",
171
- "nameservers",
172
- "status",
173
- "description",
174
- "tags",
175
- "created",
176
- "last_updated",
177
- "default_ttl",
178
- "soa_ttl",
179
- "soa_mname",
180
- "soa_rname",
181
- "soa_serial",
182
- "soa_serial_auto",
183
- "soa_refresh",
184
- "soa_retry",
185
- "soa_expire",
186
- "soa_minimum",
187
- "rfc2317_prefix",
188
- "rfc2317_parent_managed",
189
- "rfc2317_parent_zone",
190
- "rfc2317_child_zones",
191
- "dnssec_policy",
192
- "inline_signing",
193
- "registrar",
194
- "registry_domain_id",
195
- "expiration_date",
196
- "domain_status",
197
- "registrant",
198
- "tech_c",
199
- "admin_c",
200
- "billing_c",
201
- "active",
202
- "custom_fields",
203
- "tenant",
204
- "template",
205
- )
206
- brief_fields = (
207
- "id",
208
- "url",
209
- "name",
210
- "view",
211
- "display",
212
- "status",
213
- "description",
214
- "rfc2317_prefix",
215
- "active",
216
- )
@@ -17,6 +17,41 @@ __all__ = ("ZoneTemplateSerializer",)
17
17
 
18
18
 
19
19
  class ZoneTemplateSerializer(NetBoxModelSerializer):
20
+ class Meta:
21
+ model = ZoneTemplate
22
+
23
+ fields = (
24
+ "id",
25
+ "url",
26
+ "name",
27
+ "description",
28
+ "display",
29
+ "nameservers",
30
+ "soa_mname",
31
+ "soa_rname",
32
+ "dnssec_policy",
33
+ "registrar",
34
+ "registrant",
35
+ "tech_c",
36
+ "admin_c",
37
+ "billing_c",
38
+ "active",
39
+ "tags",
40
+ "created",
41
+ "last_updated",
42
+ "custom_fields",
43
+ "tenant",
44
+ "record_templates",
45
+ )
46
+
47
+ brief_fields = (
48
+ "id",
49
+ "url",
50
+ "name",
51
+ "display",
52
+ "description",
53
+ )
54
+
20
55
  url = serializers.HyperlinkedIdentityField(
21
56
  view_name="plugins-api:netbox_dns-api:zonetemplate-detail"
22
57
  )
@@ -87,7 +122,11 @@ class ZoneTemplateSerializer(NetBoxModelSerializer):
87
122
  read_only=True,
88
123
  allow_null=True,
89
124
  )
90
- tenant = TenantSerializer(nested=True, required=False, allow_null=True)
125
+ tenant = TenantSerializer(
126
+ nested=True,
127
+ required=False,
128
+ allow_null=True,
129
+ )
91
130
 
92
131
  def create(self, validated_data):
93
132
  nameservers = validated_data.pop("nameservers", None)
@@ -114,36 +153,3 @@ class ZoneTemplateSerializer(NetBoxModelSerializer):
114
153
  zone_template.record_templates.set(record_templates)
115
154
 
116
155
  return zone_template
117
-
118
- class Meta:
119
- model = ZoneTemplate
120
- fields = (
121
- "id",
122
- "url",
123
- "name",
124
- "description",
125
- "display",
126
- "nameservers",
127
- "soa_mname",
128
- "soa_rname",
129
- "dnssec_policy",
130
- "registrar",
131
- "registrant",
132
- "tech_c",
133
- "admin_c",
134
- "billing_c",
135
- "active",
136
- "tags",
137
- "created",
138
- "last_updated",
139
- "custom_fields",
140
- "tenant",
141
- "record_templates",
142
- )
143
- brief_fields = (
144
- "id",
145
- "url",
146
- "name",
147
- "display",
148
- "description",
149
- )
@@ -53,6 +53,10 @@ class DNSSECKeyTemplateKeySizeChoices(ChoiceSet):
53
53
  (SIZE_4096, 4096),
54
54
  ]
55
55
 
56
+ @classmethod
57
+ def as_enum(cls):
58
+ return super().as_enum(prefix="SIZE")
59
+
56
60
 
57
61
  @initialize_choice_names
58
62
  class DNSSECKeyTemplateAlgorithmChoices(ChoiceSet):
@@ -17,8 +17,10 @@ __all__ = (
17
17
 
18
18
 
19
19
  def _get_config_option(option_name):
20
- return get_plugin_config("netbox_dns", option_name, []) + get_plugin_config(
21
- "netbox_dns", f"{option_name}+", []
20
+ return list(
21
+ set(get_plugin_config("netbox_dns", option_name, []))
22
+ | set(get_plugin_config("netbox_dns", f"{option_name}+", []))
23
+ - set(get_plugin_config("netbox_dns", f"{option_name}-", []))
22
24
  )
23
25
 
24
26
 
@@ -17,6 +17,16 @@ __all__ = ("DNSSECKeyTemplateFilterSet",)
17
17
 
18
18
 
19
19
  class DNSSECKeyTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
20
+ class Meta:
21
+ model = DNSSECKeyTemplate
22
+
23
+ fields = (
24
+ "id",
25
+ "name",
26
+ "description",
27
+ "lifetime",
28
+ )
29
+
20
30
  type = django_filters.MultipleChoiceFilter(
21
31
  choices=DNSSECKeyTemplateTypeChoices,
22
32
  )
@@ -40,10 +50,6 @@ class DNSSECKeyTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
40
50
  label=_("DNSSEC Policies"),
41
51
  )
42
52
 
43
- class Meta:
44
- model = DNSSECKeyTemplate
45
- fields = ("id", "name", "description", "lifetime")
46
-
47
53
  def search(self, queryset, name, value):
48
54
  if not value.strip():
49
55
  return queryset
@@ -10,12 +10,14 @@ from utilities.filters import MultiValueCharFilter
10
10
  from netbox_dns.models import DNSSECPolicy, DNSSECKeyTemplate, Zone, ZoneTemplate
11
11
  from netbox_dns.choices import DNSSECPolicyStatusChoices
12
12
 
13
+
13
14
  __all__ = ("DNSSECPolicyFilterSet",)
14
15
 
15
16
 
16
17
  class DNSSECPolicyFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
17
18
  class Meta:
18
19
  model = DNSSECPolicy
20
+
19
21
  fields = (
20
22
  "id",
21
23
  "name",
@@ -12,6 +12,15 @@ __all__ = ("NameServerFilterSet",)
12
12
 
13
13
 
14
14
  class NameServerFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
15
+ class Meta:
16
+ model = NameServer
17
+
18
+ fields = (
19
+ "id",
20
+ "name",
21
+ "description",
22
+ )
23
+
15
24
  zone_id = django_filters.ModelMultipleChoiceFilter(
16
25
  field_name="zones",
17
26
  queryset=Zone.objects.all(),
@@ -24,10 +33,6 @@ class NameServerFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
24
33
  label=_("SOA Zones"),
25
34
  )
26
35
 
27
- class Meta:
28
- model = NameServer
29
- fields = ("id", "name", "description")
30
-
31
36
  def search(self, queryset, name, value):
32
37
  if not value.strip():
33
38
  return queryset
@@ -18,6 +18,20 @@ __all__ = ("RecordFilterSet",)
18
18
 
19
19
 
20
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
+
21
35
  fqdn = MultiValueCharFilter(
22
36
  method="filter_fqdn",
23
37
  )
@@ -49,10 +63,10 @@ class RecordFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
49
63
  label=_("View the Parent Zone belongs to"),
50
64
  )
51
65
  address_record_id = django_filters.ModelMultipleChoiceFilter(
52
- field_name="address_record",
66
+ field_name="address_records",
53
67
  queryset=Record.objects.all(),
54
68
  to_field_name="id",
55
- label=_("Address Record"),
69
+ label=_("Address Records"),
56
70
  )
57
71
  ptr_record_id = django_filters.ModelMultipleChoiceFilter(
58
72
  field_name="ptr_record",
@@ -82,19 +96,6 @@ class RecordFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
82
96
 
83
97
  managed = django_filters.BooleanFilter()
84
98
 
85
- class Meta:
86
- model = Record
87
- fields = (
88
- "id",
89
- "name",
90
- "fqdn",
91
- "description",
92
- "ttl",
93
- "value",
94
- "disable_ptr",
95
- "managed",
96
- )
97
-
98
99
  def filter_fqdn(self, queryset, name, value):
99
100
  if not value:
100
101
  return queryset
@@ -13,6 +13,19 @@ __all__ = ("RecordTemplateFilterSet",)
13
13
 
14
14
 
15
15
  class RecordTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
16
+ class Meta:
17
+ model = RecordTemplate
18
+
19
+ fields = (
20
+ "id",
21
+ "name",
22
+ "record_name",
23
+ "value",
24
+ "description",
25
+ "ttl",
26
+ "disable_ptr",
27
+ )
28
+
16
29
  type = django_filters.MultipleChoiceFilter(
17
30
  choices=RecordTypeChoices,
18
31
  )
@@ -32,18 +45,6 @@ class RecordTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
32
45
  label=_("Zone Template ID"),
33
46
  )
34
47
 
35
- class Meta:
36
- model = RecordTemplate
37
- fields = (
38
- "id",
39
- "name",
40
- "record_name",
41
- "value",
42
- "description",
43
- "ttl",
44
- "disable_ptr",
45
- )
46
-
47
48
  def search(self, queryset, name, value):
48
49
  if not value.strip():
49
50
  return queryset
@@ -11,6 +11,7 @@ __all__ = ("RegistrarFilterSet",)
11
11
  class RegistrarFilterSet(NetBoxModelFilterSet):
12
12
  class Meta:
13
13
  model = Registrar
14
+
14
15
  fields = (
15
16
  "id",
16
17
  "name",
@@ -11,6 +11,7 @@ __all__ = ("RegistrationContactFilterSet",)
11
11
  class RegistrationContactFilterSet(NetBoxModelFilterSet):
12
12
  class Meta:
13
13
  model = RegistrationContact
14
+
14
15
  fields = (
15
16
  "id",
16
17
  "name",
@@ -14,6 +14,16 @@ __all__ = ("ViewFilterSet",)
14
14
 
15
15
 
16
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
+
17
27
  prefix_id = django_filters.ModelMultipleChoiceFilter(
18
28
  queryset=Prefix.objects.all(),
19
29
  field_name="prefixes",
@@ -27,10 +37,6 @@ class ViewFilterSet(NetBoxModelFilterSet, TenancyFilterSet):
27
37
  label=_("Prefix"),
28
38
  )
29
39
 
30
- class Meta:
31
- model = View
32
- fields = ("id", "name", "default_view", "description")
33
-
34
40
  def search(self, queryset, name, value):
35
41
  if not value.strip():
36
42
  return queryset
@@ -1,4 +1,5 @@
1
1
  import netaddr
2
+ from netaddr.core import AddrFormatError
2
3
 
3
4
  import django_filters
4
5
  from django.db.models import Q
@@ -23,6 +24,28 @@ __all__ = ("ZoneFilterSet",)
23
24
 
24
25
 
25
26
  class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
27
+ class Meta:
28
+ model = Zone
29
+
30
+ fields = (
31
+ "id",
32
+ "name",
33
+ "description",
34
+ "default_ttl",
35
+ "soa_ttl",
36
+ "soa_rname",
37
+ "soa_serial",
38
+ "soa_refresh",
39
+ "soa_retry",
40
+ "soa_expire",
41
+ "soa_minimum",
42
+ "soa_serial_auto",
43
+ "rfc2317_parent_managed",
44
+ "inline_signing",
45
+ "registry_domain_id",
46
+ "domain_status",
47
+ )
48
+
26
49
  status = django_filters.MultipleChoiceFilter(
27
50
  choices=ZoneStatusChoices,
28
51
  )
@@ -68,6 +91,10 @@ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
68
91
  to_field_name="name",
69
92
  label=_("DNSSEC Policy"),
70
93
  )
94
+ parental_agents = MultiValueCharFilter(
95
+ method="filter_parental_agents",
96
+ label=_("Parental Agents"),
97
+ )
71
98
  rfc2317_prefix = MultiValueCharFilter(
72
99
  method="filter_rfc2317_prefix",
73
100
  label=_("RFC2317 Prefix"),
@@ -146,26 +173,18 @@ class ZoneFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
146
173
  label=_("Zone is active"),
147
174
  )
148
175
 
149
- class Meta:
150
- model = Zone
151
- fields = (
152
- "id",
153
- "name",
154
- "description",
155
- "default_ttl",
156
- "soa_ttl",
157
- "soa_rname",
158
- "soa_serial",
159
- "soa_refresh",
160
- "soa_retry",
161
- "soa_expire",
162
- "soa_minimum",
163
- "soa_serial_auto",
164
- "rfc2317_parent_managed",
165
- "inline_signing",
166
- "registry_domain_id",
167
- "domain_status",
168
- )
176
+ def filter_parental_agents(self, queryset, name, value):
177
+ if not value:
178
+ return queryset
179
+
180
+ query_values = []
181
+ for v in value:
182
+ try:
183
+ query_values.append(str(netaddr.IPAddress(v)))
184
+ except (AddrFormatError, ValueError):
185
+ pass
186
+
187
+ return queryset.filter(parental_agents__overlap=query_values)
169
188
 
170
189
  def filter_arpa_network(self, queryset, name, value):
171
190
  if not value:
@@ -20,6 +20,16 @@ __all__ = ("ZoneTemplateFilterSet",)
20
20
 
21
21
 
22
22
  class ZoneTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
23
+ class Meta:
24
+ model = ZoneTemplate
25
+
26
+ fields = (
27
+ "id",
28
+ "name",
29
+ "description",
30
+ "soa_rname",
31
+ )
32
+
23
33
  record_template_id = django_filters.ModelMultipleChoiceFilter(
24
34
  queryset=RecordTemplate.objects.all(),
25
35
  field_name="record_templates",
@@ -117,15 +127,6 @@ class ZoneTemplateFilterSet(TenancyFilterSet, NetBoxModelFilterSet):
117
127
  label=_("Billing Contact"),
118
128
  )
119
129
 
120
- class Meta:
121
- model = ZoneTemplate
122
- fields = (
123
- "id",
124
- "name",
125
- "description",
126
- "soa_rname",
127
- )
128
-
129
130
  def search(self, queryset, name, value):
130
131
  if not value.strip():
131
132
  return queryset