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
@@ -7,7 +7,6 @@ from dns import name as dns_name
7
7
  from django.core.exceptions import ValidationError
8
8
  from django.db import transaction, models
9
9
  from django.db.models import Q, ExpressionWrapper, BooleanField, Min
10
- from django.db.models.functions import Length
11
10
  from django.urls import reverse
12
11
 
13
12
  from netbox.models import NetBoxModel
@@ -15,12 +14,7 @@ from netbox.search import SearchIndex, register_search
15
14
  from utilities.querysets import RestrictedQuerySet
16
15
  from utilities.choices import ChoiceSet
17
16
 
18
- try:
19
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
20
- from extras.plugins import get_plugin_config
21
- except ImportError:
22
- # NetBox 3.5.8
23
- from extras.plugins.utils import get_plugin_config
17
+ from netbox.plugins.utils import get_plugin_config
24
18
 
25
19
  from netbox_dns.fields import AddressField
26
20
  from netbox_dns.utilities import (
@@ -43,7 +37,9 @@ def min_ttl(*ttl_list):
43
37
 
44
38
 
45
39
  class RecordManager(models.Manager.from_queryset(RestrictedQuerySet)):
46
- """Special Manager for records providing the activity status annotation"""
40
+ """
41
+ Custom manager for records providing the activity status annotation
42
+ """
47
43
 
48
44
  def get_queryset(self):
49
45
  return (
@@ -218,7 +214,7 @@ class Record(NetBoxModel):
218
214
  name = dns_name.from_text(self.fqdn).relativize(dns_name.root).to_unicode()
219
215
  except dns_name.IDNAException:
220
216
  name = self.name
221
- except dns_name.LabelTooLong as exc:
217
+ except dns_name.LabelTooLong:
222
218
  name = f"{self.name[:59]}..."
223
219
 
224
220
  return f"{name} [{self.type}]"
@@ -231,7 +227,7 @@ class Record(NetBoxModel):
231
227
  return RecordStatusChoices.colors.get(self.status)
232
228
 
233
229
  def get_absolute_url(self):
234
- return reverse("plugins:netbox_dns:record", kwargs={"pk": self.id})
230
+ return reverse("plugins:netbox_dns:record", kwargs={"pk": self.pk})
235
231
 
236
232
  @property
237
233
  def value_fqdn(self):
@@ -669,7 +665,7 @@ class Record(NetBoxModel):
669
665
  if self.type == RecordTypeChoices.SOA and self.name != "@":
670
666
  raise ValidationError(
671
667
  {
672
- "name": f"SOA records are only allowed with name @ and are created automatically by NetBox DNS"
668
+ "name": "SOA records are only allowed with name @ and are created automatically by NetBox DNS"
673
669
  }
674
670
  ) from None
675
671
 
@@ -699,8 +695,6 @@ class Record(NetBoxModel):
699
695
  }
700
696
  ) from None
701
697
 
