agdj/blog/models.py
author Adam Gomaa <code@adam.gomaa.us>
Sun Feb 01 01:35:02 2009 -0500
changeset 416 5a586a8c2f8f
parent 388 2c8b20b9e628
child 451 88b49087ec1a
permissions -rw-r--r--
Switch to date-based URLs everywhere except the feed URLs of old posts, so I don't spam everyone's feedreader.
     1 from django.db import models
     2 
     3 import tagging
     4 from tagging.fields import TagField
     5 
     6 from agdj.blog.managers import PublicManager
     7 from agdj.utils import cached_property, dictproperty
     8 
     9 
    10 class Entry(models.Model):
    11     "A blog entry"
    12 
    13     id = models.AutoField(primary_key=True)
    14     title = models.CharField(max_length=64)
    15     source = models.TextField()
    16     description = models.TextField()
    17     pub_date = models.DateTimeField(auto_now_add=True)
    18     slug = models.CharField(max_length=64, unique=True)
    19     public = models.BooleanField()
    20     SLUG_ONLY = "slug-only"
    21     DATE_BASED = "date-based"
    22     URL_SCHEME_CHOICES = (
    23         (SLUG_ONLY, "Slug Only"),
    24         (DATE_BASED, "Date-based"),
    25         )
    26     feed_url_scheme = models.CharField(
    27         max_length=64, choices=URL_SCHEME_CHOICES,
    28         help_text="Does this post use the new date-based URL or the old "
    29         "slug-based one in feed URLs and GUIDs?",
    30         default=DATE_BASED)
    31 
    32     # This is a hack that even I don't understand
    33     text_tags = TagField(db_column="tags")
    34 
    35     objects = models.Manager()
    36     public_objects = PublicManager()
    37 
    38     class Meta:
    39         db_table = u'agus_blog_entry'
    40         ordering = ("-pub_date",)
    41         verbose_name_plural = u'Entries'
    42 
    43     def __unicode__(self):
    44         return self.title
    45 
    46     def save(self, *args, **kwargs):
    47         from django.core.cache import cache
    48 
    49         # If this is an update, then clear the cache keys.
    50         if self.pk:
    51             cache_key = "%s.%s.%s(%s)" % (self.__class__.__module__,
    52                                           self.__class__.__name__,
    53                                           "rendered",
    54                                           self.pk)
    55             cache.delete(cache_key)
    56 
    57         return super(Entry, self).save(*args, **kwargs)
    58 
    59     @dictproperty
    60     def urls(self, name):
    61         from django.core.urlresolvers import reverse
    62 
    63         if name == "feed_url":
    64             if self.feed_url_scheme == self.DATE_BASED:
    65                 return self.urls.view
    66             else:
    67                 return reverse("redirect-to-date-url", args=[self.slug])
    68         elif name == "view":
    69                 return reverse("view-blog-post",
    70                                args=[self.pub_date.year,
    71                                      self.pub_date.strftime("%b").lower(),
    72                                      self.pub_date.day,
    73                                      self.slug])
    74 
    75 
    76 
    77     @cached_property
    78     def rendered(self):
    79         from agdj.markup import markdown
    80         return markdown(self.source)
    81 
    82     @property
    83     def public_comments(self):
    84         return self.comments.filter(public=True)
    85 
    86     @property
    87     def spam_count(self):
    88         return Comment.with_unpublished.filter(
    89             public=False, entry=self).count()
    90 
    91 
    92 tagging.register(Entry)
    93 
    94 
    95 class Comment(models.Model):
    96     "A comment on a blog entry"
    97 
    98     id = models.AutoField(primary_key=True)
    99     ip = models.TextField(blank=True)
   100     name = models.CharField(max_length=64, blank=True)
   101     url = models.CharField(max_length=128, blank=True)
   102     public = models.BooleanField(default=False)
   103     entry = models.ForeignKey(Entry, related_name="comments", db_column="agus_blog_entry_entry_id")
   104     pub_date = models.DateTimeField(auto_now_add=True)
   105     text = models.TextField(blank=True)
   106 
   107     # This should be the _default_manager
   108     objects = PublicManager()
   109     with_unpublished = models.Manager()
   110 
   111     class Meta:
   112         db_table = u'agus_blog_comment'
   113         ordering = ("-pub_date",)
   114 
   115     def __unicode__(self):
   116         return u"Comment %d on '%s'" % (self.id, self.entry)
   117 
   118     @property
   119     def rendered(self):
   120         from agdj.markup import markdown_untrusted
   121         return markdown_untrusted(self.text)
   122 
   123     def save(self, *args, **kwargs):
   124         # I'm not sure why - maybe because the database was originally
   125         # created by SQLAlchemy and not syncdb - but the AutoField
   126         # doesn't really work.
   127         if self.id is None:
   128             from django.db import connection
   129             cursor = connection.cursor()
   130             cursor.execute("select nextval('agus_blog_comment_id_seq');")
   131             self.id = cursor.fetchone()[0]
   132         super(self.__class__, self).save(*args, **kwargs)
   133