Moved path resolving code to navigation.utils
This commit is contained in:
@@ -2,7 +2,6 @@ import copy
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse, NoReverseMatch
|
from django.core.urlresolvers import reverse, NoReverseMatch
|
||||||
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern, Resolver404, get_resolver
|
|
||||||
from django.template import TemplateSyntaxError, Library, \
|
from django.template import TemplateSyntaxError, Library, \
|
||||||
VariableDoesNotExist, Node, Variable
|
VariableDoesNotExist, Node, Variable
|
||||||
from django.utils.text import unescape_string_literal
|
from django.utils.text import unescape_string_literal
|
||||||
@@ -11,6 +10,7 @@ from django.utils.translation import ugettext as _
|
|||||||
from navigation.api import object_navigation, multi_object_navigation, \
|
from navigation.api import object_navigation, multi_object_navigation, \
|
||||||
menu_links as menu_navigation
|
menu_links as menu_navigation
|
||||||
from navigation.forms import MultiItemForm
|
from navigation.forms import MultiItemForm
|
||||||
|
from navigation.utils import resolve_to_name
|
||||||
|
|
||||||
register = Library()
|
register = Library()
|
||||||
|
|
||||||
@@ -71,54 +71,6 @@ def main_navigation(parser, token):
|
|||||||
return NavigationNode(navigation=menu_navigation)
|
return NavigationNode(navigation=menu_navigation)
|
||||||
|
|
||||||
|
|
||||||
#http://www.djangosnippets.org/snippets/1378/
|
|
||||||
__all__ = ('resolve_to_name',)
|
|
||||||
|
|
||||||
|
|
||||||
def _pattern_resolve_to_name(self, path):
|
|
||||||
match = self.regex.search(path)
|
|
||||||
if match:
|
|
||||||
name = ""
|
|
||||||
if self.name:
|
|
||||||
name = self.name
|
|
||||||
elif hasattr(self, '_callback_str'):
|
|
||||||
name = self._callback_str
|
|
||||||
else:
|
|
||||||
name = "%s.%s" % (self.callback.__module__, self.callback.func_name)
|
|
||||||
return name
|
|
||||||
|
|
||||||
|
|
||||||
def _resolver_resolve_to_name(self, path):
|
|
||||||
tried = []
|
|
||||||
match = self.regex.search(path)
|
|
||||||
if match:
|
|
||||||
new_path = path[match.end():]
|
|
||||||
for pattern in self.url_patterns:
|
|
||||||
try:
|
|
||||||
name = pattern.resolve_to_name(new_path)
|
|
||||||
except Resolver404, e:
|
|
||||||
tried.extend([(pattern.regex.pattern + ' ' + t) for t in e.args[0]['tried']])
|
|
||||||
else:
|
|
||||||
if name:
|
|
||||||
return name
|
|
||||||
tried.append(pattern.regex.pattern)
|
|
||||||
raise Resolver404, {'tried': tried, 'path': new_path}
|
|
||||||
|
|
||||||
|
|
||||||
# here goes monkeypatching
|
|
||||||
RegexURLPattern.resolve_to_name = _pattern_resolve_to_name
|
|
||||||
RegexURLResolver.resolve_to_name = _resolver_resolve_to_name
|
|
||||||
|
|
||||||
|
|
||||||
def resolve_to_name(path, urlconf=None):
|
|
||||||
return get_resolver(urlconf).resolve_to_name(path)
|
|
||||||
|
|
||||||
|
|
||||||
@register.filter
|
|
||||||
def resolve_url_name(value):
|
|
||||||
return resolve_to_name(value)
|
|
||||||
|
|
||||||
|
|
||||||
def resolve_arguments(context, src_args):
|
def resolve_arguments(context, src_args):
|
||||||
args = []
|
args = []
|
||||||
kwargs = {}
|
kwargs = {}
|
||||||
|
|||||||
45
apps/navigation/utils.py
Normal file
45
apps/navigation/utils.py
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
#http://www.djangosnippets.org/snippets/1378/
|
||||||
|
|
||||||
|
from django.core.urlresolvers import RegexURLResolver, RegexURLPattern, Resolver404, get_resolver
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ('resolve_to_name',)
|
||||||
|
|
||||||
|
|
||||||
|
def _pattern_resolve_to_name(self, path):
|
||||||
|
match = self.regex.search(path)
|
||||||
|
if match:
|
||||||
|
name = ""
|
||||||
|
if self.name:
|
||||||
|
name = self.name
|
||||||
|
elif hasattr(self, '_callback_str'):
|
||||||
|
name = self._callback_str
|
||||||
|
else:
|
||||||
|
name = "%s.%s" % (self.callback.__module__, self.callback.func_name)
|
||||||
|
return name
|
||||||
|
|
||||||
|
|
||||||
|
def _resolver_resolve_to_name(self, path):
|
||||||
|
tried = []
|
||||||
|
match = self.regex.search(path)
|
||||||
|
if match:
|
||||||
|
new_path = path[match.end():]
|
||||||
|
for pattern in self.url_patterns:
|
||||||
|
try:
|
||||||
|
name = pattern.resolve_to_name(new_path)
|
||||||
|
except Resolver404, e:
|
||||||
|
tried.extend([(pattern.regex.pattern + ' ' + t) for t in e.args[0]['tried']])
|
||||||
|
else:
|
||||||
|
if name:
|
||||||
|
return name
|
||||||
|
tried.append(pattern.regex.pattern)
|
||||||
|
raise Resolver404, {'tried': tried, 'path': new_path}
|
||||||
|
|
||||||
|
|
||||||
|
# here goes monkeypatching
|
||||||
|
RegexURLPattern.resolve_to_name = _pattern_resolve_to_name
|
||||||
|
RegexURLResolver.resolve_to_name = _resolver_resolve_to_name
|
||||||
|
|
||||||
|
|
||||||
|
def resolve_to_name(path, urlconf=None):
|
||||||
|
return get_resolver(urlconf).resolve_to_name(path)
|
||||||
Reference in New Issue
Block a user