From ec7245537add8f7b0fc6ba287da63727df8d3509 Mon Sep 17 00:00:00 2001 From: Douglas Hall <douglashall@dhcp-18-189-125-206.dyn.MIT.EDU> Date: Mon, 7 Nov 2016 14:40:13 -0500 Subject: [PATCH] Allow for not showing course modes on student dashboard --- common/djangoapps/student/tests/tests.py | 59 +++++++++++++++++++ common/djangoapps/student/views.py | 9 +++ lms/templates/dashboard.html | 2 +- .../dashboard/_dashboard_course_listing.html | 6 +- .../site_configuration/tests/mixins.py | 16 ++++- 5 files changed, 87 insertions(+), 5 deletions(-) diff --git a/common/djangoapps/student/tests/tests.py b/common/djangoapps/student/tests/tests.py index adefb22f0f0..972d9edcae2 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 b7722e92872..754752976f3 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 1beaa56c4a0..b92099ff480 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 14774c0e6a3..110830f66a1 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 a1f246e4421..d5859991bc7 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) -- GitLab