Skip to content

Commit fb0e165

Browse files
committed
Optimise get_paf_for_review().
1 parent c856b48 commit fb0e165

2 files changed

Lines changed: 12 additions & 12 deletions

File tree

hypha/apply/dashboard/services.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,28 @@
1-
from django.db.models import Count
1+
from django.db.models import Count, Exists, OuterRef
22

33
from hypha.apply.projects.models import PAFApprovals
44

55

66
def get_paf_for_review(user, is_paf_approval_sequential):
7-
"""Return a list of paf approvals ready for user's review"""
7+
"""Return a queryset of paf approvals ready for user's review"""
8+
user_groups = list(user.groups.all())
89

910
paf_approvals = PAFApprovals.objects.annotate(
1011
roles_count=Count("paf_reviewer_role__user_roles")
1112
).filter(
12-
roles_count=user.groups.count(),
13+
roles_count=len(user_groups),
1314
approved=False,
1415
)
1516

16-
for role in user.groups.all():
17+
for role in user_groups:
1718
paf_approvals = paf_approvals.filter(paf_reviewer_role__user_roles__id=role.id)
1819

1920
if is_paf_approval_sequential:
20-
all_matched_paf_approvals = list(paf_approvals)
21-
for matched_paf_approval in all_matched_paf_approvals:
22-
if matched_paf_approval.project.paf_approvals.filter(
23-
paf_reviewer_role__sort_order__lt=matched_paf_approval.paf_reviewer_role.sort_order,
24-
approved=False,
25-
).exists():
26-
paf_approvals = paf_approvals.exclude(id=matched_paf_approval.id)
21+
blocking_step = PAFApprovals.objects.filter(
22+
project=OuterRef("project"),
23+
approved=False,
24+
paf_reviewer_role__sort_order__lt=OuterRef("paf_reviewer_role__sort_order"),
25+
)
26+
paf_approvals = paf_approvals.exclude(Exists(blocking_step))
2727

2828
return paf_approvals

hypha/apply/dashboard/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def paf_for_review(self):
8282
get_paf_for_review(
8383
user=self.request.user,
8484
is_paf_approval_sequential=project_settings.paf_approval_sequential,
85-
)
85+
).select_related("project__submission__page", "paf_reviewer_role", "user")
8686
)
8787
paf_table = PAFForReviewDashboardTable(
8888
paf_approvals, prefix="paf-review-", order_by="-date_requested"

0 commit comments

Comments
 (0)