Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
d8b8885
feat: depend on edx-organizations
bradenmacdonald Feb 6, 2026
1c225aa
feat: new catalog app to model course runs and catalog courses
bradenmacdonald Feb 13, 2026
da80093
feat: add a pre_save hook to prevent Organization.short_name from bei…
bradenmacdonald Feb 19, 2026
caf8a21
feat: admin improvements - display CourseRun warnings
bradenmacdonald Feb 19, 2026
cd1345b
chore: fix mypy warnings
bradenmacdonald Feb 19, 2026
4497b69
fix: better normalization of language codes for catalog courses.
bradenmacdonald Feb 21, 2026
b13c465
feat: add an initial API for catalog courses / course runs
bradenmacdonald Feb 22, 2026
22f1676
feat: add a 'url_slug' property to CatalogCourse
bradenmacdonald Feb 22, 2026
47c916b
feat: expand API, add tests
bradenmacdonald Feb 22, 2026
d2b5fbd
refactor: convert tests to pytest format
bradenmacdonald Feb 22, 2026
f6c5945
chore: mypy/pylint fixes
bradenmacdonald Feb 22, 2026
9f59c92
fix: make course code (on CatalogCourse) case sensitive
bradenmacdonald Feb 22, 2026
735feda
refactor: re-order API methods
bradenmacdonald Feb 24, 2026
54d1576
test: expand API tests
bradenmacdonald Feb 24, 2026
c5d43ae
fix: bug found by the new tests
bradenmacdonald Feb 24, 2026
162089b
refactor: update to use opaque-keys 3.1
bradenmacdonald Feb 24, 2026
3773103
test: expand tests, fix a bug with logging
bradenmacdonald Feb 25, 2026
442eec1
docs: some parts of platform call the course_code "number", so mentio…
bradenmacdonald Feb 25, 2026
edc943d
chore: fix import order
bradenmacdonald Feb 25, 2026
d804a4e
docs: clarify CatalogCourse.language is "primary language"
bradenmacdonald Feb 25, 2026
b83e3f7
feat: API for deleting a course run and/or catalog course
bradenmacdonald Feb 26, 2026
d8deaa2
chore: fix lint issue
bradenmacdonald Feb 26, 2026
43f7b7c
fix: CourseRun database constraint wasn't working with CCX keys
bradenmacdonald Feb 27, 2026
88aef75
refactor: course_id -> course_key, run -> run_code
bradenmacdonald Feb 27, 2026
1b6477c
refactor: address review comments
bradenmacdonald Feb 27, 2026
2c8385f
chore: fix quality
bradenmacdonald Feb 27, 2026
ccf075c
fix: missed update in Django admin
bradenmacdonald Feb 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions projects/dev.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,11 @@
"django.contrib.admin",
"django.contrib.admindocs",

# Open edX Organizations (dependency for openedx_catalog)
"organizations",

# Our Apps
"openedx_catalog",
"openedx_tagging",
"openedx_content",
*openedx_content_backcompat_apps_to_install(),
Expand Down
2 changes: 2 additions & 0 deletions requirements/base.in
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ edx-drf-extensions # Extensions to the Django REST Framework used by Open
rules<4.0 # Django extension for rules-based authorization checks

tomlkit # Parses and writes TOML configuration files

