em" href="/Pai2/pai2/issues"> Issues 0 Pull Requests 0 Commits 471 Releases 0

拍爱

tourguidegroupuser_views.py 12KB

    # -*- coding: utf-8 -*- from __future__ import division import json from django.conf import settings from django.db import transaction from logit import logit from TimeConvert import TimeConvert as tc from account.models import UserInfo from group.models import GroupInfo, GroupUserInfo from utils.admin_utils import is_group_subadmin from utils.error.errno_utils import GroupStatusCode, GroupUserStatusCode, UserStatusCode from utils.error.response_utils import response from utils.group_photo_utils import get_current_photos from utils.redis.connect import r from utils.redis.rgroup import get_group_info, get_group_users_info, get_group_users_kv_info, set_group_users_info from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_USERS_DELETED_SET, GROUP_USERS_PASSED_SET, GROUP_USERS_QUIT_SET, GROUP_USERS_REFUSED_SET, TOUR_GUIDE_GROUP_CUR_GATHER_INFO, TOUR_GUIDE_GROUP_CUR_SESSION, TOUR_GUIDE_GROUP_GEO_INFO, TOUR_GUIDE_GROUP_GEO_SUBMIT_DT, TOUR_GUIDE_GROUP_USER_GEO_LIST) from utils.redis.rtourguide import get_tour_guide_own_group from utils.redis.rtouruser import set_tour_user_belong_group @logit def tgu_group_user_is_joined_api(request): """ 旅行团成员是否已加团 """ admin_id = request.POST.get('admin_id', '') # 导游唯一标识,识别二维码获取 user_id = request.POST.get('user_id', '') # 获取旅行团唯一标识 group_id = get_tour_guide_own_group(admin_id) # 用户校验 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 group.group_lock: return response(GroupStatusCode.GROUP_HAS_LOCKED) # Check whether ended ended_at = group.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) # 群组用户是否存在 joined = GroupUserInfo.objects.filter(group_id=group_id, user_id=user_id).exists() return response(200, 'Tour Guide User Has Joined', u'旅行团成员已加团', { 'joined': joined, 'group': get_group_info(group_id), }) @logit(res=settings.LOGIT_RES_FLAG) def tgu_group_user_join_api(request): """ 旅行团成员加团 """ admin_id = request.POST.get('admin_id', '') # 导游唯一标识,识别二维码获取 user_id = request.POST.get('user_id', '') nickname = request.POST.get('nickname', '') name = request.POST.get('name', '') phone = request.POST.get('phone', '') relative_persons = int(request.POST.get('relative_persons', 1)) authority = bool(int(request.POST.get('authority', 1))) remark = request.POST.get('remark', '') # 获取旅行团唯一标识 group_id = get_tour_guide_own_group(admin_id) # 用户校验 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 group.group_lock: return response(GroupStatusCode.GROUP_HAS_LOCKED) # Check whether ended ended_at = group.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) # 群组用户记录创建,若记录不存在,则创建,若记录已存在,则更新 group_user, created = GroupUserInfo.objects.get_or_create( group_id=group_id, user_id=user_id, defaults={ 'name': name, 'phone': phone, 'relative_persons': relative_persons, 'authority': authority, 'remark': remark, } ) if not created: group_user.name = name group_user.phone = phone group_user.relative_persons = relative_persons group_user.authority = authority group_user.remark = remark group_user.save() if group_user.user_status != GroupUserInfo.PASSED: group_user.current_id = int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1) group_user.nickname = nickname or user.final_nickname group_user.avatar = user.avatar # group_user.admin = False # Admin Field Default False, Should Not Assign group_user.user_status = GroupUserInfo.PASSED group_user.passed_at = tc.utc_datetime() group_user.save() # Redis 群组用户数据缓存 set_group_users_info(group) # Redis 群组通过集合缓存 r.srem(GROUP_USERS_REFUSED_SET % group_id, user_id) r.srem(GROUP_USERS_DELETED_SET % group_id, user_id) r.srem(GROUP_USERS_QUIT_SET % group_id, user_id) r.sadd(GROUP_USERS_PASSED_SET % group_id, user_id) curinfo = get_current_photos(group_id, user_id, group_user.current_id, request=request) # 添加默认地理位置信息 r.geoadd(TOUR_GUIDE_GROUP_GEO_INFO % group_id, 0, 0, user_id) # 设置旅行团成员所属的旅行团 set_tour_user_belong_group(user_id, group_id) return response(200, 'Tour Guide User Join Success', u'旅行团成员加团成功', { 'current_id': curinfo.get('current_id', ''), 'photos': curinfo.get('photos', ''), 'group_id': group_id, 'group': get_group_info(group_id), 'user_id': user_id, 'users': get_group_users_info(group_id, user_id), }) @logit def tgu_group_user_remove_api(request): """ 旅行团成员移除,管理员主动,团成员被动 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') # 导游唯一标识 user_id = request.POST.get('user_id', '') # 群组校验 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) # 管理员也不允许将自己移除 if admin_id == user_id: return response(GroupStatusCode.ADMIN_CANNOT_HANDLE_SELF) # 群组用户校验 try: group_user = GroupUserInfo.objects.get(group_id=group_id, user_id=user_id, status=True) except GroupUserInfo.DoesNotExist: return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) # 群组用户移除 group_user.user_status = GroupUserInfo.DELETED group_user.deleted_at = tc.utc_datetime() group_user.save() # Redis 群组数据缓存更新 group_users = set_group_users_info(group) # Redis 群组删除集合缓存 r.srem(GROUP_USERS_PASSED_SET % group_id, user_id) r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id) # 移除地理位置信息 r.georem(TOUR_GUIDE_GROUP_GEO_INFO % group_id, user_id) return response(200, 'Tour Guide User Remove Success', u'旅行团成员移除成功', { 'group_id': group_id, 'users': group_users, }) @logit @transaction.atomic def tgu_group_user_update_api(request): """ 旅行团成员信息更新 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') # 导游唯一标识 user_id = request.POST.get('user_id', '') name = request.POST.get('name', '') phone = request.POST.get('phone', '') relative_persons = int(request.POST.get('relative_persons', 0)) authority = bool(int(request.POST.get('authority', 0))) remark = request.POST.get('remark', '') # 群组校验 try: group = GroupInfo.objects.get(group_id=group_id) except GroupInfo.DoesNotExist: return response(GroupStatusCode.GROUP_NOT_FOUND) # 权限校验 if admin_id: if not is_group_subadmin(group_id, admin_id): return response(GroupStatusCode.NOT_GROUP_SUBADMIN) else: if not GroupUserInfo.objects.filter(group_id=group_id, user_id=user_id, status=True).exists(): return response(GroupStatusCode.NOT_GROUP_ADMIN) # 权限 try: group_user = GroupUserInfo.objects.select_for_update().get(group_id=group_id, user_id=user_id, status=True) except GroupUserInfo.DoesNotExist: return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND) # 用户信息更新 # TODO: Whether sync name and phone to UserInfo or not? if name: group_user.name = name if phone: group_user.phone = phone if relative_persons: # TODO & UNDO: Should check not gt GroupInfo.total_persons & App remind group_user.relative_persons = relative_persons if authority: group_user.authority = authority if remark: group_user.remark = remark group_user.save() # Redis 群组用户数据缓存 group_users = set_group_users_info(group) return response(200, 'Tour Guide User Update Success', u'旅行团成员信息更新成功', { 'group_id': group_id, 'group': group.data, 'users': group_users, }) def get_geo_submit_flag(geo_at, gather_at): """ 是否上传过位置字段(即是否失联) """ if geo_at and gather_at: geo_at = tc.utc_string_to_utc_datetime(geo_at, format='%Y-%m-%dT%H:%M:%SZ') gather_at = tc.utc_string_to_utc_datetime(gather_at, format='%Y-%m-%dT%H:%M:%SZ') current_dt = tc.utc_datetime() delta_seconds = tc.total_seconds(gather_at - current_dt) # 距离集合时间超过30分钟是5分钟,15分钟到30分钟是3分钟,15分钟以内是1分钟 for delta, gdt in [(1800, 300), (900, 180), (0, 60)]: if delta_seconds > delta: return tc.total_seconds(current_dt - geo_at) <= gdt return False @logit def tgu_group_user_locations_api(request): """ 旅行团所有成员位置信息 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') # 导游唯一标识 # 权限校验 if not is_group_subadmin(group_id, admin_id): return response(GroupStatusCode.NOT_GROUP_SUBADMIN) # 获取集合经纬度 gather_info = json.loads(r.get(TOUR_GUIDE_GROUP_CUR_GATHER_INFO % group_id) or '{}') # GEO submit dts geo_dts = r.hgetall(TOUR_GUIDE_GROUP_GEO_SUBMIT_DT % group_id) # [['x', 0.33, (2.68220901489e-06, 1.26736058093e-06)], []] locations = r.georadius(TOUR_GUIDE_GROUP_GEO_INFO % group_id, gather_info.get('gather_lon', 0), gather_info.get('gather_lat', 0), '+inf', unit='m', withdist=True, withcoord=True, sort='ASC') # [{'lon': 2.68220901489e-06, 'lat': 26736058093e-06, 'dist': 0.33, etc...}, {}] # 获取旅行团用户 KV 信息 group_users_kv_info = get_group_users_kv_info(group_id) locations = [dict(group_users_kv_info[loc[0]], **{ 'lon': loc[2][0], 'lat': loc[2][1], 'dist': loc[1], 'geo_submited': get_geo_submit_flag(geo_dts.get(loc[0], ''), gather_info.get('gather_at', '')), }) for loc in locations] return response(200, 'Get Tour Guide Group All User Location Success', u'获取旅行团成员地理位置信息成功', { 'group_id': group_id, 'locations': locations, }) @logit def tgu_group_user_location_api(request): """ 旅行团单个成员位置信息 """ group_id = request.POST.get('group_id', '') admin_id = request.POST.get('admin_id', '') # 导游唯一标识 user_id = request.POST.get('user_id', '') # 权限校验 if not is_group_subadmin(group_id, admin_id): return response(GroupStatusCode.NOT_GROUP_SUBADMIN) session_id = r.get(TOUR_GUIDE_GROUP_CUR_SESSION % group_id) locations = r.lrange(TOUR_GUIDE_GROUP_USER_GEO_LIST % (group_id, session_id, user_id), 0, -1) return response(200, 'Get Tour Guide Group User Location Success', u'获取旅行团成员地理位置信息成功', { 'group_id': group_id, 'user_id': user_id, 'locations': [json.loads(loc) for loc in locations] })
