'group_id': row[0],
'group_name': row[1],
@@ -12,6 +12,11 @@ from utils.error.response_utils import response |
||
| 12 | 12 |
|
| 13 | 13 |
|
| 14 | 14 |
def message_list_api(request): |
| 15 |
+ """ |
|
| 16 |
+ 消息列表 |
|
| 17 |
+ :param request: |
|
| 18 |
+ :return: |
|
| 19 |
+ """ |
|
| 15 | 20 |
user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
|
| 16 | 21 |
|
| 17 | 22 |
messages = UserMessageInfo.MESSAGE_TYPE_INFO |
@@ -38,6 +43,12 @@ def message_list_api(request): |
||
| 38 | 43 |
|
| 39 | 44 |
|
| 40 | 45 |
def message_type_list_api(request, msg_type): |
| 46 |
+ """ |
|
| 47 |
+ 分类消息列表 |
|
| 48 |
+ :param request: |
|
| 49 |
+ :param msg_type: |
|
| 50 |
+ :return: |
|
| 51 |
+ """ |
|
| 41 | 52 |
user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
|
| 42 | 53 |
page = int(request.POST.get('page', 0) or request.GET.get('page', 0) or 1)
|
| 43 | 54 |
num = int(request.POST.get('num', 0) or request.GET.get('num', 0) or settings.MESSAGE_NUM_PER_PAGE)
|
@@ -62,6 +73,11 @@ def message_type_list_api(request, msg_type): |
||
| 62 | 73 |
|
| 63 | 74 |
|
| 64 | 75 |
def message_read_api(request): |
| 76 |
+ """ |
|
| 77 |
+ 消息读取 |
|
| 78 |
+ :param request: |
|
| 79 |
+ :return: |
|
| 80 |
+ """ |
|
| 65 | 81 |
pk = int(request.POST.get('pk', 0) or request.GET.get('pk', 0) or -1)
|
| 66 | 82 |
user_id = request.POST.get('user_id', '') or request.GET.get('user_id', '')
|
| 67 | 83 |
|
@@ -6,6 +6,11 @@ from operation.models import LatestAppInfo, SplashInfo |
||
| 6 | 6 |
|
| 7 | 7 |
|
| 8 | 8 |
def upgrade_api(request): |
| 9 |
+ """ |
|
| 10 |
+ APP 升级 |
|
| 11 |
+ :param request: |
|
| 12 |
+ :return: |
|
| 13 |
+ """ |
|
| 9 | 14 |
try: |
| 10 | 15 |
appinfo = LatestAppInfo.objects.all()[0].data |
| 11 | 16 |
except IndexError: |
@@ -21,6 +26,11 @@ def upgrade_api(request): |
||
| 21 | 26 |
|
| 22 | 27 |
|
| 23 | 28 |
def splash_api(request): |
| 29 |
+ """ |
|
| 30 |
+ 启动页面 |
|
| 31 |
+ :param request: |
|
| 32 |
+ :return: |
|
| 33 |
+ """ |
|
| 24 | 34 |
splashes = SplashInfo.objects.all() |
| 25 | 35 |
splashes = [splash.data for splash in splashes] |
| 26 | 36 |
|
@@ -22,6 +22,11 @@ wxpay = WeChatPay(WECHAT['appID'], WECHAT['apiKey'], WECHAT['mchID']) |
||
| 22 | 22 |
|
| 23 | 23 |
@transaction.atomic |
| 24 | 24 |
def wx_order_create_api(request): |
| 25 |
+ """ |
|
| 26 |
+ 订单创建 |
|
| 27 |
+ :param request: |
|
| 28 |
+ :return: |
|
| 29 |
+ """ |
|
| 25 | 30 |
from_uid = request.POST.get('from_uid', '')
|
| 26 | 31 |
to_lid = request.POST.get('to_lid', '')
|
| 27 | 32 |
to_uid = request.POST.get('to_uid', '')
|
@@ -71,6 +76,11 @@ def order_paid_success(order): |
||
| 71 | 76 |
|
| 72 | 77 |
@transaction.atomic |
| 73 | 78 |
def wx_notify_url_api(request): |
| 79 |
+ """ |
|
| 80 |
+ 支付异步通知回调地址 |
|
| 81 |
+ :param request: |
|
| 82 |
+ :return: |
|
| 83 |
+ """ |
|
| 74 | 84 |
try: |
| 75 | 85 |
data = xmltodict.parse(request.body)['xml'] |
| 76 | 86 |
except xmltodict.ParsingInterrupted: |
@@ -19,6 +19,9 @@ from utils.watermark_utils import watermark_wrap |
||
| 19 | 19 |
from utils.error.errno_utils import PhotoStatusCode |
| 20 | 20 |
from utils.error.response_utils import response |
| 21 | 21 |
|
| 22 |
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK |
|
| 23 |
+from utils.redis.rgroup import get_group_info, get_group_users_info |
|
| 24 |
+ |
|
| 22 | 25 |
from curtail_uuid import CurtailUUID |
| 23 | 26 |
|
| 24 | 27 |
from TimeConvert import TimeConvert as tc |
@@ -27,7 +30,15 @@ import os |
||
| 27 | 30 |
import shortuuid |
| 28 | 31 |
|
| 29 | 32 |
|
| 33 |
+r = settings.REDIS_CACHE |
|
| 34 |
+ |
|
| 35 |
+ |
|
| 30 | 36 |
def uuid_init(request): |
| 37 |
+ """ |
|
| 38 |
+ 生成唯一标识 |
|
| 39 |
+ :param request: |
|
| 40 |
+ :return: |
|
| 41 |
+ """ |
|
| 31 | 42 |
num = int(request.GET.get('num', 1000))
|
| 32 | 43 |
|
| 33 | 44 |
for i in xrange(num): |
@@ -43,6 +54,11 @@ def uuid_init(request): |
||
| 43 | 54 |
# curl -X POST -F user=xxxxxxx -F num=100 http://api.pai.ai/uuid |
| 44 | 55 |
@transaction.atomic |
| 45 | 56 |
def uuid(request): |
| 57 |
+ """ |
|
| 58 |
+ 获取唯一标识 |
|
| 59 |
+ :param request: |
|
| 60 |
+ :return: |
|
| 61 |
+ """ |
|
| 46 | 62 |
lensman_id = request.POST.get('user', '')
|
| 47 | 63 |
num = int(request.POST.get('num', 100))
|
| 48 | 64 |
|
@@ -72,6 +88,11 @@ def uuid(request): |
||
| 72 | 88 |
# |
| 73 | 89 |
# curl -X POST -F user=xxxxxxx -F session=xxxxxxx -F photo_id=xxxxxxx -F photo=@xxxxxxx.jpg http://api.pai.ai/photos/upload |
| 74 | 90 |
def upload_photo(request): |
| 91 |
+ """ |
|
| 92 |
+ 上传图片 |
|
| 93 |
+ :param request: |
|
| 94 |
+ :return: |
|
| 95 |
+ """ |
|
| 75 | 96 |
lensman_id = request.POST.get('user', '')
|
| 76 | 97 |
session_id = request.POST.get('session', '')
|
| 77 | 98 |
photo_id = request.POST.get('photo_id', '')
|
@@ -121,6 +142,12 @@ def upload_photo(request): |
||
| 121 | 142 |
|
| 122 | 143 |
|
| 123 | 144 |
def session_detail_api(request, session): |
| 145 |
+ """ |
|
| 146 |
+ Session 详情 |
|
| 147 |
+ :param request: |
|
| 148 |
+ :param session: |
|
| 149 |
+ :return: |
|
| 150 |
+ """ |
|
| 124 | 151 |
user_id = request.POST.get('user_id', '')
|
| 125 | 152 |
|
| 126 | 153 |
# 判断 user_id 是否存在,如果不存在,则直接分配帐户 |
@@ -142,9 +169,8 @@ def session_detail_api(request, session): |
||
| 142 | 169 |
group_id = group.group_id |
| 143 | 170 |
|
| 144 | 171 |
# 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建 |
| 145 |
- group_photo = GroupPhotoInfo.objects.filter(group_id=group_id).last() |
|
| 146 | 172 |
group_user = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
|
| 147 |
- 'current_id': group_photo and group_photo.id or -1, |
|
| 173 |
+ 'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1), |
|
| 148 | 174 |
'nickname': user.final_nickname, |
| 149 | 175 |
'admin': False, |
| 150 | 176 |
'user_status': GroupUserInfo.PASSED, |
@@ -159,9 +185,9 @@ def session_detail_api(request, session): |
||
| 159 | 185 |
'count': photos.count(), |
| 160 | 186 |
'photos': [p.detail for p in photos], |
| 161 | 187 |
'group_id': group_id, |
| 162 |
- 'group': group.data, |
|
| 188 |
+ 'group': get_group_info(group_id), |
|
| 163 | 189 |
'user_id': user_id, |
| 164 |
- 'users': group.users(user_id), |
|
| 190 |
+ 'users': get_group_users_info(group_id, user_id), |
|
| 165 | 191 |
} |
| 166 | 192 |
}) |
| 167 | 193 |
|
@@ -45,7 +45,6 @@ class GroupStatusCode(BaseStatusCode): |
||
| 45 | 45 |
NO_REFUSE_PERMISSION = StatusCodeField(402009, u'No Refuse Permission', description=u'没有拒绝权限') |
| 46 | 46 |
DUPLICATE_JOIN_REQUEST = StatusCodeField(402010, u'Duplicate Join Request', description=u'重复加群申请') |
| 47 | 47 |
JOIN_REQUEST_NOT_FOUND = StatusCodeField(402011, u'Join Request Not Found', description=u'加群申请不存在') |
| 48 |
- GROUP_USER_NOT_FOUND = StatusCodeField(402012, u'Group User Not Found', description=u'该用户不在群组') |
|
| 49 | 48 |
|
| 50 | 49 |
|
| 51 | 50 |
class GroupUserStatusCode(BaseStatusCode): |
@@ -6,6 +6,7 @@ from django.http import JsonResponse |
||
| 6 | 6 |
def response(status_code, data={}):
|
| 7 | 7 |
return JsonResponse({
|
| 8 | 8 |
'status': status_code, |
| 9 |
- 'message': status_code.description, |
|
| 9 |
+ 'message': status_code.message, |
|
| 10 |
+ 'description': status_code.description, |
|
| 10 | 11 |
'data': data, |
| 11 | 12 |
}) |
@@ -1,7 +0,0 @@ |
||
| 1 |
-# -*- coding: utf-8 -*- |
|
| 2 |
- |
|
| 3 |
-# 用户相关 |
|
| 4 |
-PROFILE_USER_INFO = 'profile:user:info:%s' # 用户信息,uid |
|
| 5 |
- |
|
| 6 |
-# 群组相关 |
|
| 7 |
-GROUP_INFO = 'group:info:%s' # 群组信息,group_id |
@@ -0,0 +1,33 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+from django.conf import settings |
|
| 4 |
+ |
|
| 5 |
+from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo |
|
| 6 |
+ |
|
| 7 |
+from utils.redis.rkeys import GROUP_USERS_APPLYING_SET, GROUP_USERS_PASSED_SET, GROUP_USERS_REFUSED_SET, GROUP_USERS_DELETED_SET |
|
| 8 |
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK |
|
| 9 |
+ |
|
| 10 |
+ |
|
| 11 |
+r = settings.REDIS_CACHE |
|
| 12 |
+ |
|
| 13 |
+ |
|
| 14 |
+def retrieve_redis_data(): |
|
| 15 |
+ # 群组/群组照片相关 |
|
| 16 |
+ groups = GroupInfo.objects.filter(status=True) |
|
| 17 |
+ for group in groups: |
|
| 18 |
+ group_photo = GroupPhotoInfo.objects.filter(group_id=group.group_id).last() |
|
| 19 |
+ # 设置群组最后一张照片PK |
|
| 20 |
+ r.set(GROUP_LAST_PHOTO_PK % group.group_id, group_photo and group_photo.pk or -1) |
|
| 21 |
+ |
|
| 22 |
+ # 群组用户相关 |
|
| 23 |
+ group_users = GroupUserInfo.objects.filter(status=True) |
|
| 24 |
+ for group_user in group_users: |
|
| 25 |
+ group_id, user_id = group_user.group_id, group_user.user_id |
|
| 26 |
+ if group_user.user_status == GroupUserInfo.PASSED: |
|
| 27 |
+ r.sadd(GROUP_USERS_PASSED_SET % group_id, user_id) |
|
| 28 |
+ elif group_user.user_status == GroupUserInfo.DELETED: |
|
| 29 |
+ r.sadd(GROUP_USERS_DELETED_SET % group_id, user_id) |
|
| 30 |
+ elif group_user.user_status == GroupUserInfo.APPLYING: |
|
| 31 |
+ r.sadd(GROUP_USERS_APPLYING_SET % group_id, user_id) |
|
| 32 |
+ elif group_user.user_status == GroupUserInfo.REFUSED: |
|
| 33 |
+ r.sadd(GROUP_USERS_REFUSED_SET % group_id, user_id) |
@@ -0,0 +1,68 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+from django.conf import settings |
|
| 4 |
+from django.core.serializers.json import DjangoJSONEncoder |
|
| 5 |
+ |
|
| 6 |
+from utils.redis.rkeys import GROUP_INFO, GROUP_USERS_INFO, GROUP_LAST_PHOTO_PK |
|
| 7 |
+ |
|
| 8 |
+import json |
|
| 9 |
+ |
|
| 10 |
+ |
|
| 11 |
+r = settings.REDIS_CACHE |
|
| 12 |
+ |
|
| 13 |
+ |
|
| 14 |
+# 群组信息相关 |
|
| 15 |
+ |
|
| 16 |
+ |
|
| 17 |
+def set_group_info(group): |
|
| 18 |
+ """ 设置群组信息 """ |
|
| 19 |
+ group_data = group.data |
|
| 20 |
+ r.set(GROUP_INFO % group.group_id, json.dumps(group_data, cls=DjangoJSONEncoder)) |
|
| 21 |
+ return group_data |
|
| 22 |
+ |
|
| 23 |
+ |
|
| 24 |
+def set_group_info_by_id(group_id): |
|
| 25 |
+ """ 设置群组信息 """ |
|
| 26 |
+ from group.models import GroupInfo |
|
| 27 |
+ try: |
|
| 28 |
+ group = GroupInfo.objects.get(group_id=group_id) |
|
| 29 |
+ except GroupInfo.DoesNotExist: |
|
| 30 |
+ return {}
|
|
| 31 |
+ return set_group_info(group) |
|
| 32 |
+ |
|
| 33 |
+ |
|
| 34 |
+def get_group_info(group_id): |
|
| 35 |
+ """ 获取群组信息 """ |
|
| 36 |
+ return json.loads(r.get(GROUP_INFO % group_id) or '{}') or set_group_info_by_id(group_id)
|
|
| 37 |
+ |
|
| 38 |
+ |
|
| 39 |
+# 群组用户信息相关 |
|
| 40 |
+ |
|
| 41 |
+ |
|
| 42 |
+def set_group_users_info(group): |
|
| 43 |
+ """ 设置群组用户信息 """ |
|
| 44 |
+ group_users = group.users(admin=False) |
|
| 45 |
+ r.set(GROUP_USERS_INFO % group.group_id, json.dumps({
|
|
| 46 |
+ 'group_users': group_users, |
|
| 47 |
+ 'admin_id': group.admin_id, |
|
| 48 |
+ }, cls=DjangoJSONEncoder)) |
|
| 49 |
+ return group_users |
|
| 50 |
+ |
|
| 51 |
+ |
|
| 52 |
+def set_group_users_info_by_id(group_id): |
|
| 53 |
+ """ 设置群组用户信息 """ |
|
| 54 |
+ from group.models import GroupInfo |
|
| 55 |
+ try: |
|
| 56 |
+ group = GroupInfo.objects.get(group_id=group_id) |
|
| 57 |
+ except GroupInfo.DoesNotExist: |
|
| 58 |
+ return {}
|
|
| 59 |
+ return set_group_users_info(group) |
|
| 60 |
+ |
|
| 61 |
+ |
|
| 62 |
+def get_group_users_info(group_id, user_id): |
|
| 63 |
+ """ 获取群组用户信息 """ |
|
| 64 |
+ group_users_data = json.loads(r.get(GROUP_USERS_INFO % group_id) or '{}') or set_group_users_info_by_id(group_id)
|
|
| 65 |
+ group_users, admin_id = group_users_data.get('group_users', {}), group_users_data.get('admin_id', '')
|
|
| 66 |
+ if group_users and user_id != admin_id: |
|
| 67 |
+ [group_users.pop(k) for k in ['applying_count', 'applying']] |
|
| 68 |
+ return group_users |
@@ -0,0 +1,17 @@ |
||
| 1 |
+# -*- coding: utf-8 -*- |
|
| 2 |
+ |
|
| 3 |
+# 用户相关 |
|
| 4 |
+PROFILE_INFO = 'profile:info:%s' # STRING,用户信息,uid |
|
| 5 |
+ |
|
| 6 |
+# 群组相关 |
|
| 7 |
+GROUP_INFO = 'group:info:%s' # STRING,群组信息,group_id |
|
| 8 |
+ |
|
| 9 |
+# 群组用户相关 |
|
| 10 |
+GROUP_USERS_INFO = 'group:users:info:%s' # STRING,群组用户信息,group_id |
|
| 11 |
+GROUP_USERS_APPLYING_SET = 'group:users:applying:set:%s' # SET,群组用户申请集合,group_id |
|
| 12 |
+GROUP_USERS_PASSED_SET = 'group:users:passed:set:%s' # SET,群组用户通过集合,group_id |
|
| 13 |
+GROUP_USERS_REFUSED_SET = 'group:users:refused:set:%s' # SET,群组用户拒绝集合,group_id |
|
| 14 |
+GROUP_USERS_DELETED_SET = 'group:users:deleted:set:%s' # SET,群组用户移除集合,group_id |
|
| 15 |
+ |
|
| 16 |
+# 群组照片相关 |
|
| 17 |
+GROUP_LAST_PHOTO_PK = 'group:last:photo:pk:%s' # STRING,群组最后一张照片PK,group_id |