From a750384a72bd63581495807efefac47438d4488b Mon Sep 17 00:00:00 2001 From: Mary Gwozdz Date: Thu, 16 Jul 2026 12:36:11 -0700 Subject: [PATCH 1/6] docs: add ADR for taxonomy_type field, amend ADR 0002 openedx_tagging needs a layering-safe way to report whether a Taxonomy is competency-enabled (#618), without gaining any knowledge of the CompetencyTaxonomy subclass CBE owns. Adds a taxonomy_type field to the base Taxonomy model set by the caller that creates a CompetencyTaxonomy row, and documents why two prior approaches on #618 (an openedx_tagging-side hasattr check, an overridable get_type() method) were unsound. Amends ADR 0002 to note the corresponding creation-time invariant and that its rejection of a flat taxonomy_type column still stands, unaffected by this narrower field. --- .../0002-competency-criteria-model.rst | 19 ++- .../decisions/0013-taxonomy-type-field.rst | 132 ++++++++++++++++++ 2 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 docs/openedx_tagging/decisions/0013-taxonomy-type-field.rst diff --git a/docs/openedx_learning/decisions/0002-competency-criteria-model.rst b/docs/openedx_learning/decisions/0002-competency-criteria-model.rst index 0c3e40a15..07792b947 100644 --- a/docs/openedx_learning/decisions/0002-competency-criteria-model.rst +++ b/docs/openedx_learning/decisions/0002-competency-criteria-model.rst @@ -62,7 +62,7 @@ Decision Lifecycle rules for this parent/child pair: - - Creating a competency taxonomy creates both the parent ``oel_tagging_taxonomy`` row and the ``CompetencyTaxonomy`` row in one transaction. + - Creating a competency taxonomy creates both the parent ``oel_tagging_taxonomy`` row and the ``CompetencyTaxonomy`` row in one transaction, and also sets that ``oel_tagging_taxonomy`` row's ``taxonomy_type`` to ``competency`` in the same transaction (``openedx_tagging`` ADR 0013). - Deleting either representation is treated as deleting the competency taxonomy and removes both rows, subject to Decision 7 delete protections. 2. ``CompetencyCriteriaGroup`` concept (database table) @@ -366,6 +366,12 @@ Rejected Alternatives 4. Makes it harder to keep competency features optional for deployments that only want generic tagging 5. Increases risk of future refactor/migration work if the competency domain later needs to be split from tagging + This rejection stands, unaffected by whether ``CompetencyTaxonomy`` currently defines + any columns of its own beyond the parent link. ``openedx_tagging`` ADR 0013 separately + adds a ``taxonomy_type`` field to ``oel_tagging_taxonomy`` for a narrower, later problem + this ADR doesn't cover: a lightweight type label for ``openedx_tagging``'s own generic + REST API. See that ADR and the Changelog below. + 2. Same as above except combine the ``CompetencyCriteria`` and ``oel_tagging_objecttag`` tables by adding the rule information as columns on the ``oel_tagging_objecttag`` table. This would be a more denormalized approach that would reduce the number of joins needed to retrieve competency achievement criteria information but would add complexity to the ``oel_tagging_objecttag`` table and make it less flexible for other uses. 1. Pros @@ -422,3 +428,14 @@ Rejected Alternatives 1. Silently does not work on this project's tested and production database backend. Django compiles a conditional ``UniqueConstraint`` to a partial index, which MySQL does not support; Django raises only a non-fatal system-check warning (``models.W036``) and skips creating the constraint, leaving the uniqueness rule completely unenforced at the database level. 2. The gap would surface only as a data-integrity incident under concurrent writes, not as a test or migration failure, since SQLite (used for quick local test runs) does support partial indexes and would mask the problem in that environment. + +Changelog +--------- + +2026-07-16: + +* Added the ``taxonomy_type`` creation-time invariant to Decision 1's lifecycle rules, and + a note on Rejected Alternatives item 1 that its rejection stands independent of + ``openedx_tagging`` ADR 0013, which separately adds a ``taxonomy_type`` field to + ``oel_tagging_taxonomy`` for a narrower problem (a type label for that library's generic + REST API, #618) than this ADR's data-model decision. diff --git a/docs/openedx_tagging/decisions/0013-taxonomy-type-field.rst b/docs/openedx_tagging/decisions/0013-taxonomy-type-field.rst new file mode 100644 index 000000000..a4aef2597 --- /dev/null +++ b/docs/openedx_tagging/decisions/0013-taxonomy-type-field.rst @@ -0,0 +1,132 @@ +.. _openedx-tagging-adr-0013: + +13. Base-model ``taxonomy_type`` field for Competency Taxonomies +================================================================== + +Status +------ + +Proposed + +Context +------- + +The taxonomy Get endpoints (``TaxonomySerializer``) need to report whether a taxonomy is +a Competency Taxonomy, so that Studio can badge Competency Taxonomies and gate access to +the Competency Management page (#618), symmetrically with the Create/Import endpoint's +``taxonomy_type`` field (#614). ``CompetencyTaxonomy`` is a Django multi-table-inheritance +subclass of ``Taxonomy`` (``CompetencyTaxonomy(Taxonomy)``), owned by the CBE applet and +defined in `ADR 0002 <../../openedx_learning/decisions/0002-competency-criteria-model.rst>`_. + +``openedx_tagging`` is a generic tagging library with no knowledge of any specific taxonomy +flavor built on top of it, CBE or otherwise, and must not gain any: a specific downstream +applet's model or relation name has no business appearing in this library's source, since +that reverses the intended dependency direction (CBE depends on ``openedx_tagging``, not +the other way around) and would break for any Open edX install running ``openedx_tagging`` +without CBE installed. + +Two approaches were tried on #618 and found unsound; see Rejected Alternatives. + +This decision does not reopen `ADR 0002 <../../openedx_learning/decisions/0002-competency-criteria-model.rst>`_'s +rejection of a flat ``taxonomy_type`` column as an alternative to multi-table inheritance. +That rejection's deciding reason was that a flat column can't give other CBE tables a +real, database-enforced foreign key to specifically a competency-enabled taxonomy; +``CompetencyRuleProfile.competency_taxonomy_id`` relies on that guarantee. That reasoning +is independent of whether ``CompetencyTaxonomy`` currently defines any columns of its own +beyond the parent link, and is unaffected by this decision. This decision addresses a +narrower, later problem ADR 0002 does not cover: a lightweight type label for +``openedx_tagging``'s own generic REST API. + +Decision +-------- + +Add a ``taxonomy_type`` field directly to ``Taxonomy``: + +- A ``TaxonomyType(models.TextChoices)`` enum with values ``TAGS`` (default) and + ``COMPETENCY``, shared between this field and #614's write-side ``ChoiceField`` so the + two can never drift apart. +- Set explicitly by whichever code creates the row. The code that creates a + ``CompetencyTaxonomy`` row (#614) also sets ``taxonomy_type=TaxonomyType.COMPETENCY`` on + the same ``Taxonomy`` row, in the same transaction that creates both rows (the existing + lifecycle rule in ADR 0002 Decision 1). ``openedx_tagging`` never inspects, imports, or + names ``CompetencyTaxonomy`` or any relation to it anywhere in its own source; the field's + value is opaque to it and owned entirely by the caller. +- Immutable after creation, mirroring the scope-immutability precedent for + ``CompetencyRuleProfile`` in ADR 0002 Decision 3: a taxonomy's type does not change over + its lifetime. +- Existing taxonomies are backfilled to ``TaxonomyType.TAGS`` via an additive migration; + none has a ``CompetencyTaxonomy`` row today, since CBE has no production data yet. +- Exposed read-only on ``TaxonomySerializer`` (#618), returning the field's value directly. + +**Known tradeoff.** This creates two facts that must stay in sync: the field's value, and +whether a ``CompetencyTaxonomy`` row actually exists for that taxonomy. This is accepted +because it is enforced at a single transactional chokepoint (the creation path for a +``CompetencyTaxonomy``), not as an ongoing invariant that application code must maintain +across multiple call sites. + +Future considerations +~~~~~~~~~~~~~~~~~~~~~~ + +If a third taxonomy flavor is introduced later, it extends this same field and enum with a +third value; no schema redesign is implied. This field is not a general-purpose +polymorphism mechanism and does not preclude one being added separately if a future need +requires it. + +Rejected Alternatives +---------------------- + +Check for a related ``CompetencyTaxonomy`` row directly inside ``openedx_tagging`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The original #618 proposal: ``hasattr(instance, "competencytaxonomy")`` inside +``openedx_tagging``'s serializer. Rejected because it hardcodes a specific downstream +applet's multi-table-inheritance relation name into a standalone, generic library, which +is exactly the reverse-dependency problem this decision exists to avoid. + +An overridable ``Taxonomy.get_type()`` method +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The follow-up #618 proposal: a base ``Taxonomy.get_type()`` method returning ``"tags"``, +overridden by ``CompetencyTaxonomy`` to return ``"competency"``, mirroring the existing +``Taxonomy.system_defined`` / ``SystemDefinedTaxonomy`` base/override shape. Rejected for +two independent reasons: + +- That base/override shape is implemented via ``Taxonomy._taxonomy_class`` and + ``Taxonomy.cast()``/``Taxonomy.copy()``, which #634 (Remove Taxonomy Subclasses) removes. +- Independent of #634: querying taxonomies the normal way (``Taxonomy.objects.all()``) + returns plain ``Taxonomy`` instances, so a subclass method override is never reached + without an explicit cast step first. The existing ``.cast()``/``.copy()`` implementation + would not correctly perform that cast for a true multi-table-inheritance subclass in any + case: it copies a hardcoded list of base ``Taxonomy`` field values in Python and never + queries the subclass's own table, so it would silently produce a ``CompetencyTaxonomy`` + instance with unset or wrong subclass-specific fields. + +Frontend-only: no backend field +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Studio determines type by combining ``openedx_tagging``'s generic taxonomy list with a +separate, CBE-owned endpoint client-side. Rejected because it gives no answer to any +in-process backend consumer of this published library (other apps, plugins, management +commands), only to whichever frontend chooses to make two calls and join them, and it +pushes the integration cost of that join onto every future consumer rather than paying it +once. + +A settings-configured resolver function +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A Django setting pointing at a dotted import path to a resolver function, owned by CBE, +that ``Taxonomy.get_type()`` calls if configured. This would have kept the type-detection +logic entirely out of ``openedx_tagging``'s own source. Rejected because it is a new, +bespoke, ad-hoc hook into ``openedx_tagging``, when this project's established pattern for +a cross-app extension point, if one is genuinely needed, is ``openedx-events``/ +``openedx-filters`` rather than a one-off settings hook. Reaching for that established +pattern instead would mean depending on and wiring up a plugin/event framework across +repos for a field with exactly two known values today -- more machinery than either this +alternative or the field approach chosen here, not less. + +Changelog +--------- + +2026-07-16: + +* Proposed. From f78bf01d974f679987a6cc8d65f47c71f92ab380 Mon Sep 17 00:00:00 2001 From: Mary Gwozdz Date: Tue, 21 Jul 2026 15:12:54 -0700 Subject: [PATCH 2/6] docs: revert ADR 0002 amendment for taxonomy_type field ADR 0013 no longer decides to add a taxonomy_type field to Taxonomy: an architecture-meeting review moved that decision to detecting competency taxonomies entirely within openedx-platform instead. The lifecycle-rule note and Rejected Alternatives cross-reference this amendment added to describe that field's creation-time invariant no longer describe anything that happens, so revert ADR 0002 to its state from before the amendment. --- .../0002-competency-criteria-model.rst | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/docs/openedx_learning/decisions/0002-competency-criteria-model.rst b/docs/openedx_learning/decisions/0002-competency-criteria-model.rst index 07792b947..0c3e40a15 100644 --- a/docs/openedx_learning/decisions/0002-competency-criteria-model.rst +++ b/docs/openedx_learning/decisions/0002-competency-criteria-model.rst @@ -62,7 +62,7 @@ Decision Lifecycle rules for this parent/child pair: - - Creating a competency taxonomy creates both the parent ``oel_tagging_taxonomy`` row and the ``CompetencyTaxonomy`` row in one transaction, and also sets that ``oel_tagging_taxonomy`` row's ``taxonomy_type`` to ``competency`` in the same transaction (``openedx_tagging`` ADR 0013). + - Creating a competency taxonomy creates both the parent ``oel_tagging_taxonomy`` row and the ``CompetencyTaxonomy`` row in one transaction. - Deleting either representation is treated as deleting the competency taxonomy and removes both rows, subject to Decision 7 delete protections. 2. ``CompetencyCriteriaGroup`` concept (database table) @@ -366,12 +366,6 @@ Rejected Alternatives 4. Makes it harder to keep competency features optional for deployments that only want generic tagging 5. Increases risk of future refactor/migration work if the competency domain later needs to be split from tagging - This rejection stands, unaffected by whether ``CompetencyTaxonomy`` currently defines - any columns of its own beyond the parent link. ``openedx_tagging`` ADR 0013 separately - adds a ``taxonomy_type`` field to ``oel_tagging_taxonomy`` for a narrower, later problem - this ADR doesn't cover: a lightweight type label for ``openedx_tagging``'s own generic - REST API. See that ADR and the Changelog below. - 2. Same as above except combine the ``CompetencyCriteria`` and ``oel_tagging_objecttag`` tables by adding the rule information as columns on the ``oel_tagging_objecttag`` table. This would be a more denormalized approach that would reduce the number of joins needed to retrieve competency achievement criteria information but would add complexity to the ``oel_tagging_objecttag`` table and make it less flexible for other uses. 1. Pros @@ -428,14 +422,3 @@ Rejected Alternatives 1. Silently does not work on this project's tested and production database backend. Django compiles a conditional ``UniqueConstraint`` to a partial index, which MySQL does not support; Django raises only a non-fatal system-check warning (``models.W036``) and skips creating the constraint, leaving the uniqueness rule completely unenforced at the database level. 2. The gap would surface only as a data-integrity incident under concurrent writes, not as a test or migration failure, since SQLite (used for quick local test runs) does support partial indexes and would mask the problem in that environment. - -Changelog ---------- - -2026-07-16: - -* Added the ``taxonomy_type`` creation-time invariant to Decision 1's lifecycle rules, and - a note on Rejected Alternatives item 1 that its rejection stands independent of - ``openedx_tagging`` ADR 0013, which separately adds a ``taxonomy_type`` field to - ``oel_tagging_taxonomy`` for a narrower problem (a type label for that library's generic - REST API, #618) than this ADR's data-model decision. From 1c6ccbda49f4f30a6751c7c892cc252c6cd5ee7c Mon Sep 17 00:00:00 2001 From: Mary Gwozdz Date: Tue, 21 Jul 2026 15:13:36 -0700 Subject: [PATCH 3/6] docs: rename taxonomy-type-field ADR to competency-taxonomy-detection The next commit changes this ADR's decision away from a taxonomy_type field, so the filename no longer describes it. Renamed on its own, ahead of that content change, so the rename and the content diff stay independently reviewable. --- ...nomy-type-field.rst => 0013-competency-taxonomy-detection.rst} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/openedx_tagging/decisions/{0013-taxonomy-type-field.rst => 0013-competency-taxonomy-detection.rst} (100%) diff --git a/docs/openedx_tagging/decisions/0013-taxonomy-type-field.rst b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst similarity index 100% rename from docs/openedx_tagging/decisions/0013-taxonomy-type-field.rst rename to docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst From 2002a8d2064a489074fae1619bc1c3c09a857983 Mon Sep 17 00:00:00 2001 From: Mary Gwozdz Date: Tue, 21 Jul 2026 15:14:04 -0700 Subject: [PATCH 4/6] docs: change ADR 0013 decision to platform-side competency detection Reversed at the 2026-07-21 architecture meeting: instead of a taxonomy_type field on the base Taxonomy model, report a taxonomy's type entirely within openedx-platform (a hasattr check on the same already-fetched instance, plus a matching select_related), so openedx_tagging and the CBE app stay fully free of any competency-specific reference. The field-based approach is demoted to Rejected Alternatives, alongside two more precise variants (two-call create flow, combined REST API) that were previously folded into a single vaguer entry. Adds a diagram of the chosen approach. --- .../0013-competency-taxonomy-detection.rst | 172 +++++++++--------- .../images/CompetencyTypeDetection.mmd | 17 ++ .../images/CompetencyTypeDetection.png | Bin 0 -> 108311 bytes 3 files changed, 99 insertions(+), 90 deletions(-) create mode 100644 docs/openedx_tagging/decisions/images/CompetencyTypeDetection.mmd create mode 100644 docs/openedx_tagging/decisions/images/CompetencyTypeDetection.png diff --git a/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst index a4aef2597..60b2e8cee 100644 --- a/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst +++ b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst @@ -1,12 +1,12 @@ .. _openedx-tagging-adr-0013: -13. Base-model ``taxonomy_type`` field for Competency Taxonomies -================================================================== +13. Competency taxonomy detection in openedx-platform +======================================================= Status ------ -Proposed +Accepted Context ------- @@ -25,108 +25,100 @@ that reverses the intended dependency direction (CBE depends on ``openedx_taggin the other way around) and would break for any Open edX install running ``openedx_tagging`` without CBE installed. -Two approaches were tried on #618 and found unsound; see Rejected Alternatives. - -This decision does not reopen `ADR 0002 <../../openedx_learning/decisions/0002-competency-criteria-model.rst>`_'s -rejection of a flat ``taxonomy_type`` column as an alternative to multi-table inheritance. -That rejection's deciding reason was that a flat column can't give other CBE tables a -real, database-enforced foreign key to specifically a competency-enabled taxonomy; -``CompetencyRuleProfile.competency_taxonomy_id`` relies on that guarantee. That reasoning -is independent of whether ``CompetencyTaxonomy`` currently defines any columns of its own -beyond the parent link, and is unaffected by this decision. This decision addresses a -narrower, later problem ADR 0002 does not cover: a lightweight type label for -``openedx_tagging``'s own generic REST API. - Decision -------- -Add a ``taxonomy_type`` field directly to ``Taxonomy``: - -- A ``TaxonomyType(models.TextChoices)`` enum with values ``TAGS`` (default) and - ``COMPETENCY``, shared between this field and #614's write-side ``ChoiceField`` so the - two can never drift apart. -- Set explicitly by whichever code creates the row. The code that creates a - ``CompetencyTaxonomy`` row (#614) also sets ``taxonomy_type=TaxonomyType.COMPETENCY`` on - the same ``Taxonomy`` row, in the same transaction that creates both rows (the existing - lifecycle rule in ADR 0002 Decision 1). ``openedx_tagging`` never inspects, imports, or - names ``CompetencyTaxonomy`` or any relation to it anywhere in its own source; the field's - value is opaque to it and owned entirely by the caller. -- Immutable after creation, mirroring the scope-immutability precedent for - ``CompetencyRuleProfile`` in ADR 0002 Decision 3: a taxonomy's type does not change over - its lifetime. -- Existing taxonomies are backfilled to ``TaxonomyType.TAGS`` via an additive migration; - none has a ``CompetencyTaxonomy`` row today, since CBE has no production data yet. -- Exposed read-only on ``TaxonomySerializer`` (#618), returning the field's value directly. - -**Known tradeoff.** This creates two facts that must stay in sync: the field's value, and -whether a ``CompetencyTaxonomy`` row actually exists for that taxonomy. This is accepted -because it is enforced at a single transactional chokepoint (the creation path for a -``CompetencyTaxonomy``), not as an ongoing invariant that application code must maintain -across multiple call sites. - -Future considerations -~~~~~~~~~~~~~~~~~~~~~~ - -If a third taxonomy flavor is introduced later, it extends this same field and enum with a -third value; no schema redesign is implied. This field is not a general-purpose -polymorphism mechanism and does not preclude one being added separately if a future need -requires it. +Report a taxonomy's type entirely within **openedx-platform**, using the existing relation +between ``Taxonomy`` and ``CompetencyTaxonomy`` established in ADR 0002, without adding any +field, method, or enum value to ``openedx_tagging`` or the CBE app: + +.. image:: images/CompetencyTypeDetection.png + :alt: Studio calls openedx-platform's serializer, which delegates to oel_tagging's pure + base Taxonomy serializer for the Taxonomy row, and separately runs a hasattr check + against the same already-fetched instance to detect a related CompetencyTaxonomy + row, with no new API call and no changes to oel_tagging. + +- openedx-platform's ``TaxonomyOrgSerializer`` (already a subclass of the base + ``TaxonomySerializer``) adds a read-only ``taxonomy_type`` field computed via + ``hasattr(instance, "competencytaxonomy")``: ``"competency"`` if present, ``"tags"`` + otherwise. +- ``TaxonomyOrgView.get_queryset()`` (already overridden in openedx-platform) adds + ``select_related("competencytaxonomy")`` so the check costs no extra query per row. +- ``openedx_tagging``'s ``Taxonomy`` model, its base ``TaxonomySerializer``, and the CBE app + stay fully unaware of each other for this purpose: no new field, no new enum value, no + import. +- No creation-time wiring is needed to keep this accurate: ADR 0002 Decision 1 already + creates the ``CompetencyTaxonomy`` row in the same transaction as its parent ``Taxonomy`` + row, so the ``hasattr`` check can never drift out of sync the way a separately-stored + field could. + +**Known trade-off.** A future third taxonomy type needs another hardcoded branch in +openedx-platform's shared serializer, the same cost a field-based approach would have +avoided with a one-line enum addition. Accepted because keeping ``openedx_tagging`` and the +CBE app free of any competency-specific reference, even an inert stored value, was judged +more valuable than that extensibility, particularly given the project's move away from +system-defined taxonomies, which makes a third taxonomy flavor unlikely soon. Rejected Alternatives ---------------------- +``taxonomy_type`` enum field on the base ``Taxonomy`` model +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A ``TaxonomyType(models.TextChoices)`` field (``TAGS``/``COMPETENCY``) added directly to +``Taxonomy``, set by whichever code creates a ``CompetencyTaxonomy`` row, in the same +transaction as ADR 0002 Decision 1's existing lifecycle rule. Although this requires no +per-request check and was more extensible for a hypothetical third taxonomy flavor, it +still named a CBE-specific concept, a ``COMPETENCY`` enum value, directly in +``openedx_tagging``'s own schema and public API. Keeping ``openedx_tagging`` and the CBE +app fully free of any competency-specific reference, even an inert one, is worth the lost +extensibility. + Check for a related ``CompetencyTaxonomy`` row directly inside ``openedx_tagging`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The original #618 proposal: ``hasattr(instance, "competencytaxonomy")`` inside -``openedx_tagging``'s serializer. Rejected because it hardcodes a specific downstream -applet's multi-table-inheritance relation name into a standalone, generic library, which -is exactly the reverse-dependency problem this decision exists to avoid. +Using ``hasattr(instance, "competencytaxonomy")`` inside ``openedx_tagging``'s serializer. +Needed no migration and, unlike the field-based approach above, could never drift out of +sync since it read the relation directly instead of a separately-stored value. Rejected +because it hardcodes a specific downstream applet's multi-table-inheritance relation name +into a standalone, generic library, which is exactly the reverse-dependency problem this +decision exists to avoid. It also risks an N+1 query on every taxonomy list request unless +``openedx_tagging``'s own queryset adds a matching ``select_related``, a cost every +consumer of that shared serializer would inherit, not just openedx-platform. + +Two-call frontend create flow +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Studio calls the plain create-taxonomy endpoint, then makes a second call to a separate, +CBE-owned endpoint to convert it to a competency taxonomy, with no new REST surface needed. +Rejected because the frontend must orchestrate both calls itself and handle the case where +the first succeeds but the second fails, leaving a plain taxonomy behind with no competency +conversion. + +New combined competency REST API +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +A single new CBE-owned endpoint that creates both the ``Taxonomy`` and +``CompetencyTaxonomy`` rows atomically. Rejected because it is a new endpoint to design, +build, and maintain, and the frontend still needs both this call and the plain +create-taxonomy call, choosing between them since nothing upstream tells it in advance +whether a Tags or Competency taxonomy is being created; that branching just relocates the +type-awareness into the frontend rather than removing it. An overridable ``Taxonomy.get_type()`` method ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The follow-up #618 proposal: a base ``Taxonomy.get_type()`` method returning ``"tags"``, -overridden by ``CompetencyTaxonomy`` to return ``"competency"``, mirroring the existing +A base ``Taxonomy.get_type()`` method returning ``"tags"``, overridden by +``CompetencyTaxonomy`` to return ``"competency"``, mirroring the existing ``Taxonomy.system_defined`` / ``SystemDefinedTaxonomy`` base/override shape. Rejected for two independent reasons: - That base/override shape is implemented via ``Taxonomy._taxonomy_class`` and - ``Taxonomy.cast()``/``Taxonomy.copy()``, which #634 (Remove Taxonomy Subclasses) removes. -- Independent of #634: querying taxonomies the normal way (``Taxonomy.objects.all()``) - returns plain ``Taxonomy`` instances, so a subclass method override is never reached - without an explicit cast step first. The existing ``.cast()``/``.copy()`` implementation - would not correctly perform that cast for a true multi-table-inheritance subclass in any - case: it copies a hardcoded list of base ``Taxonomy`` field values in Python and never - queries the subclass's own table, so it would silently produce a ``CompetencyTaxonomy`` - instance with unset or wrong subclass-specific fields. - -Frontend-only: no backend field -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Studio determines type by combining ``openedx_tagging``'s generic taxonomy list with a -separate, CBE-owned endpoint client-side. Rejected because it gives no answer to any -in-process backend consumer of this published library (other apps, plugins, management -commands), only to whichever frontend chooses to make two calls and join them, and it -pushes the integration cost of that join onto every future consumer rather than paying it -once. - -A settings-configured resolver function -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -A Django setting pointing at a dotted import path to a resolver function, owned by CBE, -that ``Taxonomy.get_type()`` calls if configured. This would have kept the type-detection -logic entirely out of ``openedx_tagging``'s own source. Rejected because it is a new, -bespoke, ad-hoc hook into ``openedx_tagging``, when this project's established pattern for -a cross-app extension point, if one is genuinely needed, is ``openedx-events``/ -``openedx-filters`` rather than a one-off settings hook. Reaching for that established -pattern instead would mean depending on and wiring up a plugin/event framework across -repos for a field with exactly two known values today -- more machinery than either this -alternative or the field approach chosen here, not less. - -Changelog ---------- - -2026-07-16: - -* Proposed. + ``Taxonomy.cast()``/``Taxonomy.copy()``, which are planned to be removed as a pattern. +- Querying taxonomies the normal way (``Taxonomy.objects.all()``) returns plain ``Taxonomy`` + instances, so a subclass method override is never reached without an explicit cast step + first. The existing ``.cast()``/``.copy()`` implementation would not correctly perform + that cast for a true multi-table-inheritance subclass in any case: it copies a hardcoded + list of base ``Taxonomy`` field values in Python and never queries the subclass's own + table, so it would silently produce a ``CompetencyTaxonomy`` instance with unset or wrong + subclass-specific fields. diff --git a/docs/openedx_tagging/decisions/images/CompetencyTypeDetection.mmd b/docs/openedx_tagging/decisions/images/CompetencyTypeDetection.mmd new file mode 100644 index 000000000..1f43d6872 --- /dev/null +++ b/docs/openedx_tagging/decisions/images/CompetencyTypeDetection.mmd @@ -0,0 +1,17 @@ +flowchart TD + FE[Studio MFE] + subgraph PLAT["openedx-platform (router lives here)"] + P1["Serializer: adds taxonomy_type via hasattr, on the same instance"] + end + subgraph CORE["openedx-core: oel_tagging"] + C1["Base Taxonomy query/serializer, stays pure"] + end + subgraph DB[Database] + T[("Taxonomy (unchanged)")] + CT[("CompetencyTaxonomy")] + end + + FE --> P1 + P1 -->|delegates for the base object| C1 + C1 --> T + P1 -.->|"hasattr check on that same object, no new API call"| CT diff --git a/docs/openedx_tagging/decisions/images/CompetencyTypeDetection.png b/docs/openedx_tagging/decisions/images/CompetencyTypeDetection.png new file mode 100644 index 0000000000000000000000000000000000000000..3441b0cdf2948a4e24fbf9cf2fcfc6ce263ea049 GIT binary patch literal 108311 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 k-Ll%j!otG)J3nJ%&E8y|QIfQkf$w0wP*9Vvlr; Date: Tue, 21 Jul 2026 15:20:06 -0700 Subject: [PATCH 5/6] docs: trim implementation detail from ADR 0013's Decision section Replace references to openedx-platform's specific serializer/view class and method names, and the literal hasattr()/select_related() calls, with a description of the mechanism itself. Those identifiers belong to a repo this ADR doesn't govern, so naming them risked the ADR reading as stale if openedx-platform's internal structure changes, even though the decision itself wouldn't have. --- .../0013-competency-taxonomy-detection.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst index 60b2e8cee..db2f476bb 100644 --- a/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst +++ b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst @@ -38,18 +38,17 @@ field, method, or enum value to ``openedx_tagging`` or the CBE app: against the same already-fetched instance to detect a related CompetencyTaxonomy row, with no new API call and no changes to oel_tagging. -- openedx-platform's ``TaxonomyOrgSerializer`` (already a subclass of the base - ``TaxonomySerializer``) adds a read-only ``taxonomy_type`` field computed via - ``hasattr(instance, "competencytaxonomy")``: ``"competency"`` if present, ``"tags"`` - otherwise. -- ``TaxonomyOrgView.get_queryset()`` (already overridden in openedx-platform) adds - ``select_related("competencytaxonomy")`` so the check costs no extra query per row. +- openedx-platform's REST layer adds a read-only ``taxonomy_type`` value to its taxonomy + serializer, computed by checking whether a related ``CompetencyTaxonomy`` row exists for + that ``Taxonomy``: ``"competency"`` if so, ``"tags"`` otherwise. +- That same layer's queryset fetches the related ``CompetencyTaxonomy`` row alongside the + ``Taxonomy`` list, so the check costs no extra query per row. - ``openedx_tagging``'s ``Taxonomy`` model, its base ``TaxonomySerializer``, and the CBE app stay fully unaware of each other for this purpose: no new field, no new enum value, no import. - No creation-time wiring is needed to keep this accurate: ADR 0002 Decision 1 already creates the ``CompetencyTaxonomy`` row in the same transaction as its parent ``Taxonomy`` - row, so the ``hasattr`` check can never drift out of sync the way a separately-stored + row, so the existence check can never drift out of sync the way a separately-stored field could. **Known trade-off.** A future third taxonomy type needs another hardcoded branch in From ac3d829bda8e166fe1e94566254242ccd5534e54 Mon Sep 17 00:00:00 2001 From: Mary Gwozdz Date: Tue, 21 Jul 2026 15:24:30 -0700 Subject: [PATCH 6/6] docs: trim implementation detail from ADR 0013's Context section Drop the TaxonomySerializer parenthetical (an openedx_tagging class name that isn't needed to state the requirement), the redundant CompetencyTaxonomy(Taxonomy) Python-syntax notation (already said in prose just before it), and the parenthetical GitHub issue references, which read oddly in an ADR meant to stand on its own. --- .../decisions/0013-competency-taxonomy-detection.rst | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst index db2f476bb..645fe92a4 100644 --- a/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst +++ b/docs/openedx_tagging/decisions/0013-competency-taxonomy-detection.rst @@ -11,12 +11,12 @@ Accepted Context ------- -The taxonomy Get endpoints (``TaxonomySerializer``) need to report whether a taxonomy is -a Competency Taxonomy, so that Studio can badge Competency Taxonomies and gate access to -the Competency Management page (#618), symmetrically with the Create/Import endpoint's -``taxonomy_type`` field (#614). ``CompetencyTaxonomy`` is a Django multi-table-inheritance -subclass of ``Taxonomy`` (``CompetencyTaxonomy(Taxonomy)``), owned by the CBE applet and -defined in `ADR 0002 <../../openedx_learning/decisions/0002-competency-criteria-model.rst>`_. +The taxonomy Get endpoints need to report whether a taxonomy is a Competency Taxonomy, so +that Studio can badge Competency Taxonomies and gate access to the Competency Management +page, symmetrically with the Create/Import endpoint's ``taxonomy_type`` field. +``CompetencyTaxonomy`` is a Django multi-table-inheritance subclass of +``Taxonomy``, owned by the CBE applet and defined in +`ADR 0002 <../../openedx_learning/decisions/0002-competency-criteria-model.rst>`_. ``openedx_tagging`` is a generic tagging library with no knowledge of any specific taxonomy flavor built on top of it, CBE or otherwise, and must not gain any: a specific downstream