modify session_detail_api to deal with group/group_user/group_photo

Brightcells vor 9 Jahren
Ursprung
Commit
a53a8a8312
3 geänderte Dateien mit 84 neuen Zeilen und 24 gelöschten Zeilen
  1. 12 11
      group/views.py
  2. 70 11
      photo/views.py
  3. 2 2
      utils/thumbnail_utils.py

+ 12 - 11
group/views.py

@@ -14,7 +14,7 @@ from message.models import UserMessageInfo
14 14
 from group.serializers import GroupInfoSerializer, GroupUserInfoSerializer, GroupPhotoInfoSerializer
15 15
 
16 16
 from utils.page_utils import pagination
17
-from utils.thumbnail_utils import make_thumb
17
+from utils.thumbnail_utils import make_thumbnail
18 18
 from utils.url_utils import img_url
19 19
 
20 20
 from utils.error.errno_utils import UserStatusCode, GroupStatusCode, GroupUserStatusCode, GroupPhotoStatusCode
@@ -540,21 +540,20 @@ def flyimg_upload_api(request):
540 540
         return response(GroupUserStatusCode.GROUP_USER_NOT_FOUND)
541 541
 
542 542
     if photo:
543
-        _, extension = os.path.splitext(photo.name)
544
-
545
-        uuid = shortuuid.uuid()
546
-        photo_path = 'fly/{uuid}{extension}'.format(uuid=uuid, extension=extension)
547
-        photo_thumbnail_path = 'fly/{uuid}_thumbnail{extension}'.format(uuid=uuid, extension=extension)
543
+        photo_path = 'fly/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=os.path.splitext(photo.name)[1])
544
+        photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
548 545
 
549 546
         if default_storage.exists(photo_path):
550 547
             default_storage.delete(photo_path)
551 548
         default_storage.save(photo_path, photo)
552 549
 
553
-        if default_storage.exists(photo_thumbnail_path):
554
-            default_storage.delete(photo_thumbnail_path)
555
-        default_storage.save(photo_thumbnail_path, photo)
550
+        # if default_storage.exists(photo_thumbnail_path):
551
+        #     default_storage.delete(photo_thumbnail_path)
552
+        # default_storage.save(photo_thumbnail_path, photo)
556 553
 
557
-        photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumb(
554
+        # 群组照片缩略图生成
555
+        photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(
556
+            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
558 557
             os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
559 558
             settings.THUMBNAIL_MAX_WIDTH
560 559
         )
@@ -581,8 +580,10 @@ def flyimg_upload_api(request):
581 580
         group_id=group_id,
582 581
         status=True,
583 582
         pk__gt=max(current_id, group_user.current_id),
583
+    ).order_by(
584
+        '-pk'
584 585
     )
585
-    latest_photo = group_photos.last()
586
+    latest_photo = group_photos.first()
586 587
 
