# 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:
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
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)
# 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
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))
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.