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
from collections import defaultdict
from data_sync.utils import to_epoch, tzlc
from qa.models.answer import AnswerTop, QuestionTag
from utils.rpc import get_rpc_invoker
rpc = get_rpc_invoker()
def get_qa_tops(pks):
results = []
queryset = AnswerTop.objects.filter(id__in=pks)
question_ids = list(filter(None, queryset.values_list("question_id", flat=True)))
q_top_tags = defaultdict(list)
for q_id, t_id in QuestionTag.objects.filter(question_id__in=question_ids).values_list("question_id", "tag"):
q_top_tags[q_id].append(t_id)
for qa_top in queryset:
_c_time = tzlc(qa_top.create_time)
_s_time = tzlc(qa_top.start_time)
_e_time = tzlc(qa_top.end_time)
_data = {
"id": qa_top.id,
"question_id": qa_top.question_id,
"answer_id": qa_top.answer_id,
"top_type": qa_top.top_type,
"enable": qa_top.enable,
"create_time": _c_time,
"start_time": _s_time,
"end_time": _e_time,
"create_time_epoch": to_epoch(_c_time),
"start_time_epoch": to_epoch(_s_time),
"end_time_epoch": to_epoch(_e_time),
}
tag_ids = q_top_tags.get(qa_top.question_id, [])
_data["tag_ids"] = tag_ids
_data['closure_tag_ids'] = rpc['api/tag/closure_tags'](tag_ids=tag_ids) if tag_ids else []
results.append(_data)
for result in results:
if not isinstance(result['closure_tag_ids'], list):
result['closure_tag_ids'] = list(map(lambda tag: tag['id'], result['closure_tag_ids'].unwrap()))
return results