netbox-plugin-dns 0.22.9__py3-none-any.whl → 1.0b1__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 (103) hide show
  1. netbox_dns/__init__.py +3 -14
  2. netbox_dns/api/nested_serializers.py +4 -60
  3. netbox_dns/api/serializers.py +8 -314
  4. netbox_dns/api/serializers_/__init__.py +0 -0
  5. netbox_dns/api/serializers_/contact.py +37 -0
  6. netbox_dns/api/serializers_/nameserver.py +39 -0
  7. netbox_dns/api/serializers_/record.py +90 -0
  8. netbox_dns/api/serializers_/registrar.py +31 -0
  9. netbox_dns/api/serializers_/view.py +29 -0
  10. netbox_dns/api/serializers_/zone.py +170 -0
  11. netbox_dns/api/views.py +13 -13
  12. netbox_dns/fields/network.py +1 -1
  13. netbox_dns/fields/rfc2317.py +1 -1
  14. netbox_dns/{filters → filtersets}/contact.py +2 -1
  15. netbox_dns/filtersets/nameserver.py +37 -0
  16. netbox_dns/{filters → filtersets}/record.py +51 -6
  17. netbox_dns/{filters → filtersets}/registrar.py +2 -1
  18. netbox_dns/{filters → filtersets}/view.py +2 -2
  19. netbox_dns/filtersets/zone.py +205 -0
  20. netbox_dns/forms/contact.py +61 -33
  21. netbox_dns/forms/nameserver.py +21 -8
  22. netbox_dns/forms/record.py +35 -36
  23. netbox_dns/forms/registrar.py +45 -15
  24. netbox_dns/forms/view.py +19 -8
  25. netbox_dns/forms/zone.py +112 -87
  26. netbox_dns/graphql/__init__.py +17 -27
  27. netbox_dns/graphql/filters.py +49 -0
  28. netbox_dns/graphql/schema.py +66 -7
  29. netbox_dns/graphql/types.py +146 -0
  30. netbox_dns/management/commands/cleanup_database.py +0 -4
  31. netbox_dns/management/commands/cleanup_rrset_ttl.py +3 -5
  32. netbox_dns/management/commands/setup_coupling.py +15 -15
  33. netbox_dns/management/commands/update_soa.py +1 -1
  34. netbox_dns/migrations/0001_squashed_netbox_dns_0_15.py +0 -27
  35. netbox_dns/migrations/0001_squashed_netbox_dns_0_22.py +556 -0
  36. netbox_dns/migrations/{0013_add_nameserver_zone_record_description.py → 0002_contact_description_registrar_description.py} +4 -9
  37. netbox_dns/migrations/0020_netbox_3_4.py +1 -1
  38. netbox_dns/models/contact.py +6 -1
  39. netbox_dns/models/nameserver.py +3 -3
  40. netbox_dns/models/record.py +8 -15
  41. netbox_dns/models/registrar.py +5 -1
  42. netbox_dns/models/view.py +1 -1
  43. netbox_dns/models/zone.py +6 -9
  44. netbox_dns/navigation.py +1 -15
  45. netbox_dns/signals/ipam_coupling.py +3 -8
  46. netbox_dns/tables/contact.py +1 -0
  47. netbox_dns/tables/nameserver.py +0 -2
  48. netbox_dns/tables/registrar.py +1 -0
  49. netbox_dns/template_content.py +3 -7
  50. netbox_dns/templates/netbox_dns/contact.html +60 -56
  51. netbox_dns/templates/netbox_dns/nameserver.html +27 -27
  52. netbox_dns/templates/netbox_dns/record.html +92 -94
  53. netbox_dns/templates/netbox_dns/registrar.html +38 -36
  54. netbox_dns/templates/netbox_dns/view.html +21 -21
  55. netbox_dns/templates/netbox_dns/zone/base.html +5 -3
  56. netbox_dns/templates/netbox_dns/zone/child.html +3 -3
  57. netbox_dns/templates/netbox_dns/zone/managed_record.html +1 -1
  58. netbox_dns/templates/netbox_dns/zone/record.html +3 -3
  59. netbox_dns/templates/netbox_dns/zone/registration.html +26 -27
  60. netbox_dns/templates/netbox_dns/zone/rfc2317_child_zone.html +1 -1
  61. netbox_dns/templates/netbox_dns/zone.html +150 -149
  62. netbox_dns/utilities/__init__.py +1 -6
  63. netbox_dns/utilities/ipam_coupling.py +2 -7
  64. netbox_dns/validators/dns_name.py +4 -9
  65. netbox_dns/validators/rfc2317.py +2 -2
  66. netbox_dns/views/contact.py +4 -4
  67. netbox_dns/views/nameserver.py +5 -5
  68. netbox_dns/views/record.py +19 -12
  69. netbox_dns/views/registrar.py +4 -4
  70. netbox_dns/views/view.py +4 -4
  71. netbox_dns/views/zone.py +7 -8
  72. {netbox_plugin_dns-0.22.9.dist-info → netbox_plugin_dns-1.0b1.dist-info}/METADATA +5 -7
  73. netbox_plugin_dns-1.0b1.dist-info/RECORD +103 -0
  74. netbox_dns/filters/nameserver.py +0 -18
  75. netbox_dns/filters/zone.py +0 -112
  76. netbox_dns/graphql/contact.py +0 -19
  77. netbox_dns/graphql/nameserver.py +0 -19
  78. netbox_dns/graphql/record.py +0 -19
  79. netbox_dns/graphql/registrar.py +0 -19
  80. netbox_dns/graphql/view.py +0 -19
  81. netbox_dns/graphql/zone.py +0 -19
  82. netbox_dns/migrations/0001_initial.py +0 -115
  83. netbox_dns/migrations/0002_zone_default_ttl.py +0 -18
  84. netbox_dns/migrations/0003_soa_managed_records.py +0 -112
  85. netbox_dns/migrations/0004_create_ptr_for_a_aaaa_records.py +0 -80
  86. netbox_dns/migrations/0005_update_ns_records.py +0 -41
  87. netbox_dns/migrations/0006_zone_soa_serial_auto.py +0 -29
  88. netbox_dns/migrations/0007_alter_zone_soa_serial_auto.py +0 -17
  89. netbox_dns/migrations/0008_zone_status_names.py +0 -21
  90. netbox_dns/migrations/0009_netbox32.py +0 -71
  91. netbox_dns/migrations/0010_update_soa_records.py +0 -58
  92. netbox_dns/migrations/0011_add_view_model.py +0 -70
  93. netbox_dns/migrations/0012_adjust_zone_and_record.py +0 -17
  94. netbox_dns/migrations/0014_add_view_description.py +0 -16
  95. netbox_dns/migrations/0015_add_record_status.py +0 -17
  96. netbox_dns/migrations/0016_cleanup_ptr_records.py +0 -38
  97. netbox_dns/migrations/0017_alter_record_ttl.py +0 -17
  98. netbox_dns/migrations/0018_zone_arpa_network.py +0 -51
  99. netbox_dns/migrations/0019_update_ns_ttl.py +0 -19
  100. netbox_plugin_dns-0.22.9.dist-info/RECORD +0 -117
  101. /netbox_dns/{filters → filtersets}/__init__.py +0 -0
  102. {netbox_plugin_dns-0.22.9.dist-info → netbox_plugin_dns-1.0b1.dist-info}/LICENSE +0 -0
  103. {netbox_plugin_dns-0.22.9.dist-info → netbox_plugin_dns-1.0b1.dist-info}/WHEEL +0 -0