702
- super().clean(*args, **kwargs)
703
-
704
698
  def save(
705
699
  self,
706
700
  *args,
@@ -760,8 +754,7 @@ class Record(NetBoxModel):
760
754
  class RecordIndex(SearchIndex):
761
755
  model = Record
762
756
  fields = (
763
- ("fqdn", 100),
764
- ("name", 120),
757
+ ("name", 100),
765
758
  ("value", 150),
766
759
  ("zone", 200),
767
760
  ("type", 200),
@@ -13,6 +13,10 @@ class Registrar(NetBoxModel):
13
13
  unique=True,
14
14
  max_length=255,
15
15
  )
16
+ description = models.CharField(
17
+ blank=True,
18
+ max_length=200,
19
+ )
16
20
  iana_id = models.IntegerField(
17
21
  verbose_name="IANA ID",
18
22
  null=True,
@@ -43,7 +47,7 @@ class Registrar(NetBoxModel):
43
47
  )
44
48
 
45
49
  def get_absolute_url(self):
46
- return reverse("plugins:netbox_dns:registrar", kwargs={"pk": self.id})
50
+ return reverse("plugins:netbox_dns:registrar", kwargs={"pk": self.pk})
47
51
 
48
52
  def __str__(self):
49
53
  return str(self.name)
netbox_dns/models/view.py CHANGED
@@ -25,7 +25,7 @@ class View(NetBoxModel):
25
25
  clone_fields = ["name", "description"]
26
26
 
27
27
  def get_absolute_url(self):
28
- return reverse("plugins:netbox_dns:view", kwargs={"pk": self.id})
28
+ return reverse("plugins:netbox_dns:view", kwargs={"pk": self.pk})
29
29
 
30
30
  def __str__(self):
31
31
  return str(self.name)
netbox_dns/models/zone.py CHANGED
@@ -22,12 +22,7 @@ from utilities.querysets import RestrictedQuerySet
22
22
  from utilities.choices import ChoiceSet
23
23
  from ipam.models import IPAddress
24
24
 
25
- try:
26
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
27
- from extras.plugins import get_plugin_config
28
- except ImportError:
29
- # NetBox 3.5.8
30
- from extras.plugins.utils import get_plugin_config
25
+ from netbox.plugins.utils import get_plugin_config
31
26
 
32
27
  from netbox_dns.fields import NetworkField, RFC2317NetworkField
33
28
  from netbox_dns.utilities import (
@@ -48,7 +43,9 @@ import netbox_dns.models.record as record
48
43
 
49
44
 
50
45
  class ZoneManager(models.Manager.from_queryset(RestrictedQuerySet)):
51
- """Special Manager for zones providing the activity status annotation"""
46
+ """
47
+ Custom manager for zones providing the activity status annotation
48
+ """
52
49
 
53
50
  def get_queryset(self):
54
51
  return (
@@ -455,7 +452,7 @@ class Zone(NetBoxModel):
455
452
  return ns_warnings, ns_errors
456
453
 
457
454
  def get_auto_serial(self):
458
- records = record.Record.objects.filter(zone=self).exclude(
455
+ records = record.Record.objects.filter(zone_id=self.pk).exclude(
459
456
  type=record.RecordTypeChoices.SOA
460
457
  )
461
458
  if records:
@@ -603,7 +600,7 @@ class Zone(NetBoxModel):
603
600
  if self.arpa_network is not None:
604
601
  raise ValidationError(
605
602
  {
606
- "rfc2317_prefix": f"A regular reverse zone can not be used as an RFC2317 zone."
603
+ "rfc2317_prefix": "A regular reverse zone can not be used as an RFC2317 zone."
607
604
  }
608
605
  )
609
606
 
netbox_dns/navigation.py CHANGED
@@ -1,6 +1,4 @@
1
- from extras.plugins import PluginMenuButton, PluginMenuItem
2
- from extras.plugins import PluginMenu
3
- from utilities.choices import ButtonColorChoices
1
+ from netbox.plugins import PluginMenuButton, PluginMenuItem, PluginMenu
4
2
 
5
3
  view_menu_item = PluginMenuItem(
6
4
  link="plugins:netbox_dns:view_list",
@@ -11,14 +9,12 @@ view_menu_item = PluginMenuItem(
11
9
  "plugins:netbox_dns:view_add",
12
10
  "Add",
13
11
  "mdi mdi-plus-thick",
14
- ButtonColorChoices.GREEN,
15
12
  permissions=["netbox_dns.add_view"],
16
13
  ),
17
14
  PluginMenuButton(
18
15
  "plugins:netbox_dns:view_import",
19
16
  "Import",
20
17
  "mdi mdi-upload",
21
- ButtonColorChoices.CYAN,
22
18
  permissions=["netbox_dns.add_view"],
23
19
  ),
24
20
  ),
@@ -33,14 +29,12 @@ zone_menu_item = PluginMenuItem(
33
29
  "plugins:netbox_dns:zone_add",
34
30
  "Add",
35
31
  "mdi mdi-plus-thick",
36
- ButtonColorChoices.GREEN,
37
32
  permissions=["netbox_dns.add_zone"],
38
33
  ),
39
34
  PluginMenuButton(
40
35
  "plugins:netbox_dns:zone_import",
41
36
  "Import",
42
37
  "mdi mdi-upload",
43
- ButtonColorChoices.CYAN,
44
38
  permissions=["netbox_dns.add_zone"],
45
39
  ),
46
40
  ),
@@ -55,14 +49,12 @@ nameserver_menu_item = PluginMenuItem(
55
49
  "plugins:netbox_dns:nameserver_add",
56
50
  "Add",
57
51
  "mdi mdi-plus-thick",
58
- ButtonColorChoices.GREEN,
59
52
  permissions=["netbox_dns.add_nameserver"],
60
53
  ),
61
54
  PluginMenuButton(
62
55
  "plugins:netbox_dns:nameserver_import",
63
56
  "Import",
64
57
  "mdi mdi-upload",
65
- ButtonColorChoices.CYAN,
66
58
  permissions=["netbox_dns.add_nameserver"],
67
59
  ),
68
60
  ),
@@ -77,14 +69,12 @@ record_menu_item = PluginMenuItem(
77
69
  "plugins:netbox_dns:record_add",
78
70
  "Add",
79
71
  "mdi mdi-plus-thick",
80
- ButtonColorChoices.GREEN,
81
72
  permissions=["netbox_dns.add_record"],
82
73
  ),
83
74
  PluginMenuButton(
84
75
  "plugins:netbox_dns:record_import",
85
76
  "Import",
86
77
  "mdi mdi-upload",
87
- ButtonColorChoices.CYAN,
88
78
  permissions=["netbox_dns.add_record"],
89
79
  ),
90
80
  ),
@@ -105,14 +95,12 @@ registrar_menu_item = PluginMenuItem(
105
95
  "plugins:netbox_dns:registrar_add",
106
96
  "Add",
107
97
  "mdi mdi-plus-thick",
108
- ButtonColorChoices.GREEN,
109
98
  permissions=["netbox_dns.add_registrar"],
110
99
  ),
111
100
  PluginMenuButton(
112
101
  "plugins:netbox_dns:registrar_import",
113
102
  "Import",
114
103
  "mdi mdi-upload",
115
- ButtonColorChoices.CYAN,
116
104
  permissions=["netbox_dns.add_registrar"],
117
105
  ),
118
106
  ),
