1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Introduce get_viewname() as a standard utility

This commit is contained in:
jeremystretch
2022-02-09 13:47:12 -05:00
parent e2286a4c48
commit 10e6ae2094
4 changed files with 27 additions and 34 deletions

View File

@ -10,7 +10,7 @@ from django.utils.safestring import mark_safe
from django_tables2.utils import Accessor from django_tables2.utils import Accessor
from extras.choices import CustomFieldTypeChoices from extras.choices import CustomFieldTypeChoices
from utilities.utils import content_type_identifier, content_type_name, resolve_namespace from utilities.utils import content_type_identifier, content_type_name, get_viewname
__all__ = ( __all__ = (
'ActionsColumn', 'ActionsColumn',
@ -134,7 +134,6 @@ class ActionsColumn(tables.Column):
return '' return ''
model = table.Meta.model model = table.Meta.model
viewname_base = f'{resolve_namespace(model)}:{model._meta.model_name}'
request = getattr(table, 'context', {}).get('request') request = getattr(table, 'context', {}).get('request')
url_appendix = f'?return_url={request.path}' if request else '' url_appendix = f'?return_url={request.path}' if request else ''
@ -143,7 +142,7 @@ class ActionsColumn(tables.Column):
for action, attrs in self.actions.items(): for action, attrs in self.actions.items():
permission = f'{model._meta.app_label}.{attrs.permission}_{model._meta.model_name}' permission = f'{model._meta.app_label}.{attrs.permission}_{model._meta.model_name}'
if attrs.permission is None or user.has_perm(permission): if attrs.permission is None or user.has_perm(permission):
url = reverse(f'{viewname_base}_{action}', kwargs={'pk': record.pk}) url = reverse(get_viewname(model, action), kwargs={'pk': record.pk})
links.append(f'<li><a class="dropdown-item" href="{url}{url_appendix}">' links.append(f'<li><a class="dropdown-item" href="{url}{url_appendix}">'
f'<i class="mdi mdi-{attrs.icon}"></i> {attrs.title}</a></li>') f'<i class="mdi mdi-{attrs.icon}"></i> {attrs.title}</a></li>')

View File

@ -2,32 +2,18 @@ from django import template
from django.urls import reverse from django.urls import reverse
from extras.models import ExportTemplate from extras.models import ExportTemplate
from utilities.utils import prepare_cloned_fields from utilities.utils import get_viewname, prepare_cloned_fields
register = template.Library() register = template.Library()
def _get_viewname(instance, action):
"""
Return the appropriate viewname for adding, editing, or deleting an instance.
"""
# Validate action
assert action in ('add', 'edit', 'delete')
viewname = "{}:{}_{}".format(
instance._meta.app_label, instance._meta.model_name, action
)
return viewname
# #
# Instance buttons # Instance buttons
# #
@register.inclusion_tag('buttons/clone.html') @register.inclusion_tag('buttons/clone.html')
def clone_button(instance): def clone_button(instance):
url = reverse(_get_viewname(instance, 'add')) url = reverse(get_viewname(instance, 'add'))
# Populate cloned field values # Populate cloned field values
param_string = prepare_cloned_fields(instance).urlencode() param_string = prepare_cloned_fields(instance).urlencode()
@ -41,7 +27,7 @@ def clone_button(instance):
@register.inclusion_tag('buttons/edit.html') @register.inclusion_tag('buttons/edit.html')
def edit_button(instance): def edit_button(instance):
viewname = _get_viewname(instance, 'edit') viewname = get_viewname(instance, 'edit')
url = reverse(viewname, kwargs={'pk': instance.pk}) url = reverse(viewname, kwargs={'pk': instance.pk})
return { return {
@ -51,7 +37,7 @@ def edit_button(instance):
@register.inclusion_tag('buttons/delete.html') @register.inclusion_tag('buttons/delete.html')
def delete_button(instance): def delete_button(instance):
viewname = _get_viewname(instance, 'delete') viewname = get_viewname(instance, 'delete')
url = reverse(viewname, kwargs={'pk': instance.pk}) url = reverse(viewname, kwargs={'pk': instance.pk})
return { return {

View File

@ -16,10 +16,9 @@ from django.utils.safestring import mark_safe
from markdown import markdown from markdown import markdown
from netbox.config import get_config from netbox.config import get_config
from netbox.settings import PLUGINS
from utilities.forms import get_selected_values, TableConfigForm from utilities.forms import get_selected_values, TableConfigForm
from utilities.markdown import StrikethroughExtension from utilities.markdown import StrikethroughExtension
from utilities.utils import foreground_color, resolve_namespace from utilities.utils import foreground_color, get_viewname
register = template.Library() register = template.Library()
@ -116,8 +115,7 @@ def viewname(model, action):
""" """
Return the view name for the given model and action. Does not perform any validation. Return the view name for the given model and action. Does not perform any validation.
""" """
namespace = resolve_namespace(model) return get_viewname(model, action)
return f'{namespace}:{model._meta.model_name}_{action}'
@register.filter() @register.filter()
@ -125,11 +123,10 @@ def validated_viewname(model, action):
""" """
Return the view name for the given model and action if valid, or None if invalid. Return the view name for the given model and action if valid, or None if invalid.
""" """
namespace = resolve_namespace(model) viewname = get_viewname(model, action)
viewname = f'{namespace}:{model._meta.model_name}_{action}'
# Validate the view name
try: try:
# Validate and return the view name. We don't return the actual URL yet because many of the templates
# are written to pass a name to {% url %}.
reverse(viewname) reverse(viewname)
return viewname return viewname
except NoReverseMatch: except NoReverseMatch:

View File

@ -17,13 +17,24 @@ from extras.utils import is_taggable
from utilities.constants import HTTP_REQUEST_META_SAFE_COPY from utilities.constants import HTTP_REQUEST_META_SAFE_COPY
def resolve_namespace(instance): def get_viewname(model, action=None):
""" """
Get the appropriate namepsace for the app based on whether it is a Plugin or base application 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"
""" """
if isinstance(instance._meta.app_config, PluginConfig): viewname = f'{model._meta.app_label}:{model._meta.model_name}'
return f'plugins:{instance._meta.app_label}'
return f'{instance._meta.app_label}' # Determine whether this is a plugin view and adjust the namespace appropriately
if isinstance(model._meta.app_config, PluginConfig):
viewname = f'plugins:{viewname}'
# Append the action, if any
if action:
viewname = f'{viewname}_{action}'
return viewname
def csv_format(data): def csv_format(data):