add api lensman_login_api/lensman_upload_photo_api

Brightcells 9 ans auparavant
Parent
Commettre
d3fd6adf70
5 fichiers modifiés avec 212 ajouts et 5 suppressions
  1. 2 0
      account/models.py
  2. 9 1
      api/urls.py
  3. 1 1
      group/admin.py
  4. 199 0
      group/lensman_views.py
  5. 1 3
      photo/views.py

+ 2 - 0
account/models.py

@@ -176,6 +176,8 @@ class UserInfo(CreateUpdateMixin):
176 176
             return self.nickname
177 177
         elif self.user_from == self.GUEST_USER:
178 178
             return self.nickname
179
+        elif self.user_from == self.LENSMAN_USER:
180
+            return self.name
179 181
         return self.nickname
180 182
 
181 183
     @property

+ 9 - 1
api/urls.py

@@ -4,6 +4,7 @@ from django.conf.urls import url
4 4
 
5 5
 from account import views as account_views
6 6
 from group import views as group_views
7
+from group import lensman_views
7 8
 from message import views as message_views
8 9
 from operation import views as op_views
9 10
 from pay import views as pay_views
@@ -24,6 +25,12 @@ urlpatterns = [
24 25
     url(r'^u/guest/login$', account_views.guest_login_api, name='guest_login_api'),  # 游客登录
25 26
 ]
26 27
 
28
+# 摄影师相关
29
+urlpatterns += [
30
+    url(r'^l/login$', lensman_views.lensman_login_api, name='lensman_login_api'),  # 摄影师登录
31
+    url(r'^l/photos/upload$', lensman_views.lensman_upload_photo_api, name='lensman_upload_photo_api'),  # 摄影师上传照片
32
+]
33
+
27 34
 # 群组相关
