Skip to content

Commit 30b37bd

Browse files
committed
Added skeleton application stats into results view
1 parent eaac47f commit 30b37bd

3 files changed

Lines changed: 75 additions & 19 deletions

File tree

hypha/apply/funds/models/submissions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,6 +1130,8 @@ class ApplicationSubmissionSkeleton(models.Model):
11301130
on_delete=models.PROTECT,
11311131
)
11321132

1133+
objects = ApplicationSubmissionSkeletonQueryset.as_manager()
1134+
11331135
@classmethod
11341136
def from_dict(
11351137
cls, dict_submission: Dict[str, Any], save_user: bool = False

hypha/apply/funds/tables.py

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
from hypha.apply.categories.blocks import CategoryQuestionBlock
1818
from hypha.apply.categories.models import MetaTerm, Option
19+
from hypha.apply.funds.models.submissions import ApplicationSubmissionSkeleton
1920
from hypha.apply.funds.reviewers.services import get_all_reviewers
2021
from hypha.apply.review.models import Review
2122
from hypha.core.tables import RelativeTimeColumn
@@ -192,24 +193,33 @@ def render_screening_status(self, value):
192193

193194

194195
def get_used_rounds(request):
195-
return Round.objects.filter(submissions__isnull=False).distinct()
196+
return Round.objects.filter(
197+
Q(Q(submissions__isnull=False) | Q(skeleton_submissions__isnull=False))
198+
).distinct()
196199

197200

198201
def get_used_funds(request):
199202
# Use page to pick up on both Labs and Funds
200-
return Page.objects.filter(applicationsubmission__isnull=False).distinct()
203+
return Page.objects.filter(
204+
Q(
205+
Q(applicationsubmission__isnull=False)
206+
| Q(applicationsubmissionskeleton__isnull=False)
207+
)
208+
).distinct()
201209

202210

203211
def get_round_leads(request):
204212
return User.objects.filter(submission_lead__isnull=False).distinct()
205213

206214

207215
def get_screening_statuses(request):
208-
return ScreeningStatus.objects.filter(
216+
sub_filter = Q(
209217
id__in=ApplicationSubmission.objects.all()
210218
.values("screening_statuses__id")
211219
.distinct("screening_statuses__id")
212220
)
221+
skele_filter = Q(skeleton_submissions__isnull=False)
222+
return ScreeningStatus.objects.filter(sub_filter | skele_filter)
213223

214224

215225
def get_meta_terms(request):
@@ -355,6 +365,37 @@ def filter_archived(self, queryset, name, value):
355365
return queryset
356366

357367

368+
class SubmissionSkeletonFilter(filters.FilterSet):
369+
fund = ModelMultipleChoiceFilter(
370+
field_name="page", queryset=get_used_funds, label=_("Funds")
371+
)
372+
round = ModelMultipleChoiceFilter(queryset=get_used_rounds, label=_("Rounds"))
373+
screening_statuses = ModelMultipleChoiceFilter(
374+
queryset=get_screening_statuses, label=_("Screening"), null_label=_("No Status")
375+
)
376+
377+
class Meta:
378+
model = ApplicationSubmissionSkeleton
379+
fields = ("fund", "round")
380+
381+
def __init__(self, *args, exclude=None, limit_statuses=None, **kwargs):
382+
if exclude is None:
383+
exclude = []
384+
385+
super().__init__(*args, **kwargs)
386+
387+
self.filters["status"] = StatusMultipleChoiceFilter(limit_to=limit_statuses)
388+
# self.filters["category_options"].extra["choices"] = [
389+
# (option.id, option.value)
390+
# for option in Option.objects.filter(category__filter_on_dashboard=True)
391+
# ]
392+
self.filters = {
393+
field: filter
394+
for field, filter in self.filters.items()
395+
if field not in exclude
396+
}
397+
398+
358399
class SubmissionDashboardFilter(filters.FilterSet):
359400
round = ModelMultipleChoiceFilter(queryset=get_used_rounds, label=_("Rounds"))
360401
fund = ModelMultipleChoiceFilter(

hypha/apply/funds/views/results.py

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
from django.views.decorators.cache import cache_page
55
from django_filters.views import FilterView
66

7+
from hypha.apply.funds.models.submissions import ApplicationSubmissionSkeleton
78
from hypha.apply.users.decorators import staff_required
89

9-
from ..tables import SubmissionFilterAndSearch
10+
from ..tables import SubmissionFilterAndSearch, SubmissionSkeletonFilter
1011

1112
User = get_user_model()
1213

@@ -34,28 +35,40 @@ def get_queryset(self):
3435
return self.filterset_class._meta.model.objects.current().exclude_draft()
3536

3637
def get_context_data(self, **kwargs):
37-
search_term = self.request.GET.get("query")
38+
count_values = 0
39+
total_value = 0
40+
averages_sum = 0
41+
submission_count = 0
3842

39-
if self.object_list.exists():
40-
submission_count = self.object_list.count()
41-
submission_values = self.object_list.value()
42-
count_values = submission_values.get("value__count")
43+
qs_list = [self.object_list]
44+
45+
# If a filter comes up that is not applicable to skeleton applications, remove them the results (ie. "lead")
46+
non_skeleton_fields = set(SubmissionFilterAndSearch.declared_filters) - set(
47+
SubmissionSkeletonFilter.declared_filters
48+
)
49+
if not set(self.request.GET) & set(non_skeleton_fields):
50+
skeleton_qs = SubmissionSkeletonFilter(
51+
self.request.GET, queryset=ApplicationSubmissionSkeleton.objects.all()
52+
).qs
53+
qs_list.append(skeleton_qs)
54+
55+
populated_qs_list = [qs for qs in qs_list if qs.exists()]
56+
57+
for qs in populated_qs_list:
58+
submission_count += qs.count()
59+
submission_values = qs.value()
60+
count_values += submission_values.get("value__count")
4361
if total := submission_values.get("value__sum"):
44-
total_value = total
45-
else:
46-
total_value = 0
62+
total_value += total
4763
if average := submission_values.get("value__avg"):
48-
average_value = round(average)
49-
else:
50-
average_value = 0
64+
averages_sum += round(average)
65+
66+
if qs_list_len := len(populated_qs_list):
67+
average_value = averages_sum / qs_list_len
5168
else:
52-
count_values = 0
53-
total_value = 0
5469
average_value = 0
55-
submission_count = 0
5670

5771
return super().get_context_data(
58-
search_term=search_term,
5972
filter_action=self.filter_action,
6073
count_values=count_values,
6174
total_value=total_value,

0 commit comments

Comments
 (0)