~saurabhanandiit/gtg/exportFixed

« back to all changes in this revision

Viewing changes to GTG/backends/tweepy/models.py

Merge of my work on liblarch newbase and all the backends ported to liblarch
(which mainly means porting the datastore).
One failing test, will check it.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Tweepy
 
2
# Copyright 2009-2010 Joshua Roesslein
 
3
# See LICENSE for details.
 
4
 
 
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
 
8
 
 
9
 
 
10
class ResultSet(list):
 
11
    """A list like object that holds results from a Twitter API query."""
 
12
 
 
13
 
 
14
class Model(object):
 
15
 
 
16
    def __init__(self, api=None):
 
17
        self._api = api
 
18
 
 
19
    def __getstate__(self):
 
20
        # pickle
 
21
        pickle = dict(self.__dict__)
 
22
        try:
 
23
            del pickle['_api']  # do not pickle the API reference
 
24
        except KeyError:
 
25
            pass
 
26
        return pickle
 
27
 
 
28
    @classmethod
 
29
    def parse(cls, api, json):
 
30
        """Parse a JSON object into a model instance."""
 
31
        raise NotImplementedError
 
32
 
 
33
    @classmethod
 
34
    def parse_list(cls, api, json_list):
 
35
        """Parse a list of JSON objects into a result set of model instances."""
 
36
        results = ResultSet()
 
37
        for obj in json_list:
 
38
            results.append(cls.parse(api, obj))
 
39
        return results
 
40
 
 
41
 
 
42
class Status(Model):
 
43
 
 
44
    @classmethod
 
45
    def parse(cls, api, json):
 
46
        status = cls(api)
 
47
        for k, v in json.items():
 
48
            if k == 'user':
 
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))
 
54
            elif k == 'source':
 
55
                if '<' in v:
 
56
                    setattr(status, k, parse_html_value(v))
 
57
                    setattr(status, 'source_url', parse_a_href(v))
 
58
                else:
 
59
                    setattr(status, k, v)
 
60
                    setattr(status, 'source_url', None)
 
61
            elif k == 'retweeted_status':
 
62
                setattr(status, k, Status.parse(api, v))
 
63
            else:
 
64
                setattr(status, k, v)
 
65
        return status
 
66
 
 
67
    def destroy(self):
 
68
        return self._api.destroy_status(self.id)
 
69
 
 
70
    def retweet(self):
 
71
        return self._api.retweet(self.id)
 
72
 
 
73
    def retweets(self):
 
74
        return self._api.retweets(self.id)
 
75
 
 
76
    def favorite(self):
 
77
        return self._api.create_favorite(self.id)
 
78
 
 
79
 
 
80
class User(Model):
 
81
 
 
82
    @classmethod
 
83
    def parse(cls, api, json):
 
84
        user = cls(api)
 
85
        for k, v in json.items():
 
86
            if k == 'created_at':
 
87
                setattr(user, k, parse_datetime(v))
 
88
            elif k == 'status':
 
89
                setattr(user, k, Status.parse(api, v))
 
90
            elif k == 'following':
 
91
                # twitter sets this to null if it is false
 
92
                if v is True:
 
93
                    setattr(user, k, True)
 
94
                else:
 
95
                    setattr(user, k, False)
 
96
            else:
 
97
                setattr(user, k, v)
 
98
        return user
 
99
 
 
100
    @classmethod
 
101
    def parse_list(cls, api, json_list):
 
102
        if isinstance(json_list, list):
 
103
            item_list = json_list
 
104
        else:
 
105
            item_list = json_list['users']
 
106
 
 
107
        results = ResultSet()
 
108
        for obj in item_list:
 
109
            results.append(cls.parse(api, obj))
 
110
        return results
 
111
 
 
112
    def timeline(self, **kargs):
 
113
        return self._api.user_timeline(user_id=self.id, **kargs)
 
114
 
 
115
    def friends(self, **kargs):
 
116
        return self._api.friends(user_id=self.id, **kargs)
 
117
 
 
118
    def followers(self, **kargs):
 
119
        return self._api.followers(user_id=self.id, **kargs)
 
120
 
 
121
    def follow(self):
 
122
        self._api.create_friendship(user_id=self.id)
 
123
        self.following = True
 
124
 
 
125
    def unfollow(self):
 
126
        self._api.destroy_friendship(user_id=self.id)
 
127
        self.following = False
 
128
 
 
129
    def lists_memberships(self, *args, **kargs):
 
130
        return self._api.lists_memberships(user=self.screen_name, *args, **kargs)
 
131
 
 
132
    def lists_subscriptions(self, *args, **kargs):
 
133
        return self._api.lists_subscriptions(user=self.screen_name, *args, **kargs)
 
134
 
 
135
    def lists(self, *args, **kargs):
 
136
        return self._api.lists(user=self.screen_name, *args, **kargs)
 
137
 
 
138
    def followers_ids(self, *args, **kargs):
 
139
        return self._api.followers_ids(user_id=self.id, *args, **kargs)
 
140
 
 
141
 
 
142
class DirectMessage(Model):
 
