Skip to content

Commit c6298a3

Browse files
Merge pull request #1106 from torchbox/feature/269-scholarships-in-programme-pages
R1-269: Scholarships - Showing in programme pages
2 parents 2f49dfd + 72f2daa commit c6298a3

File tree

4 files changed

+65
-12
lines changed

4 files changed

+65
-12
lines changed

rca/programmes/models.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.core.exceptions import ValidationError
66
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
77
from django.db import models, transaction
8+
from django.db.models import Prefetch
89
from django.utils.functional import cached_property
910
from django.utils.safestring import mark_safe
1011
from django.utils.text import slugify
@@ -822,7 +823,10 @@ class ProgrammePage(TapMixin, ContactFieldsMixin, BasePage):
822823
[
823824
FieldPanel("scholarships_title"),
824825
FieldPanel("scholarships_information"),
825-
FieldPanel("scholarship_accordion_items"),
826+
FieldPanel(
827+
"scholarship_accordion_items",
828+
help_text="Override the automatically linked scholarships from 'Scholarships' snippets.",
829+
),
826830
FieldPanel("scholarship_information_blocks"),
827831
],
828832
heading="Scholarships",
@@ -1104,6 +1108,47 @@ def has_vepple_panorama(self):
11041108

11051109
return False
11061110

1111+
@cached_property
1112+
def scholarship_items(self):
1113+
"""Returns a list of scholarship items for this programme."""
1114+
# Prioritze scholarship_accordion_items, if available
1115+
if self.scholarship_accordion_items:
1116+
return self.scholarship_accordion_items
1117+
1118+
# Check for eligible scholarships based on the Scholarship snippet
1119+
if self.scholarship_set.exists():
1120+
# Prefetch related data to avoid n+1 queries
1121+
scholarships = self.scholarship_set.prefetch_related(
1122+
Prefetch(
1123+
"eligable_programmes",
1124+
queryset=ProgrammePage.objects.filter(live=True),
1125+
),
1126+
"funding_categories",
1127+
"fee_statuses",
1128+
).filter(active=True)
1129+
1130+
return [
1131+
{
1132+
"value": {
1133+
"heading": s.title,
1134+
"introduction": s.summary,
1135+
"eligible_programmes": ", ".join(
1136+
str(x) for x in s.eligable_programmes.all()
1137+
),
1138+
"funding_categories": ", ".join(
1139+
x.title for x in s.funding_categories.all()
1140+
),
1141+
"fee_statuses": ", ".join(
1142+
x.title for x in s.fee_statuses.all()
1143+
),
1144+
"value": s.value,
1145+
}
1146+
}
1147+
for s in scholarships
1148+
]
1149+
1150+
return []
1151+
11071152
def get_context(self, request, *args, **kwargs):
11081153
context = super().get_context(request, *args, **kwargs)
11091154
context["related_sections"] = [

rca/project_styleguide/templates/patterns/molecules/accordion/accordion.html

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,18 @@
5050
{% endif %}
5151
{% if scholarship %}
5252
{# Scholarship fields #}
53-
<p><strong>Eligible Programmes: </strong>{{ accordion.eligible_programmes }}</p>
54-
<p><strong>Funding Categories: </strong>{{ accordion.funding_categories }}</p>
55-
<p><strong>Eligible fee status: </strong>{{ accordion.fee_statuses }}</p>
56-
<p><strong>Value: </strong>{{ accordion.value }}</p>
53+
{% if accordion.eligible_programmes %}
54+
<p><strong>Eligible Programmes: </strong>{{ accordion.eligible_programmes }}</p>
55+
{% endif %}
56+
{% if accordion.funding_categories %}
57+
<p><strong>Funding Categories: </strong>{{ accordion.funding_categories }}</p>
58+
{% endif %}
59+
{% if accordion.fee_statuses %}
60+
<p><strong>Eligible fee status: </strong>{{ accordion.fee_statuses }}</p>
61+
{% endif %}
62+
{% if accordion.value %}
63+
<p><strong>Value: </strong>{{ accordion.value }}</p>
64+
{% endif %}
5765
{% endif %}
5866
</div>
5967
</div>

rca/project_styleguide/templates/patterns/organisms/programme_tabs/fees-and-funding.html

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,15 @@ <h5 class="fees__heading body body--one">{{ row.location }}</h5>
5050
<div class="overview__item">
5151
<h4 class="overview__sub-heading heading heading--five">{{ page.scholarships_title }}</h4>
5252
<p class="overview__introduction introduction">{{ page.scholarships_information }}</p>
53-
<div class="overview__item-content">
54-
{% if page.scholarship_accordion_items %}
53+
{% if page.scholarship_items %}
54+
<div class="overview__item-content">
5555
<div class="overview__item-accordion">
56-
{% for accordion in page.scholarship_accordion_items %}
57-
{% include "patterns/molecules/accordion/accordion.html" with modifier='short' accordion=accordion.value accordion_id='3' %}
56+
{% for accordion in page.scholarship_items %}
57+
{% include "patterns/molecules/accordion/accordion.html" with modifier='short' accordion=accordion.value accordion_id='3' scholarship=True %}
5858
{% endfor %}
5959
</div>
60-
{% endif %}
61-
</div>
60+
</div>
61+
{% endif %}
6262
</div>
6363
{% if page.scholarship_information_blocks %}
6464
<div class="overview__item">

rca/scholarships/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ def get_context(self, request, *args, **kwargs):
204204

205205
programme = None
206206
results = []
207-
queryset = Scholarship.objects.prefetch_related(
207+
queryset = Scholarship.objects.filter(active=True).prefetch_related(
208208
"eligable_programmes", "funding_categories", "fee_statuses"
209209
)
210210

0 commit comments

Comments
 (0)