'),
+ HtmlUtils.HTML(this.$courseImageLink.html()),
+ HtmlUtils.HTML('
')
+ ).text
+ );
+ this.$courseTitleLink.replaceWith( // xss-lint: disable=javascript-jquery-insertion
+ HtmlUtils.joinHtml(
+ HtmlUtils.HTML('
<%include file="learner_dashboard/_dashboard_navigation_courses.html"/>
- % if len(course_enrollments) > 0:
+ % if len(course_entitlements + course_enrollments) > 0:
<%
share_settings = configuration_helpers.get_value(
@@ -116,20 +121,53 @@ from openedx.core.djangolib.markup import HTML, Text
getattr(settings, 'SOCIAL_SHARING_SETTINGS', {})
)
%>
- % for dashboard_index, enrollment in enumerate(course_enrollments):
- <% show_courseware_link = (enrollment.course_id in show_courseware_links_for) %>
- <% cert_status = cert_statuses.get(enrollment.course_id) %>
- <% can_unenroll = (not cert_status) or cert_status.get('can_unenroll') %>
- <% credit_status = credit_statuses.get(enrollment.course_id) %>
- <% show_email_settings = (enrollment.course_id in show_email_settings_for) %>
- <% course_mode_info = all_course_modes.get(enrollment.course_id) %>
- <% is_paid_course = (enrollment.course_id in enrolled_courses_either_paid) %>
- <% is_course_blocked = (enrollment.course_id in block_courses) %>
- <% course_verification_status = verification_status_by_course.get(enrollment.course_id, {}) %>
- <% course_requirements = courses_requirements_not_met.get(enrollment.course_id) %>
- <% related_programs = inverted_programs.get(unicode(enrollment.course_id)) %>
- <% show_consent_link = (enrollment.course_id in consent_required_courses) %>
- <%include file='dashboard/_dashboard_course_listing.html' args='course_overview=enrollment.course_overview, enrollment=enrollment, show_courseware_link=show_courseware_link, cert_status=cert_status, can_unenroll=can_unenroll, credit_status=credit_status, show_email_settings=show_email_settings, course_mode_info=course_mode_info, is_paid_course=is_paid_course, is_course_blocked=is_course_blocked, verification_status=course_verification_status, course_requirements=course_requirements, dashboard_index=dashboard_index, share_settings=share_settings, user=user, related_programs=related_programs, display_course_modes_on_dashboard=display_course_modes_on_dashboard, show_consent_link=show_consent_link, enterprise_customer_name=enterprise_customer_name' />
+ % for dashboard_index, enrollment in enumerate(course_entitlements + course_enrollments):
+ <%
+ # Check if the course run is an entitlement and if it has an associated session
+ entitlement = enrollment if isinstance(enrollment, CourseEntitlement) else None
+ entitlement_session = entitlement.enrollment_course_run if entitlement else None
+
+ is_fulfilled_entitlement = True if entitlement and entitlement_session else False
+ is_unfulfilled_entitlement = True if entitlement and not entitlement_session else False
+
+ entitlement_available_sessions = []
+ if entitlement:
+ # Grab the available, enrollable sessions for a given entitlement and scrape them for relevant attributes
+ entitlement_available_sessions = [{
+ 'session_id': course['key'],
+ 'enrollment_end': course['enrollment_end'],
+ 'pacing_type': course['pacing_type'],
+ 'session_start_advertised': CourseOverview.get_from_id(CourseKey.from_string(course['key'])).advertised_start,
+ 'session_start': CourseOverview.get_from_id(CourseKey.from_string(course['key'])).start,
+ 'session_end': CourseOverview.get_from_id(CourseKey.from_string(course['key'])).end,
+ } for course in course_entitlement_available_sessions[str(entitlement.uuid)]]
+ if is_fulfilled_entitlement:
+ # If the user has a fulfilled entitlement, pass through the entitlements CourseEnrollment object
+ enrollment = entitlement_session
+ else:
+ # If the user has an unfulfilled entitlement, pass through a bare CourseEnrollment object built off of the next available session
+ upcoming_sessions = course_entitlement_available_sessions[str(entitlement.uuid)]
+ next_session = upcoming_sessions[0] if upcoming_sessions else None
+ if not next_session:
+ continue
+ enrollment = CourseEnrollment(user=user, course_id=next_session['key'], mode=next_session['type'])
+
+ session_id = enrollment.course_id
+ show_courseware_link = (session_id in show_courseware_links_for)
+ cert_status = cert_statuses.get(session_id)
+ can_unenroll = (not cert_status) or cert_status.get('can_unenroll') if not unfulfilled_entitlement else False
+ credit_status = credit_statuses.get(session_id)
+ show_email_settings = (session_id in show_email_settings_for)
+ course_mode_info = all_course_modes.get(session_id)
+ is_paid_course = True if entitlement else (session_id in enrolled_courses_either_paid)
+ is_course_blocked = (session_id in block_courses)
+ course_verification_status = verification_status_by_course.get(session_id, {})
+ course_requirements = courses_requirements_not_met.get(session_id)
+ related_programs = inverted_programs.get(unicode(session_id))
+ show_consent_link = (session_id in consent_required_courses)
+ course_overview = enrollment.course_overview
+ %>
+ <%include file='dashboard/_dashboard_course_listing.html' args='course_overview=course_overview, course_card_index=dashboard_index, enrollment=enrollment, is_unfulfilled_entitlement=is_unfulfilled_entitlement, is_fulfilled_entitlement=is_fulfilled_entitlement, entitlement=entitlement, entitlement_session=entitlement_session, entitlement_available_sessions=entitlement_available_sessions, show_courseware_link=show_courseware_link, cert_status=cert_status, can_unenroll=can_unenroll, credit_status=credit_status, show_email_settings=show_email_settings, course_mode_info=course_mode_info, is_paid_course=is_paid_course, is_course_blocked=is_course_blocked, verification_status=course_verification_status, course_requirements=course_requirements, dashboard_index=dashboard_index, share_settings=share_settings, user=user, related_programs=related_programs, display_course_modes_on_dashboard=display_course_modes_on_dashboard, show_consent_link=show_consent_link, enterprise_customer_name=enterprise_customer_name' />
% endfor
diff --git a/lms/templates/dashboard/_dashboard_course_listing.html b/lms/templates/dashboard/_dashboard_course_listing.html
index 21a7c54139..dc4e045e28 100644
--- a/lms/templates/dashboard/_dashboard_course_listing.html
+++ b/lms/templates/dashboard/_dashboard_course_listing.html
@@ -1,4 +1,4 @@
-<%page args="course_overview, enrollment, show_courseware_link, cert_status, can_unenroll, credit_status, show_email_settings, course_mode_info, is_paid_course, is_course_blocked, verification_status, course_requirements, dashboard_index, share_settings, related_programs, display_course_modes_on_dashboard, show_consent_link, enterprise_customer_name" expression_filter="h"/>
+<%page args="course_overview, enrollment, entitlement, entitlement_session, course_card_index, is_unfulfilled_entitlement, is_fulfilled_entitlement, entitlement_available_sessions, show_courseware_link, cert_status, can_unenroll, credit_status, show_email_settings, course_mode_info, is_paid_course, is_course_blocked, verification_status, course_requirements, dashboard_index, share_settings, related_programs, display_course_modes_on_dashboard, show_consent_link, enterprise_customer_name" expression_filter="h"/>
<%!
import urllib
@@ -59,11 +59,12 @@ from util.course import get_link_for_about_page, get_encoded_course_sharing_utm_
lang="${course_overview.language}"
% endif
>
-
+
<% course_target = reverse(course_home_url_name(course_overview.id), args=[unicode(course_overview.id)]) %>
-
+
+ ${_('Course details')}
- % if show_courseware_link:
+ % if show_courseware_link and not is_unfulfilled_entitlement:
% if not is_course_blocked:
${course_overview.display_name_with_default}
% else:
@@ -126,18 +127,27 @@ from util.course import get_link_for_about_page, get_encoded_course_sharing_utm_
endif
%>
- % if isinstance(course_date, basestring):
- ${_(container_string).format(date=course_date)}
- % elif course_date is not None:
- <%
- course_date_string = course_date.strftime('%Y-%m-%dT%H:%M:%S%z')
- %>
-
+
+ % if is_unfulfilled_entitlement:
+
+
+ ${_('You must select a session to access the course.')}
+
+ % else:
+ % if isinstance(course_date, basestring):
+ ${container_string.format(date=course_date)}
+ % elif course_date is not None:
+
+ % endif
% endif
+ % if entitlement:
+
+ % endif
+
-
+