netbox-plugin-dns 0.22.8__py3-none-any.whl → 1.0.0__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 (115) hide show
  1. netbox_dns/__init__.py +4 -15
  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 +34 -0
  10. netbox_dns/api/serializers_/zone.py +159 -0
  11. netbox_dns/api/views.py +13 -13
  12. netbox_dns/fields/network.py +21 -22
  13. netbox_dns/fields/rfc2317.py +3 -3
  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 +65 -38
  23. netbox_dns/forms/registrar.py +45 -15
  24. netbox_dns/forms/view.py +23 -9
  25. netbox_dns/forms/zone.py +182 -188
  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 +143 -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 +558 -0
  36. netbox_dns/migrations/{0013_add_nameserver_zone_record_description.py → 0002_contact_description_registrar_description.py} +4 -9
  37. netbox_dns/migrations/0003_default_view.py +15 -0
  38. netbox_dns/migrations/0004_create_and_assign_default_view.py +26 -0
  39. netbox_dns/migrations/0005_alter_zone_view_not_null.py +18 -0
  40. netbox_dns/migrations/0020_netbox_3_4.py +1 -1
  41. netbox_dns/models/contact.py +6 -1
  42. netbox_dns/models/nameserver.py +5 -1
  43. netbox_dns/models/record.py +32 -34
  44. netbox_dns/models/registrar.py +5 -1
  45. netbox_dns/models/view.py +54 -1
  46. netbox_dns/models/zone.py +68 -54
  47. netbox_dns/navigation.py +1 -15
  48. netbox_dns/signals/ipam_coupling.py +3 -9
  49. netbox_dns/tables/contact.py +1 -0
  50. netbox_dns/tables/nameserver.py +0 -2
  51. netbox_dns/tables/registrar.py +1 -0
  52. netbox_dns/tables/view.py +9 -2
  53. netbox_dns/template_content.py +4 -8
  54. netbox_dns/templates/netbox_dns/contact.html +60 -56
  55. netbox_dns/templates/netbox_dns/nameserver.html +27 -27
  56. netbox_dns/templates/netbox_dns/record.html +92 -94
  57. netbox_dns/templates/netbox_dns/registrar.html +38 -36
  58. netbox_dns/templates/netbox_dns/view.html +25 -21
  59. netbox_dns/templates/netbox_dns/zone/base.html +5 -3
  60. netbox_dns/templates/netbox_dns/zone/child.html +3 -3
  61. netbox_dns/templates/netbox_dns/zone/managed_record.html +1 -1
  62. netbox_dns/templates/netbox_dns/zone/record.html +3 -3
  63. netbox_dns/templates/netbox_dns/zone/registration.html +26 -27
  64. netbox_dns/templates/netbox_dns/zone/rfc2317_child_zone.html +1 -1
  65. netbox_dns/templates/netbox_dns/zone.html +148 -149
  66. netbox_dns/urls/__init__.py +17 -0
  67. netbox_dns/urls/contact.py +51 -0
  68. netbox_dns/urls/nameserver.py +69 -0
  69. netbox_dns/urls/record.py +41 -0
  70. netbox_dns/urls/registrar.py +63 -0
  71. netbox_dns/urls/view.py +39 -0
  72. netbox_dns/urls/zone.py +57 -0
  73. netbox_dns/utilities/__init__.py +1 -6
  74. netbox_dns/utilities/ipam_coupling.py +2 -7
  75. netbox_dns/validators/dns_name.py +4 -9
  76. netbox_dns/validators/rfc2317.py +2 -2
  77. netbox_dns/views/contact.py +4 -4
  78. netbox_dns/views/nameserver.py +5 -5
  79. netbox_dns/views/record.py +14 -29
  80. netbox_dns/views/registrar.py +4 -4
  81. netbox_dns/views/view.py +4 -4
  82. netbox_dns/views/zone.py +7 -8
  83. {netbox_plugin_dns-0.22.8.dist-info → netbox_plugin_dns-1.0.0.dist-info}/METADATA +27 -13
  84. netbox_plugin_dns-1.0.0.dist-info/RECORD +112 -0
  85. netbox_dns/filters/nameserver.py +0 -18
  86. netbox_dns/filters/zone.py +0 -112
  87. netbox_dns/graphql/contact.py +0 -19
  88. netbox_dns/graphql/nameserver.py +0 -19
  89. netbox_dns/graphql/record.py +0 -19
  90. netbox_dns/graphql/registrar.py +0 -19
  91. netbox_dns/graphql/view.py +0 -19
  92. netbox_dns/graphql/zone.py +0 -19
  93. netbox_dns/migrations/0001_initial.py +0 -115
  94. netbox_dns/migrations/0002_zone_default_ttl.py +0 -18
  95. netbox_dns/migrations/0003_soa_managed_records.py +0 -112
  96. netbox_dns/migrations/0004_create_ptr_for_a_aaaa_records.py +0 -80
  97. netbox_dns/migrations/0005_update_ns_records.py +0 -41
  98. netbox_dns/migrations/0006_zone_soa_serial_auto.py +0 -29
  99. netbox_dns/migrations/0007_alter_zone_soa_serial_auto.py +0 -17
  100. netbox_dns/migrations/0008_zone_status_names.py +0 -21
  101. netbox_dns/migrations/0009_netbox32.py +0 -71
  102. netbox_dns/migrations/0010_update_soa_records.py +0 -58
  103. netbox_dns/migrations/0011_add_view_model.py +0 -70
  104. netbox_dns/migrations/0012_adjust_zone_and_record.py +0 -17
  105. netbox_dns/migrations/0014_add_view_description.py +0 -16
  106. netbox_dns/migrations/0015_add_record_status.py +0 -17
  107. netbox_dns/migrations/0016_cleanup_ptr_records.py +0 -38
  108. netbox_dns/migrations/0017_alter_record_ttl.py +0 -17
  109. netbox_dns/migrations/0018_zone_arpa_network.py +0 -51
  110. netbox_dns/migrations/0019_update_ns_ttl.py +0 -19
  111. netbox_dns/urls.py +0 -297
  112. netbox_plugin_dns-0.22.8.dist-info/RECORD +0 -117
  113. /netbox_dns/{filters → filtersets}/__init__.py +0 -0
  114. {netbox_plugin_dns-0.22.8.dist-info → netbox_plugin_dns-1.0.0.dist-info}/LICENSE +0 -0
  115. {netbox_plugin_dns-0.22.8.dist-info → netbox_plugin_dns-1.0.0.dist-info}/WHEEL +0 -0
