Gating: Subsection Gating
Feature Overview
Project Listing
Subsection Gating
Problem Description
We would like to limit student access to a proctored exam until a minimum score has been recorded with one of the other components in the course.
Proposed Solution
We are proposing to implement a Course Gating feature in Studio to allow for the configuration of prerequisite subsections that need to be completed before dependent subsections are made available to the student. This will involve modifying the subsections settings dialog to include a “Gating” section which will allow for the following configuration by content authors:
Specify that a subsection fulfills a prerequisite in the course
Specify that access to the subsection is dependent on one or more prerequisites defined within the course
Allow for configuration of a minimum grade that must be achieved on each prerequisite that is added to the subsection
Appropriate validation will need to occur when configuring subsection prerequisites in a course to ensure that content authors are not able to configure circular dependencies.
Subsection rendering will need to be modified to take into account the prerequisites defined in the course. When a user attempts to access a subsection that requires one or more prerequisites, a prerequisite check will be performed for that user. If the user has not satisfied a prerequisite, we will display a page describing the subsections that need to be completed with the required minimum grade, otherwise the subsection’s content will be rendered.
A signal handler will be implemented to listen for scoring events and update the status of prerequisites.
Implementation Details
We will leverage the edx-milestones microservice for the modeling of subsection prerequisites. When a content author identifies a subsection as a prerequisite, a new Milestone model will be created along with a CourseContentMilestone model indicating that the subsection fulfills the Milestone. For each prerequisite subsection added to a dependent subsection, a new CourseContentMilestone model will be created indicating that the dependent subsection requires the Milestone that the prerequisite subsection fulfills.
A new “requirement” CharField will be added to the CourseContentMilestone model and will be used to persist information that goes into determining Milestone fulfillment. In the use case outlined above, the CourseContentMilestone.requirement field will be populated on the “requires” side of the modeled relationship with the minimum grade value that must be achieved in order for the Milestone to be considered fulfilled. A validation check will be added to the milestones implementation to ensure that circular dependencies cannot be created.
Studio will be modified to allow for the configuration options described above, specifically:
A new “Gating” section will be added to the subsection settings dialog.
A “Prerequisite” checkbox will be added to the “Gating” section.
If checked, the milestones API will be called to create the milestone relationships described above, indicating that the subsection can be used as a subsection prerequisite in the course
If unchecked, the milestones API will be called to remove the previously created milestone relationships
A “Gated on” widget will be added for allowing course authors to gate the subsection based on a minimum grade achieved in prerequisite subsections. This widget will consist of:
A select element listing the “Prerequisite” subsections in the course, and
An add button for adding the selected “Prerequisite” subsection to the gating rules
A number input for recording the minimum grade which must be achieved on each “Prerequisite” subsection
The SequenceModule XBlock will be modified to allow for the rendering of a student view that displays unfulfilled prerequisites for a gated subsection.
A grading signal handler will be added to perform milestone evaluations. Grade calculation for subsections involved in gating may need to happen asynchronously to alleviate performance concerns.
Milestones access control already exists in the Course Blocks API used to render courses on mobile.
Existing Feature Considerations
Prerequisite Courses/Entrance Exams
https://github.com/edx/edx-milestones
The prerequisite courses and entrance exams features both required a way of preventing access to course content based on prerequisites. The edx-milestones package was implemented to support these features and also to serve as a generic subsystem in edx-platform that could enable other use cases that would require the gating of content. It allows for the definition of named entities (referred to as “milestones”) and relationships between those entities, a course (or specific XBlock within a course), and a user. A course/XBlock can either fulfill or require a milestone. A clearly defined API is available for managing these relationships including recording when a user has achieved a particular milestone and determining if a given milestone has been achieved. Django models are used to represent the milestone entities and associated relationships with courses/XBlocks and users. This package does not contain the business logic for determining when a user has achieved a given milestone, clients of the API are expected to implement their own rules for achievement.
Proctored Exams
https://github.com/edx/edx-proctoring
The proctored exams feature makes use of a similar design to the one we are proposing above for customized rendering of a subsection that has been configured as a proctored exam.
In-Course Reverification Access Control
https://openedx.atlassian.net/wiki/display/AC/In-Course+Reverification+Access+Control
Access control for ICRV is implemented using an XBlock which when added to a course and published modifies the user partition definitions in the course structure depending on where the ReverificationBlock is added. While this would be a viable solution that has already gone through architectural review, it seems like a way of making use of an existing access control mechanism that was not designed to meet the ICRV use case. The edx-milestones package seems like a more natural fit for the use case of gating content based prerequisite content within a course.