Switched all references to Templates in BlogViews and NewsletterViews for references...
[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, Page, register_value_model
4 from django.conf.urls.defaults import url, patterns
5 from django.http import Http404, HttpResponse
6 from datetime import datetime
7
8
9 class Blog(Entity, Titled):
10         @property
11         def entry_tags(self):
12                 """ Returns a QuerySet of Tags that are used on any entries in this blog. """
13                 return Tag.objects.filter(blogentries__blog=self)
14
15
16 class BlogEntry(Entity, Titled):
17         blog = models.ForeignKey(Blog, related_name='entries')
18         author = models.ForeignKey(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='blogentries')
19         date = models.DateTimeField(default=datetime.now)
20         content = models.TextField()
21         excerpt = models.TextField()
22         tags = models.ManyToManyField(Tag, related_name='blogentries')
23         
24         class Meta:
25                 ordering = ['-date']
26                 verbose_name_plural = "blog entries"
27
28
29 register_value_model(BlogEntry)
30
31
32 class BlogView(MultiView):
33         PERMALINK_STYLE_CHOICES = (
34                 ('D', 'Year, month, and day'),
35                 ('M', 'Year and month'),
36                 ('Y', 'Year'),
37                 ('B', 'Custom base'),
38                 ('N', 'No base')
39         )
40         
41         blog = models.ForeignKey(Blog, related_name='blogviews')
42         
43         index_page = models.ForeignKey(Page, related_name='blog_index_related')
44         archive_page = models.ForeignKey(Page, related_name='blog_archive_related')
45         tag_page = models.ForeignKey(Page, related_name='blog_tag_related')
46         entry_page = models.ForeignKey(Page, related_name='blog_entry_related')
47         
48         entry_permalink_style = models.CharField(max_length=1, choices=PERMALINK_STYLE_CHOICES)
49         entry_permalink_base = models.CharField(max_length=255, blank=False, default='entries')
50         tag_permalink_base = models.CharField(max_length=255, blank=False, default='tags')
51         
52         @property
53         def urlpatterns(self):
54                 base_patterns = patterns('',
55                         url(r'^$', self.index_view),
56                         url((r'^(?:%s)/?' % self.tag_permalink_base), self.tag_view),
57                         url((r'^(?:%s)/(?P<tag>>[-\w]+)/?' % self.tag_permalink_base), self.tag_view)
58                 )
59                 if self.entry_permalink_style == 'D':
60                         entry_patterns = patterns('',
61                                 url(r'^(?P<year>\d{4})/?$', self.archive_view),
62                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/?$', self.archive_view),
63                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/?$', self.archive_view),
64                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/(?P<slug>[-\w]+)/?', self.entry_view)
65                         )
66                 elif self.entry_permalink_style == 'M':
67                         entry_patterns = patterns('',
68                                 url(r'^(?P<year>\d{4})/?$', self.archive_view),
69                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/?$', self.archive_view),
70                                 url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<slug>>[-\w]+)/?', self.entry_view)
71                         )
72                 elif self.entry_permalink_style == 'Y':
73                         entry_patterns = patterns('',
74                                 url(r'^(?P<year>\d{4})/?$', self.archive_view),
75                                 url(r'^(?P<year>\d{4})/(?P<slug>>[-\w]+)/?', self.entry_view)
76                         )
77                 elif self.entry_permalink_style == 'B':
78                         entry_patterns = patterns('',
79                                 url((r'^(?:%s)/?' % self.entry_permalink_base), self.archive_view),
80                                 url((r'^(?:%s)/(?P<slug>>[-\w]+)/?' % self.entry_permalink_base), self.entry_view)
81                         )
82                 else:
83                         entry_patterns = patterns('',
84                                 url(r'^(?P<slug>>[-\w]+)/?', self.entry_view)
85                         )
86                 return base_patterns + entry_patterns
87         
88         def index_view(self, request, node=None, extra_context=None):
89                 context = {}
90                 context.update(extra_context or {})
91                 context.update({'blog': self.blog})
92                 return self.index_page.render_to_response(node, request, extra_context=context)
93         
94         def archive_view(self, request, year=None, month=None, day=None, node=None, extra_context=None):
95                 entries = self.blog.entries.all()
96                 if year:
97                         entries = entries.filter(date__year=year)
98                 if month:
99                         entries = entries.filter(date__month=month)
100                 if day:
101                         entries = entries.filter(date__day=day)
102                 context = {}
103                 context.update(extra_context or {})
104                 context.update({'blog': self.blog, 'year': year, 'month': month, 'day': day, 'entries': entries})
105                 return self.archive_page.render_to_response(node, request, extra_context=context)
106         
107         def tag_view(self, request, tag=None, node=None, extra_context=None):
108                 entries = self.blog.entries.filter(tags__slug=tag)
109                 context = {}
110                 context.update(extra_context or {})
111                 context.update({'blog': self.blog, 'tag': tag, 'entries': entries})
112                 return self.tag_page.render_to_response(node, request, extra_context=context)
113         
114         def entry_view(self, request, slug, year=None, month=None, day=None, node=None, extra_context=None):
115                 entries = self.blog.entries.all()
116                 if year:
117                         entries = entries.filter(date__year=year)
118                 if month:
119                         entries = entries.filter(date__month=month)
120                 if day:
121                         entries = entries.filter(date__day=day)
122                 try:
123                         entry = entries.get(slug=slug)
124                 except:
125                         raise Http404
126                 context = {}
127                 context.update(extra_context or {})
128                 context.update({'blog': self.blog, 'entry': entry})
129                 return self.entry_page.render_to_response(node, request, extra_context=context)
130
131
132 class Newsletter(Entity, Titled):
133         pass
134
135
136 class NewsletterArticle(Entity, Titled):
137         newsletter = models.ForeignKey(Newsletter, related_name='articles')
138         authors = models.ManyToManyField(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='newsletterarticles')
139         date = models.DateTimeField(default=datetime.now)
140         lede = models.TextField(null=True, blank=True)
141         full_text = models.TextField()
142
143
144 register_value_model(NewsletterArticle)
145
146
147 class NewsletterIssue(Entity, Titled):
148         newsletter = models.ForeignKey(Newsletter, related_name='issues')
149         number = models.PositiveIntegerField()
150         articles = models.ManyToManyField(NewsletterArticle)
151
152
153 class NewsletterView(MultiView):
154         newsletter = models.ForeignKey(Newsletter, related_name='newsletterviews')
155         
156         index_page = models.ForeignKey(Page, related_name='newsletter_index_related')
157         article_page = models.ForeignKey(Page, related_name='newsletter_article_related')
158         issue_page = models.ForeignKey(Page, related_name='newsletter_issue_related')
159         
160         @property
161         def urlpatterns(self):
162                 base_patterns = patterns('',
163                         url(r'^$', self.index_view),
164                         url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/(?P<slug>[-\w]+)/?', self.article_view),
165                         url(r'^issues/(?P<number>\d+)/?', self.issue_view),
166                 )
167                 return base_patterns
168         
169         def index_view(self, request, node=None, extra_context=None):
170                 context = {}
171                 context.update(extra_context or {})
172                 context.update({'newsletter': self.newsletter})
173                 return self.index_page.render_to_response(node, request, extra_context=context)
174         
175         def article_view(self, request, slug, year=None, month=None, day=None, node=None, extra_context=None):
176                 articles = self.newsletter.articles.all()
177                 if year:
178                         articles = articles.filter(date__year=year)
179                 if month:
180                         articles = articles.filter(date__month=month)
181                 if day:
182                         articles = articles.filter(date__day=day)
183                 try:
184                         article = articles.get(slug=slug)
185                 except:
186                         raise Http404
187                 context = {}
188                 context.update(extra_context or {})
189                 context.update({'newsletter': self.newsletter, 'article': article})
190                 return self.article_page.render_to_response(node, request, extra_context=context)
191         
192         def issue_view(self, request, number, node=None, extra_context=None):
193                 try:
194                         issue = self.newsletter.issues.get(number=number)
195                 except:
196                         raise Http404
197                 context = {}
198                 context.update(extra_context or {})
199                 context.update({'newsletter': self.newsletter, 'issue': issue})
200                 return self.issue_page.render_to_response(node, request, extra_context=context)