New, improved, even more conspicuous consumption
By Ben Welsh •
This morning I added Readernaut support, with the latest books I post syncing and republishing here.
The system works almost identically to the other services, with a slightly different database structure. The Book model in my Django system inherits from an abstract model that is common to all of the third-party data like Flickr and Twitter. That helps simplify the code and ensure a baseline consistency so that I can reliably expect each data set to slot into the sitewide ticker.
Here's a taste. You can find the whole codebase on github.
class ThirdPartyBaseModel(models.Model): """ A base model for the data we'll be pulling from third-party sites. """ url = models.URLField(max_length=1000) pub_date = models.DateTimeField(default=datetime.datetime.now, verbose_name=_('publication date')) tags = TagField(help_text=_('Separate tags with spaces.'), max_length=1000) objects = models.Manager() sync = SyncManager() class Meta: ordering = ('-pub_date',) abstract = True def get_rendered_html(self): template_name = 'coltrane/ticker_item_%s.html' % (self.__class__.__name__.lower()) return render_to_string(template_name, { 'object': self }) def get_absolute_icon(self): name = u'%ss' % self.__class__.__name__.lower() return u'/media/icons/%s.gif' % name def get_tag_list(self, last_word='and'): return get_text_list(self.tags.split(' '), last_word) tag_list = property(get_tag_list) class Book(ThirdPartyBaseModel): """ Books I've read. """ isbn = models.CharField(max_length=20, unique=True) title = models.CharField(max_length=250) authors = models.CharField(max_length=250, blank=True, null=True) def __unicode__(self): if self.authors: return "%s by %s" % (self.title, self.authors) else: return self.title class Shout(ThirdPartyBaseModel): """ Shorter things I blast out. """ message = models.TextField(max_length=140) def __unicode__(self): return self.message def get_short_message(self, words=8): """ Trims message to the specified number of words. Good for use in the admin. """ return truncate_words(strip_tags(self.message), words) short_message = property(get_short_message)