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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from django.conf import settings
from celery import shared_task
from gm_types.gaia import VIDEO_CODE_STATUS
from gm_types.push import PUSH_INFO_TYPE, AUTOMATED_PUSH
from gm_types.mimas.qa import VIDEO_SOURCE_TYPE
from gm_types.mimas import APPLET_PAGE_FROM, APPLET_SUBSCRIBE_MSG_TYPE
from gm_protocol import GmProtocol
from utils.common import replace_video_url_for_rich_text
from utils.rpc import get_rpc_invoker
from utils.rpc import logging_exception
from utils.push import push_task_to_user_multi, special_push_limit, send_applet_subscribe_msg
from talos.cache.base import community_video_handle_cache
from qa.models.answer import Question, Answer
from talos.models.topic import Problem, VideoLibrary
from talos.models.tractate import TractateReply
from talos.models.tractate.vote import TractateReplyVote
from talos.models.tractate import Tractate
@shared_task
def common_push(uname, uid, topic_id, push_type, question_title=None):
"""
关注的用户发 问题帖、回答帖、直播帖
:param user: 用户对象
:param topic_id: 帖子id
:param push_type:question-问题帖,answer-回答帖,live-直播帖
:return:
"""
if not uid:
return
if uid == settings.SUOZHANG_UID:
return
if uname.startswith(u'更美用户'):
uname = u'匿名美人'
try:
user_ids = get_rpc_invoker()['api/user/get_all_fans'](user_id=uid).unwrap()
except Exception:
logging_exception()
return
alert = u'你关注的{0}发帖了!快去看看ta说了什么~'.format(uname)
if push_type == 'question':
push_url = GmProtocol().get_question_detail(topic_id)
alert = u'你关注的 @{user_name} 发布了新的话题!快去看看 ta 说了什么~'.format(user_name=uname)
p_type = AUTOMATED_PUSH.FOLLOWED_USER_PAID_A_QUESTION
elif push_type == 'answer':
push_url = GmProtocol().get_user_answer_list()
alert = u'你关注的 @{user_name} 刚刚在“{question_name}”下进行了回答'.format(user_name=uname, question_name=question_title)
p_type = AUTOMATED_PUSH.FOLLOWED_USER_IS_ANSWER_A_POST
elif push_type == 'live':
push_url = GmProtocol().get_live_list(topic_id)
p_type = AUTOMATED_PUSH.FOLLOWED_USER_PAID_A_QUESTION
else:
push_url, p_type = '', None
#user_ids = [user_id for user_id in user_ids if special_push_limit(user_id, "user_released_topic", uid)]
if user_ids and push_url:
kwargs = {
"user_ids": user_ids,
"platform": ['android', 'iPhone'],
"alert": alert,
"extra": {
'type': PUSH_INFO_TYPE.GM_PROTOCOL,
'msgType': 4,
'pushUrl': push_url,
'push_url': push_url,
},
"push_type": p_type,
}
push_task_to_user_multi(**kwargs)
@shared_task
def inviter_answered_push_to_user(user_ids, answer_id, nickname):
"""
被邀请者回答完问题,即刻推送消息给邀请者
:param user_ids: list 类型 user_ids
:param answer_id: 被邀请者 回答的id
:param nickname: 被邀请者的昵称
:return:
"""
push_url = GmProtocol().get_answer_list(answer_id)
kwargs = {
"user_ids": user_ids,
"platform": ['android', 'iPhone'],
"alert": u'{nickname}回答了您邀请的问题,赶紧去看看他的解答哦~'.format(nickname=nickname),
"extra": {
'type': PUSH_INFO_TYPE.GM_PROTOCOL,
'msgType': 4,
'pushUrl': push_url,
'push_url': push_url,
},
"labels": {}, # 不知道是否需要埋点,先预留
"push_type": AUTOMATED_PUSH.QUESTION_POSTED_ANSWER,
}
push_task_to_user_multi(**kwargs)
@shared_task
def convert_rich_text_video_url():
"""从缓存中读数据,处理"""
def get_model_param(_type):
if _type == VIDEO_SOURCE_TYPE.QUESTION:
_model = Question
_param = "content"
elif _type == VIDEO_SOURCE_TYPE.ANSWER:
_model = Answer
_param = "content"
elif _type == VIDEO_SOURCE_TYPE.ARTICLE:
_model = Problem
_param = "answer_richtext"
else:
_model = None
_param = None
return _model, _param
need_del_keys = []
for v in community_video_handle_cache.sscan_iter("video_handle_cache", count=1):
if isinstance(v, bytes):
v = v.decode()
_id, _type = v.split(":")
_model, _param = get_model_param(int(_type))
if not _model:
continue
video_dic = dict(VideoLibrary.objects.filter(
source_id=int(_id),
video_type=int(_type),
persistent_status=VIDEO_CODE_STATUS.SUCCESS
).values_list("raw_video_url", "water_video_url"))
if not video_dic:
continue
obj = _model.objects.filter(id=int(_id)).first()
if not obj:
continue
if int(_type) in (VIDEO_SOURCE_TYPE.ANSWER, VIDEO_SOURCE_TYPE.QUESTION):
raw_rich_text = getattr(obj, "content", "")
elif int(_type) in (VIDEO_SOURCE_TYPE.ARTICLE, ):
raw_rich_text = getattr(obj, "answer_richtext", "")
else:
raw_rich_text = ""
new_rich_text, replace_all = replace_video_url_for_rich_text(raw_rich_text, video_dic)
if replace_all:
setattr(obj, _param, new_rich_text)
obj.save(update_fields=[_param])
need_del_keys.append(v)
if need_del_keys:
community_video_handle_cache.srem("video_handle_cache", *need_del_keys)
@shared_task
def vote_applet_push(reply_vote_id):
"""
帖子的评论被点赞,给帖子评论的用户发送小程序推送 自己给自己点赞无效 超过1赞后不发
:param reply_vote: 评论点赞id
:return:
"""
if not reply_vote_id:
return
try:
reply_vote_info = TractateReplyVote.objects.get(id=reply_vote_id, is_online=True)
except TractateReplyVote.DoesNotExist:
return
try:
reply_info = TractateReply.objects.get(id=reply_vote_info.reply_id, is_online=True)
except TractateReply.DoesNotExist:
return
# 自己给自己点赞不用发
if reply_vote_info.user_id == reply_info.user_id:
return
tractate_content = Tractate.objects.filter(id=reply_info.tractate_id).first().content[:10]
data = {
"thing1": {
"value": tractate_content
},
"thing2": {
"value": "你的评论收到了新的支持,快来看看吧>>"
}
}
# 模板id
template_id = settings.APPLET_SUBSCRIBE_MSG.get("vote", "")
# 跳转页面
page = '/packageBBS/pages/posts/main?tractate_id={tractate_id}&&data_type=user_posttop_id={top_id}' \
'&reply_id={reply_id}&from={from_page}&from_action={from_action}'.format(
tractate_id=reply_info.tractate_id,
top_id=reply_info.top_id,
reply_id=reply_info.id,
from_page=APPLET_PAGE_FROM.CARD,
from_action=APPLET_SUBSCRIBE_MSG_TYPE.VOTE
)
# 发送小程序推送
send_applet_subscribe_msg(reply_info.user_id, template_id, data=data, page=page)