diff --git a/hypha/apply/dashboard/services.py b/hypha/apply/dashboard/services.py index 7f9ad5bfca..72cb70573e 100644 --- a/hypha/apply/dashboard/services.py +++ b/hypha/apply/dashboard/services.py @@ -6,14 +6,15 @@ def get_paf_for_review(user, is_paf_approval_sequential): """Return a list of paf approvals ready for user's review""" + user_groups = list(user.groups.all()) paf_approvals = PAFApprovals.objects.annotate( roles_count=Count("paf_reviewer_role__user_roles") ).filter( - roles_count=len(list(user.groups.all())), + roles_count=len(user_groups), approved=False, ) - for role in user.groups.all(): + for role in user_groups: paf_approvals = paf_approvals.filter(paf_reviewer_role__user_roles__id=role.id) if is_paf_approval_sequential: diff --git a/hypha/apply/dashboard/views.py b/hypha/apply/dashboard/views.py index da9638a91c..851ccaa70f 100644 --- a/hypha/apply/dashboard/views.py +++ b/hypha/apply/dashboard/views.py @@ -144,9 +144,13 @@ def awaiting_reviews(self, submissions): } def active_invoices(self): - invoices = Invoice.objects.filter( - project__lead=self.request.user, - ).in_progress() + invoices = ( + Invoice.objects.filter( + project__lead=self.request.user, + ) + .in_progress() + .select_related("project", "by") + ) return { "count": invoices.count(), @@ -160,13 +164,18 @@ def projects(self): data=self.request.GET or None, request=self.request, queryset=projects ) + filtered_qs = filterset.qs + limit = 10 + limited_qs = list(filtered_qs[: limit + 1]) + has_more = len(limited_qs) > limit + table_data = limited_qs[:limit] return { - "count": projects.count(), + "count": filtered_qs.count(), "filterset": filterset, - "table": ProjectsDashboardTable(data=projects[:limit], prefix="project-"), - "display_more": projects.count() > limit, + "table": ProjectsDashboardTable(data=table_data, prefix="project-"), + "display_more": has_more, "url": reverse("apply:projects:all"), } @@ -492,6 +501,7 @@ def active_invoices(self): ) return {"count": active_invoices.count(), "data": active_invoices} + # todo: if we don't need, we can remove these historical tables def historical_project_data(self): historical_projects = ( Project.objects.filter(user=self.request.user).complete().for_table() diff --git a/hypha/apply/projects/models/payment.py b/hypha/apply/projects/models/payment.py index 910090ade1..d306fb7b21 100644 --- a/hypha/apply/projects/models/payment.py +++ b/hypha/apply/projects/models/payment.py @@ -69,16 +69,18 @@ def in_progress(self): return self.exclude(status__in=[DECLINED, PAID]) def approved_by_staff(self): - return self.filter(status=APPROVED_BY_STAFF) + return self.filter(status=APPROVED_BY_STAFF).select_related("project", "by") def approved_by_finance_1(self): - return self.filter(status=APPROVED_BY_FINANCE) + return self.filter(status=APPROVED_BY_FINANCE).select_related("project", "by") def waiting_to_convert(self): - return self.filter(status=APPROVED_BY_FINANCE) + return self.filter(status=APPROVED_BY_FINANCE).select_related("project", "by") def for_finance_1(self): - return self.filter(status__in=[APPROVED_BY_STAFF, APPROVED_BY_FINANCE]) + return self.filter( + status__in=[APPROVED_BY_STAFF, APPROVED_BY_FINANCE] + ).select_related("project", "by") def rejected(self): return self.filter(status=DECLINED).order_by("-requested_at") diff --git a/hypha/apply/projects/models/project.py b/hypha/apply/projects/models/project.py index f6689adc26..afc6033c0f 100644 --- a/hypha/apply/projects/models/project.py +++ b/hypha/apply/projects/models/project.py @@ -173,8 +173,10 @@ def for_table(self): .with_outstanding_reports() .select_related( "report_config", + "submission", "submission__page", "lead", + "user", ) ) diff --git a/hypha/apply/todo/views.py b/hypha/apply/todo/views.py index be8640c78c..f3deccd4b1 100644 --- a/hypha/apply/todo/views.py +++ b/hypha/apply/todo/views.py @@ -186,13 +186,20 @@ def remove_tasks_of_related_obj(related_obj): def get_tasks_for_user(user): - user_tasks = Task.objects.filter(user=user).annotate( - group_count=Count("user_group") + user_groups = list(user.groups.all()) + + user_tasks = ( + Task.objects.filter(user=user) + .annotate(group_count=Count("user_group")) + .select_related("user", "related_content_type") ) - user_group_tasks = Task.objects.annotate(group_count=Count("user_group")).filter( - group_count=len(user.groups.all()) + user_group_tasks = ( + Task.objects.annotate(group_count=Count("user_group")) + .filter(group_count=len(user_groups)) + .select_related("user", "related_content_type") + .prefetch_related("user_group") ) - for group in user.groups.all(): + for group in user_groups: user_group_tasks = user_group_tasks.filter(user_group__id=group.id) return user_tasks.union(user_group_tasks).order_by("-created_at")