From 06dc22d5cbde2329fe2e5926243697e492b0a9ef Mon Sep 17 00:00:00 2001 From: Stephen Burrows Date: Thu, 3 Feb 2011 16:41:01 -0500 Subject: [PATCH] Removed trailing_pathsep support from TreeManager.get_with_path. Set nodes to have URLs without a trailing slash, and set node_view to redirect node urls with a trailing slash to the same url, but without the slash. Resolves issue 75 completely. --- models/base.py | 19 ++++--------------- models/nodes.py | 2 +- views.py | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/models/base.py b/models/base.py index a178a95..43de3b0 100644 --- a/models/base.py +++ b/models/base.py @@ -315,11 +315,6 @@ class TreeManager(models.Manager): # tree structure won't be that deep. segments = path.split(pathsep) - # Check for a trailing pathsep so we can restore it later. - trailing_pathsep = False - if segments[-1] == '': - trailing_pathsep = True - # Clean out blank segments. Handles multiple consecutive pathseps. while True: try: @@ -351,12 +346,6 @@ class TreeManager(models.Manager): return kwargs - def build_path(segments): - path = pathsep.join(segments) - if trailing_pathsep and segments and segments[-1] != '': - path += pathsep - return path - def find_obj(segments, depth, deepest_found=None): if deepest_found is None: deepest_level = 0 @@ -377,7 +366,7 @@ class TreeManager(models.Manager): if deepest_level == depth: # This should happen if nothing is found with any part of the given path. if root is not None and deepest_found is None: - return root, build_path(segments) + return root, pathsep.join(segments) raise return find_obj(segments, depth, deepest_found) @@ -390,7 +379,7 @@ class TreeManager(models.Manager): # Could there be a deeper one? if obj.is_leaf_node(): - return obj, build_path(segments[deepest_level:]) or None + return obj, pathsep.join(segments[deepest_level:]) or None depth += (len(segments) - depth)/2 or len(segments) - depth @@ -398,13 +387,13 @@ class TreeManager(models.Manager): depth = deepest_level + obj.get_descendant_count() if deepest_level == depth: - return obj, build_path(segments[deepest_level:]) or None + return obj, pathsep.join(segments[deepest_level:]) or None try: return find_obj(segments, depth, obj) except self.model.DoesNotExist: # Then this was the deepest. - return obj, build_path(segments[deepest_level:]) + return obj, pathsep.join(segments[deepest_level:]) if absolute_result: return self.get(**make_query_kwargs(segments, root)) diff --git a/models/nodes.py b/models/nodes.py index a89d653..8d33d43 100644 --- a/models/nodes.py +++ b/models/nodes.py @@ -73,7 +73,7 @@ class Node(TreeEntity): else: domain = "" - if not path: + if not path or subpath == "/": subpath = subpath[1:] return '%s%s%s%s' % (domain, root_url, path, subpath) diff --git a/views.py b/views.py index cec9c57..f5a2c7f 100644 --- a/views.py +++ b/views.py @@ -11,11 +11,26 @@ def node_view(request, path=None, **kwargs): raise MIDDLEWARE_NOT_CONFIGURED if not request.node: + if settings.APPEND_SLASH and request.path != "/": + path = request.path + + if path[-1] == "/": + path = path[:-1] + else: + path += "/" + + view, args, kwargs = resolve(path) + if view != node_view: + return HttpResponseRedirect(path) raise Http404 node = request.node subpath = request.node.subpath + # Explicitly disallow trailing slashes if we are otherwise at a node's url. + if request.path and request.path != "/" and request.path[-1] == "/" and subpath == "/": + return HttpResponseRedirect(node.get_absolute_url()) + if not node.handles_subpath(subpath): # If the subpath isn't handled, check settings.APPEND_SLASH. If # it's True, try to correct the subpath. -- 2.20.1