from django_core.mixins import BaseViewSetMixin # type: ignore from django.contrib.auth import get_user_model from drf_spectacular.utils import extend_schema 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.utils.views import BaseApiViewMixin from core.apps.companies.permissions import IsCompanyAccount from core.apps.companies.models import CompanyModel, CompanyFolderModel, CompanyAccountModel from core.apps.companies.serializers import ( CreateCompanySerializer, ListCompanySerializer, RetrieveCompanySerializer, UpdateCompanySerializer, DestroyCompanySerializer, RetrieveCompanyAccountSerializer, RetrieveCompanyFolderSerializer, CreateFolderForCompanySerializer, ) from core.apps.contracts.serializers import ( RetrieveContractSerializer, BaseContractSerializer, ) from core.apps.contracts.models import ContractModel UserModel = get_user_model() ###################################################################### # Crud ###################################################################### @extend_schema(tags=["Company"]) class CompanyCrudViewSet(BaseViewSetMixin, ModelViewSet): queryset = CompanyModel.objects.all() serializer_class = ListCompanySerializer permission_classes = [AllowAny] action_permission_classes = { "list": [IsAdminUser], "retrieve": [IsAdminUser], "create": [IsAdminUser], "update": [IsAdminUser], "destroy": [IsAdminUser], } action_serializer_class = { # type: ignore "list": ListCompanySerializer, "retrieve": RetrieveCompanySerializer, "create": CreateCompanySerializer, "update": UpdateCompanySerializer, "destroy": DestroyCompanySerializer, } ###################################################################### # company//contract ###################################################################### @extend_schema(tags=["Company Contracts"]) class CompanyContractApiView(BaseApiViewMixin, GenericAPIView): # type: ignore queryset = CompanyModel.objects.all() permission_classes = [IsCompanyAccount] serializer_class = BaseContractSerializer method_permission_classes = { "get": [IsCompanyAccount], } method_serializer_class = { "get": RetrieveContractSerializer, } #! TODO: status should be added. @extend_schema( summary="Company Contracts", description="Get List Company Contracts" ) def get( self, request: HttpRequest, *args: object, **kwargs: object, ) -> Response: company = self.get_object() contracts = ContractModel.objects.filter( owners__legal_entity__phone=company.phone, ).distinct() folders_param = request.data.get("folders") if folders_param: folder_ids = folders_param.split(",") contracts = contracts.filter(folders__id__in=folder_ids) serializer = self.get_serializer(instance=contracts, many=True) # type: ignore return Response(serializer.data, status=status.HTTP_200_OK) ###################################################################### # company//accounts ###################################################################### @extend_schema(tags=["Company Accounts"]) class CompanyAccountApiView(BaseApiViewMixin, GenericAPIView): # type: ignore queryset = CompanyModel.objects.all() serializer_class = RetrieveCompanyAccountSerializer permission_classes = [IsCompanyAccount] method_serializer_class = { "get": RetrieveCompanyAccountSerializer } method_permission_classes = { "get": [IsCompanyAccount] } @extend_schema( summary="List company accounts", description="List Company Accounts" ) def get(self, *args: object, **kwargs: object) -> Response: company = self.get_object() accounts = CompanyAccountModel.objects.filter(company=company) ser = self.get_serializer(instance=accounts, many=True) # type: ignore return Response(data=ser.data, status=status.HTTP_200_OK) ###################################################################### # company//folders ###################################################################### @extend_schema(tags=["Company Folders"]) class CompanyFolderApiView(BaseApiViewMixin, GenericAPIView): # type: ignore queryset = CompanyModel.objects.all() permission_classes = [IsCompanyAccount] method_serializer_class = { "get": RetrieveCompanyFolderSerializer, "post": CreateFolderForCompanySerializer, } method_permission_classes = { "get": [IsCompanyAccount], "get": [IsCompanyAccount], } @extend_schema( summary="List Company Folders", description="List Company Folders", ) def get(self, *args: object, **kwargs: object) -> Response: company = self.get_object() folders = CompanyFolderModel.objects.filter(company=company) serializer = self.get_serializer(instance=folders, many=True) return Response(serializer.data, status=status.HTTP_200_OK) @extend_schema( summary="Create Folder for Company", description="Create Folder for Company", ) def post(self, request: HttpRequest, *args: object, **kwargs: object): company = self.get_object() serializer = self.get_serializer(data=request.data, context={"company_id": company.pk}) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED)