netbox-plugin-dns 1.1.2__py3-none-any.whl → 1.1.4__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 (84) hide show
  1. netbox_dns/__init__.py +14 -6
  2. netbox_dns/api/nested_serializers.py +3 -2
  3. netbox_dns/api/serializers_/nameserver.py +2 -1
  4. netbox_dns/api/serializers_/record.py +5 -4
  5. netbox_dns/api/serializers_/record_template.py +2 -1
  6. netbox_dns/api/serializers_/view.py +2 -1
  7. netbox_dns/api/serializers_/zone.py +12 -11
  8. netbox_dns/api/serializers_/zone_template.py +8 -7
  9. netbox_dns/api/views.py +9 -4
  10. netbox_dns/choices/record.py +4 -2
  11. netbox_dns/choices/zone.py +8 -4
  12. netbox_dns/fields/address.py +5 -22
  13. netbox_dns/fields/network.py +2 -1
  14. netbox_dns/fields/rfc2317.py +7 -3
  15. netbox_dns/filtersets/nameserver.py +3 -2
  16. netbox_dns/filtersets/record.py +14 -9
  17. netbox_dns/filtersets/record_template.py +3 -2
  18. netbox_dns/filtersets/view.py +3 -2
  19. netbox_dns/filtersets/zone.py +24 -22
  20. netbox_dns/filtersets/zone_template.py +15 -14
  21. netbox_dns/forms/nameserver.py +41 -17
  22. netbox_dns/forms/record.py +61 -32
  23. netbox_dns/forms/record_template.py +49 -28
  24. netbox_dns/forms/registrar.py +21 -17
  25. netbox_dns/forms/registration_contact.py +37 -25
  26. netbox_dns/forms/view.py +49 -27
  27. netbox_dns/forms/zone.py +173 -120
  28. netbox_dns/forms/zone_template.py +53 -43
  29. netbox_dns/locale/de/LC_MESSAGES/django.mo +0 -0
  30. netbox_dns/locale/en/LC_MESSAGES/django.mo +0 -0
  31. netbox_dns/management/commands/rebuild_dnssync.py +14 -1
  32. netbox_dns/models/nameserver.py +6 -2
  33. netbox_dns/models/record.py +74 -40
  34. netbox_dns/models/record_template.py +17 -9
  35. netbox_dns/models/registrar.py +11 -7
  36. netbox_dns/models/registration_contact.py +23 -11
  37. netbox_dns/models/view.py +15 -6
  38. netbox_dns/models/zone.py +83 -50
  39. netbox_dns/models/zone_template.py +12 -10
  40. netbox_dns/navigation.py +30 -28
  41. netbox_dns/signals/ipam_dnssync.py +21 -14
  42. netbox_dns/tables/ipam_dnssync.py +2 -1
  43. netbox_dns/tables/nameserver.py +2 -0
  44. netbox_dns/tables/record.py +21 -11
  45. netbox_dns/tables/record_template.py +12 -5
  46. netbox_dns/tables/registrar.py +2 -0
  47. netbox_dns/tables/registration_contact.py +2 -0
  48. netbox_dns/tables/view.py +3 -1
  49. netbox_dns/tables/zone.py +15 -2
  50. netbox_dns/tables/zone_template.py +7 -0
  51. netbox_dns/templates/netbox_dns/nameserver.html +6 -5
  52. netbox_dns/templates/netbox_dns/record/managed.html +2 -1
  53. netbox_dns/templates/netbox_dns/record/related.html +26 -14
  54. netbox_dns/templates/netbox_dns/record.html +39 -20
  55. netbox_dns/templates/netbox_dns/recordtemplate.html +27 -15
  56. netbox_dns/templates/netbox_dns/registrar.html +11 -10
  57. netbox_dns/templates/netbox_dns/registrationcontact.html +16 -15
  58. netbox_dns/templates/netbox_dns/view/button.html +2 -1
  59. netbox_dns/templates/netbox_dns/view/prefix.html +7 -4
  60. netbox_dns/templates/netbox_dns/view/related.html +26 -10
  61. netbox_dns/templates/netbox_dns/view.html +11 -14
  62. netbox_dns/templates/netbox_dns/zone/base.html +2 -1
  63. netbox_dns/templates/netbox_dns/zone/child.html +3 -2
  64. netbox_dns/templates/netbox_dns/zone/record.html +3 -2
  65. netbox_dns/templates/netbox_dns/zone/registration.html +8 -7
  66. netbox_dns/templates/netbox_dns/zone.html +28 -30
  67. netbox_dns/templates/netbox_dns/zonetemplate.html +27 -17
  68. netbox_dns/utilities/ipam_dnssync.py +15 -4
  69. netbox_dns/validators/dns_name.py +11 -4
  70. netbox_dns/validators/dns_value.py +55 -9
  71. netbox_dns/validators/rfc2317.py +6 -3
  72. netbox_dns/views/nameserver.py +4 -2
  73. netbox_dns/views/record_template.py +4 -3
  74. netbox_dns/views/registrar.py +3 -1
  75. netbox_dns/views/registration_contact.py +2 -1
  76. netbox_dns/views/view.py +2 -1
  77. netbox_dns/views/zone.py +6 -4
  78. netbox_dns/views/zone_template.py +8 -7
  79. {netbox_plugin_dns-1.1.2.dist-info → netbox_plugin_dns-1.1.4.dist-info}/METADATA +2 -2
  80. netbox_plugin_dns-1.1.4.dist-info/RECORD +150 -0
  81. netbox_plugin_dns-1.1.2.dist-info/RECORD +0 -148
  82. {netbox_plugin_dns-1.1.2.dist-info → netbox_plugin_dns-1.1.4.dist-info}/LICENSE +0 -0
  83. {netbox_plugin_dns-1.1.2.dist-info → netbox_plugin_dns-1.1.4.dist-info}/WHEEL +0 -0
  84. {netbox_plugin_dns-1.1.2.dist-info → netbox_plugin_dns-1.1.4.dist-info}/top_level.txt +0 -0
