2
# Copyright 2009-2010 Joshua Roesslein
3
# See LICENSE for details.
5
from tweepy.error import TweepError
6
from tweepy.utils import parse_datetime, parse_html_value, parse_a_href, \
7
parse_search_datetime, unescape_html
10
class ResultSet(list):
11
"""A list like object that holds results from a Twitter API query."""
16
def __init__(self, api=None):
19
def __getstate__(self):
21
pickle = dict(self.__dict__)
23
del pickle['_api'] # do not pickle the API reference
29
def parse(cls, api, json):
30
"""Parse a JSON object into a model instance."""
31
raise NotImplementedError
34
def parse_list(cls, api, json_list):
35
"""Parse a list of JSON objects into a result set of model instances."""
38
results.append(cls.parse(api, obj))
45
def parse(cls, api, json):
47
for k, v in json.items():
49
user = User.parse(api, v)
50
setattr(status, 'author', user)
51
setattr(status, 'user', user) # DEPRECIATED
52
elif k == 'created_at':
53
setattr(status, k, parse_datetime(v))
56
setattr(status, k, parse_html_value(v))
57
setattr(status, 'source_url', parse_a_href(v))
60
setattr(status, 'source_url', None)
61
elif k == 'retweeted_status':
62
setattr(status, k, Status.parse(api, v))
68
return self._api.destroy_status(self.id)
71
return self._api.retweet(self.id)
74
return self._api.retweets(self.id)
77
return self._api.create_favorite(self.id)
83
def parse(cls, api, json):
85
for k, v in json.items():
87
setattr(user, k, parse_datetime(v))
89
setattr(user, k, Status.parse(api, v))
90
elif k == 'following':
91
# twitter sets this to null if it is false
93
setattr(user, k, True)
95
setattr(user, k, False)
101
def parse_list(cls, api, json_list):
102
if isinstance(json_list, list):
103
item_list = json_list
105
item_list = json_list['users']
107
results = ResultSet()
108
for obj in item_list:
109
results.append(cls.parse(api, obj))
112
def timeline(self, **kargs):
113
return self._api.user_timeline(user_id=self.id, **kargs)
115
def friends(self, **kargs):
116
return self._api.friends(user_id=self.id, **kargs)
118
def followers(self, **kargs):
119
return self._api.followers(user_id=self.id, **kargs)
122
self._api.create_friendship(user_id=self.id)
123
self.following = True
126
self._api.destroy_friendship(user_id=self.id)
127
self.following = False
129
def lists_memberships(self, *args, **kargs):
130
return self._api.lists_memberships(user=self.screen_name, *args, **kargs)
132
def lists_subscriptions(self, *args, **kargs):
133
return self._api.lists_subscriptions(user=self.screen_name, *args, **kargs)
135
def lists(self, *args, **kargs):
136
return self._api.lists(user=self.screen_name, *args, **kargs)
138
def followers_ids(self, *args, **kargs):
139
return self._api.followers_ids(user_id=self.id, *args, **kargs)
142
class DirectMessage(Model):
145
def parse(cls, api, json):
147
for k, v in json.items():
148
if k == 'sender' or k == 'recipient':
149
setattr(dm, k, User.parse(api, v))
150
elif k == 'created_at':
151
setattr(dm, k, parse_datetime(v))
157
return self._api.destroy_direct_message(self.id)
160
class Friendship(Model):
163
def parse(cls, api, json):
164
relationship = json['relationship']
168
for k, v in relationship['source'].items():
169
setattr(source, k, v)
173
for k, v in relationship['target'].items():
174
setattr(target, k, v)
176
return source, target
179
class SavedSearch(Model):
182
def parse(cls, api, json):
184
for k, v in json.items():
185
if k == 'created_at':
186
setattr(ss, k, parse_datetime(v))
192
return self._api.destroy_saved_search(self.id)
195
class SearchResult(Model):
198
def parse(cls, api, json):
200
for k, v in json.items():
201
if k == 'created_at':
202
setattr(result, k, parse_search_datetime(v))
204
setattr(result, k, parse_html_value(unescape_html(v)))
206
setattr(result, k, v)
210
def parse_list(cls, api, json_list, result_set=None):
211
results = ResultSet()
212
results.max_id = json_list.get('max_id')
213
results.since_id = json_list.get('since_id')
214
results.refresh_url = json_list.get('refresh_url')
215
results.next_page = json_list.get('next_page')
216
results.results_per_page = json_list.get('results_per_page')
217
results.page = json_list.get('page')
218
results.completed_in = json_list.get('completed_in')
219
results.query = json_list.get('query')
221
for obj in json_list['results']:
222
results.append(cls.parse(api, obj))
229
def parse(cls, api, json):
231
for k,v in json.items():
233
setattr(lst, k, User.parse(api, v))
239
def parse_list(cls, api, json_list, result_set=None):
240
results = ResultSet()
241
for obj in json_list['lists']:
242
results.append(cls.parse(api, obj))
245
def update(self, **kargs):
246
return self._api.update_list(self.slug, **kargs)
249
return self._api.destroy_list(self.slug)
251
def timeline(self, **kargs):
252
return self._api.list_timeline(self.user.screen_name, self.slug, **kargs)
254
def add_member(self, id):
255
return self._api.add_list_member(self.slug, id)
257
def remove_member(self, id):
258
return self._api.remove_list_member(self.slug, id)
260
def members(self, **kargs):
261
return self._api.list_members(self.user.screen_name, self.slug, **kargs)
263
def is_member(self, id):
264
return self._api.is_list_member(self.user.screen_name, self.slug, id)
267
return self._api.subscribe_list(self.user.screen_name, self.slug)
269
def unsubscribe(self):
270
return self._api.unsubscribe_list(self.user.screen_name, self.slug)
272
def subscribers(self, **kargs):
273
return self._api.list_subscribers(self.user.screen_name, self.slug, **kargs)
275
def is_subscribed(self, id):
276
return self._api.is_subscribed_list(self.user.screen_name, self.slug, id)
279
class JSONModel(Model):
282
def parse(cls, api, json):
286
class IDModel(Model):
289
def parse(cls, api, json):
290
if isinstance(json, list):
296
class ModelFactory(object):
298
Used by parsers for creating instances
299
of models. You may subclass this factory
300
to add your own extended models.
305
direct_message = DirectMessage
306
friendship = Friendship
307
saved_search = SavedSearch
308
search_result = SearchResult