Moved Tag, and the Titled abstract model, from penfield into philo proper. Added...
[philo.git] / contrib / penfield / models.py
1 from django.db import models
2 from django.conf import settings
3 from philo.models import Tag, Titled, Entity, MultiView, Template, register_value_model
4 from django.conf.urls.defaults import url, patterns
5 from django.http import Http404, HttpResponse
6 from django.template import RequestContext
7 from datetime import datetime
8
9
10 class Blog(Entity, Titled):
11         pass
12
13
14 class BlogEntry(Entity, Titled):
15         blog = models.ForeignKey(Blog, related_name='entries')
16         author = models.ForeignKey(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='blogentries')
17         date = models.DateTimeField(default=datetime.now)
18         content = models.TextField()
19         excerpt = models.TextField()
20         tags = models.ManyToManyField(Tag)
21         
22         class Meta:
23                 ordering = ['-date']
24                 verbose_name_plural = "Blog Entries"
25
26
27 register_value_model(BlogEntry)
28
29
30 class BlogView(MultiView):
31         PERMALINK_STYLE_CHOICES = (
32                 ('D', 'Year, month, and day'),
33                 ('M', 'Year and month'),
34                 ('Y', 'Year'),
35                 ('B', 'Custom base'),
36                 ('N', 'No base')
37         )
38         
39         blog = models.ForeignKey(Blog, related_name='nodes')
40         
41         index_template = models.ForeignKey(Template, related_name='blog_index_related')
42         archive_template = models.ForeignKey(Template, related_name='blog_archive_related')
43         tag_template = models.ForeignKey(Template, related_name='blog_tag_related')
44         entry_template = models.ForeignKey(Template, related_name='blog_entry_related')
45         
46         entry_permalink_style = models.CharField(max_length=1, choices=PERMALINK_STYLE_CHOICES)
47         entry_permalink_base = models.CharField(max_length=255, blank=False, default='entries')
48         tag_permalink_base = models.CharField(max_length=255, blank=False, default='tags')
49         
50         @property
51         def urlpatterns(self):
52                 base_patterns = patterns('',
53                         url(r'^$', self.index_view),
54                         url((r'^(?:%s)/?' % self.tag_permalink_base), self.tag_view),
55                         url((r'^(?:%s)/(?P<tag>>[-\w]+)/?' % self.tag_permalink_base), self.tag_view)
56                 )
57                 if self.entry_permalink_style == 'D':
58                         entry_patterns = patterns('',
59                                 url(r'^(?P<year>\d{4})/?$', self.archive_view),
60                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/?$', self.archive_view),
61                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/?$', self.archive_view),
62                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/(?P<slug>[-\w]+)/?', self.entry_view)
63                         )
64                 elif self.entry_permalink_style == 'M':
65                         entry_patterns = patterns('',
66                                 url(r'^(?P<year>\d{4})/?$', self.archive_view),
67                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/?$', self.archive_view),
68                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<slug>>[-\w]+)/?', self.entry_view)
69                         )
70                 elif self.entry_permalink_style == 'Y':
71                         entry_patterns = patterns('',
72                                 url(r'^(?P<year>\d{4})/?$', self.archive_view),
73                                 url(r'^(?P<year>\d{4})/(?P<slug>>[-\w]+)/?', self.entry_view)
74                         )
75                 elif self.entry_permalink_style == 'B':
76                         entry_patterns = patterns('',
77                                 url((r'^(?:%s)/?' % self.entry_permalink_base), self.archive_view),
78                                 url((r'^(?:%s)/(?P<slug>>[-\w]+)/?' % self.entry_permalink_base), self.entry_view)
79                         )
80                 else:
81                         entry_patterns = patterns('',
82                                 url(r'^(?P<slug>>[-\w]+)/?', self.entry_view)
83                         )
84                 return base_patterns + entry_patterns
85         
86         def index_view(self, request):
87                 entries = self.blog.entries.order_by('-date')
88                 return HttpResponse(self.index_template.django_template.render(RequestContext(request, {'blog': self.blog, 'entries': entries})), mimetype=self.index_template.mimetype)
89         
90         def archive_view(self, request, year=None, month=None, day=None):
91                 entries = self.blog.entries.all()
92                 if year:
93                         entries = entries.filter(date__year=year)
94                 if month:
95                         entries = entries.filter(date__month=month)
96                 if day:
97                         entries = entries.filter(date__day=day)
98                 return HttpResponse(self.archive_template.django_template.render(RequestContext(request, {'blog': self.blog, 'year': year, 'month': month, 'day': day, 'entries': entries})), mimetype=self.archive_template.mimetype)
99         
100         def tag_view(self, request, tag=None):
101                 # return HttpResponse(self.tag_template.django_template.render(RequestContext(request, {'blog': self.blog, 'tag': tag, 'entries': None})), mimetype=self.tag_template.mimetype)
102                 raise Http404
103         
104         def entry_view(self, request, slug, year=None, month=None, day=None):
105                 entries = self.blog.entries.all()
106                 if year:
107                         entries = entries.filter(date__year=year)
108                 if month:
109                         entries = entries.filter(date__month=month)
110                 if day:
111                         entries = entries.filter(date__day=day)
112                 try:
113                         entry = entries.get(slug=slug)
114                 except:
115                         raise Http404
116                 return HttpResponse(self.entry_template.django_template.render(RequestContext(request, {'blog': self.blog, 'entry': entry})), mimetype=self.entry_template.mimetype)
117
118
119 class Newsletter(Entity, Titled):
120         pass
121
122
123 class NewsletterArticle(Entity, Titled):
124         newsletter = models.ForeignKey(Newsletter, related_name='stories')
125         authors = models.ManyToManyField(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='newsstories')
126         date = models.DateTimeField(default=datetime.now)
127         lede = models.TextField(null=True, blank=True)
128         full_text = models.TextField()
129
130
131 register_value_model(NewsletterArticle)