from typing import cast from django_core.mixins import BaseViewSetMixin # type: ignore from drf_spectacular.utils import extend_schema from rest_framework.decorators import action # type: ignore from rest_framework.permissions import AllowAny, IsAdminUser # type: ignore from rest_framework.viewsets import ModelViewSet # type: ignore from rest_framework.request import HttpRequest # type: ignore from rest_framework.response import Response # type: ignore from rest_framework import status # type: ignore from core.apps.contracts.serializers.contracts import CreateContractSerializer from core.apps.companies.permissions.folders import IsFolderOwner from core.apps.companies.models import CompanyFolderModel from core.apps.companies.serializers.folders import ( CreateCompanyFolderSerializer, ListCompanyFolderSerializer, RetrieveCompanyFolderSerializer, UpdateCompanyFolderSerializer, DestroyCompanyFolderSerializer ) @extend_schema(tags=["CompanyFolder"]) class CompanyFolderView(BaseViewSetMixin, ModelViewSet): queryset = CompanyFolderModel.objects.all() serializer_class = ListCompanyFolderSerializer permission_classes = [AllowAny] action_permission_classes = { # type: ignore "list": [IsAdminUser], "retrieve": [IsAdminUser], "create": [IsAdminUser], "update": [IsAdminUser], "destroy": [IsAdminUser], "create_contract": [IsFolderOwner] } action_serializer_class = { # type: ignore "list": ListCompanyFolderSerializer, "retrieve": RetrieveCompanyFolderSerializer, "create": CreateCompanyFolderSerializer, "update": UpdateCompanyFolderSerializer, "destroy": DestroyCompanyFolderSerializer, "create_contract": CreateContractSerializer, } @extend_schema( summary="Create Contract For Folder", description="Create Contract For Folder", ) @action(methods=["POST"], detail=True, url_path="contracts") def create_contract( self, request: HttpRequest, *args: object, **kwargs: object ) -> Response: ser = cast( CreateContractSerializer, self.get_serializer(data=request.data) # type: ignore ) ser.is_valid(raise_exception=True) ser.save() return Response(ser.data, status.HTTP_201_CREATED)