Geen omschrijving

tourguidegroup_views.py 13KB

    # -*- coding: utf-8 -*- from __future__ import division import json import shortuuid from django.conf import settings from django.core.serializers.json import DjangoJSONEncoder from django_curtail_uuid import CurtailUUID from django_logit import logit from django_response import response from TimeConvert import TimeConvert as tc from account.models import UserInfo from group.models import GroupInfo, GroupUserInfo from utils.admin_utils import have_active_group, is_group_admin, is_group_subadmin from utils.error.errno_utils import GroupStatusCode, GroupUserStatusCode, TokenStatusCode, UserStatusCode from utils.redis.connect import r from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info from utils.redis.rkeys import TOUR_GUIDE_GROUP_CUR_GATHER_INFO, TOUR_GUIDE_GROUP_CUR_SESSION from utils.redis.rtourguide import get_tour_guide_own_group, set_tour_guide_own_group from utils.redis.rtouruser import get_tour_user_belong_group from utils.storage_qiniu_utils import file_save @logit def tg_group_create_api(request): """ 旅行团创建 """ user_id = request.POST.get('user_id', '') group_name = request.POST.get('group_name', '') group_default_avatar = int(request.POST.get('group_default_avatar', 0)) 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 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 total_persons = int(request.POST.get('total_persons', 1)) # 用户校验 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 权限校验 if not user.istourguide: return response(GroupStatusCode.NOT_GROUP_ADMIN) # 旅行团校验 if have_active_group(user_id): return response(GroupStatusCode.ONLY_ONE_ACTIVE_GROUP_ALLOWED) # 群组唯一标识 group_id = CurtailUUID.uuid(GroupInfo, 'group_id') # 群组记录创建 group = GroupInfo.objects.create( group_id=group_id, admin_id=user_id, group_name=group_name, group_default_avatar=group_default_avatar, group_from=GroupInfo.TOURGUIDE_GROUP, name=user.name, phone=user.phone, started_at=started_at, ended_at=ended_at, total_persons=total_persons, ) # Redis 群组数据缓存 group_info = set_group_info(group) # 群组用户记录创建 GroupUserInfo.objects.create( group_id=group_id, user_id=user_id, nickname=user.final_nickname, avatar=user.avatar, admin=True, user_status=GroupUserInfo.PASSED, passed_at=tc.utc_datetime(), subadmin=True, name=user.name, phone=user.phone, ) # Redis 群组用户数据缓存 group_users = set_group_users_info(group) # Redis 设置导游拥有的旅行团 set_tour_guide_own_group(user_id, group_id) return response(200, 'Create Tour Guide Group Success', u'旅行团创建成功', { 'group_id': group_id, 'group': group_info, 'users': group_users, }) @logit def tg_group_detail_api(request): """ 旅行团详情 """ group_id = request.POST.get('group_id', '') user_id = request.POST.get('user_id', '') if not group_id: group_id = get_tour_guide_own_group(user_id) group_users_info = get_group_users_info(group_id, user_id) # Remove tourguide group_passed_users = [uinfo for uinfo in group_users_info['passed'] if not uinfo['subadmin']] # Update passed users group_users_info['passed'] = group_passed_users # Update passed count group_users_info['passed_count'] = len(group_passed_users) # Sum(relative_persons) group_users_info['relative_persons'] = sum([user['relative_persons'] for user in group_passed_users]) return response(200, 'Get Tour Guide Group Detail Info Success', u'获取旅行团详情成功', { 'group_id': group_id, 'group': get_group_info(group_id), 'users': group_users_info, }) @logit def pai2_tginfo_api(request): """ 首页旅行团信息 """ user_id = request.POST.get('user_id', '') # 获取用户当前所处旅行团 group_id = get_tour_user_belong_group(user_id) if not group_id: return response(GroupUserStatusCode.USER_HAS_NOT_JOIN_GROUP) group_info = get_group_info(group_id) # Check whether ended ended_at = group_info.get('ended_at', '') 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): return response(GroupStatusCode.GROUP_HAS_ENDED) # Check gather info gather_at = group_info.get('gather_at', '') 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): group_info['gather_at'] = '' group_info['gather_lon'] = '' group_info['gather_lat'] = '' group_info['gather_location'] = '' return response(200, 'Get Tour Guide Group Detail Info Success', u'获取旅行团详情成功', { 'group_id': group_id, 'group': group_info, 'users': get_group_users_info(group_id, user_id), }) @logit(body=settings.LOGIT_BODY_FLAG, res=settings.LOGIT_RES_FLAG) def tg_group_update_api(request): """ 旅行团更新 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '') group_name = request.POST.get('group_name', '') group_desc = request.POST.get('group_desc', '') group_avatar = request.FILES.get('group_avatar', '') 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 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 total_persons = int(request.POST.get('total_persons', 0)) attentions = request.FILES.get('attentions', '') schedules = request.FILES.get('schedules', '') # 群组校验 try: group = GroupInfo.objects.get(group_id=group_id) except GroupInfo.DoesNotExist: return response(GroupStatusCode.GROUP_NOT_FOUND) # 权限校验 if group.admin_id != admin_id: return response(GroupStatusCode.NOT_GROUP_ADMIN) # 群组名称更新 if group_name: group.group_name = group_name # 群组描述更新 if group_desc: group.group_desc = group_desc # 群组头像更新 if group_avatar: group.group_avatar = file_save(group_avatar, prefix='group', ext='.jpeg').photo_path # 起止时间更新 if started_at: group.started_at = started_at if ended_at: group.ended_at = ended_at # 旅行团总人数更新 if total_persons: group.total_persons = total_persons # 注意事项更新 if attentions: group.attentions_path = file_save(attentions, prefix='tour', ext='.jpeg').photo_path # 行程安排更新 if schedules: group.schedules_path = file_save(schedules, prefix='tour', ext='.jpeg').photo_path group.save() # Redis 群组数据缓存更新 group_info = set_group_info(group) return response(200, 'Update Group Success', u'群组更新成功', { 'group_id': group_id, 'group': group_info, 'users': get_group_users_info(group_id, admin_id), }) @logit def tg_group_close_api(request): """ 旅行团关闭 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '') # 群组校验 try: group = GroupInfo.objects.get(group_id=group_id) except GroupInfo.DoesNotExist: return response(GroupStatusCode.GROUP_NOT_FOUND) # 权限校验 if group.admin_id != admin_id: return response(GroupStatusCode.NOT_GROUP_ADMIN) # 群组解锁 group.group_closed = True group.closed_at = tc.utc_datetime() group.save() # Redis 群组数据缓存更新 set_group_info(group) return response(200, 'Close Tour Guide Group Success', u'旅行团关闭成功') @logit def tg_group_gather_start_api(request): """ 旅行团设置集合时间和地点 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '') 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 gather_lon = request.POST.get('lon', '') # 经度 gather_lat = request.POST.get('lat', '') # 纬度 gather_location = request.POST.get('gather_location', '') # 地点 gather_screenshot = request.FILES.get('gather_screenshot', '') # 群组校验 try: group = GroupInfo.objects.get(group_id=group_id) except GroupInfo.DoesNotExist: return response(GroupStatusCode.GROUP_NOT_FOUND) # 权限校验 if not is_group_subadmin(group_id, admin_id): return response(GroupStatusCode.NOT_GROUP_SUBADMIN) # 集合信息设置 group.gather_at = gather_at group.gather_lon = gather_lon group.gather_lat = gather_lat group.gather_location = gather_location if gather_screenshot: group.gather_screenshot = file_save(gather_screenshot, prefix='tour', ext='.jpeg').photo_path group.save() # Redis 群组数据缓存更新 set_group_info(group) # 更新Session r.pipeline().set( TOUR_GUIDE_GROUP_CUR_SESSION % group_id, shortuuid.uuid() ).set( TOUR_GUIDE_GROUP_CUR_GATHER_INFO % group_id, json.dumps({ 'gather_at': gather_at, 'gather_lon': gather_lon, 'gather_lat': gather_lat, 'gather_location': gather_location, }, cls=DjangoJSONEncoder) ).execute() return response(200, 'Set Tour Guide Group Gather Info Success', u'设置旅行团集合信息成功') @logit def tg_group_token_api(request): """ 旅行团权限管理票据 """ admin_id = request.POST.get('admin_id', '') or request.POST.get('user_id', '') # 旅行团校验 if not have_active_group(admin_id): return response(GroupStatusCode.ACTIVE_GROUP_NOT_FOUND) # 获取旅行团唯一标识 group_id = get_tour_guide_own_group(admin_id) return response(200, 'Generate Token Success', u'生成票据成功', { 'token': r.token(group_id + admin_id, time=180) }) @logit def tg_group_transfer_api(request): """ 旅行团权限管理转移 """ admin_id = request.POST.get('admin_id', '') # 导游唯一标识,识别二维码获取 user_id = request.POST.get('user_id', '') token = request.POST.get('token', '') # 旅行团校验 if have_active_group(user_id): return response(GroupStatusCode.ONLY_ONE_ACTIVE_GROUP_ALLOWED) # 获取旅行团唯一标识 group_id = get_tour_guide_own_group(admin_id) # 票据校验 if not r.token_exists(group_id + admin_id, token): return response(TokenStatusCode.TOKEN_NOT_FOUND) # 用户校验 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 群组校验 try: group = GroupInfo.objects.get(group_id=group_id) except GroupInfo.DoesNotExist: return response(GroupStatusCode.GROUP_NOT_FOUND) # 权限校验 if not is_group_admin(group_id, admin_id): return response(GroupStatusCode.NOT_GROUP_ADMIN) # 群组用户记录创建,若记录不存在,则创建,若记录已存在,则更新 group_user, created = GroupUserInfo.objects.get_or_create( group_id=group_id, user_id=user_id, defaults={ 'nickname': user.final_nickname, 'avatar': user.avatar, 'user_status': GroupUserInfo.PASSED, 'passed_at': tc.utc_datetime(), 'subadmin': True, 'name': user.name, 'phone': user.phone, } ) if not created: group_user.current_id = -1 group_user.nickname = user.final_nickname group_user.avatar = user.avatar group_user.user_status = GroupUserInfo.PASSED group_user.passed_at = tc.utc_datetime() group_user.subadmin = True group_user.name = user.name group_user.phone = user.phone group_user.status = True group_user.save() # Redis 群组用户数据缓存 group_users = set_group_users_info(group) # Redis 设置导游拥有的旅行团 set_tour_guide_own_group(user_id, group_id) return response(200, 'Transfer Tour Guide Group Success', u'转移旅行团管理权成功', { 'group_id': group_id, 'group': group.data, 'users': group_users, })