This repository has been archived by the owner on Mar 16, 2020. It is now read-only.
/
models.py
103 lines (82 loc) · 2.69 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import re
import datetime
from bson.objectid import ObjectId
from mongolite import Connection, Document
connection = Connection()
class BaseDocument(Document):
skeleton = {
'modify_date': datetime.datetime
}
default_values = {'modify_date': datetime.datetime.utcnow}
def save(self, *args, **kwargs):
if '_id' in self and kwargs.get('update_modify_date', True):
m = datetime.datetime.utcnow()
self['modify_date'] = m
super(BaseDocument, self).save(*args, **kwargs)
@connection.register
class User(BaseDocument):
__collection__ = 'users'
skeleton = {
'username': unicode,
'access_token': dict,
'modify_date': datetime.datetime
}
optional = {
'user_id': int,
}
@connection.register
class Tweeter(BaseDocument):
__collection__ = 'tweeters'
skeleton = {
'user_id': int,
'username': unicode,
'name': unicode,
'followers': int,
'following': int,
'ratio': float,
'last_tweet_date': datetime.datetime,
}
optional = {
'ratio_rank': int,
}
def set_ratio(self):
self['ratio'] = 1.0 * self['followers'] / max(self['following'], 1)
@staticmethod
def find_by_username(db, username):
tweeter = db.Tweeter.find_one({'username': username})
if not tweeter:
tweeter = db.Tweeter.find_one({'username': re.compile(re.escape(username), re.I)})
return tweeter
@staticmethod
def update_tweeter(tweeter, user):
if tweeter['name'] != user['name']:
tweeter['name'] = user['name']
if tweeter['username'] != user['screen_name']:
tweeter['username'] = user['screen_name']
if tweeter['followers'] != user['followers_count']:
tweeter['followers'] = user['followers_count']
if tweeter['following'] != user['friends_count']:
tweeter['following'] = user['friends_count']
def parse_status_date(dstr):
dstr = re.sub('\+\d{1,4}', '', dstr)
return datetime.datetime.strptime(
dstr,
'%a %b %d %H:%M:%S %Y'
)
last_tweet_date = None
if 'status' in user:
last_tweet_date = user['status']['created_at']
last_tweet_date = parse_status_date(last_tweet_date)
if tweeter['last_tweet_date'] != last_tweet_date:
tweeter['last_tweet_date'] = last_tweet_date
ratio_before = tweeter['ratio']
tweeter.set_ratio()
tweeter.save()
@connection.register
class Following(BaseDocument):
__collection__ = 'following'
skeleton = {
'user': unicode,
'follows': unicode,
'following': bool,
}