1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
__title__ = ''
__author__ = 'xierong@gmei.com'
__mtime__ = '17/11/14'
'''
import datetime
from django.conf import settings
from gm_types.user_hierarchy import EventType
from user_hierarchy.models import UserEventLog
from utils.rpc import get_rpc_invoker
from utils.rpc import logging_exception
from ..manager.event_dispatcher import TaskEvent
from ..tasks import add_user_growth, add_user_point
from .user_task_cache import user_task_cache
class TaskCenter(object):
def __init__(self, user_id, event_type=None, related_item=None, session_key=None):
self.task_cache = user_task_cache
self.user_key = str(user_id)+'_'+datetime.datetime.today().strftime('%Y-%m-%d')
self.task_event = TaskEvent()
self.event_type = event_type
self.user_id = user_id
self.item_id = related_item
self.session_key = session_key
def get_reveal_data(self, only_record_event=False):
re_data = {'growth_value': 0, 'point_value': 0, 'submit_count': 0}
self._get_task_operate_times()
if only_record_event:
return re_data
value_dict = self.task_event.get_reveal_data(self.event_type, self.operate_count, self.user_id)
re_data.update(value_dict)
re_data['submit_count'] = self.operate_count
return re_data
def get_daily_task(self):
# 获取每日任务清单
re_data = {'uni_task': [], 'multi_task': []}
uni_task_k_lst = self.task_event.get_diff_type_task('uni')
multi_task_k_lst = self.task_event.get_diff_type_task('multi')
for item_k in uni_task_k_lst:
item_v = self.task_cache.hget(self.user_key, item_k)
re_data['uni_task'].append({
'sub_title': '+{0}成长值 +{1}美分'.format(self.task_event.event_handler.get(item_k)[self.task_event.GROWTH_KEY],
self.task_event.event_handler.get(item_k)[self.task_event.POINT_KEY]),
'status': 1 if item_v else 0
})
for item_k in multi_task_k_lst:
item_v = self.task_cache.hget(self.user_key, item_k)
item_v_int = int(item_v) if item_v else 0
re_data['multi_task'].append({
'sub_title': '+{0}成长值 +{1}美分'.format(self.task_event.event_handler.get(item_k)[self.task_event.GROWTH_MULTI_KEY],
self.task_event.event_handler.get(item_k)[self.task_event.POINT_MULTI_KEY]),
'achieved_count': item_v_int,
'total_amount': self.task_event.muitl_times,
'status': 1 if item_v_int >= self.task_event.muitl_times else 0
})
return re_data
def _get_task_operate_times(self):
# 返回当前请求的操作次数
operate_count = 1
if self.task_cache.exists(self.user_key):
if self.task_cache.hget(self.user_key, self.event_type):
operate_count = int(self.task_cache.hget(self.user_key, self.event_type)) + 1
self.task_cache.hincrby(self.user_key, self.event_type)
else:
self.task_cache.hset(self.user_key, self.event_type, operate_count)
else:
self.task_cache.hset(self.user_key, self.event_type, operate_count)
today = datetime.datetime.today()
self.task_cache.expire(self.user_key, (today.replace(hour=0, minute=0, second=0) - today).seconds)
self.operate_count = operate_count # 操作次数
def check_daily_max_limit(self, current_value, item_type='point'):
# 返回应该加的具体值
add_v = 0
if item_type == 'point':
today_point_v = get_user_point_today_value(self.session_key)
if today_point_v < settings.POINT_DAILY_LIMIT:
daily_last_v = settings.POINT_DAILY_LIMIT - today_point_v
add_v = daily_last_v if daily_last_v < current_value else current_value
else:
today_growth_v = UserEventLog().get_user_today_value(self.user_id)
if today_growth_v < settings.GROWTH_DAILY_LIMIT:
daily_last_v = settings.GROWTH_DAILY_LIMIT - today_growth_v
add_v = daily_last_v if daily_last_v < current_value else current_value
return add_v
def add_work(self, version):
value_dict = self.task_event.get(self.user_id, self.event_type, self.operate_count)
if self.task_event.is_max_limit:
point_value = self.check_daily_max_limit(value_dict['point_value'], 'point')
growth_value = self.check_daily_max_limit(value_dict['growth_value'], 'growth')
else:
point_value, growth_value = value_dict['point_value'], value_dict['growth_value']
if point_value or growth_value:
type_info = self.task_event.get_matched_real_type(self.event_type, self.operate_count)
real_point_type = type_info['point_type']
real_growth_type = type_info['growth_type']
if real_growth_type:
add_user_growth.delay(self.user_id, real_growth_type, self.item_id, growth_value, version)
if real_point_type:
add_user_point.delay(self.user_id, real_point_type, point_value)
def get_user_point_today_value(session_key):
try:
from helios.rpc import create_default_invoker
today_point_v = create_default_invoker(debug=settings.DEBUG).with_config(
dump_curl=True, session_key=session_key
)['api/pointsinfo/get_daily_value']().unwrap()
except:
logging_exception()
today_point_v = 0
return today_point_v