@@ -78,6 +78,8 @@ urlpatterns += [ |
||
78 | 78 |
url(r'^tg/close$', tourguidegroup_views.tg_group_close_api, name='tg_group_close_api'), # 旅行团关闭 |
79 | 79 |
url(r'^tg/gather/start$', tourguidegroup_views.tg_group_gather_start_api, name='tg_group_gather_start_api'), # 旅行团设置集合时间和地点 |
80 | 80 |
# url(r'^tg/gather/end$', tourguidegroup_views.tg_group_gather_end_api, name='tg_group_gather_end_api'), # 旅行团集合结束,清理数据 |
81 |
+ url(r'^tg/token$', tourguidegroup_views.tg_group_token_api, name='tg_group_token_api'), # 旅行团权限管理票据 |
|
82 |
+ url(r'^tg/transfer$', tourguidegroup_views.tg_group_transfer_api, name='tg_group_transfer_api'), # 旅行团权限管理转移 |
|
81 | 83 |
] |
82 | 84 |
|
83 | 85 |
# 旅行团用户相关 |
@@ -74,6 +74,7 @@ class GroupInfo(CreateUpdateMixin): |
||
74 | 74 |
'phone': self.phone, |
75 | 75 |
'started_at': tc.remove_microsecond(self.started_at), |
76 | 76 |
'ended_at': tc.remove_microsecond(self.ended_at), |
77 |
+ 'total_persons': self.total_persons, |
|
77 | 78 |
'gather_at': tc.remove_microsecond(self.gather_at), |
78 | 79 |
'gather_lon': self.gather_lon, |
79 | 80 |
'gather_lat': self.gather_lat, |
@@ -15,7 +15,7 @@ from TimeConvert import TimeConvert as tc |
||
15 | 15 |
|
16 | 16 |
from account.models import UserInfo |
17 | 17 |
from group.models import GroupInfo, GroupUserInfo |
18 |
-from utils.error.errno_utils import GroupStatusCode, UserStatusCode |
|
18 |
+from utils.error.errno_utils import GroupStatusCode, TokenStatusCode, UserStatusCode |
|
19 | 19 |
from utils.error.response_utils import response |
20 | 20 |
from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info |
21 | 21 |
from utils.redis.rkeys import TOUR_GUIDE_GROUP_CUR_GATHER_INFO, TOUR_GUIDE_GROUP_CUR_SESSION |
@@ -211,7 +211,7 @@ def tg_group_close_api(request): |
||
211 | 211 |
# Redis 群组数据缓存更新 |
212 | 212 |
set_group_info(group) |
213 | 213 |
|
214 |
- return response(200, u'Close Tour Guide Group Success', u'旅行团关闭成功') |
|
214 |
+ return response(200, 'Close Tour Guide Group Success', u'旅行团关闭成功') |
|
215 | 215 |
|
216 | 216 |
|
217 | 217 |
@logit |
@@ -253,4 +253,87 @@ def tg_group_gather_start_api(request): |
||
253 | 253 |
'gather_lat': gather_lat, |
254 | 254 |
}, cls=DjangoJSONEncoder)).execute() |
255 | 255 |
|
256 |
- return response(200, u'Set Tour Guide Group Gather Info Success', u'设置旅行团集合信息成功') |
|
256 |
+ return response(200, 'Set Tour Guide Group Gather Info Success', u'设置旅行团集合信息成功') |
|
257 |
+ |
|
258 |
+ |
|
259 |
+@logit |
|
260 |
+def tg_group_token_api(request): |
|
261 |
+ """ |
|
262 |
+ 旅行团权限管理票据 |
|
263 |
+ :param request: |
|
264 |
+ :return: |
|
265 |
+ """ |
|
266 |
+ group_id = request.POST.get('group_id', '') |
|
267 |
+ admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '') |
|
268 |
+ |
|
269 |
+ return response(200, 'Generate Token Success', u'生成票据成功', { |
|
270 |
+ 'token': r.token(group_id + admin_id, ex_time=180) |
|
271 |
+ }) |
|
272 |
+ |
|
273 |
+ |
|
274 |
+@logit |
|
275 |
+def tg_group_transfer_api(request): |
|
276 |
+ """ |
|
277 |
+ 旅行团权限管理转移 |
|
278 |
+ :param request: |
|
279 |
+ :return: |
|
280 |
+ """ |
|
281 |
+ group_id = request.POST.get('group_id', '') |
|
282 |
+ admin_id = request.POST.get('admin_id', '') # 导游唯一标识,识别二维码获取 |
|
283 |
+ user_id = request.POST.get('user_id', '') |
|
284 |
+ token = request.POST.get('token', '') |
|
285 |
+ |
|
286 |
+ # 票据校验 |
|
287 |
+ if not r.token_exists(group_id + admin_id, token): |
|
288 |
+ return response(TokenStatusCode.TOKEN_NOT_FOUND) |
|
289 |
+ |
|
290 |
+ # 用户校验 |
|
291 |
+ try: |
|
292 |
+ user = UserInfo.objects.get(user_id=user_id) |
|
293 |
+ except UserInfo.DoesNotExist: |
|
294 |
+ return response(UserStatusCode.USER_NOT_FOUND) |
|
295 |
+ |
|
296 |
+ # 群组校验 |
|
297 |
+ try: |
|
298 |
+ group = GroupInfo.objects.get(group_id=group_id) |
|
299 |
+ except GroupInfo.DoesNotExist: |
|
300 |
+ return response(GroupStatusCode.GROUP_NOT_FOUND) |
|
301 |
+ |
|
302 |
+ # 权限校验 |
|
303 |
+ if not GroupUserInfo.objects.filter(group_id=group_id, user_id=admin_id, admin=True, status=True).exists(): |
|
304 |
+ return response(GroupStatusCode.NO_TRANSFER_PERMISSION) |
|
305 |
+ |
|
306 |
+ # 群组用户记录创建,若记录不存在,则创建,若记录已存在,则更新 |
|
307 |
+ group_user, created = GroupUserInfo.objects.get_or_create( |
|
308 |
+ group_id=group_id, |
|
309 |
+ user_id=user_id, |
|
310 |
+ defaults={ |
|
311 |
+ 'nickname': user.final_nickname, |
|
312 |
+ 'avatar': user.avatar, |
|
313 |
+ 'user_status': GroupUserInfo.PASSED, |
|
314 |
+ 'passed_at': tc.utc_datetime(), |
|
315 |
+ 'subadmin': True, |
|
316 |
+ 'name': user.name, |
|
317 |
+ 'phone': user.phone, |
|
318 |
+ } |
|
319 |
+ ) |
|
320 |
+ |
|
321 |
+ if not created: |
|
322 |
+ group_user.current_id = -1 |
|
323 |
+ group_user.nickname = user.final_nickname |
|
324 |
+ group_user.avatar = user.avatar |
|
325 |
+ group_user.user_status = GroupUserInfo.PASSED |
|
326 |
+ group_user.passed_at = tc.utc_datetime() |
|
327 |
+ group_user.subadmin = True |
|
328 |
+ group_user.name = user.name |
|
329 |
+ group_user.phone = user.phone |
|
330 |
+ group_user.save() |
|
331 |
+ |
|
332 |
+ # Redis 群组用户数据缓存 |
|
333 |
+ group_users = set_group_users_info(group) |
|
334 |
+ |
|
335 |
+ return response(200, 'Create Tour Guide Group Success', u'旅行团创建成功', { |
|
336 |
+ 'group_id': group_id, |
|
337 |
+ 'group': group.data, |
|
338 |
+ 'users': group_users, |
|
339 |
+ }) |
@@ -78,8 +78,7 @@ def tgu_group_user_join_api(request): |
||
78 | 78 |
group_user.save() |
79 | 79 |
|
80 | 80 |
if group_user.user_status != GroupUserInfo.PASSED: |
81 |
- group_user.current_id = -1 if group.group_from == GroupInfo.SESSION_GROUP else int( |
|
82 |
- r.get(GROUP_LAST_PHOTO_PK % group_id) or -1) |
|
81 |
+ group_user.current_id = int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1) |
|
83 | 82 |
group_user.nickname = nickname or user.final_nickname |
84 | 83 |
group_user.avatar = user.avatar |
85 | 84 |
# group_user.admin = False # Admin Field Default False, Should Not Assign |
@@ -26,7 +26,7 @@ mock==2.0.0 |
||
26 | 26 |
pep8==1.7.0 |
27 | 27 |
pywe-oauth==1.0.1 |
28 | 28 |
records==0.4.3 |
29 |
-redis-extensions==1.0.29 |
|
29 |
+redis-extensions==1.0.31 |
|
30 | 30 |
requests==2.12.1 |
31 | 31 |
rlog==0.2 |
32 | 32 |
shortuuid==0.4.3 |
@@ -67,7 +67,8 @@ class GroupStatusCode(BaseStatusCode): |
||
67 | 67 |
NO_PASS_PERMISSION = StatusCodeField(402015, u'No Pass Permission', description=u'没有通过权限') |
68 | 68 |
NO_REFUSE_PERMISSION = StatusCodeField(402016, u'No Refuse Permission', description=u'没有拒绝权限') |
69 | 69 |
NO_CLOSE_PERMISSION = StatusCodeField(402017, u'No Close Permission', description=u'没有关闭权限') |
70 |
- NO_LOCATION_PERMISSION = StatusCodeField(402018, u'No Location Permission', description=u'没有地理位置权限') |
|
70 |
+ NO_TRANSFER_PERMISSION = StatusCodeField(402018, u'No Transfer Permission', description=u'没有转移权限') |
|
71 |
+ NO_LOCATION_PERMISSION = StatusCodeField(402019, u'No Location Permission', description=u'没有地理位置权限') |
|
71 | 72 |
|
72 | 73 |
DUPLICATE_JOIN_REQUEST = StatusCodeField(402020, u'Duplicate Join Request', description=u'重复加群申请') |
73 | 74 |
JOIN_REQUEST_NOT_FOUND = StatusCodeField(402021, u'Join Request Not Found', description=u'加群申请不存在') |
@@ -115,3 +116,8 @@ class WithdrawStatusCode(BaseStatusCode): |
||
115 | 116 |
class MessageStatusCode(BaseStatusCode): |
116 | 117 |
""" 消息相关错误码 4090xx """ |
117 | 118 |
MESSAGE_NOT_FOUND = StatusCodeField(409001, u'Message Not Found', description=u'消息不存在') |
119 |
+ |
|
120 |
+ |
|
121 |
+class TokenStatusCode(BaseStatusCode): |
|
122 |
+ """ 票据相关错误码 4090xx """ |
|
123 |
+ TOKEN_NOT_FOUND = StatusCodeField(409901, u'Token Not Found', description=u'票据不存在') |