Discovery: Course/Content Configuration Conflicts

When taking a piece of content from one course and inserting it into another, we have to be especially careful about introducing situations where the content assumes that the course is configured in a way that it is not. As an example, imagine that the content has an assignment type of “quiz”, but no such assignment type exists in the grading policy of the course it is being copied into.

Some high level takeaways:

  • This content/config mismatch can also happen in other ways, so we should take an approach that handles conflict resolution independent of the copy/paste workflow. The Studio Clipboard use case makes these conflicts more likely to happen, but there are other causes:

    • Imports will succeed even if there are references to content groups that don’t exist in the new course.

    • The Studio UI of some course configuration tries to prevent you from creating illegal states (e.g. you can’t delete a content group if Studio sees you’re using it), but that is not true for all configuration. For instance, you can remove an Assignment Type from the grading policy even if there are Subsections that use that Assignment Type.

  • These conflicts can be changed by adjusting either the course settings (like adding a missing Assignment Type), or the settings on the content being inserted.

  • The current Studio approach to this is to mostly ignore these inconsistencies and present the UI as if nothing were selected at all.

  • There is XBlock-specific functionality for raising validation errors, used at the individual Component level. This is used in a small number of cases, like the LTI XBlock and LibaryContentBlock.

Settings by Content Type

Section

Setting

UI Location

Conflict Description

Setting

UI Location

Conflict Description

Release Date / Time

Outline Page

Sections that are copied from one course to another will likely have a start date/time that doesn’t align to the intended course schedule. It may be better to strip this value entirely in this case.

Subsection

Setting

UI Location

Conflict Description

Setting

UI Location

Conflict Description

Release Date / Time

Outline Page

(see description in Section table above)

Due Date / Time

Outline Page

This is similar to the issue with release dates except that this can also be specified as a relative date/time for self-paced courses (relative_weeks_due). Many (most?) still use absolute dates however. Since copying content from old courses into new ones is a commonly expected pattern, the due date would likely have already passed.

Grade as (Assignment Type)

Outline Page

The Assignment Type of the content may not match any of the ones specified in the destination course Grading Policy.

A screenshot showing a Section and Subsection. The start and due dates are displayed, but there is no special marking to show that the due date has already passed. Also, “Lab” is displayed as the Assignment Type, even though I’ve already deleted it from the Grading Policy. Finally, Subsection Visibility is displayed, but not Assessment Results Visibility, which is hidden behind the cogwheel button.

Visibility Settings

The Visibility settings for a Subsection may also need adjustment to bring it in line with the rest of the conventions of the course. Subsection visibility (e.g. “Hide content after due date”) is displayed in the outline view, but Assessment Results Visibility (e.g. “Show assessment results when subsection is past due”) is not. There’s no way for these values to be illegal, as in the case of Assignment Type, but it may be inconsistent with the practices of the course. I think it’s okay to just leave this be for now, or possibly surface Assessment Results Visibility in the subsection display on the outline.

Consistently applying certain policies to collections of content is an authoring problem that goes beyond just visibility settings. Course authors also want to set things like number of allowed attempts, randomization, etc. without the tedium of clicking into each and every problem.

I’m not sure what the solution to that would look like. Maybe expanding the Assignment Types to carry default policies around these things? I know people have looked into it in the past, so there’s probably a wiki doc about it somewhere.

In any event, I don’t think that solving this is something we should tackle as part of the MVP. I just wanted to mention this context in case we start to iterate on ideas that would solve the problem locally, but might conflict with a more holistic solution to this issue.

Content Groups

Content Groups cannot currently be assigned in the Studio UI at the Section and Subsection levels, but it has been requested as a feature. Course teams sometimes end up making every Unit in a Subsection in a particular Content Group which will currently force the whole Subsection into that Content Group. Course teams that know how to author OLX can also manually assign that group information at the Subsection or Section levels as well.

In any case, this is not something that needs to be addressed in this MVP, but it is likely that we’d imitate whatever pattern is used for Units and Content Groups.

Unit

Setting

UI Location

Conflict Description

Setting

UI Location

Conflict Description

Unit Access →
Restrict access to

Outline Page + Unit Page

These are the content group and enrollment track access settings.

Content Groups are set on a per-course basis, and have course specific, machine-generated IDs. Even if two courses have Content Groups that are named the same, the values that are stored on the XBlock are the IDs, and it won’t map properly in the new course.

Enrollment Tracks are different modes that students can be enrolled in, (e.g. “audit”, “verified”). In the actual implementation though, Enrollment Track-based access just means that there are a handful of Content Groups with IDs that are fixed and globally recognized by the code. These values will work across courses, assuming the course has those enrollment tracks enabled.

Recommendation: Keep these values when pasting in the same course, but strip non-enrollment-track content group values when pasting across courses. A more complicated alternative might be to look for content groups with matching names, but custom content groups are used less often, so I don’t think this complexity is worth it for the first iteration.

Component

Setting

UI Location

Conflict Description

Setting

UI Location

Conflict Description

Unit Access →
Restrict access to

Unit Page

(see description in Unit table above)

Individual Components can have this set as well. The message that there is some content that is restricted does show up in the Outline page, but the only place this value can be changed/fixed is the Unit page.

 

 

 

 

 

 

TODO: Show examples of specific Component conflict display (LTI, Library Content) and the XBlock API that covers this.