X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/0d51e8dc2b15ca84b8979b94a3224b4a33f7f25e..92e8e96c8d6814f3bd93ecd82d8da2ccb43e13c4:/views.py diff --git a/views.py b/views.py index 65acb52..598be36 100644 --- a/views.py +++ b/views.py @@ -1,18 +1,60 @@ -from django.http import Http404, HttpResponse -from django.template import RequestContext -from django.contrib.sites.models import Site -from models import Page +from django.conf import settings +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 -def page_view(request, path=None, **kwargs): - page = None - if path is None: - path = '/' - try: - current_site = Site.objects.get_current() - if current_site: - page = Page.objects.get_with_path(path, root=current_site.root_page) - except Page.DoesNotExist: - raise Http404 - if not page: + +@vary_on_headers('Accept') +def node_view(request, path=None, **kwargs): + 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 - return HttpResponse(page.template.django_template.render(RequestContext(request, {'page': page})), mimetype=page.template.mimetype) + + node = request.node + subpath = request.node.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 + + 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