1 from django.db import models
2 from django.contrib.sites.models import Site
3 from django.http import HttpResponse, HttpResponseServerError, HttpResponseRedirect
4 from django.core.servers.basehttp import FileWrapper
5 from philo.models.base import InheritableTreeEntity
6 from philo.validators import RedirectValidator
9 class Node(InheritableTreeEntity):
10 accepts_subpath = False
12 def render_to_response(self, request, path=None, subpath=None):
13 return HttpResponseServerError()
16 unique_together = (('parent', 'slug'),)
20 # the following line enables the selection of a node as the root for a given django.contrib.sites Site object
21 models.ForeignKey(Node, related_name='sites', null=True, blank=True).contribute_to_class(Site, 'root_node')
24 class MultiNode(Node):
25 accepts_subpath = True
29 def render_to_response(self, request, path=None, subpath=None):
32 subpath = "/" + subpath
33 from django.core.urlresolvers import resolve
34 view, args, kwargs = resolve(subpath, urlconf=self)
35 return view(request, *args, **kwargs)
47 target = models.CharField(max_length=200,validators=[RedirectValidator()])
48 status_code = models.IntegerField(choices=STATUS_CODES, default=302, verbose_name='redirect type')
50 def render_to_response(self, request, path=None, subpath=None):
51 response = HttpResponseRedirect(self.target)
52 response.status_code = self.status_code
60 """ For storing arbitrary files """
61 mimetype = models.CharField(max_length=255)
62 file = models.FileField(upload_to='philo/files/%Y/%m/%d')
64 def render_to_response(self, request, path=None, subpath=None):
65 wrapper = FileWrapper(self.file)
66 response = HttpResponse(wrapper, content_type=self.mimetype)
67 response['Content-Length'] = self.file.size