@@ -5,6 +5,7 @@ from rest_framework.exceptions import PermissionDenied as APIPermissionDenied
5
5
 
6
6
  from netbox.signals import post_clean
7
7
  from netbox.context import current_request
8
+ from netbox.plugins.utils import get_plugin_config
8
9
  from ipam.models import IPAddress
9
10
 
10
11
  from netbox_dns.models import Zone
@@ -18,13 +19,6 @@ from netbox_dns.utilities.ipam_coupling import (
18
19
  DNSPermissionDenied,
19
20
  )
20
21
 
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
27
-
28
22
 
29
23
  @receiver(post_clean, sender=IPAddress)
30
24
  def ip_address_check_permissions_save(instance, **kwargs):
@@ -39,14 +33,14 @@ def ip_address_check_permissions_save(instance, **kwargs):
39
33
  return
40
34
 
41
35
  try:
42
- if instance.id is None:
36
+ if instance.pk is None:
43
37
  record = new_address_record(instance)
44
38
  if record is not None:
45
39
  record.full_clean()
46
40
  check_permission(request, "netbox_dns.add_record", record)
47
41
 
48
42
  else:
49
- if not dns_changed(IPAddress.objects.get(pk=instance.id), instance):
43
+ if not dns_changed(IPAddress.objects.get(pk=instance.pk), instance):
50
44
  return
51
45
 
52
46
  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",
netbox_dns/tables/view.py CHANGED
@@ -14,5 +14,12 @@ class ViewTable(TenancyColumnsMixin, NetBoxTable):
14
14
 
15
15
  class Meta(NetBoxTable.Meta):
16
16
  model = View
