fix(login)

This commit is contained in:
A'zamov Samandar
2025-12-06 15:09:54 +05:00
parent 9d494ab34e
commit 3aa20fdaa1
4 changed files with 43 additions and 18 deletions

View File

@@ -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)

View File

@@ -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)),

View File

@@ -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)

View File

@@ -25,3 +25,4 @@ typeCheckingMode = "basic"
reportMissingImports = false reportMissingImports = false
reportMissingTypeStubs = false reportMissingTypeStubs = false
pythonVersion = "3.12" pythonVersion = "3.12"
enableReachabilityAnalysis = false