X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/b148ca4096bd2154e3c9b2d9f1cda7ef31c346db..85c501277e1f94ab637e1128c1e8aae7b2da2519:/contrib/penfield/models.py diff --git a/contrib/penfield/models.py b/contrib/penfield/models.py index 449b63d..50b82d4 100644 --- a/contrib/penfield/models.py +++ b/contrib/penfield/models.py @@ -2,13 +2,14 @@ from django.db import models from django.conf import settings from philo.models import Tag, Titled, Entity, MultiView, Page, register_value_model from philo.exceptions import ViewCanNotProvideSubpath -from django.conf.urls.defaults import url, patterns -from django.core.paginator import EmptyPage +from django.conf.urls.defaults import url, patterns, include from django.core.urlresolvers import reverse -from django.http import Http404, HttpResponse +from django.http import Http404 from datetime import datetime -from philo.contrib.penfield.utils import paginate +from philo.utils import paginate from philo.contrib.penfield.validators import validate_pagination_count +from django.utils.feedgenerator import Atom1Feed, Rss201rev2Feed +from philo.contrib.penfield.utils import FeedMultiViewMixin class Blog(Entity, Titled): @@ -27,7 +28,7 @@ register_value_model(Blog) class BlogEntry(Entity, Titled): - blog = models.ForeignKey(Blog, related_name='entries') + blog = models.ForeignKey(Blog, related_name='entries', blank=True, null=True) author = models.ForeignKey(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='blogentries') date = models.DateTimeField(default=datetime.now) content = models.TextField() @@ -42,7 +43,7 @@ class BlogEntry(Entity, Titled): register_value_model(BlogEntry) -class BlogView(MultiView): +class BlogView(MultiView, FeedMultiViewMixin): ENTRY_PERMALINK_STYLE_CHOICES = ( ('D', 'Year, month, and day'), ('M', 'Year and month'), @@ -63,10 +64,20 @@ class BlogView(MultiView): entry_permalink_style = models.CharField(max_length=1, choices=ENTRY_PERMALINK_STYLE_CHOICES) entry_permalink_base = models.CharField(max_length=255, blank=False, default='entries') tag_permalink_base = models.CharField(max_length=255, blank=False, default='tags') + feed_suffix = models.CharField(max_length=255, blank=False, default=FeedMultiViewMixin.feed_suffix) + feeds_enabled = models.BooleanField() def __unicode__(self): return u'BlogView for %s' % self.blog.title + @property + def per_page(self): + return self.entries_per_page + + @property + def feed_title(self): + return self.blog.title + def get_subpath(self, obj): if isinstance(obj, BlogEntry): if obj.blog == self.blog: @@ -94,34 +105,38 @@ class BlogView(MultiView): return reverse(self.entry_archive_view, urlconf=self, kwargs=entry_archive_view_args) raise ViewCanNotProvideSubpath + def get_context(self): + return {'blog': self.blog} + @property def urlpatterns(self): base_patterns = patterns('', - url(r'^$', self.index_view), + url(r'^', include(self.feed_patterns(self.get_all_entries, self.index_page, 'index'))), url((r'^(?:%s)/?$' % self.tag_permalink_base), self.tag_archive_view), - url((r'^(?:%s)/(?P[-\w]+[-+/\w]*)/?$' % self.tag_permalink_base), self.tag_view) + url((r'^(?:%s)/(?P[-\w]+[-+/\w]*)/' % self.tag_permalink_base), include(self.feed_patterns(self.get_entries_by_tag, self.tag_page, 'entries_by_tag'))) ) if self.entry_permalink_style == 'D': entry_patterns = patterns('', - url(r'^(?P\d{4})/?$', self.entry_archive_view), - url(r'^(?P\d{4})/(?P\d{2})/?$', self.entry_archive_view), - url(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})/?$', self.entry_archive_view), + url(r'^(?P\d{4})/', include(self.feed_patterns(self.get_entries_by_ymd, self.entry_archive_page, 'entries_by_year'))), + url(r'^(?P\d{4})/(?P\d{2})/?$', include(self.feed_patterns(self.get_entries_by_ymd, self.entry_archive_page, 'entries_by_month'))), + url(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})/?$', include(self.feed_patterns(self.get_entries_by_ymd, self.entry_archive_page, 'entries_by_day'))), url(r'^(?P\d{4})/(?P\d{2})/(?P\d{2})/(?P[-\w]+)/?$', self.entry_view) ) elif self.entry_permalink_style == 'M': entry_patterns = patterns('', - url(r'^(?P\d{4})/?$', self.entry_archive_view), - url(r'^(?P\d{4})/(?P\d{2})/?$', self.entry_archive_view), + url(r'^(?P\d{4})/', include(self.feed_patterns(self.get_entries_by_ymd, self.entry_archive_page, 'entries_by_year'))), + url(r'^(?P\d{4})/(?P\d{2})/?$', include(self.feed_patterns(self.get_entries_by_ymd, self.entry_archive_page, 'entries_by_month'))), url(r'^(?P\d{4})/(?P\d{2})/(?P[-\w]+)/?$', self.entry_view) ) elif self.entry_permalink_style == 'Y': entry_patterns = patterns('', - url(r'^(?P\d{4})/?$', self.entry_archive_view), + url(r'^(?P\d{4})/', include(self.feed_patterns(self.get_entries_by_ymd, self.entry_archive_page, 'entries_by_year'))), url(r'^(?P\d{4})/(?P[-\w]+)/?$', self.entry_view) ) elif self.entry_permalink_style == 'B': entry_patterns = patterns('', - url((r'^(?:%s)/?$' % self.entry_permalink_base), self.entry_archive_view), + url((r'^(?:%s)/?$' % self.entry_permalink_base), + url(r'^(?P\d{4})/', include(self.feed_patterns(self.get_all_entries, self.entry_archive_page, 'entries_by_year'))),), url((r'^(?:%s)/(?P[-\w]+)/?$' % self.entry_permalink_base), self.entry_view) ) else: @@ -130,31 +145,10 @@ class BlogView(MultiView): ) return base_patterns + entry_patterns - def index_view(self, request, node=None, extra_context=None): - pagination = paginate(self.blog.entries.all(), self.entries_per_page, request.GET.get('page', 1)) - context = {} - context.update(extra_context or {}) - context.update({'blog': self.blog, 'pagination': pagination}) - return self.index_page.render_to_response(node, request, extra_context=context) + def get_all_entries(self, request, node=None, extra_context=None): + return self.blog.entries.all(), extra_context - def entry_view(self, request, slug, year=None, month=None, day=None, node=None, extra_context=None): - entries = self.blog.entries.all() - if year: - entries = entries.filter(date__year=year) - if month: - entries = entries.filter(date__month=month) - if day: - entries = entries.filter(date__day=day) - try: - entry = entries.get(slug=slug) - except: - raise Http404 - context = {} - context.update(extra_context or {}) - context.update({'blog': self.blog, 'entry': entry}) - return self.entry_page.render_to_response(node, request, extra_context=context) - - def entry_archive_view(self, request, year=None, month=None, day=None, node=None, extra_context=None): + def get_entries_by_ymd(self, request, year=None, month=None, day=None, node=None, extra_context=None): if not self.entry_archive_page: raise Http404 entries = self.blog.entries.all() @@ -165,13 +159,11 @@ class BlogView(MultiView): if day: entries = entries.filter(date__day=day) - pagination = paginate(entries, self.entries_per_page, request.GET.get('page', 1)) - context = {} - context.update(extra_context or {}) - context.update({'blog': self.blog, 'year': year, 'month': month, 'day': day, 'pagination': pagination}) - return self.entry_archive_page.render_to_response(node, request, extra_context=context) + context = extra_context or {} + context.update({'year': year, 'month': month, 'day': day}) + return entries, context - def tag_view(self, request, tag_slugs, node=None, extra_context=None): + def get_entries_by_tag(self, request, node=None, extra_context=None): tags = [] for tag_slug in tag_slugs.replace('+', '/').split('/'): if tag_slug: # ignore blank slugs, handles for multiple consecutive separators (+ or /) @@ -182,18 +174,31 @@ class BlogView(MultiView): tags.append(tag) if len(tags) <= 0: raise Http404 - + entries = self.blog.entries.all() for tag in tags: entries = entries.filter(tags=tag) if entries.count() <= 0: raise Http404 - pagination = paginate(entries, self.entries_per_page, request.GET.get('page', 1)) - context = {} + return entries, extra_context + + def entry_view(self, request, slug, year=None, month=None, day=None, node=None, extra_context=None): + entries = self.blog.entries.all() + if year: + entries = entries.filter(date__year=year) + if month: + entries = entries.filter(date__month=month) + if day: + entries = entries.filter(date__day=day) + try: + entry = entries.get(slug=slug) + except: + raise Http404 + context = self.get_context() context.update(extra_context or {}) - context.update({'blog': self.blog, 'tags': tags, 'pagination': pagination}) - return self.tag_page.render_to_response(node, request, extra_context=context) + context.update({'entry': entry}) + return self.entry_page.render_to_response(node, request, extra_context=context) def tag_archive_view(self, request, node=None, extra_context=None): if not self.tag_archive_page: