From e4cb0c3cc2738369c71484ff188a6a741c510351 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 13 Sep 2023 09:51:24 -0500 Subject: [PATCH 1/2] Fixes #11209 - Fix PrefixIPAddress view with saved sort preferences (#12820) * Fixes #11209 - Do not add available ips when IPAddressTable sort preferences are saved * Refine check to account scenario right after clearing ordering string * Introduce get_table_ordering() utility to determine intended ordering given a request * Apply fix to VLAN ranges as well --------- Co-authored-by: Jeremy Stretch --- netbox/ipam/views.py | 8 +++++--- netbox/utilities/tables.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 490cf940b..7cf785521 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1,7 +1,6 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import F, Prefetch from django.db.models.expressions import RawSQL -from django.db.models.functions import Round from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import gettext as _ @@ -11,6 +10,7 @@ from dcim.filtersets import InterfaceFilterSet from dcim.models import Interface, Site from netbox.views import generic from tenancy.views import ObjectContactsView +from utilities.tables import get_table_ordering from utilities.utils import count_related from utilities.views import ViewTab, register_model_view from virtualization.filtersets import VMInterfaceFilterSet @@ -606,7 +606,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant', 'tenant__group') def prep_table_data(self, request, queryset, parent): - if not request.GET.get('q') and not request.GET.get('sort'): + if not get_table_ordering(request, self.table): return add_available_ipaddresses(parent.prefix, queryset, parent.is_pool) return queryset @@ -952,7 +952,9 @@ class VLANGroupVLANsView(generic.ObjectChildrenView): ) def prep_table_data(self, request, queryset, parent): - return add_available_vlans(parent.get_child_vlans(), parent) + if not get_table_ordering(request, self.table): + return add_available_vlans(parent.get_child_vlans(), parent) + return queryset # diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index bf6aa15a9..489b90f10 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -1,8 +1,24 @@ __all__ = ( + 'get_table_ordering', 'linkify_phone', ) +def get_table_ordering(request, table): + """ + Given a request, return the prescribed table ordering, if any. This may be necessary to determine prior to rendering + the table itself. + """ + # Check for an explicit ordering + if 'sort' in request.GET: + return request.GET['sort'] or None + + # Check for a configured preference + if request.user.is_authenticated: + if preference := request.user.config.get(f'tables.{table.__name__}.ordering'): + return preference + + def linkify_phone(value): """ Render a telephone number as a hyperlink. From 6939bf8aed8514cc5a9e8bc28a97ea90c61b7ebe Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 13 Sep 2023 10:56:03 -0400 Subject: [PATCH 2/2] Fixes #12219: Ensure dashboard widget heading text has sufficient contrast (#13753) * Fixes #12219: Ensure dashboard widget heading text has sufficient contrast in both light & dark modes * Change foreground color for teal background --- netbox/extras/dashboard/widgets.py | 17 +++++++++++++++++ netbox/templates/extras/dashboard/widget.html | 10 +++++++--- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index dcf83bc14..0b185d432 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -16,6 +16,7 @@ from django.utils.translation import gettext as _ from extras.choices import BookmarkOrderingChoices from extras.utils import FeatureQuery +from utilities.choices import ButtonColorChoices from utilities.forms import BootstrapMixin from utilities.permissions import get_permission_for_model from utilities.templatetags.builtins.filters import render_markdown @@ -115,6 +116,22 @@ class DashboardWidget: def name(self): return f'{self.__class__.__module__.split(".")[0]}.{self.__class__.__name__}' + @property + def fg_color(self): + """ + Return the appropriate foreground (text) color for the widget's color. + """ + if self.color in ( + ButtonColorChoices.CYAN, + ButtonColorChoices.GRAY, + ButtonColorChoices.GREY, + ButtonColorChoices.TEAL, + ButtonColorChoices.WHITE, + ButtonColorChoices.YELLOW, + ): + return ButtonColorChoices.BLACK + return ButtonColorChoices.WHITE + @property def form_data(self): return { diff --git a/netbox/templates/extras/dashboard/widget.html b/netbox/templates/extras/dashboard/widget.html index 1559363d3..b8dec3de2 100644 --- a/netbox/templates/extras/dashboard/widget.html +++ b/netbox/templates/extras/dashboard/widget.html @@ -9,14 +9,16 @@ gs-id="{{ widget.id }}" >
-
+
+ > + +
+ > + +
{% if widget.title %} {{ widget.title }}