From a597ad849e35a5445b34cab3076217076f2f85c9 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 05:02:20 +0000 Subject: [PATCH 01/18] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 106 +++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index b8b3cf9a3..7a60e6028 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-12 05:01+0000\n" +"POT-Creation-Date: 2024-06-13 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -325,7 +325,7 @@ msgstr "" #: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:127 #: netbox/dcim/forms/filtersets.py:188 netbox/dcim/forms/model_forms.py:122 #: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 -#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:219 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:210 #: netbox/netbox/navigation/menu.py:159 netbox/netbox/navigation/menu.py:162 #: netbox/templates/circuits/provider.html:23 msgid "ASNs" @@ -895,7 +895,7 @@ msgstr "" #: netbox/dcim/forms/filtersets.py:653 netbox/dcim/forms/filtersets.py:1010 #: netbox/netbox/navigation/menu.py:44 netbox/netbox/navigation/menu.py:46 #: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 -#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:18 #: netbox/virtualization/forms/filtersets.py:37 #: netbox/virtualization/forms/filtersets.py:48 #: netbox/virtualization/forms/filtersets.py:106 @@ -2067,8 +2067,8 @@ msgstr "" msgid "No workers found" msgstr "" -#: netbox/core/views.py:335 netbox/core/views.py:378 netbox/core/views.py:401 -#: netbox/core/views.py:419 netbox/core/views.py:454 +#: netbox/core/views.py:331 netbox/core/views.py:374 netbox/core/views.py:397 +#: netbox/core/views.py:415 netbox/core/views.py:450 #, python-brace-format msgid "Job {job_id} not found" msgstr "" @@ -2946,7 +2946,7 @@ msgstr "" #: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:410 #: netbox/extras/forms/model_forms.py:443 #: netbox/extras/forms/model_forms.py:495 netbox/netbox/forms/base.py:84 -#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:458 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:461 #: netbox/templates/circuits/inc/circuit_termination.html:32 #: netbox/templates/generic/bulk_edit.html:65 #: netbox/templates/inc/panels/tags.html:5 @@ -5974,7 +5974,7 @@ msgstr "" #: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 #: netbox/virtualization/forms/model_forms.py:122 #: netbox/virtualization/tables/clusters.py:83 -#: netbox/virtualization/views.py:210 +#: netbox/virtualization/views.py:202 msgid "Devices" msgstr "" @@ -6054,8 +6054,8 @@ msgid "Power outlets" msgstr "" #: netbox/dcim/tables/devices.py:243 netbox/dcim/tables/devices.py:1046 -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1006 -#: netbox/dcim/views.py:1245 netbox/dcim/views.py:1931 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:985 +#: netbox/dcim/views.py:1224 netbox/dcim/views.py:1900 #: netbox/netbox/navigation/menu.py:81 netbox/netbox/navigation/menu.py:237 #: netbox/templates/dcim/device/base.html:37 #: netbox/templates/dcim/device_list.html:43 @@ -6067,7 +6067,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:27 #: netbox/templates/virtualization/virtualmachine_list.html:14 #: netbox/virtualization/tables/virtualmachines.py:100 -#: netbox/virtualization/views.py:367 netbox/wireless/tables/wirelesslan.py:55 +#: netbox/virtualization/views.py:359 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "" @@ -6093,8 +6093,8 @@ msgid "Module Bay" msgstr "" #: netbox/dcim/tables/devices.py:310 netbox/dcim/tables/devicetypes.py:48 -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1081 -#: netbox/dcim/views.py:2024 netbox/netbox/navigation/menu.py:90 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1060 +#: netbox/dcim/views.py:1993 netbox/netbox/navigation/menu.py:90 #: netbox/templates/dcim/device/base.html:52 #: netbox/templates/dcim/device_list.html:71 #: netbox/templates/dcim/devicetype/base.html:49 @@ -6124,8 +6124,8 @@ msgid "Allocated draw (W)" msgstr "" #: netbox/dcim/tables/devices.py:546 netbox/ipam/forms/model_forms.py:747 -#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:602 -#: netbox/ipam/views.py:701 netbox/netbox/navigation/menu.py:145 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:589 +#: netbox/ipam/views.py:688 netbox/netbox/navigation/menu.py:145 #: netbox/netbox/navigation/menu.py:147 #: netbox/templates/dcim/interface.html:339 #: netbox/templates/ipam/ipaddress_bulk_add.html:15 @@ -6218,8 +6218,8 @@ msgstr "" msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/views.py:946 -#: netbox/dcim/views.py:1185 netbox/dcim/views.py:1871 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/views.py:925 +#: netbox/dcim/views.py:1164 netbox/dcim/views.py:1840 #: netbox/netbox/navigation/menu.py:84 #: netbox/templates/dcim/device/base.html:25 #: netbox/templates/dcim/device_list.html:15 @@ -6229,8 +6229,8 @@ msgstr "" msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:961 -#: netbox/dcim/views.py:1200 netbox/dcim/views.py:1886 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:940 +#: netbox/dcim/views.py:1179 netbox/dcim/views.py:1855 #: netbox/netbox/navigation/menu.py:85 #: netbox/templates/dcim/device/base.html:28 #: netbox/templates/dcim/device_list.html:22 @@ -6240,8 +6240,8 @@ msgstr "" msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:976 -#: netbox/dcim/views.py:1215 netbox/dcim/views.py:1901 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:955 +#: netbox/dcim/views.py:1194 netbox/dcim/views.py:1870 #: netbox/netbox/navigation/menu.py:86 #: netbox/templates/dcim/device/base.html:31 #: netbox/templates/dcim/device_list.html:29 @@ -6251,8 +6251,8 @@ msgstr "" msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:991 -#: netbox/dcim/views.py:1230 netbox/dcim/views.py:1916 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:970 +#: netbox/dcim/views.py:1209 netbox/dcim/views.py:1885 #: netbox/netbox/navigation/menu.py:87 #: netbox/templates/dcim/device/base.html:34 #: netbox/templates/dcim/device_list.html:36 @@ -6262,8 +6262,8 @@ msgstr "" msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1021 -#: netbox/dcim/views.py:1260 netbox/dcim/views.py:1952 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1000 +#: netbox/dcim/views.py:1239 netbox/dcim/views.py:1921 #: netbox/netbox/navigation/menu.py:82 #: netbox/templates/dcim/device/base.html:40 #: netbox/templates/dcim/devicetype/base.html:37 @@ -6272,8 +6272,8 @@ msgstr "" msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1036 -#: netbox/dcim/views.py:1275 netbox/dcim/views.py:1967 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1015 +#: netbox/dcim/views.py:1254 netbox/dcim/views.py:1936 #: netbox/netbox/navigation/menu.py:83 #: netbox/templates/dcim/device/base.html:43 #: netbox/templates/dcim/device_list.html:50 @@ -6283,16 +6283,16 @@ msgstr "" msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1066 -#: netbox/dcim/views.py:2005 netbox/netbox/navigation/menu.py:89 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1045 +#: netbox/dcim/views.py:1974 netbox/netbox/navigation/menu.py:89 #: netbox/templates/dcim/device/base.html:49 #: netbox/templates/dcim/device_list.html:57 #: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1051 -#: netbox/dcim/views.py:1986 netbox/netbox/navigation/menu.py:88 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1030 +#: netbox/dcim/views.py:1955 netbox/netbox/navigation/menu.py:88 #: netbox/templates/dcim/device/base.html:46 #: netbox/templates/dcim/device_list.html:64 #: netbox/templates/dcim/devicetype/base.html:43 @@ -6350,38 +6350,38 @@ msgstr "" msgid "Test case must set peer_termination_type" msgstr "" -#: netbox/dcim/views.py:137 +#: netbox/dcim/views.py:139 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "" -#: netbox/dcim/views.py:698 netbox/netbox/navigation/menu.py:28 +#: netbox/dcim/views.py:684 netbox/netbox/navigation/menu.py:28 msgid "Reservations" msgstr "" -#: netbox/dcim/views.py:716 netbox/templates/dcim/location.html:90 +#: netbox/dcim/views.py:702 netbox/templates/dcim/location.html:90 #: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2037 netbox/extras/forms/model_forms.py:453 +#: netbox/dcim/views.py:2006 netbox/extras/forms/model_forms.py:453 #: netbox/templates/extras/configcontext.html:10 #: netbox/virtualization/forms/model_forms.py:225 -#: netbox/virtualization/views.py:407 +#: netbox/virtualization/views.py:399 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2047 netbox/virtualization/views.py:417 +#: netbox/dcim/views.py:2016 netbox/virtualization/views.py:409 msgid "Render Config" msgstr "" -#: netbox/dcim/views.py:2097 netbox/extras/tables/tables.py:440 +#: netbox/dcim/views.py:2066 netbox/extras/tables/tables.py:440 #: netbox/netbox/navigation/menu.py:234 netbox/netbox/navigation/menu.py:236 -#: netbox/virtualization/views.py:185 +#: netbox/virtualization/views.py:177 msgid "Virtual Machines" msgstr "" -#: netbox/dcim/views.py:2989 netbox/ipam/tables/ip.py:233 +#: netbox/dcim/views.py:2948 netbox/ipam/tables/ip.py:233 msgid "Children" msgstr "" @@ -9415,7 +9415,7 @@ msgid "The primary function of this VLAN" msgstr "" #: netbox/ipam/models/vlans.py:215 netbox/ipam/tables/ip.py:175 -#: netbox/ipam/tables/vlans.py:78 netbox/ipam/views.py:978 +#: netbox/ipam/tables/vlans.py:78 netbox/ipam/views.py:961 #: netbox/netbox/navigation/menu.py:180 netbox/netbox/navigation/menu.py:182 msgid "VLANs" msgstr "" @@ -9487,7 +9487,7 @@ msgid "Added" msgstr "" #: netbox/ipam/tables/ip.py:127 netbox/ipam/tables/ip.py:165 -#: netbox/ipam/tables/vlans.py:138 netbox/ipam/views.py:349 +#: netbox/ipam/tables/vlans.py:138 netbox/ipam/views.py:342 #: netbox/netbox/navigation/menu.py:152 netbox/netbox/navigation/menu.py:154 #: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" @@ -9588,23 +9588,23 @@ msgid "" "are allowed in DNS names" msgstr "" -#: netbox/ipam/views.py:541 +#: netbox/ipam/views.py:528 msgid "Child Prefixes" msgstr "" -#: netbox/ipam/views.py:576 +#: netbox/ipam/views.py:563 msgid "Child Ranges" msgstr "" -#: netbox/ipam/views.py:902 +#: netbox/ipam/views.py:889 msgid "Related IPs" msgstr "" -#: netbox/ipam/views.py:1133 +#: netbox/ipam/views.py:1116 msgid "Device Interfaces" msgstr "" -#: netbox/ipam/views.py:1150 +#: netbox/ipam/views.py:1133 msgid "VM Interfaces" msgstr "" @@ -10159,7 +10159,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:32 #: netbox/templates/virtualization/virtualmachine_list.html:21 #: netbox/virtualization/tables/virtualmachines.py:103 -#: netbox/virtualization/views.py:388 +#: netbox/virtualization/views.py:380 msgid "Virtual Disks" msgstr "" @@ -10498,15 +10498,15 @@ msgstr "" msgid "Chinese" msgstr "" -#: netbox/netbox/tables/columns.py:185 +#: netbox/netbox/tables/columns.py:188 msgid "Toggle all" msgstr "" -#: netbox/netbox/tables/columns.py:287 +#: netbox/netbox/tables/columns.py:290 msgid "Toggle Dropdown" msgstr "" -#: netbox/netbox/tables/columns.py:552 netbox/templates/core/job.html:35 +#: netbox/netbox/tables/columns.py:555 netbox/templates/core/job.html:35 msgid "Error" msgstr "" @@ -14072,17 +14072,17 @@ msgstr "" msgid "{value} is not a valid regular expression." msgstr "" -#: netbox/utilities/views.py:40 +#: netbox/utilities/views.py:44 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" -#: netbox/utilities/views.py:76 +#: netbox/utilities/views.py:80 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "" -#: netbox/utilities/views.py:100 +#: netbox/utilities/views.py:104 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only " From b2360b62b51aa4965830b6b19b295a0a9ec79c2f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 14 Jun 2024 10:38:09 -0400 Subject: [PATCH 02/18] Fixes #13925: Support 'zulu' style timestamps for custom fields --- netbox/extras/models/customfields.py | 4 ++++ netbox/utilities/templates/builtins/customfield_value.html | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 974affb2e..240998146 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -660,6 +660,10 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): # Validate date & time elif self.type == CustomFieldTypeChoices.TYPE_DATETIME: if type(value) is not datetime: + # Work around UTC issue for Python < 3.11; see + # https://docs.python.org/3/library/datetime.html#datetime.datetime.fromisoformat + if type(value) is str and value.endswith('Z'): + value = f'{value[:-1]}+00:00' try: datetime.fromisoformat(value) except ValueError: diff --git a/netbox/utilities/templates/builtins/customfield_value.html b/netbox/utilities/templates/builtins/customfield_value.html index 462e62b86..dbf10e1bf 100644 --- a/netbox/utilities/templates/builtins/customfield_value.html +++ b/netbox/utilities/templates/builtins/customfield_value.html @@ -11,7 +11,7 @@ {% elif customfield.type == 'date' and value %} {{ value|isodate }} {% elif customfield.type == 'datetime' and value %} - {{ value|isodate }} {{ value|isodatetime }} + {{ value|isodatetime }} {% elif customfield.type == 'url' and value %} {{ value|truncatechars:70 }} {% elif customfield.type == 'json' and value %} From 49971dd7dbc8da653b31499bb9abb8eb9ebfb68f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 14 Jun 2024 10:56:03 -0400 Subject: [PATCH 03/18] Changelog for #13925, #14829, #15794, #16143, #16256, #16454 --- docs/release-notes/version-4.0.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/release-notes/version-4.0.md b/docs/release-notes/version-4.0.md index ae0578690..647b73231 100644 --- a/docs/release-notes/version-4.0.md +++ b/docs/release-notes/version-4.0.md @@ -2,6 +2,18 @@ ## v4.0.6 (FUTURE) +### Enhancements + +* [#15794](https://github.com/netbox-community/netbox/issues/15794) - Dynamically populate related objects in UI views +* [#16256](https://github.com/netbox-community/netbox/issues/16256) - Enable alphabetical ordering of bookmarks on dashboard + +### Bug Fixes + +* [#13925](https://github.com/netbox-community/netbox/issues/13925) - Fix support for "zulu" (UTC) timestamps for custom fields +* [#14829](https://github.com/netbox-community/netbox/issues/14829) - Fix support for simple conditions (without AND/OR) in event rules +* [#16143](https://github.com/netbox-community/netbox/issues/16143) - Display timestamps in tables in the configured timezone +* [#16454](https://github.com/netbox-community/netbox/issues/16454) - Address DNS lookup bug in `django-debug-toolbar + --- ## v4.0.5 (2024-06-06) From c8aac13ceebf851368f6c7c2fbc6a783fc2e7bda Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Jun 2024 05:02:20 +0000 Subject: [PATCH 04/18] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 26 ++++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 7a60e6028..17636c9e3 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-13 05:02+0000\n" +"POT-Creation-Date: 2024-06-15 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -7686,56 +7686,56 @@ msgstr "" msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "" -#: netbox/extras/models/customfields.py:667 +#: netbox/extras/models/customfields.py:671 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" -#: netbox/extras/models/customfields.py:674 +#: netbox/extras/models/customfields.py:678 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "" -#: netbox/extras/models/customfields.py:684 +#: netbox/extras/models/customfields.py:688 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "" -#: netbox/extras/models/customfields.py:693 +#: netbox/extras/models/customfields.py:697 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "" -#: netbox/extras/models/customfields.py:699 +#: netbox/extras/models/customfields.py:703 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "" -#: netbox/extras/models/customfields.py:703 +#: netbox/extras/models/customfields.py:707 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "" -#: netbox/extras/models/customfields.py:706 +#: netbox/extras/models/customfields.py:710 msgid "Required field cannot be empty." msgstr "" -#: netbox/extras/models/customfields.py:725 +#: netbox/extras/models/customfields.py:729 msgid "Base set of predefined choices (optional)" msgstr "" -#: netbox/extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:741 msgid "Choices are automatically ordered alphabetically" msgstr "" -#: netbox/extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:748 msgid "custom field choice set" msgstr "" -#: netbox/extras/models/customfields.py:745 +#: netbox/extras/models/customfields.py:749 msgid "custom field choice sets" msgstr "" -#: netbox/extras/models/customfields.py:781 +#: netbox/extras/models/customfields.py:785 msgid "Must define base or extra choices." msgstr "" From 6abad9c20c6d3871ae4ead5251ae6fcc35cb14cc Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 14 Jun 2024 08:32:24 -0700 Subject: [PATCH 05/18] 16586 add .python-version to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 88faab27c..e04e44a30 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,4 @@ netbox.pid .idea .coverage .vscode +.python-version From 95593495413b7821cbb8fab4603f74c78d9c2354 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 17 Jun 2024 10:58:47 -0400 Subject: [PATCH 06/18] Fixes #16450: Rack unit filter should be case-insensitive --- netbox/dcim/api/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index d6ddd466b..be7a9c306 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -219,9 +219,9 @@ class RackViewSet(NetBoxModelViewSet): ) # Enable filtering rack units by ID - q = data['q'] - if q: - elevation = [u for u in elevation if q in str(u['id']) or q in str(u['name'])] + if q := data['q']: + q = q.lower() + elevation = [u for u in elevation if q in str(u['id']) or q in str(u['name']).lower()] page = self.paginate_queryset(elevation) if page is not None: From 6f35a2ac2b42a43329dd3ebed4d07f257361fbc5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 17 Jun 2024 10:32:47 -0400 Subject: [PATCH 07/18] Fixes #16452: Fix sizing of buttons within object attribute panels --- netbox/templates/dcim/device.html | 2 +- netbox/templates/dcim/site.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 12ba4a8d4..50136f7a9 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -28,7 +28,7 @@ {% trans "Rack" %} - + {% if object.rack %} {{ object.rack|linkify }} diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index 1ad0a75ae..ca0937bed 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -73,7 +73,7 @@ {% trans "Physical Address" %} - + {% if object.physical_address %} {{ object.physical_address|linebreaksbr }} {% if config.MAPS_URL %} From b077c664e38cd4fafa7e8faafb8752caa3f53c51 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 17 Jun 2024 09:57:00 -0400 Subject: [PATCH 08/18] Fixes #16542: Fix bulk form operations when HTMX is enabled --- netbox/utilities/templatetags/builtins/tags.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/utilities/templatetags/builtins/tags.py b/netbox/utilities/templatetags/builtins/tags.py index bc5c954be..d1dd1a55a 100644 --- a/netbox/utilities/templatetags/builtins/tags.py +++ b/netbox/utilities/templatetags/builtins/tags.py @@ -1,4 +1,5 @@ from django import template +from django.utils.safestring import mark_safe from extras.choices import CustomFieldTypeChoices from utilities.querydict import dict_to_querydict @@ -124,5 +125,5 @@ def formaction(context): if HTMX navigation is enabled (per the user's preferences). """ if context.get('htmx_navigation', False): - return 'hx-push-url="true" hx-post' + return mark_safe('hx-push-url="true" hx-post') return 'formaction' From d2a8e525851c11bb9aa682abf2b724caa0ad9da2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 17 Jun 2024 11:57:01 -0400 Subject: [PATCH 09/18] Fixes #16444: Disable ordering circuits list by A/Z termination --- netbox/circuits/tables/circuits.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index 5d650df61..e1b99ff42 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -63,10 +63,12 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): status = columns.ChoiceFieldColumn() termination_a = tables.TemplateColumn( template_code=CIRCUITTERMINATION_LINK, + orderable=False, verbose_name=_('Side A') ) termination_z = tables.TemplateColumn( template_code=CIRCUITTERMINATION_LINK, + orderable=False, verbose_name=_('Side Z') ) commit_rate = CommitRateColumn( From 1eebb98b56ecfc4b3008e34976254261059e507e Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Jun 2024 05:02:24 +0000 Subject: [PATCH 10/18] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 17636c9e3..0cd3741e6 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-06-15 05:02+0000\n" +"POT-Creation-Date: 2024-06-18 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -158,7 +158,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:207 #: netbox/circuits/forms/model_forms.py:136 #: netbox/circuits/forms/model_forms.py:152 -#: netbox/circuits/tables/circuits.py:105 netbox/dcim/forms/bulk_edit.py:167 +#: netbox/circuits/tables/circuits.py:107 netbox/dcim/forms/bulk_edit.py:167 #: netbox/dcim/forms/bulk_edit.py:239 netbox/dcim/forms/bulk_edit.py:575 #: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_import.py:130 #: netbox/dcim/forms/bulk_import.py:184 netbox/dcim/forms/bulk_import.py:257 @@ -308,7 +308,7 @@ msgstr "" #: netbox/circuits/forms/filtersets.py:212 #: netbox/circuits/forms/model_forms.py:109 #: netbox/circuits/forms/model_forms.py:131 -#: netbox/circuits/tables/circuits.py:96 netbox/dcim/forms/connections.py:71 +#: netbox/circuits/tables/circuits.py:98 netbox/dcim/forms/connections.py:71 #: netbox/templates/circuits/circuit.html:15 #: netbox/templates/circuits/circuittermination.html:19 #: netbox/templates/dcim/inc/cable_termination.html:55 @@ -469,7 +469,7 @@ msgstr "" #: netbox/circuits/forms/model_forms.py:45 #: netbox/circuits/forms/model_forms.py:59 #: netbox/circuits/forms/model_forms.py:91 -#: netbox/circuits/tables/circuits.py:56 netbox/circuits/tables/circuits.py:100 +#: netbox/circuits/tables/circuits.py:56 netbox/circuits/tables/circuits.py:102 #: netbox/circuits/tables/providers.py:72 #: netbox/circuits/tables/providers.py:103 #: netbox/templates/circuits/circuit.html:18 @@ -748,7 +748,7 @@ msgstr "" #: netbox/circuits/forms/bulk_edit.py:191 #: netbox/circuits/forms/bulk_edit.py:215 #: netbox/circuits/forms/model_forms.py:153 -#: netbox/circuits/tables/circuits.py:109 +#: netbox/circuits/tables/circuits.py:111 #: netbox/templates/circuits/inc/circuit_termination_fields.html:62 #: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" @@ -1328,21 +1328,21 @@ msgstr "" msgid "Circuit ID" msgstr "" -#: netbox/circuits/tables/circuits.py:66 +#: netbox/circuits/tables/circuits.py:67 #: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "" -#: netbox/circuits/tables/circuits.py:70 +#: netbox/circuits/tables/circuits.py:72 msgid "Side Z" msgstr "" -#: netbox/circuits/tables/circuits.py:73 +#: netbox/circuits/tables/circuits.py:75 #: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "" -#: netbox/circuits/tables/circuits.py:76 netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/circuits.py:78 netbox/circuits/tables/providers.py:48 #: netbox/circuits/tables/providers.py:82 #: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1001 #: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 From 973bd0ed75426a907467ad0886e7041e441a595c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 18 Jun 2024 08:17:08 -0400 Subject: [PATCH 11/18] Fixes #16512: Restore a user's preferred language on login (#16628) --- netbox/account/views.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/netbox/account/views.py b/netbox/account/views.py index 40ce78039..feb85fdfe 100644 --- a/netbox/account/views.py +++ b/netbox/account/views.py @@ -104,10 +104,16 @@ class LoginView(View): # Ensure the user has a UserConfig defined. (This should normally be handled by # create_userconfig() on user creation.) if not hasattr(request.user, 'config'): - config = get_config() - UserConfig(user=request.user, data=config.DEFAULT_USER_PREFERENCES).save() + request.user.config = get_config() + UserConfig(user=request.user, data=request.user.config.DEFAULT_USER_PREFERENCES).save() - return self.redirect_to_next(request, logger) + response = self.redirect_to_next(request, logger) + + # Set the user's preferred language (if any) + if language := request.user.config.get('locale.language'): + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language) + + return response else: logger.debug(f"Login form validation failed for username: {form['username'].value()}") @@ -145,9 +151,10 @@ class LogoutView(View): logger.info(f"User {username} has logged out") messages.info(request, "You have logged out.") - # Delete session key cookie (if set) upon logout + # Delete session key & language cookies (if set) upon logout response = HttpResponseRedirect(resolve_url(settings.LOGOUT_REDIRECT_URL)) response.delete_cookie('session_key') + response.delete_cookie(settings.LANGUAGE_COOKIE_NAME) return response From cd9244fd4f7a74eb1de0dc7a418959e390d49a1f Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 18 Jun 2024 05:28:18 -0700 Subject: [PATCH 12/18] 16416 enable dark/light toggle in mobile view (#16635) * 16416 enable dark/light toggle in mobile view * 16416 move to inc file --- netbox/templates/base/layout.html | 10 ++-------- netbox/templates/inc/light_toggle.html | 10 ++++++++++ 2 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 netbox/templates/inc/light_toggle.html diff --git a/netbox/templates/base/layout.html b/netbox/templates/base/layout.html index d53591cb4..9ba6fded3 100644 --- a/netbox/templates/base/layout.html +++ b/netbox/templates/base/layout.html @@ -35,6 +35,7 @@ Blocks: {# User menu (mobile view) #} @@ -52,14 +53,7 @@ Blocks: