@@ -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  |