@@ -127,14 +115,12 @@ contact_menu_item = PluginMenuItem(
127
115
  "plugins:netbox_dns:contact_add",
128
116
  "Add",
129
117
  "mdi mdi-plus-thick",
130
- ButtonColorChoices.GREEN,
131
118
  permissions=["netbox_dns.add_contact"],
132
119
  ),
133
120
  PluginMenuButton(
134
121
  "plugins:netbox_dns:contact_import",
135
122
  "Import",
136
123
  "mdi mdi-upload",
137
- ButtonColorChoices.CYAN,
138
124
  permissions=["netbox_dns.add_contact"],
139
125
  ),
140
126
  ),
@@ -18,12 +18,7 @@ from netbox_dns.utilities.ipam_coupling import (
18
18
  DNSPermissionDenied,
19
19
  )
20
20
 
21
- try:
22
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
23
- from extras.plugins import get_plugin_config
24
- except ImportError:
25
- # NetBox 3.5.8
26
- from extras.plugins.utils import get_plugin_config
21
+ from netbox.plugins.utils import get_plugin_config
27
22
 
28
23
 
29
24
  @receiver(post_clean, sender=IPAddress)
@@ -39,14 +34,14 @@ def ip_address_check_permissions_save(instance, **kwargs):
39
34
  return
40
35
 
41
36
  try:
42
- if instance.id is None:
37
+ if instance.pk is None:
43
38
  record = new_address_record(instance)
44
39
  if record is not None:
45
40
  record.full_clean()
46
41
  check_permission(request, "netbox_dns.add_record", record)
47
42
 
48
43
  else:
49
- if not dns_changed(IPAddress.objects.get(pk=instance.id), instance):
44
+ if not dns_changed(IPAddress.objects.get(pk=instance.pk), instance):
50
45
  return
