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
@@ -1,5 +1,3 @@
1
- from packaging.version import Version
2
-
3
1
  from django import forms
4
2
  from django.utils.translation import gettext_lazy as _
5
3
 
@@ -9,7 +7,6 @@ from netbox.forms import (
9
7
  NetBoxModelImportForm,
10
8
  NetBoxModelForm,
11
9
  )
12
- from utilities.release import load_release_data
13
10
  from utilities.forms.fields import (
14
11
  DynamicModelMultipleChoiceField,
15
12
  TagFilterField,
@@ -38,44 +35,8 @@ __all__ = (
38
35
  "ZoneTemplateBulkEditForm",
39
36
  )
40
37
 
41
- QUICK_ADD = Version(load_release_data().version) >= Version("4.2.5")
42
-
43
38
 
44
39
  class ZoneTemplateForm(TenancyForm, NetBoxModelForm):
45
- nameservers = DynamicModelMultipleChoiceField(
46
- queryset=NameServer.objects.all(),
47
- required=False,
48
- quick_add=QUICK_ADD,
49
- )
50
- soa_mname = DynamicModelChoiceField(
51
- queryset=NameServer.objects.all(),
52
- required=False,
53
- label=_("MName"),
54
- quick_add=QUICK_ADD,
55
- )
56
- record_templates = DynamicModelMultipleChoiceField(
57
- queryset=RecordTemplate.objects.all(),
58
- required=False,
59
- quick_add=QUICK_ADD,
60
- )
61
-
62
- fieldsets = (
63
- FieldSet("name", "description", "nameservers", name=_("Zone Template")),
64
- FieldSet("soa_mname", "soa_rname", name=_("SOA")),
65
- FieldSet("record_templates", name=_("Record Templates")),
66
- FieldSet("dnssec_policy", name=_("DNSSEC")),
67
- FieldSet(
68
- "registrar",
69
- "registrant",
70
- "admin_c",
71
- "tech_c",
72
- "billing_c",
73
- name=_("Domain Registration"),
74
- ),
75
- FieldSet("tenant_group", "tenant", name=_("Tenancy")),
76
- FieldSet("tags", name=_("Tags")),
77
- )
78
-
79
40
  class Meta:
80
41
  model = ZoneTemplate
81
42
 
@@ -96,19 +57,96 @@ class ZoneTemplateForm(TenancyForm, NetBoxModelForm):
96
57
  "tenant",
97
58
  "tags",
98
59
  )
60
+
99
61
  labels = {
100
62
  "soa_rname": _("RName"),
101
63
  }
102
64
 
65
+ fieldsets = (
66
+ FieldSet(
67
+ "name",
68
+ "description",
69
+ "nameservers",
70
+ name=_("Zone Template"),
71
+ ),
72
+ FieldSet(
73
+ "soa_mname",
74
+ "soa_rname",
75
+ name=_("SOA"),
76
+ ),
77
+ FieldSet(
78
+ "record_templates",
79
+ name=_("Record Templates"),
80
+ ),
81
+ FieldSet(
82
+ "dnssec_policy",
83
+ name=_("DNSSEC"),
84
+ ),
85
+ FieldSet(
86
+ "registrar",
87
+ "registrant",
88
+ "admin_c",
89
+ "tech_c",
90
+ "billing_c",
91
+ name=_("Domain Registration"),
92
+ ),
93
+ FieldSet(
94
+ "tenant_group",
95
+ "tenant",
96
+ name=_("Tenancy"),
97
+ ),
98
+ FieldSet(
99
+ "tags",
100
+ name=_("Tags"),
101
+ ),
102
+ )
103
+
104
+ nameservers = DynamicModelMultipleChoiceField(
105
+ queryset=NameServer.objects.all(),
106
+ required=False,
107
+ quick_add=True,
108
+ )
109
+ soa_mname = DynamicModelChoiceField(
110
+ queryset=NameServer.objects.all(),
111
+ required=False,
112
+ label=_("MName"),
113
+ quick_add=True,
114
+ )
115
+ record_templates = DynamicModelMultipleChoiceField(
116
+ queryset=RecordTemplate.objects.all(),
117
+ required=False,
118
+ quick_add=True,
119
+ )
120
+
103
121
 
