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