From 89117988036c6d8d921dca27a4c105fea4fc23fd Mon Sep 17 00:00:00 2001 From: Muhammad Afaq Shuaib Date: Mon, 13 Jan 2025 23:11:50 +0500 Subject: [PATCH] docs: add vertical tagging ADR --- .../0031-vertical-content-tagging.rst | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/decisions/0031-vertical-content-tagging.rst diff --git a/docs/decisions/0031-vertical-content-tagging.rst b/docs/decisions/0031-vertical-content-tagging.rst new file mode 100644 index 0000000000..61cabd0e32 --- /dev/null +++ b/docs/decisions/0031-vertical-content-tagging.rst @@ -0,0 +1,49 @@ +31. Vertical Content Tagging +============================= + +Status +-------- +Accepted (January 2025) + +Context +--------- +The openedX's `course-discovery` service currently lacks an efficient and flexible way to categorize courses by +granular subject areas and verticals. The existing mechanisms (e.g., tags, Primary Subject) are limited, primarily +partner-driven, and often misaligned with business-specific needs for taxonomy and categorization. +Partner-driven use cases are different from business-specific use cases. + +For example, if a partner tags a Python course as a programming language course, +the business wants to tag it as a Data Science tool (to learn and practice Data Science primarily). + +Objective +----------- +This Vertical Tagging functionality ensures that the portfolio of courses is aligned with business objectives +by granular tagging using vertical filters. + +Decision +---------- +A new app will be created for the Vertical Content Tagging functionality in the course-discovery. + +The following models will be added to support the vertical tagging functionality: + +- **VerticalFilter:** This model will contain the vertical's name and slug value and an active flag. +- **SubVerticalFilter:** This model will contain the sub-vertical's name, slug value, vertical reference, + and an active flag. +- **BaseVerticalFilter:** This abstract model will reference the VerticalFilter and SubVerticalFilter models and will be used for product types. +- **CourseVerticalFilter:** This model extends BaseVerticalFilter and will contain references to the Course model to assign verticals and sub-verticals to courses. + +Currently, the decision is to support vertical tagging for courses only. In the future, +the same functionality can be extended to other product types (e.g., Programs, Degrees, etc.). + +A new user group will be created to grant access to the admin panel for assigning vertical and sub-vertical tags to courses. +However, this user group will not have permission to manage vertical and sub-vertical filters, this functionality will be restricted to superusers only. + +This new user group will be managed using a base settings configuration variable. To implement this, a new user group will be created +and added to the base settings configuration. + +Alternatives Considered +------------------------- +- Add New Models in course_metadata: Keeping functionality within a single repository, simplifying integration. + However, it risks app bloat, increased coupling, and reduced readability due to the large number of existing models. +- Create a Separate Plugin: Decouples vertical tagging for better scalability and modularity, with a plug-and-play structure. + However, it requires significant initial effort, coordination, and limits Django ORM relationships with course-discovery models.