104
122
  class ZoneTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
105
123
  model = ZoneTemplate
124
+
106
125
  fieldsets = (
107
- FieldSet("q", "filter_id", "tag"),
108
- FieldSet("name", "nameserver_id", "description", name=_("Attributes")),
109
- FieldSet("soa_mname_id", "soa_rname", name=_("SOA")),
110
- FieldSet("record_template_id", name=_("Record Templates")),
111
- FieldSet("dnssec_policy", name=_("DNSSEC")),
126
+ FieldSet(
127
+ "q",
128
+ "filter_id",
129
+ "tag",
130
+ ),
131
+ FieldSet(
132
+ "name",
133
+ "nameserver_id",
134
+ "description",
135
+ name=_("Attributes"),
136
+ ),
137
+ FieldSet(
138
+ "soa_mname_id",
139
+ "soa_rname",
140
+ name=_("SOA"),
141
+ ),
142
+ FieldSet(
143
+ "record_template_id",
144
+ name=_("Record Templates"),
145
+ ),
146
+ FieldSet(
147
+ "dnssec_policy",
148
+ name=_("DNSSEC"),
149
+ ),
112
150
  FieldSet(
113
151
  "registrar_id",
114
152
  "registrant_id",
@@ -117,7 +155,11 @@ class ZoneTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
117
155
  "billing_c_id",
118
156
  name=_("Registration"),
119
157
  ),
120
- FieldSet("tenant_group_id", "tenant_id", name=_("Tenancy")),
158
+ FieldSet(
159
+ "tenant_group_id",
160
+ "tenant_id",
161
+ name=_("Tenancy"),
162
+ ),
121
163
  )
122
164
 
