|
| 1 | +# coding: utf-8 |
| 2 | + |
| 3 | +from __future__ import absolute_import |
| 4 | +from __future__ import division |
| 5 | +from __future__ import print_function |
| 6 | +from __future__ import unicode_literals |
| 7 | + |
| 8 | + |
| 9 | +from collections import namedtuple |
| 10 | +from datetime import datetime |
| 11 | + |
| 12 | +from leancloud import client |
| 13 | +from leancloud import utils |
| 14 | +from leancloud.query import Query |
| 15 | +from leancloud.user import User |
| 16 | + |
| 17 | +__author__ = 'asaka' |
| 18 | + |
| 19 | + |
| 20 | + |
| 21 | +StatusesCount = namedtuple('StatusesCount', ['total', 'unread']) |
| 22 | + |
| 23 | +class Status(object): |
| 24 | + def __init__(self, **data): |
| 25 | + self.id = None # type: str |
| 26 | + self.created_at = None # type: datetime |
| 27 | + self._data = data |
| 28 | + self.inbox_type = 'default' |
| 29 | + |
| 30 | + def get(self, key): |
| 31 | + return self._data.get(key) |
| 32 | + |
| 33 | + def set(self, key, value): |
| 34 | + self._data[key] = value |
| 35 | + return self |
| 36 | + |
| 37 | + def send(self, query): |
| 38 | + current_user = User.get_current() |
| 39 | + if not current_user: |
| 40 | + raise ValueError('Please sign in an user') |
| 41 | + |
| 42 | + params = { |
| 43 | + 'inboxType': self.inbox_type, |
| 44 | + 'data': self._data, |
| 45 | + 'query': query.dump(), |
| 46 | + 'source': self._data.get('source') or current_user._to_pointer(), |
| 47 | + } |
| 48 | + params['query']['className'] = query._query_class._class_name |
| 49 | + |
| 50 | + content = client.post('/statuses', params=params).json() |
| 51 | + self.id = content['objectId'] |
| 52 | + self.created_at = utils.decode('createdAt', content['createdAt']) |
| 53 | + |
| 54 | + def send_to_followers(self): |
| 55 | + current_user = User.get_current() |
| 56 | + if not current_user: |
| 57 | + raise ValueError('Please sign in an user') |
| 58 | + |
| 59 | + query = Query('_Follower').select('follower').equal_to('user', current_user) |
| 60 | + self.send(query) |
| 61 | + |
| 62 | + def send_private_status(self, target): |
| 63 | + current_user = User.get_current() |
| 64 | + if not current_user: |
| 65 | + raise ValueError('Please sign in an user') |
| 66 | + |
| 67 | + if not isinstance(target, User): |
| 68 | + raise TypeError('target must be a leancloud.User') |
| 69 | + |
| 70 | + query = Query('User').equal_to('objectId', target.id) |
| 71 | + self.inbox_type = 'private' |
| 72 | + self.send(query) |
| 73 | + |
| 74 | + def destroy(self): |
| 75 | + if not self.id: |
| 76 | + raise ValueError('This status is not saved') |
| 77 | + client.delete('/statuses/' + self.id) |
| 78 | + |
| 79 | + @staticmethod |
| 80 | + def count_unread_statuses(owner, inbox_type='default'): |
| 81 | + params = { |
| 82 | + 'inboxType': inbox_type, |
| 83 | + 'owner': utils.encode(owner), |
| 84 | + } |
| 85 | + content = client.get('/subscribe/statuses/count', params).json() |
| 86 | + return StatusesCount(total=content['total'], unread=content['unread']) |
0 commit comments