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.
This commit is contained in:
Matt Tuchfarber
2020-07-17 13:20:42 -04:00
parent f9d379203e
commit cbeab67833
6 changed files with 46 additions and 18 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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.

View File

@@ -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

View File

@@ -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:

View File

@@ -141,11 +141,16 @@ from student.models import CourseEnrollment
<section class="dashboard" id="dashboard-main">
<main class="main-container" id="main" aria-label="Content" tabindex="-1">
<%
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:
<a href="${account_mfe_url}#demographics">
<div
class="demographics-banner d-flex justify-content-left align-items-center flex-column flex-lg-row py-1 px-4 mb-2 mb-lg-4">