Skip to content

Commit 0455f0a

Browse files
docs: update ADRs with "Status" notes as of 2026 (#531)
1 parent 4c1a9f1 commit 0455f0a

11 files changed

Lines changed: 138 additions & 11 deletions

docs/decisions/0002-content-flexibility.rst

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
2. Approach to Content Flexibility
22
==================================
33

4+
Status
5+
------
6+
7+
Proposed. The "Sequence" and "Navigation" concepts described below have not been realized.
8+
9+
410
Context
511
-------
612

7-
Open edX courses follow a strict Course > Section > Subsection > Unit > Module hierarchy. There are a number of use cases that do not fit this pattern:
13+
Open edX courses follow a strict Course > Section > Subsection > Unit > XBlock hierarchy. There are a number of use cases that do not fit this pattern:
814

915
* A problem bank shared via LTI, with individual problems for use in other LMS systems.
1016
* Short courses that do not require the "Section" middle layer of hierarchy.
@@ -47,6 +53,11 @@ To realize the benefits of this system would require significant changes to Stud
4753
Changelog
4854
---------
4955

56+
2026-04-02:
57+
58+
* Renamed "Module" to "XBlock" to be consistent with updated platform terminology.
59+
* Added "Status"
60+
5061
2023-02-06:
5162

5263
* Renamed "Item" to "Component" to be consistent with user-facing Studio terminology.

docs/decisions/0005-identifier-conventions.rst

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
5. Identifier Conventions
22
=========================
33

4+
Status
5+
------
6+
7+
Likely superseded by `OEP-68 <https://github.com/openedx/openedx-proposals/pull/773>`_.
8+
49
Context
510
-------
611

@@ -28,7 +33,7 @@ Key
2833
Implementation Notes
2934
--------------------
3035

31-
Helpers to generate these field types are in the ``openedx_learning.lib.fields`` module.
36+
Helpers to generate these field types are in the ``openedx_django_lib.fields`` module.
3237

3338
Rejected Alternatives
3439
---------------------
@@ -37,3 +42,11 @@ A number of names were considered for ``key``, and were rejected for different r
3742

3843
* ``identifier`` is used in some standards like QTI, but it's too easily confused with ``id`` or the general concept of the three types of identity-related fields we have.
3944
* ``slug`` was considered, but ultimately rejected because that implied these fields would be human-readable, and that's not guaranteed. Most XBlock content that comes from MongoDB will be using GUIDs, for instance.
45+
46+
Changelog
47+
---------
48+
49+
2026-04-02:
50+
51+
* Added "Status"
52+
* Updated the path to the ``fields`` module.

docs/decisions/0006-app-label-prefix.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
6. App Label Prefix
22
===================
33

4+
Status
5+
------
6+
7+
Obsolete. See decision 0020. Apps like ``openedx_content`` no longer use the ``oel_`` prefix, and this repo is no longer called "learning core".
8+
49
Context
510
-------
611

@@ -11,3 +16,10 @@ Decision
1116
--------
1217

1318
All apps in this repo will create a default AppConfig that sets the ``label`` to have a prefix of ``oel_`` before the app name. So if the app name is ``publishing``, the ``label`` will be ``oel_publishing``. This means that all generated database tables will similarly be prefixed with ``oel_``.
19+
20+
Changelog
21+
---------
22+
23+
2026-04-02:
24+
25+
* Added "Status"

docs/decisions/0007-tagging-app.rst

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
7. Tagging App structure
22
========================
33

4+
Status
5+
------
6+
7+
Partially accepted, partially obsolete (see note under "ObjectTag").
8+
49
Context
510
-------
611

@@ -17,18 +22,20 @@ Classes which require dependencies on other Open edX projects should be defined
1722
Taxonomy
1823
~~~~~~~~
1924

20-
The ``openedx_tagging`` module defines ``openedx_tagging.core.models.Taxonomy``, whose data and functionality are self-contained to the ``openedx_tagging`` app. However in Studio, we need to be able to limit access to some Taxonomy by organization, using the same "course creator" access which limits course creation for an organization to a defined set of users.
25+
The ``openedx_tagging`` module defines ``openedx_tagging.models.Taxonomy``, whose data and functionality are self-contained to the ``openedx_tagging`` app. However in Studio, we need to be able to limit access to some Taxonomy by organization, using the same "course creator" access which limits course creation for an organization to a defined set of users.
2126

22-
So in edx-platform, we will create the ``openedx.features.content_tagging`` app, to contain the models and logic for linking Organization owners to Taxonomies. Here, we can subclass ``Taxonomy`` as needed, preferably using proxy models. The APIs are responsible for ensuring that any ``Taxonomy`` instances are cast to the appropriate subclass.
27+
So in edx-platform, we will create the ``openedx.core.djangoapps.content_tagging`` app, to contain the models and logic for linking Organization owners to Taxonomies. Here, we can subclass ``Taxonomy`` as needed, preferably using proxy models. The APIs are responsible for ensuring that any ``Taxonomy`` instances are cast to the appropriate subclass.
2328

2429
ObjectTag
2530
~~~~~~~~~
2631

27-
Similarly, the ``openedx_tagging`` module defined ``openedx_tagging.core.models.ObjectTag``, also self-contained to the
32+
Similarly, the ``openedx_tagging`` module defines ``openedx_tagging.models.ObjectTag``, also self-contained to the
2833
``openedx_tagging`` app.
2934

3035
But to tag content in the LMS/Studio, we need to enforce ``object_id`` as a CourseKey or UsageKey type. So to do this, we subclass ``ObjectTag``, and use this class when creating content object tags. Once the ``object_id`` is set, it is not editable, and so this key validation need not happen again.
3136

37+
Note 2026-04-02: In 2024, `we simplified this <https://github.com/openedx/openedx-platform/pull/34146>`_, and ObjectTags are no longer subclassable. Instead, Django ``rules`` permissions hooks allow openedx-platform to extend the ``can_change_object_tag`` permission rule as needed.
38+
3239
Rejected Alternatives
3340
---------------------
3441

@@ -38,3 +45,11 @@ Embed in edx-platform
3845
Embedding the logic in edx-platform would provide the content tagging logic specifically required for the MVP.
3946

4047
However, we plan to extend tagging to other object types (e.g. People) and contexts (e.g. Marketing), and so a generic, standalone library is preferable in the log run.
48+
49+
Changelog
50+
---------
51+
52+
2026-04-02:
53+
54+
* Added "Status"
55+
* Updated references to module paths

docs/decisions/0009-tagging-administrators.rst

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ In the Studio context, a modified version of "course creator" access will be use
2222

2323
Permission #1 requires no external access, so can be enforced by the ``openedx_tagging`` app.
2424

25-
But because permissions #2 + #3 require access to the edx-platform CMS model `CourseCreator`_, this access can only be enforced in Studio, and so will live under ``cms.djangoapps.content_tagging`` along with the ``ContentTag`` class. Tagging MVP must work for libraries v1, v2 and courses created in Studio, and so tying these permissions to Studio is reasonable for the MVP.
25+
But because permissions #2 + #3 require access to the edx-platform CMS model `CourseCreator`_, this access can only be enforced in Studio, and so will live under ``openedx.core.djangoapps.content_tagging`` along with the ``ContentTag`` class. Tagging MVP must work for libraries v1, v2 and courses created in Studio, and so tying these permissions to Studio is reasonable for the MVP.
2626

2727
Per `OEP-9`_, ``openedx_tagging`` will allow applications to use the standard Django API to query permissions, for example: ``user.has_perm('openedx_tagging.edit_taxonomy', taxonomy)``, and the appropriate permissions will be applied in that application's context.
2828

@@ -40,3 +40,10 @@ This is a standard way to grant access in Django apps, but it is not used in Ope
4040
.. _CourseCreator: https://github.com/openedx/edx-platform/blob/4dc35c73ffa6d6a1dcb6e9ea1baa5bed40721125/cms/djangoapps/course_creators/models.py#L27
4141
.. _OEP-9: https://open-edx-proposals.readthedocs.io/en/latest/best-practices/oep-0009-bp-permissions.html
4242
.. _views: https://github.com/dfunckt/django-rules#permissions-in-views
43+
44+
Changelog
45+
---------
46+
47+
2026-04-02:
48+
49+
* Updated references to module paths

docs/decisions/0010-taxonomy-enable-context.rst

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
10. Taxonomy enabled for context
22
================================
33

4+
Status
5+
------
6+
7+
Rejected. The "all available taxonomies" advanced setting described was never implemented, and the ``OrgTaxonomy`` subclass of taxonomies was instead replaced with a ``TaxonomyOrg`` model that links organizations to regular ``Taxonomy`` instances.
8+
49
Context
510
-------
611

@@ -59,7 +64,7 @@ If ``enabled = True``, then the :ref:`Organization` and :ref:`Course` contexts d
5964
Organization
6065
~~~~~~~~~~~~
6166

62-
OrgTaxonomy has a many-to-many relationship with the Organization model, accessed via the ``org_owners`` field. OrgTaxonomy lives under `cms.djangoapps.tagging` and so has access to the Organization model and logic in Studio.
67+
OrgTaxonomy has a many-to-many relationship with the Organization model, accessed via the ``org_owners`` field. OrgTaxonomy lives under ``openedx.core.djangoapps.content_tagging`` and so has access to the Organization model and logic in Studio.
6368

6469
An OrgTaxonomy is enabled for all organizations if ``org_owners == []``.
6570
If there are any ``org_owners`` set, then the OrgTaxonomy is only enabled for those orgas, i.e. only courses in these orgs will see the taxonomy field in Studio.
@@ -91,3 +96,11 @@ This was deemed too granular for the MVP, and the data structures and UI can be
9196

9297
.. _Advanced Settings: https://github.com/openedx/edx-platform/blob/4dc35c73ffa6d6a1dcb6e9ea1baa5bed40721125/cms/djangoapps/models/settings/course_metadata.py#L28
9398
.. _Course Waffle Flags: https://github.com/openedx/edx-platform/blob/4dc35c73ffa6d6a1dcb6e9ea1baa5bed40721125/openedx/core/djangoapps/waffle_utils/models.py#L14
99+
100+
Changelog
101+
---------
102+
103+
2026-04-02:
104+
105+
* Added "Status"
106+
* Updated references to module paths

docs/decisions/0011-tag-changes.rst

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@ Decision
1414
Preserve content tag name:value pairs even if the associated taxonomy or tag is removed.
1515
Reflect name:value changes from the linked taxonomy:tag immediately to the user.
1616

17-
Content tags (through their base ObjectTag class) store a foreign key to their Taxonomy and Tag (if relevant), but they also store a copy of the Taxonomy.name and Tag.value, which can be used if there is no Taxonomy or Tag available.
17+
Content tags (through their base ObjectTag class) store a foreign key to their Taxonomy and Tag (if relevant), but they also store a copy of the Taxonomy.export_id and Tag.value, which can be used if there is no Taxonomy or Tag available.
1818

1919
We consult the authoritative Taxonomy.name and Tag.value whenever displaying a content tag, so any changes are immediately reflected to the user.
2020

21-
If a Taxonomy or Tag is deleted, the linked content tags will remain, and cached copies of the name:value pair will be displayed.
21+
If a Taxonomy or Tag is deleted, the linked content tags will remain, and cached copies of the (name/export_id):value pair will be displayed.
2222

2323
This cached "value" field enables content tags (through their base ObjectTag class) to store free-text tag values, so that the free-text Taxonomy itself need not be modified when new free-text tags are added.
2424

@@ -33,3 +33,11 @@ Require foreign keys
3333
Require a foreign key from a content tag to Taxonomy for the name, and Tag for the value.
3434

3535
Only using foreign keys puts the labor-intensive content tag data at risk during taxonomy changes, and requires free-text tags to be made part of a taxonomy.
36+
37+
Changelog
38+
---------
39+
40+
2026-04-02:
41+
42+
* Updated: ObjectTag instances now store a reference to ``taxonomy.export_id``, not ``taxonomy.name``
43+
* Updated references to module paths

docs/decisions/0014-single-taxonomy-view-api.rst

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
14. Single taxonomy view API
22
=====================================
33

4+
Status
5+
------
6+
7+
Accepted, but the API has evolved beyond the description here and now supports loading tags of unlimited depth.
8+
49
Context
510
--------
611

@@ -101,7 +106,7 @@ The list of tags will be ordered in tree order (and alphabetically). If it has c
101106

102107
**Pros:**
103108

104-
- The edX's interfaces show the tags in the form of a tree.
109+
- The UI interface shows the tags in the form of a tree.
105110
- The frontend needs no further processing as it is in a displayable format.
106111
- It is kept as a simple implementation.
107112

@@ -157,3 +162,10 @@ can return all the tags in one page. So we can perform the tag search on the fro
157162

158163
- It is not scalable.
159164
- Sets limits of tags that can be created in the taxonomy.
165+
166+
Changelog
167+
---------
168+
169+
2026-04-02:
170+
171+
* Added "Status"

docs/decisions/0016-python-public-api-conventions.rst

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
16. Python Public API Conventions
22
=================================
33

4+
Status
5+
------
6+
7+
Superseded by decision 0020.
8+
49
Context
510
--------
611

@@ -88,3 +93,10 @@ Use ``_api`` modules in apps instead of ``api``.
8893
I'm not adding this because it feels unintuitive that apps would import a private module from other apps, e.g. the ``components`` app importing from ``openedx_learning.apps.publishing._api``. My hope is that documentation and import linter rules in edx-platform will be enough to make it clear that APIs should only be imported from ``openedx_learning.api``.
8994

9095
We should revisit this at a later time if this turns out to be a source of confusion.
96+
97+
Changelog
98+
---------
99+
100+
2026-04-02:
101+
102+
* Added "Status"

docs/decisions/0017-generalized-containers.rst

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
17. Modeling Containers as a Generalized Capability for Holding Content
22
========================================================================
33

4+
Status
5+
------
6+
7+
Accepted, except that "Selectors" have not been finalized nor implemented. Container implementation has been separated from ``publishing`` and is part of a separate "applet".
8+
49
Context
510
-------
611

@@ -92,4 +97,12 @@ This section defines the rules for pruning container versions, explaining when a
9297
- In a top-down approach, start the deletion process with the parent container and work your way down to its children. E.g., when pruning Section V2 > Subsection V1 > Unit V3, the deletion process starts in the greater container working its way down to the smaller.
9398
- Pruning a container version will not affect the container's history or the children of other container versions, so containers will not be deleted if they are shared by other containers.
9499

95-
.. _PublishableEntity: https://github.com/openedx/openedx-learning/blob/main/openedx_learning/apps/authoring/publishing/models.py#L100-L184
100+
.. _PublishableEntity: https://github.com/openedx/openedx-core/blob/4c1a9f1/src/openedx_content/applets/publishing/models/publishable_entity.py#L27
101+
102+
Changelog
103+
---------
104+
105+
2026-04-02:
106+
107+
* Added "Status"
108+
* Updated link to ``PublishableEntity``

0 commit comments

Comments
 (0)