Skip to content

Commit

Permalink
Прописал логику регистрации обычного пользователя и продавца
Browse files Browse the repository at this point in the history
  • Loading branch information
Abramov0Alexandr committed Sep 25, 2023
1 parent 60ef425 commit 9bf94d7
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 21 deletions.
42 changes: 33 additions & 9 deletions custom_user/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from custom_user.models import CustomUser


class CustomUserListSerializer(serializers.ModelSerializer):
class CustomersListSerializer(serializers.ModelSerializer):
"""
Сериализатор модели CustomUser.
Используется при вызове GET запросов в контроллере CustomUserListView
Expand All @@ -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)
Expand All @@ -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
6 changes: 3 additions & 3 deletions custom_user/urls.py
Original file line number Diff line number Diff line change
@@ -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')
]
45 changes: 36 additions & 9 deletions custom_user/views.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 9bf94d7

Please sign in to comment.