@@ -9,95 +9,99 @@
9
9
  <h5 class="card-header">
10
10
  Zone
11
11
  </h5>
12
- <div class="card-body">
13
- <table class="table table-hover attr-table">
14
- <tr>
15
- <th scope="row">Name</th>
16
- <td>{{ object.name }}</td>
17
- </tr>
18
- {% if unicode_name %}
19
- <tr>
20
- <th scope="row">IDN</th>
21
- <td>{{ unicode_name }}</td>
22
- </tr>
23
- {% endif %}
24
- {% if object.view %}
25
- <tr>
26
- <th scope="row">View</th>
27
- <td>
28
- <a href="{% url 'plugins:netbox_dns:view' pk=object.view.pk %}">
29
- {{ object.view }}
30
- </a>
31
- </td>
32
- </tr>
33
- {% endif %}
34
- <tr>
35
- <th scope="row">Tenant</th>
36
- <td>
37
- {% if object.tenant.group %}
38
- {{ object.tenant.group|linkify }} /
39
- {% endif %}
40
- {{ object.tenant|linkify|placeholder }}
41
- </td>
42
- </tr>
43
- <tr>
44
- <th scope="row">Status</th>
45
- <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
46
- </tr>
47
- <tr>
48
- <th scope="row">Nameservers</th>
49
- <td>
50
- <table>
51
- {% for nameserver in object.nameservers.all %}
52
- <tr>
53
- <td>
54
- <a href="{% url 'plugins:netbox_dns:nameserver' pk=nameserver.pk %}">
55
- {{ nameserver }}
56
- </a>
57
- </td>
58
- </tr>
59
- {% endfor %}
60
- </table>
61
- </td>
62
- {% if nameserver_warnings %}
63
- <tr>
64
- <th class="text-warning" scope="row">Warnings</th>
65
- <td>
66
- <table>
67
- {% for warning in nameserver_warnings %}
68
- <tr>
69
- <td class="text-warning">{{ warning }}</td>
70
- </tr>
71
- {% endfor %}
72
- </table>
73
- </td>
74
- </tr>
75
- {% endif %}
76
- {% if nameserver_errors %}
77
- <tr>
78
- <th class="text-danger" scope="row">Errors</th>
79
- <td>
80
- <table>
81
- {% for error in nameserver_errors %}
82
- <tr>
83
- <td class="text-danger">{{ error }}</td>
84
- </tr>
85
- {% endfor %}
86
- </table>
87
- </td>
88
- </tr>
89
- {% endif %}
90
- </tr>
91
- <tr>
92
- <th scope="row">Default TTL</th>
93
- <td>{{ object.default_ttl }}</td>
94
- </tr>
95
- <tr>
96
- <th scope="row">Description</th>
97
- <td>{{ object.description }}</td>
98
- </tr>
99
- </table>
100
- </div>
12
+ <table class="table table-hover attr-table">
13
+ <tr>
14
+ <th scope="row">Name</th>
15
+ <td>{{ object.name }}</td>
16
+ </tr>
17
+ {% if unicode_name %}
18
+ <tr>
19
+ <th scope="row">IDN</th>
20
+ <td>{{ unicode_name }}</td>
21
+ </tr>
22
+ {% endif %}
23
+ {% if object.view %}
24
+ <tr>
25
+ <th scope="row">View</th>
26
+ <td>
27
+ <a href="{% url 'plugins:netbox_dns:view' pk=object.view.pk %}">
28
+ {{ object.view }}
29
+ </a>
30
+ </td>
31
+ </tr>
32
+ {% endif %}
33
+ {% if object.description %}
34
+ <tr>
35
+ <th scope="row">Description</th>
36
+ <td style="word-break:break-all;">{{ object.description }}</td>
37
+ </tr>
38
+ {% endif %}
39
+ <tr>
40
+ <th scope="row">Tenant</th>
41
+ <td>
42
+ {% if object.tenant.group %}
43
+ {{ object.tenant.group|linkify }} /
44
+ {% endif %}
45
+ {{ object.tenant|linkify|placeholder }}
46
+ </td>
47
+ </tr>
48
+ <tr>
49
+ <th scope="row">Status</th>
50
+ <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
51
+ </tr>
52
+ <tr>
53
+ <th scope="row">Nameservers</th>
54
+ <td>
55
+ <table>
56
+ {% for nameserver in object.nameservers.all %}
57
+ <tr>
58
+ <td>
59
+ <a href="{% url 'plugins:netbox_dns:nameserver' pk=nameserver.pk %}">
60
+ {{ nameserver }}
61
+ </a>
62
+ </td>
63
+ </tr>
64
+ {% endfor %}
65
+ </table>
66
+ </td>
67
+ {% if nameserver_warnings %}
68
+ <tr>
69
+ <th class="text-warning" scope="row">Warnings</th>
70
+ <td>
71
+ <table>
72
+ {% for warning in nameserver_warnings %}
73
+ <tr>
74
+ <td class="text-warning">{{ warning }}</td>
75
+ </tr>
76
+ {% endfor %}
77
+ </table>
78
+ </td>
79
+ </tr>
80
+ {% endif %}
81
+ {% if nameserver_errors %}
82
+ <tr>
83
+ <th class="text-danger" scope="row">Errors</th>
84
+ <td>
85
+ <table>
86
+ {% for error in nameserver_errors %}
87
+ <tr>
88
+ <td class="text-danger">{{ error }}</td>
89
+ </tr>
90
+ {% endfor %}
91
+ </table>
92
+ </td>
93
+ </tr>
94
+ {% endif %}
95
+ </tr>
96
+ <tr>
97
+ <th scope="row">Default TTL</th>
98
+ <td>{{ object.default_ttl }}</td>
99
+ </tr>
100
+ <tr>
101
+ <th scope="row">Description</th>
102
+ <td>{{ object.description }}</td>
103
+ </tr>
104
+ </table>
101
105
  </div>
