an rel="diff-837db1e10959bbdc7788c75f0de347697fe3338fR14">14
+from TimeConvert import TimeConvert as tc
10 15
 
11 16
 from account.models import UserInfo
12
-from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo, PhotoCommentInfo, PhotoThumbUpInfo
17
+from group.models import (GroupInfo, GroupPhotoInfo, GroupUserInfo,
18
+                          PhotoCommentInfo, PhotoThumbUpInfo)
19
+from group.serializers import (GroupInfoSerializer, GroupPhotoInfoSerializer,
20
+                               GroupUserInfoSerializer)
13 21
 from message.models import UserMessageInfo
14
-
15
-from group.serializers import GroupInfoSerializer, GroupUserInfoSerializer, GroupPhotoInfoSerializer
16
-
17
-from utils.page_utils import pagination
18
-from utils.thumbnail_utils import make_thumbnail
19
-from utils.url_utils import img_url
20
-
21
-from utils.error.errno_utils import UserStatusCode, GroupStatusCode, GroupUserStatusCode, GroupPhotoStatusCode
22
+from utils.error.errno_utils import (GroupPhotoStatusCode, GroupStatusCode,
23
+                                     GroupUserStatusCode, UserStatusCode)
22 24
 from utils.error.response_utils import response
23
-
24
-from utils.redis.rkeys import (
25
-    GROUP_USERS_APPLYING_SET, GROUP_USERS_PASSED_SET, GROUP_USERS_REFUSED_SET, GROUP_USERS_DELETED_SET,
26
-    GROUP_USERS_QUIT_SET,
27
-)
28
-from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
29
-from utils.redis.rkeys import LENSMAN_PHOTO_PRICE, LENSMAN_PHOTO_HAGGLE_TIMES
30
-from utils.redis.rgroup import set_group_info, get_group_info, set_group_users_info, get_group_users_info
31
-from utils.redis.rgroup import set_group_photo_thumbup_flag, del_group_photo_thumbup_flag, get_group_photo_thumbup_flag
25
+from utils.page_utils import pagination
26
+from utils.redis.rgroup import (del_group_photo_thumbup_flag, get_group_info,
27
+                                get_group_photo_thumbup_flag,
28
+                                get_group_users_info, set_group_info,
29
+                                set_group_photo_thumbup_flag,
30
+                                set_group_users_info)
31
+from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_USERS_APPLYING_SET,
32
+                               GROUP_USERS_DELETED_SET, GROUP_USERS_PASSED_SET,
33
+                               GROUP_USERS_QUIT_SET, GROUP_USERS_REFUSED_SET,
34
+                               LENSMAN_PHOTO_HAGGLE_TIMES, LENSMAN_PHOTO_PRICE)
32 35
 from utils.redis.rorder import get_lensman_order_record
33
-
34 36
 from utils.sql.raw import PAI2_HOME_API
35
-
36
-from curtail_uuid import CurtailUUID
37
-
38
-from TimeConvert import TimeConvert as tc
39
-
40
-import os
41
-import random
42
-import shortuuid
43
-
37
+from utils.thumbnail_utils import make_thumbnail
38
+from utils.url_utils import img_url
44 39
 
45 40
 r = settings.REDIS_CACHE
46 41
 

+ 3 - 0
isort.sh

@@ -0,0 +1,3 @@
1
+#!/bin/bash
2
+
3
+isort -rc --settings-path .isort.cfg .

+ 2 - 1
message/admin.py

@@ -2,7 +2,8 @@
2 2
 
3 3
 from django.contrib import admin
4 4
 
5
-from message.models import UserMessageInfo, SystemMessageInfo, SystemMessageReadInfo, SystemMessageDeleteInfo
5
+from message.models import (SystemMessageDeleteInfo, SystemMessageInfo,
6
+                            SystemMessageReadInfo, UserMessageInfo)
6 7
 
7 8
 
8 9
 class UserMessageInfoAdmin(admin.ModelAdmin):

+ 1 - 2
message/models.py

