#!/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