|
1 | | -from django.db.models import Count |
| 1 | +from django.db.models import Count, Exists, OuterRef |
2 | 2 |
|
3 | 3 | from hypha.apply.projects.models import PAFApprovals |
4 | 4 |
|
5 | 5 |
|
6 | 6 | 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()) |
8 | 9 |
|
9 | 10 | paf_approvals = PAFApprovals.objects.annotate( |
10 | 11 | roles_count=Count("paf_reviewer_role__user_roles") |
11 | 12 | ).filter( |
12 | | - roles_count=user.groups.count(), |
| 13 | + roles_count=len(user_groups), |
13 | 14 | approved=False, |
14 | 15 | ) |
15 | 16 |
|
16 | | - for role in user.groups.all(): |
| 17 | + for role in user_groups: |
17 | 18 | paf_approvals = paf_approvals.filter(paf_reviewer_role__user_roles__id=role.id) |
18 | 19 |
|
19 | 20 | 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)) |
27 | 27 |
|
28 | 28 | return paf_approvals |
0 commit comments