17
- fields = ("name", "description", "tenant", "tenant_group", "tags")
18
- default_columns = ("name",)
17
+ fields = (
18
+ "name",
19
+ "default_view",
20
+ "description",
21
+ "tenant",
22
+ "tenant_group",
23
+ "tags",
24
+ )
25
+ default_columns = ("name", "default_view")
@@ -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
@@ -121,7 +117,7 @@ class RelatedDNSObjects(PluginTemplateExtension):
121
117
  )
122
118
 
123
119
 
124
- template_extensions = list()
120
+ template_extensions = []
125
121
 
126
122
  if version.parse(settings.VERSION) < version.parse("3.7.0"):
127
123
  template_extensions.append(RelatedDNSObjects)
@@ -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>
@@ -4,15 +4,19 @@
4
4
  {% load render_table from django_tables2 %}
5
5
  {% load perms %}
6
6
 
7
- {% block controls %}
7
+ {% block control-buttons %}
8
8
  {% if object.managed %}
9
9
  {% else %}
10
10
  {{ block.super }}
11
11
  {% endif %}
12
- {% endblock controls %}
12
+ {% endblock control-buttons %}
13
13
 
14
14
  {% block breadcrumbs %}
15
- {% if not object.managed %}
15
+ {% if object.managed %}
16
+ <li class="breadcrumb-item">
17
+ <a href="{% url 'plugins:netbox_dns:managed_record_list' %}">{{ 'Managed Records' }}</a>
18
+ </li>
19
+ {% else %}
16
20
  {{ block.super }}
17
21
  {% endif %}
18
22
  {% endblock %}
@@ -33,106 +37,100 @@
33
37
  {% endif %}
34
38
  <div class="card">
35
39
  <h5 class="card-header">Record</h5>
36
- <div class="card-body">
37
- <table class="table table-hover attr-table">
38
- <tr>
39
- <th scope="row">Name</th>
40
- <td style="word-break:break-all;">{{ object.name }}</td>
41
- </tr>
42
- {% if unicode_name %}
43
- <tr>
44
- <th scope="row">IDN</th>
45
- <td style="word-break:break-all;">{{ unicode_name }}</td>
46
- </tr>
40
+ <table class="table table-hover attr-table">
41
+ <tr>
42
+ <th scope="row">Name</th>
43
+ <td style="word-break:break-all;">{{ object.name }}</td>
44
+ </tr>
45
+ {% if unicode_name %}
46
+ <tr>
47
+ <th scope="row">IDN</th>
48
+ <td style="word-break:break-all;">{{ unicode_name }}</td>
49
+ </tr>
50
+ {% endif %}
51
+ <tr>
52
+ <th scope="row">Zone</th>
53
+ {% if object.managed %}
54
+ <td><a href="{% url 'plugins:netbox_dns:zone_managed_records' pk=object.zone.pk %}">{{ object.zone }}</a></td>
55
+ {% else %}
56
+ <td><a href="{% url 'plugins:netbox_dns:zone_records' pk=object.zone.pk %}">{{ object.zone }}</a></td>
47
57
  {% endif %}
48
- <tr>
49
- <th scope="row">Zone</th>
50
- {% if object.managed %}
51
- <td><a href="{% url 'plugins:netbox_dns:zone_managed_records' pk=object.zone.pk %}">{{ object.zone }}</a></td>
52
- {% else %}
53
- <td><a href="{% url 'plugins:netbox_dns:zone_records' pk=object.zone.pk %}">{{ object.zone }}</a></td>
58
+ </tr>
59
+ {% if object.tenant %}
60
+ <tr>
61
+ <th scope="row">Tenant</th>
62
+ <td>
63
+ {% if object.tenant.group %}
64
+ {{ object.tenant.group|linkify }} /
54
65
  {% endif %}
