| @@ -2,7 +2,6 @@ | ||
| 2 | 2 |  | 
| 3 | 3 | from curtail_uuid import CurtailUUID | 
| 4 | 4 | from django.contrib import admin | 
| 5 | -from django.contrib.auth.hashers import make_password | |
| 6 | 5 | from django.db import transaction | 
| 7 | 6 |  | 
| 8 | 7 | from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLoginLogInfo, TourGuideInfo, | 
| @@ -10,7 +9,8 @@ from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLogin | ||
| 10 | 9 |  | 
| 11 | 10 |  | 
| 12 | 11 | class LensmanInfoAdmin(admin.ModelAdmin): | 
| 13 | -    readonly_fields = ('lensman_id', 'encryption', ) | |
| 12 | +    exclude = ('username', 'password', 'encryption') | |
| 13 | +    readonly_fields = ('lensman_id', ) | |
| 14 | 14 |      list_display = ('lensman_id', 'unionid', 'username', 'name', 'sex', 'phone', 'location', 'proportion', 'nomark', 'origin', 'balance', 'user_status', 'status', 'created_at', 'updated_at') | 
| 15 | 15 |      search_fields = ('name', 'phone', 'location') | 
| 16 | 16 |      list_filter = ('sex', 'user_status', 'status') | 
| @@ -41,11 +41,6 @@ class LensmanInfoAdmin(admin.ModelAdmin): | ||
| 41 | 41 | setattr(user, key, value) | 
| 42 | 42 | user.save() | 
| 43 | 43 |  | 
| 44 | - if obj.password: | |
| 45 | - obj.encryption = make_password(obj.password, None, 'pbkdf2_sha256') | |
| 46 | - obj.password = None | |
| 47 | - obj.save() | |
| 48 | - | |
| 49 | 44 |  | 
| 50 | 45 | class LensmanLoginLogInfoAdmin(admin.ModelAdmin): | 
| 51 | 46 |      list_display = ('lensman_id', 'login_ip', 'login_result', 'status', 'created_at', 'updated_at') | 
| @@ -0,0 +1,49 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | +from __future__ import unicode_literals | |
| 3 | + | |
| 4 | +from django.db import models, migrations | |
| 5 | + | |
| 6 | + | |
| 7 | +class Migration(migrations.Migration): | |
| 8 | + | |
| 9 | + dependencies = [ | |
| 10 | +        ('account', '0022_auto_20170212_2153'), | |
| 11 | + ] | |
| 12 | + | |
| 13 | + operations = [ | |
| 14 | + migrations.AddField( | |
| 15 | + model_name='userinfo', | |
| 16 | + name='openid_lensman', | |
| 17 | + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u6444\u5f71\u5e08\u7aef', unique=True, verbose_name='openid_lensman', db_index=True), | |
| 18 | + ), | |
| 19 | + migrations.AddField( | |
| 20 | + model_name='userinfo', | |
| 21 | + name='openid_miniapp', | |
| 22 | + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u5c0f\u7a0b\u5e8f', unique=True, verbose_name='openid_miniapp', db_index=True), | |
| 23 | + ), | |
| 24 | + migrations.AddField( | |
| 25 | + model_name='userinfo', | |
| 26 | + name='openid_oauth', | |
| 27 | + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u7528\u6237\u6388\u6743', unique=True, verbose_name='openid_oauth', db_index=True), | |
| 28 | + ), | |
| 29 | + migrations.AddField( | |
| 30 | + model_name='userinfo', | |
| 31 | + name='openid_tourguide', | |
| 32 | + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u5bfc\u6e38\u7aef', unique=True, verbose_name='openid_tourguide', db_index=True), | |
| 33 | + ), | |
| 34 | + migrations.AlterField( | |
| 35 | + model_name='userinfo', | |
| 36 | + name='openid', | |
| 37 | + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Openid\uff0c\u62cd\u7231\u7528\u6237\u7aef', unique=True, verbose_name='openid', db_index=True), | |
| 38 | + ), | |
| 39 | + migrations.AlterField( | |
| 40 | + model_name='userinfo', | |
| 41 | + name='unionid', | |
| 42 | + field=models.CharField(null=True, max_length=255, blank=True, help_text='\u5fae\u4fe1 Unionid', unique=True, verbose_name='unionid', db_index=True), | |
| 43 | + ), | |
| 44 | + migrations.AlterField( | |
| 45 | + model_name='userinfo', | |
| 46 | + name='user_from', | |
| 47 | + field=models.IntegerField(default=0, help_text='\u7528\u6237\u6765\u6e90', verbose_name='user_from', choices=[(0, 'APP \u521b\u5efa\u7528\u6237'), (1, '\u5fae\u4fe1\u6388\u6743\u7528\u6237'), (8, '\u7528\u6237\u7aef\u7528\u6237'), (9, '\u6e38\u5ba2\u7528\u6237'), (10, '\u6444\u5f71\u5e08\u7aef\u7528\u6237'), (11, '\u5bfc\u6e38\u7aef\u7528\u6237'), (12, '\u5c0f\u7a0b\u5e8f\u7aef\u7528\u6237'), (13, '\u7f51\u9875\u6388\u6743\u7528\u6237')]), | |
| 48 | + ), | |
| 49 | + ] | 
| @@ -229,18 +229,22 @@ class WechatInfo(CreateUpdateMixin): | ||
| 229 | 229 | class UserInfo(CreateUpdateMixin): | 
| 230 | 230 | APP_USER = 0 | 
| 231 | 231 | WX_USER = 1 | 
| 232 | + USER_USER = 8 | |
| 232 | 233 | GUEST_USER = 9 | 
| 233 | 234 | LENSMAN_USER = 10 | 
| 234 | 235 | TOURGUIDE_USER = 11 | 
| 235 | - WEAPP_USER = 12 | |
| 236 | + MINIAPP_USER = 12 | |
| 237 | + OAUTH_USER = 13 | |
| 236 | 238 |  | 
| 237 | 239 | USER_FROM = ( | 
| 238 | 240 | (APP_USER, u'APP 创建用户'), | 
| 239 | 241 | (WX_USER, u'微信授权用户'), | 
| 242 | + (USER_USER, u'用户端用户'), | |
| 240 | 243 | (GUEST_USER, u'游客用户'), | 
| 241 | - (LENSMAN_USER, u'摄影师用户'), | |
| 242 | - (TOURGUIDE_USER, u'导游用户'), | |
| 243 | - (WEAPP_USER, u'小程序用户'), | |
| 244 | + (LENSMAN_USER, u'摄影师端用户'), | |
| 245 | + (TOURGUIDE_USER, u'导游端用户'), | |
| 246 | + (MINIAPP_USER, u'小程序端用户'), | |
| 247 | + (OAUTH_USER, u'网页授权用户'), | |
| 244 | 248 | ) | 
| 245 | 249 |  | 
| 246 | 250 | UNVERIFIED = 0 | 
| @@ -273,8 +277,12 @@ class UserInfo(CreateUpdateMixin): | ||
| 273 | 277 | username = models.CharField(_(u'username'), max_length=255, blank=True, null=True, help_text=u'用户用户名', db_index=True, unique=True) | 
| 274 | 278 | password = models.CharField(_(u'password'), max_length=255, blank=True, null=True, help_text=u'用户密码') | 
| 275 | 279 | # 微信授权用户 | 
| 276 | - openid = models.CharField(_(u'openid'), max_length=255, blank=True, null=True, help_text=u'微信 Open ID', db_index=True, unique=True) | |
| 277 | - unionid = models.CharField(_(u'unionid'), max_length=255, blank=True, null=True, help_text=u'微信 Union ID', db_index=True, unique=True) | |
| 280 | + unionid = models.CharField(_(u'unionid'), max_length=255, blank=True, null=True, help_text=u'微信 Unionid', db_index=True, unique=True) | |
| 281 | + openid = models.CharField(_(u'openid'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱用户端', db_index=True, unique=True) | |
| 282 | + openid_lensman = models.CharField(_(u'openid_lensman'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱摄影师端', db_index=True, unique=True) | |
| 283 | + openid_tourguide = models.CharField(_(u'openid_tourguide'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱导游端', db_index=True, unique=True) | |
| 284 | + openid_miniapp = models.CharField(_(u'openid_miniapp'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱小程序', db_index=True, unique=True) | |
| 285 | + openid_oauth = models.CharField(_(u'openid_oauth'), max_length=255, blank=True, null=True, help_text=u'微信 Openid,拍爱用户授权', db_index=True, unique=True) | |
| 278 | 286 | # 用户基本信息 | 
| 279 | 287 | name = models.CharField(_(u'name'), max_length=255, blank=True, null=True, help_text=u'用户姓名') | 
| 280 | 288 | sex = models.IntegerField(_(u'sex'), choices=SEX_TYPE, default=MALE, help_text=u'用户性别') | 
| @@ -324,7 +332,7 @@ class UserInfo(CreateUpdateMixin): | ||
| 324 | 332 | return self.name | 
| 325 | 333 | elif self.user_from == self.TOURGUIDE_USER: | 
| 326 | 334 | return self.name | 
| 327 | - elif self.user_from == self.WEAPP_USER: | |
| 335 | + elif self.user_from == self.MINIAPP_USER: | |
| 328 | 336 | return self.nickname | 
| 329 | 337 | return self.nickname | 
| 330 | 338 |  | 
| @@ -3,6 +3,7 @@ | ||
| 3 | 3 | from __future__ import division | 
| 4 | 4 |  | 
| 5 | 5 | from django.conf import settings | 
| 6 | +from django.db import transaction | |
| 6 | 7 | from logit import logit | 
| 7 | 8 |  | 
| 8 | 9 | from account.models import TourGuideInfo, UserInfo | 
| @@ -47,32 +48,25 @@ def tourguide_submit_api(request): | ||
| 47 | 48 |  | 
| 48 | 49 |  | 
| 49 | 50 | @logit | 
| 51 | +@transaction.atomic | |
| 50 | 52 | def tourguide_wx_authorize_api(request): | 
| 51 | -    unionid = request.POST.get('unionid', '') | |
| 52 | -    openid = request.POST.get('openid', '') | |
| 53 | - | |
| 54 | -    sex = request.POST.get('sex', 0) | |
| 55 | -    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') | |
| 56 | -    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') | |
| 57 | -    country = request.POST.get('country', '') | |
| 58 | -    province = request.POST.get('province', '') | |
| 59 | -    city = request.POST.get('city', '') | |
| 60 | - | |
| 61 | 53 | try: | 
| 62 | - user = UserInfo.objects.get(unionid=unionid, istourguide=True, status=True) | |
| 54 | +        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), istourguide=True, status=True) | |
| 63 | 55 | except UserInfo.DoesNotExist: | 
| 64 | 56 | return response(TourGuideStatusCode.TOURGUIDE_NOT_FOUND) | 
| 65 | 57 |  | 
| 58 | + # 用户是否激活 | |
| 66 | 59 | if user.user_status != UserInfo.ACTIVATED: | 
| 67 | 60 | return response(TourGuideStatusCode.TOURGUIDE_NOT_ACTIVATED) | 
| 68 | 61 |  | 
| 69 | - user.openid = openid | |
| 70 | - user.sex = sex | |
| 71 | - user.nickname = nickname | |
| 72 | - user.avatar = avatar | |
| 73 | - user.country = country | |
| 74 | - user.province = province | |
| 75 | - user.city = city | |
| 62 | + # Set User Key's Value | |
| 63 | +    user.openid_tourguide = request.POST.get('openid', '') | |
| 64 | +    user.sex = request.POST.get('sex', 0) | |
| 65 | +    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') | |
| 66 | +    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') | |
| 67 | +    user.country = request.POST.get('country', '') | |
| 68 | +    user.province = request.POST.get('province', '') | |
| 69 | +    user.city = request.POST.get('city', '') | |
| 76 | 70 | user.save() | 
| 77 | 71 |  | 
| 78 | 72 | set_profile_info(user) | 
| @@ -1,7 +1,6 @@ | ||
| 1 | 1 | # -*- coding: utf-8 -*- | 
| 2 | 2 |  | 
| 3 | 3 | from curtail_uuid import CurtailUUID | 
| 4 | -from django.contrib.auth.hashers import check_password, make_password | |
| 5 | 4 | from django.contrib.auth.models import Group, User | 
| 6 | 5 | from django.db import transaction | 
| 7 | 6 | from ipaddr import client_ip | 
| @@ -9,195 +8,43 @@ from logit import logit | ||
| 9 | 8 | from rest_framework import viewsets | 
| 10 | 9 | from TimeConvert import TimeConvert as tc | 
| 11 | 10 |  | 
| 12 | -from account.models import LensmanInfo, UserInfo, UserLoginLogInfo | |
| 11 | +from account.models import LensmanInfo, UserInfo | |
| 13 | 12 | from account.serializers import GroupSerializer, LensmanInfoSerializer, UserInfoSerializer, UserSerializer | 
| 14 | 13 | from operation.models import GuestEntranceControlInfo | 
| 15 | -from utils.error.errno_utils import LensmanStatusCode, UserStatusCode | |
| 14 | +from utils.error.errno_utils import UserStatusCode | |
| 16 | 15 | from utils.error.response_utils import response | 
| 17 | 16 | from utils.redis.rguest import get_guest_entrance_control | 
| 18 | 17 | from utils.redis.rprofile import set_profile_info | 
| 19 | 18 | from utils.version_utils import is_version_match | 
| 20 | 19 |  | 
| 21 | 20 |  | 
| 22 | -# curl -X POST -F username=xxxxxxx -F password=xxxxxxx http://api.pai.ai/login | |
| 23 | -@logit | |
| 24 | -def lensman_login_api(request): | |
| 25 | -    username = request.POST.get('username', '') | |
| 26 | -    password = request.POST.get('password', '') | |
| 27 | - | |
| 28 | - try: | |
| 29 | - lensman = LensmanInfo.objects.get(username=username, status=True) | |
| 30 | - except LensmanInfo.DoesNotExist: | |
| 31 | - return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | |
| 32 | - | |
| 33 | - if not check_password(password, lensman.encryption): | |
| 34 | - return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR) | |
| 35 | - | |
| 36 | -    return response(200, 'Login Success', u'登录成功', { | |
| 37 | - 'user_id': lensman.lensman_id | |
| 38 | - }) | |
| 39 | - | |
| 40 | - | |
| 41 | -@logit | |
| 42 | -def user_is_registered_api(request): | |
| 43 | -    username = request.POST.get('username', '') | |
| 44 | - | |
| 45 | -    return response(200, data={ | |
| 46 | - 'registered': UserInfo.objects.filter(username=username).exists(), | |
| 47 | - }) | |
| 48 | - | |
| 49 | - | |
| 50 | -@logit | |
| 51 | -@transaction.atomic | |
| 52 | -def user_signup_api(request): | |
| 53 | -    user_id = request.POST.get('user_id', '') | |
| 54 | -    username = request.POST.get('username', '') | |
| 55 | -    password = request.POST.get('password', '') | |
| 56 | - | |
| 57 | - if UserInfo.objects.filter(username=username).exists(): | |
| 58 | - return response(UserStatusCode.USERNAME_HAS_REGISTERED) | |
| 59 | - | |
| 60 | - # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户 | |
| 61 | - signup_ip, signup_at = client_ip(request), tc.utc_datetime() | |
| 62 | - | |
| 63 | - try: | |
| 64 | - user = UserInfo.objects.select_for_update().get(user_id=user_id, status=True) | |
| 65 | - except UserInfo.DoesNotExist: | |
| 66 | - user = None | |
| 67 | - | |
| 68 | - if user and user.user_status == UserInfo.ASSIGN: | |
| 69 | - user.user_from = UserInfo.APP_USER, | |
| 70 | - user.username = username | |
| 71 | - user.password = make_password(password, None, 'pbkdf2_sha256') | |
| 72 | - user.user_status = UserInfo.ACTIVATED | |
| 73 | - user.signup_ip = signup_ip | |
| 74 | - user.signup_at = signup_at | |
| 75 | - user.save() | |
| 76 | - else: | |
| 77 | - user = UserInfo.objects.create( | |
| 78 | - user_id=CurtailUUID.uuid(UserInfo, 'user_id'), | |
| 79 | - user_from=UserInfo.APP_USER, | |
| 80 | - username=username, | |
| 81 | - password=make_password(password, None, 'pbkdf2_sha256'), | |
| 82 | - user_status=UserInfo.ACTIVATED, | |
| 83 | - signup_ip=signup_ip, | |
| 84 | - signup_at=signup_at, | |
| 85 | - ) | |
| 86 | - | |
| 87 | - return response(200, 'Signup Success', u'注册成功', user.data) | |
| 88 | - | |
| 89 | - | |
| 90 | -@logit | |
| 91 | -@transaction.atomic | |
| 92 | -def user_login_api(request): | |
| 93 | -    username = request.POST.get('username', '') | |
| 94 | -    password = request.POST.get('password', '') | |
| 95 | - | |
| 96 | - try: | |
| 97 | - user = UserInfo.objects.select_for_update().get(username=username, status=True) | |
| 98 | - except UserInfo.DoesNotExist: | |
| 99 | - return response(UserStatusCode.USER_NOT_FOUND) | |
| 100 | - | |
| 101 | - login_ip, login_at = client_ip(request), tc.utc_datetime() | |
| 102 | - | |
| 103 | - if not check_password(password, user.password): | |
| 104 | - UserLoginLogInfo.objects.create( | |
| 105 | - user_id=user.user_id, | |
| 106 | - login_ip=login_ip, | |
| 107 | - login_result=UserLoginLogInfo.PWD_ERROR | |
| 108 | - ) | |
| 109 | - return response(UserStatusCode.USER_PASSWORD_ERROR) | |
| 110 | - | |
| 111 | - UserLoginLogInfo.objects.create( | |
| 112 | - user_id=user.user_id, | |
| 113 | - login_ip=login_ip, | |
| 114 | - login_result=UserLoginLogInfo.SUCCESS | |
| 115 | - ) | |
| 116 | - | |
| 117 | - user.login_ip = login_ip | |
| 118 | - user.login_at = login_at | |
| 119 | - user.save() | |
| 120 | - | |
| 121 | - return response(200, 'Login Success', u'登录成功', user.data) | |
| 122 | - | |
| 123 | - | |
| 124 | 21 | @logit | 
| 125 | 22 | @transaction.atomic | 
| 126 | 23 | def user_wx_authorize_api(request): | 
| 127 | -    user_id = request.POST.get('user_id', '') | |
| 128 | - | |
| 129 | -    unionid = request.POST.get('unionid', '') | |
| 130 | -    openid = request.POST.get('wx_uid', '') | |
| 131 | - | |
| 132 | -    sex = request.POST.get('sex', 0) | |
| 133 | -    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') | |
| 134 | -    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') | |
| 135 | -    country = request.POST.get('country', '') | |
| 136 | -    province = request.POST.get('province', '') | |
| 137 | -    city = request.POST.get('city', '') | |
| 138 | - | |
| 139 | - try: | |
| 140 | - user = UserInfo.objects.select_for_update().get(unionid=unionid) | |
| 141 | - except UserInfo.DoesNotExist: | |
| 142 | - user = None | |
| 143 | - | |
| 144 | - if user: | |
| 145 | - user.openid = openid | |
| 146 | - user.sex = sex | |
| 147 | - user.nickname = nickname | |
| 148 | - user.avatar = avatar | |
| 149 | - user.country = country | |
| 150 | - user.province = province | |
| 151 | - user.city = city | |
| 152 | - user.save() | |
| 153 | - | |
| 154 | - set_profile_info(user) | |
| 155 | - | |
| 156 | - return response(200, 'Login Success', u'登录成功', user.data) | |
| 157 | - | |
| 158 | - # unionid 不存在 | |
| 159 | - # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户 | |
| 160 | - | |
| 161 | - signup_ip, signup_at = client_ip(request), tc.utc_datetime() | |
| 162 | - | |
| 163 | - try: | |
| 164 | - user = UserInfo.objects.select_for_update().get(user_id=user_id) | |
| 165 | - except UserInfo.DoesNotExist: | |
| 166 | - user = None | |
| 167 | - | |
| 168 | - if user and user.user_status == UserInfo.ASSIGN: | |
| 169 | - user.user_from = UserInfo.WX_USER | |
| 170 | - user.openid = openid | |
| 171 | - user.unionid = unionid | |
| 172 | - user.sex = sex | |
| 173 | - user.nickname = nickname | |
| 174 | - user.avatar = avatar | |
| 175 | - user.country = country | |
| 176 | - user.province = province | |
| 177 | - user.city = city | |
| 178 | - user.signup_ip = signup_ip | |
| 179 | - user.signup_at = signup_at | |
| 180 | - user.save() | |
| 181 | - else: | |
| 182 | - user = UserInfo.objects.create( | |
| 183 | - user_id=CurtailUUID.uuid(UserInfo, 'user_id'), | |
| 184 | - user_from=UserInfo.WX_USER, | |
| 185 | - openid=openid, | |
| 186 | - unionid=unionid, | |
| 187 | - sex=sex, | |
| 188 | - nickname=nickname, | |
| 189 | - avatar=avatar, | |
| 190 | - country=country, | |
| 191 | - province=province, | |
| 192 | - city=city, | |
| 193 | - user_status=UserInfo.ACTIVATED, | |
| 194 | - signup_ip=signup_ip, | |
| 195 | - signup_at=signup_at, | |
| 196 | - ) | |
| 24 | + # Get or Create User | |
| 25 | +    user, created = UserInfo.objects.select_for_update().get_or_create(unionid=request.POST.get('unionid', '')) | |
| 26 | + | |
| 27 | + # Set User_id | |
| 28 | + if created: | |
| 29 | + user.user_id = CurtailUUID.uuid(UserInfo, 'user_id') | |
| 30 | + | |
| 31 | + # Set User Key's Value | |
| 32 | + user.user_from = UserInfo.USER_USER | |
| 33 | +    user.openid = request.POST.get('wx_uid', '') | |
| 34 | +    user.sex = request.POST.get('sex', 0) | |
| 35 | +    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') | |
| 36 | +    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') | |
| 37 | +    user.country = request.POST.get('country', '') | |
| 38 | +    user.province = request.POST.get('province', '') | |
| 39 | +    user.city = request.POST.get('city', '') | |
| 40 | + user.user_status = UserInfo.ACTIVATED | |
| 41 | + user.signup_ip = client_ip(request) | |
| 42 | + user.signup_at = tc.utc_datetime() | |
| 43 | + user.save() | |
| 197 | 44 |  | 
| 198 | - set_profile_info(user) | |
| 45 | + set_profile_info(user) | |
| 199 | 46 |  | 
| 200 | - return response(200, 'Login Success', u'登录成功', user.data) | |
| 47 | + return response(200, 'User Login Success', u'用户端登录成功', user.data) | |
| 201 | 48 |  | 
| 202 | 49 |  | 
| 203 | 50 | @logit | 
| @@ -20,11 +20,6 @@ from wechat import views as wechat_views | ||
| 20 | 20 |  | 
| 21 | 21 | # 帐户相关 | 
| 22 | 22 | urlpatterns = [ | 
| 23 | - url(r'^login$', account_views.lensman_login_api, name='lensman_login_api'), # 摄影师登录 | |
| 24 | - url(r'^u/is_registered$', account_views.user_is_registered_api, name='user_is_registered_api'), # 用户是否已经注册 | |
| 25 | - url(r'^u/signup$', account_views.user_signup_api, name='user_signup_api'), # 用户注册 | |
| 26 | - url(r'^u/login$', account_views.user_login_api, name='user_login_api'), # 用户登录 | |
| 27 | - | |
| 28 | 23 | url(r'^u/wx/authorize$', account_views.user_wx_authorize_api, name='user_wx_authorize_api'), # 用户端 - 微信用户授权 | 
| 29 | 24 |  | 
| 30 | 25 | url(r'^u/guest/status$', op_views.guest_api, name='user_guest_status_api'), # 用户端 - 微游客状态(是否开启) | 
| @@ -34,7 +29,6 @@ urlpatterns = [ | ||
| 34 | 29 | # 摄影师相关 | 
| 35 | 30 | urlpatterns += [ | 
| 36 | 31 | url(r'^l/submit$', lensman_views.lensman_submit_api, name='lensman_submit_api'), # 摄影师信息提交 | 
| 37 | - url(r'^l/login$', lensman_views.lensman_login_api, name='lensman_login_api'), # 摄影师登录 | |
| 38 | 32 |  | 
| 39 | 33 | url(r'^l/wx/authorize$', lensman_views.lensman_wx_authorize_api, name='lensman_wx_authorize_api'), # 摄影师端 - 微信用户授权 | 
| 40 | 34 |  | 
| @@ -3,8 +3,8 @@ | ||
| 3 | 3 | from __future__ import division | 
| 4 | 4 |  | 
| 5 | 5 | from curtail_uuid import CurtailUUID | 
| 6 | -from django.contrib.auth.hashers import check_password | |
| 7 | 6 | from django.db import transaction | 
| 7 | +from ipaddr import client_ip | |
| 8 | 8 | from isoweek import Week | 
| 9 | 9 | from logit import logit | 
| 10 | 10 | from paginator import pagination | 
| @@ -60,54 +60,27 @@ def lensman_submit_api(request): | ||
| 60 | 60 |  | 
| 61 | 61 |  | 
| 62 | 62 | @logit | 
| 63 | -def lensman_login_api(request): | |
| 64 | - """ 摄影师登录 """ | |
| 65 | -    username = request.POST.get('username', '') | |
| 66 | -    password = request.POST.get('password', '') | |
| 67 | - | |
| 68 | - try: | |
| 69 | - lensman = LensmanInfo.objects.get(username=username, status=True) | |
| 70 | - except LensmanInfo.DoesNotExist: | |
| 71 | - return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | |
| 72 | - | |
| 73 | - if not check_password(password, lensman.encryption): | |
| 74 | - return response(LensmanStatusCode.LENSMAN_PASSWORD_ERROR) | |
| 75 | - | |
| 76 | - try: | |
| 77 | - user = UserInfo.objects.get(user_id=lensman.lensman_id, status=True) | |
| 78 | - except UserInfo.DoesNotExist: | |
| 79 | - return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | |
| 80 | - | |
| 81 | - return response(200, 'Login Success', u'登录成功', user.data) | |
| 82 | - | |
| 83 | - | |
| 84 | -@logit | |
| 63 | +@transaction.atomic | |
| 85 | 64 | def lensman_wx_authorize_api(request): | 
| 86 | -    unionid = request.POST.get('unionid', '') | |
| 87 | -    openid = request.POST.get('openid', '') | |
| 88 | - | |
| 89 | -    sex = request.POST.get('sex', 0) | |
| 90 | -    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') | |
| 91 | -    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') | |
| 92 | -    country = request.POST.get('country', '') | |
| 93 | -    province = request.POST.get('province', '') | |
| 94 | -    city = request.POST.get('city', '') | |
| 95 | - | |
| 96 | 65 | try: | 
| 97 | - user = UserInfo.objects.get(unionid=unionid, islensman=True, status=True) | |
| 66 | +        user = UserInfo.objects.select_for_update().get(unionid=request.POST.get('unionid', ''), islensman=True, status=True) | |
| 98 | 67 | except UserInfo.DoesNotExist: | 
| 99 | 68 | return response(LensmanStatusCode.LENSMAN_NOT_FOUND) | 
| 100 | 69 |  | 
| 70 | + # 用户是否激活 | |
| 101 | 71 | if user.user_status != UserInfo.ACTIVATED: | 
| 102 | 72 | return response(LensmanStatusCode.LENSMAN_NOT_ACTIVATED) | 
| 103 | 73 |  | 
| 104 | - user.openid = openid | |
| 105 | - user.sex = sex | |
| 106 | - user.nickname = nickname | |
| 107 | - user.avatar = avatar | |
| 108 | - user.country = country | |
| 109 | - user.province = province | |
| 110 | - user.city = city | |
| 74 | + # Set User Key's Value | |
| 75 | +    user.openid_lensman = request.POST.get('openid', '') | |
| 76 | +    user.sex = request.POST.get('sex', 0) | |
| 77 | +    user.nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '') | |
| 78 | +    user.avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '') | |
| 79 | +    user.country = request.POST.get('country', '') | |
| 80 | +    user.province = request.POST.get('province', '') | |
| 81 | +    user.city = request.POST.get('city', '') | |
| 82 | + user.signup_ip = client_ip(request) | |
| 83 | + user.signup_at = tc.utc_datetime() | |
| 111 | 84 | user.save() | 
| 112 | 85 |  | 
| 113 | 86 | set_profile_info(user) | 
| @@ -28,40 +28,39 @@ def get_userinfo_api(request): | ||
| 28 | 28 |      encryptedData = request.POST.get('encryptedData', '') | 
| 29 | 29 |      iv = request.POST.get('iv', '') | 
| 30 | 30 |  | 
| 31 | +    # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0', | |
| 32 | + # u'city': u'Guangzhou', | |
| 33 | + # u'country': u'CN', | |
| 34 | + # u'gender': 1, | |
| 35 | + # u'language': u'zh_CN', | |
| 36 | + # u'nickName': u'Band', | |
| 37 | + # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE', | |
| 38 | + # u'province': u'Guangdong', | |
| 39 | + # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA', | |
| 40 | +    #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}} | |
| 31 | 41 | userinfo = get_userinfo(appid=appid, secret=secret, code=code, encryptedData=encryptedData, iv=iv) | 
| 32 | 42 |  | 
| 33 | - try: | |
| 34 | -        user = UserInfo.objects.select_for_update().get(unionid=userinfo.get('unionId', '')) | |
| 35 | - except UserInfo.DoesNotExist: | |
| 36 | - user = None | |
| 43 | + # Get or Create User | |
| 44 | +    user, created = UserInfo.objects.select_for_update().get_or_create(unionid=userinfo.get('unionId', '')) | |
| 37 | 45 |  | 
| 38 | - if not user: | |
| 39 | -        # {u'avatarUrl': u'http://wx.qlogo.cn/mmopen/vi_32/aSKcBBPpibyKNicHNTMM0qJVh8Kjgiak2AHWr8MHM4WgMEm7GFhsf8OYrySdbvAMvTsw3mo8ibKicsnfN5pRjl1p8HQ/0', | |
| 40 | - # u'city': u'Guangzhou', | |
| 41 | - # u'country': u'CN', | |
| 42 | - # u'gender': 1, | |
| 43 | - # u'language': u'zh_CN', | |
| 44 | - # u'nickName': u'Band', | |
| 45 | - # u'openId': u'oGZUI0egBJY1zhBYw2KhdUfwVJJE', | |
| 46 | - # u'province': u'Guangdong', | |
| 47 | - # u'unionId': u'ocMvos6NjeKLIBqg5Mr9QjxrP1FA', | |
| 48 | -        #  u'watermark': {u'appid': u'wx4f4bc4dec97d474b', u'timestamp': 1477314187}} | |
| 49 | - user = UserInfo.objects.create( | |
| 50 | - user_id=CurtailUUID.uuid(UserInfo, 'user_id'), | |
| 51 | - user_from=UserInfo.WX_USER, | |
| 52 | -            openid=userinfo.get('openId', ''), | |
| 53 | -            unionid=userinfo.get('unionId', ''), | |
| 54 | -            sex=userinfo.get('gender', 0), | |
| 55 | -            nickname=userinfo.get('nickName', ''), | |
| 56 | -            avatar=userinfo.get('avatarUrl', ''), | |
| 57 | -            country=userinfo.get('country', ''), | |
| 58 | -            province=userinfo.get('province', ''), | |
| 59 | -            city=userinfo.get('city', ''), | |
| 60 | - user_status=UserInfo.ACTIVATED, | |
| 61 | - signup_ip=client_ip(request), | |
| 62 | - signup_at=tc.utc_datetime(), | |
| 63 | - ) | |
| 46 | + # Set User_id | |
| 47 | + if created: | |
| 48 | + user.user_id = CurtailUUID.uuid(UserInfo, 'user_id') | |
| 64 | 49 |  | 
| 65 | - set_profile_info(user) | |
| 50 | + # Set User Key's Value | |
| 51 | + user.user_from = UserInfo.MINIAPP_USER | |
| 52 | +    user.openid_miniapp = userinfo.get('openId', '') | |
| 53 | +    user.sex = userinfo.get('gender', '') | |
| 54 | +    user.nickname = userinfo.get('nickName', '') | |
| 55 | +    user.avatar = userinfo.get('avatarUrl', '') | |
| 56 | +    user.country = userinfo.get('country', '') | |
| 57 | +    user.province = userinfo.get('province', '') | |
| 58 | +    user.city = userinfo.get('city', '') | |
| 59 | + user.user_status = UserInfo.ACTIVATED | |
| 60 | + user.signup_ip = client_ip(request) | |
| 61 | + user.signup_at = tc.utc_datetime() | |
| 62 | + user.save() | |
| 63 | + | |
| 64 | + set_profile_info(user) | |
| 66 | 65 |  | 
| 67 | 66 | return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.data) | 
| @@ -19,6 +19,7 @@ from utils.error.errno_utils import (GroupPhotoStatusCode, OrderStatusCode, User | ||
| 19 | 19 | from utils.error.response_utils import response | 
| 20 | 20 | from utils.redis.rbrief import set_brief_info | 
| 21 | 21 | from utils.redis.rorder import set_lensman_order_record | 
| 22 | +from utils.wechat_utils import get_user_openid | |
| 22 | 23 |  | 
| 23 | 24 |  | 
| 24 | 25 | WECHAT = settings.WECHAT | 
| @@ -33,7 +34,13 @@ def wx_order_create_api(request): | ||
| 33 | 34 |      photo_id = request.POST.get('photo_id', '') | 
| 34 | 35 |      photo_type = request.POST.get('photo_type', 'nomark')  # nomark for 去除水印, origin for 获取高清图 | 
| 35 | 36 |  | 
| 36 | - photo_type_ = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK | |
| 37 | + photo_type_int = OrderInfo.ORIGIN if photo_type == 'origin' else OrderInfo.NOMARK | |
| 38 | + | |
| 39 | + # 用户校验 | |
| 40 | + try: | |
| 41 | + user = UserInfo.objects.get(user_id=user_id) | |
| 42 | + except UserInfo.DoesNotExist: | |
| 43 | + return response(UserStatusCode.USER_NOT_FOUND) | |
| 37 | 44 |  | 
| 38 | 45 | # 群组照片校验 | 
| 39 | 46 | try: | 
| @@ -42,7 +49,7 @@ def wx_order_create_api(request): | ||
| 42 | 49 | return response(GroupPhotoStatusCode.GROUP_PHOTO_NOT_FOUND) | 
| 43 | 50 |  | 
| 44 | 51 | # 判断是否重复购买 | 
| 45 | - if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_, from_uid=user_id, pay_status=OrderInfo.PAID).exists(): | |
| 52 | + if OrderInfo.objects.filter(photo_id=photo_id, photo_type=photo_type_int, from_uid=user_id, pay_status=OrderInfo.PAID).exists(): | |
| 46 | 53 | return response(OrderStatusCode.WX_ORDER_PAID_ALREADY_EXISTS) | 
| 47 | 54 |  | 
| 48 | 55 |      body = request.POST.get('body', '')  # 商品描述 | 
| @@ -69,7 +76,7 @@ def wx_order_create_api(request): | ||
| 69 | 76 | group_id=group_id, | 
| 70 | 77 | photo_id=photo_id, | 
| 71 | 78 | lensman_photo_id=group_photo.lensman_photo_id, | 
| 72 | - photo_type=1 if photo_type == 'origin' else 0, | |
| 79 | + photo_type=photo_type_int, | |
| 73 | 80 | from_uid=from_uid, | 
| 74 | 81 | to_uid=to_uid, | 
| 75 | 82 | session_id=group_photo.session_id, | 
| @@ -83,14 +90,14 @@ def wx_order_create_api(request): | ||
| 83 | 90 | notify_url=settings.API_DOMAIN + '/wx/notify_url', | 
| 84 | 91 | out_trade_no=order.order_id, | 
| 85 | 92 | total_fee=total_fee, | 
| 86 | - trade_type=trade_type, | |
| 87 | - # user_id=None, # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传 | |
| 93 | + trade_type=trade_type if trade_type != 'MINIAPP' else 'JSAPI', | |
| 94 | + user_id=get_user_openid(user, trade_type), # 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传 | |
| 88 | 95 | ) | 
| 89 | 96 | except WeChatPayException: | 
| 90 | 97 | return response(OrderStatusCode.WX_UNIFIED_ORDER_FAIL) | 
| 91 | 98 |  | 
| 92 | 99 |      prepay_id = prepay_data.get('prepay_id', '') | 
| 93 | - if trade_type == 'JSAPI': | |
| 100 | + if trade_type == 'JSAPI' or trade_type == 'MINIAPP': | |
| 94 | 101 | wxpay_params = wxpay.jsapi.get_jsapi_params(prepay_id) | 
| 95 | 102 | elif trade_type == 'APP': | 
| 96 | 103 | wxpay_params = wxpay.order.get_appapi_params(prepay_id) | 
| @@ -0,0 +1,13 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | + | |
| 4 | +def get_user_openid(user, trade_type): | |
| 5 | + if trade_type == 'MINIAPP': | |
| 6 | + openid = user.openid_miniapp | |
| 7 | + elif trade_type == 'JSAPI': | |
| 8 | + openid = user.openid_oauth | |
| 9 | + elif trade_type == 'APP': | |
| 10 | + openid = None | |
| 11 | + else: | |
| 12 | + openid = None | |
| 13 | + return openid | 
| @@ -0,0 +1,13 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | |
| 2 | + | |
| 3 | + | |
| 4 | +def get_user_openid(user, trade_type): | |
| 5 | + if trade_type == 'MINIAPP': | |
| 6 | + openid = user.openid_miniapp | |
| 7 | + elif trade_type == 'JSAPI': | |
| 8 | + openid = user.openid_oauth | |
| 9 | + elif trade_type == 'APP': | |
| 10 | + openid = None | |
| 11 | + else: | |
| 12 | + openid = None | |
| 13 | + return openid |