From 9bf94d7de77aec0fad10d55ac1ed4a8ad2ec9762 Mon Sep 17 00:00:00 2001 From: Alexandr Abramov Date: Mon, 25 Sep 2023 23:10:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=BF=D0=B8=D1=81=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B3=D0=B8=D1=81=D1=82=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=D1=87=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20=D0=B8?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B4=D0=B0=D0=B2=D1=86=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- custom_user/serializers.py | 42 +++++++++++++++++++++++++++-------- custom_user/urls.py | 6 ++--- custom_user/views.py | 45 ++++++++++++++++++++++++++++++-------- 3 files changed, 72 insertions(+), 21 deletions(-) diff --git a/custom_user/serializers.py b/custom_user/serializers.py index dffc92f..6ae04b4 100644 --- a/custom_user/serializers.py +++ b/custom_user/serializers.py @@ -2,7 +2,7 @@ from custom_user.models import CustomUser -class CustomUserListSerializer(serializers.ModelSerializer): +class CustomersListSerializer(serializers.ModelSerializer): """ Сериализатор модели CustomUser. Используется при вызове GET запросов в контроллере CustomUserListView @@ -13,25 +13,28 @@ class Meta: fields = '__all__' -class CustomUserCreateSerializer(serializers.ModelSerializer): +class VisitorSerializer(serializers.ModelSerializer): """ Сериализатор модели CustomUser. - Используется при вызове GET запросов в контроллере CustomUserCreateView - password_confirmation: поле для подтверждения введенного пароля. Обработка исключений происходит в методе create. + Используется при регистрации ОБЫЧНЫХ пользователей в контроллере CustomUserCreateView. + :password_confirmation: поле для подтверждения введенного пароля. Обработка исключений происходит в методе create. """ password_confirmation = serializers.CharField(write_only=True) + first_name = serializers.CharField() + last_name = serializers.CharField() + patronymic = serializers.CharField(required=False) class Meta: model = CustomUser - fields = ('email', 'password', 'password_confirmation', ) + fields = ('first_name', 'last_name', 'patronymic', 'email', 'password', 'password_confirmation', ) def create(self, validated_data): """ - :param validated_data: Данные, переданные при создании нового пользователя + :param validated_data: Данные, переданные при создании нового пользователя. Метод переопределен для корректного создания нового пользователя. Пароль указанный при создании пользователя хэшируется, появляется возможность авторизации по JWT. - :return: Создается новый экземпляр класса CustomUser + :return: Создается новый экземпляр класса CustomUser. """ password_confirmation = validated_data.pop('password_confirmation', None) @@ -42,5 +45,26 @@ def create(self, validated_data): if validated_data.get('password') != password_confirmation: raise serializers.ValidationError("Пароль и его подтверждение не совпадают") - new_custom_user = CustomUser.objects.create_user(**validated_data) - return new_custom_user + new_common_user = CustomUser.objects.create_user(**validated_data) + return new_common_user + + +class SellerSerializer(serializers.ModelSerializer): + """ + Сериализатор модели CustomUser. + Используется при регистрации пользователей со статусом ПРОДАВЕЦ. + При вызове данного сериализатора устанавливается необходимость указывать следующие поля: + :shop_name: Название магазина, поле обязательно к заполнению. + :product_images: Изображения товара, поле является необязательным. + """ + + shop_name = serializers.CharField() + product_images = serializers.ImageField(required=False) + + class Meta: + model = CustomUser + fields = ('shop_name', 'product_images', 'email', ) + + def create(self, validated_data): + new_seller = CustomUser.objects.create_user(**validated_data) + return new_seller diff --git a/custom_user/urls.py b/custom_user/urls.py index 256d5ee..c847412 100644 --- a/custom_user/urls.py +++ b/custom_user/urls.py @@ -1,12 +1,12 @@ from django.urls import path from .apps import CustomUserConfig -from .views import CustomUserListView, CustomUserCreateView +from .views import CustomersListView, CustomerCreateView app_name = CustomUserConfig.name urlpatterns = [ - path('', CustomUserListView.as_view(), name='custom_user_list'), - path('create/', CustomUserCreateView.as_view(), name='custom_user_create') + path('', CustomersListView.as_view(), name='custom_user_list'), + path('create/', CustomerCreateView.as_view(), name='custom_user_create') ] diff --git a/custom_user/views.py b/custom_user/views.py index be8fc92..348a31b 100644 --- a/custom_user/views.py +++ b/custom_user/views.py @@ -1,20 +1,47 @@ from django_filters.rest_framework import DjangoFilterBackend -from rest_framework import generics +from rest_framework import generics, status +from rest_framework.permissions import IsAdminUser +from rest_framework.response import Response from custom_user.models import CustomUser -from custom_user.serializers import CustomUserListSerializer, CustomUserCreateSerializer +from custom_user.serializers import CustomersListSerializer, VisitorSerializer, SellerSerializer -class CustomUserListView(generics.ListAPIView): - """Контроллер для отображения списка зарегистрированных пользователей""" +class CustomersListView(generics.ListAPIView): + """Контроллер для отображения списка зарегистрированных пользователей.""" - serializer_class = CustomUserListSerializer + serializer_class = CustomersListSerializer queryset = CustomUser.objects.all() filter_backends = [DjangoFilterBackend] filterset_fields = ('is_seller', ) + permission_classes = IsAdminUser -class CustomUserCreateView(generics.CreateAPIView): - """Контроллер для регистрации новых пользователей""" +class CustomerCreateView(generics.CreateAPIView): + """Контроллер для регистрации новых пользователей.""" - queryset = CustomUser.objects.all() - serializer_class = CustomUserCreateSerializer + def get_serializer_class(self): + """ + Метод переопределен для выбора конкретного сериализатора в зависимости от переданных в POST запросе данных. + """ + + is_seller = self.request.data.get('is_seller', None) + + if is_seller: + return SellerSerializer + + return VisitorSerializer + + def create(self, request, *args, **kwargs): + is_seller = request.data.get('is_seller', False) + serializer = self.get_serializer(data=request.data) + + if serializer.is_valid(): + if is_seller: + # Если выбран статус продавца, устанавливаем его + serializer.save(is_seller=CustomUser.UserStatus.SELLER) + + else: + # Если выбран статус посетителя, оставляем его по умолчанию + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)