51
46
 
52
47
  record = get_address_record(instance)
@@ -18,6 +18,7 @@ class ContactTable(NetBoxTable):
18
18
  fields = (
19
19
  "contact_id",
20
20
  "name",
21
+ "description",
21
22
  "organization",
22
23
  "street",
23
24
  "city",
@@ -7,8 +7,6 @@ from netbox_dns.models import NameServer
7
7
 
8
8
 
9
9
  class NameServerTable(TenancyColumnsMixin, NetBoxTable):
10
- """Table for displaying NameServer objects."""
11
-
12
10
  name = tables.Column(
13
11
  linkify=True,
14
12
  )
@@ -17,6 +17,7 @@ class RegistrarTable(NetBoxTable):
17
17
  model = Registrar
18
18
  fields = (
19
19
  "name",
20
+ "description",
20
21
  "iana_id",
21
22
  "referral_url",
22
23
  "whois_server",
@@ -1,13 +1,9 @@
1
1
  from packaging import version
2
+
2
3
  from django.conf import settings
3
4
 
4
- try:
5
- # NetBox 3.5.0 - 3.5.7, 3.5.9+
6
- from extras.plugins import get_plugin_config
7
- except ImportError:
8
- # NetBox 3.5.8
9
- from extras.plugins.utils import get_plugin_config
10
- from extras.plugins import PluginTemplateExtension
5
+ from netbox.plugins.utils import get_plugin_config
6
+ from netbox.plugins import PluginTemplateExtension
11
7
 
12
8
  from netbox_dns.models import Record, RecordTypeChoices, Zone, View, NameServer
13
9
  from netbox_dns.tables import RelatedRecordTable
@@ -5,62 +5,66 @@
5
5
  <div class="col col-md-6">
6
6
  <div class="card">
7
7
  <h5 class="card-header">Contact</h5>
8
- <div class="card-body">
9
- <table class="table table-hover attr-table">
10
- <tr>
11
- <th scope="row">Name</th>
12
- <td>{{ object.name }}</td>
13
- </tr>
14
- <tr>
15
- <th scope="row">Contact ID</th>
16
- <td>{{ object.contact_id }}</td>
17
- </tr>
18
- <tr>
19
- <th scope="row">Organization</th>
20
- <td>{{ object.organization }}</td>
21
- </tr>
22
- <tr>
23
- <th scope="row">Street</th>
24
- <td>{{ object.street }}</td>
25
- </tr>
26
- <tr>
27
- <th scope="row">City</th>
28
- <td>{{ object.city }}</td>
29
- </tr>
30
- <tr>
31
- <th scope="row">State/Province</th>
32
- <td>{{ object.state_province }}</td>
33
- </tr>
34
- <tr>
35
- <th scope="row">Postal Code</th>
36
- <td>{{ object.postal_code }}</td>
37
- </tr>
38
- <tr>
39
- <th scope="row">Country</th>
40
- <td>{{ object.country }}</td>
41
- </tr>
42
- <tr>
43
- <th scope="row">Phone</th>
44
- <td>{{ object.phone }}</td>
45
- </tr>
46
- <tr>
47
- <th scope="row">Phone Extension</th>
48
- <td>{{ object.phone_ext }}</td>
49
- </tr>
50
- <tr>
51
- <th scope="row">Fax</th>
52
- <td>{{ object.fax }}</td>
53
- </tr>
54
- <tr>
55
- <th scope="row">Fax Extension</th>
56
- <td>{{ object.fax_ext }}</td>
57
- </tr>
58
- <tr>
59
- <th scope="row">Email</th>
60
- <td>{{ object.email }}</td>
61
- </tr>
62
- </table>
63
- </div>
8
+ <table class="table table-hover attr-table">
9
+ <tr>
10
+ <th scope="row">Name</th>
11
+ <td>{{ object.name }}</td>
12
+ </tr>
13
+ {% if object.description %}
14
+ <tr>
15
+ <th scope="row">Description</th>
16
+ <td style="word-break:break-all;">{{ object.description }}</td>
17
+ </tr>
18
+ {% endif %}
19
+ <tr>
20
+ <th scope="row">Contact ID</th>
21
+ <td>{{ object.contact_id }}</td>
22
+ </tr>
23
+ <tr>
24
+ <th scope="row">Organization</th>
25
+ <td>{{ object.organization }}</td>
26
+ </tr>
27
+ <tr>
28
+ <th scope="row">Street</th>
29
+ <td>{{ object.street }}</td>
30
+ </tr>
31
+ <tr>
32
+ <th scope="row">City</th>
33
+ <td>{{ object.city }}</td>
34
+ </tr>
35
+ <tr>
36
+ <th scope="row">State/Province</th>
37
+ <td>{{ object.state_province }}</td>
38
+ </tr>
39
+ <tr>
40
+ <th scope="row">Postal Code</th>
41
+ <td>{{ object.postal_code }}</td>
42
+ </tr>
43
+ <tr>
44
+ <th scope="row">Country</th>
45
+ <td>{{ object.country }}</td>
46
+ </tr>
47
+ <tr>
48
+ <th scope="row">Phone</th>
49
+ <td>{{ object.phone }}</td>
50
+ </tr>
51
+ <tr>
52
+ <th scope="row">Phone Extension</th>
53
+ <td>{{ object.phone_ext }}</td>
54
+ </tr>
55
+ <tr>
56
+ <th scope="row">Fax</th>
57
+ <td>{{ object.fax }}</td>
58
+ </tr>
59
+ <tr>
60
+ <th scope="row">Fax Extension</th>
61
+ <td>{{ object.fax_ext }}</td>
62
+ </tr>
63
+ <tr>
64
+ <th scope="row">Email</th>
65
+ <td>{{ object.email }}</td>
66
+ </tr>
67
+ </table>
64
68
  </div>
65
69
  {% include 'inc/panels/custom_fields.html' %}
66
70
  </div>
@@ -5,33 +5,33 @@
5
5
  <div class="col col-md-6">
6
6
  <div class="card">
7
7
  <h5 class="card-header">Name Server</h5>
8
- <div class="card-body">
9
- <table class="table table-hover attr-table">
10
- <tr>
11
- <th scope="row">Name</th>
12
- <td>{{ object.name }}</td>
13
- </tr>
14
- {% if unicode_name %}
15
- <tr>
16
- <th scope="row">IDN</th>
17
- <td>{{ unicode_name }}</td>
18
- </tr>
19
- {% endif %}
20
- <tr>
21
- <th scope="row">Tenant</th>
22
- <td>
23
- {% if object.tenant.group %}
24
- {{ object.tenant.group|linkify }} /
25
- {% endif %}
26
- {{ object.tenant|linkify|placeholder }}
27
- </td>
28
- </tr>
29
- <tr>
30
- <th scope="row">Description</th>
31
- <td>{{ object.description }}</td>
32
- </tr>
33
- </table>
34
- </div>
8
+ <table class="table table-hover attr-table">
9
+ <tr>
10
+ <th scope="row">Name</th>
11
+ <td>{{ object.name }}</td>
12
+ </tr>
13
+ {% if unicode_name %}
14
+ <tr>
15
+ <th scope="row">IDN</th>
16
+ <td>{{ unicode_name }}</td>
17
+ </tr>
18
+ {% endif %}
19
+ {% if object.description %}
20
+ <tr>
21
+ <th scope="row">Description</th>
22
+ <td style="word-break:break-all;">{{ object.description }}</td>
23
+ </tr>
24
+ {% endif %}
25
+ <tr>
26
+ <th scope="row">Tenant</th>
27
+ <td>
28
+ {% if object.tenant.group %}
29
+ {{ object.tenant.group|linkify }} /
30
+ {% endif %}
31
+ {{ object.tenant|linkify|placeholder }}
32
+ </td>
33
+ </tr>
34
+ </table>
35
35
  </div>
36
36
  {% include 'inc/panels/custom_fields.html' %}
37
37
  </div>