add: BaseApiViewMixin created, TODO: switch external endpoints to GenericAPIView and BaseApiViewMixin

This commit is contained in:
2025-08-06 15:13:30 +05:00
parent 153bbefaab
commit 0935cfcb1f
8 changed files with 237 additions and 134 deletions

View File

@@ -10,7 +10,7 @@ router.register(r"contracts", views.ContractView, "contracts") # type: ignore
router.register(r"contracts", views.ContractRelationsViewSet, "contract-relations") # type: ignore
router.register(r"contract-file-contents", views.ContractFileContentView, "contract-file-contents") # type: ignore
router.register(r"contract-owners", views.ContractOwnerView, "contract-owners") # type: ignore
router.register(r"contract-owners", views.ContractOwnerFileViewSet, "contract-owner-files") # type: ignore
# router.register(r"contract-owners", views.CompanyFolderCrudViewSet, "contract-owner-files") # type: ignore
urlpatterns = [ # type: ignore
path("", include(router.urls)), # type: ignore

View File

@@ -54,59 +54,55 @@ class ContractOwnerView(BaseViewSetMixin, ModelViewSet):
}
class ContractOwnerFileViewSet(BaseViewSetMixin, ModelViewSet):
queryset = ContractOwnerModel.objects.all()
serializer_class = RetrieveContractAttachedFileSerializer
permission_classes = [AllowAny]
# class ContractOwnerFileViewSet(BaseViewSetMixin, ModelViewSet):
# queryset = ContractOwnerModel.objects.all()
# serializer_class = RetrieveContractAttachedFileSerializer
# permission_classes = [AllowAny]
# action_permission_classes = {
# "create_file": [AllowAny],
# "list_file": [AllowAny]
# }
action_serializer_class = { # type: ignore
"list_file": RetrieveContractAttachedFileSerializer,
"create_file": CreateContractAttachedFileSerializer,
}
# action_serializer_class = { # type: ignore
# "list_file": RetrieveContractAttachedFileSerializer,
# "create_file": CreateContractAttachedFileSerializer,
# }
@extend_schema(
summary="Contract Files Related to Owner",
description="Contract Files Related to Owner",
)
@action(url_path="files", methods=["GET"], detail=True)
def list_file(
self,
request: HttpRequest,
*args: object,
**kwargs: object,
) -> Response:
owner = cast(ContractOwnerModel, self.get_object())
files = ContractAttachedFileModel.objects.filter(
contract__owners=owner, contents__owner=owner
).select_related("contents")
serializer = self.get_serializer(instance=files, many=True)
return Response(serializer.data, status.HTTP_200_OK)
# @extend_schema(
# summary="Contract Files Related to Owner",
# description="Contract Files Related to Owner",
# )
# @action(url_path="files", methods=["GET"], detail=True)
# def list_file(
# self,
# request: HttpRequest,
# *args: object,
# **kwargs: object,
# ) -> Response:
# owner = cast(ContractOwnerModel, self.get_object())
# files = ContractAttachedFileModel.objects.filter(
# contract__owners=owner, contents__owner=owner
# ).select_related("contents")
# serializer = self.get_serializer(instance=files, many=True)
# return Response(serializer.data, status.HTTP_200_OK)
@extend_schema(
summary="Create Contract Files Related to Owner",
description="Create Contract Files Related to Owner"
)
@action(url_path="files", methods=["GET"], detail=True)
def create_file(
self,
request: HttpRequest,
*args: object,
**kwargs: object,
) -> Response:
owner = cast(
ContractOwnerModel,
self.get_queryset().select_related("contract")
)
if not owner.contract.allow_add_files:
raise PermissionDenied(_("Attaching new files was restricted for this contract."))
ser = self.get_serializer(data=request.data)
ser.is_valid(raise_exception=True)
ser.save() # type: ignore
return Response(ser.data, status.HTTP_201_CREATED)
# @extend_schema(
# summary="Create Contract Files Related to Owner",
# description="Create Contract Files Related to Owner"
# )
# @action(url_path="files", methods=["GET"], detail=True)
# def create_file(
# self,
# request: HttpRequest,
# *args: object,
# **kwargs: object,
# ) -> Response:
# owner = cast(
# ContractOwnerModel,
# self.get_queryset().select_related("contract")
# )
# if not owner.contract.allow_add_files:
# raise PermissionDenied(_("Attaching new files was restricted for this contract."))
# ser = self.get_serializer(data=request.data)
# ser.is_valid(raise_exception=True)
# ser.save() # type: ignore
# return Response(ser.data, status.HTTP_201_CREATED)
class ContractAttachedFileDeleteView(APIView):