Add tg_group_token_api/tg_group_transfer_api

Brightcells преди 8 години
родител
ревизия
70f5faad11
променени са 6 файла, в които са добавени 98 реда и са изтрити 7 реда
  1. 2 0
      api/urls.py
  2. 1 0
      group/models.py
  3. 86 3
      group/tourguidegroup_views.py
  4. 1 2
      group/tourguidegroupuser_views.py
  5. 1 1
      requirements.txt
  6. 7 1
      utils/error/errno_utils.py

+ 2 - 0
api/urls.py

@@ -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
 # 旅行团用户相关

+ 1 - 0
group/models.py

@@ -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,

+ 86 - 3
group/tourguidegroup_views.py

@@ -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
+    })

+ 1 - 2
group/tourguidegroupuser_views.py

@@ -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

+ 1 - 1
requirements.txt

@@ -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

+ 7 - 1
utils/error/errno_utils.py

@@ -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'票据不存在')