From 912f1a4f5495c9d598dbf5b9e781f9c777b21a5d Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Wed, 25 Jun 2025 14:18:26 +0200 Subject: [PATCH 01/10] docs: add arch decision record for the user groups model foundations Add a new architecture decision record (ADR) that documents the foundational decisions for the unified user grouping model. It covers: * How the unified model will be structured * How it can be extended * How membership is resolved This and the upcoming ADRs result from team conversations during a Spike phase, which produced several architectural documents. You can find them here: https://openedx.atlassian.net/wiki/spaces/OEPM/pages/4901404678/User+Groups --- .../0002-user-groups-model-foundations.rst | 327 ++++++++++++++++++ 1 file changed, 327 insertions(+) create mode 100644 docs/decisions/0002-user-groups-model-foundations.rst diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst new file mode 100644 index 0000000..a3eed42 --- /dev/null +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -0,0 +1,327 @@ +0002: User Groups Model Foundations +################################### + +Status +****** +**Draft** + +Context +******* + +Open edX currently relies on multiple user grouping mechanisms (cohorts, teams, course groups), each with distinct limitations and challenges. These models are difficult to extend, duplicate logic across the platform, and are not designed for reuse in contexts like messaging, segmentation, or analytics. + +There is increasing demand for more flexible grouping capabilities, including dynamic membership based on user behavior or attributes. At the same time, existing grouping systems offer rigid schemas and limited extensibility, making it hard to adapt to evolving needs. + +The user groups project aims to address these challenges by creating a unified, extensible user groups model that can be used across the Open edX platform. This new model will provide a foundation for managing user groups in a more flexible and powerful way, allowing for better segmentation, messaging, and analytics capabilities. + +Some of the key goals of the user groups project include: + +* Support dynamic grouping strategies by allowing user groups to be defined based on shared attributes, behaviors, or platform activity, not just manual or random assignment. +* Unify user grouping mechanisms by replacing fragmented models (cohorts, teams, course groups) with a single, consistent data structure and interface. +* Decouple user groups from specific features to support reuse across diverse contexts, such as content access, discussions, messaging, and analytics. +* Standardize group modeling and storage to reduce duplication, improve clarity, and simplify development and operational workflows. +* Enable extensibility by supporting configurable, pluggable criteria that allow new grouping behaviors without modifying core platform code. + +This ADR documents the key architectural decisions for the unified user grouping system's foundational data model and conceptual framework. + +**Integration Context**: This model will be implemented as a Django app plugin that can be installed into existing Open edX instances, as described in :doc:`ADR 0001: Purpose of This Repo <../0001-purpose-of-this-repo>`. The evaluation engine and runtime architecture that operate on these foundational models are detailed in :doc:`ADR 0003: Runtime Architecture <../0003-runtime-architecture>`. + +Key Concepts +============ + +The user groups project will introduce several key concepts that will form the foundation of the new user groups model: + +* **User Group**: A named set of users that can be used for various purposes, such as access control, messaging, collaboration, or analytics. User groups are defined by their membership criteria and can be either manually assigned or dynamically computed based on user attributes or behaviors. + +* **Criterion Type**: A pluggable template that defines how a specific type of rule behaves, including its configuration schema, supported operators, and evaluation logic. Examples include "last_login", "course_progress", or "manual_assignment". Criterion types are reusable across multiple groups. + +* **Criterion**: An instance of a criterion type configured for a specific user group. Each criterion record belongs to one group and stores the criterion type identifier (which references a Python class template), operator, and configuration values. For example, a criterion might use the "last_login" type with a ">" operator and config of "30 days". + +* **Scope**: The context in which a user group can be applied. Scopes define whether a group is specific to a course, an organization, or the entire Open edX platform instance. This allows for flexible segmentation and management of user groups across different levels of the platform. + +* **Group Type**: The method by which a user group is populated. There are two primary modes: + + * **Manual**: Users are explicitly assigned to the group through administrative interfaces. + * **Dynamic**: Membership is computed based on one or more criterion rules, allowing for automatic updates as user attributes or behaviors change. + +NOTE: The group type only determines whether the group will be automatically updated, and it's mainly a nomenclature determined by the criteria chosen. + +Decision +******** + +I. Foundation Models +==================== + +Introduce a unified UserGroup model with explicit scope constraints +------------------------------------------------------------------- + +To create a unified user groups model, we will: + +* Introduce a single ``UserGroup`` model to represent user segmentation across the Open edX platform, replacing legacy group models like cohorts, teams, and course groups. +* Include an explicit scope field that defines whether the group applies at the course, organization, or platform level to ensure groups are only used where intended. +* Use a unique constraint (name, scope) to avoid duplicate group names within the same scope. +* Use a generic foreign key for the scope model to support any kind of object but initially limit to existing entities: course, organization, instance. +* Store essential metadata directly in the model, including name, description, enabled status, and timestamps, to support management and traceability. + +Separate group membership storage and allow multiple group participation +------------------------------------------------------------------------ + +To decouple group definition from membership state and support flexible segmentation, we will: + +* Define a join table (``UserGroupMembership``) to persist the list of users assigned to each group. +* Use this table for both manual and dynamic groups to standardize downstream access. +* Allow users to belong to multiple groups, even within the same scope, unless constrained by other mechanisms referencing the group. +* Store membership metadata such as timestamps for when a user was added or removed, to support auditing and traceability. +* Ensure services can reference group membership directly without requiring on-demand evaluation. + +Store operational metadata without full audit history +----------------------------------------------------- + +To support minimal traceability without overloading the schema, we will: + +* Include fields like created, updated, enabled, last_refresh, and member_count directly in the ``UserGroup`` model. +* Avoid embedding full audit trails (e.g., historical criteria changes or user diffs) in the model. +* Rely on logs, analytics systems, or external audit services for long-term tracking and monitoring. + +Define group types based on their configured criteria +----------------------------------------------------- + +To distinguish between different group population methods while maintaining a unified model, we will: + +* Define group types (Manual vs Dynamic) based on the criterion types configured for each group rather than as a separate field. +* Treat group type as a derived characteristic that determines whether the group will be automatically updated. +* Allow the same ``UserGroup`` model to support both manual assignment (through special manual criterion types) and dynamic computation (through behavioral criterion types). +* Enable groups to evolve from manual to dynamic by changing their configured criteria without requiring model changes. +* Use group type primarily as nomenclature to help administrators understand how a group is populated. + +II. Extensible Criterion Framework +=================================== + +Adopt registry-based criterion types with runtime resolution +------------------------------------------------------------ + +To define how dynamic group membership rules are structured and evaluated, we will: + +* Represent each criterion type using a string identifier that maps to a Python class responsible for evaluation and validation logic. +* Load criterion type classes at runtime through a registry, avoiding schema-level coupling and enabling dynamic binding of behavior. +* Encapsulate both the evaluation logic and schema validation (allowed operators, value shape) in the criterion type class. +* Select this pattern over a model-subtype approach to eliminate the need for migrations, simplify extension, and support plugin-based development workflows. + +Define generic criterion storage with extensible validation +----------------------------------------------------------- + +To support flexible, extensible rule definitions without schema changes, we will: + +* Store each criterion as a single record with three fields: + + * ``type``: identifies the criterion type class (e.g., "last_login") + * ``operator``: the comparison logic (e.g., >, in, !=, exists) + * ``config``: a JSON-encoded configuration object (e.g., 30, ["es", "fr"]) + +* Use a single shared ``Criterion`` table to store all criterion records, with each record belonging to a specific group through a foreign key relationship. +* Enable consistent storage of all rule types regardless of data source, scope, or logic while maintaining group-specific criterion instances. +* Delegate validation responsibility to the criterion type class rather than enforcing structure at the database level. +* Store configuration as unstructured JSON to support heterogeneous criterion types while maintaining schema flexibility. + +Define criterion types as reusable templates across groups +---------------------------------------------------------- + +To enable reuse of criterion type definitions across groups while maintaining isolation, we will: + +* Use criterion types as templates that define how a criterion behaves: name, configuration model, supported operators, evaluator, and validations. +* Enable the reuse of criterion type definitions across multiple groups, with isolation achieved by storing separate criterion records for each group in the shared ``Criterion`` table. +* Allow different groups to configure the same criterion type independently (e.g., "last_login" with different day thresholds). +* Store criterion records as group-specific entries; there is no global repository of shared criterion instances between groups. +* Enable group owners or plugins to evolve their criterion configurations independently without introducing shared state or coupling. + +Evolve from simple criteria to logic trees for complex boolean expressions +-------------------------------------------------------------------------- + +To support the evolution from simple AND-only combinations to complex boolean logic, we will: + +* **Initial Implementation**: Start with individual criterion records that are combined using only AND logic (all criteria must be satisfied). This provides a foundation for basic dynamic grouping where users must meet all specified conditions. + +* **Advanced Implementation**: Introduce logic trees to express complex conditions that require OR logic, such as last_login AND (course_progress OR course_grade). This advanced structure is necessary because the basic implementation cannot represent OR relationships between criteria:: + + { + "AND": [ + { "type": "last_login", "operator": "...", "config": ... }, + { + "OR": [ + { "type": "course_progress", "operator": "...", "config": ... }, + { "type": "course_grade", "operator": "...", "config": ... } + ] + } + ] + } + +* Use criterion type templates (Python classes) for reusing definitions across groups without persisting criterion type instances. +* Allow complex boolean expressions while maintaining the same level of validation through the criterion type classes. +* Ensure the logic tree can be evaluated in a predictable order, respecting operator precedence and grouping. + +Restrict criterion types by scope and enforce compatibility +----------------------------------------------------------- + +To prevent invalid configurations and ensure rules apply only where meaningful, we will: + +* Define criterion types with a declared scope (e.g., course, organization, instance). +* Identify criterion types by the pair so that "last_login" for a course may differ from "last_login" at the organization level. +* Allow only criterion types matching the group's scope to be used when configuring a group. +* Enforce this constraint at the model level during validation and at runtime during group creation or update. + +Support exclusion logic through operators rather than separate mechanisms +------------------------------------------------------------------------- + +To simplify the model and unify rule semantics, we will: + +* Express exclusion (e.g., "users not in country X") using standard operators like !=, not in, and not exists. +* Allow all inclusion and exclusion logic to be handled using the same criterion structure, reducing complexity and duplication. +* Avoid defining separate anti-criterion concepts to maintain consistency across the framework. + +Version criterion types to ensure behavioral consistency +-------------------------------------------------------- + +To ensure expected behavior is maintained throughout releases and system evolution, we will: + +* Version criterion types by including version numbers in the type identifier (e.g., "ProgressCriterionV2", "LastLoginV1"). +* Store the version number alongside the type name in the database to maintain explicit tracking of which version is being used. +* Allow gradual migration of existing configurations to new versions, ensuring users can continue using the system without disruption. +* Enable backward compatibility by supporting multiple versions of the same criterion type simultaneously. +* Provide clear migration paths when criterion type behavior changes significantly between versions. + +Offload criterion configuration validation to criterion type classes +-------------------------------------------------------------------- + +To keep the model schema minimal and extensible while ensuring configuration correctness, we will: + +* Not enforce structure or constraints on the config field at the database level, maintaining schema flexibility. +* Store configuration as unstructured JSON to support heterogeneous criterion types in a single table. +* Delegate validation responsibility to the criterion type class, which defines: + + * Its accepted operators (e.g., >, !=, in) + * Its expected configuration schema (e.g., integer days, list of strings) + * Logic to validate input during group creation and updates + +* Define the model as schema-light by design and shift enforcement to the type layer, enabling extension without schema migrations. +* Execute validation when groups are created or updated, ensuring criterion configurations are validated before being saved to the database. + +III. Group Membership Evaluation +================================= + +Evaluate dynamic groups through criterion-based computation +----------------------------------------------------------- + +To support computed membership while preserving consistency across group types, we will: + +* Treat dynamic group membership as derived data, computed by evaluating the group's criteria against the available user data. +* Store the evaluation result in the ``UserGroupMembership`` table, replacing any previous members for that group. +* Evaluate dynamic groups periodically or on demand to keep their membership current with changing user attributes and behaviors. +* Use the same membership storage model for both manual and dynamic groups to ensure consistent downstream access patterns. + +Provide unified evaluation interface for all group types +-------------------------------------------------------- + +To simplify the evaluation engine and maintain consistency, we will: + +* Design all group types to use the same evaluation interface, whether they are manual or dynamic. +* Implement manual groups through a special criterion type that handles explicit user assignment. +* Enable consistent access patterns across all group types by using the same ``UserGroupMembership`` table and evaluation workflow. +* Ensure the evaluation engine can process any group type without requiring special handling based on the group's population method. + +Dependencies +************ + +The decisions in this ADR have the following dependencies: + +**Foundation Dependencies:** +* The **UserGroup model with scope constraints** forms the base that all other decisions build upon. +* **Group types based on configured criteria** depends on the criterion framework decisions in Section II. +* **Separate membership storage** is required by the evaluation decisions in Section III. + +**Criterion Framework Dependencies:** +* **Generic criterion storage** must be established before **reusable templates** can be implemented. +* **Logic tree evolution** depends on **generic criterion storage** and **reusable templates**. +* **Scope restrictions** and **versioning** can be implemented independently once the basic criterion framework exists. +* **Validation offloading** depends on **registry-based criterion types** and **reusable templates**. + +**Evaluation Dependencies:** +* Both evaluation decisions depend on the complete foundation model and criterion framework from Sections I and II. +* **Unified evaluation interface** builds on **criterion-based computation** to provide consistency. + +**Cross-ADR Dependencies:** +* The runtime architecture defined in :doc:`ADR 0003: Runtime Architecture <../0003-runtime-architecture>` depends on all foundational decisions in this ADR, particularly the criterion framework and evaluation interface. +* The plugin discovery and evaluation engine components in ADR 0003 implement the abstract concepts defined in this ADR's criterion framework. + +Consequences +************ + +**Model Unification and Platform Impact:** + +1. A unified ``UserGroup`` model will replace legacy grouping mechanisms (cohorts, teams, course groups), providing consistent management and application of user groups across the Open edX platform. + +2. The separation of group membership from group definition will enable more flexible and dynamic user grouping strategies, reducing duplication of logic across the platform. + +3. Making the ``UserGroup`` agnostic to specific features will allow it to be reused across different contexts, such as content gating, discussions, messaging, and analytics without requiring custom implementations for each use case. + +**Extensibility and Development Workflow:** + +4. The extensible criterion framework will allow new grouping behaviors to be added without modifying core platform code, enabling rapid iteration and plugin-based development. + +5. The registry-based approach will eliminate migration overhead for new criterion types while maintaining type safety through runtime validation. + +6. The versioning system for criterion types will allow for changes to be made without breaking existing configurations, ensuring backward compatibility as the system evolves. + +**Operational and Administrative Benefits:** + +7. The scope-based restriction of criterion types will prevent invalid configurations and ensure rules apply only where meaningful, improving clarity and usability. + +8. The validation logic within each criterion type will ensure that configurations are correct and consistent, reducing the risk of errors and improving reliability. + +9. The logic tree structure will enable complex boolean expressions while maintaining predictable evaluation order and hierarchy. + +**System Architecture and Performance:** + +10. The unified evaluation interface will simplify the evaluation engine implementation by providing consistent access patterns for both manual and dynamic groups. + +11. The composable rule system will allow for complex group definitions using combinations of different criterion types, enabling sophisticated user segmentation strategies. + +12. The overall design will create a foundation for advanced user segmentation features, such as messaging, analytics, and reporting, by providing a consistent and extensible model. + +Rejected Alternatives +********************** + +Model-based Criterion Type Implementation +========================================= + +Another alternative for defining criterion types in the user groups project was a model-based approach, where each criterion type would be represented as its own Django model. This approach, while providing a clear separation of concerns and allowing for complex criterion type definitions, had several drawbacks that led to its rejection. + +In this approach, each criterion type is represented as its own Django model, inheriting from a shared base class. These models define the fields required for their evaluation (such as a number of days, grade, etc) and include a method to return matching users. Evaluation is done by calling each model's method during group processing. + +This structure allows clear separation between criterion types and their usage, and relies on Django's ORM relationships to manage them. New types are introduced by creating new models and registering them so the system can discover and evaluate them when needed. + +This design is inspired by model extension patterns introduced in `openedx-learning for content extensibility `_. + +**Pros:** + +* Clear separation of concerns between different criterion types. +* Each type can have its own fields and validation logic out-of-the-box, making it easy to extend. +* Supports advanced use cases for complex criterion types that require multiple fields or relationships. +* Allows for easy discovery and evaluation of criterion types through Django's model registry. +* The responsibility of each criterion type is handled by the models, while each group criterion manages the usage of the model (less coupling). + +**Cons:** + +* Introduces additional complexity with multiple models and relationships, which can make the system harder to maintain. +* Each new criterion type requires a model and a migration. Even small changes involve versioning and review, which slows down iteration and increases maintenance effort. +* Fetching and evaluating criterion types across multiple models requires a more complex implementation that may be more difficult to implement and debug. +* May lead to performance issues if many criterion types are defined, as each type requires its own database table. +* The model-based approach may not be as flexible as a registry-based system, where new types can be added without requiring migrations or changes to the database schema. + +Because of these drawbacks, we decided to use a registry-based approach for defining criterion types, which allows for greater flexibility and extensibility without the overhead of managing multiple models and migrations. + +For more details on the model-based approach, see the `Model-based Criterion Type Implementation `_ section in the User Groups confluence space. + +References +********** + +Confluence space for the User Groups project: `User Groups confluence space `_. From 25d9ac565845bf3c0a3c22cf42bfc5c7fef69d0f Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Fri, 27 Jun 2025 11:40:31 +0200 Subject: [PATCH 02/10] fix: reference ADR 0001 and dummy reference next ADRs --- docs/decisions/0002-user-groups-model-foundations.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index a3eed42..9276b38 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -24,7 +24,9 @@ Some of the key goals of the user groups project include: This ADR documents the key architectural decisions for the unified user grouping system's foundational data model and conceptual framework. -**Integration Context**: This model will be implemented as a Django app plugin that can be installed into existing Open edX instances, as described in :doc:`ADR 0001: Purpose of This Repo <../0001-purpose-of-this-repo>`. The evaluation engine and runtime architecture that operate on these foundational models are detailed in :doc:`ADR 0003: Runtime Architecture <../0003-runtime-architecture>`. +**Integration Context**: This model will be implemented as a Django app plugin that can be installed into existing Open edX instances, as described in :doc:`0001-purpose-of-this-repo`. The evaluation engine and runtime architecture that operate on these foundational models are detailed in ``ADR 0003: Runtime Architecture``. This ADR is independent of the runtime architecture and can be implemented in isolation. + +The next ADRs will build on this foundational model to implement the entire user groups system that will function as a whole. Key Concepts ============ @@ -113,7 +115,7 @@ Define generic criterion storage with extensible validation To support flexible, extensible rule definitions without schema changes, we will: * Store each criterion as a single record with three fields: - + * ``type``: identifies the criterion type class (e.g., "last_login") * ``operator``: the comparison logic (e.g., >, in, !=, exists) * ``config``: a JSON-encoded configuration object (e.g., 30, ["es", "fr"]) @@ -249,7 +251,7 @@ The decisions in this ADR have the following dependencies: * **Unified evaluation interface** builds on **criterion-based computation** to provide consistency. **Cross-ADR Dependencies:** -* The runtime architecture defined in :doc:`ADR 0003: Runtime Architecture <../0003-runtime-architecture>` depends on all foundational decisions in this ADR, particularly the criterion framework and evaluation interface. +* The runtime architecture defined in ``ADR 0003: Runtime Architecture`` depends on all foundational decisions in this ADR, particularly the criterion framework and evaluation interface. * The plugin discovery and evaluation engine components in ADR 0003 implement the abstract concepts defined in this ADR's criterion framework. Consequences From 7057a9e4edd79bb772dfb7dcad4df5c09dee59c0 Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Fri, 27 Jun 2025 14:42:14 +0200 Subject: [PATCH 03/10] docs: drop categories for consequences --- docs/decisions/0002-user-groups-model-foundations.rst | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index 9276b38..184955a 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -257,32 +257,24 @@ The decisions in this ADR have the following dependencies: Consequences ************ -**Model Unification and Platform Impact:** - 1. A unified ``UserGroup`` model will replace legacy grouping mechanisms (cohorts, teams, course groups), providing consistent management and application of user groups across the Open edX platform. 2. The separation of group membership from group definition will enable more flexible and dynamic user grouping strategies, reducing duplication of logic across the platform. 3. Making the ``UserGroup`` agnostic to specific features will allow it to be reused across different contexts, such as content gating, discussions, messaging, and analytics without requiring custom implementations for each use case. -**Extensibility and Development Workflow:** - 4. The extensible criterion framework will allow new grouping behaviors to be added without modifying core platform code, enabling rapid iteration and plugin-based development. 5. The registry-based approach will eliminate migration overhead for new criterion types while maintaining type safety through runtime validation. 6. The versioning system for criterion types will allow for changes to be made without breaking existing configurations, ensuring backward compatibility as the system evolves. -**Operational and Administrative Benefits:** - 7. The scope-based restriction of criterion types will prevent invalid configurations and ensure rules apply only where meaningful, improving clarity and usability. 8. The validation logic within each criterion type will ensure that configurations are correct and consistent, reducing the risk of errors and improving reliability. 9. The logic tree structure will enable complex boolean expressions while maintaining predictable evaluation order and hierarchy. -**System Architecture and Performance:** - 10. The unified evaluation interface will simplify the evaluation engine implementation by providing consistent access patterns for both manual and dynamic groups. 11. The composable rule system will allow for complex group definitions using combinations of different criterion types, enabling sophisticated user segmentation strategies. From d22dbad43125e6248fd284c9c5095f6a41f8b6e2 Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Fri, 27 Jun 2025 17:50:03 +0200 Subject: [PATCH 04/10] docs: merge group type into its own decision --- .../0002-user-groups-model-foundations.rst | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index 184955a..ce24bd5 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -22,7 +22,7 @@ Some of the key goals of the user groups project include: * Standardize group modeling and storage to reduce duplication, improve clarity, and simplify development and operational workflows. * Enable extensibility by supporting configurable, pluggable criteria that allow new grouping behaviors without modifying core platform code. -This ADR documents the key architectural decisions for the unified user grouping system's foundational data model and conceptual framework. +This ADR documents the key architectural decisions for the unified user groups system's foundational data model and conceptual framework. **Integration Context**: This model will be implemented as a Django app plugin that can be installed into existing Open edX instances, as described in :doc:`0001-purpose-of-this-repo`. The evaluation engine and runtime architecture that operate on these foundational models are detailed in ``ADR 0003: Runtime Architecture``. This ADR is independent of the runtime architecture and can be implemented in isolation. @@ -54,8 +54,8 @@ Decision I. Foundation Models ==================== -Introduce a unified UserGroup model with explicit scope constraints -------------------------------------------------------------------- +Introduce a unified ``UserGroup`` model with explicit scope constraints +----------------------------------------------------------------------- To create a unified user groups model, we will: @@ -90,10 +90,14 @@ Define group types based on their configured criteria To distinguish between different group population methods while maintaining a unified model, we will: +* Define group types as the method by which a user group is populated, with two primary modes: + + * **Manual**: Users are explicitly assigned to the group through administrative interfaces. + * **Dynamic**: Membership is computed based on one or more criterion rules, allowing for automatic updates as user attributes or behaviors change. + * Define group types (Manual vs Dynamic) based on the criterion types configured for each group rather than as a separate field. * Treat group type as a derived characteristic that determines whether the group will be automatically updated. -* Allow the same ``UserGroup`` model to support both manual assignment (through special manual criterion types) and dynamic computation (through behavioral criterion types). -* Enable groups to evolve from manual to dynamic by changing their configured criteria without requiring model changes. +* Allow groups to evolve from manual to dynamic by changing their configured criteria without requiring model changes. * Use group type primarily as nomenclature to help administrators understand how a group is populated. II. Extensible Criterion Framework @@ -104,10 +108,10 @@ Adopt registry-based criterion types with runtime resolution To define how dynamic group membership rules are structured and evaluated, we will: -* Represent each criterion type using a string identifier that maps to a Python class responsible for evaluation and validation logic. +* Represent each criterion type using a string identifier that maps to a Python class responsible for evaluation and validation logic. For example, "last_login" might map to a class that evaluates users based on their last login date. * Load criterion type classes at runtime through a registry, avoiding schema-level coupling and enabling dynamic binding of behavior. * Encapsulate both the evaluation logic and schema validation (allowed operators, value shape) in the criterion type class. -* Select this pattern over a model-subtype approach to eliminate the need for migrations, simplify extension, and support plugin-based development workflows. +* Select this pattern over a model-subtype approach to eliminate the need for migrations, simplify extension, and support plugin-based development workflows. See rejected alternatives for more details. Define generic criterion storage with extensible validation ----------------------------------------------------------- @@ -120,17 +124,23 @@ To support flexible, extensible rule definitions without schema changes, we will * ``operator``: the comparison logic (e.g., >, in, !=, exists) * ``config``: a JSON-encoded configuration object (e.g., 30, ["es", "fr"]) -* Use a single shared ``Criterion`` table to store all criterion records, with each record belonging to a specific group through a foreign key relationship. -* Enable consistent storage of all rule types regardless of data source, scope, or logic while maintaining group-specific criterion instances. +* Use a single shared ``Criterion`` table to store all criterion records, with each record belonging to a specific group. +* Enable consistent storage of all criterion types regardless of data source, scope, or logic while maintaining group-specific criterion instances. * Delegate validation responsibility to the criterion type class rather than enforcing structure at the database level. -* Store configuration as unstructured JSON to support heterogeneous criterion types while maintaining schema flexibility. +* Store configuration as unstructured JSON to support heterogeneous criterion types while maintaining schema flexibility. The logic for validation and evaluation is defined in the criterion type class. Define criterion types as reusable templates across groups ---------------------------------------------------------- To enable reuse of criterion type definitions across groups while maintaining isolation, we will: -* Use criterion types as templates that define how a criterion behaves: name, configuration model, supported operators, evaluator, and validations. +* Use criterion types as templates that define how a criterion behaves: name, configuration model, supported operators, evaluator, and validations. For example: + + * ``name``: the name of the criterion type (e.g., "last_login"). This is the ID of the criterion type, and should be unique across the system. + * ``class ConfigModel(BaseModel)``: a pydantic model that defines the configuration schema for the criterion type. This is used to validate the configuration of the criterion when it is created or updated. + * ``supported_operators``: the list of operators supported by the criterion type. This is used to validate the operator of the criterion when it is created or updated. + * ``def evaluate(self) -> QuerySet``: the Python class method responsible for evaluating the criterion. This is used to evaluate the criterion. + * Enable the reuse of criterion type definitions across multiple groups, with isolation achieved by storing separate criterion records for each group in the shared ``Criterion`` table. * Allow different groups to configure the same criterion type independently (e.g., "last_login" with different day thresholds). * Store criterion records as group-specific entries; there is no global repository of shared criterion instances between groups. @@ -157,9 +167,10 @@ To support the evolution from simple AND-only combinations to complex boolean lo ] } -* Use criterion type templates (Python classes) for reusing definitions across groups without persisting criterion type instances. +* Use criterion type templates (Python classes) for reusing definitions across groups without persisting criterion type instances. By evolving to a logic tree, we can support complex boolean expressions while maintaining the same level of validation through the criterion type classes without having an additional model to manage. * Allow complex boolean expressions while maintaining the same level of validation through the criterion type classes. * Ensure the logic tree can be evaluated in a predictable order, respecting operator precedence and grouping. +* The logic tree is a tree of criterion types, where each criterion type is a node in the tree. The tree is evaluated by traversing the tree in a depth-first manner, respecting operator precedence and grouping. Restrict criterion types by scope and enforce compatibility ----------------------------------------------------------- @@ -169,7 +180,7 @@ To prevent invalid configurations and ensure rules apply only where meaningful, * Define criterion types with a declared scope (e.g., course, organization, instance). * Identify criterion types by the pair so that "last_login" for a course may differ from "last_login" at the organization level. * Allow only criterion types matching the group's scope to be used when configuring a group. -* Enforce this constraint at the model level during validation and at runtime during group creation or update. +* Enforce this constraint at the criterion type class level during group creation or update. Support exclusion logic through operators rather than separate mechanisms ------------------------------------------------------------------------- From ad2484de292b7a02a4c4f72afd2442dab52c58ba Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Fri, 27 Jun 2025 18:48:47 +0200 Subject: [PATCH 05/10] docs: add intro for the data model to reference to initial ERD --- docs/_images/user-groups-data-model.png | Bin 0 -> 60361 bytes .../0002-user-groups-model-foundations.rst | 119 ++++++++---------- 2 files changed, 52 insertions(+), 67 deletions(-) create mode 100644 docs/_images/user-groups-data-model.png diff --git a/docs/_images/user-groups-data-model.png b/docs/_images/user-groups-data-model.png new file mode 100644 index 0000000000000000000000000000000000000000..ddf3fc5f07352e734a50b0c05eea1028ae265d41 GIT binary patch literal 60361 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 literal 0 HcmV?d00001 diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index ce24bd5..1d72fdf 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -28,25 +28,54 @@ This ADR documents the key architectural decisions for the unified user groups s The next ADRs will build on this foundational model to implement the entire user groups system that will function as a whole. -Key Concepts -============ +Data Model Architecture Overview +================================= -The user groups project will introduce several key concepts that will form the foundation of the new user groups model: +This ADR establishes the foundational data structures that enable flexible, extensible user grouping in Open edX. The model design supports both simple manual groups and complex dynamic segmentation through a unified approach. -* **User Group**: A named set of users that can be used for various purposes, such as access control, messaging, collaboration, or analytics. User groups are defined by their membership criteria and can be either manually assigned or dynamically computed based on user attributes or behaviors. +**Core Model Relationships:** -* **Criterion Type**: A pluggable template that defines how a specific type of rule behaves, including its configuration schema, supported operators, and evaluation logic. Examples include "last_login", "course_progress", or "manual_assignment". Criterion types are reusable across multiple groups. +.. figure:: ../_images/user-groups-data-model.png + :alt: User Groups Data Model Entity Relationship Diagram + :align: center + :width: 100% -* **Criterion**: An instance of a criterion type configured for a specific user group. Each criterion record belongs to one group and stores the criterion type identifier (which references a Python class template), operator, and configuration values. For example, a criterion might use the "last_login" type with a ">" operator and config of "30 days". + Entity relationship diagram showing the core data model with UserGroup, Scope, Criterion, CriterionType, and Users entities. Note that CriterionType is used as a definition template and may or may not be persisted depending on the runtime implementation. -* **Scope**: The context in which a user group can be applied. Scopes define whether a group is specific to a course, an organization, or the entire Open edX platform instance. This allows for flexible segmentation and management of user groups across different levels of the platform. +**Key Design Principles:** -* **Group Type**: The method by which a user group is populated. There are two primary modes: +1. **Unified Model**: Single UserGroup entity replaces fragmented legacy systems (cohorts, teams, course groups) - * **Manual**: Users are explicitly assigned to the group through administrative interfaces. - * **Dynamic**: Membership is computed based on one or more criterion rules, allowing for automatic updates as user attributes or behaviors change. +2. **Scope Constraints**: Groups are explicitly bounded to prevent invalid cross-context usage + +3. **Extensible Criteria**: Rules stored as generic JSON configurations that map to pluggable Python classes + +4. **Materialized Membership**: User-group relationships are persisted for performance and consistency + +5. **Derived Group Types**: Manual vs Dynamic classification emerges from configured criteria rather than explicit fields + +**Data Flow Example:** + +.. code-block:: text -NOTE: The group type only determines whether the group will be automatically updated, and it's mainly a nomenclature determined by the criteria chosen. + Group Definition: + ├── UserGroup: "At Risk Students" + ├── Scope: Course "CS101" + └── Criteria: + ├── Criterion 1: {type: "last_login", operator: ">", config: {"days": 30}} + └── Criterion 2: {type: "course_progress", operator: "<", config: {"percent": 40}} + + Storage Result: + └── UserGroupMembership: [(user1, group), (user3, group), (user5, group)] + +**Extensibility Points:** + +* **New Criterion Types**: Add without schema migrations (JSON config + Python class) +* **Multiple Scopes**: Support any content object through generic foreign keys +* **Complex Logic**: Evolution path from simple AND to boolean expression trees +* **Backward Compatibility**: Versioned criterion types enable safe evolution + +This foundational model provides the storage and structural foundation that the runtime architecture (ADR 0003) will operate upon to deliver dynamic user grouping capabilities. Decision ******** @@ -91,7 +120,7 @@ Define group types based on their configured criteria To distinguish between different group population methods while maintaining a unified model, we will: * Define group types as the method by which a user group is populated, with two primary modes: - + * **Manual**: Users are explicitly assigned to the group through administrative interfaces. * **Dynamic**: Membership is computed based on one or more criterion rules, allowing for automatic updates as user attributes or behaviors change. @@ -103,15 +132,15 @@ To distinguish between different group population methods while maintaining a un II. Extensible Criterion Framework =================================== -Adopt registry-based criterion types with runtime resolution ------------------------------------------------------------- +Store criterion types as string identifiers for runtime resolution +------------------------------------------------------------------ -To define how dynamic group membership rules are structured and evaluated, we will: +To enable extensible criterion definitions without database schema changes, we will: -* Represent each criterion type using a string identifier that maps to a Python class responsible for evaluation and validation logic. For example, "last_login" might map to a class that evaluates users based on their last login date. -* Load criterion type classes at runtime through a registry, avoiding schema-level coupling and enabling dynamic binding of behavior. -* Encapsulate both the evaluation logic and schema validation (allowed operators, value shape) in the criterion type class. -* Select this pattern over a model-subtype approach to eliminate the need for migrations, simplify extension, and support plugin-based development workflows. See rejected alternatives for more details. +* Represent each criterion type using a string identifier (e.g., "last_login", "course_enrollment") that maps to a Python class responsible for evaluation and validation logic. +* Store criterion type identifiers in the database rather than creating separate models for each criterion type, avoiding schema-level coupling and the need for migrations when adding new types. +* Enable criterion types to be defined as pluggable Python classes that can be loaded and resolved at runtime through a registry system (implementation details covered in ADR 0003). +* Select this pattern over a model-subtype approach to maintain schema flexibility and support plugin-based development workflows without requiring database changes. Define generic criterion storage with extensible validation ----------------------------------------------------------- @@ -202,45 +231,6 @@ To ensure expected behavior is maintained throughout releases and system evoluti * Enable backward compatibility by supporting multiple versions of the same criterion type simultaneously. * Provide clear migration paths when criterion type behavior changes significantly between versions. -Offload criterion configuration validation to criterion type classes --------------------------------------------------------------------- - -To keep the model schema minimal and extensible while ensuring configuration correctness, we will: - -* Not enforce structure or constraints on the config field at the database level, maintaining schema flexibility. -* Store configuration as unstructured JSON to support heterogeneous criterion types in a single table. -* Delegate validation responsibility to the criterion type class, which defines: - - * Its accepted operators (e.g., >, !=, in) - * Its expected configuration schema (e.g., integer days, list of strings) - * Logic to validate input during group creation and updates - -* Define the model as schema-light by design and shift enforcement to the type layer, enabling extension without schema migrations. -* Execute validation when groups are created or updated, ensuring criterion configurations are validated before being saved to the database. - -III. Group Membership Evaluation -================================= - -Evaluate dynamic groups through criterion-based computation ------------------------------------------------------------ - -To support computed membership while preserving consistency across group types, we will: - -* Treat dynamic group membership as derived data, computed by evaluating the group's criteria against the available user data. -* Store the evaluation result in the ``UserGroupMembership`` table, replacing any previous members for that group. -* Evaluate dynamic groups periodically or on demand to keep their membership current with changing user attributes and behaviors. -* Use the same membership storage model for both manual and dynamic groups to ensure consistent downstream access patterns. - -Provide unified evaluation interface for all group types --------------------------------------------------------- - -To simplify the evaluation engine and maintain consistency, we will: - -* Design all group types to use the same evaluation interface, whether they are manual or dynamic. -* Implement manual groups through a special criterion type that handles explicit user assignment. -* Enable consistent access patterns across all group types by using the same ``UserGroupMembership`` table and evaluation workflow. -* Ensure the evaluation engine can process any group type without requiring special handling based on the group's population method. - Dependencies ************ @@ -249,21 +239,16 @@ The decisions in this ADR have the following dependencies: **Foundation Dependencies:** * The **UserGroup model with scope constraints** forms the base that all other decisions build upon. * **Group types based on configured criteria** depends on the criterion framework decisions in Section II. -* **Separate membership storage** is required by the evaluation decisions in Section III. +* **Separate membership storage** provides the foundation for runtime evaluation (handled in ADR 0003). **Criterion Framework Dependencies:** * **Generic criterion storage** must be established before **reusable templates** can be implemented. -* **Logic tree evolution** depends on **generic criterion storage** and **reusable templates**. * **Scope restrictions** and **versioning** can be implemented independently once the basic criterion framework exists. -* **Validation offloading** depends on **registry-based criterion types** and **reusable templates**. - -**Evaluation Dependencies:** -* Both evaluation decisions depend on the complete foundation model and criterion framework from Sections I and II. -* **Unified evaluation interface** builds on **criterion-based computation** to provide consistency. +* **Template definitions** provide the foundation for runtime registry and validation (handled in ADR 0003). **Cross-ADR Dependencies:** -* The runtime architecture defined in ``ADR 0003: Runtime Architecture`` depends on all foundational decisions in this ADR, particularly the criterion framework and evaluation interface. -* The plugin discovery and evaluation engine components in ADR 0003 implement the abstract concepts defined in this ADR's criterion framework. +* The runtime architecture defined in ``ADR 0003: Runtime Architecture`` depends on all foundational decisions in this ADR, particularly the unified model and criterion storage framework. +* The evaluation engine, registry system, and validation logic in ADR 0003 operate on the data structures defined in this ADR. Consequences ************ From 4d7d451187885eb471c9d9638736e53367af1271 Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Thu, 24 Jul 2025 13:43:09 +0200 Subject: [PATCH 06/10] docs: add description field use for criteria migration documentation --- docs/decisions/0002-user-groups-model-foundations.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index 1d72fdf..0f59ae9 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -230,6 +230,7 @@ To ensure expected behavior is maintained throughout releases and system evoluti * Allow gradual migration of existing configurations to new versions, ensuring users can continue using the system without disruption. * Enable backward compatibility by supporting multiple versions of the same criterion type simultaneously. * Provide clear migration paths when criterion type behavior changes significantly between versions. +* Use the description field to explain the purpose and behavior of each version to the end user, including optional upgrade guidance when newer versions are available. Dependencies ************ From 9d42dd3203ff58e820b9de9df901ca0b1fac46fa Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Thu, 24 Jul 2025 14:33:36 +0200 Subject: [PATCH 07/10] fix: replace descripcion with description in diagram --- docs/_images/user-groups-data-model.png | Bin 60361 -> 60345 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_images/user-groups-data-model.png b/docs/_images/user-groups-data-model.png index ddf3fc5f07352e734a50b0c05eea1028ae265d41..77e19849ed0a0f87988b18bf2cdd6baf80490051 100644 GIT binary patch delta 34275 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 delta 34297 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 qCJ?uLg66}2-=_OGr>UWHEd7Z2&3^+b5%bId From 530366331c4a9ef20f901305e52aaec0b9f5a64e Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Thu, 24 Jul 2025 14:33:56 +0200 Subject: [PATCH 08/10] docs: add usual deprecation process to deprecating a criteria --- docs/decisions/0002-user-groups-model-foundations.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index 0f59ae9..480fd95 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -229,6 +229,7 @@ To ensure expected behavior is maintained throughout releases and system evoluti * Store the version number alongside the type name in the database to maintain explicit tracking of which version is being used. * Allow gradual migration of existing configurations to new versions, ensuring users can continue using the system without disruption. * Enable backward compatibility by supporting multiple versions of the same criterion type simultaneously. +* The usual `deprecation process `_ will be followed for criterion types that are no longer supported. * Provide clear migration paths when criterion type behavior changes significantly between versions. * Use the description field to explain the purpose and behavior of each version to the end user, including optional upgrade guidance when newer versions are available. From 999cd8850498f60dadb14a4bd34581cf2eb777ae Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Thu, 24 Jul 2025 14:39:20 +0200 Subject: [PATCH 09/10] docs: add more details for criteria configuration --- docs/decisions/0002-user-groups-model-foundations.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/decisions/0002-user-groups-model-foundations.rst b/docs/decisions/0002-user-groups-model-foundations.rst index 480fd95..76d091e 100644 --- a/docs/decisions/0002-user-groups-model-foundations.rst +++ b/docs/decisions/0002-user-groups-model-foundations.rst @@ -149,9 +149,9 @@ To support flexible, extensible rule definitions without schema changes, we will * Store each criterion as a single record with three fields: - * ``type``: identifies the criterion type class (e.g., "last_login") - * ``operator``: the comparison logic (e.g., >, in, !=, exists) - * ``config``: a JSON-encoded configuration object (e.g., 30, ["es", "fr"]) + * ``type``: identifies the criterion type class (e.g., "last_login"). In this case, the criterion type class is "LastLoginCriterion" which is identified by the string "last_login". + * ``operator``: the comparison logic (e.g., >, in, !=, exists). This is the operator that will be used to evaluate the criterion. + * ``config``: a JSON-encoded configuration object (e.g., {"last_login": 30, "language": ["es", "fr"]}). This is the configuration of the criterion which means that the criterion will be evaluated for users who have logged in in the last 30 days and have a language of either "es" or "fr". * Use a single shared ``Criterion`` table to store all criterion records, with each record belonging to a specific group. * Enable consistent storage of all criterion types regardless of data source, scope, or logic while maintaining group-specific criterion instances. From 97c2a63d1e751a5d2b4211c21d9e5902f77f9418 Mon Sep 17 00:00:00 2001 From: Maria Grimaldi Date: Thu, 24 Jul 2025 14:57:38 +0200 Subject: [PATCH 10/10] fix: replace descripcion with description in diagram --- docs/_images/user-groups-data-model.png | Bin 60345 -> 60262 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/_images/user-groups-data-model.png b/docs/_images/user-groups-data-model.png index 77e19849ed0a0f87988b18bf2cdd6baf80490051..e6067a7a77d740881e8eea0def6bd9d8fda6036b 100644 GIT binary patch literal 60262 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 P|EZqSQp#5_yZ(Ow0RNDu literal 60345 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 NNnTYhUB>9a{{ef$b36b5