587 588
     return JsonResponse({
588 589
         'status': 200,

+ 70 - 11
photo/views.py

@@ -4,7 +4,7 @@ from django.conf import settings
4 4
 from django.core.files.storage import default_storage
5 5
 from django.db import transaction
6 6
 from django.http import JsonResponse
7
-from django.shortcuts import render, redirect
7
+from django.shortcuts import render
8 8
 
9 9
 from rest_framework import viewsets
10 10
 
@@ -14,13 +14,14 @@ from photo.models import UUIDInfo, PhotosInfo
14 14
 from photo.serializers import PhotosInfoSerializer
15 15
 
16 16
 from utils.ip_utils import ip_addr
17
+from utils.thumbnail_utils import make_thumbnail
17 18
 from utils.watermark_utils import watermark_wrap
18 19
 
19 20
 from utils.error.errno_utils import PhotoStatusCode
20 21
 from utils.error.response_utils import response
21 22
 
22 23
 from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
23
-from utils.redis.rgroup import get_group_info, get_group_users_info
24
+from utils.redis.rgroup import set_group_info, set_group_users_info
24 25
 
25 26
 from curtail_uuid import CurtailUUID
26 27
 
@@ -149,9 +150,10 @@ def session_detail_api(request, session):
149 150
     :return:
150 151
     """
151 152
     user_id = request.POST.get('user_id', '')
153
+    current_id = -1
152 154
 
153 155
     # 判断 user_id 是否存在,如果不存在,则直接分配帐户
154
-    user, created = UserInfo.objects.get_or_create(user_id=user_id, defaults={
156
+    user, user_created = UserInfo.objects.get_or_create(user_id=user_id, defaults={
155 157
         'user_id': CurtailUUID.uuid(UserInfo, 'user_id'),
156 158
         'user_status': UserInfo.ASSIGN,
157 159
         'assign_ip': ip_addr(request),
@@ -160,34 +162,91 @@ def session_detail_api(request, session):
160 162
     user_id = user.user_id
161 163
 
162 164
     # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建
163
-    group, created = GroupInfo.objects.get_or_create(session_id=session, defaults={
165
+    group, group_created = GroupInfo.objects.get_or_create(session_id=session, defaults={
164 166
         'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'),
165 167
         'admin_id': user_id,
168
+        'group_name': user.final_nickname,
169
+        'group_default_avatar': 0,
166 170
         'group_from': GroupInfo.SESSION_GROUP,
167 171
         'session_id': session,
168 172
     })
169 173
     group_id = group.group_id
170 174
 
175
+    # Redis 群组数据缓存
176
+    if group_created:
177
+        group_info = set_group_info(group)
178
+
171 179
     # 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建
172
-    group_user = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
173
-        'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1),
180
+    group_user, group_user_created = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
181
+        # 'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1),
182
+        'current_id': current_id,  # 通过扫描 session_id 二维码进群的用户,默认可以查看该群组所有照片
174 183
         'nickname': user.final_nickname,
175
-        'admin': False,
184
+        'avatar': user.avatar,
185
+        'admin': group_created,
176 186
         'user_status': GroupUserInfo.PASSED,
177 187
         'passed_at': tc.utc_datetime(),
178 188
     })
179 189
 
190
+    # Redis 群组用户数据缓存
191
+    if group_user_created:
192
+        group_users = set_group_users_info(group)
193
+
194
+    # 获取 Session 照片
180 195
     photos = PhotosInfo.objects.filter(session_id=session)
196
+
197
+    #
198
+    if group_created:
199
+        for photo in photos:
200
+            photo_path = photo.p_photo_path
201
+            photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
202
+
203
+            # 群组照片缩略图生成
204
+            photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(
205
+                os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
206
+                os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
207
+                settings.THUMBNAIL_MAX_WIDTH
208
+            )
209
+
210
+            # 群组照片记录创建
211
+            group_photo = GroupPhotoInfo.objects.create(
212
+                group_id=group_id,
213
+                user_id=user_id,
214
+                nickname=user.final_nickname,
215
+                avatar=user.avatar,
216
+                photo_path=photo_path,
217
+                photo_w=photo_w,
218
+                photo_h=photo_h,
219
+                photo_thumbnail_path=photo_thumbnail_path,
220
+                photo_thumbnail_w=photo_thumbnail_w,
221
+                photo_thumbnail_h=photo_thumbnail_h,
222
+                photo_from=GroupPhotoInfo.SESSION_GROUP,
223
+            )
224
+
225
+        # 设置群组最后一张照片PK
226
+        r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
227
+
228
+    # 获取从 current_id 到 now 的群组照片列表
229
+    group_photos = GroupPhotoInfo.objects.filter(
230
+        group_id=group_id,
231
+        status=True,
232
+        pk__gt=group_user.current_id,
233
+    ).order_by(
234
+        '-pk'
235
+    )
236
+    latest_photo = group_photos.first()
237
+
181 238
     return JsonResponse({
182 239
         'status': 200,
183 240
         'message': u'获取照片列表成功',
184 241
         'data': {
185
-            'count': photos.count(),
186
-            'photos': [p.detail for p in photos],
242
+            # 'count': photos.count(),
243
+            # 'photos': [p.detail for p in photos],
244
+            'current_id': latest_photo and latest_photo.pk or current_id,
245
+            'photos': [photo.photo_info for photo in group_photos],
187 246
             'group_id': group_id,
188
-            'group': get_group_info(group_id),
247
+            'group': group_info,
189 248
             'user_id': user_id,
190
-            'users': get_group_users_info(group_id, user_id),
249
+            'users': group_users,
191 250
         }
192 251
     })
193 252
 

+ 2 - 2
utils/thumbnail_utils.py

@@ -8,11 +8,11 @@ except ImportError:
8 8
     import Image
9 9
 
10 10
 
11
-def make_thumb(im_path, max_width=360):
11
+def make_thumbnail(im_path, im_thumbnail_path=None, max_width=360):
12 12
     im = Image.open(im_path)
13 13
     width, height = im.size
14 14
     thumb_width = min(max_width, width)
15 15
     thumb_height = height / width * thumb_width
16 16
     im.thumbnail((thumb_width, thumb_height))
17
-    im.save(im_path, im.format or 'JPEG')
17
+    im.save(im_thumbnail_path or im_path, im.format or 'JPEG')
18 18
     return width, height, thumb_width, thumb_height