102
106
 
103
107
  {% include 'inc/panels/tags.html' %}
@@ -106,70 +110,67 @@
106
110
  <div class="col col-md-6">
107
111
  <div class="card">
108
112
  <h5 class="card-header">Zone SOA</h5>
109
- <div class="card-body">
110
- <table class="table table-hover attr-table">
111
- <tr>
112
- <th scope="row">TTL</th>
113
- <td>{{ object.soa_ttl }}</td>
114
- </tr>
115
- <tr>
116
- <th scope="row">Primary Nameserver</th>
117
- <td><a href="{% url 'plugins:netbox_dns:nameserver' pk=object.soa_mname.pk %}">{{ object.soa_mname }}</a></td>
118
- </tr>
119
- <tr>
120
- <th scope="row">Responsible</th>
121
- <td>{{ object.soa_rname }}</td>
122
- </tr>
123
- {% if object.soa_serial_auto %}
124
- <tr>
125
- <th scope="row">Serial (auto-generated)</th>
126
- <td>{{ object.soa_serial }}</td>
127
- </tr>
128
- {% else %}
129
- <tr>
130
- <th scope="row">Serial</th>
131
- <td>{{ object.soa_serial }}</td>
132
- </tr>
133
- {% endif %}
134
- <tr>
135
- <th scope="row">Refresh</th>
136
- <td>{{ object.soa_refresh }}</td>
137
- </tr>
138
- <tr>
139
- <th scope="row">Retry</th>
140
- <td>{{ object.soa_retry }}</td>
141
- </tr>
142
- <tr>
143
- <th scope="row">Expire</th>
144
- <td>{{ object.soa_expire }}</td>
145
- </tr>
146
- <tr>
147
- <th scope="row">Minimum TTL</th>
148
- <td>{{ object.soa_minimum }}</td>
149
- </tr>
150
- </table>
151
- </div>
113
+ <table class="table table-hover attr-table">
114
+ <tr>
115
+ <th scope="row">TTL</th>
116
+ <td>{{ object.soa_ttl }}</td>
117
+ </tr>
118
+ <tr>
119
+ <th scope="row">Primary Nameserver</th>
120
+ <td><a href="{% url 'plugins:netbox_dns:nameserver' pk=object.soa_mname.pk %}">{{ object.soa_mname }}</a></td>
121
+ </tr>
122
+ <tr>
123
+ <th scope="row">Responsible</th>
124
+ <td>{{ object.soa_rname }}</td>
125
+ </tr>
126
+ {% if object.soa_serial_auto %}
127
+ <tr>
128
+ <th scope="row">Serial (auto-generated)</th>
129
+ <td>{{ object.soa_serial }}</td>
130
+ </tr>
131
+ {% else %}
132
+ <tr>
133
+ <th scope="row">Serial</th>
134
+ <td>{{ object.soa_serial }}</td>
135
+ </tr>
136
+ {% endif %}
137
+ <tr>
138
+ <th scope="row">Refresh</th>
139
+ <td>{{ object.soa_refresh }}</td>
140
+ </tr>
141
+ <tr>
142
+ <th scope="row">Retry</th>
143
+ <td>{{ object.soa_retry }}</td>
144
+ </tr>
145
+ <tr>
146
+ <th scope="row">Expire</th>
147
+ <td>{{ object.soa_expire }}</td>
148
+ </tr>
149
+ <tr>
150
+ <th scope="row">Minimum TTL</th>
151
+ <td>{{ object.soa_minimum }}</td>
152
+ </tr>
153
+ </table>
152
154
  </div>
