Skip to content

Commit 3c68678

Browse files
feat: new openedx_catalog app to model catalog courses + runs (v0.36.0) (#479)
* feat: depend on edx-organizations * feat: new catalog app to model course runs and catalog courses * feat: add a pre_save hook to prevent Organization.short_name from being changed * docs: some parts of platform call the course_code "number", so mention that * docs: clarify CatalogCourse.language is "primary language" * refactor: course_id -> course_key, run -> run_code, display_name -> title
1 parent 59725d7 commit 3c68678

28 files changed

Lines changed: 2113 additions & 7 deletions

projects/dev.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@
3434
"django.contrib.admin",
3535
"django.contrib.admindocs",
3636

37+
# Open edX Organizations (dependency for openedx_catalog)
38+
"organizations",
39+
3740
# Our Apps
41+
"openedx_catalog",
3842
"openedx_tagging",
3943
"openedx_content",
4044
*openedx_content_backcompat_apps_to_install(),

requirements/base.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ edx-drf-extensions # Extensions to the Django REST Framework used by Open
1313
rules<4.0 # Django extension for rules-based authorization checks
1414

1515
tomlkit # Parses and writes TOML configuration files
16+
17+
edx-organizations # Implemented the "Organization" model that CatalogCourse/CourseRun are keyed to

requirements/base.txt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,20 @@ django==5.2.12
4242
# -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt
4343
# -r requirements/base.in
4444
# django-crum
45+
# django-model-utils
46+
# django-simple-history
4547
# django-waffle
4648
# djangorestframework
4749
# drf-jwt
4850
# edx-django-utils
4951
# edx-drf-extensions
52+
# edx-organizations
5053
django-crum==0.7.9
5154
# via edx-django-utils
55+
django-model-utils==5.0.0
56+
# via edx-organizations
57+
django-simple-history==3.11.0
58+
# via edx-organizations
5259
django-waffle==5.0.0
5360
# via
5461
# edx-django-utils
@@ -58,22 +65,31 @@ djangorestframework==3.16.1
5865
# -r requirements/base.in
5966
# drf-jwt
6067
# edx-drf-extensions
68+
# edx-organizations
6169
dnspython==2.8.0
6270
# via pymongo
6371
drf-jwt==1.19.2
6472
# via edx-drf-extensions
6573
edx-django-utils==8.0.1
6674
# via edx-drf-extensions
6775
edx-drf-extensions==10.6.0
68-
# via -r requirements/base.in
76+
# via
77+
# -r requirements/base.in
78+
# edx-organizations
6979
edx-opaque-keys==3.1.0
70-
# via edx-drf-extensions
80+
# via
81+
# edx-drf-extensions
82+
# edx-organizations
83+
edx-organizations==7.3.0
84+
# via -r requirements/base.in
7185
idna==3.11
7286
# via requests
7387
kombu==5.6.2
7488
# via celery
7589
packaging==26.0
7690
# via kombu
91+
pillow==12.1.0
92+
# via edx-organizations
7793
prompt-toolkit==3.0.52
7894
# via click-repl
7995
psutil==7.2.2

requirements/dev.txt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ django==5.2.12
117117
# -r requirements/quality.txt
118118
# django-crum
119119
# django-debug-toolbar
120+
# django-model-utils
121+
# django-simple-history
120122
# django-stubs
121123
# django-stubs-ext
122124
# django-waffle
@@ -125,6 +127,7 @@ django==5.2.12
125127
# edx-django-utils
126128
# edx-drf-extensions
127129
# edx-i18n-tools
130+
# edx-organizations
128131
django-crum==0.7.9
129132
# via
130133
# -r requirements/quality.txt
@@ -133,6 +136,14 @@ django-debug-toolbar==6.2.0
133136
# via
134137
# -r requirements/dev.in
135138
# -r requirements/quality.txt
139+
django-model-utils==5.0.0
140+
# via
141+
# -r requirements/quality.txt
142+
# edx-organizations
143+
django-simple-history==3.11.0
144+
# via
145+
# -r requirements/quality.txt
146+
# edx-organizations
136147
django-stubs==5.2.9
137148
# via
138149
# -r requirements/quality.txt
@@ -151,6 +162,7 @@ djangorestframework==3.16.1
151162
# -r requirements/quality.txt
152163
# drf-jwt
153164
# edx-drf-extensions
165+
# edx-organizations
154166
djangorestframework-stubs==3.16.8
155167
# via -r requirements/quality.txt
156168
dnspython==2.8.0
@@ -170,7 +182,9 @@ edx-django-utils==8.0.1
170182
# -r requirements/quality.txt
171183
# edx-drf-extensions
172184
edx-drf-extensions==10.6.0
173-
# via -r requirements/quality.txt
185+
# via
186+
# -r requirements/quality.txt
187+
# edx-organizations
174188
edx-i18n-tools==1.9.0
175189
# via -r requirements/dev.in
176190
edx-lint==5.6.0
@@ -179,6 +193,9 @@ edx-opaque-keys==3.1.0
179193
# via
180194
# -r requirements/quality.txt
181195
# edx-drf-extensions
196+
# edx-organizations
197+
edx-organizations==7.3.0
198+
# via -r requirements/quality.txt
182199
filelock==3.25.0
183200
# via
184201
# -r requirements/ci.txt
@@ -306,6 +323,10 @@ pathspec==1.0.4
306323
# via
307324
# -r requirements/quality.txt
308325
# mypy
326+
pillow==12.1.0
327+
# via
328+
# -r requirements/quality.txt
329+
# edx-organizations
309330
pip-tools==7.5.3
310331
# via -r requirements/pip-tools.txt
311332
platformdirs==4.9.4

requirements/doc.txt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,31 @@ django==5.2.12
8383
# -r requirements/test.txt
8484
# django-crum
8585
# django-debug-toolbar
86+
# django-model-utils
87+
# django-simple-history
8688
# django-stubs
8789
# django-stubs-ext
8890
# django-waffle
8991
# djangorestframework
9092
# drf-jwt
9193
# edx-django-utils
9294
# edx-drf-extensions
95+
# edx-organizations
9396
# sphinxcontrib-django
9497
django-crum==0.7.9
9598
# via
9699
# -r requirements/test.txt
97100
# edx-django-utils
98101
django-debug-toolbar==6.2.0
99102
# via -r requirements/test.txt
103+
django-model-utils==5.0.0
104+
# via
105+
# -r requirements/test.txt
106+
# edx-organizations
107+
django-simple-history==3.11.0
108+
# via
109+
# -r requirements/test.txt
110+
# edx-organizations
100111
django-stubs==5.2.9
101112
# via
102113
# -r requirements/test.txt
@@ -115,6 +126,7 @@ djangorestframework==3.16.1
115126
# -r requirements/test.txt
116127
# drf-jwt
117128
# edx-drf-extensions
129+
# edx-organizations
118130
djangorestframework-stubs==3.16.8
119131
# via -r requirements/test.txt
120132
dnspython==2.8.0
@@ -139,11 +151,16 @@ edx-django-utils==8.0.1
139151
# -r requirements/test.txt
140152
# edx-drf-extensions
141153
edx-drf-extensions==10.6.0
142-
# via -r requirements/test.txt
154+
# via
155+
# -r requirements/test.txt
156+
# edx-organizations
143157
edx-opaque-keys==3.1.0
144158
# via
145159
# -r requirements/test.txt
146160
# edx-drf-extensions
161+
# edx-organizations
162+
edx-organizations==7.3.0
163+
# via -r requirements/test.txt
147164
freezegun==1.5.5
148165
# via -r requirements/test.txt
149166
grimp==3.14
@@ -210,6 +227,10 @@ pathspec==1.0.4
210227
# via
211228
# -r requirements/test.txt
212229
# mypy
230+
pillow==12.1.0
231+
# via
232+
# -r requirements/test.txt
233+
# edx-organizations
213234
pluggy==1.6.0
214235
# via
215236
# -r requirements/test.txt

requirements/quality.txt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,30 @@ django==5.2.12
8888
# -r requirements/test.txt
8989
# django-crum
9090
# django-debug-toolbar
91+
# django-model-utils
92+
# django-simple-history
9193
# django-stubs
9294
# django-stubs-ext
9395
# django-waffle
9496
# djangorestframework
9597
# drf-jwt
9698
# edx-django-utils
9799
# edx-drf-extensions
100+
# edx-organizations
98101
django-crum==0.7.9
99102
# via
100103
# -r requirements/test.txt
101104
# edx-django-utils
102105
django-debug-toolbar==6.2.0
103106
# via -r requirements/test.txt
107+
django-model-utils==5.0.0
108+
# via
109+
# -r requirements/test.txt
110+
# edx-organizations
111+
django-simple-history==3.11.0
112+
# via
113+
# -r requirements/test.txt
114+
# edx-organizations
104115
django-stubs==5.2.9
105116
# via
106117
# -r requirements/test.txt
@@ -119,6 +130,7 @@ djangorestframework==3.16.1
119130
# -r requirements/test.txt
120131
# drf-jwt
121132
# edx-drf-extensions
133+
# edx-organizations
122134
djangorestframework-stubs==3.16.8
123135
# via -r requirements/test.txt
124136
dnspython==2.8.0
@@ -136,13 +148,18 @@ edx-django-utils==8.0.1
136148
# -r requirements/test.txt
137149
# edx-drf-extensions
138150
edx-drf-extensions==10.6.0
139-
# via -r requirements/test.txt
151+
# via
152+
# -r requirements/test.txt
153+
# edx-organizations
140154
edx-lint==5.6.0
141155
# via -r requirements/quality.in
142156
edx-opaque-keys==3.1.0
143157
# via
144158
# -r requirements/test.txt
145159
# edx-drf-extensions
160+
# edx-organizations
161+
edx-organizations==7.3.0
162+
# via -r requirements/test.txt
146163
freezegun==1.5.5
147164
# via -r requirements/test.txt
148165
grimp==3.14
@@ -231,6 +248,10 @@ pathspec==1.0.4
231248
# via
232249
# -r requirements/test.txt
233250
# mypy
251+
pillow==12.1.0
252+
# via
253+
# -r requirements/test.txt
254+
# edx-organizations
234255
platformdirs==4.9.4
235256
# via pylint
236257
pluggy==1.6.0

requirements/test.txt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,30 @@ ddt==1.7.2
7272
# -r requirements/base.txt
7373
# django-crum
7474
# django-debug-toolbar
75+
# django-model-utils
76+
# django-simple-history
7577
# django-stubs
7678
# django-stubs-ext
7779
# django-waffle
7880
# djangorestframework
7981
# drf-jwt
8082
# edx-django-utils
8183
# edx-drf-extensions
84+
# edx-organizations
8285
django-crum==0.7.9
8386
# via
8487
# -r requirements/base.txt
8588
# edx-django-utils
8689
django-debug-toolbar==6.2.0
8790
# via -r requirements/test.in
91+
django-model-utils==5.0.0
92+
# via
93+
# -r requirements/base.txt
94+
# edx-organizations
95+
django-simple-history==3.11.0
96+
# via
97+
# -r requirements/base.txt
98+
# edx-organizations
8899
django-stubs==5.2.9
89100
# via
90101
# -r requirements/test.in
@@ -101,6 +112,7 @@ djangorestframework==3.16.1
101112
# -r requirements/base.txt
102113
# drf-jwt
103114
# edx-drf-extensions
115+
# edx-organizations
104116
djangorestframework-stubs==3.16.8
105117
# via -r requirements/test.in
106118
dnspython==2.8.0
@@ -116,11 +128,16 @@ edx-django-utils==8.0.1
116128
# -r requirements/base.txt
117129
# edx-drf-extensions
118130
edx-drf-extensions==10.6.0
119-
# via -r requirements/base.txt
131+
# via
132+
# -r requirements/base.txt
133+
# edx-organizations
120134
edx-opaque-keys==3.1.0
121135
# via
122136
# -r requirements/base.txt
123137
# edx-drf-extensions
138+
# edx-organizations
139+
edx-organizations==7.3.0
140+
# via -r requirements/base.txt
124141
freezegun==1.5.5
125142
# via -r requirements/test.in
126143
grimp==3.14
@@ -162,6 +179,10 @@ packaging==26.0
162179
# pytest
163180
pathspec==1.0.4
164181
# via mypy
182+
pillow==12.1.0
183+
# via
184+
# -r requirements/base.txt
185+
# edx-organizations
165186
pluggy==1.6.0
166187
# via
167188
# pytest
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# Catalog App Architecture Diagram
2+
3+
Here's a visual overview of how this app relates to other apps.
4+
5+
(_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._)
6+
7+
```mermaid
8+
---
9+
config:
10+
theme: 'forest'
11+
---
12+
flowchart TB
13+
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.)"]
14+
Content["**openedx_content**<br>The content of the course. (publishing, containers, components, media)"]
15+
Organizations["**edx-organizations** (Organization)"]
16+
Enrollments["**platform: enrollments** (CourseEnrollment, CourseEnrollmentAllowed)"]
17+
Modes["**platform: course_modes** (CourseMode)"]
18+
Catalog <-. "Direction of this relationship TBD." .-> Content
19+
Catalog -- References --> Organizations
20+
Enrollments -- References --> Modes
21+
Enrollments -- References --> Catalog
22+
23+
style Enrollments fill:#ccc
24+
style Modes fill:#ccc
25+
style Organizations fill:#ccc
26+
27+
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.)"]
28+
Pathways -- References --> Catalog
29+
30+
style Pathways fill:#c0ffee,stroke-dasharray: 5 5
31+
32+
FutureCatalog["Future discovery service - learner-oriented, pluggable, browse/search courses and programs"] -- References --> Catalog
33+
FutureCatalog <-- Plugin API --> Pathways
34+
style FutureCatalog fill:#ffc0ee,stroke-dasharray: 5 5
35+
```

0 commit comments

Comments
 (0)