|  | # -*- coding: utf-8 -*-
from curtail_uuid import CurtailUUID
from django.contrib.auth.hashers import check_password, make_password
from django.contrib.auth.models import Group, User
from django.db import transaction
from ipaddr import client_ip
from logit import logit
from rest_framework import viewsets
from TimeConvert import TimeConvert as tc
from account.models import LensmanInfo, UserInfo, UserLoginLogInfo
from account.serializers import GroupSerializer, LensmanInfoSerializer, UserInfoSerializer, UserSerializer
from operation.models import GuestEntranceControlInfo
from utils.error.errno_utils import LensmanStatusCode, UserStatusCode
from utils.error.response_utils import response
from utils.redis.rguest import get_guest_entrance_control
from utils.redis.rprofile import set_profile_info
from utils.version_utils import is_version_match
# curl -X POST -F username=xxxxxxx -F password=xxxxxxx http://api.pai.ai/login
@logit
def lensman_login_api(request):
    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)
    return response(200, 'Login Success', u'登录成功', {
        'user_id': lensman.lensman_id
    })
@logit
def user_is_registered_api(request):
    return response(200, data={
        'registered': UserInfo.objects.filter(username=request.POST.get('username', '')).exists(),
    })
@logit
@transaction.atomic
def user_signup_api(request):
    user_id = request.POST.get('user_id', '')
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    if UserInfo.objects.filter(username=username).exists():
        return response(UserStatusCode.USERNAME_HAS_REGISTERED)
    # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户
    signup_ip, signup_at = client_ip(request), tc.utc_datetime()
    try:
        user = UserInfo.objects.select_for_update().get(user_id=user_id)
    except UserInfo.DoesNotExist:
        user = None
    if user and user.user_status == UserInfo.ASSIGN:
        user.user_from = UserInfo.APP_USER,
        user.username = username
        user.password = make_password(password, None, 'pbkdf2_sha256')
        user.user_status = UserInfo.ACTIVATED
        user.signup_ip = signup_ip
        user.signup_at = signup_at
        user.save()
    else:
        user = UserInfo.objects.create(
            user_id=CurtailUUID.uuid(UserInfo, 'user_id'),
            user_from=UserInfo.APP_USER,
            username=username,
            password=make_password(password, None, 'pbkdf2_sha256'),
            user_status=UserInfo.ACTIVATED,
            signup_ip=signup_ip,
            signup_at=signup_at,
        )
    return response(200, 'Signup Success', u'注册成功', user.data)
@logit
@transaction.atomic
def user_login_api(request):
    username = request.POST.get('username', '')
    password = request.POST.get('password', '')
    try:
        user = UserInfo.objects.select_for_update().get(username=username)
    except UserInfo.DoesNotExist:
        return response(UserStatusCode.USER_NOT_FOUND)
    login_ip, login_at = client_ip(request), tc.utc_datetime()
    if not check_password(password, user.password):
        UserLoginLogInfo.objects.create(
            user_id=user.user_id,
            login_ip=login_ip,
            login_result=UserLoginLogInfo.PWD_ERROR
        )
        return response(UserStatusCode.USER_PASSWORD_ERROR)
    UserLoginLogInfo.objects.create(
        user_id=user.user_id,
        login_ip=login_ip,
        login_result=UserLoginLogInfo.SUCCESS
    )
    user.login_ip = login_ip
    user.login_at = login_at
    user.save()
    return response(200, 'Login Success', u'登录成功', user.data)
