X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/596ad981f61660468f9135255048754ccd7627fb..3c26965045e8881acd4d5de8c195e4aa61b95ed1:/views.py diff --git a/views.py b/views.py index 255e54e..598be36 100644 --- a/views.py +++ b/views.py @@ -1,5 +1,6 @@ from django.conf import settings -from django.http import Http404 +from django.core.urlresolvers import resolve +from django.http import Http404, HttpResponseRedirect from django.views.decorators.vary import vary_on_headers from philo.exceptions import MIDDLEWARE_NOT_CONFIGURED @@ -10,11 +11,50 @@ 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 - if subpath and not node.accepts_subpath: - raise Http404 + # Explicitly disallow trailing slashes if we are otherwise at a node's url. + if request._cached_node_path != "/" and request._cached_node_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. + if not settings.APPEND_SLASH: + raise Http404 + + if subpath[-1] == "/": + subpath = subpath[:-1] + else: + subpath += "/" + + redirect_url = node.construct_url(subpath) + + if node.handles_subpath(subpath): + return HttpResponseRedirect(redirect_url) + + # Perhaps there is a non-philo view at this address. Can we + # resolve *something* there besides node_view? If not, + # raise a 404. + view, args, kwargs = resolve(redirect_url) + + if view == node_view: + raise Http404 + else: + return HttpResponseRedirect(redirect_url) + return node.render_to_response(request, kwargs) \ No newline at end of file