| @@ -33,6 +33,8 @@ urlpatterns += [ | ||
| 33 | 33 | url(r'^l/wx/authorize$', lensman_views.lensman_wx_authorize_api, name='lensman_wx_authorize_api'), # 微信用户授权 | 
| 34 | 34 |  | 
| 35 | 35 | url(r'^l/upload$', lensman_views.lensman_photo_upload_api, name='lensman_photo_upload_api'), # 摄影师照片上传 | 
| 36 | + | |
| 37 | + url(r'^l/brief$', lensman_views.lensman_brief_api, name='lensman_brief_api'), # 摄影师简报 | |
| 36 | 38 | ] | 
| 37 | 39 |  | 
| 38 | 40 | # 群组相关 | 
| @@ -14,11 +14,15 @@ from TimeConvert import TimeConvert as tc | ||
| 14 | 14 |  | 
| 15 | 15 | from account.models import LensmanInfo, UserInfo | 
| 16 | 16 | from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo | 
| 17 | +from message.models import SystemMessageInfo | |
| 18 | +from pay.models import OrderInfo | |
| 17 | 19 | from photo.models import PhotosInfo | 
| 18 | 20 | from utils.error.errno_utils import LensmanStatusCode, UserStatusCode | 
| 19 | 21 | from utils.error.response_utils import response | 
| 22 | +from utils.message_utils import system_messages | |
| 23 | +from utils.page_utils import pagination | |
| 20 | 24 | from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info | 
| 21 | -from utils.redis.rkeys import GROUP_LAST_PHOTO_PK | |
| 25 | +from utils.redis.rkeys import GROUP_LAST_PHOTO_PK, TODAY_INCOME, TODAY_UPLOAD_PHOTO_AMOUNT | |
| 22 | 26 | from utils.thumbnail_utils import make_thumbnail | 
| 23 | 27 | from utils.watermark_utils import watermark_wrap | 
| 24 | 28 |  | 
| @@ -243,6 +247,9 @@ def lensman_photo_upload_api(request): | ||
| 243 | 247 | # 设置群组最后一张照片PK | 
| 244 | 248 | r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) | 
| 245 | 249 |  | 
| 250 | + # 更新今日上传照片数量 | |
| 251 | + r.incr(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, tc.local_string(format='%Y%m%d'))) | |
| 252 | + | |
| 246 | 253 | # 获取从 current_id 到 now 的群组照片列表 | 
| 247 | 254 | # group_photos = GroupPhotoInfo.objects.filter( | 
| 248 | 255 | # group_id=group_id, | 
| @@ -258,3 +265,35 @@ def lensman_photo_upload_api(request): | ||
| 258 | 265 | # 'current_id': latest_photo and latest_photo.pk or current_id, | 
| 259 | 266 | # 'photos': [photo.photo_info(user_id) for photo in group_photos], | 
| 260 | 267 | }) | 
| 268 | + | |
| 269 | + | |
| 270 | +@logit | |
| 271 | +def lensman_brief_api(request): | |
| 272 | +    user_id = request.POST.get('user_id', '') | |
| 273 | + | |
| 274 | + ymd = tc.local_string(format='%Y%m%d') | |
| 275 | + | |
| 276 | + today_income = int(r.get(TODAY_INCOME % (user_id, ymd)) or 0) | |
| 277 | + today_upload = int(r.get(TODAY_UPLOAD_PHOTO_AMOUNT % (user_id, ymd)) or 0) | |
| 278 | + | |
| 279 | + # 摄影师端系统消息 | |
| 280 | + systems = system_messages(user_id, SystemMessageInfo.PAIAI_LENSMAN) | |
| 281 | + systems, left = pagination(systems, 1, 10) | |
| 282 | + systems = [msg.msg_info(user_id) for msg in systems] | |
| 283 | + | |
| 284 | + # 照片购买记录 | |
| 285 | +    orders = OrderInfo.objects.filter(to_uid=user_id, pay_status=OrderInfo.PAID, status=True).order_by('-pk') | |
| 286 | + orders, left = pagination(orders, 1, 10) | |
| 287 | + orders = [order.data(user_id) for order in orders] | |
| 288 | + | |
| 289 | +    data = { | |
| 290 | + 'today_income': today_income, | |
| 291 | + 'today_upload': today_upload, | |
| 292 | + 'avg_income': int(today_income / (today_upload + 1)), | |
| 293 | +        'messages': { | |
| 294 | + 'system': systems, | |
| 295 | + 'orders': orders, | |
| 296 | + } | |
| 297 | + } | |
| 298 | + | |
| 299 | + return response(200, 'Get Lensman Brief Success', u'获取摄影师简报成功', data) | 
| @@ -7,9 +7,9 @@ from account.models import UserInfo | ||
| 7 | 7 | from message.models import SystemMessageDeleteInfo, SystemMessageInfo, SystemMessageReadInfo, UserMessageInfo | 
| 8 | 8 | from utils.error.errno_utils import MessageStatusCode, UserStatusCode | 
| 9 | 9 | from utils.error.response_utils import response | 
| 10 | +from utils.message_utils import system_messages, system_unread_messages | |
| 10 | 11 | from utils.page_utils import pagination | 
| 11 | -from utils.redis.rmessage import (get_system_message_delete_info, get_system_message_read_info, | |
| 12 | - set_system_message_delete_info, set_system_message_read_info) | |
| 12 | +from utils.redis.rmessage import set_system_message_delete_info, set_system_message_read_info | |
| 13 | 13 |  | 
| 14 | 14 |  | 
| 15 | 15 | @logit | 
| @@ -27,14 +27,7 @@ def message_list_api(request): | ||
| 27 | 27 | for message in messages: | 
| 28 | 28 | msg_type = message['msg_type'] | 
| 29 | 29 | if msg_type == UserMessageInfo.SYSTEM: | 
| 30 | - read_message_ids = get_system_message_read_info(user_id) | |
| 31 | - deleted_message_ids = get_system_message_delete_info(user_id) | |
| 32 | - type_unread_messages = SystemMessageInfo.objects.filter( | |
| 33 | - src=SystemMessageInfo.PAIAI_USER, | |
| 34 | - status=True, | |
| 35 | - ).exclude( | |
| 36 | - pk__in=list(set(read_message_ids + deleted_message_ids)), | |
| 37 | - ) | |
| 30 | + type_unread_messages = system_unread_messages(user_id, SystemMessageInfo.PAIAI_USER) | |
| 38 | 31 | else: | 
| 39 | 32 | type_unread_messages = UserMessageInfo.objects.filter( | 
| 40 | 33 | to_uid=user_id, | 
| @@ -63,13 +56,7 @@ def message_type_list_api(request, msg_type): | ||
| 63 | 56 |      num = int(request.POST.get('num', 0) or request.GET.get('num', 0) or settings.MESSAGE_NUM_PER_PAGE) | 
| 64 | 57 |  | 
| 65 | 58 | if msg_type == UserMessageInfo.SYSTEM: | 
| 66 | - deleted_message_ids = get_system_message_delete_info(user_id) | |
| 67 | - type_messages = SystemMessageInfo.objects.filter( | |
| 68 | - src=SystemMessageInfo.PAIAI_USER, | |
| 69 | - status=True, | |
| 70 | - ).exclude( | |
| 71 | - pk__in=deleted_message_ids, | |
| 72 | - ) | |
| 59 | + type_messages = system_messages(user_id, SystemMessageInfo.PAIAI_USER) | |
| 73 | 60 | else: | 
| 74 | 61 | type_messages = UserMessageInfo.objects.filter( | 
| 75 | 62 | to_uid=user_id, | 
| @@ -114,7 +101,7 @@ def message_type_read_api(request, msg_type=None): | ||
| 114 | 101 | if _all == 'true': # 系统消息全部读取 | 
| 115 | 102 | for msg in SystemMessageInfo.objects.filter(src=SystemMessageInfo.PAIAI_USER, status=True): | 
| 116 | 103 | SystemMessageReadInfo.objects.get_or_create(user_id=user_id, msg_id=msg.pk) | 
| 117 | - get_system_message_read_info(user_id) | |
| 104 | + set_system_message_read_info(user_id) | |
| 118 | 105 | else: | 
| 119 | 106 | if pk > 0: # 用户(点赞/评论)消息单个读取 | 
| 120 | 107 | UserMessageInfo.objects.filter(pk=pk, to_uid=user_id).update(read=True) | 
| @@ -15,7 +15,7 @@ from photo.models import PhotosInfo | ||
| 15 | 15 | from utils.error.errno_utils import GroupPhotoStatusCode, OrderStatusCode, UserStatusCode, WithdrawStatusCode | 
| 16 | 16 | from utils.error.response_utils import response | 
| 17 | 17 | from utils.page_utils import pagination | 
| 18 | -from utils.redis.rkeys import LENSMAN_PHOTO_PRICE | |
| 18 | +from utils.redis.rkeys import LENSMAN_PHOTO_PRICE, TODAY_INCOME, TOTAL_INCOME | |
| 19 | 19 | from utils.redis.rorder import set_lensman_order_record | 
| 20 | 20 |  | 
| 21 | 21 |  | 
| @@ -124,40 +124,48 @@ def order_paid_success(order): | ||
| 124 | 124 |  | 
| 125 | 125 | set_lensman_order_record(porder) | 
| 126 | 126 |  | 
| 127 | - if order.to_lid: | |
| 128 | - try: | |
| 129 | - lensman = LensmanInfo.objects.select_for_update().filter(lensman_id=order.to_lid)[0] | |
| 130 | - except IndexError: | |
| 131 | - return | |
| 132 | - | |
| 133 | - lensman.balance += order.total_fee | |
| 134 | - lensman.save() | |
| 135 | - | |
| 136 | - LensmanIncomeExpensesInfo.objects.create( | |
| 137 | - lensman_id=order.to_lid, | |
| 138 | - photo_id=order.photo_id, | |
| 139 | - type=LensmanIncomeExpensesInfo.INCOME, | |
| 140 | - amount=order.total_fee, | |
| 141 | - balance=lensman.balance, | |
| 142 | - remark=u'图片购买', | |
| 143 | - ) | |
| 144 | - elif order.to_uid: | |
| 145 | - try: | |
| 146 | - user = UserInfo.objects.select_for_update().filter(user_id=order.to_uid)[0] | |
| 147 | - except IndexError: | |
| 148 | - return | |
| 149 | - | |
| 150 | - user.balance += order.total_fee | |
| 151 | - user.save() | |
| 152 | - | |
| 153 | - UserIncomeExpensesInfo.objects.create( | |
| 154 | - user_id=order.user_id, | |
| 155 | - photo_id=order.photo_id, | |
| 156 | - type=UserIncomeExpensesInfo.INCOME, | |
| 157 | - amount=order.total_fee, | |
| 158 | - balance=user.balance, | |
| 159 | - remark=u'图片购买', | |
| 160 | - ) | |
| 127 | + # Lensman ==> User | |
| 128 | + # if order.to_lid: | |
| 129 | + # try: | |
| 130 | + # lensman = LensmanInfo.objects.select_for_update().filter(lensman_id=order.to_lid)[0] | |
| 131 | + # except IndexError: | |
| 132 | + # return | |
| 133 | + # | |
| 134 | + # lensman.balance += order.total_fee | |
| 135 | + # lensman.save() | |
| 136 | + # | |
| 137 | + # LensmanIncomeExpensesInfo.objects.create( | |
| 138 | + # lensman_id=order.to_lid, | |
| 139 | + # photo_id=order.photo_id, | |
| 140 | + # type=LensmanIncomeExpensesInfo.INCOME, | |
| 141 | + # amount=order.total_fee, | |
| 142 | + # balance=lensman.balance, | |
| 143 | + # remark=u'图片购买', | |
| 144 | + # ) | |
| 145 | + # elif order.to_uid: | |
| 146 | + | |
| 147 | + to_uid = order.to_uid | |
| 148 | + total_fee = order.total_fee | |
| 149 | + | |
| 150 | + try: | |
| 151 | + user = UserInfo.objects.select_for_update().filter(user_id=to_uid)[0] | |
| 152 | + except IndexError: | |
| 153 | + return | |
| 154 | + | |
| 155 | + user.balance += order.total_fee | |
| 156 | + user.save() | |
| 157 | + | |
| 158 | + r.incr(TOTAL_INCOME % to_uid, total_fee) | |
| 159 | + r.incr(TODAY_INCOME % (to_uid, tc.local_string(format='%Y%m%d')), total_fee) | |
| 160 | + | |
| 161 | + UserIncomeExpensesInfo.objects.create( | |
| 162 | + user_id=to_uid, | |
| 163 | + photo_id=order.photo_id, | |
| 164 | + type=UserIncomeExpensesInfo.INCOME, | |
| 165 | + amount=total_fee, | |
| 166 | + balance=user.balance, | |
| 167 | + remark=u'图片购买', | |
| 168 | + ) | |
| 161 | 169 |  | 
| 162 | 170 |  | 
| 163 | 171 | def order_paid_fail(order): | 
| @@ -16,4 +16,4 @@ def response_data(status_code, message=None, description=None, data={}): | ||
| 16 | 16 |  | 
| 17 | 17 |  def response(status_code, message=None, description=None, data={}): | 
| 18 | 18 | message, description = (status_code.message, status_code.description) if isinstance(status_code, StatusCodeField) else (message, description) | 
| 19 | - return JsonResponse(response_data(status_code, message, description, data)) | |
| 19 | + return JsonResponse(response_data(status_code, message, description, data), safe=False) | 
| @@ -0,0 +1,17 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | +from message.models import SystemMessageInfo | |
| 4 | +from utils.redis.rmessage import get_system_message_delete_info, get_system_message_read_info | |
| 5 | + | |
| 6 | + | |
| 7 | +def system_messages(user_id, src=SystemMessageInfo.PAIAI_USER): | |
| 8 | + """ Not Deleted """ | |
| 9 | + deleted_message_ids = get_system_message_delete_info(user_id) | |
| 10 | + return SystemMessageInfo.objects.filter(src=src, status=True).exclude(pk__in=deleted_message_ids) | |
| 11 | + | |
| 12 | + | |
| 13 | +def system_unread_messages(user_id, src): | |
| 14 | + """ Not Deleted & Read """ | |
| 15 | + read_message_ids = get_system_message_read_info(user_id) | |
| 16 | + deleted_message_ids = get_system_message_delete_info(user_id) | |
| 17 | + return SystemMessageInfo.objects.filter(src=src, status=True).exclude(pk__in=list(set(read_message_ids + deleted_message_ids))) | 
| @@ -30,6 +30,12 @@ LENSMAN_PHOTO_PRICE = 'lensman:photo:price:%s:%s:%s' # STRING,摄影师照片 | ||
| 30 | 30 | LENSMAN_PHOTO_HAGGLE_TIMES = 'lensman:photo:haggle:times:%s:%s:%s' # STRING,摄影师照片砍价次数,photo_id、user_id、photo_type | 
| 31 | 31 | LENSMAN_PHOTO_ORDER_RECORD = 'lensman:photo:order:record:%s:%s' # STRING,摄影师照片购买记录,photo_id、user_id | 
| 32 | 32 |  | 
| 33 | +# 摄影师简报相关 | |
| 34 | +TOTAL_INCOME = 'total:income:%s' # STRING,总收入,user_id | |
| 35 | +TODAY_INCOME = 'today:income:%s:%s' # STRING,今日收入,user_id、tc.local_string(format='%Y%m%d') | |
| 36 | + | |
| 37 | +TODAY_UPLOAD_PHOTO_AMOUNT = 'today:upload:photo:amount:%s:%s' # STRING,今日上传照片数量,user_id、tc.local_string(format='%Y%m%d') | |
| 38 | + | |
| 33 | 39 | # 系统消息相关 | 
| 34 | 40 | SYSTEM_MESSAGE_READ_INFO = 'system:message:read:info:%s' # STRING,系统消息读取信息,user_id | 
| 35 | 41 | SYSTEM_MESSAGE_DELETED_INFO = 'system:message:deleted:info:%s' # STRING,系统消息删除信息,user_id |