from rest_framework.decorators import action from rest_framework.permissions import AllowAny, 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, PostCreateSerializer, PostListSerializer, PostStatusUpdateSerializer, ) from graph.models import Transaction from graph.methods import create_transaction class BrandViewset(ActionBasedMixin, ModelViewSet): queryset = Brand.objects.all() serializer_class = BrandSerializer permission_classes = [IsAdminUserOrReadOnly] pagination_class = None class ProductViewset(ActionBasedMixin, ModelViewSet): queryset = Product.objects.all().select_related("brand") serializer_class = ProductSerializer serializer_class_map = { "posts": PostListSerializer, } permission_classes = [IsAdminUserOrReadOnly] def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) @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() .select_related("product", "author", "product__brand") .prefetch_related("images") ) serializer_class = PostSerializer serializer_class_map = { "list": PostListSerializer, "create": PostCreateSerializer, "update": PostStatusUpdateSerializer, } permission_classes = [IsAuthenticated, IsAuthorOrReadOnly] permission_classes_map = { "list": [AllowAny], "retrieve": [AllowAny], "create": [AllowAny], } def perform_create(self, serializer): serializer.save(author=self.request.user) def perform_update(self, serializer): object = self.get_object() object_unsold = object.status == "s" or object.status == "r" instance = serializer.instance if object_unsold and serializer.validated_data.get("status") == "d": create_transaction(instance) elif ( not object_unsold and serializer.validated_data.get("status") == "s" ): Transaction.objects.filter( price=instance.price, product=instance.product ).delete() return super().perform_update(serializer)