import datetime from celery import shared_task from django.conf import settings from gm_protocol import GmProtocol from gm_types.push.enum import PUSH_INFO_TYPE, AUTOMATED_PUSH from gm_types.gaia import USER_RIGHTS_LEVEL, POINTS_TYPE from utils.rpc import get_rpc_invoker from utils.rpc import logging_exception from user_hierarchy.models import UserEventLog, UserGrowthValue from user_hierarchy.score import get_level_by_value from user_hierarchy.libs.user import rpc_update_user_level gm_protocol = GmProtocol(api_host=settings.BACKEND_API_HOST+'/') @shared_task def process_notify_message(user_id, title='升级提醒', message=None, url=''): # TODO : 处理通知 if settings.INIT_DATA: return try: r = get_rpc_invoker() r['api/notification/create'](uid=user_id, title=title, content=message, url=url).unwrap() except: logging_exception() return @shared_task def process_push_message(user_id, message, extra=None, push_type=None): # TODO: 处理推送 除了更美等级提升,其他场景目前不会触发推送 if settings.INIT_DATA: return try: rpc_client = get_rpc_invoker() rpc_client['push2/push/user/automated_push/uids']( push_type=push_type, user_ids=[user_id], alert=message, extra=extra, ).unwrap() except Exception as e: logging_exception() print(e) return 'ok' @shared_task def process_user_add_value(user_id, version='7.6.19'): # process event that user add value triggered # tips: level may upper or lower user_value = UserEventLog.get_user_value(user_id) try: user_growth = UserGrowthValue.objects.get(user_id=user_id) user_value = user_value if user_value > 0 else 0 # 负值时统一显示为0,同时记录其负值@PM -- eventlog表有负值记录 pre_level = user_growth.level now_level = get_level_by_value(user_value) if pre_level != now_level: user_growth.value = user_value user_growth.level = now_level user_growth.save() if int(now_level) > int(pre_level): _build_level_upper_message(user_id, pre_level, now_level, version) add_user_point(user_id, POINTS_TYPE.LEVEL_UPPER, settings.LEVEL_UPPER_GAIN_POINTS) return _callback_update_user_level(user_id, now_level) user_growth.value = user_value user_growth.save() except UserGrowthValue.DoesNotExist: now_level = get_level_by_value(user_value) UserGrowthValue.objects.create(user_id=user_id, value=user_value, level=now_level) if not now_level == USER_RIGHTS_LEVEL.V1: add_user_point(user_id, POINTS_TYPE.LEVEL_UPPER, settings.LEVEL_UPPER_GAIN_POINTS) def _callback_update_user_level(user_id, level): # call gaia to update user level if settings.INIT_DATA: return user = {'user_id': user_id, 'level': level} rpc_update_user_level([user, ]) def _build_level_upper_message(user_id, pre_level, now_level, version='7.6.19'): title = '升级提醒' message = '快来看!你的更美等级由等级{}升级到了等级{},多了哪些特权呀?——'.format(pre_level, now_level) if version == '7.6.20': from six.moves import urllib_parse as urlparse url_new = urlparse.urljoin( gm_protocol.api_host, 'hybrid/user/rights_v1?user_id={}'.format(user_id) ) url = gm_protocol.get_webview(url_new) elif version >= '7.6.25': url = gm_protocol.get_user_task_center() else: url = gm_protocol.get_user_rights(user_id) extra = { 'type': PUSH_INFO_TYPE.GM_PROTOCOL, 'msgType': 4, 'pushUrl': url, 'push_url': url, } process_notify_message.delay(user_id, title=title, message=message, url=url) process_push_message.delay(user_id, message=message, extra=extra, push_type=AUTOMATED_PUSH.USER_LEVEL_UP) return @shared_task def add_user_point(user_id, point_type, point_v=0): try: r = get_rpc_invoker() r['api/point/add'](user_id=user_id, point_type=point_type, point_v=point_v).unwrap() except: logging_exception() @shared_task def add_user_growth(user_id, event_type, item_id, value, version='7.6.19'): UserEventLog.objects.create( event_type=event_type, related_item_id=item_id, trigger_time=datetime.datetime.now(), value=value, user_id=user_id, ) process_user_add_value(user_id, version)