153
155
  {% if object.rfc2317_prefix %}
154
156
  <div class="card">
155
157
  <h5 class="card-header">RFC2317</h5>
156
- <div class="card-body">
157
- <table class="table table-hover soa-table">
158
- <tr>
159
- <th scope="row">Prefix</th>
160
- <td>{{ object.rfc2317_prefix }}</td>
161
- </tr>
162
- <tr>
163
- <th scope="row">Parent Managed</th>
164
- <td>{% checkmark object.rfc2317_parent_managed %}</td>
165
- </tr>
166
- {% if object.rfc2317_parent_managed %}
167
- <tr>
168
- <th scope="row">Parent Zone</th>
169
- <td><a href="{% url 'plugins:netbox_dns:zone' pk=object.rfc2317_parent_zone.pk %}">{{ object.rfc2317_parent_zone }}</a></td>
170
- </tr>
171
- {% endif %}
172
- </table>
158
+ <table class="table table-hover soa-table">
159
+ <tr>
160
+ <th scope="row">Prefix</th>
161
+ <td>{{ object.rfc2317_prefix }}</td>
162
+ </tr>
163
+ <tr>
164
+ <th scope="row">Parent Managed</th>
165
+ <td>{% checkmark object.rfc2317_parent_managed %}</td>
166
+ </tr>
167
+ {% if object.rfc2317_parent_managed %}
168
+ <tr>
169
+ <th scope="row">Parent Zone</th>
170
+ <td><a href="{% url 'plugins:netbox_dns:zone' pk=object.rfc2317_parent_zone.pk %}">{{ object.rfc2317_parent_zone }}</a></td>
171
+ </tr>
172
+ {% endif %}
173
+ </table>
173
174
  </div>