143
 
 
144
    @classmethod
 
145
    def parse(cls, api, json):
 
146
        dm = cls(api)
 
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))
 
152
            else:
 
153
                setattr(dm, k, v)
 
154
        return dm
 
155
 
 
156
    def destroy(self):
 
157
        return self._api.destroy_direct_message(self.id)
 
158
 
 
159
 
 
160
class Friendship(Model):
 
161
 
 
162
    @classmethod
 
163
    def parse(cls, api, json):
 
164
        relationship = json['relationship']
 
165
 
 
166
        # parse source
 
167
        source = cls(api)
 
168
        for k, v in relationship['source'].items():
 
169
            setattr(source, k, v)
 
170
 
 
171
        # parse target
 
172
        target = cls(api)
 
173
        for k, v in relationship['target'].items():
 
174
            setattr(target, k, v)
 
175
 
 
176
        return source, target
 
177
 
 
178
 
 
179
class SavedSearch(Model):
 
180
 
 
181
    @classmethod
 
182
    def parse(cls, api, json):
 
183
        ss = cls(api)
 
184
        for k, v in json.items():
 
185
            if k == 'created_at':
 
186
                setattr(ss, k, parse_datetime(v))
 
187
            else:
 
188
                setattr(ss, k, v)
 
189
        return ss
 
190
 
 
191
    def destroy(self):
 
192
        return self._api.destroy_saved_search(self.id)
 
193
 
 
194
 
 
195
class SearchResult(Model):
 
196
 
 
197
    @classmethod
 
198
    def parse(cls, api, json):
 
199
        result = cls()
 
200
        for k, v in json.items():
 
201
            if k == 'created_at':
 
202
                setattr(result, k, parse_search_datetime(v))
 
203
            elif k == 'source':
 
204
                setattr(result, k, parse_html_value(unescape_html(v)))
 
205
            else:
 
206
                setattr(result, k, v)
 
207
        return result
 
208
 
 
209
    @classmethod
 
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')
 
220
 
 
221
        for obj in json_list['results']:
 
222
            results.append(cls.parse(api, obj))
 
223
        return results
 
224
 
 
225
 
 
226
class List(Model):
 
227
 
 
228
    @classmethod
 
229
    def parse(cls, api, json):
 
230
        lst = List(api)
 
231
        for k,v in json.items():
 
232
            if k == 'user':
 
233
                setattr(lst, k, User.parse(api, v))
 
234
            else:
 
235
                setattr(lst, k, v)
 
236
        return lst
 
237
 
 
238
    @classmethod
 
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))
 
243
        return results
 
244
 
 
245
    def update(self, **kargs):
 
246
        return self._api.update_list(self.slug, **kargs)
 
247
 
 
248
    def destroy(self):
 
249
        return self._api.destroy_list(self.slug)
 
250
 
 
251
    def timeline(self, **kargs):
 
252
        return self._api.list_timeline(self.user.screen_name, self.slug, **kargs)
 
253
 
 
254
    def add_member(self, id):
 
255
        return self._api.add_list_member(self.slug, id)
 
256
 
 
257
    def remove_member(self, id):
 
258
        return self._api.remove_list_member(self.slug, id)
 
259
 
 
260
    def members(self, **kargs):
 
261
        return self._api.list_members(self.user.screen_name, self.slug, **kargs)
 
262
 
 
263
    def is_member(self, id):
 
264
        return self._api.is_list_member(self.user.screen_name, self.slug, id)
 
265
 
 
266
    def subscribe(self):
 
267
        return self._api.subscribe_list(self.user.screen_name, self.slug)
 
268
 
 
269
    def unsubscribe(self):
 
270
        return self._api.unsubscribe_list(self.user.screen_name, self.slug)
 
271
 
 
272
    def subscribers(self, **kargs):
 
273
        return self._api.list_subscribers(self.user.screen_name, self.slug, **kargs)
 
274
 
 
275
    def is_subscribed(self, id):
 
276
        return self._api.is_subscribed_list(self.user.screen_name, self.slug, id)
 
277
 
 
278
 
 
279
class JSONModel(Model):
 
280
 
 
281
    @classmethod
 
282
    def parse(cls, api, json):
 
283
        return json
 
284
 
 
285
 
 
286
class IDModel(Model):
 
287
 
 
288
    @classmethod
 
289
    def parse(cls, api, json):
 
290
        if isinstance(json, list):
 
291
            return json
 
292
        else:
 
293
            return json['ids']
 
294
 
 
295
 
 
296
class ModelFactory(object):
 
297
    """
 
298
    Used by parsers for creating instances
 
299
    of models. You may subclass this factory
 
300
    to add your own extended models.
 
301
    """
 
302
 
 
303
    status = Status
 
304
    user = User
 
305
    direct_message = DirectMessage
 
306
    friendship = Friendship
 
307
    saved_search = SavedSearch
 
308
    search_result = SearchResult
 
309
    list = List
 
310
 
 
311
    json = JSONModel
 
312
    ids = IDModel
 
313