diff --git a/common/djangoapps/student/tests/tests.py b/common/djangoapps/student/tests/tests.py index adefb22f0f04ba2b8af92dd8d671fb08828e3e57..972d9edcae245c279a150022fa11c3a501a4fd72 100644 --- a/common/djangoapps/student/tests/tests.py +++ b/common/djangoapps/student/tests/tests.py @@ -34,6 +34,7 @@ from openedx.core.djangolib.testing.utils import CacheIsolationTestCase from openedx.core.djangoapps.programs.models import ProgramsApiConfig from openedx.core.djangoapps.programs.tests import factories as programs_factories from openedx.core.djangoapps.programs.tests.mixins import ProgramsApiConfigMixin +from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin import shoppingcart # pylint: disable=import-error from student.models import ( anonymous_id_for_user, user_by_anonymous_id, CourseEnrollment, @@ -525,6 +526,64 @@ class DashboardTest(ModuleStoreTestCase): return complete_course_mode_info(self.course.id, enrollment) +@ddt.ddt +class DashboardTestsWithSiteOverrides(SiteMixin, ModuleStoreTestCase): + """ + Tests for site settings overrides used when rendering the dashboard view + """ + + def setUp(self): + super(DashboardTestsWithSiteOverrides, self).setUp() + self.org = 'fakeX' + self.course = CourseFactory.create(org=self.org) + self.user = UserFactory.create(username='jack', email='jack@fake.edx.org', password='test') + CourseModeFactory.create(mode_slug='no-id-professional', course_id=self.course.id) + CourseEnrollment.enroll(self.user, self.course.location.course_key, mode='no-id-professional') + cache.clear() + + @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') + @patch.dict("django.conf.settings.FEATURES", {'ENABLE_VERIFIED_CERTIFICATES': False}) + @ddt.data( + ('testserver1.com', {'ENABLE_VERIFIED_CERTIFICATES': True}), + ('testserver2.com', {'ENABLE_VERIFIED_CERTIFICATES': True, 'DISPLAY_COURSE_MODES_ON_DASHBOARD': True}), + ) + @ddt.unpack + def test_course_mode_visible(self, site_domain, site_configuration_values): + """ + Test that the course mode for courses is visible on the dashboard + when settings have been overridden by site configuration. + """ + site_configuration_values.update({ + 'SITE_NAME': site_domain, + 'course_org_filter': self.org + }) + self.set_up_site(site_domain, site_configuration_values) + self.client.login(username='jack', password='test') + response = self.client.get(reverse('dashboard')) + self.assertContains(response, 'class="course professional"') + + @unittest.skipUnless(settings.ROOT_URLCONF == 'lms.urls', 'Test only valid in lms') + @patch.dict("django.conf.settings.FEATURES", {'ENABLE_VERIFIED_CERTIFICATES': False}) + @ddt.data( + ('testserver3.com', {'ENABLE_VERIFIED_CERTIFICATES': False}), + ('testserver4.com', {'DISPLAY_COURSE_MODES_ON_DASHBOARD': False}), + ) + @ddt.unpack + def test_course_mode_invisible(self, site_domain, site_configuration_values): + """ + Test that the course mode for courses is invisible on the dashboard + when settings have been overridden by site configuration. + """ + site_configuration_values.update({ + 'SITE_NAME': site_domain, + 'course_org_filter': self.org + }) + self.set_up_site(site_domain, site_configuration_values) + self.client.login(username='jack', password='test') + response = self.client.get(reverse('dashboard')) + self.assertNotContains(response, 'class="course professional"') + + class UserSettingsEventTestMixin(EventTestMixin): """ Mixin for verifying that user setting events were emitted during a test. diff --git a/common/djangoapps/student/views.py b/common/djangoapps/student/views.py index b7722e928723884e5ddc3de5fe7fe3237f20444b..754752976f38de73437f2b9f8baaf378259a8d72 100644 --- a/common/djangoapps/student/views.py +++ b/common/djangoapps/student/views.py @@ -570,6 +570,14 @@ def dashboard(request): user = request.user platform_name = configuration_helpers.get_value("platform_name", settings.PLATFORM_NAME) + enable_verified_certificates = configuration_helpers.get_value( + 'ENABLE_VERIFIED_CERTIFICATES', + settings.FEATURES.get('ENABLE_VERIFIED_CERTIFICATES') + ) + display_course_modes_on_dashboard = configuration_helpers.get_value( + 'DISPLAY_COURSE_MODES_ON_DASHBOARD', + settings.FEATURES.get('DISPLAY_COURSE_MODES_ON_DASHBOARD', True) + ) # we want to filter and only show enrollments for courses within # the 'ORG' defined in configuration. @@ -762,6 +770,7 @@ def dashboard(request): 'programs_by_run': programs_by_run, 'show_program_listing': ProgramsApiConfig.current().show_program_listing, 'disable_courseware_js': True, + 'display_course_modes_on_dashboard': enable_verified_certificates and display_course_modes_on_dashboard, } ecommerce_service = EcommerceService() diff --git a/lms/templates/dashboard.html b/lms/templates/dashboard.html index 1beaa56c4a05c734257a866b5b25d9b0305b3980..b92099ff4800942705334996b88e299733c2a544 100644 --- a/lms/templates/dashboard.html +++ b/lms/templates/dashboard.html @@ -99,7 +99,7 @@ from openedx.core.djangolib.markup import HTML, Text <% course_verification_status = verification_status_by_course.get(enrollment.course_id, {}) %> <% course_requirements = courses_requirements_not_met.get(enrollment.course_id) %> <% related_programs = programs_by_run.get(unicode(enrollment.course_id)) %> - <%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, show_refund_option=show_refund_option, 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" /> + <%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, show_refund_option=show_refund_option, 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' /> % endfor </ul> diff --git a/lms/templates/dashboard/_dashboard_course_listing.html b/lms/templates/dashboard/_dashboard_course_listing.html index 14774c0e6a344906438fb26cb22766e40d87d58f..110830f66a1b74b65f3241b92539efe8558d73da 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, show_refund_option, is_paid_course, is_course_blocked, verification_status, course_requirements, dashboard_index, share_settings, related_programs" expression_filter="h"/> +<%page args="course_overview, enrollment, show_courseware_link, cert_status, can_unenroll, credit_status, show_email_settings, course_mode_info, show_refund_option, is_paid_course, is_course_blocked, verification_status, course_requirements, dashboard_index, share_settings, related_programs, display_course_modes_on_dashboard" expression_filter="h"/> <%! import urllib @@ -37,7 +37,7 @@ from student.helpers import ( <%namespace name='static' file='../static_content.html'/> <li class="course-item"> - % if settings.FEATURES.get('ENABLE_VERIFIED_CERTIFICATES'): + % if display_course_modes_on_dashboard: <% course_verified_certs = enrollment_mode_display( enrollment.mode, @@ -74,7 +74,7 @@ from student.helpers import ( <img src="${course_overview.image_urls['small']}" class="course-image" alt="${_('{course_number} {course_name} Cover Image').format(course_number=course_overview.number, course_name=course_overview.display_name_with_default)}" /> </a> % endif - % if settings.FEATURES.get('ENABLE_VERIFIED_CERTIFICATES') and course_verified_certs.get('display_mode') != 'audit': + % if display_course_modes_on_dashboard and course_verified_certs.get('display_mode') != 'audit': <span class="sts-enrollment" title="${course_verified_certs.get('enrollment_title')}"> <span class="label">${_("Enrolled as: ")}</span> % if course_verified_certs.get('show_image'): diff --git a/openedx/core/djangoapps/site_configuration/tests/mixins.py b/openedx/core/djangoapps/site_configuration/tests/mixins.py index a1f246e4421895e6fb473617ce1df4466b0a4a3e..d5859991bc76431919f0f120c88e4469c7ac9db3 100644 --- a/openedx/core/djangoapps/site_configuration/tests/mixins.py +++ b/openedx/core/djangoapps/site_configuration/tests/mixins.py @@ -42,8 +42,22 @@ class SiteMixin(object): # Initialize client with default site domain self.use_site(self.site) + def set_up_site(self, domain, site_configuration_values): + """ + Create Site and SiteConfiguration models and initialize test client with the created site + """ + site = SiteFactory.create( + domain=domain, + name=domain + ) + __ = SiteConfigurationFactory.create( + site=site, + values=site_configuration_values + ) + self.use_site(site) + def use_site(self, site): """ - # Initializes the test client with the domain of the given site + Initializes the test client with the domain of the given site """ self.client = self.client_class(SERVER_NAME=site.domain)