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
4 from tagging.fields import TagField
6 from agdj.blog.managers import PublicManager
7 from agdj.utils import cached_property, dictproperty
10 class Entry(models.Model):
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"),
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?",
32 # This is a hack that even I don't understand
33 text_tags = TagField(db_column="tags")
35 objects = models.Manager()
36 public_objects = PublicManager()
39 db_table = u'agus_blog_entry'
40 ordering = ("-pub_date",)
41 verbose_name_plural = u'Entries'
43 def __unicode__(self):
46 def save(self, *args, **kwargs):
47 from django.core.cache import cache
49 # If this is an update, then clear the cache keys.
51 cache_key = "%s.%s.%s(%s)" % (self.__class__.__module__,
52 self.__class__.__name__,
55 cache.delete(cache_key)
57 return super(Entry, self).save(*args, **kwargs)
61 from django.core.urlresolvers import reverse
63 if name == "feed_url":
64 if self.feed_url_scheme == self.DATE_BASED:
67 return reverse("redirect-to-date-url", args=[self.slug])
69 return reverse("view-blog-post",
70 args=[self.pub_date.year,
71 self.pub_date.strftime("%b").lower(),
79 from agdj.markup import markdown
80 return markdown(self.source)
83 def public_comments(self):
84 return self.comments.filter(public=True)
88 return Comment.with_unpublished.filter(
89 public=False, entry=self).count()
92 tagging.register(Entry)
95 class Comment(models.Model):
96 "A comment on a blog entry"
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)
107 # This should be the _default_manager
108 objects = PublicManager()
109 with_unpublished = models.Manager()
112 db_table = u'agus_blog_comment'
113 ordering = ("-pub_date",)
115 def __unicode__(self):
116 return u"Comment %d on '%s'" % (self.id, self.entry)
120 from agdj.markup import markdown_untrusted
121 return markdown_untrusted(self.text)
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.
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)