New, improved, even more conspicuous consumption

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 ' %s s' % 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 )