diff --git a/requirements/base.txt b/requirements/base.txt index 5b0a623ad..d74c277d0 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -37,9 +37,9 @@ click-plugins==1.1.1.2 # via celery click-repl==0.3.0 # via celery -cryptography==47.0.0 +cryptography==48.0.0 # via pyjwt -django==5.2.13 +django==5.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/base.in @@ -93,7 +93,7 @@ edx-organizations==8.0.0 # via -r requirements/base.in fastavro==1.12.2 # via openedx-events -idna==3.13 +idna==3.14 # via requests kombu==5.6.2 # via celery @@ -135,7 +135,7 @@ stevedore==5.7.0 # via # edx-django-utils # edx-opaque-keys -tomlkit==0.14.0 +tomlkit==0.15.0 # via -r requirements/base.in typing-extensions==4.15.0 # via edx-opaque-keys @@ -143,7 +143,7 @@ tzdata==2026.2 # via kombu tzlocal==5.3.1 # via celery -urllib3==2.6.3 +urllib3==2.7.0 # via requests vine==5.1.0 # via diff --git a/requirements/ci.txt b/requirements/ci.txt index 494cf8be5..6fdfe1fa5 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -28,7 +28,7 @@ pluggy==1.6.0 # via tox pyproject-api==1.10.0 # via tox -python-discovery==1.2.2 +python-discovery==1.3.0 # via # tox # virtualenv @@ -36,5 +36,5 @@ tomli-w==1.2.0 # via tox tox==4.53.1 # via -r requirements/ci.in -virtualenv==21.3.0 +virtualenv==21.3.1 # via tox diff --git a/requirements/dev.txt b/requirements/dev.txt index a7e5c755b..7ac4c23c5 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -12,6 +12,10 @@ asgiref==3.11.1 # via # -r requirements/quality.txt # django +ast-serialize==0.3.0 + # via + # -r requirements/quality.txt + # mypy astroid==4.0.4 # via # -r requirements/quality.txt @@ -88,11 +92,11 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.13.5 +coverage[toml]==7.14.0 # via # -r requirements/quality.txt # pytest-cov -cryptography==47.0.0 +cryptography==48.0.0 # via # -r requirements/quality.txt # pyjwt @@ -109,7 +113,7 @@ distlib==0.4.0 # via # -r requirements/ci.txt # virtualenv -django==5.2.13 +django==5.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/quality.txt @@ -143,11 +147,11 @@ django-simple-history==3.11.0 # via # -r requirements/quality.txt # edx-organizations -django-stubs==6.0.3 +django-stubs==6.0.4 # via # -r requirements/quality.txt # djangorestframework-stubs -django-stubs-ext==6.0.3 +django-stubs-ext==6.0.4 # via # -r requirements/quality.txt # django-stubs @@ -222,7 +226,7 @@ id==1.6.1 # via # -r requirements/quality.txt # twine -idna==3.13 +idna==3.14 # via # -r requirements/quality.txt # requests @@ -266,7 +270,7 @@ kombu==5.6.2 # via # -r requirements/quality.txt # celery -librt==0.9.0 +librt==0.11.0 # via # -r requirements/quality.txt # mypy @@ -276,7 +280,7 @@ lxml[html-clean]==6.1.0 # lxml-html-clean lxml-html-clean==0.4.4 # via lxml -markdown-it-py==4.0.0 +markdown-it-py==4.2.0 # via # -r requirements/quality.txt # rich @@ -299,7 +303,7 @@ more-itertools==11.0.2 # -r requirements/quality.txt # jaraco-classes # jaraco-functools -mypy==1.20.2 +mypy==2.0.0 # via -r requirements/quality.txt mypy-extensions==1.1.0 # via @@ -434,7 +438,7 @@ python-dateutil==2.9.0.post0 # -r requirements/quality.txt # celery # freezegun -python-discovery==1.2.2 +python-discovery==1.3.0 # via # -r requirements/ci.txt # tox @@ -510,7 +514,7 @@ tomli-w==1.2.0 # via # -r requirements/ci.txt # tox -tomlkit==0.14.0 +tomlkit==0.15.0 # via # -r requirements/quality.txt # edx-lint @@ -519,7 +523,7 @@ tox==4.53.1 # via -r requirements/ci.txt twine==6.2.0 # via -r requirements/quality.txt -types-pyyaml==6.0.12.20260408 +types-pyyaml==6.0.12.20260510 # via # -r requirements/quality.txt # django-stubs @@ -542,7 +546,7 @@ tzlocal==5.3.1 # via # -r requirements/quality.txt # celery -urllib3==2.6.3 +urllib3==2.7.0 # via # -r requirements/quality.txt # id @@ -554,7 +558,7 @@ vine==5.1.0 # amqp # celery # kombu -virtualenv==21.3.0 +virtualenv==21.3.1 # via # -r requirements/ci.txt # tox diff --git a/requirements/doc.txt b/requirements/doc.txt index 351a55fc5..cbd51e421 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -16,6 +16,10 @@ asgiref==3.11.1 # via # -r requirements/test.txt # django +ast-serialize==0.3.0 + # via + # -r requirements/test.txt + # mypy attrs==26.1.0 # via # -r requirements/test.txt @@ -69,17 +73,17 @@ click-repl==0.3.0 # celery code-annotations==3.0.0 # via -r requirements/test.txt -coverage[toml]==7.13.5 +coverage[toml]==7.14.0 # via # -r requirements/test.txt # pytest-cov -cryptography==47.0.0 +cryptography==48.0.0 # via # -r requirements/test.txt # pyjwt ddt==1.7.2 # via -r requirements/test.txt -django==5.2.13 +django==5.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.txt @@ -111,11 +115,11 @@ django-simple-history==3.11.0 # via # -r requirements/test.txt # edx-organizations -django-stubs==6.0.3 +django-stubs==6.0.4 # via # -r requirements/test.txt # djangorestframework-stubs -django-stubs-ext==6.0.3 +django-stubs-ext==6.0.4 # via # -r requirements/test.txt # django-stubs @@ -181,7 +185,7 @@ grimp==3.14 # via # -r requirements/test.txt # import-linter -idna==3.13 +idna==3.14 # via # -r requirements/test.txt # requests @@ -202,11 +206,11 @@ kombu==5.6.2 # via # -r requirements/test.txt # celery -librt==0.9.0 +librt==0.11.0 # via # -r requirements/test.txt # mypy -markdown-it-py==4.0.0 +markdown-it-py==4.2.0 # via # -r requirements/test.txt # rich @@ -220,7 +224,7 @@ mdurl==0.1.2 # markdown-it-py mock==5.2.0 # via -r requirements/test.txt -mypy==1.20.2 +mypy==2.0.0 # via -r requirements/test.txt mypy-extensions==1.1.0 # via @@ -380,9 +384,9 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -tomlkit==0.14.0 +tomlkit==0.15.0 # via -r requirements/test.txt -types-pyyaml==6.0.12.20260408 +types-pyyaml==6.0.12.20260510 # via # -r requirements/test.txt # django-stubs @@ -407,7 +411,7 @@ tzlocal==5.3.1 # via # -r requirements/test.txt # celery -urllib3==2.6.3 +urllib3==2.7.0 # via # -r requirements/test.txt # requests diff --git a/requirements/pip.txt b/requirements/pip.txt index 2f2055395..26c818977 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -10,7 +10,7 @@ wheel==0.47.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==26.1 +pip==26.1.1 # via -r requirements/pip.in setuptools==82.0.1 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 11f0d79d3..3aa8b8a4c 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -12,6 +12,10 @@ asgiref==3.11.1 # via # -r requirements/test.txt # django +ast-serialize==0.3.0 + # via + # -r requirements/test.txt + # mypy astroid==4.0.4 # via # pylint @@ -69,11 +73,11 @@ code-annotations==3.0.0 # via # -r requirements/test.txt # edx-lint -coverage[toml]==7.13.5 +coverage[toml]==7.14.0 # via # -r requirements/test.txt # pytest-cov -cryptography==47.0.0 +cryptography==48.0.0 # via # -r requirements/test.txt # pyjwt @@ -82,7 +86,7 @@ ddt==1.7.2 # via -r requirements/test.txt dill==0.4.1 # via pylint -django==5.2.13 +django==5.2.14 # via # -c https://raw.githubusercontent.com/edx/edx-lint/master/edx_lint/files/common_constraints.txt # -r requirements/test.txt @@ -113,11 +117,11 @@ django-simple-history==3.11.0 # via # -r requirements/test.txt # edx-organizations -django-stubs==6.0.3 +django-stubs==6.0.4 # via # -r requirements/test.txt # djangorestframework-stubs -django-stubs-ext==6.0.3 +django-stubs-ext==6.0.4 # via # -r requirements/test.txt # django-stubs @@ -180,7 +184,7 @@ grimp==3.14 # import-linter id==1.6.1 # via twine -idna==3.13 +idna==3.14 # via # -r requirements/test.txt # requests @@ -214,11 +218,11 @@ kombu==5.6.2 # via # -r requirements/test.txt # celery -librt==0.9.0 +librt==0.11.0 # via # -r requirements/test.txt # mypy -markdown-it-py==4.0.0 +markdown-it-py==4.2.0 # via # -r requirements/test.txt # rich @@ -238,7 +242,7 @@ more-itertools==11.0.2 # via # jaraco-classes # jaraco-functools -mypy==1.20.2 +mypy==2.0.0 # via -r requirements/test.txt mypy-extensions==1.1.0 # via @@ -392,14 +396,14 @@ text-unidecode==1.3 # via # -r requirements/test.txt # python-slugify -tomlkit==0.14.0 +tomlkit==0.15.0 # via # -r requirements/test.txt # edx-lint # pylint twine==6.2.0 # via -r requirements/quality.in -types-pyyaml==6.0.12.20260408 +types-pyyaml==6.0.12.20260510 # via # -r requirements/test.txt # django-stubs @@ -422,7 +426,7 @@ tzlocal==5.3.1 # via # -r requirements/test.txt # celery -urllib3==2.6.3 +urllib3==2.7.0 # via # -r requirements/test.txt # id diff --git a/requirements/test.txt b/requirements/test.txt index fc131e77a..d6f206ded 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -12,6 +12,8 @@ asgiref==3.11.1 # via # -r requirements/base.txt # django +ast-serialize==0.3.0 + # via mypy attrs==26.1.0 # via # -r requirements/base.txt @@ -59,11 +61,11 @@ click-repl==0.3.0 # celery code-annotations==3.0.0 # via -r requirements/test.in -coverage[toml]==7.13.5 +coverage[toml]==7.14.0 # via # -r requirements/test.in # pytest-cov -cryptography==47.0.0 +cryptography==48.0.0 # via # -r requirements/base.txt # pyjwt @@ -99,11 +101,11 @@ django-simple-history==3.11.0 # via # -r requirements/base.txt # edx-organizations -django-stubs==6.0.3 +django-stubs==6.0.4 # via # -r requirements/test.in # djangorestframework-stubs -django-stubs-ext==6.0.3 +django-stubs-ext==6.0.4 # via django-stubs django-waffle==5.0.0 # via @@ -156,7 +158,7 @@ freezegun==1.5.5 # via -r requirements/test.in grimp==3.14 # via import-linter -idna==3.13 +idna==3.14 # via # -r requirements/base.txt # requests @@ -170,9 +172,9 @@ kombu==5.6.2 # via # -r requirements/base.txt # celery -librt==0.9.0 +librt==0.11.0 # via mypy -markdown-it-py==4.0.0 +markdown-it-py==4.2.0 # via rich markupsafe==3.0.3 # via jinja2 @@ -180,7 +182,7 @@ mdurl==0.1.2 # via markdown-it-py mock==5.2.0 # via -r requirements/test.in -mypy==1.20.2 +mypy==2.0.0 # via -r requirements/test.in mypy-extensions==1.1.0 # via mypy @@ -280,9 +282,9 @@ stevedore==5.7.0 # edx-opaque-keys text-unidecode==1.3 # via python-slugify -tomlkit==0.14.0 +tomlkit==0.15.0 # via -r requirements/base.txt -types-pyyaml==6.0.12.20260408 +types-pyyaml==6.0.12.20260510 # via # django-stubs # djangorestframework-stubs @@ -304,7 +306,7 @@ tzlocal==5.3.1 # via # -r requirements/base.txt # celery -urllib3==2.6.3 +urllib3==2.7.0 # via # -r requirements/base.txt # requests diff --git a/src/openedx_catalog/models/course_run.py b/src/openedx_catalog/models/course_run.py index 3f298df7a..cf8a34ba5 100644 --- a/src/openedx_catalog/models/course_run.py +++ b/src/openedx_catalog/models/course_run.py @@ -153,6 +153,8 @@ def org_code(self) -> str: """ # This is not just called 'org' to distinguish it from loading the whole Organization model. # Note: 'self.catalog_course.org.short_name' may require a JOIN/query, but self.course_key.org does not. + assert self.course_key is not None + assert self.course_key.org is not None return self.course_key.org @property @@ -160,6 +162,8 @@ def org_code(self) -> str: def course_code(self) -> str: """Get the course code/number of this course, e.g. "Math100" """ # Note: 'self.catalog_course.course_code' may require a JOIN/query, but self.course_key.course does not. + assert self.course_key is not None + assert self.course_key.course is not None return self.course_key.course # Do we want mix in SoftDeletableModel from django-model-utils to make courses soft deletable? diff --git a/tests/openedx_catalog/test_api.py b/tests/openedx_catalog/test_api.py index f29040f5e..05f26d161 100644 --- a/tests/openedx_catalog/test_api.py +++ b/tests/openedx_catalog/test_api.py @@ -173,6 +173,7 @@ def test_get_course_run_nonexistent() -> None: def test_get_course_run(python100_summer26: CourseRun) -> None: """Basic retrieval of a CourseRun using the API""" + assert python100_summer26.course_key is not None run = api.get_course_run(python100_summer26.course_key) assert run == python100_summer26 @@ -370,6 +371,7 @@ def test_delete_course_run( python100_winter26: CourseRun, ) -> None: """Test that we can delete a CourseRun, passing in the object""" + assert python100_summer26.course_key is not None api.delete_course_run(python100_summer26.course_key) with pytest.raises(CourseRun.DoesNotExist): python100_summer26.refresh_from_db() # Make sure it's gone