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