Fleshed out Newsletter, NewsletterArticle, NewsletterIssue, and NewsletterView
[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='blogviews')
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='articles')
125         authors = models.ManyToManyField(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='newsletterarticles')
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)
132
133
134 class NewsletterIssue(Entity, Titled):
135         newsletter = models.ForeignKey(Newsletter, related_name='issues')
136         number = models.PositiveIntegerField()
137         articles = models.ManyToManyField(NewsletterArticle)
138
139
140 class NewsletterView(MultiView):
141         newsletter = models.ForeignKey(Newsletter, related_name='newsletterviews')
142         
143         index_template = models.ForeignKey(Template, related_name='newsletter_index_related')
144         article_template = models.ForeignKey(Template, related_name='newsletter_article_related')
145         issue_template = models.ForeignKey(Template, related_name='newsletter_issue_related')
146         
147         @property
148         def urlpatterns(self):
149                 base_patterns = patterns('',
150                         url(r'^$', self.index_view),
151                         url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/(?P<slug>[-\w]+)/?', self.article_view),
152                         url(r'^issues/(?P<number>\d+)/?', self.issue_view),
153                 )
154                 return base_patterns
155         
156         def index_view(self, request):
157                 return HttpResponse(self.index_template.django_template.render(RequestContext(request, {'newsletter': self.newsletter})), mimetype=self.index_template.mimetype)
158         
159         def article_view(self, request, slug, year=None, month=None, day=None):
160                 articles = self.newsletter.articles.all()
161                 if year:
162                         articles = articles.filter(date__year=year)
163                 if month:
164                         articles = articles.filter(date__month=month)
165                 if day:
166                         articles = articles.filter(date__day=day)
167                 try:
168                         article = articles.get(slug=slug)
169                 except:
170                         raise Http404
171                 return HttpResponse(self.article_template.django_template.render(RequestContext(request, {'newsletter': self.newsletter, 'article': article})), mimetype=self.article_template.mimetype)
172         
173         def issue_view(self, request, number):
174                 try:
175                         issue = self.newsletter.issues.get(number=number)
176                 except:
177                         raise Http404
178                 return HttpResponse(self.issue_template.django_template.render(RequestContext(request, {'newsletter': self.newsletter, 'issue': issue})), mimetype=self.issue_template.mimetype)