Skip to content

Commit

Permalink
Merge branch 'bugfix/2191-programme-finder' of github.com:torchbox/rc…
Browse files Browse the repository at this point in the history
…a-wagtail-2019 into dev
  • Loading branch information
Patrick Gan committed Oct 17, 2024
2 parents d77bb2f + 7c1513f commit 7c5f656
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 0 deletions.
6 changes: 6 additions & 0 deletions rca/programmes/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,8 @@ class ProgrammePage(TapMixin, ContactFieldsMixin, BasePage):
)
],
),
# Combination of title + degree level.
index.AutocompleteField("full_title", boost=2),
]
api_fields = [
# Fields for filtering and display, shared with shortcourses.ShortCoursePage.
Expand Down Expand Up @@ -897,6 +899,10 @@ def __str__(self):
bits.append(str(self.degree_level))
return " ".join(bits)

@property
def full_title(self):
return f"{self.title} {self.degree_level.title}"

@property
def introduction(self):
return self.programme_description_subtitle
Expand Down
105 changes: 105 additions & 0 deletions rca/programmes/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
from django.test import TestCase

from rca.home.models import HomePage
from rca.programmes.factories import DegreeLevelFactory, ProgrammePageFactory
from rca.programmes.models import ProgrammeStudyMode, ProgrammeStudyModeProgrammePage


class ProgrammesAPIResponseTest(TestCase):
def setUp(self):
self.home_page = HomePage.objects.first()

self.full_time_study_mode = ProgrammeStudyMode.objects.get(
title="Full-time study"
)
self.part_time_study_mode = ProgrammeStudyMode.objects.get(
title="Part-time study"
)

self.programme_page_title = "Print"
self.degree_level_title = "MA"

degree_level = DegreeLevelFactory(title=self.degree_level_title)
self.programme_page = ProgrammePageFactory(
parent=self.home_page,
title=self.programme_page_title,
degree_level=degree_level,
)

self.base_url = (
"/api/v3/pages/?type=programmes.ProgrammePage"
"&limit=50&fields=summary%2Chero_image_square"
)

def test_should_return_if_querying_title_and_degree_level(self):
ProgrammeStudyModeProgrammePage.objects.create(
page=self.programme_page, programme_study_mode=self.full_time_study_mode
)

# Check by just using the title of the page.
response = self.client.get(
f"{self.base_url}&full-time=true"
f"&part-time=true&search={self.programme_page_title}"
)
data = response.json()

self.assertEqual(data["meta"]["total_count"], 1)
self.assertEqual(data["items"][0]["id"], self.programme_page.id)

# Check by using the page and degree name.
response = self.client.get(
f"{self.base_url}&full-time=true"
f"&part-time=true&search={self.programme_page_title}+{self.degree_level_title}"
)
data = response.json()

self.assertEqual(data["meta"]["total_count"], 1)
self.assertEqual(data["items"][0]["id"], self.programme_page.id)

def test_should_not_return_full_time_programmes_if_full_time_is_false(self):
ProgrammeStudyModeProgrammePage.objects.create(
page=self.programme_page, programme_study_mode=self.full_time_study_mode
)

# Set full-time to true first.
response = self.client.get(
f"{self.base_url}&full-time=true"
f"&part-time=true&search={self.programme_page_title}"
)
data = response.json()

self.assertEqual(data["meta"]["total_count"], 1)
self.assertEqual(data["items"][0]["id"], self.programme_page.id)

# Then set it to false - there should be no results now.
response = self.client.get(
f"{self.base_url}&full-time=false"
f"&part-time=true&search={self.programme_page_title}"
)
data = response.json()

self.assertEqual(data["meta"]["total_count"], 0)

def test_should_not_return_part_time_programmes_if_part_time_is_false(self):
ProgrammeStudyModeProgrammePage.objects.create(
page=self.programme_page, programme_study_mode=self.part_time_study_mode
)

# Set part-time to true first.
response = self.client.get(
f"{self.base_url}&full-time=true"
f"&part-time=true&search={self.programme_page_title}"
)
data = response.json()

self.assertEqual(data["meta"]["total_count"], 1)
self.assertEqual(data["items"][0]["id"], self.programme_page.id)

# Then set it to false - there should be no results now.
response = self.client.get(
f"{self.base_url}&full-time=true"
f"&part-time=false&search={self.programme_page_title}+{self.degree_level_title}"
)
data = response.json()

self.assertEqual(data["meta"]["total_count"], 0)
5 changes: 5 additions & 0 deletions rca/wagtailapi/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -162,3 +162,8 @@ def filter_queryset(self, request, queryset, view):
)

return queryset


class DistinctFilter(filters.BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
return queryset.distinct()
1 change: 1 addition & 0 deletions rca/wagtailapi/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class PagesAPIViewSet(views.PagesAPIViewSet):
filters.RelatedSchoolsFilter,
filters.SubjectsFilter,
filters.StudyModeFilter,
filters.DistinctFilter,
filters.SearchFilter,
]

Expand Down

0 comments on commit 7c5f656

Please sign in to comment.