From 47cc43f63411599d8f3644daad89361b434f1cdf Mon Sep 17 00:00:00 2001
From: Shrikrishna Singh <krishnasingh.ss30@gmail.com>
Date: Wed, 9 Feb 2022 12:36:38 +0530
Subject: [PATCH] Fix api permissions

---
 hypha/apply/api/v1/permissions.py    | 23 +++++++++++++++--------
 hypha/apply/api/v1/projects/views.py | 14 ++++++++------
 2 files changed, 23 insertions(+), 14 deletions(-)

diff --git a/hypha/apply/api/v1/permissions.py b/hypha/apply/api/v1/permissions.py
index 188a6ada9..14fc918bf 100644
--- a/hypha/apply/api/v1/permissions.py
+++ b/hypha/apply/api/v1/permissions.py
@@ -20,19 +20,26 @@ class IsApplyStaffUser(permissions.BasePermission):
 
 class IsFinance1User(permissions.BasePermission):
     def has_permission(self, request, view):
-        invoice = view.get_invoice_object()
-        return request.user.is_finance_level_1 and invoice.can_user_edit_deliverables(request.user)
+        return request.user.is_finance_level_1
 
     def has_object_permission(self, request, view, obj):
-        invoice = view.get_invoice_object()
-        return request.user.is_finance_level_1 and invoice.can_user_edit_deliverables(request.user)
-
+        return request.user.is_finance_level_1
 
 class IsFinance2User(permissions.BasePermission):
     def has_permission(self, request, view):
-        invoice = view.get_invoice_object()
-        return request.user.is_finance_level_2 and invoice.can_user_edit_deliverables(request.user)
+        return request.user.is_finance_level_2
 
     def has_object_permission(self, request, view, obj):
+        return request.user.is_finance_level_2
+
+
+class HasDeliverableEditPermission(permissions.BasePermission):
+    def has_permission(self, request, view):
         invoice = view.get_invoice_object()
-        return request.user.is_finance_level_2 and invoice.can_user_edit_deliverables(request.user)
+        return invoice.can_user_edit_deliverables(request.user)
+
+
+class HasRequiredChecksPermission(permissions.BasePermission):
+    def has_permission(self, request, view):
+        invoice = view.get_object()
+        return invoice.can_user_complete_required_checks(request.user)
diff --git a/hypha/apply/api/v1/projects/views.py b/hypha/apply/api/v1/projects/views.py
index c45814530..f011ca790 100644
--- a/hypha/apply/api/v1/projects/views.py
+++ b/hypha/apply/api/v1/projects/views.py
@@ -9,7 +9,11 @@ from hypha.apply.projects.models.payment import Invoice, InvoiceDeliverable
 from hypha.apply.projects.models.project import Deliverable
 
 from ..mixin import InvoiceNestedMixin, ProjectNestedMixin
-from ..permissions import IsApplyStaffUser, IsFinance1User, IsFinance2User
+from ..permissions import (
+    IsApplyStaffUser, IsFinance1User, IsFinance2User,
+    HasDeliverableEditPermission, HasRequiredChecksPermission
+)
+
 from .serializers import (
     DeliverableSerializer,
     InvoiceDeliverableListSerializer,
@@ -25,7 +29,8 @@ class DeliverableViewSet(
     viewsets.GenericViewSet
 ):
     permission_classes = (
-        permissions.IsAuthenticated, IsApplyStaffUser | IsFinance1User | IsFinance2User
+        permissions.IsAuthenticated, HasDeliverableEditPermission,
+        IsApplyStaffUser | IsFinance1User | IsFinance2User
     )
     serializer_class = InvoiceDeliverableListSerializer
     pagination_class = None
@@ -81,12 +86,9 @@ class InvoiceRequiredChecksViewSet(
     viewsets.GenericViewSet,
 ):
     serializer_class = InvoiceRequiredChecksSerializer
-    permission_classes = [IsFinance1User]
+    permission_classes = [IsFinance1User, HasRequiredChecksPermission]
     queryset = Invoice.objects.all()
 
-    def get_invoice_object(self):
-        return self.get_object()
-
     @action(detail=True, methods=['post'])
     def set_required_checks(self, request, *args, **kwargs):
         serializer = self.get_serializer(data=request.data)
-- 
GitLab