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
# coding=utf8
from __future__ import unicode_literals, absolute_import, print_function
from gm_types.error import ERROR as CODES
from gm_types.gaia import (
CONST_STRINGS as const_strings,
TOPIC_TYPE,
)
from gm_types.mimas import NOTICATION_LIST_CATEGORY
from gm_types.push import AUTOMATED_PUSH
from gm_types.user_hierarchy import EventType
from gm_rpcd.all import bind
from talos.tasks import view_increase
from talos.models.topic.topicreply import TopicReply
from talos.services import UserService
from talos.services import get_user_from_context
from utils.rpc import gen, logging_exception, get_current_user
from utils.protocol import gm_protocol
from talos.models.topic import TopicReplyVote, Problem
from user_hierarchy.portal import process_task
from utils.push import vote_push
from talos.tasks.topic import topic_reply_voted_applet_push
from utils.stat_log import SocialStatLogForUserAction
from gm_protocol import GmProtocol
from talos.services.other import get_user_lastest_device_app_version_by_user_id
from utils.common import is_version_gray
@bind('topic/reply/vote')
# @bind_context('talos/topic/reply_vote')
def topic_reply_vote(topic_reply_id):
user = get_current_user()
if not user:
return gen(CODES.LOGIN_REQUIRED)
try:
topic_reply = TopicReply.objects.get(pk=topic_reply_id)
except (TopicReply.DoesNotExist, ValueError):
return gen(CODES.TOPIC_REPLY_NOT_FOUND)
if topic_reply.replied_topic_id is not None:
return gen(CODES.OPERATION_NOT_SUPPORTED)
t, created = TopicReplyVote.objects.get_or_create(
user_id=user.id, topic_reply_id=topic_reply.id
)
if created:
topic_reply.like_num += 1
topic_reply.save()
else:
return gen(CODES.TOPIC_REPLY_HAS_VOTED)
# 给被点赞的评论用户发小程序push
topic_reply_voted_applet_push.delay(t.id)
# TODO: seprate diary/topic replyvote
if created and topic_reply.problem:
t.save()
topic_reply_author = UserService.get_user_by_user_id(user_id=topic_reply.user_id)
topic_reply_author.incr_vote_count()
# add topicreply vote to topic
view_increase.delay(const_strings.TOPIC_VOTE, t.topic_reply.problem_id) # TODO CR 异步任务
elif created and topic_reply.diary:
topic_reply.diary.save()
# add point,growth
growth_value, point_value, submit_count = 0, 0, 0
if not user.id == topic_reply.user_id:
try:
event_data = process_task(user_id=user.id, event_type=EventType.VOTE_MULTI_TIMES, related_item=t.id)
growth_value, point_value = event_data['growth_value'], event_data['point_value']
submit_count = event_data['submit_count']
except:
logging_exception()
# 用户行为埋点,点赞相关
if topic_reply.problem_id:
topic = Problem.objects.filter(pk=topic_reply.problem_id).only("id", "diary_id", "topic_type").first()
_topic_type = topic.topic_type
if _topic_type in [TOPIC_TYPE.ASK, TOPIC_TYPE.SHARE, TOPIC_TYPE.TOPIC]: # 日记帖
_stat_log_data = {
"user_id": user.id,
"content_id": topic.diary_id,
"content_type": SocialStatLogForUserAction.CONTENT_TYPE.diary
}
elif _topic_type in [TOPIC_TYPE.USER_ARTICLE, TOPIC_TYPE.COLUMN_ARTICLE]: # 专栏
_stat_log_data = {
"user_id": user.id,
"content_id": topic.id,
"content_type": SocialStatLogForUserAction.CONTENT_TYPE.article
}
else:
_stat_log_data = {}
if _stat_log_data:
SocialStatLogForUserAction.stat_log_for_like(**_stat_log_data)
# 增加日记本评论点赞发送push v7715 产品: 连鑫
push_url = gm_protocol.get_comment_detail(id=topic_reply_id, topic_id=topic_reply.problem_id)
user_id = topic_reply.user_id
version = get_user_lastest_device_app_version_by_user_id(user_id)
# 推送跳转到消息页的赞列表
if is_version_gray(version, '7.29.0'):
push_url = GmProtocol().vote_or_favor_list(
segment_index=NOTICATION_LIST_CATEGORY.VOTE,
new_vote=True,
)
vote_push(user_id=user_id, push_url=push_url, alert=u'又有人给你点赞啦!快来看看是谁被你迷倒了~!', push_type=AUTOMATED_PUSH.TOPIC_REPLY_GET_VOTE)
return {'growth_value': growth_value, 'point_value': point_value, 'submit_count': submit_count}
@bind('topic/reply/cancel_vote')
def topic_reply_cancel_vote(topic_reply_id):
user = get_current_user()
if not user:
return gen(CODES.LOGIN_REQUIRED)
try:
topic_reply = TopicReply.objects.get(pk=topic_reply_id)
except TopicReply.DoesNotExist:
return gen(CODES.TOPIC_NOT_FOUND)
try:
rel = TopicReplyVote.objects.get(user_id=user.id, topic_reply_id=topic_reply.id)
rel.delete()
topic_reply.like_num -= 1
topic_reply.save()
topic_reply_author = UserService.get_user_by_user_id(user_id=topic_reply.user_id)
topic_reply_author.decr_vote_count()
return gen(CODES.SUCCESS)
except TopicReplyVote.DoesNotExist:
return gen(CODES.OPERATION_NOT_SUPPORTED)