kodo - Gogs: Go Git Service

Geen omschrijving

Brightcells: 66a598b30c Makemigrations 7 jaren geleden
..
0001_initial.py e184e7dd5b add api group_create/group_join 10 jaren geleden
0002_groupinfo_session_id.py e184e7dd5b add api group_create/group_join 10 jaren geleden
0003_groupinfo_admin_id.py 7e305483ab add api group_detail/group_lock/group_pass/group_refuse 10 jaren geleden
0004_auto_20151216_2337.py 7467a3e68a add api group_update/group_remove 10 jaren geleden
0005_groupuserinfo_current_id.py f587f0a48f user can just see photo after he joined the group & zh_Hans replace zh_CN in settings.py 10 jaren geleden
0006_groupuserinfo_avatar.py 4afdb94e20 add avatar for GroupUserInfo 10 jaren geleden
0007_auto_20160112_2040.py df1df69fe3 add api upgrade/splash 10 jaren geleden
0008_photocommentinfo.py c72d89f6e5 add api comment_submit_api/comment_list_api/thumbup_submit_api/thumbup_list_api/thumbup_cancel_api 10 jaren geleden
0009_photothumbupinfo.py c72d89f6e5 add api comment_submit_api/comment_list_api/thumbup_submit_api/thumbup_list_api/thumbup_cancel_api 10 jaren geleden
0010_auto_20160120_1830.py a121b75ff2 add db_index=True for status field 10 jaren geleden
0011_auto_20160302_2048.py da2a81fff1 add api pai2_home 10 jaren geleden
0012_groupinfo_group_avatar.py da2a81fff1 add api pai2_home 10 jaren geleden
0013_groupinfo_group_default_avatar.py f6a88c632b add group_default_avatar field for GroupInfo 10 jaren geleden
0014_auto_20160308_2347.py ca727b0362 store/return w/h for photo 10 jaren geleden
0015_groupphotoinfo_avatar.py 88049b12db store/return more field for photo 10 jaren geleden
0016_auto_20160321_1535.py 537bd9bd41 add api group_quit_api 10 jaren geleden
0017_groupphotoinfo_photo_from.py dbea356558 add photo_from field for GroupPhotoInfo and return photo_from for some api 10 jaren geleden
0018_auto_20160417_2246.py d64b3c216b add and return photo_thumbnail2 relative 10 jaren geleden
0019_auto_20160422_1322.py 102152ca4a add api lensman_photo_bought & modify api wx_order_create_api and adjust return field 10 jaren geleden
0020_groupphotoinfo_session_id.py 102152ca4a add api lensman_photo_bought & modify api wx_order_create_api and adjust return field 10 jaren geleden
0021_photocommentinfo_to_uid.py fa36c26ce4 extend param to_uid for comment_submit_api 10 jaren geleden
0022_auto_20160901_1439.py 6199c8f7ad add api lensman_origin_wanted_api/lensman_origin_photo_upload_api 10 jaren geleden
0023_groupinfo_group_initio.py e06dc10006 Make join session group by scan group qrcode fetch group photos initio 9 jaren geleden
0024_auto_20161214_1329.py f724e0f9c0 Add tour guide apis 9 jaren geleden
0025_auto_20161214_1659.py ad69866b26 Add tour guide's name and phone in GroupInfo 9 jaren geleden
0026_auto_20161216_1301.py 034acddb68 Add total_persons for GroupInfo 9 jaren geleden
0027_groupuserinfo_authority.py 88f0697a89 Add authority field for GroupUserInfo 9 jaren geleden
0028_auto_20161220_1815.py 272f181c50 Makemigrations 9 jaren geleden
0029_auto_20161224_1616.py 564ff620d7 Add unique_together = (('group_id', 'user_id'),) for GroupUserInfo 9 jaren geleden
0030_groupinfo_gather_location.py 90d377ee6e Add gather location 9 jaren geleden
0031_groupphotoinfo_photo_md5.py d824fbd441 Add photo_md5 for GroupPhotoInfo 9 jaren geleden
0032_groupinfo_gather_screenshot.py e8cd9652b7 Add gather_screenshot for api tg_group_gather_start_api 9 jaren geleden
0033_groupphotoinfo_photo_id.py 3c6e34823b Add photo_id for GroupPhotoInfo replaced pk 9 jaren geleden
0034_auto_20170411_1156.py 14d5d63e3b Add nomark/origin price for GroupPhotoInfo 9 jaren geleden
0035_groupuserinfo_admin_status.py 9e4ac4fd3b Add admin_status for GroupUserInfo 9 jaren geleden
0036_groupphotoinfo_has_watermark.py 3b92e37156 Add field has_watermark for GroupPhotoInfo 9 jaren geleden
0037_auto_20170821_1600.py bf678fc740 Add unique_together = (('session_id', 'group_from'),) 9 jaren geleden
0038_auto_20170821_1608.py 7060597dd6 Add unique_together = (('group_id', 'user_id', 'photo_md5'),) for GroupPhotoInfo 9 jaren geleden
0039_auto_20170821_1613.py 9f4c919c29 Add unique_together = (('photo_id', 'user_id'),) for PhotoThumbUpInfo 9 jaren geleden
0040_auto_20170825_1342.py e5ad69259f Add unique_together = (('group_id', 'session_id', 'user_id', 'photo_id', 'lensman_photo_id'),) for GroupPhotoOrderInfo 9 jaren geleden
0041_auto_20170825_1342.py e5ad69259f Add unique_together = (('group_id', 'session_id', 'user_id', 'photo_id', 'lensman_photo_id'),) for GroupPhotoOrderInfo 9 jaren geleden
0042_groupphotoinfo_lensman_type.py a6195fa70d Add outtake lensman 9 jaren geleden
0043_auto_20180101_2220.py 9bb56c50cc Makemigrations 8 jaren geleden
0044_auto_20180103_0446.py a7cbbf15a7 Update max_length for CharField 8 jaren geleden
0045_auto_20180930_1159.py 66a598b30c Makemigrations 7 jaren geleden
__init__.py e184e7dd5b add api group_create/group_join 10 jaren geleden