拍爱

tourguidegroup_views.py 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  1. # -*- coding: utf-8 -*-
  2. from __future__ import division
  3. import json
  4. import shortuuid
  5. from curtail_uuid import CurtailUUID
  6. from django.conf import settings
  7. from django.core.serializers.json import DjangoJSONEncoder
  8. from logit import logit
  9. from TimeConvert import TimeConvert as tc
  10. from account.models import UserInfo
  11. from group.models import GroupInfo, GroupUserInfo
  12. from utils.admin_utils import have_active_group, is_group_admin, is_group_subadmin
  13. from utils.error.errno_utils import GroupStatusCode, GroupUserStatusCode, TokenStatusCode, UserStatusCode
  14. from utils.error.response_utils import response
  15. from utils.redis.connect import r
  16. from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info
  17. from utils.redis.rkeys import TOUR_GUIDE_GROUP_CUR_GATHER_INFO, TOUR_GUIDE_GROUP_CUR_SESSION
  18. from utils.redis.rtourguide import get_tour_guide_own_group, set_tour_guide_own_group
  19. from utils.redis.rtouruser import get_tour_user_belong_group
  20. from utils.storage_qiniu_utils import file_save
  21. @logit
  22. def tg_group_create_api(request):
  23. """ 旅行团创建 """
  24. user_id = request.POST.get('user_id', '')
  25. group_name = request.POST.get('group_name', '')
  26. group_default_avatar = int(request.POST.get('group_default_avatar', 0))
  27. started_at = tc.utc_string_to_utc_datetime(request.POST.get('started_at', ''), format='%Y-%m-%dT%H:%M:%SZ') # UTC, %Y-%m-%dT%H:%M:%SZ
  28. ended_at = tc.utc_string_to_utc_datetime(request.POST.get('ended_at', ''), format='%Y-%m-%dT%H:%M:%SZ') # UTC, %Y-%m-%dT%H:%M:%SZ
  29. total_persons = int(request.POST.get('total_persons', 1))
  30. # 用户校验
  31. try:
  32. user = UserInfo.objects.get(user_id=user_id)
  33. except UserInfo.DoesNotExist:
  34. return response(UserStatusCode.USER_NOT_FOUND)
  35. # 权限校验
  36. if not user.istourguide:
  37. return response(GroupStatusCode.NOT_GROUP_ADMIN)
  38. # 旅行团校验
  39. if have_active_group(user_id):
  40. return response(GroupStatusCode.ONLY_ONE_ACTIVE_GROUP_ALLOWED)
  41. # 群组唯一标识
  42. group_id = CurtailUUID.uuid(GroupInfo, 'group_id')
  43. # 群组记录创建
  44. group = GroupInfo.objects.create(
  45. group_id=group_id,
  46. admin_id=user_id,
  47. group_name=group_name,
  48. group_default_avatar=group_default_avatar,
  49. group_from=GroupInfo.TOURGUIDE_GROUP,
  50. name=user.name,
  51. phone=user.phone,
  52. started_at=started_at,
  53. ended_at=ended_at,
  54. total_persons=total_persons,
  55. )
  56. # Redis 群组数据缓存
  57. group_info = set_group_info(group)
  58. # 群组用户记录创建
  59. GroupUserInfo.objects.create(
  60. group_id=group_id,
  61. user_id=user_id,
  62. nickname=user.final_nickname,
  63. avatar=user.avatar,
  64. admin=True,
  65. user_status=GroupUserInfo.PASSED,
  66. passed_at=tc.utc_datetime(),
  67. subadmin=True,
  68. name=user.name,
  69. phone=user.phone,
  70. )
  71. # Redis 群组用户数据缓存
  72. group_users = set_group_users_info(group)
  73. # Redis 设置导游拥有的旅行团
  74. set_tour_guide_own_group(user_id, group_id)
  75. return response(200, 'Create Tour Guide Group Success', u'旅行团创建成功', {
  76. 'group_id': group_id,
  77. 'group': group_info,
  78. 'users': group_users,
  79. })
  80. @logit
  81. def tg_group_detail_api(request):
  82. """ 旅行团详情 """
  83. group_id = request.POST.get('group_id', '')
  84. user_id = request.POST.get('user_id', '')
  85. if not group_id:
  86. group_id = get_tour_guide_own_group(user_id)
  87. group_users_info = get_group_users_info(group_id, user_id)
  88. # Remove tourguide
  89. group_passed_users = [uinfo for uinfo in group_users_info['passed'] if not uinfo['subadmin']]
  90. # Update passed users
  91. group_users_info['passed'] = group_passed_users
  92. # Update passed count
  93. group_users_info['passed_count'] = len(group_passed_users)
  94. # Sum(relative_persons)
  95. group_users_info['relative_persons'] = sum([user['relative_persons'] for user in group_passed_users])
  96. return response(200, 'Get Tour Guide Group Detail Info Success', u'获取旅行团详情成功', {
  97. 'group_id': group_id,
  98. 'group': get_group_info(group_id),
  99. 'users': group_users_info,
  100. })
  101. @logit
  102. def pai2_tginfo_api(request):
  103. """ 首页旅行团信息 """
  104. user_id = request.POST.get('user_id', '')
  105. # 获取用户当前所处旅行团
  106. group_id = get_tour_user_belong_group(user_id)
  107. if not group_id:
  108. return response(GroupUserStatusCode.USER_HAS_NOT_JOIN_GROUP)
  109. group_info = get_group_info(group_id)
  110. # Check whether ended
  111. ended_at = group_info.get('ended_at', '')
  112. if ended_at and tc.utc_datetime() > (tc.utc_string_to_utc_datetime(ended_at, format='%Y-%m-%dT%H:%M:%SZ') if isinstance(ended_at, basestring) else ended_at):
  113. return response(GroupStatusCode.GROUP_HAS_ENDED)
  114. # Check gather info
  115. gather_at = group_info.get('gather_at', '')
  116. if gather_at and tc.utc_datetime() > (tc.utc_string_to_utc_datetime(gather_at, format='%Y-%m-%dT%H:%M:%SZ') if isinstance(gather_at, basestring) else gather_at):
  117. group_info['gather_at'] = ''
  118. group_info['gather_lon'] = ''
  119. group_info['gather_lat'] = ''
  120. group_info['gather_location'] = ''
  121. return response(200, 'Get Tour Guide Group Detail Info Success', u'获取旅行团详情成功', {
  122. 'group_id': group_id,
  123. 'group': group_info,
  124. 'users': get_group_users_info(group_id, user_id),
  125. })
  126. @logit(body=settings.LOGIT_BODY_FLAG, res=settings.LOGIT_RES_FLAG)
  127. def tg_group_update_api(request):
  128. """ 旅行团更新 """
  129. group_id = request.POST.get('group_id', '')
  130. admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
  131. group_name = request.POST.get('group_name', '')
  132. group_desc = request.POST.get('group_desc', '')
  133. group_avatar = request.FILES.get('group_avatar', '')
  134. started_at = tc.utc_string_to_utc_datetime(request.POST.get('started_at', ''), format='%Y-%m-%dT%H:%M:%SZ') # UTC, %Y-%m-%dT%H:%M:%SZ
  135. ended_at = tc.utc_string_to_utc_datetime(request.POST.get('ended_at', ''), format='%Y-%m-%dT%H:%M:%SZ') # UTC, %Y-%m-%dT%H:%M:%SZ
  136. total_persons = int(request.POST.get('total_persons', 0))
  137. attentions = request.FILES.get('attentions', '')
  138. schedules = request.FILES.get('schedules', '')
  139. # 群组校验
  140. try:
  141. group = GroupInfo.objects.get(group_id=group_id)
  142. except GroupInfo.DoesNotExist:
  143. return response(GroupStatusCode.GROUP_NOT_FOUND)
  144. # 权限校验
  145. if group.admin_id != admin_id:
  146. return response(GroupStatusCode.NOT_GROUP_ADMIN)
  147. # 群组名称更新
  148. if group_name:
  149. group.group_name = group_name
  150. # 群组描述更新
  151. if group_desc:
  152. group.group_desc = group_desc
  153. # 群组头像更新
  154. if group_avatar:
  155. group.group_avatar = file_save(group_avatar, prefix='group', ext='.jpeg').photo_path
  156. # 起止时间更新
  157. if started_at:
  158. group.started_at = started_at
  159. if ended_at:
  160. group.ended_at = ended_at
  161. # 旅行团总人数更新
  162. if total_persons:
  163. group.total_persons = total_persons
  164. # 注意事项更新
  165. if attentions:
  166. group.attentions_path = file_save(attentions, prefix='tour', ext='.jpeg').photo_path
  167. # 行程安排更新
  168. if schedules:
  169. group.schedules_path = file_save(schedules, prefix='tour', ext='.jpeg').photo_path
  170. group.save()
  171. # Redis 群组数据缓存更新
  172. group_info = set_group_info(group)
  173. return response(200, 'Update Group Success', u'群组更新成功', {
  174. 'group_id': group_id,
  175. 'group': group_info,
  176. 'users': get_group_users_info(group_id, admin_id),
  177. })
  178. @logit
  179. def tg_group_close_api(request):
  180. """ 旅行团关闭 """
  181. group_id = request.POST.get('group_id', '')
  182. admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
  183. # 群组校验
  184. try:
  185. group = GroupInfo.objects.get(group_id=group_id)
  186. except GroupInfo.DoesNotExist:
  187. return response(GroupStatusCode.GROUP_NOT_FOUND)
  188. # 权限校验
  189. if group.admin_id != admin_id:
  190. return response(GroupStatusCode.NOT_GROUP_ADMIN)
  191. # 群组解锁
  192. group.group_closed = True
  193. group.closed_at = tc.utc_datetime()
  194. group.save()
  195. # Redis 群组数据缓存更新
  196. set_group_info(group)
  197. return response(200, 'Close Tour Guide Group Success', u'旅行团关闭成功')
  198. @logit
  199. def tg_group_gather_start_api(request):
  200. """ 旅行团设置集合时间和地点 """
  201. group_id = request.POST.get('group_id', '')
  202. admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
  203. gather_at = tc.utc_string_to_utc_datetime(request.POST.get('gather_at', ''), format='%Y-%m-%dT%H:%M:%SZ') # UTC, %Y-%m-%dT%H:%M:%SZ
  204. gather_lon = request.POST.get('lon', '') # 经度
  205. gather_lat = request.POST.get('lat', '') # 纬度
  206. gather_location = request.POST.get('gather_location', '') # 地点
  207. gather_screenshot = request.FILES.get('gather_screenshot', '')
  208. # 群组校验
  209. try:
  210. group = GroupInfo.objects.get(group_id=group_id)
  211. except GroupInfo.DoesNotExist:
  212. return response(GroupStatusCode.GROUP_NOT_FOUND)
  213. # 权限校验
  214. if not is_group_subadmin(group_id, admin_id):
  215. return response(GroupStatusCode.NOT_GROUP_SUBADMIN)
  216. # 集合信息设置
  217. group.gather_at = gather_at
  218. group.gather_lon = gather_lon
  219. group.gather_lat = gather_lat
  220. group.gather_location = gather_location
  221. if gather_screenshot:
  222. group.gather_screenshot = file_save(gather_screenshot, prefix='tour', ext='.jpeg').photo_path
  223. group.save()
  224. # Redis 群组数据缓存更新
  225. set_group_info(group)
  226. # 更新Session
  227. r.pipeline().set(
  228. TOUR_GUIDE_GROUP_CUR_SESSION % group_id, shortuuid.uuid()
  229. ).set(
  230. TOUR_GUIDE_GROUP_CUR_GATHER_INFO % group_id, json.dumps({
  231. 'gather_at': gather_at,
  232. 'gather_lon': gather_lon,
  233. 'gather_lat': gather_lat,
  234. 'gather_location': gather_location,
  235. }, cls=DjangoJSONEncoder)
  236. ).execute()
  237. return response(200, 'Set Tour Guide Group Gather Info Success', u'设置旅行团集合信息成功')
  238. @logit
  239. def tg_group_token_api(request):
  240. """ 旅行团权限管理票据 """
  241. admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '')
  242. # 旅行团校验
  243. if not have_active_group(admin_id):
  244. return response(GroupStatusCode.ACTIVE_GROUP_NOT_FOUND)
  245. # 获取旅行团唯一标识
  246. group_id = get_tour_guide_own_group(admin_id)
  247. return response(200, 'Generate Token Success', u'生成票据成功', {
  248. 'token': r.token(group_id + admin_id, time=180)
  249. })
  250. @logit
  251. def tg_group_transfer_api(request):
  252. """ 旅行团权限管理转移 """
  253. admin_id = request.POST.get('admin_id', '') # 导游唯一标识,识别二维码获取
  254. user_id = request.POST.get('user_id', '')
  255. token = request.POST.get('token', '')
  256. # 旅行团校验
  257. if have_active_group(user_id):
  258. return response(GroupStatusCode.ONLY_ONE_ACTIVE_GROUP_ALLOWED)
  259. # 获取旅行团唯一标识
  260. group_id = get_tour_guide_own_group(admin_id)
  261. # 票据校验
  262. if not r.token_exists(group_id + admin_id, token):
  263. return response(TokenStatusCode.TOKEN_NOT_FOUND)
  264. # 用户校验
  265. try:
  266. user = UserInfo.objects.get(user_id=user_id)
  267. except UserInfo.DoesNotExist:
  268. return response(UserStatusCode.USER_NOT_FOUND)
  269. # 群组校验
  270. try:
  271. group = GroupInfo.objects.get(group_id=group_id)
  272. except GroupInfo.DoesNotExist:
  273. return response(GroupStatusCode.GROUP_NOT_FOUND)
  274. # 权限校验
  275. if not is_group_admin(group_id, admin_id):
  276. return response(GroupStatusCode.NOT_GROUP_ADMIN)
  277. # 群组用户记录创建,若记录不存在,则创建,若记录已存在,则更新
  278. group_user, created = GroupUserInfo.objects.get_or_create(
  279. group_id=group_id,
  280. user_id=user_id,
  281. defaults={
  282. 'nickname': user.final_nickname,
  283. 'avatar': user.avatar,
  284. 'user_status': GroupUserInfo.PASSED,
  285. 'passed_at': tc.utc_datetime(),
  286. 'subadmin': True,
  287. 'name': user.name,
  288. 'phone': user.phone,
  289. }
  290. )
  291. if not created:
  292. group_user.current_id = -1
  293. group_user.nickname = user.final_nickname
  294. group_user.avatar = user.avatar
  295. group_user.user_status = GroupUserInfo.PASSED
  296. group_user.passed_at = tc.utc_datetime()
  297. group_user.subadmin = True
  298. group_user.name = user.name
  299. group_user.phone = user.phone
  300. group_user.status = True
  301. group_user.save()
  302. # Redis 群组用户数据缓存
  303. group_users = set_group_users_info(group)
  304. # Redis 设置导游拥有的旅行团
  305. set_tour_guide_own_group(user_id, group_id)
  306. return response(200, 'Transfer Tour Guide Group Success', u'转移旅行团管理权成功', {
  307. 'group_id': group_id,
  308. 'group': group.data,
  309. 'users': group_users,
  310. })