28 35
 urlpatterns += [
29 36
     url(r'^g/create$', group_views.group_create_api, name='group_create_api'),  # 群组创建
@@ -65,7 +72,8 @@ urlpatterns += [
65 72
 urlpatterns += [
66 73
     url(r'^uuid_init$', photo_views.uuid_init, name='uuid_init'),  # 生成唯一标识
67 74
     url(r'^uuid$', photo_views.uuid, name='uuid'),  # 获取唯一标识
68
-    url(r'^photos/upload$', photo_views.upload_photo, name='upload_photo'),  # 上传图片
75
+    url(r'^photos/upload$', photo_views.upload_photo, name='upload_photo'),  # 摄影师照片上传
76
+    # url(r'^photos/raw/upload$', photo_views.upload_raw_photo, name='upload_raw_photo'),  # 摄影师高清照片上传
69 77
 ]
70 78
 
71 79
 # 二维码相关

+ 1 - 1
group/admin.py

@@ -7,7 +7,7 @@ from group.models import (GroupInfo, GroupPhotoInfo, GroupPhotoOrderInfo, GroupU
7 7
 
8 8
 
9 9
 class GroupInfoAdmin(admin.ModelAdmin):
10
-    list_display = ('group_id', 'admin_id', 'group_name', 'group_desc', 'group_from', 'group_lock', 'status', 'created_at', 'updated_at')
10
+    list_display = ('group_id', 'admin_id', 'group_name', 'group_desc', 'group_from', 'session_id', 'group_lock', 'status', 'created_at', 'updated_at')
11 11
     list_filter = ('group_from', 'group_lock', 'status')
12 12
 
13 13
 

+ 199 - 0
group/lensman_views.py

@@ -0,0 +1,199 @@
1
+# -*- coding: utf-8 -*-
2
+
3
+from __future__ import division
4
+
5
+import os
6
+
7
+import shortuuid
8
+from curtail_uuid import CurtailUUID
9
+from django.conf import settings
10
+from django.contrib.auth.hashers import check_password
11
+from django.core.files.storage import default_storage
12
+from django.http import JsonResponse
13
+from TimeConvert import TimeConvert as tc
14
+
15
+from account.models import LensmanInfo, UserInfo
16
+from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo
17
+from photo.models import PhotosInfo
18
+from utils.error.errno_utils import LensmanStatusCode, UserStatusCode
19
+from utils.error.response_utils import response
20
+from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info
21
+from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
22
+from utils.thumbnail_utils import make_thumbnail
23
+from utils.watermark_utils import watermark_wrap
24
+
25
+
26
+r = settings.REDIS_CACHE
27
+
28
+
29
+def lensman_login_api(request):
30
+    """
31
+    摄影师登录
32
+    :param request:
33
+    :return:
34
+    """
35
+    username = request.POST.get('username', '')
36
+    password = request.POST.get('password', '')
37
+
38
+    try:
39
+        lensman = LensmanInfo.objects.get(username=username)
40
+    except LensmanInfo.DoesNotExist:
41
+        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
42
+
43
+    if not check_password(password, lensman.encryption):
44
+        return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR)
45
+
46
+    try:
47
+        user = UserInfo.objects.get(user_id=lensman.lensman_id)
48
+    except UserInfo.DoesNotExist:
49
+        return response(LensmanStatusCode.LENSMAN_NOT_FOUND)
50
+
51
+    return JsonResponse({
52
+        'status': 200,
53
+        'message': u'登录成功',
54
+        'data': user.data,
55
+    })
56
+
57
+
58
+def lensman_upload_photo_api(request):
59
+    """
60
+    摄影师上传照片
61
+    :param request:
62
+    :return:
63
+    """
64
+    user_id = lensman_id = request.POST.get('user_id', '')
65
+    nickname = request.POST.get('nickname', '')
66
+    session_id = request.POST.get('session', '')
67
+
68
+    photo_id = request.POST.get('photo_id', '')
69
+
70
+    photo = request.FILES.get('photo', '')
71
+
72
+    current_id = int(request.POST.get('current_id', -1))
73
+
74
+    # 用户校验
75
+    try:
76
+        user = UserInfo.objects.get(user_id=user_id)
77
+    except UserInfo.DoesNotExist:
78
+        return response(UserStatusCode.USER_NOT_FOUND)
79
+
80
+    # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建
81
+    group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={
82
+        'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'),
83
+        'admin_id': user_id,
84
+        'group_name': user.final_nickname,
85
+        'group_default_avatar': 0,
86
+    })
87
+    group_id = group.group_id
88
+
89
+    # Redis 群组数据缓存
90
+    group_info = set_group_info(group) if group_created else get_group_info(group_id)
91
+
92
+    # 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建
93
+    group_user_current_id = -1
94
+    group_user, group_user_created = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={
95
+        # 'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1),
96
+        'current_id': group_user_current_id,  # 通过扫描 session_id 二维码进群的用户,默认可以查看该群组所有照片
97
+        'nickname': nickname or user.final_nickname,
98
+        'avatar': user.avatar,
99
+        'admin': group_created,
100
+        'user_status': GroupUserInfo.PASSED,
101
+        'passed_at': tc.utc_datetime(),
102
+    })
103
+    if not group_user_created:
104
+        group_user.current_id = group_user_current_id
105
+        group_user.user_status = GroupUserInfo.PASSED
106
+        group_user.save()
107
+
108
+    # Redis 群组用户数据缓存
109
+    group_users = set_group_users_info(group) if group_user_created else get_group_users_info(group_id, user_id)
110
+
111
+    if photo:
112
+        # 写 PhotosInfo 表
113
+        _, extension = os.path.splitext(photo.name)
114
+        extension = extension or 'jpeg'
115
+
116
+        m_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
117
+
118
+        if default_storage.exists(m_photo_path):
119
+            default_storage.delete(m_photo_path)
120
+        default_storage.save(m_photo_path, photo)
121
+
122
+        p_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension)
123
+        watermark_wrap(
124
+            os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'),
125
+            settings.WATERMARK_LOGO,
126
+            os.path.join(settings.MEDIA_ROOT, p_photo_path).replace('\\', '/')
127
+        )
128
+
129
+        photo, created = PhotosInfo.objects.get_or_create(
130
+            lensman_id=lensman_id,
131
+            session_id=session_id,
132
+            photo_id=photo_id,
133
+            p_photo_path=p_photo_path,
134
+            m_photo_path=m_photo_path,
135
+        )
136
+
137
+        # 写 GroupPhotoInfo 表
138
+        photo_path = photo.p_photo_path
139
+        photo_thumbnail_path = photo_path.replace('.', '_thumbnail.')
140
+        photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.')
141
+
142
+        # 群组照片缩略图生成
143
+        # 双列: 540, 40-50K
144
+        photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail(
145
+            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
146
+            os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'),
147
+            settings.THUMBNAIL_MAX_WIDTH
148
+        )
149
+
150
+        # 单列: 1080, xx-100K
151
+        photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail(
152
+            os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'),
153
+            os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
154
+            settings.THUMBNAIL_MAX_WIDTH2
155
+        )
156
+
157
+        # 群组照片记录创建
158
+        group_photo = GroupPhotoInfo.objects.create(
159
+            group_id=group_id,
160
+            user_id=user_id,
161
+            nickname=user.final_nickname,
162
+            avatar=user.avatar,
163
+            photo_path=photo_path,
164
+            photo_w=photo_w,
165
+            photo_h=photo_h,
166
+            photo_thumbnail_path=photo_thumbnail_path,
167
+            photo_thumbnail_w=photo_thumbnail_w,
168
+            photo_thumbnail_h=photo_thumbnail_h,
169
+            photo_thumbnail2_path=photo_thumbnail2_path,
170
+            photo_thumbnail2_w=photo_thumbnail2_w,
171
+            photo_thumbnail2_h=photo_thumbnail2_h,
172
+            photo_from=GroupPhotoInfo.SESSION_GROUP,
173
+            session_id=photo.session_id,
174
+            lensman_id=photo.lensman_id,
175
+            lensman_photo_id=photo.photo_id,
176
+        )
177
+
178
+        # 设置群组最后一张照片PK
179
+        r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk)
180
+
181
+    # 获取从 current_id 到 now 的群组照片列表
182
+    group_photos = GroupPhotoInfo.objects.filter(
183
+        group_id=group_id,
184
+        status=True,
185
+        pk__gt=max(current_id, group_user.current_id),
186
+    ).order_by(
187
+        '-pk'
188
+    )
189
+    latest_photo = group_photos.first()
190
+
191
+    return JsonResponse({
192
+        'status': 200,
193
+        'message': u'摄影师照片上传成功',
194
+        'data': {
195
+            'group_id': group_id,
196
+            'current_id': latest_photo and latest_photo.pk or current_id,
197
+            'photos': [photo.photo_info(user_id) for photo in group_photos],
198
+        }
199
+    })

+ 1 - 3
photo/views.py

@@ -159,13 +159,11 @@ def session_join_api(request):
159 159
     user_id = user.user_id
160 160
 
161 161
     # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建
162
-    group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, defaults={
162
+    group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={
163 163
         'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'),
164 164
         'admin_id': user_id,
165 165
         'group_name': user.final_nickname,
166 166
         'group_default_avatar': 0,
167
-        'group_from': GroupInfo.SESSION_GROUP,
168
-        'session_id': session_id,
169 167
     })
170 168
     group_id = group.group_id
171 169