Commit 48b3face by Matthew Piatetsky Committed by GitHub

Merge pull request #465 from edx/ECOM-4738

ECOM-4738 Expose marketing url for typeahead and only show published, non-hidden courses and active programs
parents f7f11417 81ea8027
......@@ -965,6 +965,7 @@ class TypeaheadCourseRunSearchSerializer(serializers.Serializer):
org = serializers.CharField()
title = serializers.CharField()
key = serializers.CharField()
marketing_url = serializers.CharField()
class Meta:
fields = ['key', 'title']
......@@ -975,6 +976,7 @@ class TypeaheadProgramSearchSerializer(serializers.Serializer):
uuid = serializers.CharField()
title = serializers.CharField()
type = serializers.CharField()
marketing_url = serializers.CharField()
def get_orgs(self, result):
authoring_organizations = [json.loads(org) for org in result.authoring_organization_bodies]
......
......@@ -1110,7 +1110,8 @@ class TypeaheadCourseRunSearchSerializerTests(TestCase):
expected = {
'key': course_run.key,
'title': course_run.title,
'org': course_run_key.org
'org': course_run_key.org,
'marketing_url': course_run.marketing_url,
}
self.assertDictEqual(serialized_course.data, expected)
......@@ -1127,7 +1128,8 @@ class TypeaheadProgramSearchSerializerTests(TestCase):
'uuid': str(program.uuid),
'title': program.title,
'type': program.type.name,
'orgs': list(program.authoring_organizations.all().values_list('key', flat=True))
'orgs': list(program.authoring_organizations.all().values_list('key', flat=True)),
'marketing_url': program.marketing_url,
}
def test_data(self):
......
......@@ -311,7 +311,7 @@ class TypeaheadSearchViewTests(TypeaheadSerializationMixin, LoginMixin, APITestC
""" Test typeahead response. """
title = "Python"
course_run = CourseRunFactory(title=title)
program = ProgramFactory(title=title)
program = ProgramFactory(title=title, status=ProgramStatus.Active)
response = self.get_typeahead_response(title)
self.assertEqual(response.status_code, 200)
response_data = response.json()
......@@ -324,7 +324,7 @@ class TypeaheadSearchViewTests(TypeaheadSerializationMixin, LoginMixin, APITestC
title = "Test"
for i in range(RESULT_COUNT + 1):
CourseRunFactory(title="{}{}".format(title, i))
ProgramFactory(title="{}{}".format(title, i))
ProgramFactory(title="{}{}".format(title, i), status=ProgramStatus.Active)
response = self.get_typeahead_response(title)
self.assertEqual(response.status_code, 200)
response_data = response.json()
......@@ -336,7 +336,9 @@ class TypeaheadSearchViewTests(TypeaheadSerializationMixin, LoginMixin, APITestC
title = "Design"
authoring_organizations = OrganizationFactory.create_batch(3)
course_run = CourseRunFactory(title=title, authoring_organizations=authoring_organizations)
program = ProgramFactory(title=title, authoring_organizations=authoring_organizations)
program = ProgramFactory(
title=title, authoring_organizations=authoring_organizations, status=ProgramStatus.Active
)
response = self.get_typeahead_response(title)
self.assertEqual(response.status_code, 200)
response_data = response.json()
......@@ -347,11 +349,30 @@ class TypeaheadSearchViewTests(TypeaheadSerializationMixin, LoginMixin, APITestC
""" Test typeahead response with partial term search. """
title = "Learn Data Science"
course_run = CourseRunFactory(title=title)
program = ProgramFactory(title=title)
program = ProgramFactory(title=title, status=ProgramStatus.Active)
query = "Data Sci"
response = self.get_typeahead_response(query)
self.assertEqual(response.status_code, 200)
response_data = response.json()
expected_response_data = {
'course_runs': [self.serialize_course_run(course_run)],
'programs': [self.serialize_program(program)]
}
self.assertDictEqual(response_data, expected_response_data)
def test_unpublished_and_hidden_courses(self):
""" Verify that typeahead does not return unpublished or hidden courses
or programs that are not active. """
title = "Supply Chain"
course_run = CourseRunFactory(title=title)
CourseRunFactory(title=title + "_unpublished", status=CourseRunStatus.Unpublished)
CourseRunFactory(title=title + "_hidden", hidden=True)
program = ProgramFactory(title=title, status=ProgramStatus.Active)
ProgramFactory(title=title + "_unpublished", status=ProgramStatus.Unpublished)
query = "Supply"
response = self.get_typeahead_response(query)
self.assertEqual(response.status_code, 200)
response_data = response.json()
expected_response_data = {'course_runs': [self.serialize_course_run(course_run)],
'programs': [self.serialize_program(program)]}
self.assertDictEqual(response_data, expected_response_data)
......
......@@ -32,6 +32,7 @@ from course_discovery.apps.api.renderers import AffiliateWindowXMLRenderer, Cour
from course_discovery.apps.api.utils import cast2int
from course_discovery.apps.catalogs.models import Catalog
from course_discovery.apps.core.utils import SearchQuerySetWrapper
from course_discovery.apps.course_metadata.choices import ProgramStatus
from course_discovery.apps.course_metadata.constants import COURSE_ID_REGEX, COURSE_RUN_ID_REGEX
from course_discovery.apps.course_metadata.models import Course, CourseRun, Partner, Program, Seat
......@@ -688,8 +689,12 @@ class TypeaheadSearchView(APIView):
def get_results(self, query):
query = '*{}*'.format(query.lower())
course_runs = SearchQuerySet().models(CourseRun).raw_search(query)[:self.RESULT_COUNT]
programs = SearchQuerySet().models(Program).raw_search(query)[:self.RESULT_COUNT]
course_runs = SearchQuerySet().models(CourseRun).raw_search(query)
course_runs = course_runs.filter(published=True).exclude(hidden=True)
course_runs = course_runs[:self.RESULT_COUNT]
programs = SearchQuerySet().models(Program).raw_search(query)
programs = programs.filter(status=ProgramStatus.Active)
programs = programs[:self.RESULT_COUNT]
return course_runs, programs
def get(self, request, *args, **kwargs):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment