From cbeab67833f8f0c055d4259860b16dc37cc29b8f Mon Sep 17 00:00:00 2001 From: Matt Tuchfarber Date: Fri, 17 Jul 2020 13:20:42 -0400 Subject: [PATCH] Use demographics api for dashboard banner Make demographics collection banner on dashboard use new demographics API which checks enterprise as well. Also expose serialization of CourseEnrollments. --- common/djangoapps/student/views/dashboard.py | 9 --------- .../core/djangoapps/demographics/api/status.py | 14 +++++++++++--- openedx/core/djangoapps/enrollments/api.py | 17 +++++++++++++++++ openedx/core/djangoapps/enrollments/data.py | 7 +++++++ openedx/core/djangoapps/programs/utils.py | 6 +++--- themes/edx.org/lms/templates/dashboard.html | 11 ++++++++--- 6 files changed, 46 insertions(+), 18 deletions(-) diff --git a/common/djangoapps/student/views/dashboard.py b/common/djangoapps/student/views/dashboard.py index 513956d101..b7e1bd9772 100644 --- a/common/djangoapps/student/views/dashboard.py +++ b/common/djangoapps/student/views/dashboard.py @@ -785,14 +785,6 @@ def student_dashboard(request): enr for enr in course_enrollments if entitlement.enrollment_course_run.course_id != enr.course_id ] - # Collect all program types the user is enrolled in - enrolled_program_types = [] - if getattr(settings, 'ENABLE_DEMOGRAPHICS_COLLECTION', False): - enrolled_program_types = { - _program.get('type_attrs', {}).get('slug') - for _program in meter.engaged_programs - if _program.get('type_attrs', {}).get('slug') is not None - } context = { 'urls': urls, 'programs_data': programs_data, @@ -842,7 +834,6 @@ def student_dashboard(request): 'recovery_email_message': recovery_email_message, 'recovery_email_activation_message': recovery_email_activation_message, 'show_load_all_courses_link': show_load_all_courses_link(user, course_limit, course_enrollments), - 'enrolled_program_types': enrolled_program_types, # TODO START: clean up as part of REVEM-199 (START) 'course_info': get_dashboard_course_info(user, course_enrollments), # TODO START: clean up as part of REVEM-199 (END) diff --git a/openedx/core/djangoapps/demographics/api/status.py b/openedx/core/djangoapps/demographics/api/status.py index 77b4f7fb0e..520498af5c 100644 --- a/openedx/core/djangoapps/demographics/api/status.py +++ b/openedx/core/djangoapps/demographics/api/status.py @@ -6,7 +6,15 @@ from openedx.features.enterprise_support.utils import is_enterprise_learner from openedx.core.djangoapps.programs.utils import is_user_enrolled_in_program_type -def show_user_demographics(user): - # Is the learner enrolled in MicroBachelors Program or is the learner an Enterprise learner? - is_user_in_microbachelors_program = is_user_enrolled_in_program_type(user, "microbachelors") +def show_user_demographics(user, enrollments=None, entitlements=None): + """ + Check if the user should be shown demographics collection fields. Currently limited + to MicroBachlors Programs' learners who aren't part of an enterprise. + """ + is_user_in_microbachelors_program = is_user_enrolled_in_program_type( + user, + "microbachelors", + enrollments=enrollments, + entitlements=entitlements + ) return is_user_in_microbachelors_program and not is_enterprise_learner(user) diff --git a/openedx/core/djangoapps/enrollments/api.py b/openedx/core/djangoapps/enrollments/api.py index 7e1b4d638f..ee46fc31fc 100644 --- a/openedx/core/djangoapps/enrollments/api.py +++ b/openedx/core/djangoapps/enrollments/api.py @@ -477,6 +477,23 @@ def get_user_roles(username): return _data_api().get_user_roles(username) +def serialize_enrollments(enrollments): + """ + Takes a list of CourseEnrollment objects and serializes them. + + Serialized result will be compatible will the results from `get_enrollments`. If + the `get_enrollments` function changes to return non-serialized data, this will + need to change as well. + + Args: + enrollments: list of CourseEnrollment objects to be serialized + + Returns: + A list of enrollments + """ + return _data_api().serialize_enrollments(enrollments) + + def _data_api(): """Returns a Data API. This relies on Django settings to find the appropriate data API. diff --git a/openedx/core/djangoapps/enrollments/data.py b/openedx/core/djangoapps/enrollments/data.py index 00fa315bf2..448f50a52d 100644 --- a/openedx/core/djangoapps/enrollments/data.py +++ b/openedx/core/djangoapps/enrollments/data.py @@ -354,3 +354,10 @@ def get_user_roles(username): user._roles = RoleCache(user) role_cache = user._roles return role_cache._roles + + +def serialize_enrollments(enrollments): + """ + Take CourseEnrollment objects and return them in a serialized list. + """ + return CourseEnrollmentSerializer(enrollments, many=True).data diff --git a/openedx/core/djangoapps/programs/utils.py b/openedx/core/djangoapps/programs/utils.py index dd812fdfee..0ccdaafb32 100644 --- a/openedx/core/djangoapps/programs/utils.py +++ b/openedx/core/djangoapps/programs/utils.py @@ -901,7 +901,7 @@ class ProgramMarketingDataExtender(ProgramDataExtender): self.instructors.append(instructor) -def is_user_enrolled_in_program_type(user, program_type, paid_modes=False): +def is_user_enrolled_in_program_type(user, program_type, paid_modes=False, enrollments=None, entitlements=None): """ This method will Look at the learners Enrollments and Entitlements to determine if a learner is enrolled in a Program of the given type. @@ -931,12 +931,12 @@ def is_user_enrolled_in_program_type(user, program_type, paid_modes=False): # Check Entitlements first, because there will be less Course Entitlements than # Course Run Enrollments. - student_entitlements = get_active_entitlement_list_for_user(user) + student_entitlements = entitlements if entitlements is not None else get_active_entitlement_list_for_user(user) for entitlement in student_entitlements: if str(entitlement.course_uuid) in course_uuids: return True - student_enrollments = get_enrollments(user.username) + student_enrollments = enrollments if enrollments is not None else get_enrollments(user.username) for enrollment in student_enrollments: course_run_id = enrollment['course_details']['course_id'] if paid_modes: diff --git a/themes/edx.org/lms/templates/dashboard.html b/themes/edx.org/lms/templates/dashboard.html index f197cdf8e5..67ab2c4d0b 100644 --- a/themes/edx.org/lms/templates/dashboard.html +++ b/themes/edx.org/lms/templates/dashboard.html @@ -141,11 +141,16 @@ from student.models import CourseEnrollment
<% - MB_SLUG = "microbachelors" - enrolled_in_mb_program = MB_SLUG in enrolled_program_types + from openedx.core.djangoapps.demographics.api.status import show_user_demographics + from openedx.core.djangoapps.enrollments.api import serialize_enrollments + serialized_course_enrollments = serialize_enrollments(course_enrollments) + demographics_enabled = getattr(settings, 'ENABLE_DEMOGRAPHICS_COLLECTION', False) + display_demographics_banner = demographics_enabled and show_user_demographics( + user, enrollments=serialized_course_enrollments, entitlements=course_entitlements + ) account_mfe_url = getattr(settings, 'ACCOUNT_MICROFRONTEND_URL', '') or '' %> - % if getattr(settings, 'ENABLE_DEMOGRAPHICS_COLLECTION', False) and enrolled_in_mb_program: + % if display_demographics_banner: