Skip to content

Commit

Permalink
Merge pull request #9 from Abramov0Alexandr/feature
Browse files Browse the repository at this point in the history
Написал контроллеры, сериализаторы и определил права доступа
  • Loading branch information
Abramov0Alexandr committed Sep 26, 2023
2 parents e6d375b + bd16e1b commit bcbfa90
Show file tree
Hide file tree
Showing 6 changed files with 128 additions and 2 deletions.
5 changes: 3 additions & 2 deletions config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
'django_filters',

'custom_user.apps.CustomUserConfig',
'products.apps.ProductsConfig',
]


Expand All @@ -69,8 +70,8 @@
),

'DEFAULT_PERMISSION_CLASSES': [
# 'rest_framework.permissions.IsAuthenticated',
'rest_framework.permissions.AllowAny',
'rest_framework.permissions.IsAuthenticated',
# 'rest_framework.permissions.AllowAny',
],

'DEFAULT_FILTER_BACKENDS': (
Expand Down
1 change: 1 addition & 0 deletions config/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
urlpatterns = [
path('admin/', admin.site.urls),
path('users/', include('custom_user.urls', namespace='custom_user')),
path('products/', include('products.urls', namespace='products')),

# authorization urls
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
Expand Down
34 changes: 34 additions & 0 deletions products/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from rest_framework.permissions import BasePermission


class IsSeller(BasePermission):
"""
Данный класс предоставляет право доступа к контроллеру в том случае,
если текущий пользователь имеет статус "Продавец".
"""

def has_permission(self, request, view):
return bool(request.user.is_seller)


class IsSuperUser(BasePermission):
"""
Данный класс определяет права доступа для пользователей, у которых стоит флаг 'is_superuser'.
В отличие от IsAdminUser, 'IsSuperUser' предоставляет доступ только суперпользователям.
"""

def has_permission(self, request, view):
return bool(request.user.is_superuser)


class IsShopOwner(BasePermission):
"""
Контроллер определяет доступ только к тем объектам, которые были созданы текущим авторизованным пользователем.
"""

def has_object_permission(self, request, view, obj):

if request.user == obj.seller:
return True

return False
17 changes: 17 additions & 0 deletions products/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from rest_framework import serializers
from products.models import Product


class ProductSerializer(serializers.ModelSerializer):
"""
Сериализатор модели Product.
:shop_title Название магазина, указанное продавцом при регистрации. Значение берется из модели CustomUser.
:seller Удобочитаемое отображение пользователя (email) вместо id пользователя.
"""

shop_title = serializers.CharField(source='seller.shop_name', read_only=True)
seller = serializers.CharField(default=serializers.CurrentUserDefault(), read_only=True)

class Meta:
model = Product
fields = '__all__'
13 changes: 13 additions & 0 deletions products/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from django.urls import path
from .apps import ProductsConfig
from .views import ProductCreateView, ProductDetailView, ProductListView, ProductDeleteView

app_name = ProductsConfig.name


urlpatterns = [
path('create/', ProductCreateView.as_view(), name='create-product'),
path('list/', ProductListView.as_view(), name='products-list'),
path('detail/<int:pk>/', ProductDetailView.as_view(), name='product-detail'),
path('delete/<int:pk>/', ProductDeleteView.as_view(), name='product-delete'),
]
60 changes: 60 additions & 0 deletions products/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
from rest_framework import generics
from products.models import Product
from products.permissions import IsSeller, IsSuperUser, IsShopOwner
from products.serializers import ProductSerializer


class ProductCreateView(generics.CreateAPIView):
"""
Контроллер для публикации продукта.
Доступ к контроллеру имеется только у суперпользователя и пользователей со статусом "Продавец".
"""

serializer_class = ProductSerializer
permission_classes = [IsSeller | IsSuperUser]

def perform_create(self, serializer):

new_product = serializer.save(seller=self.request.user)
new_product.seller = self.request.user
new_product.save()


class ProductListView(generics.ListCreateAPIView):
"""
Контроллер для просмотра размещенных на площадке товарах.
Доступ к контроллеру имеется только у суперпользователя и пользователей со статусом "Продавец".
Каждый продавец видит список только своих товаров, суперпользователь видит все размещенные товары.
"""

serializer_class = ProductSerializer
permission_classes = [IsSeller | IsSuperUser]

def get_queryset(self):
if self.request.user.is_superuser:
return Product.objects.all()

return Product.objects.filter(seller=self.request.user)


class ProductDetailView(generics.RetrieveAPIView):
"""
Контроллер для просмотра детальной информации о товаре.
Информацию о товаре может просмотреть только тот продавец, который разместил данный товар.
Суперпользователь может просматривать детальную информацию всех размещенных товаров.
"""

queryset = Product.objects.all()
serializer_class = ProductSerializer
permission_classes = [IsShopOwner | IsSuperUser]


class ProductDeleteView(generics.DestroyAPIView):
"""
Контроллер для удаления размещенного на площадке товара.
Удалить товар может только тот продавец, который разместил данный товар.
Суперпользователь может удалить любой размещенный товар.
"""

queryset = Product.objects.all()
permission_classes = [IsShopOwner | IsSuperUser]

0 comments on commit bcbfa90

Please sign in to comment.