@@ -4,9 +4,8 @@ from django.conf import settings
4 4
 from django.db import models
5 5
 from django.utils.translation import ugettext_lazy as _
6 6
 
7
-from pai2.basemodels import CreateUpdateMixin
8
-
9 7
 from group.models import GroupPhotoInfo
8
+from pai2.basemodels import CreateUpdateMixin
10 9
 
11 10
 
12 11
 class UserMessageInfo(CreateUpdateMixin):

+ 8 - 8
message/views.py

@@ -4,15 +4,15 @@ from django.conf import settings
4 4
 from django.http import JsonResponse
5 5
 
6 6
 from account.models import UserInfo
7
-from message.models import UserMessageInfo, SystemMessageInfo, SystemMessageReadInfo, SystemMessageDeleteInfo
8
-
9
-from utils.page_utils import pagination
10
-
11
-from utils.error.errno_utils import UserStatusCode, MessageStatusCode
7
+from message.models import (SystemMessageDeleteInfo, SystemMessageInfo,
8
+                            SystemMessageReadInfo, UserMessageInfo)
9
+from utils.error.errno_utils import MessageStatusCode, UserStatusCode
12 10
 from utils.error.response_utils import response
13
-
14
-from utils.redis.rmessage import set_system_message_read_info, get_system_message_read_info
15
-from utils.redis.rmessage import set_system_message_delete_info, get_system_message_delete_info
11
+from utils.page_utils import pagination
12
+from utils.redis.rmessage import (get_system_message_delete_info,
13
+                                  get_system_message_read_info,
14
+                                  set_system_message_delete_info,
15
+                                  set_system_message_read_info)
16 16
 
17 17
 
18 18
 def message_list_api(request):

+ 1 - 1
operation/admin.py

@@ -2,7 +2,7 @@
2 2
 
3 3
 from django.contrib import admin
4 4
 
5
-from operation.models import LatestAppInfo, SplashInfo, FeedbackInfo
5
+from operation.models import FeedbackInfo, LatestAppInfo, SplashInfo
6 6
 
7 7
 
8 8
 class LatestAppInfoAdmin(admin.ModelAdmin):

+ 4 - 4
operation/models.py

@@ -1,15 +1,15 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+import datetime
4
+import os
5
+import time
6
+
3 7
 from django.conf import settings
4 8
 from django.db import models
5 9
 from django.utils.translation import ugettext_lazy as _
6 10
 
7 11
 from pai2.basemodels import CreateUpdateMixin
8 12
 
9
-import datetime
10
-import os
11
-import time
12
-
13 13
 
14 14
 def upload_path(instance, old_filename):
15 15
     extension = os.path.splitext(old_filename)[1].lower()

+ 1 - 4
operation/views.py

@@ -3,13 +3,10 @@
3 3
 from django.http import JsonResponse
4 4
 
5 5
 from account.models import UserInfo
6
-from operation.models import FeedbackInfo
7
-
6
+from operation.models import FeedbackInfo, LatestAppInfo, SplashInfo
8 7
 from utils.error.errno_utils import UserStatusCode
9 8
 from utils.error.response_utils import response
10 9
 
11
-from operation.models import LatestAppInfo, SplashInfo
12
-
13 10
 
14 11
 def upgrade_api(request):
