Merge pull request #24490 from edx/tuchfarber/use_demographics_api_for_banner

Use new demographics API for banner in .org theme
This commit is contained in:
Matt Tuchfarber
2020-07-17 14:02:55 -04:00
committed by GitHub
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">