2. Catalog Pathway Deletion and Visibility#
Status#
Accepted
To be partially implemented in Willow, fully implemented in Xylon.
Context#
CatalogPathway is the learner-browsable, enrollable side of a Pathway
(7. Pathways: Split Between Catalog and Content), and PathwayEnrollment hangs off it. That raises two questions
that the MVP has to answer:
Can a
CatalogPathwaybe deleted, and what happens to its enrollments?Is there a way to stop advertising a Pathway without deleting it?
Cascading deletion into enrollments would mean that deleting one catalog row silently destroys student state, which we don’t want. Forbidding deletion outright is safe, but authors do make mistakes, and a Pathway created in error should be removable.
The visibility question has a natural answer that we don’t have time to build for the MVP. We expect to
eventually introduce a Catalog model, many-to-many with CatalogCourse and CatalogPathway:
each site would have a default Catalog (its public catalog), and could define additional, narrower Catalogs
(think “enterprise catalogs”). Un-advertising a Pathway would then be deleting a Catalog-to-CatalogPathway join
row, not deleting the Pathway itself.
Decisions#
1. Deletion is protected, not cascaded#
PathwayEnrollment references CatalogPathway with on_delete=PROTET, consistent with the
rest of the catalog app. A CatalogPathway that nobody has enrolled in can be deleted; one with any
enrollment cannot be deleted at all. Deleting a Pathway never destroys enrollment records.
2. In Willow, every Catalog Pathway is public#
The MVP ships no visibility toggle and no soft-deletion flag on CatalogPathway. Every
CatalogPathway row is advertised.
3. We intend to add a Catalog model in Xylon#
Our intent, as of Willow, is to add the Catalog model described above in Xylon and backfill it: a default
Catalog per site, joined to every existing CatalogCourse and CatalogPathway, so that the
Willow behavior (“everything is public”) is preserved on upgrade. Visibility would then be managed through
Catalog membership. This is a statement of intent rather than a commitment; it may be reshaped or deferred.
This is a statement of intent from the engineering team, based on what we expect the product will need. The whole area of catalog deletion, visibility, curation, etc. is in need of product definition, so this is subject to change.
Consequences#
Student state is never lost as a side effect of a catalog edit.
Until the Catalog model exists, an operator who wants to stop advertising a Pathway that has enrollments has no supported way to do it. We accept that gap for the MVP; it is the main reason we expect to prioritize the Catalog model in Xylon.
Attempting to delete an enrolled-in Pathway surfaces a database-level
ProtectedError. Django admin and any authoring UI should present that as a clear message rather than a traceback.Product expectations should be checked against this before Willow ships, since “I made a mistake and want this gone” is a plausible request that decision 1 does not fully satisfy.
Rejected Alternatives#
Cascade deletion into enrollments. Deleting a CatalogPathway would wipe out every enrollment for it.
This makes a routine-looking authoring action destroy learner records, with no way back.
Forbid deletion entirely. Safe, but it leaves no way to clean up a Pathway created by mistake, and every instance would accumulate junk rows.
A visibility flag or soft-deletion on CatalogPathway. This would solve the un-advertising problem now, but it duplicates what Catalog membership is meant to express, and we would have to carry both forever once Catalogs exist.