Skip to content

Commit f1da046

Browse files
committed
✨ add leancloud.Status
1 parent cf1ba0d commit f1da046

4 files changed

Lines changed: 158 additions & 1 deletion

File tree

leancloud/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
from .query import Query
4040
from .relation import Relation
4141
from .role import Role
42+
from .status import Status
4243
from .sys_message import SysMessage
4344
from .user import User
4445

@@ -61,6 +62,7 @@
6162
'Query',
6263
'Relation',
6364
'Role',
65+
'Status',
6466
'SysMessage',
6567
'User',
6668
'client',

leancloud/status.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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'])

leancloud/user.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88

99
import threading
10+
from typing import Optional
1011

1112
import six
1213

@@ -58,7 +59,7 @@ def create_followee_query(cls, user_id):
5859
return query
5960

6061
@classmethod
61-
def get_current(cls):
62+
def get_current(cls): # type: () -> Optional[User]
6263
return getattr(thread_locals, 'current_user', None)
6364

6465
@classmethod

tests/test_status.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
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+
import os
9+
import time
10+
11+
from nose.tools import assert_equal
12+
from nose.tools import assert_true
13+
14+
import leancloud
15+
from leancloud import Status
16+
17+
18+
def setup():
19+
leancloud.init(os.environ['APP_ID'], app_key=os.environ['APP_KEY'], master_key=os.environ['MASTER_KEY'])
20+
leancloud.use_master_key(True)
21+
users = leancloud.Query(leancloud.User).find()
22+
for u in users:
23+
u.destroy()
24+
leancloud.use_master_key(False)
25+
26+
user1 = leancloud.User()
27+
user1.set('username', 'user1_name')
28+
user1.set('password', 'password')
29+
user1.set_email('wow@leancloud.rocks')
30+
user1.set_mobile_phone_number('18611111111')
31+
user1.sign_up()
32+
33+
34+
def test_send():
35+
status = Status(image='http://www.example.com', message='hello world!')
36+
status.inbox_type = 'privateMessage'
37+
query = leancloud.Query('User').equal_to('username', 'user1_name')
38+
status.send(query)
39+
assert status.id
40+
assert status.created_at
41+
status.destroy()
42+
43+
44+
def test_send_to_followers():
45+
status = Status(image='http://www.example.com', message='hello world!')
46+
status.send_to_followers()
47+
assert status.id
48+
assert status.created_at
49+
status.destroy()
50+
51+
52+
def test_send_private_status():
53+
status = Status(image='http://www.example.com', message='hello world!')
54+
target = leancloud.User.create_without_data('foo')
55+
status.send_private_status(target)
56+
assert status.id
57+
assert status.created_at
58+
assert_equal(status.inbox_type, 'private')
59+
status.destroy()
60+
61+
62+
def test_count_():
63+
status = Status(image='http://www.example.com', message='hello world!')
64+
status.send_private_status(leancloud.User.get_current())
65+
result = Status.count_unread_statuses(leancloud.User.get_current(), 'private')
66+
assert_equal(result.total, 1)
67+
assert_equal(result.unread, 1)
68+
status.destroy()

0 commit comments

Comments
 (0)