No Description

views.py 9.6KB

    # -*- 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.http import JsonResponse 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.ip_utils import ip_addr from utils.redis.rversion import get_guest_entrance_control from utils.version_utils import is_version_match # curl -X POST -F username=xxxxxxx -F password=xxxxxxx http://api.pai.ai/login 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 JsonResponse({ 'status': 200, 'message': u'登录成功', 'data': { 'user': lensman.lensman_id }, }) def user_is_registered_api(request): username = request.POST.get('username', '') return JsonResponse({ 'status': 200, 'message': '', 'data': { 'registered': UserInfo.objects.filter(username=username).exists(), } }) 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 = ip_addr(request), tc.utc_datetime() try: user = UserInfo.objects.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 JsonResponse({ 'status': 200, 'message': u'注册成功', 'data': user.data, }) def user_login_api(request): username = request.POST.get('username', '') password = request.POST.get('password', '') try: user = UserInfo.objects.get(username=username) except UserInfo.DoesNotExist: return response(UserStatusCode.USER_NOT_FOUND) login_ip, login_at = ip_addr(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 JsonResponse({ 'status': 200, 'message': u'登录成功', 'data': user.data, }) def wx_authorize_api(request): user_id = request.POST.get('user_id', '') openid = wx_uid = request.POST.get('wx_uid', '') unionid = request.POST.get('unionid', '') 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', '') # 判断 unionid 是否已经存在,如果已经存在,则直接返回改帐户信息 try: user = UserInfo.objects.get(unionid=unionid) except UserInfo.DoesNotExist: user = None if user: user.unionid = unionid user.sex = sex user.nickname = nickname user.avatar = avatar user.country = country user.province = province user.city = city user.save() return JsonResponse({ 'status': 200, 'message': u'登录成功', 'data': user.data, }) # unionid 不存在 # 判断 user_id 是否存在并且为分配用户,如果存在并且为分配用户,则直接在该帐户上更新,否则则直接创建帐户 signup_ip, signup_at = ip_addr(request), tc.utc_datetime() try: user = UserInfo.objects.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.wx_uid = wx_uid 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, wx_uid=wx_uid, 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, ) return JsonResponse({ 'status': 200, 'message': u'登录成功', 'data': user.data, }) 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 JsonResponse({ 'status': 200, 'message': u'游客登录开启', 'data': {}, }) 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.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.create(**fields) user.nickname = u'游客{}'.format(user.pk) user.save() return JsonResponse({ 'status': 200, 'message': u'游客登录成功', 'data': 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