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 |
---|---|---|
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 |
---|---|---|
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 ( |
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. |
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 |
---|---|---|
Unit Access → | Outline Page + Unit Page | These are the content group and enrollment track access settings. 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 |
---|---|---|
Unit Access → | Unit Page | (see description in Unit table above) |
|
|
|
|
|
|
TODO: Show examples of specific Component conflict display (LTI, Library Content) and the XBlock API that covers this.