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:
@ -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>')
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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:
|
||||||
|
@ -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):
|
||||||
|
Reference in New Issue
Block a user