forked from leancloud/python-sdk
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathuser.py
More file actions
129 lines (107 loc) · 4.03 KB
/
Copy pathuser.py
File metadata and controls
129 lines (107 loc) · 4.03 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# coding: utf-8
from leancloud import FriendshipQuery
from leancloud import client
from leancloud import Object
from leancloud import utils
__author__ = 'asaka'
class User(Object):
def __init__(self, **attrs):
self._is_current_user = False
self._session_token = None
super(User, self).__init__(**attrs)
def _merge_magic_field(self, attrs):
self._session_token = attrs.get('sessionToken')
attrs.pop('sessionToken', None)
return super(User, self)._merge_magic_field(attrs)
@classmethod
def create_follower_query(cls, user_id):
if not user_id or not isinstance(user_id, basestring):
raise TypeError('invalid user_id: {0}'.format(user_id))
query = FriendshipQuery('_Follower')
query.equal_to('user', Object.create('_User', id=user_id))
return query
@classmethod
def create_followee_query(cls, user_id):
if not user_id or not isinstance(user_id, basestring):
raise TypeError('invalid user_id: {0}'.format(user_id))
query = FriendshipQuery('_Followee')
query.equal_to('user', Object.create('_User', id=user_id))
return query
@property
def is_current(self):
return self._is_current_user
def _cleanup_auth_data(self):
if not self.is_current:
return
auth_data = self.get('authData')
if not auth_data:
return
keys = auth_data.keys()
for key in keys:
if not auth_data[key]:
del auth_data[key]
def _sync_all_auth_data(self):
auth_data = self.get('authData')
if not auth_data:
return
for key in auth_data.keys():
self._sync_auth_data(key)
def _sync_auth_data(self, key):
if not self.is_current:
return
def _handle_save_result(self, make_current=False):
if make_current:
self._is_current_user = True
self._cleanup_auth_data()
self._sync_all_auth_data()
self._server_data.pop('password', None)
self._rebuild_estimated_data_for_key('password')
def save(self):
super(User, self).save()
self._handle_save_result(False)
def sign_up(self):
"""
创建一个新用户。新创建的 User 对象,应该使用此方法来将数据保存至服务器,而不是使用 save 方法。
用户对象上必须包含 username 和 password 两个字段
"""
username = self.get('username')
if not username:
raise TypeError('invalid username: {0}'.format(username))
password = self.get('password')
if not password:
raise TypeError('invalid password')
self.save()
def login(self, username=None, password=None):
"""
登陆用户。如果用户名和密码正确,服务器会返回用户的 sessionToken 。
"""
if username:
self.set('username', username)
if password:
self.set('password', password)
response = client.get('/login', params=self.dump())
content = utils.response_to_json(response)
server_data = self.parse(content, response.status_code)
self._finish_fetch(server_data, False)
self._handle_save_result(True)
if 'smsCode' not in server_data:
self.attributes.pop('smsCode', None)
def follow(self, target_id):
"""
关注一个用户。
:param target_id: 需要关注的用户的 id
"""
if self.id is None:
raise ValueError('Please sign in')
response = client.post('/users/{0}/friendship/{1}'.format(self.id, target_id), None)
assert response.ok
def unfollow(self, target_id):
"""
取消关注一个用户。
:param target_id: 需要关注的用户的 id
:return:
"""
if self.id is None:
raise ValueError('Please sign in')
response = client.delete('/users/{0}/friendship/{1}'.format(self.id, target_id), None)
assert response.ok