edx-organizations # Implemented the "Organization" model that CatalogCourse/CourseRun are keyed to
20 changes: 18 additions & 2 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,20 @@ django==5.2.11
# -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt
# -r requirements/base.in
# django-crum
# django-model-utils
# django-simple-history
# django-waffle
# djangorestframework
# drf-jwt
# edx-django-utils
# edx-drf-extensions
# edx-organizations
django-crum==0.7.9
# via edx-django-utils
django-model-utils==5.0.0
# via edx-organizations
django-simple-history==3.11.0
# via edx-organizations
django-waffle==5.0.0
# via
# edx-django-utils
Expand All @@ -58,22 +65,31 @@ djangorestframework==3.16.1
# -r requirements/base.in
# drf-jwt
# edx-drf-extensions
# edx-organizations
dnspython==2.8.0
# via pymongo
drf-jwt==1.19.2
# via edx-drf-extensions
edx-django-utils==8.0.1
# via edx-drf-extensions
edx-drf-extensions==10.6.0
# via
# -r requirements/base.in
# edx-organizations
edx-opaque-keys==3.1.0
# via
# edx-drf-extensions
# edx-organizations
edx-organizations==7.3.0
# via -r requirements/base.in
edx-opaque-keys==3.0.0
# via edx-drf-extensions
idna==3.11
# via requests
kombu==5.6.2
# via celery
packaging==26.0
# via kombu
pillow==12.1.0
# via edx-organizations
prompt-toolkit==3.0.52
# via click-repl
psutil==7.2.2
Expand Down
25 changes: 23 additions & 2 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,8 @@ django==5.2.11
# -r requirements/quality.txt
# django-crum
# django-debug-toolbar
# django-model-utils
# django-simple-history
# django-stubs
# django-stubs-ext
# django-waffle
Expand All @@ -141,6 +143,7 @@ django==5.2.11
# edx-django-utils
# edx-drf-extensions
# edx-i18n-tools
# edx-organizations
django-crum==0.7.9
# via
# -r requirements/quality.txt
Expand All @@ -149,6 +152,14 @@ django-debug-toolbar==6.2.0
# via
# -r requirements/dev.in
# -r requirements/quality.txt
django-model-utils==5.0.0
# via
# -r requirements/quality.txt
# edx-organizations
django-simple-history==3.11.0
# via
# -r requirements/quality.txt
# edx-organizations
django-stubs==5.2.9
# via
# -r requirements/quality.txt
Expand All @@ -167,6 +178,7 @@ djangorestframework==3.16.1
# -r requirements/quality.txt
# drf-jwt
# edx-drf-extensions
# edx-organizations
djangorestframework-stubs==3.16.8
# via -r requirements/quality.txt
dnspython==2.8.0
Expand All @@ -186,15 +198,20 @@ edx-django-utils==8.0.1
# -r requirements/quality.txt
# edx-drf-extensions
edx-drf-extensions==10.6.0
# via -r requirements/quality.txt
# via
# -r requirements/quality.txt
# edx-organizations
edx-i18n-tools==1.9.0
# via -r requirements/dev.in
edx-lint==5.6.0
# via -r requirements/quality.txt
edx-opaque-keys==3.0.0
edx-opaque-keys==3.1.0
# via
# -r requirements/quality.txt
# edx-drf-extensions
# edx-organizations
edx-organizations==7.3.0
# via -r requirements/quality.txt
fastapi==0.131.0
# via
# -r requirements/quality.txt
Expand Down Expand Up @@ -330,6 +347,10 @@ pathspec==1.0.4
# via
# -r requirements/quality.txt
# mypy
pillow==12.1.0
# via
# -r requirements/quality.txt
# edx-organizations
pip-tools==7.5.3
# via -r requirements/pip-tools.txt
platformdirs==4.9.2
Expand Down
25 changes: 23 additions & 2 deletions requirements/doc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -96,20 +96,31 @@ django==5.2.11
# -r requirements/test.txt
# django-crum
# django-debug-toolbar
# django-model-utils
# django-simple-history
# django-stubs
# django-stubs-ext
# django-waffle
# djangorestframework
# drf-jwt
# edx-django-utils
# edx-drf-extensions
# edx-organizations
# sphinxcontrib-django
django-crum==0.7.9
# via
# -r requirements/test.txt
# edx-django-utils
django-debug-toolbar==6.2.0
# via -r requirements/test.txt
django-model-utils==5.0.0
# via
# -r requirements/test.txt
# edx-organizations
django-simple-history==3.11.0
# via
# -r requirements/test.txt
# edx-organizations
django-stubs==5.2.9
# via
# -r requirements/test.txt
Expand All @@ -128,6 +139,7 @@ djangorestframework==3.16.1
# -r requirements/test.txt
# drf-jwt
# edx-drf-extensions
# edx-organizations
djangorestframework-stubs==3.16.8
# via -r requirements/test.txt
dnspython==2.8.0
Expand All @@ -152,11 +164,16 @@ edx-django-utils==8.0.1
# -r requirements/test.txt
# edx-drf-extensions
edx-drf-extensions==10.6.0
# via -r requirements/test.txt
edx-opaque-keys==3.0.0
# via
# -r requirements/test.txt
# edx-organizations
edx-opaque-keys==3.1.0
# via
# -r requirements/test.txt
# edx-drf-extensions
# edx-organizations
edx-organizations==7.3.0
# via -r requirements/test.txt
fastapi==0.131.0
# via
# -r requirements/test.txt
Expand Down Expand Up @@ -232,6 +249,10 @@ pathspec==1.0.4
# via
# -r requirements/test.txt
# mypy
pillow==12.1.0
# via
# -r requirements/test.txt
# edx-organizations
pluggy==1.6.0
# via
# -r requirements/test.txt
Expand Down
25 changes: 23 additions & 2 deletions requirements/quality.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,30 @@ django==5.2.11
# -r requirements/test.txt
# django-crum
# django-debug-toolbar
# django-model-utils
# django-simple-history
# django-stubs
# django-stubs-ext
# django-waffle
# djangorestframework
# drf-jwt
# edx-django-utils
# edx-drf-extensions
# edx-organizations
django-crum==0.7.9
# via
# -r requirements/test.txt
# edx-django-utils
django-debug-toolbar==6.2.0
# via -r requirements/test.txt
django-model-utils==5.0.0
# via
# -r requirements/test.txt
# edx-organizations
django-simple-history==3.11.0
# via
# -r requirements/test.txt
# edx-organizations
django-stubs==5.2.9
# via
# -r requirements/test.txt
Expand All @@ -132,6 +143,7 @@ djangorestframework==3.16.1
# -r requirements/test.txt
# drf-jwt
# edx-drf-extensions
# edx-organizations
djangorestframework-stubs==3.16.8
# via -r requirements/test.txt
dnspython==2.8.0
Expand All @@ -149,13 +161,18 @@ edx-django-utils==8.0.1
# -r requirements/test.txt
# edx-drf-extensions
edx-drf-extensions==10.6.0
# via -r requirements/test.txt
# via
# -r requirements/test.txt
# edx-organizations
edx-lint==5.6.0
# via -r requirements/quality.in
edx-opaque-keys==3.0.0
edx-opaque-keys==3.1.0
# via
# -r requirements/test.txt
# edx-drf-extensions
# edx-organizations
edx-organizations==7.3.0
# via -r requirements/test.txt
fastapi==0.131.0
# via
# -r requirements/test.txt
Expand Down Expand Up @@ -253,6 +270,10 @@ pathspec==1.0.4
# via
# -r requirements/test.txt
# mypy
pillow==12.1.0
# via
# -r requirements/test.txt
# edx-organizations
platformdirs==4.9.2
# via pylint
pluggy==1.6.0
Expand Down
25 changes: 23 additions & 2 deletions requirements/test.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,19 +79,30 @@ ddt==1.7.2
# -r requirements/base.txt
# django-crum
# django-debug-toolbar
# django-model-utils
# django-simple-history
# django-stubs
# django-stubs-ext
# django-waffle
# djangorestframework
# drf-jwt
# edx-django-utils
# edx-drf-extensions
# edx-organizations
django-crum==0.7.9
# via
# -r requirements/base.txt
# edx-django-utils
django-debug-toolbar==6.2.0
# via -r requirements/test.in
django-model-utils==5.0.0
# via
# -r requirements/base.txt
# edx-organizations
django-simple-history==3.11.0
# via
# -r requirements/base.txt
# edx-organizations
django-stubs==5.2.9
# via
# -r requirements/test.in
Expand All @@ -108,6 +119,7 @@ djangorestframework==3.16.1
# -r requirements/base.txt
# drf-jwt
# edx-drf-extensions
# edx-organizations
djangorestframework-stubs==3.16.8
# via -r requirements/test.in
dnspython==2.8.0
Expand All @@ -123,11 +135,16 @@ edx-django-utils==8.0.1
# -r requirements/base.txt
# edx-drf-extensions
edx-drf-extensions==10.6.0
# via -r requirements/base.txt
edx-opaque-keys==3.0.0
# via
# -r requirements/base.txt
# edx-organizations
edx-opaque-keys==3.1.0
# via
# -r requirements/base.txt
# edx-drf-extensions
# edx-organizations
edx-organizations==7.3.0
# via -r requirements/base.txt
fastapi==0.131.0
# via import-linter
freezegun==1.5.5
Expand Down Expand Up @@ -174,6 +191,10 @@ packaging==26.0
# pytest
pathspec==1.0.4
# via mypy
pillow==12.1.0
# via
# -r requirements/base.txt
# edx-organizations
pluggy==1.6.0
# via
# pytest
Expand Down
35 changes: 35 additions & 0 deletions src/openedx_catalog/ARCHITECTURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# Catalog App Architecture Diagram

