Login va Register to'girlandi
This commit is contained in:
@@ -29,6 +29,7 @@ class CustomUserAdmin(admin.UserAdmin, ModelAdmin):
|
||||
"groups",
|
||||
"user_permissions",
|
||||
"role",
|
||||
"validated_at",
|
||||
),
|
||||
},
|
||||
),
|
||||
|
||||
@@ -4,9 +4,16 @@ from django.utils.translation import gettext as _
|
||||
from rest_framework import exceptions, serializers
|
||||
|
||||
OTP_SIZE = env.int("OTP_SIZE", 4)
|
||||
|
||||
|
||||
class LoginSerializer(serializers.Serializer):
|
||||
username = serializers.CharField(max_length=255)
|
||||
password = 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):
|
||||
@@ -20,13 +27,7 @@ class RegisterSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = get_user_model()
|
||||
fields = ["first_name", "last_name", "phone", "password"]
|
||||
extra_kwargs = {
|
||||
"first_name": {
|
||||
"required": True,
|
||||
},
|
||||
"last_name": {"required": True},
|
||||
}
|
||||
fields = ["phone"]
|
||||
|
||||
|
||||
class ConfirmSerializer(serializers.Serializer):
|
||||
|
||||
@@ -4,7 +4,7 @@ Accounts app urls
|
||||
|
||||
from django.urls import path, include
|
||||
from rest_framework_simplejwt import views as jwt_views
|
||||
from .views import RegisterView, ResetPasswordView, MeView, ChangePasswordView
|
||||
from .views import RegisterView, ResetPasswordView, MeView, ChangePasswordView, LoginView
|
||||
from rest_framework.routers import DefaultRouter
|
||||
|
||||
router = DefaultRouter()
|
||||
@@ -12,7 +12,7 @@ router.register("auth", RegisterView, basename="auth")
|
||||
router.register("auth", ResetPasswordView, basename="reset-password")
|
||||
router.register("auth", MeView, basename="me")
|
||||
router.register("auth", ChangePasswordView, basename="change-password")
|
||||
|
||||
router.register("login", LoginView, basename="login")
|
||||
|
||||
urlpatterns = [
|
||||
path("", include(router.urls)),
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
from .auth import * # noqa
|
||||
from .login import * # noqa
|
||||
|
||||
@@ -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}},
|
||||
|
||||
61
core/apps/accounts/views/login.py
Normal file
61
core/apps/accounts/views/login.py
Normal 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
|
||||
Reference in New Issue
Block a user