123
165
  name = forms.CharField(
@@ -189,6 +231,26 @@ class ZoneTemplateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
189
231
 
190
232
 
191
233
  class ZoneTemplateImportForm(NetBoxModelImportForm):
234
+ class Meta:
235
+ model = ZoneTemplate
236
+
237
+ fields = (
238
+ "name",
239
+ "nameservers",
240
+ "soa_mname",
241
+ "soa_rname",
242
+ "record_templates",
243
+ "dnssec_policy",
244
+ "description",
245
+ "registrar",
246
+ "registrant",
247
+ "admin_c",
248
+ "tech_c",
249
+ "billing_c",
250
+ "tenant",
251
+ "tags",
252
+ )
253
+
192
254
  nameservers = CSVModelMultipleChoiceField(
193
255
  queryset=NameServer.objects.all(),
194
256
  to_field_name="name",
@@ -268,28 +330,59 @@ class ZoneTemplateImportForm(NetBoxModelImportForm):
268
330
  label=_("Tenant"),
269
331
  )
270
332
 
271
- class Meta:
272
- model = ZoneTemplate
273
333
 
274
- fields = (
275
- "name",
334
+ class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
335
+ model = ZoneTemplate
336
+
337
+ fieldsets = (
338
+ FieldSet(
276
339
  "nameservers",
340
+ "description",
341
+ name=_("Attributes"),
342
+ ),
343
+ FieldSet(
277
344
  "soa_mname",
278
345
  "soa_rname",
346
+ name=_("SOA"),
347
+ ),
348
+ FieldSet(
279
349
  "record_templates",
350
+ name=_("Record Templates"),
351
+ ),
352
+ FieldSet(
280
353
  "dnssec_policy",
281
- "description",
354
+ name=_("DNSSEC"),
355
+ ),
356
+ FieldSet(
282
357
  "registrar",
283
358
  "registrant",
284
359
  "admin_c",
285
360
  "tech_c",
286
361
  "billing_c",
362
+ name=_("Domain Registration"),
363
+ ),
364
+ FieldSet(
365
+ "tenant_group",
287
366
  "tenant",
288
- "tags",
289
- )
367
+ name=_("Tenancy"),
368
+ ),
369
+ )
290
370
 
371
+ nullable_fields = (
372
+ "description",
373
+ "nameservers",
374
+ "soa_mname",
375
+ "soa_rname",
376
+ "record_templates",
377
+ "dnssec_policy",
378
+ "registrar",
379
+ "registrant",
380
+ "admin_c",
381
+ "tech_c",
382
+ "billing_c",
383
+ "tenant",
384
+ )
291
385
 
292
- class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
293
386
  nameservers = DynamicModelMultipleChoiceField(
294
387
  queryset=NameServer.objects.all(),
295
388
  required=False,
@@ -300,7 +393,11 @@ class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
300
393
  required=False,
301
394
  label=_("MName"),
302
395
  )
303
- soa_rname = forms.CharField(max_length=255, required=False, label=_("RName"))
396
+ soa_rname = forms.CharField(
397
+ max_length=255,
398
+ required=False,
399
+ label=_("RName"),
400
+ )
304
401
  record_templates = DynamicModelMultipleChoiceField(
305
402
  queryset=RecordTemplate.objects.all(),
306
403
  required=False,
@@ -349,50 +446,3 @@ class ZoneTemplateBulkEditForm(NetBoxModelBulkEditForm):
349
446
  required=False,
350
447
  label=_("Tenant"),
351
448
  )
352
-
353
- model = ZoneTemplate
354
-
355
- fieldsets = (
356
- FieldSet(
357
- "nameservers",
358
- "description",
359
- name=_("Attributes"),
360
- ),
361
- FieldSet(
362
- "soa_mname",
363
- "soa_rname",
364
- name=_("SOA"),
365
- ),
366
- FieldSet(
367
- "record_templates",
368
- name=_("Record Templates"),
369
- ),
370
- FieldSet(
371
- "dnssec_policy",
372
- name=_("DNSSEC"),
373
- ),
374
- FieldSet(
375
- "registrar",
376
- "registrant",
377
- "admin_c",
378
- "tech_c",
379
- "billing_c",
380
- name=_("Domain Registration"),
381
- ),
382
- FieldSet("tenant_group", "tenant", name=_("Tenancy")),
383
- )
384
-
385
- nullable_fields = (
386
- "description",
387
- "nameservers",
388
- "soa_mname",
389
- "soa_rname",
390
- "record_templates",
391
- "dnssec_policy",
392
- "registrar",
393
- "registrant",
394
- "admin_c",
395
- "tech_c",
396
- "billing_c",
397
- "tenant",
398
- )
@@ -90,6 +90,7 @@ class NetBoxDNSZoneType(NetBoxObjectType):
90
90
  | None
91
91
  )
92
92
  inline_signing: bool
93
+ parental_agents: List[str]
93
94
  registrar: (
94
95
  Annotated["NetBoxDNSRegistrarType", strawberry.lazy("netbox_dns.graphql.types")]
95
96
  | None
@@ -164,10 +165,9 @@ class NetBoxDNSRecordType(NetBoxObjectType):
164
165
  Annotated["NetBoxDNSRecordType", strawberry.lazy("netbox_dns.graphql.types")]
165
166
  | None
166
167
  )
167
- address_record: (
168
+ address_records: List[
168
169
  Annotated["NetBoxDNSRecordType", strawberry.lazy("netbox_dns.graphql.types")]
169
- | None
170
- )
170
+ ]
171
171
  rfc2317_ptr_records: List[
172
172
  Annotated["NetBoxDNSRecordType", strawberry.lazy("netbox_dns.graphql.types")]
173
173
  ]