15 12
     """

+ 1 - 1
pai2/urls.py

@@ -19,8 +19,8 @@ from django.conf import settings
19 19
 from django.conf.urls import include, url
20 20
 from django.conf.urls.static import static
21 21
 from django.contrib import admin
22
-
23 22
 from rest_framework import routers
23
+
24 24
 from account import views as account_views
25 25
 from group import views as group_views
26 26
 from page import views as page_views

+ 0 - 1
pai2/urls_api.py

@@ -3,7 +3,6 @@
3 3
 from django.conf import settings
4 4
 from django.conf.urls import include, url
5 5
 
6
-
7 6
 urlpatterns = [
8 7
     url(r'^', include('api.urls', namespace='api')),
9 8
 ]

+ 1 - 3
pay/models.py

@@ -3,12 +3,10 @@
3 3
 from django.conf import settings
4 4
 from django.db import models
5 5
 from django.utils.translation import ugettext_lazy as _
6
-
7 6
 from shortuuidfield import ShortUUIDField
8 7
 
9
-from pai2.basemodels import CreateUpdateMixin
10
-
11 8
 from group.models import GroupPhotoInfo
9
+from pai2.basemodels import CreateUpdateMixin
12 10
 
13 11
 
14 12
 class OrderInfo(CreateUpdateMixin):

+ 5 - 12
pay/views.py

@@ -1,30 +1,23 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+import xmltodict
3 4
 from django.conf import settings
4 5
 from django.db import transaction
5 6
 from django.http import JsonResponse
6 7
 from django.shortcuts import HttpResponse
8
+from logit import logit
9
+from TimeConvert import TimeConvert as tc
10
+from wechatpy import WeChatPay, WeChatPayException
7 11
 
8 12
 from group.models import GroupPhotoInfo, GroupPhotoOrderInfo
9 13
 from pay.models import OrderInfo
10 14
 from photo.models import PhotosInfo
11
-
12
-from utils.page_utils import pagination
13
-
14 15
 from utils.error.errno_utils import GroupPhotoStatusCode, OrderStatusCode
15 16
 from utils.error.response_utils import response
16
-
17
+from utils.page_utils import pagination
17 18
 from utils.redis.rkeys import LENSMAN_PHOTO_PRICE
18 19
 from utils.redis.rorder import set_lensman_order_record
19 20
 
20
-from logit import logit
21
-
22
-from TimeConvert import TimeConvert as tc
23
-from wechatpy import WeChatPay, WeChatPayException
24
-
25
-import xmltodict
26
-
27
-
28 21
 r = settings.REDIS_CACHE
29 22
 WECHAT = settings.WECHAT
30 23
 

+ 1 - 1
photo/admin.py

@@ -2,7 +2,7 @@
2 2
 
3 3
 from django.contrib import admin
4 4
 
5
-from photo.models import UUIDInfo, PhotosInfo
5
+from photo.models import PhotosInfo, UUIDInfo
6 6
 
7 7
 
8 8
 class UUIDInfoAdmin(admin.ModelAdmin):

+ 0 - 1
photo/models.py

@@ -5,7 +5,6 @@ from django.db import models
5 5
 from django.utils.translation import ugettext_lazy as _
6 6
 
7 7
 from pai2.basemodels import CreateUpdateMixin
8
-
9 8
 from utils.url_utils import img_url
10 9
 
11 10
 

+ 2 - 1
photo/serializers.py

@@ -1,8 +1,9 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
-from photo.models import PhotosInfo
4 3
 from rest_framework import serializers
5 4
 
5
+from photo.models import PhotosInfo
6
+
6 7
 
7 8
 class PhotosInfoSerializer(serializers.HyperlinkedModelSerializer):
8 9
     class Meta:

+ 12 - 19
photo/views.py

@@ -1,36 +1,29 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+import os
4
+
5
+import shortuuid
6
+from curtail_uuid import CurtailUUID
3 7
 from django.conf import settings
4 8
 from django.core.files.storage import default_storage
5 9
 from django.db import transaction
6 10
 from django.http import JsonResponse
7 11
 from django.shortcuts import render
8
-
9 12
 from rest_framework import viewsets
13
+from TimeConvert import TimeConvert as tc
10 14
 
11 15
 from account.models import LensmanInfo, UserInfo
12
-from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo
13
-from photo.models import UUIDInfo, PhotosInfo
16
+from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo
17
+from photo.models import PhotosInfo, UUIDInfo
14 18
 from photo.serializers import PhotosInfoSerializer
15
-
16
-from utils.ip_utils import ip_addr
17
-from utils.thumbnail_utils import make_thumbnail
18
-from utils.watermark_utils import watermark_wrap
19
-
20 19
 from utils.error.errno_utils import PhotoStatusCode
21 20
 from utils.error.response_utils import response
22
-
21
+from utils.ip_utils import ip_addr
22
+from utils.redis.rgroup import (get_group_info, get_group_users_info,
23
+                                set_group_info, set_group_users_info)
23 24
 from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
24
-from utils.redis.rgroup import get_group_info, get_group_users_info
25
-from utils.redis.rgroup import set_group_info, set_group_users_info
26
-
27
-from curtail_uuid import CurtailUUID
28
-
29
-from TimeConvert import TimeConvert as tc
30
-
31
-import os
32
-import shortuuid
33
-
25
+from utils.thumbnail_utils import make_thumbnail
26
+from utils.watermark_utils import watermark_wrap
34 27
 
35 28
 r = settings.REDIS_CACHE
36 29
 

+ 4 - 5
utils/redis/retrieve.py

@@ -2,11 +2,10 @@
2 2
 
3 3
 from django.conf import settings
4 4
 
5
-from group.models import GroupInfo, GroupUserInfo, GroupPhotoInfo
6
-
7
-from utils.redis.rkeys import GROUP_USERS_APPLYING_SET, GROUP_USERS_PASSED_SET, GROUP_USERS_REFUSED_SET, GROUP_USERS_DELETED_SET
8
-from utils.redis.rkeys import GROUP_LAST_PHOTO_PK
9
-
5
+from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo
6
+from utils.redis.rkeys import (GROUP_LAST_PHOTO_PK, GROUP_USERS_APPLYING_SET,
7
+                               GROUP_USERS_DELETED_SET, GROUP_USERS_PASSED_SET,
8
+                               GROUP_USERS_REFUSED_SET)
10 9
 
11 10
 r = settings.REDIS_CACHE
12 11
 

+ 4 - 4
utils/redis/rgroup.py

@@ -1,12 +1,12 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+import json
4
+
3 5
 from django.conf import settings
4 6
 from django.core.serializers.json import DjangoJSONEncoder
5 7
 
6
-from utils.redis.rkeys import GROUP_INFO, GROUP_USERS_INFO, GROUP_PHOTO_THUMB_UP
7
-
8
-import json
9
-
8
+from utils.redis.rkeys import (GROUP_INFO, GROUP_PHOTO_THUMB_UP,
9
+                               GROUP_USERS_INFO)
10 10
 
11 11
 r = settings.REDIS_CACHE
12 12
 

+ 5 - 6
utils/redis/rmessage.py

@@ -1,13 +1,12 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
-from django.conf import settings
4
-
5
-from message.models import SystemMessageReadInfo, SystemMessageDeleteInfo
6
-
7
-from utils.redis.rkeys import SYSTEM_MESSAGE_READ_INFO, SYSTEM_MESSAGE_DELETED_INFO
8
-
9 3
 import json
10 4
 
5
+from django.conf import settings
6
+
7
+from message.models import SystemMessageDeleteInfo, SystemMessageReadInfo
8
+from utils.redis.rkeys import (SYSTEM_MESSAGE_DELETED_INFO,
9
+                               SYSTEM_MESSAGE_READ_INFO)
11 10
 
12 11
 r = settings.REDIS_CACHE
13 12
 

+ 2 - 3
utils/redis/rorder.py

@@ -1,13 +1,12 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 
3
+import json
4
+
3 5
 from django.conf import settings
4 6
 from django.core.serializers.json import DjangoJSONEncoder
5 7
 
6 8
 from utils.redis.rkeys import LENSMAN_PHOTO_ORDER_RECORD
7 9
 
8
-import json
9
-
10
-
11 10
 r = settings.REDIS_CACHE
12 11
 
13 12
 

pai2 - Gogs: Go Git Service

拍爱

lensman_views.py 8.6KB

    # -*- coding: utf-8 -*- from __future__ import division import os import shortuuid from curtail_uuid import CurtailUUID from django.conf import settings from django.contrib.auth.hashers import check_password from django.core.files.storage import default_storage from logit import logit from TimeConvert import TimeConvert as tc from account.models import LensmanInfo, UserInfo from group.models import GroupInfo, GroupPhotoInfo, GroupUserInfo from photo.models import PhotosInfo from utils.error.errno_utils import LensmanStatusCode, UserStatusCode from utils.error.response_utils import response from utils.redis.rgroup import get_group_info, get_group_users_info, set_group_info, set_group_users_info from utils.redis.rkeys import GROUP_LAST_PHOTO_PK from utils.thumbnail_utils import make_thumbnail from utils.watermark_utils import watermark_wrap r = settings.REDIS_CACHE @logit def lensman_submit_api(request): """ 摄影师信息提交 :param request: :return: """ unionid = request.POST.get('unionid', '') phone = request.POST.get('phone', '') if LensmanInfo.objects.filter(phone=phone).exclude(unionid=unionid).exists(): return response(LensmanStatusCode.LENSMAN_PHONE_ALREADY_EXISTS) fields = { 'name': request.POST.get('name', ''), 'sex': int(request.POST.get('sex', 1)), 'phone': phone, 'location': request.POST.get('location', ''), 'user_status': LensmanInfo.UNVERIFIED, } lensman, created = LensmanInfo.objects.get_or_create(unionid=unionid, defaults=fields) # 状态为 UNVERIFIED 的允许修改, 其他需要登录摄影师 APP 进行信息的修改 if lensman.user_status not in [LensmanInfo.UNVERIFIED, LensmanInfo.REFUSED]: return response(LensmanStatusCode.LENSMAN_ALREADY_NOT_UNVERIFIED) if not created: for key, value in fields.iteritems(): setattr(lensman, key, value) lensman.save() return response(200, 'Submit Success', u'提交成功', {}) @logit def lensman_login_api(request): """ 摄影师登录 :param request: :return: """ username = request.POST.get('username', '') password = request.POST.get('password', '') try: lensman = LensmanInfo.objects.get(username=username) except LensmanInfo.DoesNotExist: return response(LensmanStatusCode.LENSMAN_NOT_FOUND) if not check_password(password, lensman.encryption): return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR) try: user = UserInfo.objects.get(user_id=lensman.lensman_id) except UserInfo.DoesNotExist: return response(LensmanStatusCode.LENSMAN_NOT_FOUND) return response(200, 'Login Success', u'登录成功', user.data) @logit def lensman_wx_authorize_api(request): unionid = request.POST.get('unionid', '') # 判断 unionid 是否已经存在,如果已经存在,则直接返回改帐户信息 try: user = UserInfo.objects.get(unionid=unionid) except UserInfo.DoesNotExist: return response(LensmanStatusCode.LENSMAN_NOT_FOUND) if user.user_status != UserInfo.ACTIVATED: return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) return response(200, 'Lensman Login Success', u'摄影师登录成功', user.data) @logit def lensman_photo_upload_api(request): """ 摄影师照片上传 :param request: :return: """ user_id = lensman_id = request.POST.get('user_id', '') nickname = request.POST.get('nickname', '') session_id = request.POST.get('session_id', '') photo_id = request.POST.get('photo_id', '') photo = request.FILES.get('photo', '') current_id = int(request.POST.get('current_id', -1)) # 用户校验 try: user = UserInfo.objects.get(user_id=user_id) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) # 判断通过 session_id 创建的群组是否存在,如果不存在,则直接创建 group, group_created = GroupInfo.objects.get_or_create(session_id=session_id, group_from=GroupInfo.SESSION_GROUP, defaults={ 'group_id': CurtailUUID.uuid(GroupInfo, 'group_id'), 'admin_id': user_id, 'group_name': user.final_nickname, 'group_default_avatar': 0, }) group_id = group.group_id # Redis 群组数据缓存 group_info = set_group_info(group) if group_created else get_group_info(group_id) # 判断 group_id/user_id 的群组用户是否存在,如果不存在,则直接创建 group_user_current_id = -1 group_user, group_user_created = GroupUserInfo.objects.get_or_create(group_id=group_id, user_id=user_id, defaults={ # 'current_id': int(r.get(GROUP_LAST_PHOTO_PK % group_id) or -1), 'current_id': group_user_current_id, # 通过扫描 session_id 二维码进群的用户,默认可以查看该群组所有照片 'nickname': nickname or user.final_nickname, 'avatar': user.avatar, 'admin': group_created, 'user_status': GroupUserInfo.PASSED, 'passed_at': tc.utc_datetime(), }) if not group_user_created: group_user.current_id = group_user_current_id group_user.user_status = GroupUserInfo.PASSED group_user.save() # Redis 群组用户数据缓存 group_users = set_group_users_info(group) if group_user_created else get_group_users_info(group_id, user_id) if photo: # 写 PhotosInfo 表 _, extension = os.path.splitext(photo.name) extension = extension or 'jpeg' m_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension) if default_storage.exists(m_photo_path): default_storage.delete(m_photo_path) default_storage.save(m_photo_path, photo) p_photo_path = 'photo/{uuid}{extension}'.format(uuid=shortuuid.uuid(), extension=extension) watermark_wrap( os.path.join(settings.MEDIA_ROOT, m_photo_path).replace('\\', '/'), settings.WATERMARK_LOGO, os.path.join(settings.MEDIA_ROOT, p_photo_path).replace('\\', '/') ) photo, created = PhotosInfo.objects.get_or_create( lensman_id=lensman_id, session_id=session_id, photo_id=photo_id, p_photo_path=p_photo_path, m_photo_path=m_photo_path, ) # 写 GroupPhotoInfo 表 photo_path = photo.p_photo_path photo_thumbnail_path = photo_path.replace('.', '_thumbnail.') photo_thumbnail2_path = photo_path.replace('.', '_thumbnail2.') # 群组照片缩略图生成 # 双列: 540, 40-50K photo_w, photo_h, photo_thumbnail_w, photo_thumbnail_h = make_thumbnail( os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'), os.path.join(settings.MEDIA_ROOT, photo_thumbnail_path).replace('\\', '/'), settings.THUMBNAIL_MAX_WIDTH ) # 单列: 1080, xx-100K photo_w, photo_h, photo_thumbnail2_w, photo_thumbnail2_h = make_thumbnail( os.path.join(settings.MEDIA_ROOT, photo_path).replace('\\', '/'), os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'), settings.THUMBNAIL_MAX_WIDTH2 ) # 群组照片记录创建 group_photo = GroupPhotoInfo.objects.create( group_id=group_id, user_id=user_id, nickname=user.final_nickname, avatar=user.avatar, photo_path=photo_path, photo_w=photo_w, photo_h=photo_h, photo_thumbnail_path=photo_thumbnail_path, photo_thumbnail_w=photo_thumbnail_w, photo_thumbnail_h=photo_thumbnail_h, photo_thumbnail2_path=photo_thumbnail2_path, photo_thumbnail2_w=photo_thumbnail2_w, photo_thumbnail2_h=photo_thumbnail2_h, photo_from=GroupPhotoInfo.SESSION_GROUP, session_id=photo.session_id, lensman_id=photo.lensman_id, lensman_photo_id=photo.photo_id, ) # 设置群组最后一张照片PK r.set(GROUP_LAST_PHOTO_PK % group_id, group_photo.pk) # 获取从 current_id 到 now 的群组照片列表 group_photos = GroupPhotoInfo.objects.filter( group_id=group_id, status=True, pk__gt=max(current_id, group_user.current_id), ).order_by( '-pk' ) latest_photo = group_photos.first() return response(200, 'Lensman Upload Photo Success', u'摄影师照片上传成功', { 'group_id': group_id, 'current_id': latest_photo and latest_photo.pk or current_id, 'photos': [photo.photo_info(user_id) for photo in group_photos], })