From 0647312124757ff56aa24ebe874cc939f6e44f32 Mon Sep 17 00:00:00 2001 From: zemal Date: Sat, 19 Aug 2017 17:25:39 +0800 Subject: [PATCH] add username or email check api --- account/serializers.py | 8 ++++++-- account/urls/oj.py | 3 ++- account/views/oj.py | 25 +++++++++++++++++++++++-- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/account/serializers.py b/account/serializers.py index 6c50194f..68ba2b2a 100644 --- a/account/serializers.py +++ b/account/serializers.py @@ -11,11 +11,15 @@ class UserLoginSerializer(serializers.Serializer): tfa_code = serializers.CharField(min_length=6, max_length=6, required=False, allow_null=True) +class UsernameOrEmailCheckSerializer(serializers.Serializer): + username = serializers.CharField(max_length=30, required=False) + email = serializers.EmailField(max_length=30, required=False) + class UserRegisterSerializer(serializers.Serializer): username = serializers.CharField(max_length=30) password = serializers.CharField(max_length=30, min_length=6) - email = serializers.EmailField(max_length=254) - captcha = serializers.CharField(max_length=4, min_length=4) + email = serializers.EmailField(max_length=30) + captcha = serializers.CharField(max_length=4, min_length=1) class UserChangePasswordSerializer(serializers.Serializer): diff --git a/account/urls/oj.py b/account/urls/oj.py index f9a3c7ca..a0b8c723 100644 --- a/account/urls/oj.py +++ b/account/urls/oj.py @@ -2,7 +2,7 @@ from django.conf.urls import url from ..views.oj import (ApplyResetPasswordAPI, ResetPasswordAPI, UserChangePasswordAPI, UserRegisterAPI, - UserLoginAPI, UserLogoutAPI) + UserLoginAPI, UserLogoutAPI, UsernameOrEmailCheck) from utils.captcha.views import CaptchaAPIView @@ -14,4 +14,5 @@ urlpatterns = [ url(r"^apply_reset_password/?$", ApplyResetPasswordAPI.as_view(), name="apply_reset_password_api"), url(r"^reset_password/?$", ResetPasswordAPI.as_view(), name="apply_reset_password_api"), url(r"^captcha/?$", CaptchaAPIView.as_view(), name="show_captcha"), + url(r"^check_username_or_email", UsernameOrEmailCheck.as_view(), name="check_username_or_email") ] diff --git a/account/views/oj.py b/account/views/oj.py index b1cef638..3bfb2597 100644 --- a/account/views/oj.py +++ b/account/views/oj.py @@ -16,7 +16,7 @@ from ..models import User, UserProfile from ..serializers import (ApplyResetPasswordSerializer, ResetPasswordSerializer, UserChangePasswordSerializer, UserLoginSerializer, - UserRegisterSerializer) + UserRegisterSerializer, UsernameOrEmailCheckSerializer) from ..tasks import send_email_async @@ -58,6 +58,27 @@ class UserLogoutAPI(APIView): return self.success({}) +class UsernameOrEmailCheck(APIView): + @validate_serializer(UsernameOrEmailCheckSerializer) + def post(self, request): + """ + check username or email is duplicate + """ + data = request.data + # True means OK. + result = { + "username": True, + "email": True + } + if data.get("username"): + if User.objects.filter(username=data["username"]).exists(): + result["username"] = False + if data.get("email"): + if User.objects.filter(email=data["email"]).exists(): + result["email"] = False + return self.success(result) + + class UserRegisterAPI(APIView): @validate_serializer(UserRegisterSerializer) def post(self, request): @@ -66,7 +87,7 @@ class UserRegisterAPI(APIView): """ data = request.data captcha = Captcha(request) - if not captcha.check(data["captcha"]): + if not captcha.validate(data["captcha"]): return self.error("Invalid captcha") try: User.objects.get(username=data["username"])