| author | Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com> |
| Mon, 19 Dec 2011 12:37:41 +0100 | |
| changeset 446 | 844938e45fc7 |
| parent 443 | 6562ec5e6139 |
| child 451 | c223cae8db5b |
| permissions | -rwxr-xr-x |
|
404
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
2 |
# -*- coding: utf-8 -*- |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
3 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
4 |
from gevent import monkey; monkey.patch_all() |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
5 |
# Importer d'abord, sinon exception |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
6 |
import anyjson, gevent, psycopg2 |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
7 |
from sqlalchemy import (Boolean, Column, BigInteger, Integer, String, |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
8 |
ForeignKey, DateTime, create_engine, asc, func) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
9 |
from sqlalchemy.orm import backref, relationship, sessionmaker, joinedload |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
10 |
from sqlalchemy.ext.declarative import declarative_base |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
11 |
from gevent.pywsgi import WSGIServer |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
12 |
from urlparse import parse_qs |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
13 |
import datetime |
|
405
6626b728b142
Added configuration file to Tweetcast Gevent Server
Raphael Velt <raph.velt@gmail.com>
parents:
404
diff
changeset
|
14 |
from server_setup import SQL_CONNECT, WEB_PORT |
|
404
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
15 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
16 |
Base = declarative_base() |
|
405
6626b728b142
Added configuration file to Tweetcast Gevent Server
Raphael Velt <raph.velt@gmail.com>
parents:
404
diff
changeset
|
17 |
engine = create_engine(SQL_CONNECT) |
|
404
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
18 |
Session = sessionmaker(bind=engine) |
| 438 | 19 |
data = [] |
20 |
lastid = 0L |
|
|
404
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
21 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
22 |
class TweetSource(Base): |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
23 |
__tablename__ = 'tweet_tweet_source' |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
24 |
id = Column(Integer, primary_key=True, autoincrement=True) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
25 |
original_json = Column(String) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
26 |
received_at = Column(DateTime, default=datetime.datetime.utcnow, index=True) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
27 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
28 |
class Tweet(Base): |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
29 |
__tablename__ = 'tweet_tweet' |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
30 |
id = Column(BigInteger, primary_key=True, autoincrement=False) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
31 |
tweet_source_id = Column(Integer, ForeignKey('tweet_tweet_source.id')) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
32 |
tweet_source = relationship("TweetSource", backref="tweet") |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
33 |
def jsondict(self): |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
34 |
tweetdict = anyjson.deserialize(self.tweet_source.original_json) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
35 |
keys_to_delete = [ |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
36 |
'in_reply_to_screen_name', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
37 |
'in_reply_to_user_id', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
38 |
'retweeted', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
39 |
'place', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
40 |
'geo', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
41 |
'source', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
42 |
'contributors', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
43 |
'coordinates', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
44 |
'retweet_count', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
45 |
'favorited', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
46 |
'truncated', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
47 |
'possibly_sensitive' |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
48 |
] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
49 |
user_keys_to_delete = [ |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
50 |
'default_profile_image', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
51 |
'show_all_inline_media', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
52 |
'contributors_enabled', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
53 |
'profile_sidebar_fill_color', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
54 |
'created_at', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
55 |
'lang', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
56 |
'time_zone', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
57 |
'profile_sidebar_border_color', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
58 |
'follow_request_sent', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
59 |
'profile_background_image_url', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
60 |
'profile_background_image_url_https', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
61 |
'followers_count', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
62 |
'description', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
63 |
'url', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
64 |
'geo_enabled', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
65 |
'profile_use_background_image', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
66 |
'default_profile', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
67 |
'following', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
68 |
'profile_text_color', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
69 |
'is_translator', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
70 |
'favourites_count', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
71 |
'listed_count', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
72 |
'friends_count', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
73 |
'profile_link_color', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
74 |
'protected', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
75 |
'location', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
76 |
'notifications', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
77 |
'profile_image_url_https', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
78 |
'statuses_count', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
79 |
'verified', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
80 |
'profile_background_color', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
81 |
'profile_background_tile', |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
82 |
'utc_offset' |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
83 |
] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
84 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
85 |
def textids(dictionary): |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
86 |
idfields = [key for key in dictionary if key[-2:] == 'id'] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
87 |
for key in idfields: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
88 |
keystr = key + '_str' |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
89 |
if keystr in dictionary: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
90 |
dictionary[key] = dictionary[keystr] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
91 |
del dictionary[keystr] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
92 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
93 |
for key in keys_to_delete: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
94 |
if key in tweetdict: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
95 |
del tweetdict[key] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
96 |
for key in user_keys_to_delete: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
97 |
if key in tweetdict['user']: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
98 |
del tweetdict['user'][key] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
99 |
textids(tweetdict) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
100 |
textids(tweetdict['user']) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
101 |
if 'retweeted_status' in tweetdict: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
102 |
for key in keys_to_delete: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
103 |
if key in tweetdict['retweeted_status']: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
104 |
del tweetdict['retweeted_status'][key] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
105 |
for key in user_keys_to_delete: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
106 |
if key in tweetdict['retweeted_status']['user']: |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
107 |
del tweetdict['retweeted_status']['user'][key] |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
108 |
textids(tweetdict['retweeted_status']) |
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
109 |
return tweetdict |
| 438 | 110 |
|
111 |
def refresh(): |
|
| 443 | 112 |
global lastid, data |
| 438 | 113 |
print "refreshing" |
114 |
query = session.query(Tweet).order_by(asc(Tweet.id)).options(joinedload(Tweet.tweet_source)).filter(Tweet.id > lastid) |
|
115 |
for tweet in query: |
|
| 442 | 116 |
lastid = tweet.id |
| 438 | 117 |
data.append(anyjson.serialize(tweet.jsondict())) |
118 |
gevent.sleep(2.) |
|
119 |
gevent.spawn(refresh) |
|
120 |
||
121 |
def wsstart(): |
|
122 |
global WEB_PORT |
|
123 |
WSGIServer(('', WEB_PORT), webserver).serve_forever() |
|
|
404
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
124 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
125 |
def webserver(env, start_response): |
|
446
844938e45fc7
correct global
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
443
diff
changeset
|
126 |
global data |
| 438 | 127 |
if env['PATH_INFO'] == '/': |
128 |
httpquery = parse_qs(env['QUERY_STRING']) |
|
129 |
print "serving tweets to", env['REMOTE_ADDR'], httpquery |
|
130 |
frompos = 0 |
|
131 |
if "from" in httpquery: |
|
132 |
frompos = int(httpquery["from"][0]) |
|
133 |
result = '%s{"tweets" : [ %s ] }%s'%( |
|
134 |
"%s("%httpquery["callback"][0] if "callback" in httpquery else "", |
|
135 |
",".join(data[frompos:]), |
|
136 |
")" if "callback" in httpquery else "" |
|
137 |
) |
|
138 |
print "Sending response" |
|
139 |
start_response('200 OK', [('Content-Type', 'application/javascript' if "callback" in httpquery else 'application/json' )]) |
|
140 |
return [result] |
|
141 |
else: |
|
142 |
start_response('404 Not Found', [('Content-Type', 'text/html')]) |
|
143 |
return ['<h1>Not Found</h1>'] |
|
|
404
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
144 |
|
|
89968844eb7d
Tweetcast: heavy refactoring !
Raphael Velt <raph.velt@gmail.com>
parents:
diff
changeset
|
145 |
session = Session() |
|
425
b346fd32fc34
prepare for publication, add sync info
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
405
diff
changeset
|
146 |
|
|
b346fd32fc34
prepare for publication, add sync info
Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com>
parents:
405
diff
changeset
|
147 |
if __name__ == "__main__": |
| 438 | 148 |
gevent.spawn(refresh) |
149 |
print "Starting Webserver" |
|
150 |
wsstart() |