Merge branch 'master' of git://github.com/melinath/philo
[philo.git] / views.py
1 from django.contrib.sites.models import Site
2 from django.conf import settings
3 from django.http import Http404, HttpResponse
4 from django.template import RequestContext
5 from django.views.decorators.vary import vary_on_headers
6 from philo.models import Node
7
8
9 @vary_on_headers('Accept')
10 def node_view(request, path=None, **kwargs):
11         node = None
12         subpath = None
13         if path is None:
14                 path = '/'
15         current_site = Site.objects.get_current()
16         try:
17                 node, subpath = Node.objects.get_with_path(path, root=current_site.root_node, absolute_result=False)
18         except Node.DoesNotExist:
19                 raise Http404
20         
21         if not node:
22                 raise Http404
23         
24         try:
25                 if subpath and not node.accepts_subpath:
26                         raise Http404
27                 return node.render_to_response(request, path=path, subpath=subpath)
28         except Http404, e:
29                 if settings.DEBUG:
30                         raise e
31                 
32                 try:
33                         Http404View = node.relationships['Http404']
34                 except KeyError:
35                         Http404View = None
36                 
37                 if not Http404View:
38                         raise e
39                 
40                 extra_context = {'exception': e}
41                 
42                 return Http404View.render_to_response(node, request, path, subpath, extra_context)
43         except Exception, e:
44                 if settings.DEBUG:
45                         raise e
46                 
47                 try:
48                         Http500View = node.relationships['Http500']
49                         
50                         if not Http500View:
51                                 raise e
52                         
53                         extra_context = {'exception': e}
54                         
55                         return Http500View.render_to_response(node, request, path, subpath, extra_context)
56                 except:
57                         raise e