diff --git a/lms/djangoapps/bulk_enroll/serializers.py b/lms/djangoapps/bulk_enroll/serializers.py index 9ac371805db0..9762498ac310 100644 --- a/lms/djangoapps/bulk_enroll/serializers.py +++ b/lms/djangoapps/bulk_enroll/serializers.py @@ -8,10 +8,11 @@ class StringListField(serializers.ListField): def to_internal_value(self, data): - try: - return data[0].split(',') - except IndexError: + if not data: return [] + if isinstance(data, list): + data = data[0] + return data.split(',') class BulkEnrollmentSerializer(serializers.Serializer): diff --git a/lms/djangoapps/bulk_enroll/tests/test_views.py b/lms/djangoapps/bulk_enroll/tests/test_views.py index 4a2ca20faf47..99eaac523445 100644 --- a/lms/djangoapps/bulk_enroll/tests/test_views.py +++ b/lms/djangoapps/bulk_enroll/tests/test_views.py @@ -9,6 +9,7 @@ from django.test.utils import override_settings from rest_framework.test import APIRequestFactory, APITestCase, force_authenticate +from bulk_enroll.serializers import BulkEnrollmentSerializer from bulk_enroll.views import BulkEnrollView from courseware.tests.helpers import LoginEnrollmentTestCase from microsite_configuration import microsite @@ -74,6 +75,22 @@ def request_bulk_enroll(self, data=None, **extra): response.render() return response + def test_course_list_serializer(self): + """ + Test that the course serializer will work when passed a string or list. + + Internally, DRF passes the data into the value conversion method as a list instead of + a string, so StringListField needs to work with both. + """ + for key in [self.course_key, [self.course_key]]: + serializer = BulkEnrollmentSerializer(data={ + 'identifiers': 'percivaloctavius', + 'action': 'enroll', + 'email_students': False, + 'courses': key, + }) + self.assertTrue(serializer.is_valid()) + def test_non_staff(self): """ Test that non global staff users are forbidden from API use. """ self.staff.is_staff = False