From d6259377420ad17c4d1b51f691305bc6110ec1e7 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Fri, 23 Jan 2026 13:35:06 +0500 Subject: [PATCH 01/21] chore: set version suffix to main and install plugins from github (#1343) --- requirements/plugins.txt | 28 ++++++++++++++-------------- tutor/__about__.py | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/requirements/plugins.txt b/requirements/plugins.txt index 2cf7cc71ed..9a5e86a293 100644 --- a/requirements/plugins.txt +++ b/requirements/plugins.txt @@ -1,14 +1,14 @@ -# change version ranges when upgrading from ulmo -tutor-android>=21.0.0,<22.0.0 -tutor-cairn>=21.0.0,<22.0.0 -tutor-credentials>=21.0.0,<22.0.0 -tutor-discovery>=21.0.0,<22.0.0 -tutor-deck>=21.0.0,<22.0.0 -tutor-forum>=21.0.0,<22.0.0 -tutor-indigo>=21.0.0,<22.0.0 -tutor-jupyter>=21.0.0,<22.0.0 -tutor-livedeps>=21.0.0,<22.0.0 -tutor-mfe>=21.0.0,<22.0.0 -tutor-minio>=21.0.0,<22.0.0 -tutor-notes>=21.0.0,<22.0.0 -tutor-xqueue>=21.0.0,<22.0.0 +# For Tutor Main, we install plugins from their main branches instead of from PyPI +tutor-android@git+https://github.com/overhangio/tutor-android@main +tutor-cairn@git+https://github.com/overhangio/tutor-cairn@main +tutor-credentials@git+https://github.com/overhangio/tutor-credentials@main +tutor-deck@git+https://github.com/overhangio/tutor-deck@main +tutor-discovery@git+https://github.com/overhangio/tutor-discovery@main +tutor-forum@git+https://github.com/overhangio/tutor-forum@main +tutor-indigo@git+https://github.com/overhangio/tutor-indigo@main +tutor-jupyter@git+https://github.com/overhangio/tutor-jupyter@main +tutor-livedeps@git+https://github.com/overhangio/tutor-livedeps@main +tutor-mfe@git+https://github.com/overhangio/tutor-mfe@main +tutor-minio@git+https://github.com/overhangio/tutor-minio@main +tutor-notes@git+https://github.com/overhangio/tutor-notes@main +tutor-xqueue@git+https://github.com/overhangio/tutor-xqueue@main diff --git a/tutor/__about__.py b/tutor/__about__.py index aa0aa8ee4d..a5becddf8f 100644 --- a/tutor/__about__.py +++ b/tutor/__about__.py @@ -10,7 +10,7 @@ # the main branch. # The suffix is cleanly separated from the __version__ in this module to avoid # conflicts when merging branches. -__version_suffix__ = "" +__version_suffix__ = "main" # The app name will be used to define the name of the default tutor root and # plugin directory. To avoid conflicts between multiple locally-installed From ee0800a612ff170318bcdf8413db66def02f3825 Mon Sep 17 00:00:00 2001 From: Feanil Patel Date: Fri, 30 Jan 2026 09:56:59 -0500 Subject: [PATCH 02/21] chore: update pyenv and default python version. (#1335) --- changelog.d/20260121_123520_feanil_patch_2.md | 13 +++++++++++++ tutor/templates/build/openedx/Dockerfile | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 changelog.d/20260121_123520_feanil_patch_2.md diff --git a/changelog.d/20260121_123520_feanil_patch_2.md b/changelog.d/20260121_123520_feanil_patch_2.md new file mode 100644 index 0000000000..9a5910fe30 --- /dev/null +++ b/changelog.d/20260121_123520_feanil_patch_2.md @@ -0,0 +1,13 @@ + + + + + +[Improvement] Update to use Python 3.12 for edx-platform diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile index b99473af5e..40f7c230bb 100644 --- a/tutor/templates/build/openedx/Dockerfile +++ b/tutor/templates/build/openedx/Dockerfile @@ -29,9 +29,9 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ # Install pyenv # https://www.python.org/downloads/ # https://github.com/pyenv/pyenv/releases -ARG PYTHON_VERSION=3.11.8 +ARG PYTHON_VERSION=3.12.12 ENV PYENV_ROOT=/opt/pyenv -RUN git clone https://github.com/pyenv/pyenv $PYENV_ROOT --branch v2.3.36 --depth 1 +RUN git clone https://github.com/pyenv/pyenv $PYENV_ROOT --branch v2.6.18 --depth 1 # Install Python RUN $PYENV_ROOT/bin/pyenv install $PYTHON_VERSION From e72ddf1e9cbaaea6b95818f97cf9f999b88adcb6 Mon Sep 17 00:00:00 2001 From: Kshitij Sobti Date: Wed, 25 Feb 2026 14:56:40 +0530 Subject: [PATCH 03/21] feat: Add ENV_SAVED Action (#1302) Adds an ENV_SAVED Action hook that allows hooking into the save mechanism and running custom code after saving an environemnt. --- .../20251111_011520_kshitij_env_saved_action.md | 2 ++ tutor/env.py | 9 +++++++++ tutor/hooks/catalog.py | 10 ++++++++++ 3 files changed, 21 insertions(+) create mode 100644 changelog.d/20251111_011520_kshitij_env_saved_action.md diff --git a/changelog.d/20251111_011520_kshitij_env_saved_action.md b/changelog.d/20251111_011520_kshitij_env_saved_action.md new file mode 100644 index 0000000000..6359072d86 --- /dev/null +++ b/changelog.d/20251111_011520_kshitij_env_saved_action.md @@ -0,0 +1,2 @@ +- [Feature] Add ENV_SAVED Action that allows hooks to run after a save + operation. (by @xitij2000) diff --git a/tutor/env.py b/tutor/env.py index ecd0f5b83d..ad965345a9 100644 --- a/tutor/env.py +++ b/tutor/env.py @@ -342,6 +342,15 @@ def save(root: str, config: Config) -> None: save_all_from(src, os.path.join(root_env, dst), config) upgrade_obsolete(root) + + config_copy = deepcopy(config) + hooks.Actions.ENV_SAVED.do(root_env, config_copy) + if config_copy != config: + fmt.echo_alert( + "A plugin just modified the config during the ENV_SAVED hook. " + "This could have unintended consequences." + ) + fmt.echo_info(f"Environment generated in {base_dir(root)}") diff --git a/tutor/hooks/catalog.py b/tutor/hooks/catalog.py index cca622c67a..d72f18320b 100644 --- a/tutor/hooks/catalog.py +++ b/tutor/hooks/catalog.py @@ -94,6 +94,16 @@ def run_this_on_start(root, config, name): #: :parameter kwargs: job named arguments. DO_JOB: Action[[str, Any]] = Action() + #: This action is called at the end of the tutor.env.save function after all + #: the changes to the environment have been applied, all obsolete config has + #: been upgraded. + #: Modifying the config object will not trigger changes in the configuration. + #: For all purposes, it should be considered read-only. + #: + #: :parameter str root: project root. + #: :parameter dict config: project configuration. + ENV_SAVED: Action[[str, Config]] = Action() + #: Triggered when a single plugin needs to be loaded. Only plugins that have previously been #: discovered can be loaded (see :py:data:`CORE_READY`). #: From fcf8010756a8efeb5c04d67c99011208e963d3ad Mon Sep 17 00:00:00 2001 From: Syed Ali Abbas Date: Wed, 29 Apr 2026 13:40:22 +0500 Subject: [PATCH 04/21] Chore: Drop Python 3.9 and add support for Python 3.14 (#1369) * feat: upgrade Python version support to 3.13 and 3.14, drop EOL 3.9 - Update requires-python to >= 3.10 (drop EOL Python 3.9) - Add Python 3.13 and 3.14 classifiers to pyproject.toml - Update CI matrix from ['3.9', '3.12'] to ['3.10', '3.14'] - Update requirements/base.txt pip-compile header to Python 3.10 - Add changelog entry Co-Authored-By: Claude Sonnet 4.6 * Fixed sphinx issues with python 3.14 * Updated Changelog * ci: replace python 3.9 with 3.10 in release workflow --------- Co-authored-by: Claude Sonnet 4.6 --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 2 +- ...415_114034_ali.abbas02_python_version_upgrade_latest.md | 1 + docs/conf.py | 2 ++ pyproject.toml | 5 +++-- requirements/base.txt | 2 +- requirements/docs.txt | 7 ++++--- 7 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a24d45ca96..402c7606b9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -38,7 +38,7 @@ jobs: # https://github.com/actions/setup-python uses: actions/setup-python@v5 with: - python-version: 3.9 + python-version: 3.10 cache: 'pip' cache-dependency-path: requirements/dev.txt - name: Install Hatch diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 00aa1ed986..a5d4a838e8 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.9', '3.12'] + python-version: ['3.10', '3.14'] steps: - uses: actions/checkout@v3 - name: Set up Python diff --git a/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md b/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md new file mode 100644 index 0000000000..c585d70f16 --- /dev/null +++ b/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md @@ -0,0 +1 @@ +- [Improvement] Add Python 3.13 and 3.14 support. Drop Python 3.9 (end-of-life). Update CI matrix from Python 3.9/3.12 to 3.10/3.14. Update `requires-python` to `>= 3.10`. Use `sphinx>=9.1.0` for Python 3.14+ and `sphinx>=7.4.7` for Python 3.10 to account for Sphinx 9.x dropping Python 3.10 support. (by @Syed-Ali-Abbas-568) diff --git a/docs/conf.py b/docs/conf.py index e7dd7fb66a..58d5e26a61 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -83,6 +83,8 @@ # https://github.com/emdgroup/baybe/pull/67 "Action": "tutor.core.hooks.actions.Action", "Filter": "tutor.core.hooks.filters.Filter", + # Python 3.14 + "ActionCallbackFunc": "tutor.core.hooks.actions.ActionCallbackFunc", } diff --git a/pyproject.toml b/pyproject.toml index 52a14e1732..207b975ad6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,17 +9,18 @@ authors = [ ] description = "The Docker-based Open edX distribution designed for peace of mind" readme = {file = "README.rst", content-type = "text/x-rst"} -requires-python = ">= 3.9" +requires-python = ">= 3.10" classifiers = [ "Development Status :: 5 - Production/Stable", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Affero General Public License v3", "Operating System :: OS Independent", "Programming Language :: Python", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] # these fields will be set by hatch_build.py dynamic = ["version", "dependencies", "optional-dependencies"] diff --git a/requirements/base.txt b/requirements/base.txt index 89253e4338..36b6c7baa2 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.10 # by the following command: # # pip-compile requirements/base.in diff --git a/requirements/docs.txt b/requirements/docs.txt index 63ae24a19c..22e6940d72 100644 --- a/requirements/docs.txt +++ b/requirements/docs.txt @@ -123,17 +123,18 @@ six==1.17.0 # python-dateutil snowballstemmer==3.0.1 # via sphinx -sphinx==7.4.7 +sphinx>=9.1.0; python_version >= "3.14" +sphinx==7.4.7; python_version < "3.14" # via # -r docs.in # sphinx-click # sphinx-rtd-theme # sphinxcontrib-jquery -sphinx-click==6.0.0 +sphinx-click>=6.1.0 # via -r docs.in sphinx-reredirects==0.1.5 # via -r docs.in -sphinx-rtd-theme==3.0.2 +sphinx-rtd-theme==3.1.0 # via -r docs.in sphinxcontrib-applehelp==2.0.0 # via sphinx From 6d6c9526b83563f989d4d16c0c86465daa57eca6 Mon Sep 17 00:00:00 2001 From: Steven Giron <57727342+Gi-ron@users.noreply.github.com> Date: Fri, 17 Apr 2026 06:27:24 -0500 Subject: [PATCH 05/21] fix: apply upstream security patch to remove activation_key exposure from account API (#1366) --- CHANGELOG.md | 5 +++++ tutor/__about__.py | 2 +- tutor/templates/build/openedx/Dockerfile | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa96e0f848..e4616e86d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,11 @@ instructions, because git commits are used to generate release notes: + +## v21.0.4 (2026-04-10) + +- [Security] Backport fix to remove `activation_key` exposure from `/api/user/v1/accounts/{username}`, preventing email verification bypass via OAuth2 password grant flow (source: upstream edx-platform commit 21cead238466ca398ba368518f1d3288431d68f4). + ## v21.0.3 (2026-04-09) diff --git a/tutor/__about__.py b/tutor/__about__.py index 777327b617..f0f1ecb40a 100644 --- a/tutor/__about__.py +++ b/tutor/__about__.py @@ -2,7 +2,7 @@ # Increment this version number to trigger a new release. See # docs/tutor.html#versioning for information on the versioning scheme. -__version__ = "21.0.3" +__version__ = "21.0.4" # The version suffix will be appended to the actual version, separated by a # dash. Use this suffix to differentiate between the actual released version and diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile index 3cd893359a..64f5df9331 100644 --- a/tutor/templates/build/openedx/Dockerfile +++ b/tutor/templates/build/openedx/Dockerfile @@ -64,6 +64,9 @@ RUN git config --global user.email "tutor@overhang.io" \ {# RUN curl -fsSL https://github.com/openedx/edx-platform/commit/.patch | git am #} {# Include a comment on why the patch is neccessary. #} +# SECURITY FIX: remove activation_key exposure from account API +RUN curl -fsSL https://github.com/openedx/openedx-platform/commit/21cead238466ca398ba368518f1d3288431d68f4.patch | git am + {{ patch("openedx-dockerfile-post-git-checkout") }} ##### Empty layer with just the repo at the root. From 1685f3e22d966b1129944525e3cf8b3d2f639672 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Thu, 23 Apr 2026 23:40:18 +0530 Subject: [PATCH 06/21] chore: update the reindex command (#1374) This commands now schdules a celery task to populate the index on launch and upgrade. Signed-off-by: Farhaan Bukhsh --- tutor/templates/jobs/init/cms.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tutor/templates/jobs/init/cms.sh b/tutor/templates/jobs/init/cms.sh index cb38d6d1c6..a623f9ccbb 100644 --- a/tutor/templates/jobs/init/cms.sh +++ b/tutor/templates/jobs/init/cms.sh @@ -13,11 +13,11 @@ if [ -d /openedx/data/uploads/ ]; then fi fi -# Create the index for studio and courseware content. Because we specify --init, -# this will not populate the index (potentially slow) nor replace any existing -# index (resulting in broken features until it is complete). If either of those -# are necessary, it will print instructions on what command to run to do so. -./manage.py cms reindex_studio --experimental --init +# Schedule Studio search index population. Index creation and configuration +# are already handled by the post_migrate signal during `cms migrate` above; +# this enqueues a Celery task that cms-worker consumes to populate the index +# incrementally in the background. +./manage.py cms reindex_studio # Create the courseware content index ./manage.py cms reindex_course --active From d46c814c6f96bc133cf843f33397e06ae4fdebec Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Wed, 29 Apr 2026 18:46:33 +0500 Subject: [PATCH 07/21] fix: apply activation_key security patch only in release mode (#1376) The security patch added in #1366 fails when building against main/master edx-platform because the upstream commit is already present in master, so git am fails with "patch already applied". Move the RUN command inside the non-Main (Release mode) branch of the existing TUTOR_BRANCH_IS_MAIN conditional so it only applies when building from a release branch of edx-platform. Follow-up to #1366. Co-authored-by: Claude Opus 4.6 --- tutor/templates/build/openedx/Dockerfile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile index 64f5df9331..c2ce787d7e 100644 --- a/tutor/templates/build/openedx/Dockerfile +++ b/tutor/templates/build/openedx/Dockerfile @@ -58,15 +58,15 @@ RUN git config --global user.email "tutor@overhang.io" \ # Patches in Main node {%- else %} # Patches in non-Main mode (i.e., Release mode) + +# SECURITY FIX: remove activation_key exposure from account API +RUN curl -fsSL https://github.com/openedx/openedx-platform/commit/21cead238466ca398ba368518f1d3288431d68f4.patch | git am {%- endif %} {# Add new patches like this: #} {# RUN curl -fsSL https://github.com/openedx/edx-platform/commit/.patch | git am #} {# Include a comment on why the patch is neccessary. #} -# SECURITY FIX: remove activation_key exposure from account API -RUN curl -fsSL https://github.com/openedx/openedx-platform/commit/21cead238466ca398ba368518f1d3288431d68f4.patch | git am - {{ patch("openedx-dockerfile-post-git-checkout") }} ##### Empty layer with just the repo at the root. From 547244015a96600c88b6562b6acad168f4710307 Mon Sep 17 00:00:00 2001 From: Muhammad Adeel Tajamul <77053848+muhammadadeeltajamul@users.noreply.github.com> Date: Thu, 30 Apr 2026 13:21:22 +0500 Subject: [PATCH 08/21] fix: fixed wrong lms_host (#1375) --- ...20260429_fixed_wrong_host_on_dev_launch.md | 1 + tutor/commands/compose.py | 2 ++ tutor/interactive.py | 21 ++++++++++++------- 3 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 changelog.d/20260429_fixed_wrong_host_on_dev_launch.md diff --git a/changelog.d/20260429_fixed_wrong_host_on_dev_launch.md b/changelog.d/20260429_fixed_wrong_host_on_dev_launch.md new file mode 100644 index 0000000000..021f9606d9 --- /dev/null +++ b/changelog.d/20260429_fixed_wrong_host_on_dev_launch.md @@ -0,0 +1 @@ +- [Bugfix] Fixes wrong LMS_HOST when `tutor dev launch -I` is executed. After this change, it will set to `local.openedx.io` instead of `www.myopenedx.com` (by @muhammadadeeltajamul) diff --git a/tutor/commands/compose.py b/tutor/commands/compose.py index 5aab55ebb0..822ba5deac 100644 --- a/tutor/commands/compose.py +++ b/tutor/commands/compose.py @@ -228,6 +228,8 @@ def interactive_configuration( config, run_for_prod=run_for_prod, ) + elif not run_for_prod: + interactive_config.set_run_mode_defaults(config) tutor_config.save_config_file(context.obj.root, config) config = tutor_config.load_full(context.obj.root) tutor_env.save(context.obj.root, config) diff --git a/tutor/interactive.py b/tutor/interactive.py index 9a769bb833..c8ccd1ed36 100644 --- a/tutor/interactive.py +++ b/tutor/interactive.py @@ -7,6 +7,16 @@ from .types import Config, get_typed +def set_run_mode_defaults(config: Config) -> None: + dev_values: Config = { + "LMS_HOST": "local.openedx.io", + "CMS_HOST": "studio.local.openedx.io", + "ENABLE_HTTPS": False, + } + for key, value in dev_values.items(): + config[key] = value + + def ask_questions(config: Config, run_for_prod: Optional[bool] = None) -> None: """ Interactively ask questions to collect configuration values from the user. @@ -34,17 +44,12 @@ def ask_questions(config: Config, run_for_prod: Optional[bool] = None) -> None: default=run_for_prod, ) if not run_for_prod: - dev_values: Config = { - "LMS_HOST": "local.openedx.io", - "CMS_HOST": "studio.local.openedx.io", - "ENABLE_HTTPS": False, - } + set_run_mode_defaults(config) fmt.echo_info( """As you are not running this platform in production, we automatically set the following configuration values:""" ) - for k, v in dev_values.items(): - config[k] = v - fmt.echo_info(f" {k} = {v}") + for key in ["LMS_HOST", "CMS_HOST", "ENABLE_HTTPS"]: + fmt.echo_info(f" {key} = {config[key]}") else: ask("Your website domain name for students (LMS)", "LMS_HOST", config, defaults) lms_host = get_typed(config, "LMS_HOST", str) From e071d1b5ed2552e1aa99f06c4475bf6100ae9124 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Tue, 2 Jun 2026 16:59:25 +0500 Subject: [PATCH 09/21] Mark Python version upgrade changelog entry as breaking change. (#1395) --- ...20260415_114034_ali.abbas02_python_version_upgrade_latest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md b/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md index c585d70f16..0fccd14f53 100644 --- a/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md +++ b/changelog.d/20260415_114034_ali.abbas02_python_version_upgrade_latest.md @@ -1 +1 @@ -- [Improvement] Add Python 3.13 and 3.14 support. Drop Python 3.9 (end-of-life). Update CI matrix from Python 3.9/3.12 to 3.10/3.14. Update `requires-python` to `>= 3.10`. Use `sphinx>=9.1.0` for Python 3.14+ and `sphinx>=7.4.7` for Python 3.10 to account for Sphinx 9.x dropping Python 3.10 support. (by @Syed-Ali-Abbas-568) +- 💥[Improvement] Add Python 3.13 and 3.14 support. Drop Python 3.9 (end-of-life). Update CI matrix from Python 3.9/3.12 to 3.10/3.14. Update `requires-python` to `>= 3.10`. Use `sphinx>=9.1.0` for Python 3.14+ and `sphinx>=7.4.7` for Python 3.10 to account for Sphinx 9.x dropping Python 3.10 support. (by @Syed-Ali-Abbas-568) From 4842f1b15243c1b6074fa308cafd0bd79ca9e2b8 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Wed, 3 Jun 2026 14:54:00 +0500 Subject: [PATCH 10/21] fix: ignore Python 3.14 TypeVar references in docs build (#1396) On Python 3.14, sphinx autodoc emits TypeVar references as py:obj with the typing.~T short-name form, which has no resolvable target. The existing nitpick_ignore only covered py:class. Add the missing py:obj entries so 'make docs' passes on 3.14. --- docs/conf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/conf.py b/docs/conf.py index 58d5e26a61..35a7832b42 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -58,6 +58,10 @@ # ParamSpec objects are not classes but may be referenced as such ("py:class", "tutor.core.hooks.actions.T"), ("py:class", "typing_extensions.ParamSpec"), + # Python 3.14: TypeVar references in autodoc are emitted as py:obj with + # the `typing.~T` short-name form, which has no resolvable target. + ("py:obj", "typing.~T"), + ("py:obj", "typing.~T2"), ] # Even outside nitpicky mode, some type-hint rendering can produce "ref.class" From e38050614a3bd16d8d93d0bdf190117366b02312 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Mon, 15 Jun 2026 21:23:42 +0500 Subject: [PATCH 11/21] chore: upgrade MongoDB to v7.0.35 (#1402) Latest patch on the 7.0 line, pulling in upstream security fixes. Open edX Verawood tests against MongoDB 7.0 and pins pymongo==4.4.0 (which predates 8.0 server support), so we remain on 7.0. A future 7.0 -> 8.0 jump is tracked separately as it needs FCV-stepping logic. Refs overhangio/tutor#1400 Co-authored-by: Claude Opus 4.8 (1M context) --- changelog.d/20260611_upgrade_mongodb.md | 1 + tutor/templates/config/defaults.yml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/20260611_upgrade_mongodb.md diff --git a/changelog.d/20260611_upgrade_mongodb.md b/changelog.d/20260611_upgrade_mongodb.md new file mode 100644 index 0000000000..264f043999 --- /dev/null +++ b/changelog.d/20260611_upgrade_mongodb.md @@ -0,0 +1 @@ +- [Security] Upgrade MongoDB to v7.0.35 to pull in upstream security patches, remaining on the 7.0 line that Open edX tests against. (by @ahmed-arb) diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml index 1b0f6bb0d3..0bc1ccbdf3 100644 --- a/tutor/templates/config/defaults.yml +++ b/tutor/templates/config/defaults.yml @@ -19,7 +19,7 @@ DOCKER_IMAGE_CADDY: "docker.io/caddy:2.7.4" # https://hub.docker.com/r/getmeili/meilisearch/tags DOCKER_IMAGE_MEILISEARCH: "docker.io/getmeili/meilisearch:v1.8.4" # https://hub.docker.com/_/mongo/tags -DOCKER_IMAGE_MONGODB: "docker.io/mongo:7.0.28" +DOCKER_IMAGE_MONGODB: "docker.io/mongo:7.0.35" # https://hub.docker.com/_/mysql/tags DOCKER_IMAGE_MYSQL: "docker.io/mysql:8.4.0" DOCKER_IMAGE_PERMISSIONS: "{{ DOCKER_REGISTRY }}overhangio/openedx-permissions:{{ TUTOR_VERSION }}" From d9c488bb001af6a818fff1d01bdaca0d6d154afd Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Mon, 15 Jun 2026 21:25:33 +0500 Subject: [PATCH 12/21] chore: upgrade MySQL to v8.4.9 (#1401) --- changelog.d/20260611_upgrade_mysql.md | 1 + docs/configuration.rst | 2 +- tests/commands/test_images.py | 2 +- tutor/templates/config/defaults.yml | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 changelog.d/20260611_upgrade_mysql.md diff --git a/changelog.d/20260611_upgrade_mysql.md b/changelog.d/20260611_upgrade_mysql.md new file mode 100644 index 0000000000..38d3bc66e5 --- /dev/null +++ b/changelog.d/20260611_upgrade_mysql.md @@ -0,0 +1 @@ +- [Improvement] Upgrade MySQL to v8.4.9, the latest patch on the 8.4 LTS line. (by @ahmed-arb) diff --git a/docs/configuration.rst b/docs/configuration.rst index 2f4bfdfb69..97a6845945 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -81,7 +81,7 @@ This configuration parameter defines which MongoDB Docker image to use. .. https://hub.docker.com/_/mysql/tags?page=1&name=8.0 -- ``DOCKER_IMAGE_MYSQL`` (default: ``"docker.io/mysql:8.4.0"``) +- ``DOCKER_IMAGE_MYSQL`` (default: ``"docker.io/mysql:8.4.9"``) This configuration parameter defines which MySQL Docker image to use. diff --git a/tests/commands/test_images.py b/tests/commands/test_images.py index 74aaa07a70..81008530f8 100644 --- a/tests/commands/test_images.py +++ b/tests/commands/test_images.py @@ -49,7 +49,7 @@ def test_images_pull_all_vendor_images(self, image_pull: Mock) -> None: self.assertIsNone(result.exception) self.assertEqual(0, result.exit_code) # Note: we should update this tag whenever the mysql image is updated - image_pull.assert_called_once_with("docker.io/mysql:8.4.0") + image_pull.assert_called_once_with("docker.io/mysql:8.4.9") def test_images_printtag_image(self) -> None: result = self.invoke(["images", "printtag", "openedx"]) diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml index 0bc1ccbdf3..e46083a981 100644 --- a/tutor/templates/config/defaults.yml +++ b/tutor/templates/config/defaults.yml @@ -21,7 +21,7 @@ DOCKER_IMAGE_MEILISEARCH: "docker.io/getmeili/meilisearch:v1.8.4" # https://hub.docker.com/_/mongo/tags DOCKER_IMAGE_MONGODB: "docker.io/mongo:7.0.35" # https://hub.docker.com/_/mysql/tags -DOCKER_IMAGE_MYSQL: "docker.io/mysql:8.4.0" +DOCKER_IMAGE_MYSQL: "docker.io/mysql:8.4.9" DOCKER_IMAGE_PERMISSIONS: "{{ DOCKER_REGISTRY }}overhangio/openedx-permissions:{{ TUTOR_VERSION }}" # https://hub.docker.com/_/redis/tags DOCKER_IMAGE_REDIS: "docker.io/redis:7.4.5" From 0a57c2658bbfc41c2827813d2c80f64ebc392903 Mon Sep 17 00:00:00 2001 From: Danyal Faheem Date: Tue, 16 Jun 2026 19:28:40 +0500 Subject: [PATCH 13/21] chore: use py310 instead of py39 in smoke ci as it has reached eol (#1406) --- .github/workflows/smoke-k8s.yml | 3 +-- .github/workflows/smoke.yml | 3 +-- changelog.d/20260616_192205_danyalfaheem_py39depr_ci.md | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 changelog.d/20260616_192205_danyalfaheem_py39depr_ci.md diff --git a/.github/workflows/smoke-k8s.yml b/.github/workflows/smoke-k8s.yml index 69b6a1774f..6b98e6d493 100644 --- a/.github/workflows/smoke-k8s.yml +++ b/.github/workflows/smoke-k8s.yml @@ -38,8 +38,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v6 with: - # TODO: Update to 3.10 in main as 3.9 is EOL - python-version: "3.9" + python-version: "3.10" # kind is preferred over minikube for CI: no VM overhead (~300 MB for # control-plane vs ~2 GB), no tunnel daemon needed for LoadBalancer, and diff --git a/.github/workflows/smoke.yml b/.github/workflows/smoke.yml index 66dbe8918f..4d668388a1 100644 --- a/.github/workflows/smoke.yml +++ b/.github/workflows/smoke.yml @@ -37,8 +37,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v6 with: - # TODO: Update to 3.10 in main as 3.9 is EOL - python-version: "3.9" + python-version: "3.10" - name: Install tutor run: pip install -e .[dev] diff --git a/changelog.d/20260616_192205_danyalfaheem_py39depr_ci.md b/changelog.d/20260616_192205_danyalfaheem_py39depr_ci.md new file mode 100644 index 0000000000..42ad1f3f1d --- /dev/null +++ b/changelog.d/20260616_192205_danyalfaheem_py39depr_ci.md @@ -0,0 +1 @@ +- [Improvement] Run smoke workflows on Python 3.10 instead of 3.9 as it has reached EOL. (by @Danyal-Faheem) \ No newline at end of file From d35b2f1783962769b25fefef39f50335da7fbfb0 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Tue, 30 Jun 2026 02:17:47 +0500 Subject: [PATCH 14/21] Upgrade Caddy, Redis, Python and Node (#1403) * chore: upgrade Caddy, Redis, Python, and Node Routine bumps to the latest stable patch on each current line: - Caddy 2.7.4 -> 2.11.4 - Redis 7.4.5 -> 7.4.9 (latest 7.4 patch; security fixes) - Python 3.12.12 -> 3.12.13 - Node.js 24.12.0 -> 24.16.0 Refs overhangio/tutor#1400 Co-Authored-By: Claude Opus 4.8 (1M context) * chore: drop Meilisearch from the bundle and fix the pyenv pin - Revert Meilisearch to v1.8.4; the v1.36 upgrade changes the on-disk index format and needs its own migration, handled in a separate PR - Bump pyenv to v2.7.2 so Python 3.12.13 has a build definition (v2.6.18 lacks it, breaking `tutor images build openedx`) - Remove Meilisearch from the changelog entry - Document Caddy v2.11.4 and Redis v7.4.9 in the configuration reference --------- Co-authored-by: Claude Opus 4.8 (1M context) Co-authored-by: HammadYousaf01 --- changelog.d/20260611_upgrade_dependencies.md | 2 ++ docs/configuration.rst | 4 ++-- tutor/templates/build/openedx/Dockerfile | 6 +++--- tutor/templates/config/defaults.yml | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 changelog.d/20260611_upgrade_dependencies.md diff --git a/changelog.d/20260611_upgrade_dependencies.md b/changelog.d/20260611_upgrade_dependencies.md new file mode 100644 index 0000000000..2200961ce9 --- /dev/null +++ b/changelog.d/20260611_upgrade_dependencies.md @@ -0,0 +1,2 @@ +- [Improvement] Upgrade Caddy to v2.11.4 and Redis to v7.4.9. (by @ahmed-arb) +- [Improvement] Upgrade Python to v3.12.13 and Node.js to v24.16.0 in the Open edX Docker image. (by @ahmed-arb) diff --git a/docs/configuration.rst b/docs/configuration.rst index 97a6845945..baf88a168b 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -67,7 +67,7 @@ This configuration parameter defines the name of the Docker image to run the dev .. https://hub.docker.com/r/devture/exim-relay/tags -- ``DOCKER_IMAGE_CADDY`` (default: ``"docker.io/caddy:2.6.2"``) +- ``DOCKER_IMAGE_CADDY`` (default: ``"docker.io/caddy:2.11.4"``) This configuration parameter defines which Caddy Docker image to use. @@ -87,7 +87,7 @@ This configuration parameter defines which MySQL Docker image to use. .. https://hub.docker.com/_/redis/tags -- ``DOCKER_IMAGE_REDIS`` (default: ``"docker.io/redis:7.4.5"``) +- ``DOCKER_IMAGE_REDIS`` (default: ``"docker.io/redis:7.4.9"``) This configuration parameter defines which Redis Docker image to use. diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile index 1b20bb4bf4..99036293b3 100644 --- a/tutor/templates/build/openedx/Dockerfile +++ b/tutor/templates/build/openedx/Dockerfile @@ -29,9 +29,9 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ # Install pyenv # https://www.python.org/downloads/ # https://github.com/pyenv/pyenv/releases -ARG PYTHON_VERSION=3.12.12 +ARG PYTHON_VERSION=3.12.13 ENV PYENV_ROOT=/opt/pyenv -RUN git clone https://github.com/pyenv/pyenv $PYENV_ROOT --branch v2.6.18 --depth 1 +RUN git clone https://github.com/pyenv/pyenv $PYENV_ROOT --branch v2.7.2 --depth 1 # Install Python RUN $PYENV_ROOT/bin/pyenv install $PYTHON_VERSION @@ -139,7 +139,7 @@ ENV PATH=/openedx/nodeenv/bin:/openedx/venv/bin:${PATH} # Install nodeenv with the version provided by edx-platform # https://github.com/openedx/edx-platform/blob/master/requirements/edx/assets.txt RUN $PIP_COMMAND install nodeenv==1.9.1 -RUN nodeenv /openedx/nodeenv --node=24.12.0 --prebuilt +RUN nodeenv /openedx/nodeenv --node=24.16.0 --prebuilt # Install nodejs requirements ARG NPM_REGISTRY={{ NPM_REGISTRY }} diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml index e46083a981..06a41d0cf1 100644 --- a/tutor/templates/config/defaults.yml +++ b/tutor/templates/config/defaults.yml @@ -15,7 +15,7 @@ DOCKER_REGISTRY: "docker.io/" DOCKER_IMAGE_OPENEDX: "{{ DOCKER_REGISTRY }}overhangio/openedx:{{ TUTOR_VERSION }}" DOCKER_IMAGE_OPENEDX_DEV: "openedx-dev:{{ TUTOR_VERSION }}" # https://hub.docker.com/_/caddy/tags -DOCKER_IMAGE_CADDY: "docker.io/caddy:2.7.4" +DOCKER_IMAGE_CADDY: "docker.io/caddy:2.11.4" # https://hub.docker.com/r/getmeili/meilisearch/tags DOCKER_IMAGE_MEILISEARCH: "docker.io/getmeili/meilisearch:v1.8.4" # https://hub.docker.com/_/mongo/tags @@ -24,7 +24,7 @@ DOCKER_IMAGE_MONGODB: "docker.io/mongo:7.0.35" DOCKER_IMAGE_MYSQL: "docker.io/mysql:8.4.9" DOCKER_IMAGE_PERMISSIONS: "{{ DOCKER_REGISTRY }}overhangio/openedx-permissions:{{ TUTOR_VERSION }}" # https://hub.docker.com/_/redis/tags -DOCKER_IMAGE_REDIS: "docker.io/redis:7.4.5" +DOCKER_IMAGE_REDIS: "docker.io/redis:7.4.9" # https://hub.docker.com/r/devture/exim-relay/tags DOCKER_IMAGE_SMTP: "docker.io/devture/exim-relay:4.96-r1-0" EDX_PLATFORM_REPOSITORY: "https://github.com/openedx/edx-platform.git" From 02b5711f4d14dbd3ffbcf03ab9fc34f7a1b1eb64 Mon Sep 17 00:00:00 2001 From: Hammad Yousaf Date: Tue, 14 Jul 2026 13:23:42 +0500 Subject: [PATCH 15/21] chore: upgrade Meilisearch to v1.36.0 (#1428) --- changelog.d/20260713_upgrade_meilisearch.md | 12 ++++++++++++ docs/configuration.rst | 2 +- tutor/templates/config/defaults.yml | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 changelog.d/20260713_upgrade_meilisearch.md diff --git a/changelog.d/20260713_upgrade_meilisearch.md b/changelog.d/20260713_upgrade_meilisearch.md new file mode 100644 index 0000000000..d42667d194 --- /dev/null +++ b/changelog.d/20260713_upgrade_meilisearch.md @@ -0,0 +1,12 @@ +- 💥[Improvement] Upgrade Meilisearch to v1.36.0. This changes the on-disk index format, so v1.36.0 refuses to start on a database created by v1.8.4: the container restart-loops with a "database version (1.8.4) is incompatible with your current engine version (1.36.0)" error. Meilisearch is only a derived index in Open edX and never a source of truth, so the existing index must be discarded and rebuilt after upgrading. Stop the platform, delete `data/meilisearch/data.ms`, then re-run initialisation and reindex: (by @HammadYousaf01) + + tutor local stop + rm -rf "$(tutor config printroot)/data/meilisearch/data.ms" + tutor local start -d + tutor local do init + tutor local exec cms ./manage.py cms reindex_studio + tutor local exec cms ./manage.py cms reindex_course --active + +- On a large site, the reindex takes a while and search stays incomplete until it finishes, so plan a maintenance window. + +- Rolling back is not just reverting the image tag. Because the format only moves forward, v1.8.4 cannot read a v1.36.0 database either, so you also need to restore your pre-upgrade data/meilisearch/data.ms backup. \ No newline at end of file diff --git a/docs/configuration.rst b/docs/configuration.rst index baf88a168b..9f948d5eb6 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -71,7 +71,7 @@ This configuration parameter defines the name of the Docker image to run the dev This configuration parameter defines which Caddy Docker image to use. -- ``DOCKER_IMAGE_MEILISEARCH`` (default: ``"docker.io/getmeili/meilisearch:v1.8.4"``) +- ``DOCKER_IMAGE_MEILISEARCH`` (default: ``"docker.io/getmeili/meilisearch:v1.36.0"``) This configuration parameter defines which Meilisearch Docker image to use. diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml index 06a41d0cf1..ad9d9a22b1 100644 --- a/tutor/templates/config/defaults.yml +++ b/tutor/templates/config/defaults.yml @@ -17,7 +17,7 @@ DOCKER_IMAGE_OPENEDX_DEV: "openedx-dev:{{ TUTOR_VERSION }}" # https://hub.docker.com/_/caddy/tags DOCKER_IMAGE_CADDY: "docker.io/caddy:2.11.4" # https://hub.docker.com/r/getmeili/meilisearch/tags -DOCKER_IMAGE_MEILISEARCH: "docker.io/getmeili/meilisearch:v1.8.4" +DOCKER_IMAGE_MEILISEARCH: "docker.io/getmeili/meilisearch:v1.36.0" # https://hub.docker.com/_/mongo/tags DOCKER_IMAGE_MONGODB: "docker.io/mongo:7.0.35" # https://hub.docker.com/_/mysql/tags From 1fbd9f674ce907ddc9c29c23cad99a02c6664850 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Fri, 17 Jul 2026 16:07:03 +0500 Subject: [PATCH 16/21] docs: note that plugin -main images must be built locally (#1429) --- docs/developing/main.rst | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/developing/main.rst b/docs/developing/main.rst index 4ab7e4c05a..0e353e9311 100644 --- a/docs/developing/main.rst +++ b/docs/developing/main.rst @@ -46,6 +46,19 @@ However, these images include the application master branch at the point in time tutor images build --no-cache all +.. note:: + On the ``main`` branch, image tags carry a ``-main`` suffix. Only the ``openedx`` and ``indigo`` images are published to Docker Hub with that suffix; the ``-main`` images for other plugins are not. As a result, ``tutor images pull all`` cannot fetch them and you must build these images yourself, for example:: + + tutor images build mfe + + On Kubernetes, the images also need to be available from a registry that the cluster can reach. Set the ``DOCKER_REGISTRY`` configuration value (with a trailing slash) to a registry you can push to, then build and push the plugin images:: + + tutor config save --set DOCKER_REGISTRY=docker.io/myusername/ + tutor images build mfe + tutor images push mfe + + If you do not specifically need the master branches, running a :ref:`tagged release ` avoids this step entirely. + Running Tutor Main alongside the latest release ----------------------------------------------- From 6f32dee8f8228819c43d4d69394cd06e3934f66f Mon Sep 17 00:00:00 2001 From: Abdul-Muqadim-Arbisoft <139064778+Abdul-Muqadim-Arbisoft@users.noreply.github.com> Date: Fri, 24 Jul 2026 15:14:12 +0500 Subject: [PATCH 17/21] fix: bump build-time setuptools to 80.9.0 for the main branch (#1436) The setuptools build constraint added in #1411 pins 69.1.1, which is forward-ported from the release branch to main. On main we build against edx-platform's master branch, where mysqlclient==2.2.8 declares its license using the PEP 639 `project.license` format. setuptools only understands that format from 77.0.0 onwards, so building the openedx image with setuptools 69.1.1 fails: configuration error: `project.license` must be valid exactly by one Bump the pinned version to 80.9.0 on main. It is new enough to build the master requirements (mysqlclient 2.2.8 and friends) and still ships pkg_resources, which setuptools 82.0.0 removes but which is still required at runtime by dependencies such as fs (pyfilesystem2) -- matching edx-platform's own `setuptools<82` constraint. The release branch intentionally stays on 69.1.1: Ulmo's requirements build fine with it, and this avoids changing the setuptools version shipped by the current stable release. --- .../20260616_140000_abdul.muqadim_bump_setuptools_main.md | 1 + tutor/templates/build/openedx/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 changelog.d/20260616_140000_abdul.muqadim_bump_setuptools_main.md diff --git a/changelog.d/20260616_140000_abdul.muqadim_bump_setuptools_main.md b/changelog.d/20260616_140000_abdul.muqadim_bump_setuptools_main.md new file mode 100644 index 0000000000..2269cd272d --- /dev/null +++ b/changelog.d/20260616_140000_abdul.muqadim_bump_setuptools_main.md @@ -0,0 +1 @@ +- [Bugfix] On the main branch, bump the pinned build-time `setuptools` to 80.9.0 (the release branch keeps 69.1.1). The older version cannot build packages that declare their license with the PEP 639 `project.license` field (e.g. `mysqlclient`) against the Open edX master branch, which broke `tutor images build openedx` on main. (by @Abdul-Muqadim-Arbisoft) diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile index 743776c44a..7a71965233 100644 --- a/tutor/templates/build/openedx/Dockerfile +++ b/tutor/templates/build/openedx/Dockerfile @@ -20,7 +20,7 @@ ARG PIP_COMMAND="uv pip" # setuptools 81 removed pkg_resources. Inherited by all stages, and reused as # the single source of truth for the venv setuptools pin below. # https://github.com/overhangio/tutor/issues/1350 -RUN echo "setuptools==69.1.1" > /etc/openedx-build-constraints.txt +RUN echo "setuptools==80.9.0" > /etc/openedx-build-constraints.txt ENV UV_BUILD_CONSTRAINT=/etc/openedx-build-constraints.txt ENV PIP_CONSTRAINT=/etc/openedx-build-constraints.txt From 756b2158d9c18acc6fed4f9e9b68d2f5f2d25982 Mon Sep 17 00:00:00 2001 From: Ahmed Khalid Date: Fri, 17 Apr 2026 16:16:31 +0500 Subject: [PATCH 18/21] feat: upgrade to Verawood Generated by Claude Code on behalf of @ahmed-arb --- changelog.d/20260417_verawood_upgrade.md | 1 + docs/configuration.rst | 8 ++++---- docs/developing/openedx.rst | 2 +- docs/developing/plugins/indexes.rst | 10 +++++----- docs/gettingstarted/installation.rst | 1 + docs/sysadmin/edx-platform.rst | 2 +- docs/upgrading.rst | 2 +- tests/test_env.py | 2 +- tutor/__about__.py | 2 +- tutor/commands/upgrade/__init__.py | 3 ++- tutor/commands/upgrade/compose.py | 3 +++ tutor/commands/upgrade/k8s.py | 3 +++ tutor/env.py | 1 + tutor/templates/build/openedx/revisions.yml | 2 +- tutor/templates/config/defaults.yml | 2 +- 15 files changed, 27 insertions(+), 17 deletions(-) create mode 100644 changelog.d/20260417_verawood_upgrade.md diff --git a/changelog.d/20260417_verawood_upgrade.md b/changelog.d/20260417_verawood_upgrade.md new file mode 100644 index 0000000000..570a108909 --- /dev/null +++ b/changelog.d/20260417_verawood_upgrade.md @@ -0,0 +1 @@ +- 💥[Feature] Upgrade to Verawood. (generated by Claude Code on behalf of @ahmed-arb) diff --git a/docs/configuration.rst b/docs/configuration.rst index 9f948d5eb6..1d24401ed4 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -132,7 +132,7 @@ Open edX customisation This defines the git repository from which you install Open edX platform code. If you run an Open edX fork with custom patches, set this to your own git repository. You may also override this configuration parameter at build time, by providing a ``--build-arg`` option. -- ``OPENEDX_COMMON_VERSION`` (default: ``"release/ulmo.3"``, or ``master`` in :ref:`Tutor Main
`) +- ``OPENEDX_COMMON_VERSION`` (default: ``"release/verawood.master"``, or ``master`` in :ref:`Tutor Main
`) This defines the default version that will be pulled from all Open edX git repositories. @@ -391,9 +391,9 @@ Note that your edx-platform version must be a fork of the latest release **tag** If you don't create your fork from this tag, you *will* have important compatibility issues with other services. In particular: -- Do not try to run a fork from an older (pre-Ulmo) version of edx-platform: this will simply not work. +- Do not try to run a fork from an older (pre-Verawood) version of edx-platform: this will simply not work. - Do not try to run a fork from the edx-platform master branch: there is a 99% probability that it will fail. -- Do not try to run a fork from the release/ulmo branch: Tutor will attempt to apply security and bug fix patches that might already be included in the release/ulmo but which were not yet applied to the latest release tag. Patch application will thus fail if you base your fork from the release/ulmo branch. +- Do not try to run a fork from the release/verawood branch: Tutor will attempt to apply security and bug fix patches that might already be included in the release/verawood but which were not yet applied to the latest release tag. Patch application will thus fail if you base your fork from the release/verawood branch. .. _i18n: @@ -405,7 +405,7 @@ Tutor builds images with the latest translations using the ``atlas pull`` `comma By default the translations are pulled from the `openedx-translations repository `_ from the ``ATLAS_REVISION`` branch. You can use custom translations on your fork of the openedx-translations repository by setting the following configuration parameters: -- ``ATLAS_REVISION`` (default: ``"main"`` for Tutor Main, or ``"{{ OPENEDX_COMMON_VERSION }}"`` if a named release is used). Note that if you're running on a point release (for example, ``release/ulmo.1``), you will not be able to pull any upstream additions to translations - they will be "frozen" at that Git tag. If you're making changes to your language on Transifex, it is recommended to set this value to the Git branch (for example, ``release/ulmo``) to pick up any new translations that occur for that release. +- ``ATLAS_REVISION`` (default: ``"main"`` for Tutor Main, or ``"{{ OPENEDX_COMMON_VERSION }}"`` if a named release is used). Note that if you're running on a point release (for example, ``release/verawood.1``), you will not be able to pull any upstream additions to translations - they will be "frozen" at that Git tag. If you're making changes to your language on Transifex, it is recommended to set this value to the Git branch (for example, ``release/verawood``) to pick up any new translations that occur for that release. - ``ATLAS_REPOSITORY`` (default: ``"openedx/openedx-translations"``). There's a feature request to `support GitLab and other providers `_. - ``ATLAS_OPTIONS`` (default: ``""``) Pass additional arguments to ``atlas pull``. Refer to the `atlas documentations `_ for more information. diff --git a/docs/developing/openedx.rst b/docs/developing/openedx.rst index 26fb9a1a05..15f6e7f07e 100644 --- a/docs/developing/openedx.rst +++ b/docs/developing/openedx.rst @@ -117,7 +117,7 @@ The ``openedx-dev`` Docker image is based on the same ``openedx`` image used by - The user that runs inside the container has the same UID as the user on the host, to avoid permission problems inside mounted volumes (and in particular in the edx-platform repository). - Additional Python and system requirements are installed for convenient debugging: `ipython `__, `ipdb `__, vim, telnet. -- The edx-platform `development requirements `__ are installed. +- The edx-platform `development requirements `__ are installed. If you are using a custom ``openedx`` image, then you will need to rebuild ``openedx-dev`` every time you modify ``openedx``. To so, run:: diff --git a/docs/developing/plugins/indexes.rst b/docs/developing/plugins/indexes.rst index 281100a2e4..6c2ddbad0c 100644 --- a/docs/developing/plugins/indexes.rst +++ b/docs/developing/plugins/indexes.rst @@ -7,10 +7,10 @@ Plugin indexes are a great way to have your plugins discovered by other users. P Index file paths ================ -A plugin index is a yaml-formatted file. It can be stored on the web or on your computer. In both cases, the index file location must end with "/plugins.yml". For instance, the following are valid index locations if you run the Open edX "Ulmo" release: +A plugin index is a yaml-formatted file. It can be stored on the web or on your computer. In both cases, the index file location must end with "/plugins.yml". For instance, the following are valid index locations if you run the Open edX "Verawood" release: -- https://overhang.io/tutor/main/ulmo/plugins.yml -- ``/path/to/your/local/index/ulmo/plugins.yml`` +- https://overhang.io/tutor/main/verawood/plugins.yml +- ``/path/to/your/local/index/verawood/plugins.yml`` To add either indexes, run the ``tutor plugins index add`` command without the suffix. For instance:: @@ -106,9 +106,9 @@ Manage plugins in development Plugin developers and maintainers often want to install local versions of their plugins. They usually achieve this with ``pip install -e /path/to/tutor-plugin``. We can improve that workflow by creating an index for local plugins:: # Create the plugin index directory - mkdir -p ~/localindex/ulmo/ + mkdir -p ~/localindex/verawood/ # Edit the index - vim ~/localindex/ulmo/plugins.yml + vim ~/localindex/verawood/plugins.yml Add the following to the index:: diff --git a/docs/gettingstarted/installation.rst b/docs/gettingstarted/installation.rst index abc2630f16..65071f4727 100644 --- a/docs/gettingstarted/installation.rst +++ b/docs/gettingstarted/installation.rst @@ -80,4 +80,5 @@ Instructions for installing the appropriate Tutor version for older Open edX rel | Teak | v20 | pip install 'tutor[full]>=20.0.0,<21.0.0' | +-------------------+---------------+--------------------------------------------+ | Ulmo | v21 | pip install 'tutor[full]>=21.0.0,<22.0.0' | +| Verawood | v22 | pip install 'tutor[full]>=22.0.0,<23.0.0' | +-------------------+---------------+--------------------------------------------+ diff --git a/docs/sysadmin/edx-platform.rst b/docs/sysadmin/edx-platform.rst index 55434d9846..2a9491dae3 100644 --- a/docs/sysadmin/edx-platform.rst +++ b/docs/sysadmin/edx-platform.rst @@ -69,7 +69,7 @@ Quite often, developers don't want to work on edx-platform directly, but on a de cd /my/workspace/edx-ora2 git clone https://github.com/openedx/edx-ora2 . -Then, check out the right version of the package. This is the version that is indicated in the `edx-platform/requirements/edx/base.txt `__. Be careful that the version that is currently in use in your version of edx-platform is **not necessarily the head of the master branch**:: +Then, check out the right version of the package. This is the version that is indicated in the `edx-platform/requirements/edx/base.txt `__. Be careful that the version that is currently in use in your version of edx-platform is **not necessarily the head of the master branch**:: git checkout diff --git a/docs/upgrading.rst b/docs/upgrading.rst index a30fa6c053..72473cc37e 100644 --- a/docs/upgrading.rst +++ b/docs/upgrading.rst @@ -39,7 +39,7 @@ Major Open edX releases are published twice a year, in June and December, by the 4. Test the new release in a sandboxed environment. 5. If you are running edx-platform, or some other repository from a custom branch, then you should rebase (and test) your changes on top of the latest release tag (see :ref:`edx_platform_fork`). -The process for upgrading from one major release to the next works similarly to any other upgrade, with the ``launch`` command (see above). The single difference is that if the ``launch`` command detects that your tutor environment was generated with an older release, it will perform a few release-specific upgrade steps. These extra upgrade steps will be performed just once. But they will be ignored if you updated your local environment (for instance: with ``tutor config save``) before running ``launch``. This situation typically occurs if you need to re-build some Docker images (see above). In such a case, you should make use of the ``upgrade`` command. For instance, to upgrade a local installation from Teak to Ulmo and rebuild some Docker images, run:: +The process for upgrading from one major release to the next works similarly to any other upgrade, with the ``launch`` command (see above). The single difference is that if the ``launch`` command detects that your tutor environment was generated with an older release, it will perform a few release-specific upgrade steps. These extra upgrade steps will be performed just once. But they will be ignored if you updated your local environment (for instance: with ``tutor config save``) before running ``launch``. This situation typically occurs if you need to re-build some Docker images (see above). In such a case, you should make use of the ``upgrade`` command. For instance, to upgrade a local installation from Ulmo to Verawood and rebuild some Docker images, run:: tutor config save tutor images build all # list the images that should be rebuilt here diff --git a/tests/test_env.py b/tests/test_env.py index cdf1f0478a..4cc504d5f9 100644 --- a/tests/test_env.py +++ b/tests/test_env.py @@ -260,7 +260,7 @@ def test_current_version_in_latest_env(self) -> None: ) as f: f.write(__version__) self.assertEqual(__version__, env.current_version(root)) - self.assertEqual("ulmo", env.get_env_release(root)) + self.assertEqual("verawood", env.get_env_release(root)) self.assertIsNone(env.should_upgrade_from_release(root)) self.assertTrue(env.is_up_to_date(root)) diff --git a/tutor/__about__.py b/tutor/__about__.py index 78041909e0..b4c4acc2fb 100644 --- a/tutor/__about__.py +++ b/tutor/__about__.py @@ -10,7 +10,7 @@ # the main branch. # The suffix is cleanly separated from the __version__ in this module to avoid # conflicts when merging branches. -__version_suffix__ = "main" +__version_suffix__ = "" # The app name will be used to define the name of the default tutor root and # plugin directory. To avoid conflicts between multiple locally-installed diff --git a/tutor/commands/upgrade/__init__.py b/tutor/commands/upgrade/__init__.py index 56abf03548..a84593bf99 100644 --- a/tutor/commands/upgrade/__init__.py +++ b/tutor/commands/upgrade/__init__.py @@ -1,4 +1,4 @@ -# Note: don't forget to change this when we upgrade from ulmo +# Note: don't forget to change this when we upgrade from verawood OPENEDX_RELEASE_NAMES = [ "ironwood", "juniper", @@ -13,4 +13,5 @@ "sumac", "teak", "ulmo", + "verawood", ] diff --git a/tutor/commands/upgrade/compose.py b/tutor/commands/upgrade/compose.py index 56d75b9f46..a35c90afc1 100644 --- a/tutor/commands/upgrade/compose.py +++ b/tutor/commands/upgrade/compose.py @@ -60,6 +60,9 @@ def upgrade_from(context: click.Context, from_release: str) -> None: if running_release == "teak": running_release = "ulmo" + if running_release == "ulmo": + running_release = "verawood" + def upgrade_from_ironwood(context: click.Context, config: Config) -> None: click.echo(fmt.title("Upgrading from Ironwood")) diff --git a/tutor/commands/upgrade/k8s.py b/tutor/commands/upgrade/k8s.py index 8402511ac4..dcad75f76c 100644 --- a/tutor/commands/upgrade/k8s.py +++ b/tutor/commands/upgrade/k8s.py @@ -59,6 +59,9 @@ def upgrade_from(context: click.Context, from_release: str) -> None: if running_release == "teak": running_release = "ulmo" + if running_release == "ulmo": + running_release = "verawood" + def upgrade_from_ironwood(config: Config) -> None: upgrade_mongodb(config, "3.4.24", "3.4") diff --git a/tutor/env.py b/tutor/env.py index ad965345a9..2af0070f18 100644 --- a/tutor/env.py +++ b/tutor/env.py @@ -487,6 +487,7 @@ def get_release(version: str) -> str: "19": "sumac", "20": "teak", "21": "ulmo", + "22": "verawood", }[version.split(".", maxsplit=1)[0]] diff --git a/tutor/templates/build/openedx/revisions.yml b/tutor/templates/build/openedx/revisions.yml index b7edda008f..9b13686e2e 100644 --- a/tutor/templates/build/openedx/revisions.yml +++ b/tutor/templates/build/openedx/revisions.yml @@ -1 +1 @@ -EDX_PLATFORM_REVISION: ulmo +EDX_PLATFORM_REVISION: verawood diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml index ad9d9a22b1..c1482fc5cf 100644 --- a/tutor/templates/config/defaults.yml +++ b/tutor/templates/config/defaults.yml @@ -61,7 +61,7 @@ OPENEDX_LMS_UWSGI_WORKERS: 2 OPENEDX_MYSQL_DATABASE: "openedx" OPENEDX_MYSQL_USERNAME: "openedx" # the common version will be automatically set to "master" in the main branch -OPENEDX_COMMON_VERSION: "release/ulmo.3" +OPENEDX_COMMON_VERSION: "release/verawood.master" OPENEDX_EXTRA_PIP_REQUIREMENTS: [] MYSQL_HOST: "mysql" MYSQL_PORT: 3306 From 577f37393c32f396add4a2becb5b181d00ca8a86 Mon Sep 17 00:00:00 2001 From: Kyle McCormick Date: Thu, 30 Apr 2026 13:36:51 -0400 Subject: [PATCH 19/21] build: release/verawood, not release/verawood.master --- tutor/templates/config/defaults.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml index c1482fc5cf..d26c7333e7 100644 --- a/tutor/templates/config/defaults.yml +++ b/tutor/templates/config/defaults.yml @@ -61,7 +61,7 @@ OPENEDX_LMS_UWSGI_WORKERS: 2 OPENEDX_MYSQL_DATABASE: "openedx" OPENEDX_MYSQL_USERNAME: "openedx" # the common version will be automatically set to "master" in the main branch -OPENEDX_COMMON_VERSION: "release/verawood.master" +OPENEDX_COMMON_VERSION: "release/verawood" OPENEDX_EXTRA_PIP_REQUIREMENTS: [] MYSQL_HOST: "mysql" MYSQL_PORT: 3306 From 460f3a23842af7d627a865a38376184fde811a0c Mon Sep 17 00:00:00 2001 From: Ahmed Khalid Date: Mon, 4 May 2026 17:33:04 +0500 Subject: [PATCH 20/21] chore: bump version to 22.0.0 for verawood --- tutor/__about__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tutor/__about__.py b/tutor/__about__.py index b4c4acc2fb..baa0920cba 100644 --- a/tutor/__about__.py +++ b/tutor/__about__.py @@ -2,7 +2,7 @@ # Increment this version number to trigger a new release. See # docs/tutor.html#versioning for information on the versioning scheme. -__version__ = "21.0.8" +__version__ = "22.0.0" # The version suffix will be appended to the actual version, separated by a # dash. Use this suffix to differentiate between the actual released version and From 10450c8c1db173cde874c68c7029ad400872b26d Mon Sep 17 00:00:00 2001 From: Ahmed Khalid <106074266+ahmed-arb@users.noreply.github.com> Date: Thu, 2 Jul 2026 13:59:35 +0500 Subject: [PATCH 21/21] chore: update Open edX release from verawood.master to verawood in docs Co-authored-by: Kyle McCormick --- docs/configuration.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 1d24401ed4..8b65d19298 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -132,7 +132,7 @@ Open edX customisation This defines the git repository from which you install Open edX platform code. If you run an Open edX fork with custom patches, set this to your own git repository. You may also override this configuration parameter at build time, by providing a ``--build-arg`` option. -- ``OPENEDX_COMMON_VERSION`` (default: ``"release/verawood.master"``, or ``master`` in :ref:`Tutor Main
`) +- ``OPENEDX_COMMON_VERSION`` (default: ``"release/verawood"``, or ``master`` in :ref:`Tutor Main
`) This defines the default version that will be pulled from all Open edX git repositories.