feat: add related program info to unfulfilled entitlements (#31011)

This commit is contained in:
Jansen Kantor
2022-09-16 10:30:18 -04:00
committed by GitHub
parent 40467d8604
commit 8162d21566
3 changed files with 53 additions and 20 deletions

View File

@@ -467,9 +467,7 @@ class UnfulfilledEntitlementSerializer(serializers.Serializer):
entitlement = EntitlementSerializer(source="*")
course = serializers.SerializerMethodField()
courseProvider = serializers.SerializerMethodField()
# Change after data is implemented. This data is required
programs = ProgramsSerializer(allow_null=True)
programs = serializers.SerializerMethodField()
# These fields are literal values that do not change
courseRun = LiteralField(None)
@@ -500,6 +498,13 @@ class UnfulfilledEntitlementSerializer(serializers.Serializer):
return CourseProviderSerializer(course_overview, allow_null=True).data
def get_programs(self, instance):
"""
If this entitlement is part of a program, include information about the program and related programs
"""
programs = self.context['programs'].get(str(instance.course_uuid), [])
return ProgramsSerializer({"relatedPrograms": programs}, context=self.context).data
class SuggestedCourseSerializer(serializers.Serializer):
"""Serializer for a suggested course"""

View File

@@ -773,19 +773,8 @@ class TestLearnerEnrollmentsSerializer(LearnerDashboardBaseTest):
class TestUnfulfilledEntitlementSerializer(LearnerDashboardBaseTest):
"""High-level tests for UnfulfilledEntitlementSerializer"""
@classmethod
def generate_test_entitlement_data(cls):
mock_enrollment = cls.create_test_enrollment(cls)
return {
"courseProvider": TestCourseProviderSerializer.generate_test_provider_info(),
"course": mock_enrollment.course,
"entitlement": TestEntitlementSerializer.generate_test_entitlement_info(),
"programs": TestProgramsSerializer.generate_test_programs_info(),
}
def test_happy_path(self):
"""Test that nothing breaks and the output fields look correct"""
def make_unfulfilled_entitlement(self):
""" Create an unfulflled entitlement, along with a pseudo session and available sessions"""
unfulfilled_entitlement = CourseEntitlementFactory.create()
pseudo_sessions = {
str(unfulfilled_entitlement.uuid): CatalogCourseRunFactory.create()
@@ -793,18 +782,27 @@ class TestUnfulfilledEntitlementSerializer(LearnerDashboardBaseTest):
available_sessions = {
str(unfulfilled_entitlement.uuid): CatalogCourseRunFactory.create_batch(3)
}
return unfulfilled_entitlement, pseudo_sessions, available_sessions
# create course overview for course provider info
def make_pseudo_session_course_overviews(self, unfulfilled_entitlement, pseudo_sessions):
""" Create course overview for course provider info """
course_key_str = pseudo_sessions[str(unfulfilled_entitlement.uuid)]["key"]
course_key = CourseKey.from_string(course_key_str)
course_overview = CourseOverviewFactory.create(id=course_key)
return {course_key: course_overview}
pseudo_session_course_overviews = {course_key: course_overview}
def test_happy_path(self):
"""Test that nothing breaks and the output fields look correct"""
unfulfilled_entitlement, pseudo_sessions, available_sessions = self.make_unfulfilled_entitlement()
pseudo_session_course_overviews = self.make_pseudo_session_course_overviews(
unfulfilled_entitlement,
pseudo_sessions
)
context = {
"unfulfilled_entitlement_pseudo_sessions": pseudo_sessions,
"course_entitlement_available_sessions": available_sessions,
"pseudo_session_course_overviews": pseudo_session_course_overviews,
"programs": {}
}
output_data = UnfulfilledEntitlementSerializer(
@@ -831,6 +829,35 @@ class TestUnfulfilledEntitlementSerializer(LearnerDashboardBaseTest):
output_data["enrollment"]
== UnfulfilledEntitlementSerializer.STATIC_ENTITLEMENT_ENROLLMENT_DATA
)
assert output_data["course"] is not None
assert output_data["courseProvider"] is not None
assert output_data["programs"] == {"relatedPrograms": []}
def test_programs(self):
unfulfilled_entitlement, pseudo_sessions, available_sessions = self.make_unfulfilled_entitlement()
pseudo_session_course_overviews = self.make_pseudo_session_course_overviews(
unfulfilled_entitlement,
pseudo_sessions
)
related_programs = ProgramFactory.create_batch(3)
programs = {
str(unfulfilled_entitlement.course_uuid): related_programs
}
context = {
"unfulfilled_entitlement_pseudo_sessions": pseudo_sessions,
"course_entitlement_available_sessions": available_sessions,
"pseudo_session_course_overviews": pseudo_session_course_overviews,
"programs": programs
}
output_data = UnfulfilledEntitlementSerializer(
unfulfilled_entitlement, context=context
).data
assert output_data["programs"] == ProgramsSerializer(
{"relatedPrograms": related_programs}
).data
def test_static_enrollment_data(self):
"""
@@ -1028,6 +1055,7 @@ class TestLearnerDashboardSerializer(LearnerDashboardBaseTest):
course_overview = CourseOverviewFactory.create(id=course_key)
pseudo_session_course_overviews[course_key] = course_overview
programs = {
str(enrollment.course.id): ProgramFactory.create_batch(3)
for enrollment in enrollments

View File

@@ -246,7 +246,7 @@ def get_course_programs(user, course_enrollments, site):
}
}
"""
meter = ProgramProgressMeter(site, user, enrollments=course_enrollments)
meter = ProgramProgressMeter(site, user, enrollments=course_enrollments, include_course_entitlements=True)
return meter.invert_programs()