Allow resolving using a request or a context
Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
This commit is contained in:
@@ -11,7 +11,7 @@ from django.core.exceptions import (
|
|||||||
FieldDoesNotExist, ImproperlyConfigured, PermissionDenied
|
FieldDoesNotExist, ImproperlyConfigured, PermissionDenied
|
||||||
)
|
)
|
||||||
from django.db.models.constants import LOOKUP_SEP
|
from django.db.models.constants import LOOKUP_SEP
|
||||||
from django.template import VariableDoesNotExist, Variable
|
from django.template import RequestContext, VariableDoesNotExist, Variable
|
||||||
from django.template.defaulttags import URLNode
|
from django.template.defaulttags import URLNode
|
||||||
from django.urls import resolve, reverse
|
from django.urls import resolve, reverse
|
||||||
from django.utils.encoding import force_str, force_text
|
from django.utils.encoding import force_str, force_text
|
||||||
@@ -87,17 +87,28 @@ class Link(object):
|
|||||||
if name:
|
if name:
|
||||||
self.__class__._registry[name] = self
|
self.__class__._registry[name] = self
|
||||||
|
|
||||||
def resolve(self, context, resolved_object=None):
|
|
||||||
|
def resolve(self, context=None, request=None, resolved_object=None):
|
||||||
|
if not context and not request:
|
||||||
|
raise ImproperlyConfigured(
|
||||||
|
'Must provide a context or a request in order to resolve the '
|
||||||
|
'link.'
|
||||||
|
)
|
||||||
|
|
||||||
AccessControlList = apps.get_model(
|
AccessControlList = apps.get_model(
|
||||||
app_label='acls', model_name='AccessControlList'
|
app_label='acls', model_name='AccessControlList'
|
||||||
)
|
)
|
||||||
|
|
||||||
# Try to get the request object the faster way and fallback to the
|
if not context:
|
||||||
# slower method.
|
context = RequestContext(request=request)
|
||||||
try:
|
|
||||||
request = context.request
|
if not request:
|
||||||
except AttributeError:
|
# Try to get the request object the faster way and fallback to the
|
||||||
request = Variable('request').resolve(context)
|
# slower method.
|
||||||
|
try:
|
||||||
|
request = context.request
|
||||||
|
except AttributeError:
|
||||||
|
request = Variable('request').resolve(context)
|
||||||
|
|
||||||
current_path = request.META['PATH_INFO']
|
current_path = request.META['PATH_INFO']
|
||||||
current_view_name = resolve(current_path).view_name
|
current_view_name = resolve(current_path).view_name
|
||||||
@@ -319,24 +330,34 @@ class Menu(object):
|
|||||||
else:
|
else:
|
||||||
return item.label
|
return item.label
|
||||||
|
|
||||||
def resolve(self, context, source=None, sort_results=False):
|
def resolve(self, context=None, request=None, source=None, sort_results=False):
|
||||||
|
if not context and not request:
|
||||||
|
raise ImproperlyConfigured(
|
||||||
|
'Must provide a context or a request in order to resolve the '
|
||||||
|
'menu.'
|
||||||
|
)
|
||||||
|
|
||||||
|
if not context:
|
||||||
|
context = RequestContext(request=request)
|
||||||
|
|
||||||
if not self.check_condition(context=context):
|
if not self.check_condition(context=context):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
|
|
||||||
try:
|
if not request:
|
||||||
request = context.request
|
|
||||||
except AttributeError:
|
|
||||||
# Simple request extraction failed. Might not be a view context.
|
|
||||||
# Try alternate method.
|
|
||||||
try:
|
try:
|
||||||
request = Variable('request').resolve(context)
|
request = context.request
|
||||||
except VariableDoesNotExist:
|
except AttributeError:
|
||||||
# There is no request variable, most probable a 500 in a test
|
# Simple request extraction failed. Might not be a view context.
|
||||||
# view. Don't return any resolved links then.
|
# Try alternate method.
|
||||||
logger.warning('No request variable, aborting menu resolution')
|
try:
|
||||||
return ()
|
request = Variable('request').resolve(context)
|
||||||
|
except VariableDoesNotExist:
|
||||||
|
# There is no request variable, most probable a 500 in a test
|
||||||
|
# view. Don't return any resolved links then.
|
||||||
|
logger.warning('No request variable, aborting menu resolution')
|
||||||
|
return ()
|
||||||
|
|
||||||
current_view_name = get_current_view_name(request=request)
|
current_view_name = get_current_view_name(request=request)
|
||||||
if not current_view_name:
|
if not current_view_name:
|
||||||
|
|||||||
Reference in New Issue
Block a user