from typing import cast from django_core.mixins import BaseViewSetMixin # type: ignore from django.db import transaction 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, GenericViewSet # type: ignore from rest_framework.generics import GenericAPIView # 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 ) ###################################################################### # Crud ###################################################################### @extend_schema(tags=["CompanyFolder"]) class CompanyFolderCrudViewSet(BaseViewSetMixin, ModelViewSet): queryset = CompanyFolderModel.objects.all() permission_classes = [AllowAny] action_permission_classes = { # type: ignore "list": [IsAdminUser], "retrieve": [IsAdminUser], "create": [IsAdminUser], "update": [IsAdminUser], "destroy": [IsAdminUser], } action_serializer_class = { # type: ignore "list": ListCompanyFolderSerializer, "retrieve": RetrieveCompanyFolderSerializer, "create": CreateCompanyFolderSerializer, "update": UpdateCompanyFolderSerializer, "destroy": DestroyCompanyFolderSerializer, } ###################################################################### # /contract-folders//contracts ###################################################################### class ContractFolderApiView(GenericAPIView): queryset = CompanyFolderModel.objects.all() permission_classes = [AllowAny] serializer_class = None def get_serializer_class(self): # type: ignore if self.request.method == "POST": return CreateContractSerializer return self.serializer_class @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: with transaction.atomic(): folder = cast(CompanyFolderModel, self.get_object()) ser = cast(CreateContractSerializer, self.get_serializer(data=request.data)) # type: ignore ser.is_valid(raise_exception=True) contract = ser.save() folder.contracts.add(contract) return Response(ser.data, status.HTTP_201_CREATED)