| @@ -3,6 +3,7 @@ | ||
| 3 | 3 | from curtail_uuid import CurtailUUID | 
| 4 | 4 | from django.contrib import admin | 
| 5 | 5 | from django.contrib.auth.hashers import make_password | 
| 6 | +from django.db import transaction | |
| 6 | 7 |  | 
| 7 | 8 | from account.models import (LensmanIncomeExpensesInfo, LensmanInfo, LensmanLoginLogInfo, UserIncomeExpensesInfo, | 
| 8 | 9 | UserInfo, UserLoginLogInfo) | 
| @@ -14,10 +15,11 @@ class LensmanInfoAdmin(admin.ModelAdmin): | ||
| 14 | 15 |      search_fields = ('name', 'phone', 'location') | 
| 15 | 16 |      list_filter = ('sex', 'user_status', 'status') | 
| 16 | 17 |  | 
| 18 | + @transaction.atomic | |
| 17 | 19 | def save_model(self, request, obj, form, change): | 
| 18 | 20 | if not obj.lensman_id: | 
| 19 | 21 | try: | 
| 20 | - user_id = UserInfo.objects.get(unionid=obj.unionid).user_id | |
| 22 | + user_id = UserInfo.objects.select_for_update().get(unionid=obj.unionid).user_id | |
| 21 | 23 | except UserInfo.DoesNotExist: | 
| 22 | 24 | user_id = None | 
| 23 | 25 | obj.lensman_id = user_id or CurtailUUID.uuid(UserInfo, 'user_id') | 
| @@ -3,6 +3,7 @@ | ||
| 3 | 3 | from curtail_uuid import CurtailUUID | 
| 4 | 4 | from django.contrib.auth.hashers import check_password, make_password | 
| 5 | 5 | from django.contrib.auth.models import Group, User | 
| 6 | +from django.db import transaction | |
| 6 | 7 | from logit import logit | 
| 7 | 8 | from rest_framework import viewsets | 
| 8 | 9 | from TimeConvert import TimeConvert as tc | 
| @@ -44,6 +45,7 @@ def user_is_registered_api(request): | ||
| 44 | 45 |  | 
| 45 | 46 |  | 
| 46 | 47 | @logit | 
| 48 | +@transaction.atomic | |
| 47 | 49 | def user_signup_api(request): | 
| 48 | 50 |      user_id = request.POST.get('user_id', '') | 
| 49 | 51 |      username = request.POST.get('username', '') | 
| @@ -56,7 +58,7 @@ def user_signup_api(request): | ||
| 56 | 58 | signup_ip, signup_at = ip_addr(request), tc.utc_datetime() | 
| 57 | 59 |  | 
| 58 | 60 | try: | 
| 59 | - user = UserInfo.objects.get(user_id=user_id) | |
| 61 | + user = UserInfo.objects.select_for_update().get(user_id=user_id) | |
| 60 | 62 | except UserInfo.DoesNotExist: | 
| 61 | 63 | user = None | 
| 62 | 64 |  | 
| @@ -83,12 +85,13 @@ def user_signup_api(request): | ||
| 83 | 85 |  | 
| 84 | 86 |  | 
| 85 | 87 | @logit | 
| 88 | +@transaction.atomic | |
| 86 | 89 | def user_login_api(request): | 
| 87 | 90 |      username = request.POST.get('username', '') | 
| 88 | 91 |      password = request.POST.get('password', '') | 
| 89 | 92 |  | 
| 90 | 93 | try: | 
| 91 | - user = UserInfo.objects.get(username=username) | |
| 94 | + user = UserInfo.objects.select_for_update().get(username=username) | |
| 92 | 95 | except UserInfo.DoesNotExist: | 
| 93 | 96 | return response(UserStatusCode.USER_NOT_FOUND) | 
| 94 | 97 |  | 
| @@ -116,6 +119,7 @@ def user_login_api(request): | ||
| 116 | 119 |  | 
| 117 | 120 |  | 
| 118 | 121 | @logit | 
| 122 | +@transaction.atomic | |
| 119 | 123 | def user_wx_authorize_api(request): | 
| 120 | 124 |      user_id = request.POST.get('user_id', '') | 
| 121 | 125 |  | 
| @@ -131,7 +135,7 @@ def user_wx_authorize_api(request): | ||
| 131 | 135 |  | 
| 132 | 136 | # 判断 unionid 是否已经存在,如果已经存在,则直接返回改帐户信息 | 
| 133 | 137 | try: | 
| 134 | - user = UserInfo.objects.get(unionid=unionid) | |
| 138 | + user = UserInfo.objects.select_for_update().get(unionid=unionid) | |
| 135 | 139 | except UserInfo.DoesNotExist: | 
| 136 | 140 | user = None | 
| 137 | 141 |  | 
| @@ -153,7 +157,7 @@ def user_wx_authorize_api(request): | ||
| 153 | 157 | signup_ip, signup_at = ip_addr(request), tc.utc_datetime() | 
| 154 | 158 |  | 
| 155 | 159 | try: | 
| 156 | - user = UserInfo.objects.get(user_id=user_id) | |
| 160 | + user = UserInfo.objects.select_for_update().get(user_id=user_id) | |
| 157 | 161 | except UserInfo.DoesNotExist: | 
| 158 | 162 | user = None | 
| 159 | 163 |  | 
| @@ -216,6 +220,7 @@ def guest_status_api(request): | ||
| 216 | 220 |  | 
| 217 | 221 |  | 
| 218 | 222 | @logit | 
| 223 | +@transaction.atomic | |
| 219 | 224 | def guest_login_api(request): | 
| 220 | 225 | """ 游客登录 """ | 
| 221 | 226 | gen = get_guest_entrance_control() | 
| @@ -249,12 +254,12 @@ def guest_login_api(request): | ||
| 249 | 254 | } | 
| 250 | 255 | # 若 uuid 存在,则 get_or_create,否则 create | 
| 251 | 256 | if uuid: | 
| 252 | - user, created = UserInfo.objects.get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields) | |
| 257 | + user, created = UserInfo.objects.select_for_update().get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields) | |
| 253 | 258 | if created: | 
| 254 | 259 |              user.nickname = u'游客{}'.format(user.pk) | 
| 255 | 260 | user.save() | 
| 256 | 261 | else: | 
| 257 | - user = UserInfo.objects.create(**fields) | |
| 262 | + user = UserInfo.objects.select_for_update().create(**fields) | |
| 258 | 263 |          user.nickname = u'游客{}'.format(user.pk) | 
| 259 | 264 | user.save() | 
| 260 | 265 |  | 
| @@ -300,7 +300,7 @@ def lensman_origin_photo_upload_api(request): | ||
| 300 | 300 |      photo = request.FILES.get('photo', '') | 
| 301 | 301 |  | 
| 302 | 302 | try: | 
| 303 | - order = OrderInfo.objects.get(order_id=order_id, pay_status=OrderInfo.PAID) | |
| 303 | + order = OrderInfo.objects.select_for_update().get(order_id=order_id, pay_status=OrderInfo.PAID) | |
| 304 | 304 | except OrderInfo.DoesNotExist: | 
| 305 | 305 | return response(OrderStatusCode.WX_ORDER_NOT_FOUND) | 
| 306 | 306 |  | 
| @@ -375,7 +375,7 @@ def lensman_origin_photo_upload_api(request): | ||
| 375 | 375 | r_photo_path=r_photo_path | 
| 376 | 376 | ) | 
| 377 | 377 |  | 
| 378 | - porder, created = GroupPhotoOrderInfo.objects.get_or_create( | |
| 378 | + porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create( | |
| 379 | 379 | group_id=order.group_id, | 
| 380 | 380 | session_id=session_id, | 
| 381 | 381 | user_id=order.from_uid, | 
| @@ -116,7 +116,7 @@ def order_paid_success(order): | ||
| 116 | 116 | order.paid_at = tc.utc_datetime() | 
| 117 | 117 | order.save() | 
| 118 | 118 |  | 
| 119 | - porder, created = GroupPhotoOrderInfo.objects.get_or_create( | |
| 119 | + porder, created = GroupPhotoOrderInfo.objects.select_for_update().get_or_create( | |
| 120 | 120 | group_id=order.group_id, | 
| 121 | 121 | session_id=order.session_id, | 
| 122 | 122 | user_id=order.from_uid, | 
| @@ -185,7 +185,7 @@ def wx_order_query_api(request): | ||
| 185 | 185 |      transaction_id = request.POST.get('transaction_id', '') | 
| 186 | 186 |  | 
| 187 | 187 | try: | 
| 188 | - order = OrderInfo.objects.get(order_id=order_id) | |
| 188 | + order = OrderInfo.objects.select_for_update().get(order_id=order_id) | |
| 189 | 189 | except OrderInfo.DoesNotExist: | 
| 190 | 190 | return response(OrderStatusCode.WX_ORDER_NOT_FOUND) | 
| 191 | 191 |  |