Files
eggs-backend/core/apps/accounts/views/sms.py
husanjon ab73d05ecc
Some checks failed
Build and Push to Docker Hub / build-test-push (push) Failing after 1m55s
gold eggs backend
2026-04-15 08:59:36 +02:00

147 lines
4.1 KiB
Python

"""
SMS configuration (eskiz.uz)
"""
import typing
from django.utils.translation import gettext_lazy as _
from rest_framework import permissions
from rest_framework import request as rest_request
from rest_framework import throttling, views
from core import enums, exceptions, services, utils
from core.http import serializers
from core.http import views as http_views
from core.http.models import User
class RegisterView(
views.APIView, services.UserService, http_views.ApiResponse
):
"""
Register new user
"""
serializer_class = serializers.RegisterSerializer
throttle_classes = [throttling.UserRateThrottle]
def post(self, request: rest_request.Request):
ser = self.serializer_class(data=request.data)
ser.is_valid(raise_exception=True)
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"),
)
# Send confirmation code for sms eskiz.uz
self.send_confirmation(phone)
return self.success(_(enums.Messages.SEND_MESSAGE) % {"phone": phone})
class ConfirmView(views.APIView, services.UserService, http_views.ApiResponse):
"""Confirm otp code"""
serializer_class = serializers.ConfirmSerializer
def post(self, request: rest_request.Request):
ser = self.serializer_class(data=request.data)
ser.is_valid(raise_exception=True)
data = ser.data
phone, code = data.get("phone"), data.get("code")
try:
# Check Sms confirmation otp code
if services.SmsService.check_confirm(phone, code=code):
# Create user
token = self.validate_user(
User.objects.filter(phone=phone).first()
)
return self.success(
_(enums.Messages.OTP_CONFIRMED), token=token
)
except exceptions.SmsException as e:
return utils.ResponseException(e)
except Exception as e:
return self.error(e)
class ResetConfirmationCodeView(
views.APIView, http_views.ApiResponse, services.UserService
): # noqa
"""
Reset confirm otp code
"""
serializer_class = serializers.ResetConfirmationSerializer
def post(self, request: rest_request.Request):
ser = self.serializer_class(data=request.data)
ser.is_valid(raise_exception=True)
data = ser.data
code, phone, password = (
data.get("code"),
data.get("phone"),
data.get("password"),
) # noqa
try:
res = services.SmsService.check_confirm(phone, code)
if res:
self.change_password(phone, password)
return self.success(_(enums.Messages.CHANGED_PASSWORD))
return self.error(_(enums.Messages.INVALID_OTP))
except exceptions.SmsException as e:
return self.error(e, error_code=enums.Codes.INVALID_OTP_ERROR)
except Exception as e:
return self.error(e)
class ResendView(http_views.AbstractSendSms):
"""
Resend Otp Code
"""
serializer_class = serializers.ResendSerializer
class ResetPasswordView(http_views.AbstractSendSms):
"""
Reset user password
"""
serializer_class: typing.Type[serializers.ResetPasswordSerializer] = (
serializers.ResetPasswordSerializer
) # noqa
# class MeView(views.APIView, http_views.ApiResponse):
# """
# Get user information
# """
# permission_classes = [permissions.IsAuthenticated]
#
# def get(self, request: rest_request.Request):
# user = request.user
# serializer = serializers.UserSerializer(user, context={'request': request})
# return self.success(data=serializer.data)
class MeView(views.APIView, http_views.ApiResponse):
"""
Get user information
"""
permission_classes = [permissions.IsAuthenticated]
def get(self, request: rest_request.Request):
user = request.user
return self.success(data=serializers.UserSerializer(user).data)