From 3547ea376c51935d77e6c7f518d852ff602c8bc5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Mar 2024 12:20:24 -0400 Subject: [PATCH] Move utilities.utils.get_viewname() to utilities.views --- netbox/extras/dashboard/widgets.py | 3 +- netbox/extras/views.py | 4 +-- netbox/netbox/tables/columns.py | 3 +- netbox/netbox/tables/tables.py | 2 +- netbox/netbox/views/generic/bulk_views.py | 3 +- netbox/netbox/views/generic/object_views.py | 4 +-- netbox/utilities/forms/fields/dynamic.py | 2 +- netbox/utilities/templatetags/buttons.py | 3 +- netbox/utilities/templatetags/helpers.py | 2 +- netbox/utilities/templatetags/tabs.py | 2 +- netbox/utilities/utils.py | 30 ------------------ netbox/utilities/views.py | 35 +++++++++++++++++++++ 12 files changed, 50 insertions(+), 43 deletions(-) diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index 2d66f91f2..2a3f72ee0 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -17,7 +17,8 @@ from extras.choices import BookmarkOrderingChoices from netbox.choices import ButtonColorChoices from utilities.permissions import get_permission_for_model from utilities.templatetags.builtins.filters import render_markdown -from utilities.utils import content_type_identifier, content_type_name, dict_to_querydict, get_viewname +from utilities.utils import content_type_identifier, content_type_name, dict_to_querydict +from utilities.views import get_viewname from .utils import register_widget __all__ = ( diff --git a/netbox/extras/views.py b/netbox/extras/views.py index cb3fdd39c..b17e3fcf7 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -22,8 +22,8 @@ from utilities.forms import ConfirmationForm, get_field_value from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.rqworker import get_workers_for_queue from utilities.templatetags.builtins.filters import render_markdown -from utilities.utils import copy_safe_request, count_related, get_viewname, normalize_querydict, shallow_compare_dict -from utilities.views import ContentTypePermissionRequiredMixin, register_model_view +from utilities.utils import copy_safe_request, count_related, normalize_querydict, shallow_compare_dict +from utilities.views import ContentTypePermissionRequiredMixin, get_viewname, register_model_view from . import filtersets, forms, tables from .models import * from .scripts import run_script diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py index 442e5f260..e2b4fa806 100644 --- a/netbox/netbox/tables/columns.py +++ b/netbox/netbox/tables/columns.py @@ -20,7 +20,8 @@ from django_tables2.utils import Accessor from extras.choices import CustomFieldTypeChoices from utilities.permissions import get_permission_for_model from utilities.templatetags.builtins.filters import render_markdown -from utilities.utils import content_type_identifier, content_type_name, get_viewname +from utilities.utils import content_type_identifier, content_type_name +from utilities.views import get_viewname __all__ = ( 'ActionsColumn', diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index 8cea55ff9..d8db511a2 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -19,7 +19,7 @@ from netbox.tables import columns from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.html import highlight from utilities.string import title -from utilities.utils import get_viewname +from utilities.views import get_viewname from .template_code import * __all__ = ( diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 022059e51..ba4e585ad 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -24,8 +24,7 @@ from utilities.exceptions import AbortRequest, AbortTransaction, PermissionsViol from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields from utilities.forms.bulk_import import BulkImportForm from utilities.permissions import get_permission_for_model -from utilities.utils import get_viewname -from utilities.views import GetReturnURLMixin +from utilities.views import GetReturnURLMixin, get_viewname from .base import BaseMultiObjectView from .mixins import ActionsMixin, TableMixin from .utils import get_prerequisite_model diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 38c0ab488..db18ae859 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -18,8 +18,8 @@ from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, PermissionsViolation from utilities.forms import ConfirmationForm, restrict_form_fields from utilities.permissions import get_permission_for_model -from utilities.utils import get_viewname, normalize_querydict, prepare_cloned_fields -from utilities.views import GetReturnURLMixin +from utilities.utils import normalize_querydict, prepare_cloned_fields +from utilities.views import GetReturnURLMixin, get_viewname from .base import BaseObjectView from .mixins import ActionsMixin, TableMixin from .utils import get_prerequisite_model diff --git a/netbox/utilities/forms/fields/dynamic.py b/netbox/utilities/forms/fields/dynamic.py index cb24ea08d..9a54b7d85 100644 --- a/netbox/utilities/forms/fields/dynamic.py +++ b/netbox/utilities/forms/fields/dynamic.py @@ -5,7 +5,7 @@ from django.forms import BoundField from django.urls import reverse from utilities.forms import widgets -from utilities.utils import get_viewname +from utilities.views import get_viewname __all__ = ( 'DynamicChoiceField', diff --git a/netbox/utilities/templatetags/buttons.py b/netbox/utilities/templatetags/buttons.py index c0870d585..1f863bca8 100644 --- a/netbox/utilities/templatetags/buttons.py +++ b/netbox/utilities/templatetags/buttons.py @@ -4,7 +4,8 @@ from django.urls import NoReverseMatch, reverse from core.models import ObjectType from extras.models import Bookmark, ExportTemplate -from utilities.utils import get_viewname, prepare_cloned_fields +from utilities.utils import prepare_cloned_fields +from utilities.views import get_viewname __all__ = ( 'add_button', diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py index b71848411..7fcc8bc00 100644 --- a/netbox/utilities/templatetags/helpers.py +++ b/netbox/utilities/templatetags/helpers.py @@ -12,7 +12,7 @@ from django.utils.safestring import mark_safe from core.models import ObjectType from utilities.forms import get_selected_values, TableConfigForm -from utilities.utils import get_viewname +from utilities.views import get_viewname __all__ = ( 'annotated_date', diff --git a/netbox/utilities/templatetags/tabs.py b/netbox/utilities/templatetags/tabs.py index 678fec9ab..83eacd663 100644 --- a/netbox/utilities/templatetags/tabs.py +++ b/netbox/utilities/templatetags/tabs.py @@ -4,7 +4,7 @@ from django.urls.exceptions import NoReverseMatch from django.utils.module_loading import import_string from netbox.registry import registry -from utilities.utils import get_viewname +from utilities.views import get_viewname __all__ = ( 'model_view_tabs', diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 3c427dd5a..6efe86119 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -21,41 +21,11 @@ from mptt.models import MPTTModel from dcim.choices import CableLengthUnitChoices, WeightUnitChoices from extras.utils import is_taggable from netbox.config import get_config -from netbox.plugins import PluginConfig from utilities.constants import HTTP_REQUEST_META_SAFE_COPY from .constants import HTML_ALLOWED_ATTRIBUTES, HTML_ALLOWED_TAGS from .string import title -def get_viewname(model, action=None, rest_api=False): - """ - Return the view name for the given model and action, if valid. - - :param model: The model or instance to which the view applies - :param action: A string indicating the desired action (if any); e.g. "add" or "list" - :param rest_api: A boolean indicating whether this is a REST API view - """ - is_plugin = isinstance(model._meta.app_config, PluginConfig) - app_label = model._meta.app_label - model_name = model._meta.model_name - - if rest_api: - viewname = f'{app_label}-api:{model_name}' - if is_plugin: - viewname = f'plugins-api:{viewname}' - if action: - viewname = f'{viewname}-{action}' - - else: - viewname = f'{app_label}:{model_name}' - if is_plugin: - viewname = f'plugins:{viewname}' - if action: - viewname = f'{viewname}_{action}' - - return viewname - - def csv_format(data): """ Encapsulate any data which contains a comma within double quotes. diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 9c89de998..4bca48dbd 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -4,6 +4,7 @@ from django.urls import reverse from django.urls.exceptions import NoReverseMatch from django.utils.translation import gettext_lazy as _ +from netbox.plugins import PluginConfig from netbox.registry import registry from .permissions import resolve_permission @@ -12,6 +13,7 @@ __all__ = ( 'GetReturnURLMixin', 'ObjectPermissionRequiredMixin', 'ViewTab', + 'get_viewname', 'register_model_view', ) @@ -180,6 +182,39 @@ class ViewTab: return self.badge +# +# Utility functions +# + +def get_viewname(model, action=None, rest_api=False): + """ + Return the view name for the given model and action, if valid. + + :param model: The model or instance to which the view applies + :param action: A string indicating the desired action (if any); e.g. "add" or "list" + :param rest_api: A boolean indicating whether this is a REST API view + """ + is_plugin = isinstance(model._meta.app_config, PluginConfig) + app_label = model._meta.app_label + model_name = model._meta.model_name + + if rest_api: + viewname = f'{app_label}-api:{model_name}' + if is_plugin: + viewname = f'plugins-api:{viewname}' + if action: + viewname = f'{viewname}-{action}' + + else: + viewname = f'{app_label}:{model_name}' + if is_plugin: + viewname = f'plugins:{viewname}' + if action: + viewname = f'{viewname}_{action}' + + return viewname + + def register_model_view(model, name='', path=None, kwargs=None): """ This decorator can be used to "attach" a view to any model in NetBox. This is typically used to inject