A => +50 -0
@@ 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)
M twittersync/management/commands/sync_twitter_accounts.py +6 -2
@@ 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)
M +3 -5
@@ 37,22 37,20 @@ class TwitterAccount(models.Model):
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)