55
- </tr>
56
- {% if not object.managed %}
57
- <tr>
58
- <th scope="row">Tenant</th>
59
- <td>
60
- {% if object.tenant.group %}
61
- {{ object.tenant.group|linkify }} /
62
- {% endif %}
63
- {{ object.tenant|linkify|placeholder }}
64
- </td>
65
- </tr>
66
- {% endif %}
67
- <tr>
68
- <th scope="row">Type</th>
69
- <td>{{ object.type }}</td>
70
- </tr>
71
- <tr>
72
- <th scope="row">Value</th>
73
- <td style="word-break:break-all;">{{ object.value }}</td>
74
- </tr>
75
- {% if unicode_value %}
76
- <tr>
77
- <th scope="row">Unicode Value</th>
78
- <td style="word-break:break-all;">{{ unicode_value }}</td>
79
- </tr>
80
- {% endif %}
81
- <tr>
82
- <th scope="row">TTL</th>
83
- <td>{{ object.ttl|placeholder }}</td>
84
- </tr>
85
- {% if object.type == 'A' or object.type == 'AAAA' %}
86
- <tr>
87
- <th scope="row">Disable PTR</th>
88
- <td>{% checkmark object.disable_ptr %}</td>
89
- </tr>
90
- {% endif %}
91
- {% if object.ptr_record %}
92
- <tr>
93
- <th scope="row">PTR Record</th>
94
- <td><a href="{% url 'plugins:netbox_dns:record' pk=object.ptr_record.pk %}">{{ object.ptr_record }}</td>
95
- </tr>
96
- {% endif %}
97
- {% if object.address_record %}
98
- <tr>
99
- <th scope="row">Address Record</th>
100
- <td><a href="{% url 'plugins:netbox_dns:record' pk=object.address_record.pk %}">{{ object.address_record }}</td>
101
- </tr>
102
- {% if object.address_record.ipam_ip_address %}
103
- <tr>
104
- <th scope="row">IPAM IP Address</th>
105
- <td><a href="{% url 'ipam:ipaddress' pk=object.address_record.ipam_ip_address.pk %}">{{ object.address_record.ipam_ip_address }}</td>
106
- </tr>
107
- {% endif %}
108
- {% endif %}
109
- {% if object.ipam_ip_address %}
66
+ {{ object.tenant|linkify|placeholder }}
67
+ </td>
68
+ </tr>
69
+ {% endif %}
70
+ <tr>
71
+ <th scope="row">Type</th>
72
+ <td>{{ object.type }}</td>
73
+ </tr>
74
+ <tr>
75
+ <th scope="row">Value</th>
76
+ <td style="word-break:break-all;">{{ object.value }}</td>
77
+ </tr>
78
+ {% if unicode_value %}
79
+ <tr>
80
+ <th scope="row">Unicode Value</th>
81
+ <td style="word-break:break-all;">{{ unicode_value }}</td>
82
+ </tr>
83
+ {% endif %}
84
+ <tr>
85
+ <th scope="row">TTL</th>
86
+ <td>{{ object.ttl|placeholder }}</td>
87
+ </tr>
88
+ {% if object.type == 'A' or object.type == 'AAAA' %}
89
+ <tr>
90
+ <th scope="row">Disable PTR</th>
91
+ <td>{% checkmark object.disable_ptr %}</td>
92
+ </tr>
93
+ {% endif %}
94
+ {% if object.ptr_record %}
95
+ <tr>
96
+ <th scope="row">PTR Record</th>
97
+ <td><a href="{% url 'plugins:netbox_dns:record' pk=object.ptr_record.pk %}">{{ object.ptr_record }}</td>
98
+ </tr>
99
+ {% endif %}
100
+ {% if object.address_record %}
101
+ <tr>
102
+ <th scope="row">Address Record</th>
103
+ <td><a href="{% url 'plugins:netbox_dns:record' pk=object.address_record.pk %}">{{ object.address_record }}</td>
104
+ </tr>
105
+ {% if object.address_record.ipam_ip_address %}
110
106
  <tr>
111
107
  <th scope="row">IPAM IP Address</th>
112
- <td><a href="{% url 'ipam:ipaddress' pk=object.ipam_ip_address.pk %}">{{ object.ipam_ip_address }}</td>
108
+ <td><a href="{% url 'ipam:ipaddress' pk=object.address_record.ipam_ip_address.pk %}">{{ object.address_record.ipam_ip_address }}</td>
113
109
  </tr>
114
110
  {% endif %}
