From 6d06152573b9ceb0c7d8b7ee371eb4b1f6c6706d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 1 Feb 2024 19:58:59 -0500 Subject: [PATCH 01/23] Enable HTMX boosting --- netbox/core/views.py | 7 ++++--- netbox/extras/views.py | 3 ++- netbox/netbox/views/generic/bulk_views.py | 5 +++-- netbox/netbox/views/generic/object_views.py | 7 ++++--- netbox/netbox/views/misc.py | 3 ++- netbox/templates/base/layout.html | 3 +++ netbox/utilities/htmx.py | 12 ++++++++++++ netbox/utilities/templates/builtins/htmx_table.html | 3 ++- netbox/utilities/templates/navigation/menu.html | 2 +- 9 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 netbox/utilities/htmx.py diff --git a/netbox/core/views.py b/netbox/core/views.py index 5662b126e..c4a9f0b7f 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -25,6 +25,7 @@ from netbox.views import generic from netbox.views.generic.base import BaseObjectView from netbox.views.generic.mixins import TableMixin from utilities.forms import ConfirmationForm +from utilities.htmx import render_partial from utilities.utils import count_related from utilities.views import ContentTypePermissionRequiredMixin, register_model_view from . import filtersets, forms, tables @@ -320,7 +321,7 @@ class BackgroundTaskListView(TableMixin, BaseRQView): table = self.get_table(data, request, False) # If this is an HTMX request, return only the rendered table HTML - if request.htmx: + if render_partial(request): return render(request, 'htmx/table.html', { 'table': table, }) @@ -489,8 +490,8 @@ class WorkerListView(TableMixin, BaseRQView): table = self.get_table(data, request, False) # If this is an HTMX request, return only the rendered table HTML - if request.htmx: - if request.htmx.target != 'object_list': + if render_partial(request): + if not request.htmx.target: table.embedded = True # Hide selection checkboxes if 'pk' in table.base_columns: diff --git a/netbox/extras/views.py b/netbox/extras/views.py index de65d64f9..fc5371b0d 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -18,6 +18,7 @@ from extras.dashboard.utils import get_widget_class from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from utilities.forms import ConfirmationForm, get_field_value +from utilities.htmx import render_partial from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.rqworker import get_workers_for_queue from utilities.templatetags.builtins.filters import render_markdown @@ -1168,7 +1169,7 @@ class ScriptResultView(ContentTypePermissionRequiredMixin, View): } # If this is an HTMX request, return only the result HTML - if request.htmx: + if render_partial(request): response = render(request, 'extras/htmx/script_result.html', context) if job.completed or not job.started: response.status_code = 286 diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index f5b605ccd..2766f5008 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -22,6 +22,7 @@ from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, AbortTransaction, PermissionsViolation from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields from utilities.forms.bulk_import import BulkImportForm +from utilities.htmx import render_partial from utilities.permissions import get_permission_for_model from utilities.utils import get_viewname from utilities.views import GetReturnURLMixin @@ -161,8 +162,8 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin): table = self.get_table(self.queryset, request, has_bulk_actions) # If this is an HTMX request, return only the rendered table HTML - if request.htmx: - if request.htmx.target != 'object_list': + if render_partial(request): + if not request.htmx.target: table.embedded = True # Hide selection checkboxes if 'pk' in table.base_columns: diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 10ea257bd..2359ab0f3 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -16,6 +16,7 @@ from extras.signals import clear_events from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, PermissionsViolation from utilities.forms import ConfirmationForm, restrict_form_fields +from utilities.htmx import render_partial from utilities.permissions import get_permission_for_model from utilities.utils import get_viewname, normalize_querydict, prepare_cloned_fields from utilities.views import GetReturnURLMixin @@ -135,7 +136,7 @@ class ObjectChildrenView(ObjectView, ActionsMixin, TableMixin): table = self.get_table(table_data, request, has_bulk_actions) # If this is an HTMX request, return only the rendered table HTML - if request.htmx: + if render_partial(request): return render(request, 'htmx/table.html', { 'object': instance, 'table': table, @@ -223,7 +224,7 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): restrict_form_fields(form, request.user) # If this is an HTMX request, return only the rendered form HTML - if request.htmx: + if render_partial(request): return render(request, 'htmx/form.html', { 'form': form, }) @@ -479,7 +480,7 @@ class ComponentCreateView(GetReturnURLMixin, BaseObjectView): instance = self.alter_object(self.queryset.model(), request) # If this is an HTMX request, return only the rendered form HTML - if request.htmx: + if render_partial(request): return render(request, 'htmx/form.html', { 'form': form, }) diff --git a/netbox/netbox/views/misc.py b/netbox/netbox/views/misc.py index fc6c18218..f3997de4e 100644 --- a/netbox/netbox/views/misc.py +++ b/netbox/netbox/views/misc.py @@ -17,6 +17,7 @@ from netbox.forms import SearchForm from netbox.search import LookupTypes from netbox.search.backends import search_backend from netbox.tables import SearchTable +from utilities.htmx import render_partial from utilities.paginator import EnhancedPaginator, get_paginate_count __all__ = ( @@ -104,7 +105,7 @@ class SearchView(View): }).configure(table) # If this is an HTMX request, return only the rendered table HTML - if request.htmx: + if render_partial(request): return render(request, 'htmx/table.html', { 'table': table, }) diff --git a/netbox/templates/base/layout.html b/netbox/templates/base/layout.html index fff12c1e8..d5a97c538 100644 --- a/netbox/templates/base/layout.html +++ b/netbox/templates/base/layout.html @@ -79,6 +79,7 @@ Blocks: {# Page content #}
+
{# Page header #} {% block header %} @@ -122,6 +123,8 @@ Blocks: {% endif %} {# /Bottom banner #} +
+ {# Page footer #}