Binary file
Binary file
@@ -0,0 +1,25 @@
1
+ # Generated by Django 5.2 on 2025-04-22 18:05
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0018_zone_domain_status_zone_expiration_date"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name="dnssecpolicy",
16
+ name="parental_agents",
17
+ field=django.contrib.postgres.fields.ArrayField(
18
+ base_field=models.GenericIPAddressField(),
19
+ blank=True,
20
+ default=list,
21
+ null=True,
22
+ size=None,
23
+ ),
24
+ ),
25
+ ]
@@ -0,0 +1,29 @@
1
+ # Generated by Django 5.1.8 on 2025-04-22 21:45
2
+
3
+ import django.contrib.postgres.fields
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0019_dnssecpolicy_parental_agents"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.RemoveField(
15
+ model_name="dnssecpolicy",
16
+ name="parental_agents",
17
+ ),
18
+ migrations.AddField(
19
+ model_name="zone",
20
+ name="parental_agents",
21
+ field=django.contrib.postgres.fields.ArrayField(
22
+ base_field=models.GenericIPAddressField(),
23
+ blank=True,
24
+ default=list,
25
+ null=True,
26
+ size=None,
27
+ ),
28
+ ),
29
+ ]
@@ -0,0 +1,25 @@
1
+ # Generated by Django 5.2 on 2025-05-13 09:16
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ("netbox_dns", "0020_remove_dnssecpolicy_parental_agents_and_more"),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name="record",
16
+ name="ptr_record",
17
+ field=models.ForeignKey(
18
+ blank=True,
19
+ null=True,
20
+ on_delete=django.db.models.deletion.SET_NULL,
21
+ related_name="address_records",
22
+ to="netbox_dns.record",
23
+ ),
24
+ ),
25
+ ]
@@ -20,6 +20,29 @@ __all__ = (
20
20
 
21
21
 
22
22
  class DNSSECKeyTemplate(ContactsMixin, NetBoxModel):
23
+ class Meta:
24
+ verbose_name = _("DNSSEC Key Template")
25
+ verbose_name_plural = _("DNSSEC Key Templates")
26
+
27
+ unique_together = (
28
+ "name",
29
+ "type",
30
+ )
31
+
32
+ ordering = ("name",)
33
+
34
+ clone_fields = (
35
+ "description",
36
+ "type",
37
+ "lifetime",
38
+ "algorithm",
39
+ "key_size",
40
+ "tenant",
41
+ )
42
+
43
+ def __str__(self):
44
+ return f"{str(self.name)} [{self.type}]"
45
+
23
46
  name = models.CharField(
24
47
  verbose_name=_("Name"),
25
48
  max_length=255,
@@ -64,28 +87,6 @@ class DNSSECKeyTemplate(ContactsMixin, NetBoxModel):
64
87
  null=True,
65
88
  )
66
89
 
67
- clone_fields = (
68
- "description",
69
- "type",
70
- "lifetime",
71
- "algorithm",
72
- "key_size",
73
- "tenant",
74
- )
75
-
76
- class Meta:
77
- verbose_name = _("DNSSEC Key Template")
78
- verbose_name_plural = _("DNSSEC Key Templates")
79
- unique_together = (
80
- "name",
81
- "type",
82
- )
83
-
84
- ordering = ("name",)
85
-
86
- def __str__(self):
87
- return f"{str(self.name)} [{self.type}]"
88
-
89
90
  def get_type_color(self):
90
91
  return DNSSECKeyTemplateTypeChoices.colors.get(self.type)
91
92
 
@@ -103,6 +104,7 @@ class DNSSECKeyTemplate(ContactsMixin, NetBoxModel):
103
104
  @register_search
104
105
  class DNSSECKeyTemplateIndex(SearchIndex):
105
106
  model = DNSSECKeyTemplate
107
+
106
108
  fields = (
107
109
  ("name", 100),
108
110
  ("description", 500),
@@ -17,6 +17,22 @@ __all__ = (
17
17
 
18
18
 
19
19
  class DNSSECPolicy(ContactsMixin, NetBoxModel):
20
+ class Meta:
21
+ verbose_name = _("DNSSEC Policy")
22
+ verbose_name_plural = _("DNSSEC Policies")
23
+
24
+ ordering = ("name",)
25
+
26
+ clone_fields = (
27
+ "name",
28
+ "key_templates",
29
+ "description",
30
+ "tenant",
31
+ )
32
+
33
+ def __str__(self):
34
+ return str(self.name)
35
+
20
36
  name = models.CharField(
21
37
  verbose_name=_("Name"),
22
38
  max_length=255,
@@ -148,22 +164,6 @@ class DNSSECPolicy(ContactsMixin, NetBoxModel):
148
164
  null=True,
149
165
  )
150
166
 
151
- clone_fields = (
152
- "name",
153
- "key_templates",
154
- "description",
155
- "tenant",
156
- )
157
-
158
- class Meta:
159
- verbose_name = _("DNSSEC Policy")
160
- verbose_name_plural = _("DNSSEC Policies")
161
-
162
- ordering = ("name",)
163
-
164
- def __str__(self):
165
- return str(self.name)
166
-
167
167
  def get_status_color(self):
168
168
  return DNSSECPolicyStatusChoices.colors.get(self.status)
169
169
 
@@ -192,6 +192,7 @@ class DNSSECPolicy(ContactsMixin, NetBoxModel):
192
192
  @register_search
193
193
  class DNSSECPolicyIndex(SearchIndex):
194
194
  model = DNSSECPolicy
195
+
195
196
  fields = (
196
197
  ("name", 100),
197
198
  ("description", 500),
@@ -28,31 +28,6 @@ __all__ = (
28
28
 
29
29
 
30
30
  class NameServer(ObjectModificationMixin, ContactsMixin, NetBoxModel):
31
- name = models.CharField(
32
- verbose_name=_("Name"),
33
- max_length=255,
34
- db_collation="natural_sort",
35
- )
36
- description = models.CharField(
37
- verbose_name=_("Description"),
38
- max_length=200,
39
- blank=True,
40
- )
41
- tenant = models.ForeignKey(
42
- verbose_name=_("Tenant"),
43
- to="tenancy.Tenant",
44
- on_delete=models.PROTECT,
45
- related_name="netbox_dns_nameservers",
46
- blank=True,
47
- null=True,
48
- )
49
-
50
- clone_fields = (
51
- "name",
52
- "description",
53
- "tenant",
54
- )
55
-
56
31
  class Meta:
57
32
  verbose_name = _("Nameserver")
58
33
  verbose_name_plural = _("Nameservers")
@@ -69,12 +44,37 @@ class NameServer(ObjectModificationMixin, ContactsMixin, NetBoxModel):
69
44
  ),
70
45
  ]
71
46
 
47
+ clone_fields = (
48
+ "name",
49
+ "description",
50
+ "tenant",
51
+ )
52
+
72
53
  def __str__(self):
73
54
  try:
74
55
  return dns_name.from_text(self.name, origin=None).to_unicode()
75
56
  except dns_name.IDNAException:
76
57
  return self.name
77
58
 
59
+ name = models.CharField(
60
+ verbose_name=_("Name"),
61
+ max_length=255,
62
+ db_collation="natural_sort",
63
+ )
64
+ description = models.CharField(
65
+ verbose_name=_("Description"),
66
+ max_length=200,
67
+ blank=True,
68
+ )
69
+ tenant = models.ForeignKey(
70
+ verbose_name=_("Tenant"),
71
+ to="tenancy.Tenant",
72
+ on_delete=models.PROTECT,
73
+ related_name="netbox_dns_nameservers",
74
+ blank=True,
75
+ null=True,
76
+ )
77
+
78
78
  @property
79
79
  def display_name(self):
80
80
  return name_to_unicode(self.name)
@@ -138,6 +138,7 @@ class NameServer(ObjectModificationMixin, ContactsMixin, NetBoxModel):
138
138
  @register_search
139
139
  class NameServerIndex(SearchIndex):
140
140
  model = NameServer
141
+
141
142
  fields = (
142
143
  ("name", 100),
143
144
  ("description", 500),