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:
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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">
|
||||
|
||||
Reference in New Issue
Block a user