diff --git a/common/djangoapps/course_modes/models.py b/common/djangoapps/course_modes/models.py
index 608534e482..f95f94feb2 100644
--- a/common/djangoapps/course_modes/models.py
+++ b/common/djangoapps/course_modes/models.py
@@ -475,7 +475,7 @@ class CourseMode(models.Model):
@classmethod
def min_course_price_for_verified_for_currency(cls, course_id, currency): # pylint: disable=invalid-name
"""
- Returns the minimum price of the course int he appropriate currency over all the
+ Returns the minimum price of the course in the appropriate currency over all the
course's *verified*, non-expired modes.
Assuming all verified courses have a minimum price of >0, this value should always
diff --git a/common/djangoapps/student/models.py b/common/djangoapps/student/models.py
index d1826b683f..49f036f940 100644
--- a/common/djangoapps/student/models.py
+++ b/common/djangoapps/student/models.py
@@ -54,7 +54,7 @@ from edx_django_utils.cache import RequestCache
import lms.lib.comment_client as cc
from student.signals import UNENROLL_DONE, ENROLL_STATUS_CHANGE, ENROLLMENT_TRACK_UPDATED
from lms.djangoapps.certificates.models import GeneratedCertificate
-from course_modes.models import CourseMode
+from course_modes.models import CourseMode, get_cosmetic_display_price
from courseware.models import (
CourseDynamicUpgradeDeadlineConfiguration,
DynamicUpgradeDeadlineConfiguration,
@@ -1075,6 +1075,10 @@ class CourseEnrollment(models.Model):
on_delete=models.DO_NOTHING,
)
+ @property
+ def course_price(self):
+ return get_cosmetic_display_price(self.course)
+
@property
def course_id(self):
return self._course_id
diff --git a/common/djangoapps/student/views/dashboard.py b/common/djangoapps/student/views/dashboard.py
index fe3f139346..15fb9dc1c5 100644
--- a/common/djangoapps/student/views/dashboard.py
+++ b/common/djangoapps/student/views/dashboard.py
@@ -22,7 +22,7 @@ from six import text_type, iteritems
import track.views
from bulk_email.models import BulkEmailFlag, Optout # pylint: disable=import-error
-from course_modes.models import CourseMode
+from course_modes.models import CourseMode, get_cosmetic_display_price
from courseware.access import has_access
from edxmako.shortcuts import render_to_response, render_to_string
from entitlements.models import CourseEntitlement
@@ -42,7 +42,7 @@ from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace
from openedx.core.djangoapps.user_api.accounts.utils import is_secondary_email_feature_enabled_for_user
from openedx.core.djangolib.markup import HTML, Text
from openedx.features.enterprise_support.api import get_dashboard_consent_notification
-from openedx.features.enterprise_support.utils import is_enterprise_learner
+from lms.djangoapps.experiments.utils import get_experiment_dashboard_metadata_context
from openedx.features.journals.api import journals_enabled
from shoppingcart.api import order_history
from shoppingcart.models import CourseRegistrationCode, DonationConfiguration
@@ -60,6 +60,13 @@ from xmodule.modulestore.django import modulestore
log = logging.getLogger("edx.student")
+experiments_namespace = WaffleFlagNamespace(name=u'student.experiments')
+#TODO START: Delete waffle flag as part of REVEM-204.
+dashboard_metadata_flag = WaffleFlag(experiments_namespace,
+ u'dashboard_metadata',
+ flag_undefined_default=False)
+#TODO END: REVEM-204
+
def get_org_black_and_whitelist_for_site():
"""
@@ -695,7 +702,7 @@ def student_dashboard(request):
inverted_programs = meter.invert_programs()
urls, programs_data = {}, {}
- bundles_on_dashboard_flag = WaffleFlag(WaffleFlagNamespace(name=u'student.experiments'), u'bundles_on_dashboard')
+ bundles_on_dashboard_flag = WaffleFlag(experiments_namespace, u'bundles_on_dashboard')
# TODO: Delete this code and the relevant HTML code after testing LEARNER-3072 is complete
if bundles_on_dashboard_flag.is_enabled() and inverted_programs and inverted_programs.items():
@@ -869,6 +876,10 @@ def student_dashboard(request):
'empty_dashboard_message': empty_dashboard_message,
'recovery_email_message': recovery_email_message,
'recovery_email_activation_message': recovery_email_activation_message,
+ # TODO START: Clean up REVEM-205 & REVEM-204.
+ # The below context is for experiments in dashboard_metadata
+ 'course_prices': get_experiment_dashboard_metadata_context(course_enrollments) if dashboard_metadata_flag.is_enabled() else None,
+ # TODO END: Clean up REVEM-205 & REVEM-204.
}
if ecommerce_service.is_enabled(request.user):
diff --git a/lms/djangoapps/experiments/utils.py b/lms/djangoapps/experiments/utils.py
index 58213f22dc..3e45ed8f64 100644
--- a/lms/djangoapps/experiments/utils.py
+++ b/lms/djangoapps/experiments/utils.py
@@ -191,3 +191,15 @@ def get_experiment_user_metadata_context(course, user):
'program_key_fields': program_key,
# TODO: clean up as part of REVEM-199 (END)
}
+
+
+#TODO START: Clean up REVEM-205
+def get_experiment_dashboard_metadata_context(enrollments):
+ """
+ Given a list of enrollments return a dict of course ids with their prices.
+ Utility function for experimental metadata. See experiments/dashboard_metadata.html.
+ :param enrollments:
+ :return: dict of courses: course price for dashboard metadata
+ """
+ return {str(enrollment.course): enrollment.course_price for enrollment in enrollments}
+#TODO END: Clean up REVEM-205
diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html
index 9cfa2beb47..5daf43a627 100644
--- a/lms/templates/dashboard.html
+++ b/lms/templates/dashboard.html
@@ -361,3 +361,4 @@ from student.models import CourseEnrollment
<%include file="dashboard/_dashboard_entitlement_unenrollment_modal.html"/>
+<%include file="/experiments/dashboard_metadata.html" args='course_prices=course_prices'/>
diff --git a/lms/templates/experiments/dashboard_metadata.html b/lms/templates/experiments/dashboard_metadata.html
new file mode 100644
index 0000000000..ecdbe48b8d
--- /dev/null
+++ b/lms/templates/experiments/dashboard_metadata.html
@@ -0,0 +1,14 @@
+<%page args="course_prices" expression_filter="h"/>
+<%!
+from openedx.core.djangolib.js_utils import dump_js_escaped_json
+%>
+
+
+<%
+dashboard_metadata = { 'course_prices': course_prices }
+%>
+
+
+
diff --git a/lms/templates/user_metadata.html b/lms/templates/experiments/user_metadata.html
similarity index 100%
rename from lms/templates/user_metadata.html
rename to lms/templates/experiments/user_metadata.html
diff --git a/lms/templates/main.html b/lms/templates/main.html
index 41f031f08e..6647b81c83 100644
--- a/lms/templates/main.html
+++ b/lms/templates/main.html
@@ -7,6 +7,7 @@
## Pages currently use v1 styling by default. Once the Pattern Library
## rollout has been completed, this default can be switched to v2.
+<%page expression_filter="h"/>
<%! main_css = "style-main-v1" %>
@@ -128,14 +129,13 @@ from pipeline_mako import render_require_js_path_overrides
<%block name="head_extra"/>
<%include file="/courseware/experiments.html"/>
- <%include file="user_metadata.html"/>
+ <%include file="/experiments/user_metadata.html"/>
<%static:optional_include_mako file="head-extra.html" is_theming_enabled="True" />
<%include file="widgets/optimizely.html" />
<%include file="widgets/segment-io.html" />
-
<% google_site_verification_id = configuration_helpers.get_value('GOOGLE_SITE_VERIFICATION_ID', settings.GOOGLE_SITE_VERIFICATION_ID) %>
% if google_site_verification_id: