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
# coding: utf-8
"""
各种关于问答的用户召回
"""
from __future__ import absolute_import
from datetime import datetime, timedelta
from celery import shared_task
from django.conf import settings
from gm_types.push import (
PUSH_INFO_TYPE,
AUTOMATED_PUSH,
)
from qa.models.answer import (
InterestForContentUser,
Question,
Answer,
)
from qa.libs import _get_content_text
from utils.push import (
limit_push_count,
push_task_to_device_ids_multi,
)
from utils.protocol import gm_protocol
def query_answers(answer_ids):
answer_id2answer_and_question = dict()
answers = Answer.objects.filter(id__in=answer_ids)
for answer in answers:
question = answer.question
_data = {
'nickname': answer.user.nickname,
'question_id': question.id,
'question_title': question.title,
'answer_count': question.answer_num,
'is_online': question.is_online,
'answer_content': answer.content,
'comment_count': answer.comment_num,
'answer_platform': answer.platform,
}
answer_id2answer_and_question[answer.id] = _data
return answer_id2answer_and_question
def update_interest_for_content_user(pk, status):
"""
status: 0: 未操作,初始值 1:正常完成 2:未找到 3:超过限制
"""
instance = InterestForContentUser.objects.get(id=pk)
if instance:
instance.status=status
instance.save()
@shared_task
def user_interest_in_content_for_callback(sort_index):
"""
WIKI: http://wiki.wanmeizhensuo.com/pages/viewpage.action?pageId=33596077
"""
today = datetime.today()
start_time = today.replace(hour=0, minute=0, second=0, microsecond=0)
end_time = start_time + timedelta(days=1)
push_type = AUTOMATED_PUSH.BASE_USER_INTEREST_FOR_CONTENT
need_push_info = InterestForContentUser.objects.filter(
push_type=push_type,
status=0,
business_type="answer",
related_type="question",
create_time__gt=start_time,
create_time__lt=end_time,
sort_index=sort_index,
)
answer_ids = [info.business_id for info in need_push_info]
answer_id2answer_and_question = query_answers(answer_ids)
for info in need_push_info:
if not settings.USER_INTEREST_IN_CONTENT_FOR_CALLBACK_GRAY_DEVICE_IDS_ALL_OPEN:
if info.device_id not in settings.USER_INTEREST_IN_CONTENT_FOR_CALLBACK_GRAY_DEVICE_IDS:
continue
answer_and_question = answer_id2answer_and_question.get(info.business_id)
if not answer_and_question:
update_interest_for_content_user(info.id, 2)
continue
if not limit_push_count(info.device_id, push_type, max_push_count=3):
update_interest_for_content_user(info.id, 3)
continue
push_url = gm_protocol.get_answer_list(info.business_id)
alert = "@{nickname} 的新回答:{answer_content}".format(
nickname=answer_and_question["nickname"],
answer_content=_get_content_text(answer_and_question["answer_content"])
)
if len(alert) > 25:
alert = "{}...".format(alert[:25])
extra = {
'type': PUSH_INFO_TYPE.GM_PROTOCOL,
'pushUrl': push_url,
'push_url': push_url,
}
others = {
'title': answer_and_question['question_title'],
'alert': alert
}
push_task_to_device_ids_multi(
[info.device_id],
extra=extra,
alert=alert,
others=others,
push_type=push_type
)
update_interest_for_content_user(info.id, 1)