Mercurial > public > sg101
diff news/models.py @ 581:ee87ea74d46b
For Django 1.4, rearranged project structure for new manage.py.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Sat, 05 May 2012 17:10:48 -0500 |
parents | gpp/news/models.py@7854d75427af |
children | 76525f5ac2b1 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/news/models.py Sat May 05 17:10:48 2012 -0500 @@ -0,0 +1,120 @@ +""" +Models for the news application. +""" + +import datetime +from django.db import models +from django.contrib.auth.models import User +from tagging.fields import TagField + + +class Category(models.Model): + """News stories belong to categories""" + title = models.CharField(max_length=64) + slug = models.SlugField(max_length=64) + icon = models.ImageField(upload_to='news/categories/', blank=True) + + def __unicode__(self): + return self.title + + def num_stories(self): + return News.objects.filter(category = self.pk).count() + + class Meta: + verbose_name_plural = 'Categories' + ordering = ('title', ) + + +class StoryBase(models.Model): + """Abstract model to collect common fields.""" + title = models.CharField(max_length=255) + submitter = models.ForeignKey(User) + category = models.ForeignKey(Category) + short_text = models.TextField() + long_text = models.TextField(blank=True) + date_submitted = models.DateTimeField(db_index=True) + allow_comments = models.BooleanField(default=True) + tags = TagField() + front_page_expiration = models.DateField(null=True, blank=True) + update_date = models.DateTimeField(db_index=True, blank=True) + priority = models.IntegerField(db_index=True, default=0, blank=True) + meta_description = models.TextField(blank=True) + + class Meta: + abstract = True + + +class PendingStory(StoryBase): + """Stories submitted by users are held pending admin approval""" + + def save(self, *args, **kwargs): + if not self.pk: + if not self.date_submitted: + self.date_submitted = datetime.datetime.now() + self.update_date = self.date_submitted + else: + self.update_date = datetime.datetime.now() + + super(PendingStory, self).save(*args, **kwargs) + + def __unicode__(self): + return self.title + + class Meta: + ordering = ('-date_submitted', ) + verbose_name_plural = 'Pending Stories' + + +class Story(StoryBase): + """Model for news stories""" + + @models.permalink + def get_absolute_url(self): + return ('news.views.story', [str(self.id)]) + + def __unicode__(self): + return self.title + + class Meta: + ordering = ('-date_submitted', ) + verbose_name = 'news story' + verbose_name_plural = 'news stories' + + def save(self, *args, **kwargs): + if not self.pk: + self.date_submitted = datetime.datetime.now() + self.update_date = self.date_submitted + else: + self.update_date = datetime.datetime.now() + + super(Story, self).save(*args, **kwargs) + + def can_comment_on(self): + now = datetime.datetime.now() + delta = now - self.date_submitted + return self.allow_comments and delta.days < 30 + + def search_title(self): + return self.title + + def search_summary(self): + return u"\n".join((self.short_text, self.long_text)) + + def ogp_tags(self): + """ + Returns a dict of Open Graph Protocol meta tags. + + """ + desc = self.meta_description.strip() + if not desc: + desc = 'News article submitted by %s on %s.' % ( + self.submitter.username, + self.date_submitted.strftime('%B %d, %Y')) + + return { + 'og:title': self.title, + 'og:type': 'article', + 'og:url': self.get_absolute_url(), + 'og:image': self.category.icon.url, + 'og:description': desc, + }