Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
47 commits
Select commit Hold shift + click to select a range
ec638c2
build: modernize to uv + pyproject.toml + semantic-release
irfanuddinahmad Sep 3, 2026
e19124d
fix: remove unnecessary try/except around __version__ (not present pr…
irfanuddinahmad Sep 9, 2026
1853714
fix: restore Draft and PublishableEntityVersion PII safelist entries …
irfanuddinahmad Sep 9, 2026
bc8a9e8
Merge remote-tracking branch 'upstream/main' into irfanuddinahmad/mod…
irfanuddinahmad Sep 9, 2026
5e7126c
feat: accept taxonomy_type on taxonomy create and import endpoints (#…
alezconsultant Sep 11, 2026
93d07f8
chore: Upgrade Python requirements (#813)
edx-requirements-bot Sep 14, 2026
93c7f61
chore: Upgrade Python requirements (#824)
edx-requirements-bot Sep 21, 2026
5614b4e
Merge remote-tracking branch 'origin-upstream/main' into irfanuddinah…
irfanuddinahmad Sep 23, 2026
9017688
fix: use secrets.GITHUB_TOKEN instead of custom org secret for releas…
irfanuddinahmad Sep 24, 2026
536dc1a
fix: restore tox delegation for quality and pii_check targets
irfanuddinahmad Sep 24, 2026
739ef47
docs: ADR for openedx_catalog models (layering content above catalog)…
bradenmacdonald Sep 25, 2026
6e9d934
chore: Upgrade Python requirements (#838)
edx-requirements-bot Sep 28, 2026
62b51bc
fix: drop uv run from Makefile per feanil's review feedback
irfanuddinahmad Sep 28, 2026
3891646
Merge remote-tracking branch 'upstream/main' into irfanuddinahmad/mod…
irfanuddinahmad Sep 28, 2026
91597d0
fix: restore unbounded Django/edx-drf-extensions/edx-organizations in…
irfanuddinahmad Sep 30, 2026
768fc46
fix: wire lint-imports into tox -e quality, drop bogus envlist entry
irfanuddinahmad Sep 30, 2026
da6e5f9
fix: add --locked to ci.yml, correct constraint comment pointer
irfanuddinahmad Sep 30, 2026
2816952
Merge pull request #704 from irfanuddinahmad/irfanuddinahmad/moderniz…
feanil Oct 1, 2026
048c536
build: remove redundant lint-imports workflow
irfanuddinahmad Oct 1, 2026
ed13164
feat: add competency criteria models for CBE authoring layer (#800)
jesperhodge Oct 1, 2026
4f73aaa
feat: make Tag.external_id non-nullable, auto-generated when omitted
ufedaseyeuconsultant Oct 1, 2026
0b351b8
Merge pull request #844 from irfanuddinahmad/irfanuddinahmad/remove-l…
feanil Oct 1, 2026
f2ae446
chore: Upgrade Python requirements (#849)
edx-requirements-bot Oct 5, 2026
ec24672
build(deps): bump astral-sh/setup-uv from 9.0.0 to 10.2.0
dependabot[bot] Oct 5, 2026
0cce6f6
build(deps): bump python-semantic-release/python-semantic-release
dependabot[bot] Oct 5, 2026
48a04ee
feat: add CompetencyMasteryStatus and StudentCompetencyStatus models
mgwozdz-unicon Oct 7, 2026
77aa56d
Merge pull request #851 from openedx/dependabot/github_actions/python…
feanil Oct 7, 2026
24b3f71
Merge pull request #850 from openedx/dependabot/github_actions/astral…
feanil Oct 7, 2026
5984e3e
feat: add student status models for competency criteria and groups
mgwozdz-unicon Oct 9, 2026
3e354a7
feat: edit existing tag's external_id on re-import (#804)
ufedaseyeuconsultant Oct 9, 2026
b6a58bf
fix: match openedx-platform's SIMPLE_HISTORY_DATE_INDEX setting (#853)
ufedaseyeuconsultant Oct 9, 2026
c2005ff
chore: Upgrade Python requirements (#863)
edx-requirements-bot Oct 12, 2026
afce3e7
feat: add archived field to CompetencyCriteriaGroup and CompetencyCri…
ufedaseyeuconsultant Oct 12, 2026
cd2b2a0
build: isolated_apps import-linter contract for openedx_catalog (#861)
ufedaseyeuconsultant Oct 13, 2026
ea6c179
build(deps): bump astral-sh/setup-uv from 10.2.0 to 10.3.0
dependabot[bot] Oct 13, 2026
677ab13
build(deps): bump actions/download-artifact from 8.0.1 to 8.0.2
dependabot[bot] Oct 13, 2026
bbd7212
build(deps): bump actions/upload-artifact from 7.0.1 to 7.0.2
dependabot[bot] Oct 13, 2026
a58d833
feat: add read-only REST endpoint for CBE rule profiles (#846)
javoconsultant Oct 13, 2026
fd4300e
docs: ADR for how learning packages relate to courses/runs (#812)
bradenmacdonald Oct 13, 2026
d44c12d
Merge pull request #866 from openedx/dependabot/github_actions/action…
feanil Oct 14, 2026
1117e18
Merge pull request #864 from openedx/dependabot/github_actions/astral…
feanil Oct 14, 2026
5a76b7a
Merge pull request #865 from openedx/dependabot/github_actions/action…
feanil Oct 14, 2026
8831d82
feat: add endpoint for creating competency criteria
alezconsultant Oct 15, 2026
9c23166
feat: add GET competency criteria-groups endpoint (#681)
ufedaseyeuconsultant Sep 25, 2026
8519bf2
docs: trim serializer docstrings and drop a restating comment (#681)
ufedaseyeuconsultant Sep 29, 2026
2abbe9a
docs: mark get_competency_criteria_tree as UNSTABLE (#681)
ufedaseyeuconsultant Oct 16, 2026
84b92cd
docs: name the criterion's group field as the API returns it (#681)
ufedaseyeuconsultant Oct 16, 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
6 changes: 6 additions & 0 deletions .annotation_safe_list.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@ openedx_content.Unit:
".. no_pii:": "This model has no PII"
openedx_content.UnitVersion:
".. no_pii:": "This model has no PII"
openedx_learning.HistoricalCompetencyCriteriaGroup:
".. no_pii:": "This model has no PII"
openedx_learning.HistoricalCompetencyCriterion:
".. no_pii:": "This model has no PII"
openedx_learning.HistoricalCompetencyRuleProfile:
".. no_pii:": "This model has no PII"
social_django.Association:
".. no_pii:": "This model has no PII"
social_django.Code:
Expand Down
12 changes: 0 additions & 12 deletions .coveragerc

This file was deleted.

25 changes: 12 additions & 13 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ name: Python CI

on:
push:
branches: [ main ]
branches: [main]
workflow_call:
pull_request:
branches:
- '**'
Expand All @@ -12,12 +13,14 @@ jobs:
run_tests:
name: tests
runs-on: ${{ matrix.os }}
permissions:
contents: read
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest] # Add macos-latest later?
python-version: ['3.12']
toxenv: ["django52", "package", "quality"]
toxenv: ["django52", "package", "quality", "docs"]
mysql-version: ["8"]
services:
mysql:
Expand All @@ -37,19 +40,15 @@ jobs:
--health-retries 3
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: setup python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0

- name: Install uv
uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
with:
enable-cache: true
python-version: ${{ matrix.python-version }}

- name: Install pip
run: pip install -r requirements/pip.txt

- name: Install Dependencies
run: pip install -r requirements/ci.txt
- name: Install CI dependencies
run: uv sync --locked --group ci

- name: Run Tests
env:
TOXENV: ${{ matrix.toxenv }}
run: tox -e ${{ matrix.toxenv }}

run: uv run --locked tox -e ${{ matrix.toxenv }}
29 changes: 0 additions & 29 deletions .github/workflows/lint-imports.yml

This file was deleted.

30 changes: 0 additions & 30 deletions .github/workflows/pypi-publish.yml

This file was deleted.

90 changes: 90 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Release

on:
push:
branches: [main]

jobs:
run_tests:
uses: ./.github/workflows/ci.yml
secrets: inherit
permissions:
contents: read

release:
runs-on: ubuntu-latest
needs: run_tests
if: github.ref_name == 'main'
concurrency:
group: ${{ github.workflow }}-release-${{ github.ref_name }}
cancel-in-progress: false
permissions:
contents: write
outputs:
released: ${{ steps.release.outputs.released || 'false' }}
version: ${{ steps.release.outputs.version }}

steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.ref_name }}

- run: git reset --hard ${{ github.sha }}

- name: Python Semantic Release
id: release
uses: python-semantic-release/python-semantic-release@b700dbeb1f431a0fcc30a79f3f0869407fe07278 # v10.7.0
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
git_committer_name: "github-actions"
git_committer_email: "github-actions@github.com"
changelog: "false"
# Commit, tag, push and build, but don't create the GitHub release.
# We create it ourselves in the next step so that the distributions
# are attached before the release is published. See that step for why.
vcs_release: "false"

# This repo has immutable releases enabled, which freezes a release's
# assets the moment it is published, so assets cannot be attached
# afterwards. `gh release create` handles this by creating the release as
# a draft, uploading the assets, and only then publishing it:
# https://docs.github.com/en/code-security/supply-chain-security/understanding-your-software-supply-chain/immutable-releases
- name: Publish | Create GitHub Release with Assets
if: steps.release.outputs.released == 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
RELEASE_NOTES: ${{ steps.release.outputs.release_notes }}
TAG: ${{ steps.release.outputs.tag }}
run: |
printf '%s' "$RELEASE_NOTES" > "$RUNNER_TEMP/release_notes.md"
gh release create "$TAG" \
--verify-tag \
--title "$TAG" \
--notes-file "$RUNNER_TEMP/release_notes.md" \
dist/*

- name: Upload dist artifacts
if: steps.release.outputs.released == 'true'
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
name: dist
path: dist/
if-no-files-found: error

publish_to_pypi:
runs-on: ubuntu-latest
needs: release
if: github.ref_name == 'main' && needs.release.outputs.released == 'true'
permissions:
contents: read
id-token: write

steps:
- name: Download dist artifacts
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
name: dist
path: dist/

- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
4 changes: 0 additions & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@ docs/modules.rst
docs/openedx_content.rst
docs/openedx_content.*.rst

# Private requirements
requirements/private.in
requirements/private.txt

# database file
dev.db*

Expand Down
31 changes: 27 additions & 4 deletions .importlinter
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,14 @@

[importlinter]
root_packages =
openedx_catalog
openedx_learning
openedx_content
openedx_tagging
openedx_django_lib
openedx_core
contract_types =
isolated_apps: test_utils.isolated_apps_contract.IsolatedAppsContract

# This is layering between our top-level src folders (mostly Django apps).
# This should be updated as new Django apps are added.
Expand All @@ -19,17 +22,23 @@ name = "top-level source folders are layered correctly"
type = layers
layers =
# Learning-domain features (currently CBE; Learning Pathways to follow).
# May build on content and tagging. Nothing below may import it: in
# particular, openedx_tagging must never know that CBE exists.
# May build on content, catalog and tagging. Nothing below may import it:
# in particular, openedx_tagging must never know that CBE exists.
openedx_learning

# Content: authoring-side models and APIs.
# Content: authoring-side models and APIs. May reference catalog models
# (e.g. to associate content with a CourseRun).
openedx_content

# Catalog: the enrollable things (course runs, catalog courses, pathways).
# Not aware of content; must never import openedx_content. See
# docs/openedx_catalog/decisions/0001-catalog-models-usage.rst
openedx_catalog

# Tagging is very simple & fundamental. Should probably not depend on any other Django apps.
openedx_tagging

# Django utilities. Should not dependend on any of the real apps (above).
# Django utilities. Should not depend on any of the real apps (above).
openedx_django_lib

# This just an empty shell package, to expose the __version__ number.
Expand Down Expand Up @@ -69,3 +78,17 @@ layers=
# to create Learning Packages and manage the draft and publish states for
# various types of content.
openedx_content.applets.publishing

# Mirrors openedx-platform's isolated-apps contract (see test_utils/isolated_apps_contract.py):
# code outside an isolated app may only import its public modules (api, models_api, data,
# tests). src_layering above only controls which top-level packages may depend on which.
[importlinter:contract:isolated_apps]
name = "code outside an isolated app only reaches its public API"
type = isolated_apps
isolated_apps =
openedx_catalog
allowed_modules =
api
models_api
data
tests
12 changes: 10 additions & 2 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,16 @@ version: 2
# Build documentation in the docs/ directory with Sphinx
sphinx:
configuration: docs/conf.py
fail_on_warning: true

build:
os: ubuntu-lts-latest
tools:
python: "3.12"

python:
version: 3.12
install:
- requirements: requirements/doc.txt
- method: uv
command: sync
groups:
- doc
22 changes: 0 additions & 22 deletions .readthedocs.yml

This file was deleted.

1 change: 0 additions & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
include CHANGELOG.rst
include LICENSE.txt
include README.rst
include requirements/base.in
recursive-include src *.html *.png *.gif *.js *.css *.jpg *.jpeg *.svg *.py *.yaml *.json *.csv
31 changes: 4 additions & 27 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -29,41 +29,18 @@ docs: ## generate Sphinx HTML documentation, including API docs
tox -e docs
$(BROWSER)docs/_build/html/index.html

# Define PIP_COMPILE_OPTS=-v to get more information during make upgrade.
PIP_COMPILE = pip-compile --rebuild $(PIP_COMPILE_OPTS)

compile-requirements: export CUSTOM_COMPILE_COMMAND=make upgrade
compile-requirements: ## update the requirements/*.txt files with the latest packages satisfying requirements/*.in
pip install -qr requirements/pip-tools.txt
pip install -qr requirements/pip.txt
# Make sure to compile files after any other files they include!
$(PIP_COMPILE) --allow-unsafe -o requirements/pip.txt requirements/pip.in
$(PIP_COMPILE) -o requirements/pip-tools.txt requirements/pip-tools.in
pip install -qr requirements/pip.txt
pip install -qr requirements/pip-tools.txt
$(PIP_COMPILE) -o requirements/base.txt requirements/base.in
$(PIP_COMPILE) -o requirements/test.txt requirements/test.in
$(PIP_COMPILE) -o requirements/doc.txt requirements/doc.in
$(PIP_COMPILE) -o requirements/quality.txt requirements/quality.in
$(PIP_COMPILE) -o requirements/ci.txt requirements/ci.in
$(PIP_COMPILE) -o requirements/dev.txt requirements/dev.in
# Let tox control the Django version for tests
sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp
mv requirements/test.tmp requirements/test.txt

upgrade: ## update the pip requirements files to use the latest releases satisfying our constraints
make compile-requirements PIP_COMPILE_OPTS="--upgrade"
upgrade: ## update the uv.lock file with the latest packages satisfying pyproject.toml
uv run --with edx-lint edx_lint write_uv_constraints pyproject.toml
uv lock --upgrade

quality: ## check coding style with pycodestyle and pylint
tox -e quality
lint-imports

pii_check: ## check for PII annotations on all Django models
tox -e pii_check

requirements: ## install development environment requirements
pip install -qr requirements/pip-tools.txt
pip-sync requirements/dev.txt requirements/private.*
uv sync --group dev

test: clean ## run tests in the current virtualenv
pytest tests
Expand Down
Loading