|
# -*- coding: utf-8 -*-
from __future__ import division
import json
import os
import shortuuid
from curtail_uuid import CurtailUUID
from django.conf import settings
from django.core.files.storage import default_storage
from django.core.serializers.json import DjangoJSONEncoder
from logit import logit
from TimeConvert import TimeConvert as tc
from account.models import UserInfo
from group.models import GroupInfo, GroupUserInfo
from utils.error.errno_utils import GroupStatusCode, UserStatusCode
from utils.error.response_utils import response
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 set_tour_guide_own_group
r = settings.REDIS_CACHE
@logit
def tg_group_create_api(request):
"""
旅行团创建
:param request:
:return:
"""
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', '')) # UTC, %Y-%m-%dT%H:%M:%SZ
ended_at = tc.utc_string_to_utc_datetime(request.POST.get('ended_at', '')) # UTC, %Y-%m-%dT%H:%M:%SZ
total_persons = request.POST.get('total_persons', '')
# 用户校验
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 GroupInfo.objects.filter(
admin_id=user_id,
group_closed=False,
status=True,
ended_at__gt=tc.utc_datetime(),
).exists():
return response(GroupStatusCode.COULD_HAVE_ONLY_ONE_ACTIVE_GROUP)
# 群组唯一标识
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):
"""
旅行团详情
:param request:
:return:
"""
group_id = request.POST.get('group_id', '')
user_id = request.POST.get('user_id', '')
return response(200, 'Get Tour Guide Group Detail Info Success', u'获取旅行团详情成功', {
'group_id': group_id,
'group': get_group_info(group_id),
'users': get_group_users_info(group_id, user_id),
})
@logit
def tg_group_update_api(request):
"""
旅行团更新
:param request:
:return:
"""
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', '')) # UTC, %Y-%m-%dT%H:%M:%SZ
ended_at = tc.utc_string_to_utc_datetime(request.POST.get('ended_at', '')) # UTC, %Y-%m-%dT%H:%M:%SZ
total_persons = request.POST.get('total_persons', '')
# 群组校验
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.NO_UPDATE_PERMISSION)
# 群组名称更新
if group_name:
group.group_name = group_name
# 群组描述更新
if group_desc:
group.group_desc = group_desc
# 群组头像更新
if group_avatar:
_, extension = os.path.splitext(group_avatar.name)
group_avatar_path = 'group/{uuid}_{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
if default_storage.exists(group_avatar_path):
default_storage.delete(group_avatar_path)
default_storage.save(group_avatar_path, group_avatar)
group.group_avatar = group_avatar_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
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):
"""
旅行团关闭
:param request:
:return:
"""
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.NO_CLOSE_PERMISSION)
# 群组解锁
group.group_closed = True
group.closed_at = tc.utc_datetime()
group.save()
# Redis 群组数据缓存更新
set_group_info(group)
return response(200, u'Close Tour Guide Group Success', u'旅行团关闭成功')
@logit
def tg_group_gather_start_api(request):
"""
旅行团设置集合时间和地点
:param request:
:return:
"""
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', '')) # UTC, %Y-%m-%dT%H:%M:%SZ
gather_lon = request.POST.get('lon', '') # 经度
gather_lat = request.POST.get('lat', '') # 纬度
# 群组校验
try:
group = GroupInfo.objects.get(group_id=group_id)
except GroupInfo.DoesNotExist:
return response(GroupStatusCode.GROUP_NOT_FOUND)
# 权限校验
if not GroupUserInfo.objects.filter(group_id=group_id, user_id=admin_id, subadmin=True, status=True).exists():
return response(GroupStatusCode.NO_UPDATE_PERMISSION)
# 集合信息设置
group.gather_at = gather_at
group.gather_lon = gather_lon
group.gather_lat = gather_lat
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,
}, cls=DjangoJSONEncoder)).execute()
return response(200, u'Set Tour Guide Group Gather Info Success', u'设置旅行团集合信息成功')
|