@@ -4,6 +4,7 @@ from dns import name as dns_name
4
4
  from django.core.exceptions import ValidationError
5
5
  from django.db import models
6
6
  from django.urls import reverse
7
+ from django.utils.translation import gettext_lazy as _
7
8
 
8
9
  from netbox.models import NetBoxModel
9
10
  from netbox.search import SearchIndex, register_search
@@ -23,40 +24,45 @@ __all__ = (
23
24
 
24
25
  class RecordTemplate(NetBoxModel):
25
26
  name = models.CharField(
26
- verbose_name="Template name",
27
+ verbose_name=_("Template Name"),
27
28
  unique=True,
28
29
  max_length=200,
29
30
  )
30
31
  record_name = models.CharField(
31
- verbose_name="Name",
32
+ verbose_name=_("Name"),
32
33
  max_length=255,
33
34
  )
34
35
  description = models.CharField(
36
+ verbose_name=_("Description"),
35
37
  max_length=200,
36
38
  blank=True,
37
39
  )
38
40
  type = models.CharField(
41
+ verbose_name=_("Type"),
39
42
  choices=RecordTypeChoices,
40
43
  )
41
44
  value = models.CharField(
45
+ verbose_name=_("Value"),
42
46
  max_length=65535,
43
47
  )
44
48
  status = models.CharField(
49
+ verbose_name=_("Status"),
45
50
  choices=RecordStatusChoices,
46
51
  default=RecordStatusChoices.STATUS_ACTIVE,
47
52
  blank=False,
48
53
  )
49
54
  ttl = models.PositiveIntegerField(
50
- verbose_name="TTL",
55
+ verbose_name=_("TTL"),
51
56
  null=True,
52
57
  blank=True,
53
58
  )
54
59
  disable_ptr = models.BooleanField(
55
- verbose_name="Disable PTR",
56
- help_text="Disable PTR record creation",
60
+ verbose_name=_("Disable PTR"),
61
+ help_text=_("Disable PTR record creation"),
57
62
  default=False,
58
63
  )
59
64
  tenant = models.ForeignKey(
65
+ verbose_name=_("Tenant"),
60
66
  to="tenancy.Tenant",
61
67
  on_delete=models.PROTECT,
62
68
  related_name="+",
@@ -85,8 +91,8 @@ class RecordTemplate(NetBoxModel):
85
91
  )
86
92
 
87
93
  class Meta:
88
- verbose_name = "Record Template"
89
- verbose_name_plural = "Record Templates"
94
+ verbose_name = _("Record Template")
95
+ verbose_name_plural = _("Record Templates")
90
96
 
91
97
  ordering = ("name",)
92
98
 
@@ -131,7 +137,7 @@ class RecordTemplate(NetBoxModel):
131
137
 
132
138
  def validate_value(self):
133
139
  try:
134
- validate_record_value(self.type, self.value)
140
+ validate_record_value(self)
135
141
  except ValidationError as exc:
136
142
  raise ValidationError({"value": exc}) from None
137
143
 
@@ -155,7 +161,9 @@ class RecordTemplate(NetBoxModel):
155
161
  record = Record.objects.create(**record_data)
156
162
  except ValidationError as exc:
157
163
  raise ValidationError(
158
- f"Error while processing record template {self}: {exc.messages[0]}"
164
+ _("Error while processing record template {template}: {error}").format(
165
+ template=self, error=exc.messages[0]
166
+ )
159
167
  )
160
168
 
161
169
  if tags := self.tags.all():
@@ -1,5 +1,6 @@
1
1
  from django.db import models
2
2
  from django.urls import reverse
3
+ from django.utils.translation import gettext_lazy as _
3
4
 
4
5
  from netbox.models import NetBoxModel
5
6
  from netbox.search import SearchIndex, register_search
@@ -16,38 +17,41 @@ class Registrar(NetBoxModel):
16
17
  # Data fields according to https://www.icann.org/resources/pages/rdds-labeling-policy-2017-02-01-en
17
18
  # -
18
19
  name = models.CharField(
20
+ verbose_name=_("Name"),
19
21
  unique=True,
20
22
  max_length=255,
21
23
  )
22
24
  description = models.CharField(
25
+ verbose_name=_("Description"),
23
26
  blank=True,
24
27
  max_length=200,
25
28
  )
26
29
  iana_id = models.IntegerField(
27
- verbose_name="IANA ID",
30
+ verbose_name=_("IANA ID"),
28
31
  null=True,
29
32
  blank=True,
30
33
  )
31
34
  referral_url = models.URLField(
32
- verbose_name="Referral URL",
35
+ verbose_name=_("Referral URL"),
33
36
  max_length=255,
34
37
  blank=True,
35
38
  )
36
39
  whois_server = models.CharField(
37
- verbose_name="WHOIS Server",
40
+ verbose_name=_("WHOIS Server"),
38
41
  max_length=255,
39
42
  blank=True,
40
43
  )
41
44
  address = models.CharField(
45
+ verbose_name=_("Address"),
42
46
  max_length=200,
43
47
  blank=True,
44
48
  )
45
49
  abuse_email = models.EmailField(
46
- verbose_name="Abuse Email",
50
+ verbose_name=_("Abuse Email"),
47
51
  blank=True,
48
52
  )
49
53
  abuse_phone = models.CharField(
50
- verbose_name="Abuse Phone",
54
+ verbose_name=_("Abuse Phone"),
51
55
  max_length=50,
52
56
  blank=True,
53
57
  )
@@ -59,8 +63,8 @@ class Registrar(NetBoxModel):
59
63
  return str(self.name)
60
64
 
61
65
  class Meta:
62
- verbose_name = "Registrar"
63
- verbose_name_plural = "Registrars"
66
+ verbose_name = _("Registrar")
67
+ verbose_name_plural = _("Registrars")
64
68
 
65
69
  ordering = (
66
70
  "name",
@@ -1,5 +1,6 @@
1
1
  from django.db import models
2
2
  from django.urls import reverse
3
+ from django.utils.translation import gettext_lazy as _
3
4
 
4
5
  from netbox.models import NetBoxModel
5
6
  from netbox.search import SearchIndex, register_search
@@ -18,70 +19,81 @@ class RegistrationContact(NetBoxModel):
18
19
  # Data fields according to https://www.icann.org/resources/pages/rdds-labeling-policy-2017-02-01-en
19
20
  # -
20
21
  contact_id = models.CharField(
21
- verbose_name="Contact ID",
22
+ verbose_name=_("Contact ID"),
22
23
  max_length=50,
23
24
  unique=True,
24
25
  )
25
26
  name = models.CharField(
27
+ verbose_name=_("Name"),
26
28
  blank=True,
27
29
  max_length=100,
28
30
  )
29
31
  description = models.CharField(
32
+ verbose_name=_("Description"),
30
33
  blank=True,
31
34
  max_length=200,
32
35
  )
33
36
  organization = models.CharField(
37
+ verbose_name=_("Organization"),
34
38
  blank=True,
35
39
  max_length=200,
36
40
  )
37
41
  street = models.CharField(
42
+ verbose_name=_("Street"),
38
43
  blank=True,
39
44
  max_length=50,
40
45
  )
41
46
  city = models.CharField(
47
+ verbose_name=_("City"),
42
48
  blank=True,
43
49
  max_length=50,
44
50
  )
45
51
  state_province = models.CharField(
46
- verbose_name="State/Province",
52
+ verbose_name=_("State/Province"),
47
53
  blank=True,
48
54
  max_length=255,
49
55
  )
50
56
  postal_code = models.CharField(
51
- verbose_name="Postal Code",
57
+ verbose_name=_("Postal Code"),
52
58
  blank=True,
53
59
  max_length=20,
54
60
  )
55
61
  country = models.CharField(
56
- verbose_name="Country (ISO 3166)",
62
+ verbose_name=_("Country (ISO 3166)"),
57
63
  blank=True,
58
64
  max_length=2,
59
65
  )
60
66
  phone = models.CharField(
61
- verbose_name="Phone",
67
+ verbose_name=_("Phone"),
62
68
  blank=True,
63
69
  max_length=50,
64
70
  )
65
71
  phone_ext = models.CharField(
66
- verbose_name="Phone Extension",
72
+ verbose_name=_("Phone Extension"),
67
73
  blank=True,
68
74
  max_length=50,
69
75
  )
70
76
  fax = models.CharField(
71
- verbose_name="Fax",
77
+ verbose_name=_("Fax"),
72
78
  blank=True,
73
79
  max_length=50,
74
80
  )
75
81
  fax_ext = models.CharField(
76
- verbose_name="Fax Extension",
82
+ verbose_name=_("Fax Extension"),
77
83
  blank=True,
78
84
  max_length=50,
79
85
  )
80
86
  email = models.EmailField(
81
- verbose_name="Email",
87
+ verbose_name=_("Email"),
82
88
  blank=True,
83
89
  )
84
90
 
91
+ # +
92
+ # TODO: Retained for backwards compatibility with older versions where
93
+ # 'RegistrationContact' was still ambiguously named 'Contact'.
94
+ #
95
+ # Removing it requires a data migration.
96
+ # -
85
97
  tags = TaggableManager(
86
98
  through="extras.TaggedItem",
87
99
  related_name="netbox_dns_contact_set",
@@ -114,8 +126,8 @@ class RegistrationContact(NetBoxModel):
114
126
  return self.contact_id
115
127
 
116
128
  class Meta:
117
- verbose_name = "Registration Contact"
118
- verbose_name_plural = "Registration Contacts"
129
+ verbose_name = _("Registration Contact")
130
+ verbose_name_plural = _("Registration Contacts")
119
131
 
120
132
  ordering = (
121
133
  "name",
netbox_dns/models/view.py CHANGED
@@ -1,6 +1,8 @@
1
1
  from django.db import models
2
2
  from django.urls import reverse
3
3
  from django.core.exceptions import ValidationError
4
+ from django.utils.translation import gettext_lazy as _
5
+ from django.utils.translation import pgettext_lazy as _p
4
6
 
5
7
  from netbox.models import NetBoxModel
6
8
  from netbox.models.features import ContactsMixin
@@ -26,27 +28,32 @@ __all__ = (
26
28
 
27
29
  class View(ObjectModificationMixin, ContactsMixin, NetBoxModel):
28
30
  name = models.CharField(
31
+ verbose_name=_("Name"),
29
32
  unique=True,
30
33
  max_length=255,
31
34
  )
32
35
  description = models.CharField(
36
+ verbose_name=_("Description"),
33
37
  max_length=200,
34
38
  blank=True,
35
39
  )
36
40
  default_view = models.BooleanField(
41
+ verbose_name=_("Default View"),
37
42
  default=False,
38
43
  )
39
44
  prefixes = models.ManyToManyField(
45
+ verbose_name=_("IPAM Prefixes"),
40
46
  to="ipam.Prefix",
41
47
  related_name="netbox_dns_views",
42
48
  blank=True,
43
49
  )
44
50
  ip_address_filter = models.JSONField(
45
- verbose_name="IP Address Filter",
51
+ verbose_name=_("IP Address Filter"),
46
52
  blank=True,
47
53
  null=True,
48
54
  )
49
55
  tenant = models.ForeignKey(
56
+ verbose_name=_("Tenant"),
50
57
  to="tenancy.Tenant",
51
58
  on_delete=models.PROTECT,
52
59
  related_name="netbox_dns_views",
@@ -70,17 +77,17 @@ class View(ObjectModificationMixin, ContactsMixin, NetBoxModel):
70
77
  return str(self.name)
71
78
 
72
79
  class Meta:
73
- verbose_name = "View"
74
- verbose_name_plural = "Views"
80
+ verbose_name = _p("DNS", "View")
81
+ verbose_name_plural = _p("DNS", "Views")
75
82
 
76
83
  ordering = ("name",)
77
84
 
78
85
  def delete(self, *args, **kwargs):
79
86
  if self.default_view:
80
87
  if current_request.get() is not None:
81
- raise AbortRequest("The default view cannot be deleted")
88
+ raise AbortRequest(_("The default view cannot be deleted"))
82
89
 
83
- raise ValidationError("The default view cannot be deleted")
90
+ raise ValidationError(_("The default view cannot be deleted"))
84
91
 
85
92
  super().delete(*args, **kwargs)
86
93
 
@@ -95,7 +102,9 @@ class View(ObjectModificationMixin, ContactsMixin, NetBoxModel):
95
102
  ):
96
103
  raise ValidationError(
97
104
  {
98
- "default_view": "Please select a different view as default view to change this setting!"
105
+ "default_view": _(
106
+ "Please select a different view as default view to change this setting!"
107
+ )
99
108
  }
100
109
  )
101
110