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 # 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.companies.permissions.folders import IsFolderOwner from core.utils.views import BaseApiViewMixin from core.apps.contracts.serializers.contracts import CreateContractSerializer 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, } ###################################################################### # /company-folders//contracts ###################################################################### class ContractFolderApiView(BaseApiViewMixin, GenericAPIView): # type: ignore queryset = CompanyFolderModel.objects.all() permission_classes = [IsFolderOwner] serializer_class = CreateContractSerializer method_permission_classes = { "post": [IsFolderOwner] } method_serializer_class = { "post": CreateContractSerializer } @extend_schema( summary="Create Contract For Folder", description="Create Contract For Folder", ) def post(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)