diff --git a/lms/djangoapps/ccx/migrations/0006_set_display_name_as_override.py b/lms/djangoapps/ccx/migrations/0006_set_display_name_as_override.py new file mode 100644 index 0000000000..b66ce2754e --- /dev/null +++ b/lms/djangoapps/ccx/migrations/0006_set_display_name_as_override.py @@ -0,0 +1,65 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.15 on 2018-08-31 18:13 +from __future__ import unicode_literals + +from django.db import migrations + +import json +import logging + +from ccx_keys.locator import CCXLocator +from courseware.courses import get_course_by_id +from xmodule.modulestore.django import SignalHandler + +log = logging.getLogger(__name__) + + +def save_display_name(apps, schema_editor): + ''' + Add override for `display_name` for CCX courses that don't have one yet. + ''' + CcxFieldOverride = apps.get_model('ccx', 'CcxFieldOverride') + CustomCourseForEdX = apps.get_model('ccx', 'CustomCourseForEdX') + + # Build list of CCX courses that don't have an override for `display_name` yet + ccx_display_name_present_ids = list(CcxFieldOverride.objects.filter( + field='display_name').values_list('ccx__id', flat=True)) + ccx_list = CustomCourseForEdX.objects.exclude(id__in=ccx_display_name_present_ids) + + # Create `display_name` overrides for these CCX courses + for ccx in ccx_list: + course = get_course_by_id(ccx.course_id, depth=None) + display_name = course.fields['display_name'] + display_name_json = display_name.to_json(ccx.display_name) + serialized_display_name = json.dumps(display_name_json) + + CcxFieldOverride.objects.get_or_create( + ccx=ccx, + location=course.location, + field='display_name', + defaults={'value': serialized_display_name}, + ) + + # Publish change + responses = SignalHandler.course_published.send( + sender=ccx, + course_key=CCXLocator.from_course_locator(course.id, unicode(ccx.id)) + ) + for rec, response in responses: + log.info( + 'Signal fired when course is published. Course %s. Receiver: %s. Response: %s', + ccx.course_id, + rec, + response + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('ccx', '0005_change_ccx_coach_to_staff'), + ] + + operations = [ + migrations.RunPython(save_display_name, reverse_code=migrations.RunPython.noop) + ] diff --git a/lms/djangoapps/ccx/tests/test_views.py b/lms/djangoapps/ccx/tests/test_views.py index ef2a7efe1d..538aeac90d 100644 --- a/lms/djangoapps/ccx/tests/test_views.py +++ b/lms/djangoapps/ccx/tests/test_views.py @@ -283,6 +283,10 @@ class TestCCXProgressChanges(CcxTestCase, LoginEnrollmentTestCase): @attr(shard=7) +@override_settings( + XBLOCK_FIELD_DATA_WRAPPERS=['lms.djangoapps.courseware.field_overrides:OverrideModulestoreFieldData.wrap'], + MODULESTORE_FIELD_OVERRIDE_PROVIDERS=['ccx.overrides.CustomCoursesForEdxOverrideProvider'], +) @ddt.ddt class TestCoachDashboard(CcxTestCase, LoginEnrollmentTestCase): """ @@ -393,6 +397,13 @@ class TestCoachDashboard(CcxTestCase, LoginEnrollmentTestCase): ccx = CustomCourseForEdX.objects.get() course_enrollments = get_override_for_ccx(ccx, self.course, 'max_student_enrollments_allowed') self.assertEqual(course_enrollments, settings.CCX_MAX_STUDENTS_ALLOWED) + # check if the course display name is properly set + course_display_name = get_override_for_ccx(ccx, self.course, 'display_name') + self.assertEqual(course_display_name, ccx_name) + + # check if the course display name is properly set in modulestore + course_display_name = self.mstore.get_course(ccx.locator).display_name + self.assertEqual(course_display_name, ccx_name) # assert ccx creator has role=staff role = CourseStaffRole(course_key) diff --git a/lms/djangoapps/ccx/views.py b/lms/djangoapps/ccx/views.py index 162086be6c..491e133781 100644 --- a/lms/djangoapps/ccx/views.py +++ b/lms/djangoapps/ccx/views.py @@ -199,6 +199,8 @@ def create_ccx(request, course, ccx=None): # Enforce a static limit for the maximum amount of students that can be enrolled override_field_for_ccx(ccx, course, 'max_student_enrollments_allowed', settings.CCX_MAX_STUDENTS_ALLOWED) + # Save display name explicitly + override_field_for_ccx(ccx, course, 'display_name', name) # Hide anything that can show up in the schedule hidden = 'visible_to_staff_only'