946ebaa0aedd48540b2e3438cd15c41393be9ce2
[oweals/karmaworld.git] / karmaworld / apps / notes / tasks.py
1 #!/usr/bin/env python
2 # -*- coding:utf8 -*-
3 # Copyright (C) 2013  FinalsClub Foundation
4
5 import traceback
6 from celery import task
7 from celery.utils.log import get_task_logger
8 from karmaworld.apps.notes.models import Note
9 import twitter
10 import gdshortener
11
12 logger = get_task_logger(__name__)
13
14 @task(name="tweet_note")
15 def tweet_note():
16     """Tweet about a new note."""
17
18     try:
19         import karmaworld.secret.twitter as secrets
20     except ImportError:
21         logger.warn("No twitter secrets found, not running tweet_note")
22         return
23
24     try:
25         api = twitter.Api(consumer_key=secrets.CONSUMER_KEY,
26                           consumer_secret=secrets.CONSUMER_SECRET,
27                           access_token_key=secrets.ACCESS_TOKEN_KEY,
28                           access_token_secret=secrets.ACCESS_TOKEN_SECRET)
29
30         newest_notes = Note.objects.all().order_by('-uploaded_at')[:100]
31         for n in newest_notes:
32             if not n.tweeted:
33                 update = tweet_string(n)
34                 logger.info("Tweeting: " + update)
35
36                 # Mark this tweeted before we actually tweet it
37                 # to be extra safe against double tweets
38                 n.tweeted = True
39                 n.save()
40
41                 api.PostUpdate(tweet_string(n))
42
43                 break
44     except:
45         logger.error(traceback.format_exc())
46
47
48 def tweet_string(note):
49     # This url will use 13 or less characters
50     shortener = gdshortener.ISGDShortener()
51     url = "http://www.karmanotes.org" + \
52         note.get_absolute_url()
53     short_url = shortener.shorten(url)[0]
54
55     # 50 characters
56     short_course = note.course.name[:50]
57
58     # 57 characters
59     short_note = note.name[:57]
60
61     if note.course.school:
62         school = note.course.school
63     else:
64         school = note.course.department.school
65
66     if school.hashtag:
67         return short_url + " #" + school.hashtag + " " + \
68         short_course + ": " + \
69         short_note
70     else:
71         return short_url + " " + \
72             short_course + ": " + \
73             short_note