From e11e8a5d6436f770e8157bdbd20123e2878a5c7b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 09:15:25 -0500 Subject: [PATCH 01/39] Fixes #8213: Fix ValueError exception under prefix IP addresses view --- docs/release-notes/version-3.1.md | 4 ++++ netbox/ipam/views.py | 4 +--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 29213a4c5..b523ab8c7 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -2,6 +2,10 @@ ## v3.1.5 (FUTURE) +### Bug Fixes + +* [#8213](https://github.com/netbox-community/netbox/issues/8213) - Fix ValueError exception under prefix IP addresses view + --- ## v3.1.4 (2022-01-03) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 55ac284d1..c79a58dd6 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -505,9 +505,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): template_name = 'ipam/prefix/ip_addresses.html' def get_children(self, request, parent): - return parent.get_child_ips().restrict(request.user, 'view').prefetch_related( - 'vrf', 'role', 'tenant', - ) + return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant') def prep_table_data(self, request, queryset, parent): show_available = bool(request.GET.get('show_available', 'true') == 'true') From 2fe02ddb1f88a93cba82b04bbd3c2caa0425e5b6 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 09:32:41 -0500 Subject: [PATCH 02/39] Add tests for IPAM object children views --- netbox/ipam/tests/test_views.py | 77 +++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index 022ea13c3..4f0f9a214 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -1,5 +1,7 @@ import datetime +from django.test import override_settings +from django.urls import reverse from netaddr import IPNetwork from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site @@ -222,6 +224,21 @@ class AggregateTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'description': 'New description', } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_aggregate_prefixes(self): + rir = RIR.objects.first() + aggregate = Aggregate.objects.create(prefix=IPNetwork('192.168.0.0/16'), rir=rir) + prefixes = ( + Prefix(prefix=IPNetwork('192.168.1.0/24')), + Prefix(prefix=IPNetwork('192.168.2.0/24')), + Prefix(prefix=IPNetwork('192.168.3.0/24')), + ) + Prefix.objects.bulk_create(prefixes) + self.assertEqual(aggregate.get_child_prefixes().count(), 3) + + url = reverse('ipam:aggregate_prefixes', kwargs={'pk': aggregate.pk}) + self.assertHttpStatus(self.client.get(url), 200) + class RoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): model = Role @@ -319,6 +336,48 @@ class PrefixTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'description': 'New description', } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_prefix_prefixes(self): + prefixes = ( + Prefix(prefix=IPNetwork('192.168.0.0/16')), + Prefix(prefix=IPNetwork('192.168.1.0/24')), + Prefix(prefix=IPNetwork('192.168.2.0/24')), + Prefix(prefix=IPNetwork('192.168.3.0/24')), + ) + Prefix.objects.bulk_create(prefixes) + self.assertEqual(prefixes[0].get_child_prefixes().count(), 3) + + url = reverse('ipam:prefix_prefixes', kwargs={'pk': prefixes[0].pk}) + self.assertHttpStatus(self.client.get(url), 200) + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_prefix_ipranges(self): + prefix = Prefix.objects.create(prefix=IPNetwork('192.168.0.0/16')) + ip_ranges = ( + IPRange(start_address='192.168.0.1/24', end_address='192.168.0.100/24', size=99), + IPRange(start_address='192.168.1.1/24', end_address='192.168.1.100/24', size=99), + IPRange(start_address='192.168.2.1/24', end_address='192.168.2.100/24', size=99), + ) + IPRange.objects.bulk_create(ip_ranges) + self.assertEqual(prefix.get_child_ranges().count(), 3) + + url = reverse('ipam:prefix_ipranges', kwargs={'pk': prefix.pk}) + self.assertHttpStatus(self.client.get(url), 200) + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_prefix_ipaddresses(self): + prefix = Prefix.objects.create(prefix=IPNetwork('192.168.0.0/16')) + ip_addresses = ( + IPAddress(address=IPNetwork('192.168.0.1/16')), + IPAddress(address=IPNetwork('192.168.0.2/16')), + IPAddress(address=IPNetwork('192.168.0.3/16')), + ) + IPAddress.objects.bulk_create(ip_addresses) + self.assertEqual(prefix.get_child_ips().count(), 3) + + url = reverse('ipam:prefix_ipaddresses', kwargs={'pk': prefix.pk}) + self.assertHttpStatus(self.client.get(url), 200) + class IPRangeTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = IPRange @@ -377,6 +436,24 @@ class IPRangeTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'description': 'New description', } + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_iprange_ipaddresses(self): + iprange = IPRange.objects.create( + start_address=IPNetwork('192.168.0.1/24'), + end_address=IPNetwork('192.168.0.100/24'), + size=99 + ) + ip_addresses = ( + IPAddress(address=IPNetwork('192.168.0.1/24')), + IPAddress(address=IPNetwork('192.168.0.2/24')), + IPAddress(address=IPNetwork('192.168.0.3/24')), + ) + IPAddress.objects.bulk_create(ip_addresses) + self.assertEqual(iprange.get_child_ips().count(), 3) + + url = reverse('ipam:iprange_ipaddresses', kwargs={'pk': iprange.pk}) + self.assertHttpStatus(self.client.get(url), 200) + class IPAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = IPAddress From 8c8774cd2fd5e826c6787b415af2136429b4eecb Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 13:24:15 -0500 Subject: [PATCH 03/39] Fixes #8226: Honor return URL after populating a device bay --- docs/release-notes/version-3.1.md | 1 + netbox/dcim/views.py | 3 ++- netbox/templates/dcim/devicebay_populate.html | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index b523ab8c7..963aaad23 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#8213](https://github.com/netbox-community/netbox/issues/8213) - Fix ValueError exception under prefix IP addresses view +* [#8226](https://github.com/netbox-community/netbox/issues/8226) - Honor return URL after populating a device bay --- diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 7048ae63e..cee516f5c 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2035,8 +2035,9 @@ class DeviceBayPopulateView(generic.ObjectEditView): device_bay.installed_device = form.cleaned_data['installed_device'] device_bay.save() messages.success(request, "Added {} to {}.".format(device_bay.installed_device, device_bay)) + return_url = self.get_return_url(request) - return redirect('dcim:device', pk=device_bay.device.pk) + return redirect(return_url) return render(request, 'dcim/devicebay_populate.html', { 'device_bay': device_bay, diff --git a/netbox/templates/dcim/devicebay_populate.html b/netbox/templates/dcim/devicebay_populate.html index d0f47921a..237227277 100644 --- a/netbox/templates/dcim/devicebay_populate.html +++ b/netbox/templates/dcim/devicebay_populate.html @@ -4,7 +4,7 @@ {% render_errors form %} {% block content %} -
+ {% csrf_token %}
From ea961ba8f219e9a52b8a10c6a832faed1ed323c3 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 13:49:07 -0500 Subject: [PATCH 04/39] Fixes #8224: Fix KeyError exception when creating FHRP group with IP address and protocol "other" --- docs/release-notes/version-3.1.md | 1 + netbox/ipam/constants.py | 1 + netbox/ipam/forms/models.py | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 963aaad23..4e8446b41 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#8213](https://github.com/netbox-community/netbox/issues/8213) - Fix ValueError exception under prefix IP addresses view +* [#8224](https://github.com/netbox-community/netbox/issues/8224) - Fix KeyError exception when creating FHRP group with IP address and protocol "other" * [#8226](https://github.com/netbox-community/netbox/issues/8226) - Honor return URL after populating a device bay --- diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py index b19d4061b..ab88dfc1a 100644 --- a/netbox/ipam/constants.py +++ b/netbox/ipam/constants.py @@ -65,6 +65,7 @@ FHRP_PROTOCOL_ROLE_MAPPINGS = { FHRPGroupProtocolChoices.PROTOCOL_HSRP: IPAddressRoleChoices.ROLE_HSRP, FHRPGroupProtocolChoices.PROTOCOL_GLBP: IPAddressRoleChoices.ROLE_GLBP, FHRPGroupProtocolChoices.PROTOCOL_CARP: IPAddressRoleChoices.ROLE_CARP, + FHRPGroupProtocolChoices.PROTOCOL_OTHER: IPAddressRoleChoices.ROLE_VIP, } diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index c5e3146e9..0f85a95b1 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -580,7 +580,7 @@ class FHRPGroupForm(CustomFieldModelForm): vrf=self.cleaned_data['ip_vrf'], address=self.cleaned_data['ip_address'], status=self.cleaned_data['ip_status'], - role=FHRP_PROTOCOL_ROLE_MAPPINGS[self.cleaned_data['protocol']], + role=FHRP_PROTOCOL_ROLE_MAPPINGS.get(self.cleaned_data['protocol'], IPAddressRoleChoices.ROLE_VIP), assigned_object=instance ) ipaddress.save() From 662cafe416b7dd0ed2a23735453131a3361d931d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 15:01:16 -0500 Subject: [PATCH 05/39] Form widgets & style cleanup --- netbox/extras/forms/models.py | 18 ++++++++++++++---- netbox/ipam/forms/models.py | 3 +-- netbox/project-static/dist/netbox-light.css | Bin 493807 -> 493807 bytes netbox/project-static/dist/netbox-print.css | Bin 1624275 -> 1624275 bytes netbox/project-static/styles/theme-light.scss | 2 -- netbox/utilities/forms/fields.py | 4 ++-- netbox/utilities/forms/widgets.py | 10 ---------- .../templates/widgets/select_contenttype.html | 1 - 8 files changed, 17 insertions(+), 21 deletions(-) delete mode 100644 netbox/utilities/templates/widgets/select_contenttype.html diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index 1e619ebec..89ab7aa19 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -7,8 +7,8 @@ from extras.models import * from extras.utils import FeatureQuery from tenancy.models import Tenant, TenantGroup from utilities.forms import ( - add_blank_choice, BootstrapMixin, CommentField, ContentTypeChoiceField, - ContentTypeMultipleChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField, StaticSelect, + add_blank_choice, BootstrapMixin, CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, + DynamicModelMultipleChoiceField, JSONField, SlugField, StaticSelect, ) from virtualization.models import Cluster, ClusterGroup @@ -41,6 +41,10 @@ class CustomFieldForm(BootstrapMixin, forms.ModelForm): ('Values', ('default', 'choices')), ('Validation', ('validation_minimum', 'validation_maximum', 'validation_regex')), ) + widgets = { + 'type': StaticSelect(), + 'filter_logic': StaticSelect(), + } class CustomLinkForm(BootstrapMixin, forms.ModelForm): @@ -57,6 +61,7 @@ class CustomLinkForm(BootstrapMixin, forms.ModelForm): ('Templates', ('link_text', 'link_url')), ) widgets = { + 'button_class': StaticSelect(), 'link_text': forms.Textarea(attrs={'class': 'font-monospace'}), 'link_url': forms.Textarea(attrs={'class': 'font-monospace'}), } @@ -96,8 +101,7 @@ class WebhookForm(BootstrapMixin, forms.ModelForm): model = Webhook fields = '__all__' fieldsets = ( - ('Webhook', ('name', 'enabled')), - ('Assigned Models', ('content_types',)), + ('Webhook', ('name', 'content_types', 'enabled')), ('Events', ('type_create', 'type_update', 'type_delete')), ('HTTP Request', ( 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', @@ -105,7 +109,13 @@ class WebhookForm(BootstrapMixin, forms.ModelForm): ('Conditions', ('conditions',)), ('SSL', ('ssl_verification', 'ca_file_path')), ) + labels = { + 'type_create': 'Creations', + 'type_update': 'Updates', + 'type_delete': 'Deletions', + } widgets = { + 'http_method': StaticSelect(), 'additional_headers': forms.Textarea(attrs={'class': 'font-monospace'}), 'body_template': forms.Textarea(attrs={'class': 'font-monospace'}), } diff --git a/netbox/ipam/forms/models.py b/netbox/ipam/forms/models.py index 0f85a95b1..4ed8aa267 100644 --- a/netbox/ipam/forms/models.py +++ b/netbox/ipam/forms/models.py @@ -628,8 +628,7 @@ class FHRPGroupAssignmentForm(BootstrapMixin, forms.ModelForm): class VLANGroupForm(CustomFieldModelForm): scope_type = ContentTypeChoiceField( queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), - required=False, - widget=StaticSelect + required=False ) region = DynamicModelChoiceField( queryset=Region.objects.all(), diff --git a/netbox/project-static/dist/netbox-light.css b/netbox/project-static/dist/netbox-light.css index 23dc8d3821e58e7264fe4bd3109dea298dc227bf..215f986bb1045d51eac763de5aac1e0e23d59cad 100644 GIT binary patch delta 216 zcmaDqQSSXjxeaCU(-l^;vNzYpx7Wrq0x=U1GXpWp_S$$>{a}zR+jPZQtg_qBZ(`la z0pV}h#j3D<-ELM9Sunr-#0}Q%CvLFuWlf*2#>75d-kn`zngt{8IO;>eh z&j6{EoBm-3Gu!ly&g`=%C){V7yx|#~ezHT?Gh%8j3{lpE{?I&)q@nubyRbXPDF7M8+G0lRJck-Pu-pLc5vrSiZ zX3v1Covb)ZY`VY^W{&9_o!MtkE_li|IpG=4Ous$nGgAqiZrAn19hVSGEoqP#9W4+Fn1+^l>(*E>Z1V|Sfv3G&(rzdza(bU2voPJ zE{=BSZvL++nr44FRi`M7EYu@Xb#^cYMpjW^q3)qjSmZKHncRZh4-132s6`K}eAdYY z6==OP6>2JvLiN;Z!1uUhkkY!Hw2N^5!M4Dhp;2f~>qN|avK5Kg6L#8Ohi02a;P#Se z;_{0|toA-0$X(|GtRJEO_bSOHlQC2s9MFBwjWCbny#O CaFav; delta 438 zcmZ9`JxD@P7zSX}+qrtZH?JP;9PEcef()XX`f;#=gixp^8wE4kifC$TiN*?vcZ)kU zH53$QNt%o3hn5HeA)F#;h=zWw&!~uoXZXGsUf!#X{MAN&dEYgZWQBo3zA&?zO1g-f zc!);o2qQZ25+5;$pP0lV^&~)S5+os&O7b1?U5d#Z=O{Px09vPbK*h6stnnvno90nC z^W0Qh3w$w)5gu$`?K|NlOd_N~^__^7Zk)H;41*Ojj9gl3NZ2xhi4PHmo%XkEI&!o) z5!6wB76x_=*#c+JW8uBmWg(Z<84g~=EY@$#COF*ks^M2L>B8K#o8h7=qBt!vzbd_n z`>$tQT~@`D_M4Am_sA1MPm!6bUz5ig)~?;YVl2l0jLB7njU_``*w$nx&JF2Bmm!;r wJs}30$#^YnuU)jZ180Wx)$-fgJ{^gQ`L8U3hdP;oconsole server port - This attribute can be used to reference the relevant API endpoint for a particular ContentType. - """ - option_template_name = 'widgets/select_contenttype.html' - - class SelectSpeedWidget(forms.NumberInput): """ Speed field with dropdown selections for convenience. diff --git a/netbox/utilities/templates/widgets/select_contenttype.html b/netbox/utilities/templates/widgets/select_contenttype.html deleted file mode 100644 index 04c42c371..000000000 --- a/netbox/utilities/templates/widgets/select_contenttype.html +++ /dev/null @@ -1 +0,0 @@ - From 0a22b3990fe93c27f19dfe1797de7ce07ffd109f Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 4 Jan 2022 20:42:44 -0500 Subject: [PATCH 06/39] #7450: Clean up footer and navbar styles --- netbox/project-static/dist/netbox-dark.css | Bin 789153 -> 789142 bytes netbox/project-static/dist/netbox-light.css | Bin 493807 -> 493753 bytes netbox/project-static/dist/netbox-print.css | Bin 1624275 -> 1624333 bytes netbox/project-static/styles/netbox.scss | 18 +++--- netbox/project-static/styles/theme-dark.scss | 2 +- netbox/project-static/styles/theme-light.scss | 2 + netbox/templates/base/layout.html | 2 +- netbox/templates/extras/report.html | 55 +++++++++++------- netbox/templates/extras/report_result.html | 2 +- 9 files changed, 46 insertions(+), 35 deletions(-) diff --git a/netbox/project-static/dist/netbox-dark.css b/netbox/project-static/dist/netbox-dark.css index e711685bf40042d2b0918218882f0acba69a0d49..4cb2f191d5dcdfc2729ee80dd254d9d59853a8bd 100644 GIT binary patch delta 296 zcmZ2D)nM9GgN7Ey7N!>F7M3lnk?qr2vKh6eCzP|YPY-Bg<(ux%!OA<`wwKiqiQCc3 z%D4T0J8J~vboDew(dqxUazeE%=w{`gzNVA4gU!&~Fv&1w`u%>^>C=ItLX6eZ|7I~7 zLQDnxVl$&Sz)kWNr)8*%I zvu>|n#QlVKI?Dr2q3H@`%2E)==}cGH#Vxk|$!=~=x9J)nMUNgN7Ey7N!>F7M3lnk?qr8hOuf*Pbg<)pB~W0$~WDigOzu>Z7-`K61St5 zm2dn1cGd{S=@G4rqSOCx<%DWk(9Oy}eN8882U}uFl4(-P^!xp+)29PPg{D6YV>N=9 z3*?Hl8+5Y*F&hxG12G2>a{@8fc7ty24`S0Bd^x$M^Yw9ZOx|R#Jbl3mZl39<7I8~% z&tJs-l6QOI2JUo@=@kX6BHPV&a<5`yOUp^Euri!{aH+`jx1ZQ_rccHnE{xVEol;t^z=zLuRwXu5nEGyiloQFcLgWfMzN15@+q4wE$1F5mGl^Lc!tzdH7MNZc4dhzIGxJWDh-T((e;CIM z#4JF}y8U4so7Us$4$bWBjJ4AXoY+;jJ3F!Sb4_=NWfPv9u$ygrkPrJs7RKu7AM#lw zrmx<_%DG)Oko`B~^he)VB-pLfa#Aa-45u5MXO-J-6U@F`fBMFBHc`g3=~3>?Qqw;- Nu^-P& delta 215 zcmdlvQSSXjxrP?T7N#xCYoj>~z`!DTdSf)R%J%Eg%p8meu>vb*(e1xtm|c;?7^9iR z+hgLGftUq|S+~c;v8{YO`GG&%^y*WroGeM{nzhs8o!C{k8#%G_b8V0EVZX?-Jvfm4 zE93UWVD{7c(^K4;1*XR|vmc*6r;S}`dcGVJ|MU|ZSR{mN9dc7sG7}XFiZb&`s`W|| nlXRy$1hY%R4QB=#KE0lkRf5$jFF!AJdPNJn;&#gx_68OJIbTLo diff --git a/netbox/project-static/dist/netbox-print.css b/netbox/project-static/dist/netbox-print.css index 2d702b89a02932ba5f1efb8d489493e8cb39eaab..f292f7bd8cf58bac5bf3d25763017d89b222f6d3 100644 GIT binary patch delta 299 zcmcaSF}ZhAazhJa3sVbo3rh=Y3tJ0&3r7oQ3)dFzm?zV}d$IFQZ-2-wy1n5E_ZF7v ztby#J+r3|MM>9>&a^~lqe*HDKbo+(Z+(66&#JoVv2gLk9EC9rUKr95r!aytn#G*hf zw*A6uaewaV4o4-}r{A6^A~HR}TY_b})(`Oo+h2YcHpe6Z?{YEO<%WNf^E9OGH$S;T+`1jz!(Es*jGWz|*1*>QrlkDLF9}I=x4a)?-Vf#"); $navbar-light-toggler-border-color: $gray-700; diff --git a/netbox/project-static/styles/theme-light.scss b/netbox/project-static/styles/theme-light.scss index 22cc48108..0ca85319b 100644 --- a/netbox/project-static/styles/theme-light.scss +++ b/netbox/project-static/styles/theme-light.scss @@ -22,6 +22,8 @@ $theme-colors: map-merge($theme-colors, $theme-color-addons); $light: $gray-200; +$navbar-light-color: $gray-100; + $card-cap-color: $gray-800; $accordion-bg: transparent; diff --git a/netbox/templates/base/layout.html b/netbox/templates/base/layout.html index 7b1597bf0..1959ef38d 100644 --- a/netbox/templates/base/layout.html +++ b/netbox/templates/base/layout.html @@ -20,7 +20,7 @@
{# Top bar #} -
- {% table_config_form table %} {% endblock %} + +{% block modals %} + {% table_config_form table %} +{% endblock modals %} diff --git a/netbox/templates/ipam/iprange/ip_addresses.html b/netbox/templates/ipam/iprange/ip_addresses.html index 210cff812..8663c158f 100644 --- a/netbox/templates/ipam/iprange/ip_addresses.html +++ b/netbox/templates/ipam/iprange/ip_addresses.html @@ -35,5 +35,8 @@ - {% table_config_form table %} {% endblock %} + +{% block modals %} + {% table_config_form table %} +{% endblock modals %} diff --git a/netbox/templates/ipam/prefix/ip_addresses.html b/netbox/templates/ipam/prefix/ip_addresses.html index e2f77756c..ae5d3cf74 100644 --- a/netbox/templates/ipam/prefix/ip_addresses.html +++ b/netbox/templates/ipam/prefix/ip_addresses.html @@ -35,5 +35,8 @@ - {% table_config_form table %} {% endblock %} + +{% block modals %} + {% table_config_form table %} +{% endblock modals %} diff --git a/netbox/templates/ipam/prefix/ip_ranges.html b/netbox/templates/ipam/prefix/ip_ranges.html index af80578a0..3d5e0c4c0 100644 --- a/netbox/templates/ipam/prefix/ip_ranges.html +++ b/netbox/templates/ipam/prefix/ip_ranges.html @@ -35,5 +35,8 @@ - {% table_config_form table %} {% endblock %} + +{% block modals %} + {% table_config_form table %} +{% endblock modals %} diff --git a/netbox/templates/ipam/prefix/prefixes.html b/netbox/templates/ipam/prefix/prefixes.html index 18fcbb569..21756a36a 100644 --- a/netbox/templates/ipam/prefix/prefixes.html +++ b/netbox/templates/ipam/prefix/prefixes.html @@ -37,5 +37,8 @@ - {% table_config_form table %} {% endblock %} + +{% block modals %} + {% table_config_form table %} +{% endblock modals %} diff --git a/netbox/templates/ipam/vlan/interfaces.html b/netbox/templates/ipam/vlan/interfaces.html index acba983aa..3ce00631f 100644 --- a/netbox/templates/ipam/vlan/interfaces.html +++ b/netbox/templates/ipam/vlan/interfaces.html @@ -5,13 +5,14 @@
{% csrf_token %} {% include 'inc/table_controls_htmx.html' with table_modal="VLANDevicesTable_config" %} -
{% include 'htmx/table.html' %}
-
+{% endblock content %} + +{% block modals %} {% table_config_form table %} -{% endblock %} +{% endblock modals %} diff --git a/netbox/templates/ipam/vlan/vminterfaces.html b/netbox/templates/ipam/vlan/vminterfaces.html index aff559393..fcd207894 100644 --- a/netbox/templates/ipam/vlan/vminterfaces.html +++ b/netbox/templates/ipam/vlan/vminterfaces.html @@ -5,13 +5,14 @@
{% csrf_token %} {% include 'inc/table_controls_htmx.html' with table_modal="VLANVirtualMachinesTable_config" %} -
{% include 'htmx/table.html' %}
-
+{% endblock content %} + +{% block modals %} {% table_config_form table %} -{% endblock %} +{% endblock modals %} diff --git a/netbox/templates/virtualization/cluster/devices.html b/netbox/templates/virtualization/cluster/devices.html index ab774a29c..700006196 100644 --- a/netbox/templates/virtualization/cluster/devices.html +++ b/netbox/templates/virtualization/cluster/devices.html @@ -6,13 +6,11 @@
{% csrf_token %} {% include 'inc/table_controls_htmx.html' with table_modal="DeviceTable_config" %} -
{% include 'htmx/table.html' %}
-
{% if perms.virtualization.change_cluster %} @@ -23,5 +21,8 @@
+{% endblock content %} + +{% block modals %} {% table_config_form table %} -{% endblock %} +{% endblock modals %} diff --git a/netbox/templates/virtualization/cluster/virtual_machines.html b/netbox/templates/virtualization/cluster/virtual_machines.html index 7681e3413..5b0359e07 100644 --- a/netbox/templates/virtualization/cluster/virtual_machines.html +++ b/netbox/templates/virtualization/cluster/virtual_machines.html @@ -6,13 +6,11 @@
{% csrf_token %} {% include 'inc/table_controls_htmx.html' with table_modal="VirtualMachineTable_config" %} -
{% include 'htmx/table.html' %}
-
{% if perms.virtualization.change_virtualmachine %} @@ -28,5 +26,8 @@
+{% endblock content %} + +{% block modals %} {% table_config_form table %} -{% endblock %} +{% endblock modals %} diff --git a/netbox/templates/virtualization/virtualmachine/interfaces.html b/netbox/templates/virtualization/virtualmachine/interfaces.html index 6b3e70c7f..5f6ab52ad 100644 --- a/netbox/templates/virtualization/virtualmachine/interfaces.html +++ b/netbox/templates/virtualization/virtualmachine/interfaces.html @@ -37,5 +37,8 @@
+{% endblock content %} + +{% block modals %} {% table_config_form table %} -{% endblock %} +{% endblock modals %} From 511aedd5dba206a781897d70751c32df7571fcdf Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Jan 2022 11:39:58 -0500 Subject: [PATCH 10/39] Omit table configuration form from rack elevations view --- netbox/templates/dcim/rack_elevation_list.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/templates/dcim/rack_elevation_list.html b/netbox/templates/dcim/rack_elevation_list.html index 312b543a6..87a047900 100644 --- a/netbox/templates/dcim/rack_elevation_list.html +++ b/netbox/templates/dcim/rack_elevation_list.html @@ -73,3 +73,5 @@ {% endblock content-wrapper %} + +{% block modals %}{% endblock %} From 443b4ccc573f07f582f0c9ca8485f15d3517c71d Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Jan 2022 11:23:11 -0500 Subject: [PATCH 11/39] Initial work on #8231 --- netbox/ipam/views.py | 1 - netbox/netbox/views/generic.py | 20 +++++++++++++++---- netbox/templates/generic/object.html | 6 +++++- netbox/templates/generic/object_delete.html | 19 ++++++++++++------ netbox/templates/htmx/delete_form.html | 20 +++++++++++++++++++ netbox/templates/inc/htmx_modal.html | 7 +++++++ netbox/templates/ipam/prefix_delete.html | 5 ----- .../utilities/templates/buttons/delete.html | 10 ++++++++-- 8 files changed, 69 insertions(+), 19 deletions(-) create mode 100644 netbox/templates/htmx/delete_form.html create mode 100644 netbox/templates/inc/htmx_modal.html delete mode 100644 netbox/templates/ipam/prefix_delete.html diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index c79a58dd6..38b30e9cc 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -529,7 +529,6 @@ class PrefixEditView(generic.ObjectEditView): class PrefixDeleteView(generic.ObjectDeleteView): queryset = Prefix.objects.all() - template_name = 'ipam/prefix_delete.html' class PrefixBulkImportView(generic.BulkImportView): diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index feff2ca39..74f8f325b 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -10,6 +10,7 @@ from django.db.models import ManyToManyField, ProtectedError from django.forms import Form, ModelMultipleChoiceField, MultipleHiddenInput, Textarea from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from django.utils.html import escape from django.utils.http import is_safe_url from django.utils.safestring import mark_safe @@ -430,10 +431,21 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): obj = self.get_object(kwargs) form = ConfirmationForm(initial=request.GET) + # If this is an HTMX request, return only the rendered deletion form as modal content + if is_htmx(request): + viewname = f'{self.queryset.model._meta.app_label}:{self.queryset.model._meta.model_name}_delete' + form_url = reverse(viewname, kwargs={'pk': obj.pk}) + return render(request, 'htmx/delete_form.html', { + 'object': obj, + 'object_type': self.queryset.model._meta.verbose_name, + 'form': form, + 'form_url': form_url, + }) + return render(request, self.template_name, { - 'obj': obj, + 'object': obj, + 'object_type': self.queryset.model._meta.verbose_name, 'form': form, - 'obj_type': self.queryset.model._meta.verbose_name, 'return_url': self.get_return_url(request, obj), }) @@ -466,9 +478,9 @@ class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): logger.debug("Form validation failed") return render(request, self.template_name, { - 'obj': obj, + 'object': obj, + 'object_type': self.queryset.model._meta.verbose_name, 'form': form, - 'obj_type': self.queryset.model._meta.verbose_name, 'return_url': self.get_return_url(request, obj), }) diff --git a/netbox/templates/generic/object.html b/netbox/templates/generic/object.html index 40c0e09ce..4d616f944 100644 --- a/netbox/templates/generic/object.html +++ b/netbox/templates/generic/object.html @@ -100,4 +100,8 @@
{% block content %}{% endblock %}
-{% endblock %} +{% endblock content-wrapper %} + +{% block modals %} + {% include 'inc/htmx_modal.html' %} +{% endblock modals %} diff --git a/netbox/templates/generic/object_delete.html b/netbox/templates/generic/object_delete.html index 85cedd29c..d0603ace0 100644 --- a/netbox/templates/generic/object_delete.html +++ b/netbox/templates/generic/object_delete.html @@ -1,9 +1,16 @@ -{% extends 'generic/confirmation_form.html' %} +{% extends 'base/layout.html' %} {% load form_helpers %} -{% block title %}Delete {{ obj_type }}?{% endblock %} +{% block title %}Delete {{ object_type }}?{% endblock %} -{% block message %} -

Are you sure you want to delete {{ obj_type }} {{ obj }}?

- {% block message_extra %}{% endblock %} -{% endblock message %} +{% block header %}{% endblock %} + +{% block content %} + +{% endblock %} diff --git a/netbox/templates/htmx/delete_form.html b/netbox/templates/htmx/delete_form.html new file mode 100644 index 000000000..fc1cbe0a0 --- /dev/null +++ b/netbox/templates/htmx/delete_form.html @@ -0,0 +1,20 @@ +{% load form_helpers %} + +
+ {% csrf_token %} + + + +
diff --git a/netbox/templates/inc/htmx_modal.html b/netbox/templates/inc/htmx_modal.html new file mode 100644 index 000000000..771f5d595 --- /dev/null +++ b/netbox/templates/inc/htmx_modal.html @@ -0,0 +1,7 @@ + diff --git a/netbox/templates/ipam/prefix_delete.html b/netbox/templates/ipam/prefix_delete.html deleted file mode 100644 index eb7a22d3c..000000000 --- a/netbox/templates/ipam/prefix_delete.html +++ /dev/null @@ -1,5 +0,0 @@ -{% extends 'generic/object_delete.html' %} - -{% block message_extra %} -

Note: This will not delete any child prefixes or IP addresses.

-{% endblock %} diff --git a/netbox/utilities/templates/buttons/delete.html b/netbox/utilities/templates/buttons/delete.html index 6fe3fe7d8..a027edeec 100644 --- a/netbox/utilities/templates/buttons/delete.html +++ b/netbox/utilities/templates/buttons/delete.html @@ -1,3 +1,9 @@ - -  Delete + +  Delete From ccda73494f5f4b104f280865b5c99eb43014cb0e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 5 Jan 2022 14:57:56 -0500 Subject: [PATCH 12/39] Center modal dialog vertically --- netbox/templates/inc/htmx_modal.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/inc/htmx_modal.html b/netbox/templates/inc/htmx_modal.html index 771f5d595..d15e5b799 100644 --- a/netbox/templates/inc/htmx_modal.html +++ b/netbox/templates/inc/htmx_modal.html @@ -1,5 +1,5 @@ {% plugin_right_page object %} diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py index a0482aa1d..0312949d1 100644 --- a/netbox/tenancy/api/serializers.py +++ b/netbox/tenancy/api/serializers.py @@ -40,13 +40,14 @@ class TenantSerializer(PrimaryModelSerializer): vlan_count = serializers.IntegerField(read_only=True) vrf_count = serializers.IntegerField(read_only=True) cluster_count = serializers.IntegerField(read_only=True) + cable_count = serializers.IntegerField(read_only=True) class Meta: model = Tenant fields = [ 'id', 'url', 'display', 'name', 'slug', 'group', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'ipaddress_count', 'prefix_count', 'rack_count', - 'site_count', 'virtualmachine_count', 'vlan_count', 'vrf_count', 'cluster_count', + 'site_count', 'virtualmachine_count', 'vlan_count', 'vrf_count', 'cluster_count', 'cable_count', ] diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index 50b188b5f..f4b8abbf1 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -1,7 +1,7 @@ from rest_framework.routers import APIRootView from circuits.models import Circuit -from dcim.models import Device, Rack, Site +from dcim.models import Device, Rack, Site, Cable from extras.api.views import CustomFieldModelViewSet from ipam.models import IPAddress, Prefix, VLAN, VRF from tenancy import filtersets @@ -47,7 +47,8 @@ class TenantViewSet(CustomFieldModelViewSet): site_count=count_related(Site, 'tenant'), virtualmachine_count=count_related(VirtualMachine, 'tenant'), vlan_count=count_related(VLAN, 'tenant'), - vrf_count=count_related(VRF, 'tenant') + vrf_count=count_related(VRF, 'tenant'), + cable_count=count_related(Cable, 'tenant') ) serializer_class = serializers.TenantSerializer filterset_class = filtersets.TenantFilterSet diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index c848de47f..b0f550304 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -3,7 +3,7 @@ from django.http import Http404 from django.shortcuts import get_object_or_404 from circuits.models import Circuit -from dcim.models import Site, Rack, Device, RackReservation +from dcim.models import Site, Rack, Device, RackReservation, Cable from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF from netbox.views import generic from utilities.tables import paginate_table @@ -112,6 +112,7 @@ class TenantView(generic.ObjectView): 'circuit_count': Circuit.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'virtualmachine_count': VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance).count(), 'cluster_count': Cluster.objects.restrict(request.user, 'view').filter(tenant=instance).count(), + 'cable_count': Cable.objects.restrict(request.user, 'view').filter(tenant=instance).count(), } return { From 184b1055dc6121417f0ee726e13dd16b9de6fc75 Mon Sep 17 00:00:00 2001 From: Jason Yates Date: Fri, 7 Jan 2022 20:17:43 +0000 Subject: [PATCH 23/39] Fixes #8285 - Cluster count missing from tenant api output --- netbox/tenancy/api/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index 50b188b5f..c336c88b6 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -7,7 +7,7 @@ from ipam.models import IPAddress, Prefix, VLAN, VRF from tenancy import filtersets from tenancy.models import * from utilities.utils import count_related -from virtualization.models import VirtualMachine +from virtualization.models import VirtualMachine, Cluster from . import serializers @@ -47,7 +47,8 @@ class TenantViewSet(CustomFieldModelViewSet): site_count=count_related(Site, 'tenant'), virtualmachine_count=count_related(VirtualMachine, 'tenant'), vlan_count=count_related(VLAN, 'tenant'), - vrf_count=count_related(VRF, 'tenant') + vrf_count=count_related(VRF, 'tenant'), + cluster_count=count_related(Cluster, 'tenant') ) serializer_class = serializers.TenantSerializer filterset_class = filtersets.TenantFilterSet From 10ec31df3eb8b0c3b770b77468155b5817ad0d3a Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Sat, 8 Jan 2022 00:13:58 -0600 Subject: [PATCH 24/39] Fix #8287 - Correct label in export template form --- docs/release-notes/version-3.1.md | 4 ++++ netbox/extras/forms/models.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 63e54fcea..7afee4603 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -2,6 +2,10 @@ ## v3.1.6 (FUTURE) +### Bug Fixes + +* [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in Export Template Form + --- ## v3.1.5 (2022-01-06) diff --git a/netbox/extras/forms/models.py b/netbox/extras/forms/models.py index 89ab7aa19..4f50ba8f4 100644 --- a/netbox/extras/forms/models.py +++ b/netbox/extras/forms/models.py @@ -82,7 +82,7 @@ class ExportTemplateForm(BootstrapMixin, forms.ModelForm): model = ExportTemplate fields = '__all__' fieldsets = ( - ('Custom Link', ('name', 'content_type', 'description')), + ('Export Template', ('name', 'content_type', 'description')), ('Template', ('template_code',)), ('Rendering', ('mime_type', 'file_extension', 'as_attachment')), ) From f1472d218e157160306e7007fb3a705208901a71 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Sat, 8 Jan 2022 00:21:38 -0600 Subject: [PATCH 25/39] Update changelog for #8262 and #8265 --- docs/release-notes/version-3.1.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 7afee4603..64bb0c12e 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -2,6 +2,11 @@ ## v3.1.6 (FUTURE) +### Enhancements + +* [#8262](https://github.com/netbox-community/netbox/issues/8262) - Add cables to tenant stats +* [#8265](https://github.com/netbox-community/netbox/issues/8265) - Add newer Stackwise-n interface types + ### Bug Fixes * [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in Export Template Form From f66a265fcf2eff66e05ceb6237add43a23ab3668 Mon Sep 17 00:00:00 2001 From: Jason Yates Date: Sat, 8 Jan 2022 21:55:07 +0000 Subject: [PATCH 26/39] Fixes #8246 - Circuits list view to display formatted commit rate Adds a custom column class to format the commit rate in the circuits table view using humanize_speed template helper. Export still exports the raw number. --- netbox/circuits/tables.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 86a55eba5..0b7ad203d 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -22,6 +22,25 @@ CIRCUITTERMINATION_LINK = """ {% endif %} """ +# +# Table columns +# + +class CommitRateColumn(tables.TemplateColumn): + """ + Humanize the commit rate in the column view + """ + + template_code = """ + {% load helpers %} + {{ record.commit_rate|humanize_speed }} + """ + + def __init__(self, *args, **kwargs): + super().__init__(template_code=self.template_code, *args, **kwargs) + + def value(self, value): + return str(value) if value else None # # Providers @@ -119,6 +138,7 @@ class CircuitTable(BaseTable): template_code=CIRCUITTERMINATION_LINK, verbose_name='Side Z' ) + commit_rate = CommitRateColumn() comments = MarkdownColumn() tags = TagColumn( url_name='circuits:circuit_list' From f7324934731c311012bddfe7a843d56841cb7dbe Mon Sep 17 00:00:00 2001 From: Jason Yates Date: Sat, 8 Jan 2022 22:24:25 +0000 Subject: [PATCH 27/39] Fixing code style E302 --- netbox/circuits/tables.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 0b7ad203d..29bf704f0 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -26,6 +26,7 @@ CIRCUITTERMINATION_LINK = """ # Table columns # + class CommitRateColumn(tables.TemplateColumn): """ Humanize the commit rate in the column view @@ -46,6 +47,7 @@ class CommitRateColumn(tables.TemplateColumn): # Providers # + class ProviderTable(BaseTable): pk = ToggleColumn() name = tables.Column( From e84a282aa607d56b354220a6ba01a2f0c4e344a8 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 08:24:45 -0500 Subject: [PATCH 28/39] Revert REST API changes from #8284 --- docs/release-notes/version-3.1.md | 6 +++--- netbox/tenancy/api/serializers.py | 3 +-- netbox/tenancy/api/views.py | 3 +-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 64bb0c12e..459e62d60 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -4,12 +4,12 @@ ### Enhancements -* [#8262](https://github.com/netbox-community/netbox/issues/8262) - Add cables to tenant stats -* [#8265](https://github.com/netbox-community/netbox/issues/8265) - Add newer Stackwise-n interface types +* [#8262](https://github.com/netbox-community/netbox/issues/8262) - Add cable count to tenant stats +* [#8265](https://github.com/netbox-community/netbox/issues/8265) - Add Stackwise-n interface types ### Bug Fixes -* [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in Export Template Form +* [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in export template form --- diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py index 0312949d1..a0482aa1d 100644 --- a/netbox/tenancy/api/serializers.py +++ b/netbox/tenancy/api/serializers.py @@ -40,14 +40,13 @@ class TenantSerializer(PrimaryModelSerializer): vlan_count = serializers.IntegerField(read_only=True) vrf_count = serializers.IntegerField(read_only=True) cluster_count = serializers.IntegerField(read_only=True) - cable_count = serializers.IntegerField(read_only=True) class Meta: model = Tenant fields = [ 'id', 'url', 'display', 'name', 'slug', 'group', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', 'device_count', 'ipaddress_count', 'prefix_count', 'rack_count', - 'site_count', 'virtualmachine_count', 'vlan_count', 'vrf_count', 'cluster_count', 'cable_count', + 'site_count', 'virtualmachine_count', 'vlan_count', 'vrf_count', 'cluster_count', ] diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index f4b8abbf1..7e3358e7f 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -47,8 +47,7 @@ class TenantViewSet(CustomFieldModelViewSet): site_count=count_related(Site, 'tenant'), virtualmachine_count=count_related(VirtualMachine, 'tenant'), vlan_count=count_related(VLAN, 'tenant'), - vrf_count=count_related(VRF, 'tenant'), - cable_count=count_related(Cable, 'tenant') + vrf_count=count_related(VRF, 'tenant') ) serializer_class = serializers.TenantSerializer filterset_class = filtersets.TenantFilterSet From 5aa7dedccb8640de64ac54ae7fc2608fcd095e16 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 08:38:08 -0500 Subject: [PATCH 29/39] Changelog for #8246, #8285 --- docs/release-notes/version-3.1.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 459e62d60..a39cff451 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -4,11 +4,13 @@ ### Enhancements +* [#8246](https://github.com/netbox-community/netbox/issues/8246) - Show human-friendly values for commit rates in circuits table * [#8262](https://github.com/netbox-community/netbox/issues/8262) - Add cable count to tenant stats * [#8265](https://github.com/netbox-community/netbox/issues/8265) - Add Stackwise-n interface types ### Bug Fixes +* [#8285](https://github.com/netbox-community/netbox/issues/8285) - Fix `cluster_count` under tenant REST API serializer * [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in export template form --- From 02519b270efe07f5efa3a05400f55b01b3cf39cb Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 09:30:50 -0500 Subject: [PATCH 30/39] Fixes #8301: Fix delete button for various object children views --- docs/release-notes/version-3.1.md | 1 + netbox/templates/dcim/device/consoleports.html | 1 + netbox/templates/dcim/device/consoleserverports.html | 1 + netbox/templates/dcim/device/devicebays.html | 1 + netbox/templates/dcim/device/frontports.html | 1 + netbox/templates/dcim/device/interfaces.html | 1 + netbox/templates/dcim/device/inventory.html | 1 + netbox/templates/dcim/device/poweroutlets.html | 1 + netbox/templates/dcim/device/powerports.html | 1 + netbox/templates/dcim/device/rearports.html | 1 + netbox/templates/ipam/aggregate/prefixes.html | 1 + netbox/templates/ipam/iprange/ip_addresses.html | 1 + netbox/templates/ipam/prefix/ip_addresses.html | 1 + netbox/templates/ipam/prefix/ip_ranges.html | 1 + netbox/templates/ipam/prefix/prefixes.html | 1 + netbox/templates/ipam/vlan/interfaces.html | 1 + netbox/templates/ipam/vlan/vminterfaces.html | 1 + netbox/templates/virtualization/cluster/devices.html | 1 + netbox/templates/virtualization/cluster/virtual_machines.html | 1 + netbox/templates/virtualization/virtualmachine/interfaces.html | 1 + 20 files changed, 20 insertions(+) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index a39cff451..649bb8ce8 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -12,6 +12,7 @@ * [#8285](https://github.com/netbox-community/netbox/issues/8285) - Fix `cluster_count` under tenant REST API serializer * [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in export template form +* [#8301](https://github.com/netbox-community/netbox/issues/8301) - Fix delete button for various object children views --- diff --git a/netbox/templates/dcim/device/consoleports.html b/netbox/templates/dcim/device/consoleports.html index 65c6651da..f96854ca8 100644 --- a/netbox/templates/dcim/device/consoleports.html +++ b/netbox/templates/dcim/device/consoleports.html @@ -45,5 +45,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/consoleserverports.html b/netbox/templates/dcim/device/consoleserverports.html index 7c56eceac..eb27b4ab0 100644 --- a/netbox/templates/dcim/device/consoleserverports.html +++ b/netbox/templates/dcim/device/consoleserverports.html @@ -45,5 +45,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/devicebays.html b/netbox/templates/dcim/device/devicebays.html index 5c46ce3dc..672cb192a 100644 --- a/netbox/templates/dcim/device/devicebays.html +++ b/netbox/templates/dcim/device/devicebays.html @@ -42,5 +42,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/frontports.html b/netbox/templates/dcim/device/frontports.html index 814eed25a..816d193de 100644 --- a/netbox/templates/dcim/device/frontports.html +++ b/netbox/templates/dcim/device/frontports.html @@ -45,5 +45,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/interfaces.html b/netbox/templates/dcim/device/interfaces.html index 7141191dc..d7f8dff55 100644 --- a/netbox/templates/dcim/device/interfaces.html +++ b/netbox/templates/dcim/device/interfaces.html @@ -80,5 +80,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/inventory.html b/netbox/templates/dcim/device/inventory.html index 04c2ebea4..c6452cf78 100644 --- a/netbox/templates/dcim/device/inventory.html +++ b/netbox/templates/dcim/device/inventory.html @@ -42,5 +42,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/poweroutlets.html b/netbox/templates/dcim/device/poweroutlets.html index a4517c2e2..19d8298af 100644 --- a/netbox/templates/dcim/device/poweroutlets.html +++ b/netbox/templates/dcim/device/poweroutlets.html @@ -45,5 +45,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/powerports.html b/netbox/templates/dcim/device/powerports.html index f1ea82382..82c088392 100644 --- a/netbox/templates/dcim/device/powerports.html +++ b/netbox/templates/dcim/device/powerports.html @@ -45,5 +45,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/dcim/device/rearports.html b/netbox/templates/dcim/device/rearports.html index 4a4198c03..868def466 100644 --- a/netbox/templates/dcim/device/rearports.html +++ b/netbox/templates/dcim/device/rearports.html @@ -45,5 +45,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/aggregate/prefixes.html b/netbox/templates/ipam/aggregate/prefixes.html index 4d9b6d105..14d4b38bb 100644 --- a/netbox/templates/ipam/aggregate/prefixes.html +++ b/netbox/templates/ipam/aggregate/prefixes.html @@ -40,5 +40,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/iprange/ip_addresses.html b/netbox/templates/ipam/iprange/ip_addresses.html index 8663c158f..a13910406 100644 --- a/netbox/templates/ipam/iprange/ip_addresses.html +++ b/netbox/templates/ipam/iprange/ip_addresses.html @@ -38,5 +38,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/prefix/ip_addresses.html b/netbox/templates/ipam/prefix/ip_addresses.html index ae5d3cf74..b26375ebe 100644 --- a/netbox/templates/ipam/prefix/ip_addresses.html +++ b/netbox/templates/ipam/prefix/ip_addresses.html @@ -38,5 +38,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/prefix/ip_ranges.html b/netbox/templates/ipam/prefix/ip_ranges.html index 3d5e0c4c0..b262be821 100644 --- a/netbox/templates/ipam/prefix/ip_ranges.html +++ b/netbox/templates/ipam/prefix/ip_ranges.html @@ -38,5 +38,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/prefix/prefixes.html b/netbox/templates/ipam/prefix/prefixes.html index 21756a36a..039b1ca3e 100644 --- a/netbox/templates/ipam/prefix/prefixes.html +++ b/netbox/templates/ipam/prefix/prefixes.html @@ -40,5 +40,6 @@ {% endblock %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/vlan/interfaces.html b/netbox/templates/ipam/vlan/interfaces.html index 3ce00631f..51df17edc 100644 --- a/netbox/templates/ipam/vlan/interfaces.html +++ b/netbox/templates/ipam/vlan/interfaces.html @@ -14,5 +14,6 @@ {% endblock content %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/ipam/vlan/vminterfaces.html b/netbox/templates/ipam/vlan/vminterfaces.html index fcd207894..f12e9df86 100644 --- a/netbox/templates/ipam/vlan/vminterfaces.html +++ b/netbox/templates/ipam/vlan/vminterfaces.html @@ -14,5 +14,6 @@ {% endblock content %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/virtualization/cluster/devices.html b/netbox/templates/virtualization/cluster/devices.html index 700006196..075f34c7e 100644 --- a/netbox/templates/virtualization/cluster/devices.html +++ b/netbox/templates/virtualization/cluster/devices.html @@ -24,5 +24,6 @@ {% endblock content %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/virtualization/cluster/virtual_machines.html b/netbox/templates/virtualization/cluster/virtual_machines.html index 5b0359e07..8b4191259 100644 --- a/netbox/templates/virtualization/cluster/virtual_machines.html +++ b/netbox/templates/virtualization/cluster/virtual_machines.html @@ -29,5 +29,6 @@ {% endblock content %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} diff --git a/netbox/templates/virtualization/virtualmachine/interfaces.html b/netbox/templates/virtualization/virtualmachine/interfaces.html index 5f6ab52ad..de657b3b3 100644 --- a/netbox/templates/virtualization/virtualmachine/interfaces.html +++ b/netbox/templates/virtualization/virtualmachine/interfaces.html @@ -40,5 +40,6 @@ {% endblock content %} {% block modals %} + {{ block.super }} {% table_config_form table %} {% endblock modals %} From 076ca46ab4e86af04f428d5aad7ecdd3ccab99ab Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 09:48:14 -0500 Subject: [PATCH 31/39] Closes #8302: Linkify role column in device & VM tables --- docs/release-notes/version-3.1.md | 1 + netbox/project-static/dist/netbox-dark.css | Bin 374488 -> 374545 bytes netbox/project-static/dist/netbox-light.css | Bin 232256 -> 232279 bytes netbox/project-static/dist/netbox-print.css | Bin 728058 -> 728187 bytes netbox/project-static/styles/netbox.scss | 4 ++++ netbox/utilities/tables.py | 18 +++++++++--------- 6 files changed, 14 insertions(+), 9 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 649bb8ce8..c13a5df1f 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -7,6 +7,7 @@ * [#8246](https://github.com/netbox-community/netbox/issues/8246) - Show human-friendly values for commit rates in circuits table * [#8262](https://github.com/netbox-community/netbox/issues/8262) - Add cable count to tenant stats * [#8265](https://github.com/netbox-community/netbox/issues/8265) - Add Stackwise-n interface types +* [#8302](https://github.com/netbox-community/netbox/issues/8302) - Linkify role column in device & VM tables ### Bug Fixes diff --git a/netbox/project-static/dist/netbox-dark.css b/netbox/project-static/dist/netbox-dark.css index a53e70f517562a97c4d2ca3a3bf80292e7319d42..9e85e4754a74f2e68fbb628bbf8e20e2cf0b7b54 100644 GIT binary patch delta 38 ucmccdR&3%sv4$4L7N!>F7M3lnXS=5hq%g5CDI`wUPh~RNex{q1M;ibnoefz4 delta 25 hcmbREPVB~8v4$4L7N!>F7M3lnXS=tv^{{el0|1YS37`M~ diff --git a/netbox/project-static/dist/netbox-light.css b/netbox/project-static/dist/netbox-light.css index 29c3ad3c7397d321c8c364d018fece11d689572e..49b8aae7335d645a1b166f744787b23e80476896 100644 GIT binary patch delta 42 xcmX>wjqmz2zJ?aY7N#xC26-ZhDe0*SiPg#ZIr&9anRywhMVTerb@P~oWdT@u4>AA% delta 30 mcmcaUjqkuTzJ?aY7N#xC26@aSdDYV&o?;T-9-GJfO9lYG0SpoV diff --git a/netbox/project-static/dist/netbox-print.css b/netbox/project-static/dist/netbox-print.css index 23d0be3065b84454fd2ce4fa92748f37f69fdf06..a90c88398d1719c0b7ae2d020191fa4293ebbcd2 100644 GIT binary patch delta 73 zcmeyhUFY`>orV_17N!>F7M2#)7Pc1l7LFFqEnEikhQS(p?Or~kdiqP%_oK`!ek0Qw#pq5uE@ delta 40 wcmeypL+96aorV_17N!>F7M2#)7Pc1l7LFFqEnEi - {{ value }} - - {% else %} - — - {% endif %} - """ +{% load helpers %} + {% if value %} + + {{ value }} + +{% else %} + — +{% endif %} +""" def __init__(self, *args, **kwargs): super().__init__(template_code=self.template_code, *args, **kwargs) From 9152ba72f1ae2a4602a83558d1b8a77452f8cb59 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 10 Jan 2022 14:44:25 -0500 Subject: [PATCH 32/39] Fixes #8306: Redirect user to previous page after login --- docs/release-notes/version-3.1.md | 1 + netbox/templates/inc/profile_button.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index c13a5df1f..0b3945119 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -14,6 +14,7 @@ * [#8285](https://github.com/netbox-community/netbox/issues/8285) - Fix `cluster_count` under tenant REST API serializer * [#8287](https://github.com/netbox-community/netbox/issues/8287) - Correct label in export template form * [#8301](https://github.com/netbox-community/netbox/issues/8301) - Fix delete button for various object children views +* [#8306](https://github.com/netbox-community/netbox/issues/8306) - Redirect user to previous page after login --- diff --git a/netbox/templates/inc/profile_button.html b/netbox/templates/inc/profile_button.html index 230aa02ad..1e562651f 100644 --- a/netbox/templates/inc/profile_button.html +++ b/netbox/templates/inc/profile_button.html @@ -38,7 +38,7 @@ {% else %}
- + Log In