| @@ -58,14 +58,14 @@ urlpatterns += [ | ||
| 58 | 58 | url(r'^g/list$', group_views.group_list_api, name='group_list_api'), # 群组列表 | 
| 59 | 59 | url(r'^g/lock$', group_views.group_lock_api, name='group_lock_api'), # 群组锁定 | 
| 60 | 60 | url(r'^g/unlock$', group_views.group_unlock_api, name='group_unlock_api'), # 群组解锁 | 
| 61 | - url(r'^g/data$', group_views.group_data_api, name='group_data_api'), # 群组数据, 评论数, 点赞数 | |
| 61 | + url(r'^g/data$', group_views.group_data_api, name='group_data_api'), # 群组数据,评论数,点赞数 | |
| 62 | 62 | ] | 
| 63 | 63 |  | 
| 64 | -# 群用户相关 | |
| 64 | +# 群成员相关 | |
| 65 | 65 | urlpatterns += [ | 
| 66 | - url(r'^g/join$', groupuser_views.group_user_join_api, name='group_join_api'), # 成员申请加群 | |
| 67 | - url(r'^g/remove$', groupuser_views.group_user_remove_api, name='group_remove_api'), # 成员移除, 管理员主动, 群成员被动 | |
| 68 | - url(r'^g/quit$', groupuser_views.group_user_quit_api, name='group_quit_api'), # 成员退出,群成员主动 | |
| 66 | + url(r'^g/join$', groupuser_views.group_user_join_api, name='group_join_api'), # 群成员加群 | |
| 67 | + url(r'^g/remove$', groupuser_views.group_user_remove_api, name='group_remove_api'), # 群成员移除,管理员主动,群成员被动 | |
| 68 | + url(r'^g/quit$', groupuser_views.group_user_quit_api, name='group_quit_api'), # 群成员退出,群成员主动 | |
| 69 | 69 | ] | 
| 70 | 70 |  | 
| 71 | 71 | # 旅行团相关 | 
| @@ -80,12 +80,13 @@ urlpatterns += [ | ||
| 80 | 80 | url(r'^tg/transfer$', tourguidegroup_views.tg_group_transfer_api, name='tg_group_transfer_api'), # 旅行团权限管理转移 | 
| 81 | 81 | ] | 
| 82 | 82 |  | 
| 83 | -# 旅行团用户相关 | |
| 83 | +# 旅行团成员相关 | |
| 84 | 84 | urlpatterns += [ | 
| 85 | - url(r'^tgu/join$', tourguidegroupuser_views.tgu_group_user_join_api, name='tgu_group_user_join_api'), # 旅行团用户加群 | |
| 86 | - url(r'^tgu/update$', tourguidegroupuser_views.tgu_group_user_update_api, name='tg_group_update_api'), # 旅行团用户更新 | |
| 87 | - url(r'^tgu/locations$', tourguidegroupuser_views.tgu_group_user_locations_api, name='tgu_group_user_locations_api'), # 旅行团所有用户位置信息 | |
| 88 | - url(r'^tgu/location$', tourguidegroupuser_views.tgu_group_user_location_api, name='tgu_group_user_location_api'), # 旅行团单个用户位置信息 | |
| 85 | + url(r'^tgu/join$', tourguidegroupuser_views.tgu_group_user_join_api, name='tgu_group_user_join_api'), # 旅行团成员加团 | |
| 86 | + url(r'^tgu/remove$', tourguidegroupuser_views.tgu_group_user_remove_api, name='tgu_group_user_remove_api'), # 旅行团成员移除,管理员主动,团成员被动 | |
| 87 | + url(r'^tgu/update$', tourguidegroupuser_views.tgu_group_user_update_api, name='tg_group_update_api'), # 旅行团成员信息更新 | |
| 88 | + url(r'^tgu/locations$', tourguidegroupuser_views.tgu_group_user_locations_api, name='tgu_group_user_locations_api'), # 旅行团所有成员位置信息 | |
| 89 | + url(r'^tgu/location$', tourguidegroupuser_views.tgu_group_user_location_api, name='tgu_group_user_location_api'), # 旅行团单个成员位置信息 | |
| 89 | 90 | ] | 
| 90 | 91 |  | 
| 91 | 92 | # 飞图相关 | 
| @@ -21,7 +21,7 @@ r = settings.REDIS_CACHE | ||
| 21 | 21 |  | 
| 22 | 22 | @logit | 
| 23 | 23 | def group_user_join_api(request): | 
| 24 | - """ 申请加群 """ | |
| 24 | + """ 群成员加群 """ | |
| 25 | 25 |      group_id = request.POST.get('group_id', '') | 
| 26 | 26 |      user_id = request.POST.get('user_id', '') | 
| 27 | 27 |      nickname = request.POST.get('nickname', '') | 
| @@ -67,7 +67,7 @@ def group_user_join_api(request): | ||
| 67 | 67 |  | 
| 68 | 68 | curinfo = get_current_photos(group_id, user_id, group_user.current_id) | 
| 69 | 69 |  | 
| 70 | -    return response(200, 'Apply Success', u'申请成功', { | |
| 70 | +    return response(200, 'Group User Join Success', u'群成员加群成功', { | |
| 71 | 71 |          'current_id': curinfo.get('current_id', ''), | 
| 72 | 72 |          'photos': curinfo.get('photos', ''), | 
| 73 | 73 | 'group_id': group_id, | 
| @@ -79,7 +79,7 @@ def group_user_join_api(request): | ||
| 79 | 79 |  | 
| 80 | 80 | @logit | 
| 81 | 81 | def group_user_remove_api(request): | 
| 82 | - """ 成员移除 """ | |
| 82 | + """ 群成员移除,管理员主动,群成员被动 """ | |
| 83 | 83 |      group_id = request.POST.get('group_id', '') | 
| 84 | 84 |      admin_id = request.POST.get('admin_id', '') | 
| 85 | 85 |      user_id = request.POST.get('user_id', '') | 
| @@ -96,7 +96,7 @@ def group_user_remove_api(request): | ||
| 96 | 96 |  | 
| 97 | 97 | # 群组用户校验 | 
| 98 | 98 | try: | 
| 99 | - group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED) | |
| 99 | + group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True) | |
| 100 | 100 | except GroupUserInfo.DoesNotExist: | 
| 101 | 101 | return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) | 
| 102 | 102 |  | 
| @@ -112,7 +112,7 @@ def group_user_remove_api(request): | ||
| 112 | 112 | r.srem(GROUP_USERS_PASSED_SET % group_id, user_id) | 
| 113 | 113 | r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id) | 
| 114 | 114 |  | 
| 115 | -    return response(200, 'Remove Success', u'用户移除成功', { | |
| 115 | +    return response(200, 'Group User Remove Success', u'群成员移除成功', { | |
| 116 | 116 | 'group_id': group_id, | 
| 117 | 117 | 'users': group_users, | 
| 118 | 118 | }) | 
| @@ -120,7 +120,7 @@ def group_user_remove_api(request): | ||
| 120 | 120 |  | 
| 121 | 121 | @logit | 
| 122 | 122 | def group_user_quit_api(request): | 
| 123 | - """ 成员退出 """ | |
| 123 | + """ 群成员退出,群成员主动 """ | |
| 124 | 124 |      group_id = request.POST.get('group_id', '') | 
| 125 | 125 |      user_id = request.POST.get('user_id', '') | 
| 126 | 126 |  | 
| @@ -136,7 +136,7 @@ def group_user_quit_api(request): | ||
| 136 | 136 |  | 
| 137 | 137 | # 群组用户校验 | 
| 138 | 138 | try: | 
| 139 | - group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, user_status=GroupUserInfo.PASSED) | |
| 139 | + group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True) | |
| 140 | 140 | except GroupUserInfo.DoesNotExist: | 
| 141 | 141 | return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) | 
| 142 | 142 |  | 
| @@ -152,7 +152,7 @@ def group_user_quit_api(request): | ||
| 152 | 152 | r.srem(GROUP_USERS_PASSED_SET % group_id, user_id) | 
| 153 | 153 | r.sadd(GROUP_USERS_QUIT_SET % group_id, user_id) | 
| 154 | 154 |  | 
| 155 | -    return response(200, 'Quit Success', u'用户退出成功', { | |
| 155 | +    return response(200, 'Group User Quit Success', u'群成员退出成功', { | |
| 156 | 156 | 'group_id': group_id, | 
| 157 | 157 | 'users': group_users, | 
| 158 | 158 | }) | 
| @@ -5,6 +5,7 @@ from __future__ import division | ||
| 5 | 5 | import json | 
| 6 | 6 |  | 
| 7 | 7 | from django.conf import settings | 
| 8 | +from django.db import transaction | |
| 8 | 9 | from logit import logit | 
| 9 | 10 | from TimeConvert import TimeConvert as tc | 
| 10 | 11 |  | 
| @@ -26,7 +27,7 @@ r = settings.REDIS_CACHE | ||
| 26 | 27 |  | 
| 27 | 28 | @logit | 
| 28 | 29 | def tgu_group_user_join_api(request): | 
| 29 | - """ 旅行团用户加群 """ | |
| 30 | + """ 旅行团成员加团 """ | |
| 30 | 31 |      admin_id = request.POST.get('admin_id', '')  # 导游唯一标识,识别二维码获取 | 
| 31 | 32 |      user_id = request.POST.get('user_id', '') | 
| 32 | 33 |      nickname = request.POST.get('nickname', '') | 
| @@ -100,7 +101,7 @@ def tgu_group_user_join_api(request): | ||
| 100 | 101 | # 添加默认地理位置信息 | 
| 101 | 102 | r.geoadd(TOUR_GUIDE_GROUP_GEO_INFO % group_id, 0, 0, user_id) | 
| 102 | 103 |  | 
| 103 | -    return response(200, 'Apply Success', u'申请成功', { | |
| 104 | +    return response(200, 'Tour Guide User Join Success', u'旅行团成员加团成功', { | |
| 104 | 105 |          'current_id': curinfo.get('current_id', ''), | 
| 105 | 106 |          'photos': curinfo.get('photos', ''), | 
| 106 | 107 | 'group_id': group_id, | 
| @@ -111,8 +112,50 @@ def tgu_group_user_join_api(request): | ||
| 111 | 112 |  | 
| 112 | 113 |  | 
| 113 | 114 | @logit | 
| 115 | +def tgu_group_user_remove_api(request): | |
| 116 | + """ 旅行团成员移除,管理员主动,团成员被动 """ | |
| 117 | +    group_id = request.POST.get('group_id', '') | |
| 118 | +    admin_id = request.POST.get('admin_id', '')  # 导游唯一标识 | |
| 119 | +    user_id = request.POST.get('user_id', '') | |
| 120 | + | |
| 121 | + # 群组校验 | |
| 122 | + try: | |
| 123 | + group = GroupInfo.objects.get(group_id=group_id) | |
| 124 | + except GroupInfo.DoesNotExist: | |
| 125 | + return response(GroupStatusCode.GROUP_NOT_FOUND) | |
| 126 | + | |
| 127 | + # 权限校验 | |
| 128 | + if not GroupUserInfo.objects.filter(group_id=group_id, user_id=admin_id, subadmin=True, status=True).exists() or admin_id == user_id: # 管理员也不允许将自己移除 | |
| 129 | + return response(GroupStatusCode.NO_UPDATE_PERMISSION) | |
| 130 | + | |
| 131 | + # 群组用户校验 | |
| 132 | + try: | |
| 133 | + group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True) | |
| 134 | + except GroupUserInfo.DoesNotExist: | |
| 135 | + return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) | |
| 136 | + | |
| 137 | + # 群组用户移除 | |
| 138 | + group_user.user_status = GroupUserInfo.DELETED | |
| 139 | + group_user.deleted_at = tc.utc_datetime() | |
| 140 | + group_user.save() | |
| 141 | + | |
| 142 | + # Redis 群组数据缓存更新 | |
| 143 | + group_users = set_group_users_info(group) | |
| 144 | + | |
| 145 | + # Redis 群组删除集合缓存 | |
| 146 | + r.srem(GROUP_USERS_PASSED_SET % group_id, user_id) | |
| 147 | + r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id) | |
| 148 | + | |
| 149 | +    return response(200, 'Tour Guide User Remove Success', u'旅行团成员移除成功', { | |
| 150 | + 'group_id': group_id, | |
| 151 | + 'users': group_users, | |
| 152 | + }) | |
| 153 | + | |
| 154 | + | |
| 155 | +@logit | |
| 156 | +@transaction.atomic | |
| 114 | 157 | def tgu_group_user_update_api(request): | 
| 115 | - """ 旅行团用户更新 """ | |
| 158 | + """ 旅行团成员信息更新 """ | |
| 116 | 159 |      group_id = request.POST.get('group_id', '') | 
| 117 | 160 |      admin_id = request.POST.get('admin_id', '')  # 导游唯一标识 | 
| 118 | 161 |      user_id = request.POST.get('user_id', '') | 
| @@ -139,7 +182,7 @@ def tgu_group_user_update_api(request): | ||
| 139 | 182 |  | 
| 140 | 183 | # 权限 | 
| 141 | 184 | try: | 
| 142 | - group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True) | |
| 185 | + group_user = GroupUserInfo.objects.select_for_update().get(group_id=group_id, user_id=user_id, status=True) | |
| 143 | 186 | except GroupUserInfo.DoesNotExist: | 
| 144 | 187 | return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) | 
| 145 | 188 |  | 
| @@ -160,7 +203,7 @@ def tgu_group_user_update_api(request): | ||
| 160 | 203 | # Redis 群组用户数据缓存 | 
| 161 | 204 | group_users = set_group_users_info(group) | 
| 162 | 205 |  | 
| 163 | -    return response(200, 'Update Group Success', u'群组更新成功', { | |
| 206 | +    return response(200, 'Tour Guide User Update Success', u'旅行团成员信息更新成功', { | |
| 164 | 207 | 'group_id': group_id, | 
| 165 | 208 | 'group': group.data, | 
| 166 | 209 | 'users': group_users, | 
| @@ -169,7 +212,7 @@ def tgu_group_user_update_api(request): | ||
| 169 | 212 |  | 
| 170 | 213 | @logit | 
| 171 | 214 | def tgu_group_user_locations_api(request): | 
| 172 | - """ 旅行团所有用户位置信息 """ | |
| 215 | + """ 旅行团所有成员位置信息 """ | |
| 173 | 216 |      group_id = request.POST.get('group_id', '') | 
| 174 | 217 |      admin_id = request.POST.get('admin_id', '')  # 导游唯一标识 | 
| 175 | 218 |  | 
| @@ -188,7 +231,7 @@ def tgu_group_user_locations_api(request): | ||
| 188 | 231 | 'user_info': get_profile_by_id(loc[0]) | 
| 189 | 232 | } for loc in locations] | 
| 190 | 233 |  | 
| 191 | -    return response(200, 'Get Tour Guide Group All User Location Success', u'获取旅行团用户地理位置信息成功', { | |
| 234 | +    return response(200, 'Get Tour Guide Group All User Location Success', u'获取旅行团成员地理位置信息成功', { | |
| 192 | 235 | 'group_id': group_id, | 
| 193 | 236 | 'locations': locations, | 
| 194 | 237 | }) | 
| @@ -196,7 +239,7 @@ def tgu_group_user_locations_api(request): | ||
| 196 | 239 |  | 
| 197 | 240 | @logit | 
| 198 | 241 | def tgu_group_user_location_api(request): | 
| 199 | - """ 旅行团单个用户位置信息 """ | |
| 242 | + """ 旅行团单个成员位置信息 """ | |
| 200 | 243 |      group_id = request.POST.get('group_id', '') | 
| 201 | 244 |      admin_id = request.POST.get('admin_id', '')  # 导游唯一标识 | 
| 202 | 245 |      user_id = request.POST.get('user_id', '') | 
| @@ -208,7 +251,7 @@ def tgu_group_user_location_api(request): | ||
| 208 | 251 | session_id = r.get(TOUR_GUIDE_GROUP_CUR_SESSION % group_id) | 
| 209 | 252 | locations = r.lrange(TOUR_GUIDE_GROUP_USER_GEO_LIST % (group_id, session_id, user_id), 0, -1) | 
| 210 | 253 |  | 
| 211 | -    return response(200, 'Get Tour Guide Group User Location Success', u'获取旅行团用户地理位置信息成功', { | |
| 254 | +    return response(200, 'Get Tour Guide Group User Location Success', u'获取旅行团成员地理位置信息成功', { | |
| 212 | 255 | 'group_id': group_id, | 
| 213 | 256 | 'user_id': user_id, | 
| 214 | 257 | 'locations': [json.loads(loc) for loc in locations] | 
| @@ -229,7 +229,7 @@ def group_unlock_api(request): | ||
| 229 | 229 |  | 
| 230 | 230 | @logit | 
| 231 | 231 | def group_data_api(request): | 
| 232 | - """ 群组数据, 评论数, 点赞数 """ | |
| 232 | + """ 群组数据,评论数,点赞数 """ | |
| 233 | 233 |      group_id = request.POST.get('group_id', '') | 
| 234 | 234 |  | 
| 235 | 235 |      return response(200, 'Get Group Data Success', u'获取群组数据成功', { |