fix(login)
This commit is contained in:
@@ -9,12 +9,6 @@ OTP_SIZE = env.int("OTP_SIZE", 4)
|
|||||||
class LoginSerializer(serializers.Serializer):
|
class LoginSerializer(serializers.Serializer):
|
||||||
phone = serializers.CharField(max_length=255)
|
phone = serializers.CharField(max_length=255)
|
||||||
|
|
||||||
def validate_phone(self, value):
|
|
||||||
user = get_user_model().objects.filter(phone=value, validated_at__isnull=False).exists()
|
|
||||||
if not user:
|
|
||||||
raise exceptions.ValidationError(_("Phone Not Found"))
|
|
||||||
return value
|
|
||||||
|
|
||||||
|
|
||||||
class RegisterSerializer(serializers.ModelSerializer):
|
class RegisterSerializer(serializers.ModelSerializer):
|
||||||
phone = serializers.CharField(max_length=255)
|
phone = serializers.CharField(max_length=255)
|
||||||
|
|||||||
@@ -8,11 +8,11 @@ from .views import RegisterView, ResetPasswordView, MeView, ChangePasswordView,
|
|||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register("auth", RegisterView, basename="auth")
|
# router.register("auth", RegisterView, basename="auth")
|
||||||
router.register("auth", ResetPasswordView, basename="reset-password")
|
router.register("auth", ResetPasswordView, basename="reset-password")
|
||||||
router.register("auth", MeView, basename="me")
|
router.register("auth", MeView, basename="me")
|
||||||
router.register("auth", ChangePasswordView, basename="change-password")
|
router.register("auth", ChangePasswordView, basename="change-password")
|
||||||
router.register("login", LoginView, basename="login")
|
router.register("auth/login", LoginView, basename="login")
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", include(router.urls)),
|
path("", include(router.urls)),
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
from drf_spectacular.utils import extend_schema
|
from drf_spectacular.utils import OpenApiResponse, extend_schema
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from django_core.mixins.base import BaseViewSetMixin
|
from django_core.mixins.base import BaseViewSetMixin
|
||||||
@@ -12,6 +12,8 @@ from django.contrib.auth import get_user_model
|
|||||||
from rest_framework.exceptions import PermissionDenied
|
from rest_framework.exceptions import PermissionDenied
|
||||||
from django_core import exceptions
|
from django_core import exceptions
|
||||||
|
|
||||||
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
@extend_schema(tags=["Login"])
|
@extend_schema(tags=["Login"])
|
||||||
class LoginView(BaseViewSetMixin, GenericViewSet, UserService):
|
class LoginView(BaseViewSetMixin, GenericViewSet, UserService):
|
||||||
@@ -21,25 +23,50 @@ class LoginView(BaseViewSetMixin, GenericViewSet, UserService):
|
|||||||
match self.action:
|
match self.action:
|
||||||
case "send_code":
|
case "send_code":
|
||||||
return LoginSerializer
|
return LoginSerializer
|
||||||
case "send_confirm":
|
case "confirm":
|
||||||
return ConfirmSerializer
|
return ConfirmSerializer
|
||||||
case _:
|
case _:
|
||||||
return LoginSerializer
|
return LoginSerializer
|
||||||
|
|
||||||
@action(detail=False, methods=["post"], url_path="send_code")
|
@extend_schema(
|
||||||
|
summary="Tasdiqlash ko'dini olish",
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(
|
||||||
|
response={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {"detail": {"type": "string"}},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
@action(detail=False, methods=["post"], url_path="send-code")
|
||||||
def send_code(self, request):
|
def send_code(self, request):
|
||||||
ser = self.get_serializer(data=request.data)
|
ser = self.get_serializer(data=request.data)
|
||||||
ser.is_valid(raise_exception=True)
|
ser.is_valid(raise_exception=True)
|
||||||
data = ser.validated_data
|
data = ser.validated_data
|
||||||
phone = data.get('phone')
|
phone = data.get("phone")
|
||||||
self.send_confirmation(phone)
|
self.send_confirmation(phone)
|
||||||
return Response(
|
return Response(
|
||||||
{"detail": _("Sms %(phone)s raqamiga yuborildi") % {"phone": phone}},
|
{"detail": _("Sms %(phone)s raqamiga yuborildi") % {"phone": phone}},
|
||||||
status=status.HTTP_202_ACCEPTED,
|
status=status.HTTP_202_ACCEPTED,
|
||||||
)
|
)
|
||||||
|
|
||||||
@action(detail=False, methods=["post"], url_path="send_confirm")
|
@extend_schema(
|
||||||
def send_confirm(self, request):
|
summary="Tasdiqlash ko'dini kiritish",
|
||||||
|
responses={
|
||||||
|
200: OpenApiResponse(
|
||||||
|
response={
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"token": {"type": "string"},
|
||||||
|
"ask_name": {"type": "boolean"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
@action(detail=False, methods=["post"], url_path="confirm")
|
||||||
|
def confirm(self, request):
|
||||||
ser = self.get_serializer(data=request.data)
|
ser = self.get_serializer(data=request.data)
|
||||||
ser.is_valid(raise_exception=True)
|
ser.is_valid(raise_exception=True)
|
||||||
data = ser.validated_data
|
data = ser.validated_data
|
||||||
@@ -47,15 +74,18 @@ class LoginView(BaseViewSetMixin, GenericViewSet, UserService):
|
|||||||
code = data.get("code")
|
code = data.get("code")
|
||||||
try:
|
try:
|
||||||
if SmsService.check_confirm(phone, code=code):
|
if SmsService.check_confirm(phone, code=code):
|
||||||
token = self.get_token(get_user_model().objects.filter(phone=phone).first())
|
user = User.objects.filter(phone=phone).first()
|
||||||
|
if user is None:
|
||||||
|
user = User.objects.create_user(phone)
|
||||||
|
token = self.get_token(user)
|
||||||
return Response(
|
return Response(
|
||||||
data={
|
data={
|
||||||
"detail": _("Tasdiqlash ko'di qabul qilindi"),
|
|
||||||
"token": token,
|
"token": token,
|
||||||
|
"ask_name": True if user.first_name is None or user.first_name == "" else False,
|
||||||
},
|
},
|
||||||
status=status.HTTP_202_ACCEPTED,
|
status=status.HTTP_202_ACCEPTED,
|
||||||
)
|
)
|
||||||
except exceptions.SmsException as e:
|
except exceptions.SmsException as e:
|
||||||
raise PermissionDenied(e) # Response exception for APIException
|
raise PermissionDenied(e)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise PermissionDenied(e) # Api exception for APIException
|
raise PermissionDenied(e)
|
||||||
|
|||||||
@@ -25,3 +25,4 @@ typeCheckingMode = "basic"
|
|||||||
reportMissingImports = false
|
reportMissingImports = false
|
||||||
reportMissingTypeStubs = false
|
reportMissingTypeStubs = false
|
||||||
pythonVersion = "3.12"
|
pythonVersion = "3.12"
|
||||||
|
enableReachabilityAnalysis = false
|
||||||
|
|||||||
Reference in New Issue
Block a user