115
- <tr>
116
- <th scope="row">Status</th>
117
- <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
118
- </tr>
119
- {% if object.description %}
120
- <tr>
121
- <th scope="row">Description</th>
122
- <td style="word-break:break-all;">{{ object.description }}</td>
123
- </tr>
124
- {% endif %}
125
- </table>
126
- </div>
111
+ {% endif %}
112
+ {% if object.ipam_ip_address %}
113
+ <tr>
114
+ <th scope="row">IPAM IP Address</th>
115
+ <td><a href="{% url 'ipam:ipaddress' pk=object.ipam_ip_address.pk %}">{{ object.ipam_ip_address }}</td>
116
+ </tr>
117
+ {% endif %}
118
+ <tr>
119
+ <th scope="row">Status</th>
120
+ <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
121
+ </tr>
122
+ {% if object.description %}
123
+ <tr>
124
+ <th scope="row">Description</th>
125
+ <td style="word-break:break-all;">{{ object.description }}</td>
126
+ </tr>
127
+ {% endif %}
128
+ </table>
127
129
  </div>
128
130
  {% if cname_target_table and cname_target_table.rows|length > 0 %}
129
- <div class="card">
130
- {% include 'inc/panel_table.html' with table=cname_target_table heading='CNAME Targets' %}
131
- </div>
131
+ {% include 'inc/panel_table.html' with table=cname_target_table heading='CNAME Targets' %}
132
132
  {% elif cname_table and cname_table.rows|length > 0 %}
133
- <div class="card">
134
- {% include 'inc/panel_table.html' with table=cname_table heading='CNAMEs' %}
135
- </div>
133
+ {% include 'inc/panel_table.html' with table=cname_table heading='CNAMEs' %}
136
134
  {% endif %}
137
135
  {% if not object.managed %}
138
136
  {% include 'inc/panels/custom_fields.html' %}
@@ -5,45 +5,47 @@
5
5
  <div class="col col-md-6">
6
6
  <div class="card">
7
7
  <h5 class="card-header">Registrar</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">IANA ID</th>
16
- <td>{{ object.iana_id }}</td>
17
- </tr>
18
- </table>
19
- </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">IANA ID</th>
21
+ <td>{{ object.iana_id }}</td>
22
+ </tr>
23
+ </table>
20
24
  </div>
21
25
  <div class="card">
22
26
  <h5 class="card-header">Contact Details</h5>
23
- <div class="card-body">
24
- <table class="table table-hover attr-table">
25
- <tr>
26
- <th scope="row">Address</th>
27
- <td>{{ object.address }}</td>
28
- </tr>
29
- <tr>
30
- <th scope="row">Referral URL</th>
31
- <td><a href="{{ object.referral_url }}">{{ object.referral_url }}</a></td>
32
- </tr>
33
- <tr>
34
- <th scope="row">WHOIS Server</th>
35
- <td>{{ object.whois_server }}</td>
36
- </tr>
37
- <tr>
38
- <th scope="row">Abuse Email</th>
39
- <td>{{ object.abuse_email }}</td>
40
- </tr>
41
- <tr>
42
- <th scope="row">Abuse Phone</th>
43
- <td>{{ object.abuse_phone }}</td>
44
- </tr>
45
- </table>
46
- </div>
27
+ <table class="table table-hover attr-table">
28
+ <tr>
29
+ <th scope="row">Address</th>
30
+ <td>{{ object.address }}</td>
31
+ </tr>
32
+ <tr>
33
+ <th scope="row">Referral URL</th>
34
+ <td><a href="{{ object.referral_url }}">{{ object.referral_url }}</a></td>
35
+ </tr>
36
+ <tr>
37
+ <th scope="row">WHOIS Server</th>
38
+ <td>{{ object.whois_server }}</td>
39
+ </tr>
40
+ <tr>
41
+ <th scope="row">Abuse Email</th>
42
+ <td>{{ object.abuse_email }}</td>
43
+ </tr>
44
+ <tr>
45
+ <th scope="row">Abuse Phone</th>
46
+ <td>{{ object.abuse_phone }}</td>
47
+ </tr>
48
+ </table>
47
49
  </div>
48
50
  {% include 'inc/panels/custom_fields.html' %}
49
51
  </div>