174
175
  </div>
175
176
  {% endif %}
@@ -4,12 +4,7 @@ from dns import name as dns_name
4
4
  from dns.exception import DNSException
5
5
  from netaddr import IPNetwork, AddrFormatError
6
6
 
7
- try:
8
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
9
- from extras.plugins import get_plugin_config
10
- except ImportError:
11
- # NetBox 3.5.8
12
- from extras.plugins.utils import get_plugin_config
7
+ from netbox.plugins.utils import get_plugin_config
13
8
 
14
9
 
15
10
  class NameFormatError(Exception):
@@ -3,12 +3,7 @@ from utilities.permissions import resolve_permission
3
3
 
4
4
  from netbox_dns.models import Record, RecordTypeChoices, RecordStatusChoices
5
5
 
6
- try:
7
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
8
- from extras.plugins import get_plugin_config
9
- except ImportError:
10
- # NetBox 3.5.8
11
- from extras.plugins.utils import get_plugin_config
6
+ from netbox.plugins.utils import get_plugin_config
12
7
 
13
8
 
14
9
  class DNSPermissionDenied(Exception):
@@ -69,7 +64,7 @@ def new_address_record(instance):
69
64
  status=address_record_status(instance),
70
65
  type=address_record_type(instance),
71
66
  value=str(instance.address.ip),
72
- ipam_ip_address_id=instance.id,
67
+ ipam_ip_address_id=instance.pk,
73
68
  managed=True,
74
69
  )
75
70
 
@@ -2,12 +2,7 @@ import re
2
2
 
3
3
  from django.core.exceptions import ValidationError
4
4
 
5
- try:
6
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
7
- from extras.plugins import get_plugin_config
8
- except ImportError:
9
- # NetBox 3.5.8
10
- from extras.plugins.utils import get_plugin_config
5
+ from netbox.plugins.utils import get_plugin_config
11
6
 
12
7
  LABEL = r"[a-z0-9][a-z0-9-]*(?<!-)"
13
8
  TOLERANT_LABEL = r"[a-z0-9][a-z0-9-_]*(?<![-_])"
@@ -26,7 +21,7 @@ def validate_fqdn(name):
26
21
  regex = rf"^(\*|{LABEL})(\.{LABEL})+\.?$"