Here's a visual overview of how this app relates to other apps.

(_Note: to see the diagram below, view this on GitHub or view in VS Code with [a Markdown-Mermaid extension](https://marketplace.visualstudio.com/items?itemName=bierner.markdown-mermaid) enabled._)

```mermaid
---
config:
theme: 'forest'
---
flowchart TB
Catalog["**openedx_catalog** (CourseRun, CatalogCourse plus core metadata models, e.g. CourseSchedule. Other metadata models live in other apps but are 1:1 with CourseRun.)"]
Content["**openedx_content**<br>The content of the course. (publishing, containers, components, media)"]
Organizations["**edx-organizations** (Organization)"]
Enrollments["**platform: enrollments** (CourseEnrollment, CourseEnrollmentAllowed)"]
Modes["**platform: course_modes** (CourseMode)"]
Catalog <-. "Direction of this relationship TBD." .-> Content
Catalog -- References --> Organizations
Enrollments -- References --> Modes
Enrollments -- References --> Catalog

style Enrollments fill:#ccc
style Modes fill:#ccc
style Organizations fill:#ccc

Pathways["<a href='https://openedx.atlassian.net/wiki/spaces/OEPM/pages/5148147732/Brief+Modular+Content+Delivery+-+Platform+Strategy'>**openedx_pathways**</a> (Pathway, PathwaySchedule, PathwayEnrollment, PathwayCertificate, etc.)"]
Pathways -- References --> Catalog

style Pathways fill:#c0ffee,stroke-dasharray: 5 5

FutureCatalog["Future discovery service - learner-oriented, pluggable, browse/search courses and programs"] -- References --> Catalog
FutureCatalog <-- Plugin API --> Pathways
style FutureCatalog fill:#ffc0ee,stroke-dasharray: 5 5
```
Loading