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.urlresolvers import reverse
from django.http import Http404, HttpResponse
from datetime import datetime
from philo.contrib.penfield.utils import paginate
def entry_tags(self):
""" Returns a QuerySet of Tags that are used on any entries in this blog. """
return Tag.objects.filter(blogentries__blog=self).distinct()
+
+ @property
+ def entry_dates(self):
+ dates = {'year': self.entries.dates('date', 'year', order='DESC'), 'month': self.entries.dates('date', 'month', order='DESC'), 'day': self.entries.dates('date', 'day', order='DESC')}
+ return dates
register_value_model(Blog)
def __unicode__(self):
return u'BlogView for %s' % self.blog.title
+ def get_subpath(self, obj):
+ if isinstance(obj, BlogEntry):
+ if obj.blog == self.blog:
+ entry_view_args = {'slug': obj.slug}
+ if self.entry_permalink_style in 'DMY':
+ entry_view_args.update({'year': str(obj.date.year).zfill(4)})
+ if self.entry_permalink_style in 'DM':
+ entry_view_args.update({'month': str(obj.date.month).zfill(2)})
+ if self.entry_permalink_style == 'D':
+ entry_view_args.update({'day': str(obj.date.day).zfill(2)})
+ return reverse(self.entry_view, urlconf=self, kwargs=entry_view_args)
+ elif isinstance(obj, Tag):
+ if obj in self.blog.entry_tags:
+ return reverse(self.tag_view, urlconf=self, kwargs={'tag_slugs': obj.slug})
+ elif isinstance(obj, (str, unicode)):
+ split_obj = obj.split(':')
+ if len(split_obj) > 1:
+ entry_archive_view_args = {}
+ if split_obj[0].lower() == 'archives':
+ entry_archive_view_args.update({'year': str(int(split_obj[1])).zfill(4)})
+ if len(split_obj) > 2:
+ entry_archive_view_args.update({'month': str(int(split_obj[2])).zfill(2)})
+ if len(split_obj) > 3:
+ entry_archive_view_args.update({'day': str(int(split_obj[3])).zfill(2)})
+ return reverse(self.entry_archive_view, urlconf=self, kwargs=entry_archive_view_args)
+ raise ViewCanNotProvideSubpath
+
@property
def urlpatterns(self):
base_patterns = patterns('',
pass
+register_value_model(Newsletter)
+
+
class NewsletterArticle(Entity, Titled):
newsletter = models.ForeignKey(Newsletter, related_name='articles')
authors = models.ManyToManyField(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='newsletterarticles')
unique_together = (('newsletter', 'number'),)
+register_value_model(NewsletterIssue)
+
+
class NewsletterView(MultiView):
ARTICLE_PERMALINK_STYLE_CHOICES = (
('D', 'Year, month, and day'),
article_permalink_base = models.CharField(max_length=255, blank=False, default='articles')
issue_permalink_base = models.CharField(max_length=255, blank=False, default='issues')
+ def get_subpath(self, obj):
+ if isinstance(obj, NewsletterArticle):
+ if obj.newsletter == self.newsletter:
+ article_view_args = {'slug': obj.slug}
+ if self.article_permalink_style in 'DMY':
+ article_view_args.update({'year': str(obj.date.year).zfill(4)})
+ if self.article_permalink_style in 'DM':
+ article_view_args.update({'month': str(obj.date.month).zfill(2)})
+ if self.article_permalink_style == 'D':
+ article_view_args.update({'day': str(obj.date.day).zfill(2)})
+ return reverse(self.article_view, urlconf=self, kwargs=article_view_args)
+ elif isinstance(obj, NewsletterIssue):
+ if obj.newsletter == self.newsletter:
+ return reverse(self.issue_view, urlconf=self, kwargs={'number': str(obj.number)})
+ raise ViewCanNotProvideSubpath
+
@property
def urlpatterns(self):
base_patterns = patterns('',