from rest_framework.decorators import action from rest_framework.permissions import AllowAny, IsAdminUser, IsAuthenticated from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet from core.mixins import ActionBasedMixin from core.permissions import IsAuthorOrReadOnly, IsAdminUserOrReadOnly from market.models import Brand, Product, Post from market.serializers import ( BrandSerializer, ProductSerializer, PostSerializer, ) class BrandViewset(ActionBasedMixin, ModelViewSet): queryset = Brand.objects.all() serializer_class = BrandSerializer serializer_class_map = { "products": ProductSerializer, } permission_classes = [IsAdminUserOrReadOnly] pagination_class = None @action(detail=True, methods=["GET"]) def product(self, request, pk): brand = self.get_object() serializer = self.get_serializer(brand.products.all(), many=True) return Response(serializer.data) class ProductViewset(ActionBasedMixin, ModelViewSet): queryset = Product.objects.all() serializer_class = ProductSerializer serializer_class_map = { "posts": PostSerializer, } permission_classes = [IsAdminUserOrReadOnly] @action(detail=True, methods=["GET"]) def posts(self, request, pk): product = self.get_object() queryset = product.posts.all() page = self.paginate_queryset(queryset) if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) class PostViewset(ActionBasedMixin, ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer permission_classes = [IsAuthenticated, IsAuthorOrReadOnly] permission_classes_map = { "list": [AllowAny], "retrieve": [AllowAny], } def perform_create(self, serializer): serializer.save(author=self.request.user)