From a9b13f0e72c899cda49f59fa266aca39d57b9258 Mon Sep 17 00:00:00 2001 From: zubair-arbi Date: Wed, 1 Apr 2015 16:26:24 +0500 Subject: [PATCH] log and ignore invlaid/deleted courses in Enrollment API ECOM-1273 --- common/djangoapps/enrollment/serializers.py | 26 +++++++++++++++++++ .../djangoapps/enrollment/tests/test_data.py | 13 ++++++++++ 2 files changed, 39 insertions(+) diff --git a/common/djangoapps/enrollment/serializers.py b/common/djangoapps/enrollment/serializers.py index 15de998d55..e93e4208d9 100644 --- a/common/djangoapps/enrollment/serializers.py +++ b/common/djangoapps/enrollment/serializers.py @@ -2,11 +2,16 @@ Serializers for all Course Enrollment related return objects. """ +import logging + from rest_framework import serializers from student.models import CourseEnrollment from course_modes.models import CourseMode +log = logging.getLogger(__name__) + + class StringListField(serializers.CharField): """Custom Serializer for turning a comma delimited string into a list. @@ -56,7 +61,28 @@ class CourseEnrollmentSerializer(serializers.ModelSerializer): course_details = serializers.SerializerMethodField('get_course_details') user = serializers.SerializerMethodField('get_username') + @property + def data(self): + serialized_data = super(CourseEnrollmentSerializer, self).data + + # filter the results with empty courses 'course_details' + if isinstance(serialized_data, dict): + if serialized_data.get('course_details') is None: + return None + + return serialized_data + + return [enrollment for enrollment in serialized_data if enrollment.get('course_details')] + def get_course_details(self, model): + if model.course is None: + msg = u"Course '{0}' does not exist (maybe deleted), in which User (user_id: '{1}') is enrolled.".format( + model.course_id, + model.user.id + ) + log.warning(msg) + return None + field = CourseField() return field.to_native(model.course) diff --git a/common/djangoapps/enrollment/tests/test_data.py b/common/djangoapps/enrollment/tests/test_data.py index c7f5ff7c1f..aee45b93d3 100644 --- a/common/djangoapps/enrollment/tests/test_data.py +++ b/common/djangoapps/enrollment/tests/test_data.py @@ -127,6 +127,19 @@ class EnrollmentDataTest(ModuleStoreTestCase): results = data.get_course_enrollments(self.user.username) self.assertEqual(results, created_enrollments) + # Now create a course enrollment with some invalid course (does + # not exist in database) for the user and check that the method + # 'get_course_enrollments' ignores course enrollments for invalid + # or deleted courses + CourseEnrollment.objects.create( + user=self.user, + course_id='InvalidOrg/InvalidCourse/InvalidRun', + mode='honor', + is_active=True + ) + updated_results = data.get_course_enrollments(self.user.username) + self.assertEqual(results, updated_results) + @ddt.data( # Default (no course modes in the database) # Expect that users are automatically enrolled as "honor".