X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/1dba84d30c4323acb722de2011ff7a0bff9148aa..ca4643640b3e41bc557ecd996d835e67ef707d5e:/views.py diff --git a/views.py b/views.py index fd8e662..598be36 100644 --- a/views.py +++ b/views.py @@ -1,54 +1,60 @@ -from django.contrib.sites.models import Site from django.conf import settings -from django.http import Http404, HttpResponse -from django.template import RequestContext +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 -from philo.models import Node @vary_on_headers('Accept') def node_view(request, path=None, **kwargs): - if not hasattr(request, 'node'): + if "philo.middleware.RequestNodeMiddleware" not in settings.MIDDLEWARE_CLASSES: 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 - try: - if subpath and not node.accepts_subpath: + # 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 - return node.render_to_response(request, kwargs) - except Http404, e: - if settings.DEBUG: - raise - try: - Http404View = node.relationships['Http404'] - except KeyError: - Http404View = None + if subpath[-1] == "/": + subpath = subpath[:-1] + else: + subpath += "/" - if not Http404View: - raise e + redirect_url = node.construct_url(subpath) - extra_context = {'exception': e} + if node.handles_subpath(subpath): + return HttpResponseRedirect(redirect_url) - return Http404View.render_to_response(request, extra_context) - except Exception, e: - if settings.DEBUG: - raise + # 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) - try: - Http500View = node.relationships['Http500'] - - if not Http500View: - raise e - - extra_context = {'exception': e} - - return Http500View.render_to_response(request, extra_context) - except: - raise e \ No newline at end of file + if view == node_view: + raise Http404 + else: + return HttpResponseRedirect(redirect_url) + + return node.render_to_response(request, kwargs) \ No newline at end of file