# HG changeset patch # User Peter Sanchez # Date 1289265116 28800 # Mon Nov 08 17:11:56 2010 -0800 # Node ID 40cea7f3f33bf110c4cf1d300cd17ab4ecd90cb7 # Parent aa83eb68130b843d0396575f9e7a5c47cfc94c2e Added helpers and updated sync_twitter_accounts command diff --git a/twittersync/helpers.py b/twittersync/helpers.py new file mode 100644 --- /dev/null +++ b/twittersync/helpers.py @@ -0,0 +1,50 @@ +import urllib2 +import datetime +from django.conf import settings +from django.http import QueryDict +from dateutil.parser import parse +from twittersync.models import TwitterAccount, TwitterStatus + +# Switch to AnyJson? +try: + import json +except ImportError: + try: + import simplejson as json + except ImportError: + from django.utils import simplejson as json + + +def build_url(account, qdict): + return 'http://api.twitter.com/1/statuses/user_timeline.json?%s' % \ + qdict.urlencode() + + +def save_status_update(account, result): + return TwitterStatus.objects.get_or_create( + status_id=result['id_str'], + author=account, + content=result['text'], + created_date=parse(result['created_at']), + ) + + +def sync_twitter_account(account): + qdict = QueryDict('', mutable=True) + opener = urllib2.build_opener() + opener.addheaders = [('User-agent', 'django-twittersync/0.1')] + qdict['screen_name'] = account.screen_name + qdict['trim_user'] = 'true' + + # If previous updates exist, only get newer tweets + try: + latest = account.tweets.latest() + qdict['since_id'] = latest.status_id + except TwitterStatus.DoesNotExist: + pass + + url = self.build_url(qdict) + res = opener.open(url) + results = json.load(res) + for result in results: + save_status_update(result) diff --git a/twittersync/management/commands/sync_twitter_accounts.py b/twittersync/management/commands/sync_twitter_accounts.py --- a/twittersync/management/commands/sync_twitter_accounts.py +++ b/twittersync/management/commands/sync_twitter_accounts.py @@ -1,11 +1,15 @@ import urllib2 import datetime from django.conf import settings +from django.http import QueryDict from django.core.management.base import NoArgsCommand +from twittersync.models import TwitterAccount +from twittersync.helpers import sync_twitter_account class Command(NoArgsCommand): - help = 'Sync\'s all active Twitter account streams.' + help = 'Sync all active Twitter account streams.' def handle_noargs(self, **options): - pass + for account in TwitterAccount.objects.filter(is_active=True): + self.sync_twitter_account(account) diff --git a/twittersync/models.py b/twittersync/models.py --- a/twittersync/models.py +++ b/twittersync/models.py @@ -37,22 +37,20 @@ class TwitterStatus(models.Model): status_id = models.CharField(max_length=50) - author = models.ForeignKey(TwitterAccount) - author_url = models.URLField(verify_exists=False) - author_image = models.URLField(verify_exists=False, blank=True) + author = models.ForeignKey(TwitterAccount, related_name='tweets') content = models.CharField(max_length=255) - url = models.URLField(verify_exists=False) created_date = models.DateTimeField() date = models.DateTimeField(default=datetime.datetime.now) class Meta: + get_latest_by = 'created_date' ordering = ('id',) def __unicode__(self): return u'%i' % self.id @property - def status_url(self): + def url(self): return u'http://twitter.com/%s/statuses/%s' % ( self.author.screen_name, self.status_id)