Commit 70136afc by Kyle McCormick

Fix course_summaries/ and programs/ to expect correct query param

Fix course_summaries/ to expect 'course_ids' instead of 'ids'.
Fix programs/ to expect 'program_ids' instead of 'ids'.
Fix tests to reflect these changes.

EDUCATOR-604
parent 9c92bfca
...@@ -94,6 +94,7 @@ class VerifyCsvResponseMixin(object): ...@@ -94,6 +94,7 @@ class VerifyCsvResponseMixin(object):
class APIListViewTestMixin(object): class APIListViewTestMixin(object):
model = None model = None
model_id = 'id' model_id = 'id'
ids_param = 'ids'
serializer = None serializer = None
expected_results = [] expected_results = []
list_name = 'list' list_name = 'list'
...@@ -102,7 +103,7 @@ class APIListViewTestMixin(object): ...@@ -102,7 +103,7 @@ class APIListViewTestMixin(object):
def path(self, ids=None, fields=None, exclude=None, **kwargs): def path(self, ids=None, fields=None, exclude=None, **kwargs):
query_params = {} query_params = {}
for query_arg, data in zip(['ids', 'fields', 'exclude'], [ids, fields, exclude]) + kwargs.items(): for query_arg, data in zip([self.ids_param, 'fields', 'exclude'], [ids, fields, exclude]) + kwargs.items():
if data: if data:
query_params[query_arg] = ','.join(data) query_params[query_arg] = ','.join(data)
query_string = '?{}'.format(urlencode(query_params)) query_string = '?{}'.format(urlencode(query_params))
......
...@@ -16,6 +16,7 @@ from analyticsdataserver.tests import TestCaseWithAuthentication ...@@ -16,6 +16,7 @@ from analyticsdataserver.tests import TestCaseWithAuthentication
class CourseSummariesViewTests(VerifyCourseIdMixin, TestCaseWithAuthentication, APIListViewTestMixin): class CourseSummariesViewTests(VerifyCourseIdMixin, TestCaseWithAuthentication, APIListViewTestMixin):
model = models.CourseMetaSummaryEnrollment model = models.CourseMetaSummaryEnrollment
model_id = 'course_id' model_id = 'course_id'
ids_param = 'course_ids'
serializer = serializers.CourseMetaSummaryEnrollmentSerializer serializer = serializers.CourseMetaSummaryEnrollmentSerializer
expected_summaries = [] expected_summaries = []
list_name = 'course_summaries' list_name = 'course_summaries'
...@@ -143,7 +144,7 @@ class CourseSummariesViewTests(VerifyCourseIdMixin, TestCaseWithAuthentication, ...@@ -143,7 +144,7 @@ class CourseSummariesViewTests(VerifyCourseIdMixin, TestCaseWithAuthentication,
[CourseSamples.course_ids[0], 'malformed-course-id'], [CourseSamples.course_ids[0], 'malformed-course-id'],
) )
def test_bad_course_id(self, course_ids): def test_bad_course_id(self, course_ids):
response = self.authenticated_get(self.path(course_ids=course_ids)) response = self.authenticated_get(self.path(ids=course_ids))
self.verify_bad_course_id(response) self.verify_bad_course_id(response)
def test_collapse_upcoming(self): def test_collapse_upcoming(self):
......
...@@ -11,6 +11,7 @@ from analyticsdataserver.tests import TestCaseWithAuthentication ...@@ -11,6 +11,7 @@ from analyticsdataserver.tests import TestCaseWithAuthentication
class ProgramsViewTests(TestCaseWithAuthentication, APIListViewTestMixin): class ProgramsViewTests(TestCaseWithAuthentication, APIListViewTestMixin):
model = models.CourseProgramMetadata model = models.CourseProgramMetadata
model_id = 'program_id' model_id = 'program_id'
ids_param = 'program_ids'
serializer = serializers.CourseProgramMetadataSerializer serializer = serializers.CourseProgramMetadataSerializer
expected_programs = [] expected_programs = []
list_name = 'programs' list_name = 'programs'
......
...@@ -155,6 +155,7 @@ class APIListView(generics.ListAPIView): ...@@ -155,6 +155,7 @@ class APIListView(generics.ListAPIView):
exclude = None exclude = None
always_exclude = [] always_exclude = []
model_id_field = 'id' model_id_field = 'id'
ids_param = 'ids'
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
kwargs.update({ kwargs.update({
...@@ -169,10 +170,19 @@ class APIListView(generics.ListAPIView): ...@@ -169,10 +170,19 @@ class APIListView(generics.ListAPIView):
self.fields = split_query_argument(query_params.get('fields')) self.fields = split_query_argument(query_params.get('fields'))
exclude = split_query_argument(query_params.get('exclude')) exclude = split_query_argument(query_params.get('exclude'))
self.exclude = self.always_exclude + (exclude if exclude else []) self.exclude = self.always_exclude + (exclude if exclude else [])
self.ids = split_query_argument(query_params.get('ids')) self.ids = split_query_argument(query_params.get(self.ids_param))
self.verify_ids()
return super(APIListView, self).get(request, *args, **kwargs) return super(APIListView, self).get(request, *args, **kwargs)
def verify_ids(self):
"""
Optionally raise an exception if any of the IDs set as self.ids are invalid.
By default, no verification is done.
Subclasses can override this if they wish to perform verification.
"""
pass
def base_field_dict(self, item_id): def base_field_dict(self, item_id):
"""Default result with fields pre-populated to default values.""" """Default result with fields pre-populated to default values."""
field_dict = { field_dict = {
......
...@@ -53,6 +53,7 @@ class CourseSummariesView(APIListView): ...@@ -53,6 +53,7 @@ class CourseSummariesView(APIListView):
programs_serializer_class = serializers.CourseProgramMetadataSerializer programs_serializer_class = serializers.CourseProgramMetadataSerializer
model = models.CourseMetaSummaryEnrollment model = models.CourseMetaSummaryEnrollment
model_id_field = 'course_id' model_id_field = 'course_id'
ids_param = 'course_ids'
programs_model = models.CourseProgramMetadata programs_model = models.CourseProgramMetadata
count_fields = ('count', 'cumulative_count', 'count_change_7_days', count_fields = ('count', 'cumulative_count', 'count_change_7_days',
'passing_users') # are initialized to 0 by default 'passing_users') # are initialized to 0 by default
...@@ -64,12 +65,14 @@ class CourseSummariesView(APIListView): ...@@ -64,12 +65,14 @@ class CourseSummariesView(APIListView):
programs = split_query_argument(query_params.get('programs')) programs = split_query_argument(query_params.get('programs'))
if not programs: if not programs:
self.always_exclude = self.always_exclude + ['programs'] self.always_exclude = self.always_exclude + ['programs']
self.ids = split_query_argument(query_params.get('course_ids'))
self.verify_ids()
response = super(CourseSummariesView, self).get(request, *args, **kwargs) response = super(CourseSummariesView, self).get(request, *args, **kwargs)
return response return response
def verify_ids(self): def verify_ids(self):
"""
Raise an exception if any of the course IDs set as self.ids are invalid.
Overrides APIListView.verify_ids.
"""
if self.ids is not None: if self.ids is not None:
for item_id in self.ids: for item_id in self.ids:
validate_course_id(item_id) validate_course_id(item_id)
......
...@@ -35,6 +35,7 @@ class ProgramsView(APIListView): ...@@ -35,6 +35,7 @@ class ProgramsView(APIListView):
serializer_class = serializers.CourseProgramMetadataSerializer serializer_class = serializers.CourseProgramMetadataSerializer
model = models.CourseProgramMetadata model = models.CourseProgramMetadata
model_id_field = 'program_id' model_id_field = 'program_id'
ids_param = 'program_ids'
program_meta_fields = ['program_type', 'program_title'] program_meta_fields = ['program_type', 'program_title']
def base_field_dict(self, program_id): def base_field_dict(self, program_id):
......
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