Merge pull request #18808 from open-craft/opencraft/taranjeet/fix-child-course-display

Fix incorrect course name displayed for CCX courses.
This commit is contained in:
David Ormsbee
2018-09-13 10:53:35 -04:00
committed by GitHub
3 changed files with 78 additions and 0 deletions

View File

@@ -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)
]

View File

@@ -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)

View File

@@ -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'