27
22
 
28
23
  if not re.match(regex, name, flags=re.IGNORECASE) or has_invalid_double_dash(name):
29
- raise ValidationError(f"Not a valid fully qualified DNS host name")
24
+ raise ValidationError("Not a valid fully qualified DNS host name")
30
25
 
31
26
 
32
27
  def validate_extended_hostname(name, tolerate_leading_underscores=False):
@@ -41,7 +36,7 @@ def validate_extended_hostname(name, tolerate_leading_underscores=False):
41
36
  regex = rf"^([*@]|(\*\.)?{LABEL}(\.{LABEL})*\.?)$"
42
37
 
43
38
  if not re.match(regex, name, flags=re.IGNORECASE) or has_invalid_double_dash(name):
44
- raise ValidationError(f"Not a valid DNS host name")
39
+ raise ValidationError("Not a valid DNS host name")
45
40
 
46
41
 
47
42
  def validate_domain_name(name):
@@ -54,4 +49,4 @@ def validate_domain_name(name):
54
49
  regex = rf"^{LABEL}(\.{LABEL})*\.?$"
55
50
 
56
51
  if not re.match(regex, name, flags=re.IGNORECASE) or has_invalid_double_dash(name):
57
- raise ValidationError(f"Not a valid DNS domain name")
52
+ raise ValidationError("Not a valid DNS domain name")
@@ -10,9 +10,9 @@ def validate_prefix(prefix):
10
10
 
11
11
  def validate_ipv4(prefix):
12
12
  if prefix.version != 4:
13
- raise ValidationError(f"RFC2317 requires an IPv4 prefix.")
13
+ raise ValidationError("RFC2317 requires an IPv4 prefix.")
14
14
 
15
15
 
16
16
  def validate_rfc2317(prefix):
17
17
  if prefix.prefixlen <= 24:
18
- raise ValidationError(f"RFC2317 requires at least 25 bit prefix length.")
18
+ raise ValidationError("RFC2317 requires at least 25 bit prefix length.")
@@ -5,7 +5,7 @@ from netbox.views import generic
5
5
  from utilities.views import ViewTab, register_model_view
6
6
 
7
7
  from netbox_dns.models import Contact, Zone
8
- from netbox_dns.filters import ContactFilter, ZoneFilter
8
+ from netbox_dns.filtersets import ContactFilterSet, ZoneFilterSet
9
9
  from netbox_dns.forms import (
10
10
  ContactForm,
11
11
  ContactFilterForm,
@@ -22,7 +22,7 @@ class ContactView(generic.ObjectView):
22
22
  class ContactListView(generic.ObjectListView):
23
23
  queryset = Contact.objects.all()
24
24
  table = ContactTable
25
- filterset = ContactFilter
25
+ filterset = ContactFilterSet
26
26
  filterset_form = ContactFilterForm
27
27
 
28
28
 
@@ -46,7 +46,7 @@ class ContactBulkImportView(generic.BulkImportView):
46
46
 
47
47
  class ContactBulkEditView(generic.BulkEditView):
48
48
  queryset = Contact.objects.all()
49
- filterset = ContactFilter
49
+ filterset = ContactFilterSet
50
50
  table = ContactTable
51
51
  form = ContactBulkEditForm
52
52
 
@@ -63,7 +63,7 @@ class ContactZoneListView(generic.ObjectChildrenView):
63
63
  )
64
64
  child_model = Zone
65
65
  table = ZoneTable
66
- filterset = ZoneFilter
66
+ filterset = ZoneFilterSet
67
67
  template_name = "netbox_dns/zone/child.html"
68
68
  hide_if_empty = True
69
69
 
@@ -3,7 +3,7 @@ from dns import name as dns_name
3
3
  from netbox.views import generic
4
4
  from utilities.views import ViewTab, register_model_view
5
5
 
