Login va Register to'girlandi

This commit is contained in:
2025-11-21 16:33:11 +05:00
parent 256e80cc23
commit 3da10c2a7f
9 changed files with 94 additions and 27 deletions

View File

@@ -1 +1,2 @@
from .auth import * # noqa
from .login import * # noqa

View File

@@ -54,7 +54,7 @@ class RegisterView(BaseViewSetMixin, GenericViewSet, UserService):
data = ser.data
phone = data.get("phone")
# Create pending user
self.create_user(phone, data.get("first_name"), data.get("last_name"), data.get("password"))
self.create_user(phone)
self.send_confirmation(phone) # Send confirmation code for sms eskiz.uz
return Response(
{"detail": _("Sms %(phone)s raqamiga yuborildi") % {"phone": phone}},

View File

@@ -0,0 +1,61 @@
from drf_spectacular.utils import extend_schema
from rest_framework.permissions import AllowAny
from rest_framework.decorators import action
from django_core.mixins.base import BaseViewSetMixin
from rest_framework.viewsets import GenericViewSet
from core.services import UserService, SmsService
from ..serializers import LoginSerializer, ConfirmSerializer
from django.utils.translation import gettext_lazy as _
from rest_framework.response import Response
from rest_framework import status
from django.contrib.auth import get_user_model
from rest_framework.exceptions import PermissionDenied
from django_core import exceptions
@extend_schema(tags=["Login"])
class LoginView(BaseViewSetMixin, GenericViewSet, UserService):
permission_classes = [AllowAny]
def get_serializer_class(self):
match self.action:
case "send_code":
return LoginSerializer
case "send_confirm":
return ConfirmSerializer
case _:
return LoginSerializer
@action(detail=False, methods=["post"], url_path="send_code")
def send_code(self, request):
ser = self.get_serializer(data=request.data)
ser.is_valid(raise_exception=True)
data = ser.validated_data
phone = data.get('phone')
self.send_confirmation(phone)
return Response(
{"detail": _("Sms %(phone)s raqamiga yuborildi") % {"phone": phone}},
status=status.HTTP_202_ACCEPTED,
)
@action(detail=False, methods=["post"], url_path="send_confirm")
def send_confirm(self, request):
ser = self.get_serializer(data=request.data)
ser.is_valid(raise_exception=True)
data = ser.validated_data
phone = data.get("phone")
code = data.get("code")
try:
if SmsService.check_confirm(phone, code=code):
token = self.get_token(get_user_model().objects.filter(phone=phone).first())
return Response(
data={
"detail": _("Tasdiqlash ko'di qabul qilindi"),
"token": token,
},
status=status.HTTP_202_ACCEPTED,
)
except exceptions.SmsException as e:
raise PermissionDenied(e) # Response exception for APIException
except Exception as e:
raise PermissionDenied(e) # Api exception for APIException