@logit
@transaction.atomic
def user_wx_authorize_api(request):
    user_id = request.POST.get('user_id', '')
    unionid = request.POST.get('unionid', '')
    openid = request.POST.get('wx_uid', '')
    sex = request.POST.get('sex', 0)
    nickname = request.POST.get('nickname', '') or request.POST.get('screen_name', '')
    avatar = request.POST.get('headimgurl', '') or request.POST.get('profile_image_url', '')
    country = request.POST.get('country', '')
    province = request.POST.get('province', '')
    city = request.POST.get('city', '')
    try:
        user = UserInfo.objects.select_for_update().get(unionid=unionid)
    except UserInfo.DoesNotExist:
        user = None
    if user:
        user.openid = openid
        user.sex = sex
        user.nickname = nickname
        user.avatar = avatar
        user.country = country
        user.province = province
        user.city = city
        user.save()
        set_profile_info(user)
        return response(200, 'Login Success', u'登录成功', user.data)
    # unionid 不存在
    # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户
    signup_ip, signup_at = client_ip(request), tc.utc_datetime()
    try:
        user = UserInfo.objects.select_for_update().get(user_id=user_id)
    except UserInfo.DoesNotExist:
        user = None
    if user and user.user_status == UserInfo.ASSIGN:
        user.user_from = UserInfo.WX_USER
        user.openid = openid
        user.unionid = unionid
        user.sex = sex
        user.nickname = nickname
        user.avatar = avatar
        user.country = country
        user.province = province
        user.city = city
        user.signup_ip = signup_ip
        user.signup_at = signup_at
        user.save()
    else:
        user = UserInfo.objects.create(
            user_id=CurtailUUID.uuid(UserInfo, 'user_id'),
            user_from=UserInfo.WX_USER,
            openid=openid,
            unionid=unionid,
            sex=sex,
            nickname=nickname,
            avatar=avatar,
            country=country,
            province=province,
            city=city,
            user_status=UserInfo.ACTIVATED,
            signup_ip=signup_ip,
            signup_at=signup_at,
        )
        set_profile_info(user)
    return response(200, 'Login Success', u'登录成功', user.data)
@logit
def guest_status_api(request):
    """ 游客状态 """
    gen = get_guest_entrance_control()
    # 是否配置游客入口控制信息
    if not gen:
        return response(UserStatusCode.GUEST_NOT_ALLOWED)
    # 平台校验
    platform = gen.get('platform', '')
    if request.Android:
        if platform not in [GuestEntranceControlInfo.ADR, GuestEntranceControlInfo.BOTH]:
            return response(UserStatusCode.GUEST_NOT_ALLOWED)
    else:
        if platform not in [GuestEntranceControlInfo.IOS, GuestEntranceControlInfo.BOTH]:
            return response(UserStatusCode.GUEST_NOT_ALLOWED)
    # 版本校验
    if not is_version_match(request, gen):
        return response(UserStatusCode.GUEST_NOT_ALLOWED)
    return response(200, 'Guest Login Allowed', u'游客登录开启')
@logit
@transaction.atomic
def guest_login_api(request):
    """ 游客登录 """
    gen = get_guest_entrance_control()
    # 是否配置游客入口控制信息
    if not gen:
        return response(UserStatusCode.GUEST_NOT_ALLOWED)
    # 平台校验
    platform = gen.get('platform', '')
    if request.Android:
        if platform not in [GuestEntranceControlInfo.ADR, GuestEntranceControlInfo.BOTH]:
            return response(UserStatusCode.GUEST_NOT_ALLOWED)
    else:
        if platform not in [GuestEntranceControlInfo.IOS, GuestEntranceControlInfo.BOTH]:
            return response(UserStatusCode.GUEST_NOT_ALLOWED)
    # 版本校验
    if not is_version_match(request, gen):
        return response(UserStatusCode.GUEST_NOT_ALLOWED)
    # 通用唯一识别码 (Universally Unique Identifier)
    uuid = request.POST.get('uuid', '')
    # 游客字段
    fields = {
        'user_id': CurtailUUID.uuid(UserInfo, 'user_id'),
        'user_from': UserInfo.GUEST_USER,
        'uuid': uuid,
        'nickname': u'游客',
        'user_status': UserInfo.ACTIVATED,
    }
    # 若 uuid 存在,则 get_or_create,否则 create
    if uuid:
        user, created = UserInfo.objects.select_for_update().get_or_create(user_from=UserInfo.GUEST_USER, uuid=uuid, defaults=fields)
        if created:
            user.nickname = u'游客{}'.format(user.pk)
            user.save()
    else:
        user = UserInfo.objects.select_for_update().create(**fields)
        user.nickname = u'游客{}'.format(user.pk)
        user.save()
    return response(200, 'Guest Login Success', u'游客登录成功', user.data)
class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-pk')
    serializer_class = UserSerializer
class GroupViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows groups to be viewed or edited.
    """
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
class LensmanInfoViewSet(viewsets.ModelViewSet):
    queryset = LensmanInfo.objects.all().order_by('-pk')
    serializer_class = LensmanInfoSerializer
class UserInfoViewSet(viewsets.ModelViewSet):
    queryset = UserInfo.objects.all().order_by('-pk')
    serializer_class = UserInfoSerializer
 |