mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-16 12:38:17 -06:00
Merge branch 'develop' into 5509-cf-test-2
This commit is contained in:
commit
a146051c44
@ -16,6 +16,7 @@ from django.utils.translation import gettext as _
|
|||||||
|
|
||||||
from extras.choices import BookmarkOrderingChoices
|
from extras.choices import BookmarkOrderingChoices
|
||||||
from extras.utils import FeatureQuery
|
from extras.utils import FeatureQuery
|
||||||
|
from utilities.choices import ButtonColorChoices
|
||||||
from utilities.forms import BootstrapMixin
|
from utilities.forms import BootstrapMixin
|
||||||
from utilities.permissions import get_permission_for_model
|
from utilities.permissions import get_permission_for_model
|
||||||
from utilities.templatetags.builtins.filters import render_markdown
|
from utilities.templatetags.builtins.filters import render_markdown
|
||||||
@ -115,6 +116,22 @@ class DashboardWidget:
|
|||||||
def name(self):
|
def name(self):
|
||||||
return f'{self.__class__.__module__.split(".")[0]}.{self.__class__.__name__}'
|
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
|
@property
|
||||||
def form_data(self):
|
def form_data(self):
|
||||||
return {
|
return {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.db.models import F, Prefetch
|
from django.db.models import F, Prefetch
|
||||||
from django.db.models.expressions import RawSQL
|
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.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
@ -11,6 +10,7 @@ from dcim.filtersets import InterfaceFilterSet
|
|||||||
from dcim.models import Interface, Site
|
from dcim.models import Interface, Site
|
||||||
from netbox.views import generic
|
from netbox.views import generic
|
||||||
from tenancy.views import ObjectContactsView
|
from tenancy.views import ObjectContactsView
|
||||||
|
from utilities.tables import get_table_ordering
|
||||||
from utilities.utils import count_related
|
from utilities.utils import count_related
|
||||||
from utilities.views import ViewTab, register_model_view
|
from utilities.views import ViewTab, register_model_view
|
||||||
from virtualization.filtersets import VMInterfaceFilterSet
|
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')
|
return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant', 'tenant__group')
|
||||||
|
|
||||||
def prep_table_data(self, request, queryset, parent):
|
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 add_available_ipaddresses(parent.prefix, queryset, parent.is_pool)
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
@ -952,7 +952,9 @@ class VLANGroupVLANsView(generic.ObjectChildrenView):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def prep_table_data(self, request, queryset, parent):
|
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
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -9,14 +9,16 @@
|
|||||||
gs-id="{{ widget.id }}"
|
gs-id="{{ widget.id }}"
|
||||||
>
|
>
|
||||||
<div class="card grid-stack-item-content">
|
<div class="card grid-stack-item-content">
|
||||||
<div class="card-header text-center text-light bg-{% if widget.color %}{{ widget.color }}{% else %}secondary{% endif %} p-1">
|
<div class="card-header text-center text-{{ widget.fg_color }} bg-{{ widget.color|default:"secondary" }} p-1">
|
||||||
<div class="float-start ps-1">
|
<div class="float-start ps-1">
|
||||||
<a href="#"
|
<a href="#"
|
||||||
hx-get="{% url 'extras:dashboardwidget_config' id=widget.id %}"
|
hx-get="{% url 'extras:dashboardwidget_config' id=widget.id %}"
|
||||||
hx-target="#htmx-modal-content"
|
hx-target="#htmx-modal-content"
|
||||||
data-bs-toggle="modal"
|
data-bs-toggle="modal"
|
||||||
data-bs-target="#htmx-modal"
|
data-bs-target="#htmx-modal"
|
||||||
><i class="mdi mdi-cog text-gray"></i></a>
|
>
|
||||||
|
<i class="mdi mdi-cog text-{{ widget.fg_color }}"></i>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="float-end pe-1">
|
<div class="float-end pe-1">
|
||||||
<a href="#"
|
<a href="#"
|
||||||
@ -24,7 +26,9 @@
|
|||||||
hx-target="#htmx-modal-content"
|
hx-target="#htmx-modal-content"
|
||||||
data-bs-toggle="modal"
|
data-bs-toggle="modal"
|
||||||
data-bs-target="#htmx-modal"
|
data-bs-target="#htmx-modal"
|
||||||
><i class="mdi mdi-close text-gray"></i></a>
|
>
|
||||||
|
<i class="mdi mdi-close text-{{ widget.fg_color }}"></i>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
{% if widget.title %}
|
{% if widget.title %}
|
||||||
<strong>{{ widget.title }}</strong>
|
<strong>{{ widget.title }}</strong>
|
||||||
|
@ -1,8 +1,24 @@
|
|||||||
__all__ = (
|
__all__ = (
|
||||||
|
'get_table_ordering',
|
||||||
'linkify_phone',
|
'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):
|
def linkify_phone(value):
|
||||||
"""
|
"""
|
||||||
Render a telephone number as a hyperlink.
|
Render a telephone number as a hyperlink.
|
||||||
|
Loading…
Reference in New Issue
Block a user