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
# coding: utf-8
import datetime
from django.conf import settings
from django.db import transaction
from gm_types.gaia import DIARY_ORDER_TYPE, DIARY_OPERATE
from gm_types.gaia import MEMBERSHIP_LEVEL
from social.models import SocialInfo
from talos.libs.datetime_utils import (
get_humanize_datetime,
get_timestamp_or_none
)
from talos.libs.image_utils import get_full_path
from talos.models.diary import Diary
from talos.services import UserService
from talos.tools.user_tool import (
get_auth_type_by_userid,
)
from utils.rpc import rpc_client
from .es_helpers import get_objects_from_queryset_and_pk_list
def get_diary_by_id(diary_id):
"""
NOTE:
根据diary_id获取diary信息
:return:
"""
try:
diary = Diary.objects.get(id=diary_id)
return diary
except Diary.DoesNotExist:
return None
def get_diary_info_for_index(diary_ids, user):
if not diary_ids:
return []
diaries = get_objects_from_queryset_and_pk_list(
Diary.objects.all().prefetch_related("topics"),
diary_ids,
)
result = []
user_ids = [d.user_id for d in diaries if d.user_id]
diary_author_dict = UserService.get_users_by_user_ids(user_ids)
social_info = None
if user:
social_info = SocialInfo(uid=user.id)
for diary in diaries:
cover = diary.cover
if not cover:
continue
latest_topic = diary.latest_topic
title = latest_topic.title if latest_topic else ''
content = latest_topic.answer if latest_topic else ''
diary_author = diary_author_dict.get(diary.user_id)
# TODO: use diary.get_diary_info
diary_data = {
'title_style_type': diary.title_style_type,
'title': title,
'content': content,
'diary_id': diary.id,
'diary_num': diary.diary_num,
# 'city': get_city_name_by_user(diary.user),
'user_id': diary.user.id,
'user_portrait': diary_author and diary_author.portrait or '',
'user_nickname': diary_author and diary_author.nickname or '',
'author_type': get_auth_type_by_userid(diary.user.id),
'date': get_humanize_datetime(diary.last_modified),
'last_modified': get_timestamp_or_none(diary.last_modified),
'reply_num': diary.reply_num,
'vote_num': diary.vote_num,
'tags': diary.tags_new_era,
'images': cover,
'view_num': diary.view_num,
'is_voted': diary.is_voted_by(user),
'is_following': social_info and social_info.is_following_user(uid=diary.user.id) or False,
'latest_topic_id': latest_topic and latest_topic.id or 0,
'membership_level': diary_author and diary_author.membership_level or MEMBERSHIP_LEVEL.NORMAL,
'author': {
'vote_num_gained': diary_author and diary_author.vote_count,
'topic_num_posted': diary_author and diary_author.topic_count,
},
'is_online': diary.is_online,
}
result.append(diary_data)
return result
def get_diaries_by_tags(tag_ids, offset=0, size=10,
sort_type=DIARY_ORDER_TYPE.HOT):
filters = {'tag_ids': tag_ids}
diaries_info = rpc_client['api/diary/filter_diary'](
offset=offset, size=size, sort_type=sort_type, filters=filters
).unwrap()
ids = diaries_info['diary_ids']
diaries = get_objects_from_queryset_and_pk_list(
Diary.objects.filter(is_online=True), pk_list=ids
)
def diary_content(diary):
latest_topic = diary.topics.filter(flag='n', is_online=True).last()
content = latest_topic.answer if latest_topic else ''
return content
diaries = [
{
'diary_id': diary.id,
'diary_cover': (
diary.post_operation_image
if diary.post_operation_image
else diary.newest_cover()
),
'diary_vote_num': diary.vote_num,
'content': diary_content(diary),
'tags': diary.tags_new_era,
'images': diary.cover,
} for diary in diaries
]
return diaries
def clean_video_url(video_url):
return video_url.replace(settings.VIDEO_HOST, '')
def set_diary_cover(cover, diary):
if cover:
with transaction.atomic():
cover = get_full_path(cover)
pre_images = diary.pre_operation_images.all()
for image in pre_images:
if image.image_url == cover or image.cover_image_url == cover:
image.is_cover = True
else:
image.is_cover = False
image.save()
def set_pre_operation_images(pre_operation_images, cover, diary):
if pre_operation_images:
taken_time = datetime.datetime.now()
has_cover = False
for image in pre_operation_images:
if not image.get('image', ''):
break
if has_cover:
is_cover = False
else:
is_cover = False if image['image'] != cover else True
if is_cover:
has_cover = True
diary.pre_operation_images.create(
image_url=image['image'], taken_time=taken_time,
is_cover=is_cover, cover_image_url=image.get('modified_image_url'))
# 记录操作 UPDATE_INFO
diary.set_diary_operate(DIARY_OPERATE.UPDATE_INFO)
def set_pre_operation_images_v1(pre_operation_images, cover, diary):
if pre_operation_images:
diary.pre_operation_images.clear()
set_pre_operation_images(pre_operation_images, cover, diary)