Added support for tags to Blogs and BlogViews.
[philo.git] / contrib / penfield / models.py
index f014a1d..af19afb 100644 (file)
@@ -1,46 +1,30 @@
 from django.db import models
 from django.db import models
-from philo.models import Entity, MultiView, Template, register_value_model
-from django.contrib.auth.models import User
+from django.conf import settings
+from philo.models import Tag, Titled, Entity, MultiView, Template, register_value_model
 from django.conf.urls.defaults import url, patterns
 from django.http import Http404, HttpResponse
 from django.template import RequestContext
 from datetime import datetime
 
 
 from django.conf.urls.defaults import url, patterns
 from django.http import Http404, HttpResponse
 from django.template import RequestContext
 from datetime import datetime
 
 
-class Tag(models.Model):
-       name = models.CharField(max_length=250)
-       slug = models.SlugField()
-       
-       def __unicode__(self):
-               return self.name
-
-
-class Titled(models.Model):
-       title = models.CharField(max_length=255)
-       slug = models.SlugField()
-       
-       def __unicode__(self):
-               return self.title
-       
-       class Meta:
-               abstract = True
-
-
 class Blog(Entity, Titled):
 class Blog(Entity, Titled):
-       pass
+       @property
+       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)
 
 
 class BlogEntry(Entity, Titled):
        blog = models.ForeignKey(Blog, related_name='entries')
 
 
 class BlogEntry(Entity, Titled):
        blog = models.ForeignKey(Blog, related_name='entries')
-       author = models.ForeignKey(User, related_name='blogentries')
+       author = models.ForeignKey(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='blogentries')
        date = models.DateTimeField(default=datetime.now)
        content = models.TextField()
        excerpt = models.TextField()
        date = models.DateTimeField(default=datetime.now)
        content = models.TextField()
        excerpt = models.TextField()
-       tags = models.ManyToManyField(Tag)
+       tags = models.ManyToManyField(Tag, related_name='blogentries')
        
        class Meta:
                ordering = ['-date']
        
        class Meta:
                ordering = ['-date']
-               verbose_name_plural = "Blog Entries"
+               verbose_name_plural = "blog entries"
 
 
 register_value_model(BlogEntry)
 
 
 register_value_model(BlogEntry)
@@ -55,7 +39,7 @@ class BlogView(MultiView):
                ('N', 'No base')
        )
        
                ('N', 'No base')
        )
        
-       blog = models.ForeignKey(Blog, related_name='nodes')
+       blog = models.ForeignKey(Blog, related_name='blogviews')
        
        index_template = models.ForeignKey(Template, related_name='blog_index_related')
        archive_template = models.ForeignKey(Template, related_name='blog_archive_related')
        
        index_template = models.ForeignKey(Template, related_name='blog_index_related')
        archive_template = models.ForeignKey(Template, related_name='blog_archive_related')
@@ -103,8 +87,7 @@ class BlogView(MultiView):
                return base_patterns + entry_patterns
        
        def index_view(self, request):
                return base_patterns + entry_patterns
        
        def index_view(self, request):
-               entries = self.blog.entries.order_by('-date')
-               return HttpResponse(self.index_template.django_template.render(RequestContext(request, {'blog': self.blog, 'entries': entries})), mimetype=self.index_template.mimetype)
+               return HttpResponse(self.index_template.django_template.render(RequestContext(request, {'blog': self.blog})), mimetype=self.index_template.mimetype)
        
        def archive_view(self, request, year=None, month=None, day=None):
                entries = self.blog.entries.all()
        
        def archive_view(self, request, year=None, month=None, day=None):
                entries = self.blog.entries.all()
@@ -117,8 +100,8 @@ class BlogView(MultiView):
                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)
        
        def tag_view(self, request, tag=None):
                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)
        
        def tag_view(self, request, tag=None):
-               # return HttpResponse(self.tag_template.django_template.render(RequestContext(request, {'blog': self.blog, 'tag': tag, 'entries': None})), mimetype=self.tag_template.mimetype)
-               raise Http404
+               entries = self.blog.entries.filter(tags__slug=tag)
+               return HttpResponse(self.tag_template.django_template.render(RequestContext(request, {'blog': self.blog, 'tag': tag, 'entries': entries})), mimetype=self.tag_template.mimetype)
        
        def entry_view(self, request, slug, year=None, month=None, day=None):
                entries = self.blog.entries.all()
        
        def entry_view(self, request, slug, year=None, month=None, day=None):
                entries = self.blog.entries.all()
@@ -139,12 +122,59 @@ class Newsletter(Entity, Titled):
        pass
 
 
        pass
 
 
-class NewsStory(Entity, Titled):
-       newsletter = models.ForeignKey(Newsletter, related_name='stories')
-       authors = models.ManyToManyField(User, related_name='newsstories')
+class NewsletterArticle(Entity, Titled):
+       newsletter = models.ForeignKey(Newsletter, related_name='articles')
+       authors = models.ManyToManyField(getattr(settings, 'PHILO_PERSON_MODULE', 'auth.User'), related_name='newsletterarticles')
        date = models.DateTimeField(default=datetime.now)
        lede = models.TextField(null=True, blank=True)
        full_text = models.TextField()
 
 
        date = models.DateTimeField(default=datetime.now)
        lede = models.TextField(null=True, blank=True)
        full_text = models.TextField()
 
 
-register_value_model(NewsStory)
\ No newline at end of file
+register_value_model(NewsletterArticle)
+
+
+class NewsletterIssue(Entity, Titled):
+       newsletter = models.ForeignKey(Newsletter, related_name='issues')
+       number = models.PositiveIntegerField()
+       articles = models.ManyToManyField(NewsletterArticle)
+
+
+class NewsletterView(MultiView):
+       newsletter = models.ForeignKey(Newsletter, related_name='newsletterviews')
+       
+       index_template = models.ForeignKey(Template, related_name='newsletter_index_related')
+       article_template = models.ForeignKey(Template, related_name='newsletter_article_related')
+       issue_template = models.ForeignKey(Template, related_name='newsletter_issue_related')
+       
+       @property
+       def urlpatterns(self):
+               base_patterns = patterns('',
+                       url(r'^$', self.index_view),
+                       url(r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/(?P<slug>[-\w]+)/?', self.article_view),
+                       url(r'^issues/(?P<number>\d+)/?', self.issue_view),
+               )
+               return base_patterns
+       
+       def index_view(self, request):
+               return HttpResponse(self.index_template.django_template.render(RequestContext(request, {'newsletter': self.newsletter})), mimetype=self.index_template.mimetype)
+       
+       def article_view(self, request, slug, year=None, month=None, day=None):
+               articles = self.newsletter.articles.all()
+               if year:
+                       articles = articles.filter(date__year=year)
+               if month:
+                       articles = articles.filter(date__month=month)
+               if day:
+                       articles = articles.filter(date__day=day)
+               try:
+                       article = articles.get(slug=slug)
+               except:
+                       raise Http404
+               return HttpResponse(self.article_template.django_template.render(RequestContext(request, {'newsletter': self.newsletter, 'article': article})), mimetype=self.article_template.mimetype)
+       
+       def issue_view(self, request, number):
+               try:
+                       issue = self.newsletter.issues.get(number=number)
+               except:
+                       raise Http404
+               return HttpResponse(self.issue_template.django_template.render(RequestContext(request, {'newsletter': self.newsletter, 'issue': issue})), mimetype=self.issue_template.mimetype)
\ No newline at end of file