/
Cohorts and Content Groups

Cohorts and Content Groups

Where are Cohorts and Content Groups Stored?

Content Groups

Content Groups are a type of UserPartition, and they are defined in a UserPartitionList that is stored on the course module itself (in mongo) via the InheritanceMixin in inheritance.py:

# This is should be scoped to content, but since it's defined in the policy
# file, it is currently scoped to settings.
user_partitions = UserPartitionList(
display_name=_("Group Configurations"),
help=_("Enter the configurations that govern how students are grouped together."),
default=[],
scope=Scope.settings
)

Each UserPartition has a scheme associated with it; the currently defined schemes are "cohort" (for content groups) and "random" (for A/B tests).

Also defined in the InheritanceMixin is group_access, which specifies which UserPartition/group combinations have visibility to the XBlock. The keys are UserPartition ids, and the values are lists of Group ids.

group_access = Dict(
help=_("Enter the ids for the content groups this problem belongs to."),
scope=Scope.settings,
)

In practice, group_access looks like

{partition.id: [partition.groups[0].id, partition.groups[2].id]}

Cohorts

There is a legacy cohort_config dict defined in CourseFields (see below), which is used for migration only to the new model representation.

cohort_config = Dict(
display_name=_("Cohort Configuration"),
help=_(
"Enter policy keys and values to enable the cohort feature, define automated student assignment to "
"groups, or identify any course-wide discussion topics as private to cohort members."
),
scope=Scope.settings
)

The package openedx/course/djangoapps/course_groups contains the majority of the cohort code. The models.py class contains the following SQL models:

CourseCohortsSettings

The new class-specific cohort configuration model.

CourseUserGroup

The model representing groups of users in a course. The only defined group type is "cohort".

CohortMembership

An internal model used to enforce that a learner can be in only one cohort per course.

CourseUserGroupPartitionGroup

The model that maps together the linking between a single CourseUserGroup and a single UserPartition/group_id combination. In other words, this model stores the linking of a cohort to a single content group.

CourseCohort

A model that stores information about a specific CourseUserGroup. All it currently stores is the assignment type, which is either "random" or "manual".

CohortPartitionScheme

This is not a model, but instead the scheme that uses CourseUserGroup/CohortMembership and CourseUserGroupPartitionGroup to map learners into content groups. It implements a single method, get_group_for_user, which does roughly the following:

  1. Checks masquerading to see if the learner is really a staff member masquerading as a member of a content group. If so, returns that value.
  2. Gets the cohort assignment for the user/course key combination (CohortMembership).
  3. Gets the UserPartition/group_id combination associated with that cohort (CourseUserGroupPartitionGroup).
  4. Returns the group associated with the UserPartition/group_id combination.

Automatic Cohorting of Verified Track Learners

The code for this lives in lms/djangoapps/verified_track_content. This includes the admin configuration model, VerifiedTrackCohortedCourse, and the celery task that moves learners into the correct cohort upon enrollment changes. The celery task is kicked off from a post_save signal from the CourseEnrollment model (which is defined in common/djangoapps/student/models.py).

Links

Current Documentation and Best Practices

Proposed Features

  1. Automatic track-based cohorting – Project Page /wiki/spaces/EDUCATOR/pages/120881208
  2. Content Differentiation for Enterprise Learners

Older Architecture Diagrams and Proposals

Older Project Pages

Related content

Asymmetric JWT (JWS)
Asymmetric JWT (JWS)
Read with this
Notes on Content Groups, User Partitions, and Teams
Notes on Content Groups, User Partitions, and Teams
More like this
Blockstore Design
Read with this
Content Libraries v1 Behavior / Storage Implementation
Content Libraries v1 Behavior / Storage Implementation
More like this
Content Libraries Architecture
Content Libraries Architecture
More like this
Discussion Modules and Categories
Discussion Modules and Categories
More like this