6
- from netbox_dns.filters import NameServerFilter, ZoneFilter
6
+ from netbox_dns.filtersets import NameServerFilterSet, ZoneFilterSet
7
7
  from netbox_dns.forms import (
8
8
  NameServerImportForm,
9
9
  NameServerFilterForm,
@@ -16,7 +16,7 @@ from netbox_dns.tables import NameServerTable, ZoneTable
16
16
 
17
17
  class NameServerListView(generic.ObjectListView):
18
18
  queryset = NameServer.objects.all()
19
- filterset = NameServerFilter
19
+ filterset = NameServerFilterSet
20
20
  filterset_form = NameServerFilterForm
21
21
  table = NameServerTable
22
22
 
@@ -54,7 +54,7 @@ class NameServerBulkImportView(generic.BulkImportView):
54
54
 
55
55
  class NameServerBulkEditView(generic.BulkEditView):
56
56
  queryset = NameServer.objects.all()
57
- filterset = NameServerFilter
57
+ filterset = NameServerFilterSet
58
58
  table = NameServerTable
59
59
  form = NameServerBulkEditForm
60
60
 
@@ -69,7 +69,7 @@ class NameServerZoneListView(generic.ObjectChildrenView):
69
69
  queryset = NameServer.objects.all().prefetch_related("zones")
70
70
  child_model = Zone
71
71
  table = ZoneTable
72
- filterset = ZoneFilter
72
+ filterset = ZoneFilterSet
73
73
  template_name = "netbox_dns/zone/child.html"
74
74
  hide_if_empty = True
75
75
 
@@ -89,7 +89,7 @@ class NameServerSOAZoneListView(generic.ObjectChildrenView):
89
89
  queryset = NameServer.objects.all().prefetch_related("zones_soa")
90
90
  child_model = Zone
91
91
  table = ZoneTable
92
- filterset = ZoneFilter
92
+ filterset = ZoneFilterSet
93
93
  template_name = "netbox_dns/zone/child.html"
94
94
  hide_if_empty = True
95
95
 
@@ -5,7 +5,7 @@ from django.db.models.functions import Length
5
5
 
6
6
  from netbox.views import generic
7
7
 
8
- from netbox_dns.filters import RecordFilter
8
+ from netbox_dns.filtersets import RecordFilterSet
9
9
  from netbox_dns.forms import (
10
10
  RecordImportForm,
11
11
  RecordFilterForm,
@@ -21,7 +21,7 @@ class RecordListView(generic.ObjectListView):
21
21
  queryset = Record.objects.filter(managed=False).prefetch_related(
22
22
  "zone", "ptr_record"
23
23
  )
24
- filterset = RecordFilter
24
+ filterset = RecordFilterSet
25
25
  filterset_form = RecordFilterForm
26
26
  table = RecordTable
27
27
 
@@ -30,10 +30,10 @@ class ManagedRecordListView(generic.ObjectListView):
30
30
  queryset = Record.objects.filter(managed=True).prefetch_related(
31
31
  "zone", "address_record"
32
32
  )
33
- filterset = RecordFilter
33
+ filterset = RecordFilterSet
34
34
  filterset_form = RecordFilterForm
35
35
  table = ManagedRecordTable
36
- actions = ("export",)
36
+ actions = {"export": {"view"}}
37
37
  template_name = "netbox_dns/record/managed.html"
38
38
 
39
39
 
@@ -41,15 +41,22 @@ class RecordView(generic.ObjectView):
41
41
  queryset = Record.objects.all().prefetch_related("zone", "ptr_record")
42
42
 
43
43
  def get_value_records(self, instance):
44
- view_filter = (
45
- Q(zone__view__isnull=True)
46
- if instance.zone.view is None
47
- else Q(zone__view=instance.zone.view)
48
- )
49
-
50
44
  value_fqdn = dns_name.from_text(instance.value_fqdn)
45
+ value_zone_names = [
46
+ value_fqdn.split(length)[1].to_text().rstrip(".")
47
+ for length in range(2, len(value_fqdn) + 1)
48
+ ]
49
+
50
+ value_zone = (
51
+ Zone.objects.filter(instance.zone.view_filter, name__in=value_zone_names)
52
+ .order_by(Length("name").desc())
53
+ .first()
54
+ )
55
+ if not value_zone:
56
+ return None
51
57
 
52
- cname_targets = Record.objects.filter(view_filter, fqdn=value_fqdn)
58
+ value_name = value_fqdn.relativize(dns_name.from_text(value_zone.name))
59
+ cname_targets = Record.objects.filter(zone=value_zone, name=value_name)
53
60
 
54
61
  if cname_targets:
55
62
  return RelatedRecordTable(
@@ -142,7 +149,7 @@ class RecordBulkImportView(generic.BulkImportView):
142
149
 
143
150
  class RecordBulkEditView(generic.BulkEditView):
144
151
  queryset = Record.objects.filter(managed=False).prefetch_related("zone")
145
- filterset = RecordFilter
152
+ filterset = RecordFilterSet
146
153
  table = RecordTable
147
154
  form = RecordBulkEditForm
148
155
 
@@ -3,7 +3,7 @@ from netbox.views import generic
3
3
  from utilities.views import ViewTab, register_model_view
4
4
 
5
5
  from netbox_dns.models import Registrar, Zone
6
- from netbox_dns.filters import RegistrarFilter, ZoneFilter
6
+ from netbox_dns.filtersets import RegistrarFilterSet, ZoneFilterSet
7
7
  from netbox_dns.forms import (
8
8
  RegistrarForm,
9
9
  RegistrarFilterForm,
@@ -20,7 +20,7 @@ class RegistrarView(generic.ObjectView):
20
20
  class RegistrarListView(generic.ObjectListView):
21
21
  queryset = Registrar.objects.all()
22
22
  table = RegistrarTable
23
- filterset = RegistrarFilter
23
+ filterset = RegistrarFilterSet
24
24
  filterset_form = RegistrarFilterForm
25
25
 
26
26
 
@@ -44,7 +44,7 @@ class RegistrarBulkImportView(generic.BulkImportView):
44
44
 
45
45
  class RegistrarBulkEditView(generic.BulkEditView):
46
46
  queryset = Registrar.objects.all()
47
- filterset = RegistrarFilter
47
+ filterset = RegistrarFilterSet
48
48
  table = RegistrarTable
49
49
  form = RegistrarBulkEditForm
50
50
 
@@ -59,7 +59,7 @@ class RegistrarZoneListView(generic.ObjectChildrenView):
59
59
  queryset = Registrar.objects.all().prefetch_related("zone_set")
60
60
  child_model = Zone
61
61
  table = ZoneTable
62
- filterset = ZoneFilter
62
+ filterset = ZoneFilterSet
63
63
  template_name = "netbox_dns/zone/child.html"
64
64
  hide_if_empty = True
65
65
 
netbox_dns/views/view.py CHANGED
@@ -3,7 +3,7 @@ from utilities.views import ViewTab, register_model_view
3
3
  from netbox.views import generic
4
4
 
5
5
  from netbox_dns.models import View, Zone
6
- from netbox_dns.filters import ViewFilter, ZoneFilter
6
+ from netbox_dns.filtersets import ViewFilterSet, ZoneFilterSet
7
7
  from netbox_dns.forms import ViewForm, ViewFilterForm, ViewImportForm, ViewBulkEditForm
8
8
  from netbox_dns.tables import ViewTable, ZoneTable
9
9
 
@@ -15,7 +15,7 @@ class ViewView(generic.ObjectView):
15
15
  class ViewListView(generic.ObjectListView):
16
16
  queryset = View.objects.all()
17
17
  table = ViewTable
18
- filterset = ViewFilter
18
+ filterset = ViewFilterSet
19
19
  filterset_form = ViewFilterForm
20
20
 
21
21
 
@@ -39,7 +39,7 @@ class ViewBulkImportView(generic.BulkImportView):
39
39
 
40
40
  class ViewBulkEditView(generic.BulkEditView):
41
41
  queryset = View.objects.all()
42
- filterset = ViewFilter
42
+ filterset = ViewFilterSet
43
43
  table = ViewTable
44
44
  form = ViewBulkEditForm
45
45
 
@@ -54,7 +54,7 @@ class ViewZoneListView(generic.ObjectChildrenView):
54
54
  queryset = View.objects.all().prefetch_related("zone_set")
55
55
  child_model = Zone
56
56
  table = ZoneTable
57
- filterset = ZoneFilter
57
+ filterset = ZoneFilterSet
58
58
  template_name = "netbox_dns/zone/child.html"
59
59
  hide_if_empty = True
60
60