Splitting models into submodules beside models.base.
[philo.git] / models / nodes.py
1 from django.db import models
2 from django.http import HttpResponse, HttpResponseServerError, HttpResponseRedirect
3 from django.core.servers.basehttp import FileWrapper
4 from philo.models.base import InheritableTreeEntity
5 from philo.validators import RedirectValidator
6
7
8 class Node(InheritableTreeEntity):
9         accepts_subpath = False
10         
11         def render_to_response(self, request, path=None, subpath=None):
12                 return HttpResponseServerError()
13                 
14         class Meta:
15                 unique_together = (('parent', 'slug'),)
16                 app_label = 'philo'
17
18
19 class MultiNode(Node):
20         accepts_subpath = True
21         
22         urlpatterns = []
23         
24         def render_to_response(self, request, path=None, subpath=None):
25                 if not subpath:
26                         subpath = ""
27                 subpath = "/" + subpath
28                 from django.core.urlresolvers import resolve
29                 view, args, kwargs = resolve(subpath, urlconf=self)
30                 return view(request, *args, **kwargs)
31         
32         class Meta:
33                 abstract = True
34                 app_label = 'philo'
35
36
37 class Redirect(Node):
38         STATUS_CODES = (
39                 (302, 'Temporary'),
40                 (301, 'Permanent'),
41         )
42         target = models.CharField(max_length=200,validators=[RedirectValidator()])
43         status_code = models.IntegerField(choices=STATUS_CODES, default=302, verbose_name='redirect type')
44         
45         def render_to_response(self, request, path=None, subpath=None):
46                 response = HttpResponseRedirect(self.target)
47                 response.status_code = self.status_code
48                 return response
49         
50         class Meta:
51                 app_label = 'philo'
52
53
54 class File(Node):
55         """ For storing arbitrary files """
56         mimetype = models.CharField(max_length=255)
57         file = models.FileField(upload_to='philo/files/%Y/%m/%d')
58         
59         def render_to_response(self, request, path=None, subpath=None):
60                 wrapper = FileWrapper(self.file)
61                 response = HttpResponse(wrapper, content_type=self.mimetype)
62                 response['Content-Length'] = self.file.size
63                 return response
64         
65         class Meta:
66                 app_label = 'philo'