Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 1 addition & 91 deletions hypha/apply/funds/templates/funds/submissions_result.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,97 +13,7 @@

{% block content %}
<div class="flex flex-col gap-8 my-8 mx-auto">
<section>
<div class="flex flex-wrap gap-4 justify-around lg:gap-8">
<section aria-labelledby="amounts-heading">
<h3 id="amounts-heading" class="section-header">{% trans "Amounts" %}</h3>
<div class="shadow lg:w-full stats">
<dl role="list" aria-label="{% trans 'Applied amounts' %}" class="stat">
<dt class="stat-title">
{% trans "Applied" %} ({% get_currency_symbol %})
</dt>
<dd class="stat-value">
{{ submission_sum|default:"0"|format_number_as_currency }}
</dd>
</dl>
<dl role="list" aria-label="{% trans 'Accepted amounts' %}" class="stat">
<dt class="stat-title">
{% trans "Accepted" %} ({% get_currency_symbol %})
</dt>
<dd class="stat-value">
{{ submission_accepted_sum|default:"0"|format_number_as_currency }}
</dd>

</dl>
</div>
</section>

<section aria-labelledby="submissions-heading">
<h3 id="submissions-heading" class="section-header">{% trans "Submissions" %}</h3>
<div class="w-full shadow stats">
<dl role="list" aria-label="{% trans 'Applied submissions' %}" class="stat">
<dt class="stat-title">
{% trans "Applied" %}
</dt>
<dd class="stat-value">
{{ submission_count }}
</dd>

</dl>
<dl role="list" aria-label="{% trans 'Accepted submissions' %}" class="stat">
<dt class="stat-title">
{% trans "Accepted" %}
</dt>
<dd class="stat-value">
{{ submission_accepted_count|default:"0" }}
</dd>
</dl>
<dl role="list" aria-label="{% trans 'Pending submissions' %}" class="stat">
<dt class="stat-title">
{% trans "Pending" %}
</dt>
<dd class="stat-value">
{{ submission_undetermined_count|default:"0" }}
</dd>
</dl>
</div>
</section>

<section aria-labelledby="reviews-heading">
<h3 id="reviews-heading" class="section-header">{% trans "Reviews" %}</h3>
<div class="w-full shadow stats">
<dl role="list" aria-label="{% trans 'All reviews' %}" class="stat">
<dt class="stat-title">
{% trans "All" %}
</dt>
<dd class="stat-value">
{{ review_count|default:"0" }}
</dd>
</dl>
<dl role="list" aria-label="{% trans 'Your reviews' %}" class="stat">
<dt class="stat-title">
{% trans "You" %}
</dt>
<dd class="stat-value">
{{ review_my_count|default:"0" }}
</dd>
</dl>
<dl role="list" aria-label="{% trans 'Your average score' %}" class="stat">
<dt class="stat-title">
{% trans "Your avg. score" %}
</dt>
<dd class="stat-value">
{{ review_my_score|floatformat:"0"|default:"0" }}
</dd>
</dl>
</div>
</section>
</div>
</section>

<section aria-labelledby="submission-value-total">
<h2 id="submission-value-total" class="section-header">{% trans "Totals" %}</h2>

{% include "funds/includes/table_filter_and_search.html" with search_term=search_term %}

<div class="w-full rounded-t-none border-b rounded-b-box border-x stats border-base-300">
Expand Down Expand Up @@ -131,7 +41,7 @@ <h2 id="submission-value-total" class="section-header">{% trans "Totals" %}</h2>
{% if not count_values == submission_count %}
{% with submission_count|subtract:count_values as count_diff %}
<p class="mt-1 text-xs text-fg-muted" aria-live="polite">
{% blocktrans %}*{{ count_diff }} submission(s) lack requested amount fields or data and are not included.{% endblocktrans %}
{% blocktrans %}* Total {{ submission_count }} but {{ count_diff }} submission(s) lack requested amount fields or data and are not included.{% endblocktrans %}
</p>
{% endwith %}
{% endif %}
Expand Down
35 changes: 0 additions & 35 deletions hypha/apply/funds/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,10 @@
import os
import re
from datetime import datetime
from functools import reduce
from io import StringIO
from itertools import chain
from operator import iconcat
from typing import Iterable

