40cea7f3f33b — Peter Sanchez 13 years ago
Added helpers and updated sync_twitter_accounts command
A => twittersync/helpers.py +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 twittersync/models.py +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)