import django_filters as filters
from django.core.files.storage import default_storage
from django.urls import reverse
from django.utils.encoding import force_bytes
Expand Down Expand Up @@ -150,38 +147,6 @@ def export_submissions_to_csv(
return csv_stream


def format_submission_sum_value(submission_value: dict) -> str | None:
"""Formats a submission value dict that contains a key of `value__sum`

Args:
submission_value: the dict containing the `value_sum`

Returns:
either a string of the formatted sum value or `None` if invalid
"""

value_sum = submission_value.get("value__sum")

return value_sum if value_sum else None


def is_filter_empty(filter: filters.FilterSet) -> bool:
"""Determines if a given FilterSet has valid query params or if they're empty

Args:
filter: the FilterSet to evaluate

Returns:
bool: True if filter has valid params, False if empty
"""

if not (query := filter.data):
return False

# Flatten the QueryDict values in filter.data to a single list, check for validity with any()
return any(reduce(iconcat, [param[1] for param in query.lists()], []))


def get_copied_form_name(original_form_name: str) -> str:
"""Create the name of the form to be copied

Expand Down
66 changes: 9 additions & 57 deletions hypha/apply/funds/views/results.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,67 +4,16 @@
from django.views.decorators.cache import cache_page
from django_filters.views import FilterView

from hypha.apply.review.models import Review
from hypha.apply.users.decorators import (
staff_required,
)
from hypha.apply.users.decorators import staff_required

from ..models import (
ApplicationSubmission,
)
from ..tables import (
SubmissionFilterAndSearch,
)
from ..utils import (
format_submission_sum_value,
is_filter_empty,
)
from ..tables import SubmissionFilterAndSearch

User = get_user_model()


class SubmissionStatsMixin:
def get_context_data(self, **kwargs):
submissions = ApplicationSubmission.objects.exclude_draft()
filter = kwargs.get("filter")
user = self.request.user

# Getting values is an expensive operation. If there's no valid filters
# then `count_values` & `total_value` will be encapsulating all submissions
# and should be used rather than recaluclating these values.
if not filter or not is_filter_empty(filter):
submission_sum = kwargs.get("total_value")
else:
submission_value = submissions.current().value()
submission_sum = format_submission_sum_value(submission_value)

submission_undetermined_count = submissions.undetermined().count()
review_my_count = submissions.reviewed_by(user).count()

submission_accepted = submissions.current_accepted()
submission_accepted_value = submission_accepted.value()
submission_accepted_sum = format_submission_sum_value(submission_accepted_value)
submission_accepted_count = submission_accepted.count()

reviews = Review.objects.submitted()
review_count = reviews.count()
review_my_score = reviews.by_user(user).score()

return super().get_context_data(
submission_undetermined_count=submission_undetermined_count,
review_my_count=review_my_count,
submission_sum=submission_sum,
submission_accepted_count=submission_accepted_count,
submission_accepted_sum=submission_accepted_sum,
review_count=review_count,
review_my_score=review_my_score,
**kwargs,
)


@method_decorator(cache_page(60), name="dispatch")
@method_decorator(staff_required, name="dispatch")
class SubmissionResultView(SubmissionStatsMixin, FilterView):
class SubmissionResultView(FilterView):
template_name = "funds/submissions_result.html"
filterset_class = SubmissionFilterAndSearch
filter_action = ""
Expand All @@ -91,9 +40,12 @@ def get_context_data(self, **kwargs):
submission_count = self.object_list.count()
submission_values = self.object_list.value()
count_values = submission_values.get("value__count")
total_value = format_submission_sum_value(submission_values)
if value := submission_values.get("value__avg"):
average_value = round(value)
if total := submission_values.get("value__sum"):
total_value = total
else:
total_value = 0
if average := submission_values.get("value__avg"):
average_value = round(average)
else:
average_value = 0
else:
Expand Down
Loading