diff --git a/CHANGELOG.md b/CHANGELOG.md
index f823ea0475..5ba6bb089f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,13 @@ instructions, because git commits are used to generate release notes:
+
+## v20.0.0 (2025-06-16)
+
+- 💥[Depreciation] Remove the unnecessary site-configuration script in favour of the [`create_or_update_site_configuration`](https://github.com/openedx/edx-platform/blob/master/openedx/core/djangoapps/site_configuration/management/commands/create_or_update_site_configuration.py) management command provided in edx-platform. (by @Danyal-Faheem)
+
+- 💥[Feature] Upgrade to Teak. (by @ahmed-arb)
+
## v19.0.5 (2025-06-10)
diff --git a/Makefile b/Makefile
index c047624571..8d1f56d6ab 100644
--- a/Makefile
+++ b/Makefile
@@ -95,7 +95,7 @@ ci-test-bundle: ## Run basic tests on bundle
yes "" | ./dist/tutor config save --interactive
./dist/tutor config save
./dist/tutor plugins list
- ./dist/tutor plugins enable android discovery ecommerce forum license mfe minio notes webui xqueue
+ ./dist/tutor plugins enable android discovery forum license mfe minio notes webui xqueue
./dist/tutor plugins list
./dist/tutor license --help
diff --git a/docs/configuration.rst b/docs/configuration.rst
index b2593069a4..863ac66b03 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: ``"open-release/sumac.3"``, or ``master`` in :ref:`Tutor Main `)
+- ``OPENEDX_COMMON_VERSION`` (default: ``"release/teak.1"``, or ``master`` in :ref:`Tutor Main `)
This defines the default version that will be pulled from all Open edX git repositories.
@@ -384,9 +384,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-Sumac) version of edx-platform: this will simply not work.
+- Do not try to run a fork from an older (pre-Teak) 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 open-release/sumac.master branch: Tutor will attempt to apply security and bug fix patches that might already be included in the open-release/sumac.master but which were not yet applied to the latest release tag. Patch application will thus fail if you base your fork from the open-release/sumac.master branch.
+- Do not try to run a fork from the release/teak branch: Tutor will attempt to apply security and bug fix patches that might already be included in the release/teak but which were not yet applied to the latest release tag. Patch application will thus fail if you base your fork from the release/teak branch.
.. _i18n:
diff --git a/docs/dev.rst b/docs/dev.rst
index a5ca41d9e0..f75dfd31fc 100644
--- a/docs/dev.rst
+++ b/docs/dev.rst
@@ -113,7 +113,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/install.rst b/docs/install.rst
index f954ce8b2f..1ed7a66200 100644
--- a/docs/install.rst
+++ b/docs/install.rst
@@ -80,7 +80,7 @@ To inspect the Tutor source code, install Tutor from `the Github repository `__ which will make it possible to access your Open edX platform by name in your browser. The precise procedure to create DNS records varies from one provider to the next and is beyond the scope of these docs. You should create a record of type A with a name equal to your LMS hostname (given by ``tutor config printvalue LMS_HOST``) and a value that indicates the IP address of your server. Applications other than the LMS, such as the studio, ecommerce, etc. typically reside in subdomains of the LMS. Thus, you should also create a CNAME record to point all subdomains of the LMS to the LMS_HOST.
+When running a server in production, it is necessary to define `DNS records `__ which will make it possible to access your Open edX platform by name in your browser. The precise procedure to create DNS records varies from one provider to the next and is beyond the scope of these docs. You should create a record of type A with a name equal to your LMS hostname (given by ``tutor config printvalue LMS_HOST``) and a value that indicates the IP address of your server. Applications other than the LMS, such as the studio, credentials, etc. typically reside in subdomains of the LMS. Thus, you should also create a CNAME record to point all subdomains of the LMS to the LMS_HOST.
For instance, to run an Open edX server at https://learn.mydomain.com on a server with IP address 1.1.1.1, you would need to configure the following DNS records::
@@ -137,11 +137,11 @@ 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 Redwood to Sumac 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 Sumac to Teak and rebuild some Docker images, run::
tutor config save
tutor images build all # list the images that should be rebuilt here
- tutor local upgrade --from=redwood
+ tutor local upgrade --from=sumac
tutor local launch
@@ -153,8 +153,6 @@ Instructions for installing the appropriate Tutor version for older Open edX rel
+-------------------+---------------+--------------------------------------------+
| Open edX Release | Tutor version | Installation command |
+===================+===============+============================================+
-| Juniper | v10 | pip install 'tutor[full]>=10.0.0,<11.0.0' |
-+-------------------+---------------+--------------------------------------------+
| Koa | v11 | pip install 'tutor[full]>=11.0.0,<12.0.0' |
+-------------------+---------------+--------------------------------------------+
| Lilac | v12 | pip install 'tutor[full]>=12.0.0,<13.0.0' |
@@ -173,6 +171,8 @@ Instructions for installing the appropriate Tutor version for older Open edX rel
+-------------------+---------------+--------------------------------------------+
| Sumac | v19 | pip install 'tutor[full]>=19.0.0,<20.0.0' |
+-------------------+---------------+--------------------------------------------+
+| Teak | v20 | pip install 'tutor[full]>=20.0.0,<21.0.0' |
++-------------------+---------------+--------------------------------------------+
.. _autocomplete:
diff --git a/docs/reference/indexes.rst b/docs/reference/indexes.rst
index bed46dc3d6..a3b9f39475 100644
--- a/docs/reference/indexes.rst
+++ b/docs/reference/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 "Sumac" 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 "Teak" release:
-- https://overhang.io/tutor/main/sumac/plugins.yml
-- ``/path/to/your/local/index/sumac/plugins.yml``
+- https://overhang.io/tutor/main/teak/plugins.yml
+- ``/path/to/your/local/index/teak/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/sumac/
+ mkdir -p ~/localindex/teak/
# Edit the index
- vim ~/localindex/sumac/plugins.yml
+ vim ~/localindex/teak/plugins.yml
Add the following to the index::
diff --git a/docs/tutor.rst b/docs/tutor.rst
index 162d68af23..8bf9954ebe 100644
--- a/docs/tutor.rst
+++ b/docs/tutor.rst
@@ -121,7 +121,7 @@ Contributions to Tutor and its plugins are highly encouraged. Please adhere to t
- Target ``release`` if your change is compatible with the latest official Open edX release and it carries no major backwards-incompatibility nor risk of regression. This ensures that the latest stable release of Tutor benefits from bug fixes and incremental improvements. Once merged, your change will automatically be forward-ported to ``main``.
- Target ``main`` if your change is only compatible with Open edX's master branches and/or your change would be disruptive to production Tutor site operators. If merged, your change will become part of the next pending release branch (described below) and then incorporated into ``release`` at the time of the next named Open edX release.
- - At the beginning of each Open edX named release testing period, we split off from ``main`` a special pending release branch (e.g., ``redwood`` or ``sumac``). If your Tutor change is necessary for that pending release, merge it to said branch. At the end of the testing period, the pending branch will be merged into ``release`` and deleted. As with any set of changes merged to ``release``, they will then be forward-ported to ``main``.
+ - At the beginning of each Open edX named release testing period, we split off from ``main`` a special pending release branch (e.g., ``sumac`` or ``teak``). If your Tutor change is necessary for that pending release, merge it to said branch. At the end of the testing period, the pending branch will be merged into ``release`` and deleted. As with any set of changes merged to ``release``, they will then be forward-ported to ``main``.
- **Running Tests and Code Formatting**:
diff --git a/docs/tutorials/edx-platform.rst b/docs/tutorials/edx-platform.rst
index d92f16c38a..6ffa8448ef 100644
--- a/docs/tutorials/edx-platform.rst
+++ b/docs/tutorials/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/tutorials/proxy.rst b/docs/tutorials/proxy.rst
index 61122667b2..94e961f0f7 100644
--- a/docs/tutorials/proxy.rst
+++ b/docs/tutorials/proxy.rst
@@ -20,7 +20,7 @@ With these changes, Tutor will no longer listen to ports 80 and 443 on the host.
It is then your responsibility to configure the web proxy on the host. There are too many use cases and proxy vendors, so Tutor does not provide configuration files that will work for everyone. You should configure your web proxy to:
-- Capture traffic for the following hostnames: LMS_HOST, PREVIEW_LMS_HOST, CMS_HOST, as well as any additional host exposed by your plugins (MFE_HOST, ECOMMERCE_HOST, etc.). See each plugin documentation for more information.
+- Capture traffic for the following hostnames: LMS_HOST, PREVIEW_LMS_HOST, CMS_HOST, as well as any additional host exposed by your plugins (MFE_HOST, CREDENTIALS_HOST, etc.). See each plugin documentation for more information.
- If SSL/TLS is enabled:
- Perform SSL/TLS termination using your own certificates.
- Forward http traffic to https.
diff --git a/requirements/plugins.txt b/requirements/plugins.txt
index 43e65005bf..f7dd5a24a1 100644
--- a/requirements/plugins.txt
+++ b/requirements/plugins.txt
@@ -1,15 +1,14 @@
-# change version ranges when upgrading from sumac
-tutor-android>=19.0.0,<20.0.0
-tutor-cairn>=19.0.0,<20.0.0
-tutor-credentials>=19.0.0,<20.0.0
-tutor-deck>=19.0.0,<20.0.0
-tutor-discovery>=19.0.0,<20.0.0
-tutor-ecommerce>=19.0.0,<20.0.0
-tutor-forum>=19.0.0,<20.0.0
-tutor-indigo>=19.0.0,<20.0.0
-tutor-jupyter>=19.0.0,<20.0.0
-tutor-mfe>=19.0.0,<20.0.0
-tutor-minio>=19.0.0,<20.0.0
-tutor-notes>=19.0.0,<20.0.0
-tutor-webui>=19.0.0,<20.0.0
-tutor-xqueue>=19.0.0,<20.0.0
\ No newline at end of file
+# change version ranges when upgrading from teak
+tutor-android>=20.0.0,<21.0.0
+tutor-cairn>=20.0.0,<21.0.0
+tutor-credentials>=20.0.0,<21.0.0
+tutor-discovery>=20.0.0,<21.0.0
+tutor-deck>=20.0.0,<21.0.0
+tutor-forum>=20.0.0,<21.0.0
+tutor-indigo>=20.0.0,<21.0.0
+tutor-jupyter>=20.0.0,<21.0.0
+tutor-mfe>=20.0.0,<21.0.0
+tutor-minio>=20.0.0,<21.0.0
+tutor-notes>=20.0.0,<21.0.0
+tutor-webui>=20.0.0,<21.0.0
+tutor-xqueue>=20.0.0,<21.0.0
\ No newline at end of file
diff --git a/tests/test_env.py b/tests/test_env.py
index bd0a3805fe..753249c825 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("sumac", env.get_env_release(root))
+ self.assertEqual("teak", 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 7ff2936203..0693050212 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__ = "19.0.5"
+__version__ = "20.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
diff --git a/tutor/commands/upgrade/__init__.py b/tutor/commands/upgrade/__init__.py
index 789384e609..9c7abd0735 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 sumac
+# Note: don't forget to change this when we upgrade from teak
OPENEDX_RELEASE_NAMES = [
"ironwood",
"juniper",
@@ -11,4 +11,5 @@
"quince",
"redwood",
"sumac",
+ "teak",
]
diff --git a/tutor/commands/upgrade/compose.py b/tutor/commands/upgrade/compose.py
index 534d9f1ad8..cceaa767c1 100644
--- a/tutor/commands/upgrade/compose.py
+++ b/tutor/commands/upgrade/compose.py
@@ -55,6 +55,9 @@ def upgrade_from(context: click.Context, from_release: str) -> None:
common_upgrade.upgrade_from_redwood(context, config)
running_release = "sumac"
+ if running_release == "sumac":
+ running_release = "teak"
+
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 93e3d845e5..96d44c910b 100644
--- a/tutor/commands/upgrade/k8s.py
+++ b/tutor/commands/upgrade/k8s.py
@@ -53,6 +53,9 @@ def upgrade_from(context: click.Context, from_release: str) -> None:
common_upgrade.upgrade_from_redwood(context, config)
running_release = "sumac"
+ if running_release == "sumac":
+ running_release = "teak"
+
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 4d00118ca1..746b5bd7ed 100644
--- a/tutor/env.py
+++ b/tutor/env.py
@@ -476,6 +476,7 @@ def get_release(version: str) -> str:
"17": "quince",
"18": "redwood",
"19": "sumac",
+ "20": "teak",
}[version.split(".", maxsplit=1)[0]]
diff --git a/tutor/hooks/catalog.py b/tutor/hooks/catalog.py
index e9957efc07..0b55697ccd 100644
--- a/tutor/hooks/catalog.py
+++ b/tutor/hooks/catalog.py
@@ -222,7 +222,7 @@ def your_filter_callback(some_data):
#: (lms, lms-worker, cms, cms-worker, lms-job, cms-job) at the
#: /openedx/edx-platform location. Plugin developers may implement this filter to
#: define custom behaviour when mounting folders that relate to their plugins. For
- #: instance, the ecommerce plugin may process the ``/path/to/ecommerce`` value.
+ #: instance, the credentials plugin may process the ``/path/to/credentials`` value.
#:
#: To also bind-mount these folder at build time, implement also the
#: :py:data:`IMAGES_BUILD_MOUNTS` filter.
diff --git a/tutor/plugins/v0.py b/tutor/plugins/v0.py
index b1cf0f76d5..e7e59382ed 100644
--- a/tutor/plugins/v0.py
+++ b/tutor/plugins/v0.py
@@ -282,7 +282,6 @@ class OfficialPlugin(BasePlugin):
NAMES = [
"android",
"discovery",
- "ecommerce",
"forum",
"license",
"mfe",
diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile
index 44761249e9..91483c9129 100644
--- a/tutor/templates/build/openedx/Dockerfile
+++ b/tutor/templates/build/openedx/Dockerfile
@@ -92,10 +92,11 @@ RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared \
# https://pypi.org/project/wheel/
setuptools==69.1.1 pip==24.0 wheel==0.43.0
-# Install base requirements
+# Install base requirements and asset-building requirements
RUN --mount=type=bind,from=edx-platform,source=/requirements/edx/base.txt,target=/openedx/edx-platform/requirements/edx/base.txt \
+ --mount=type=bind,from=edx-platform,source=/requirements/edx/assets.txt,target=/openedx/edx-platform/requirements/edx/assets.txt \
--mount=type=cache,target=/openedx/.cache/pip,sharing=shared \
- pip install -r /openedx/edx-platform/requirements/edx/base.txt
+ pip install -r /openedx/edx-platform/requirements/edx/base.txt -r /openedx/edx-platform/requirements/edx/assets.txt
# Install extra requirements
RUN --mount=type=cache,target=/openedx/.cache/pip,sharing=shared \
@@ -126,8 +127,8 @@ FROM python AS nodejs-requirements
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/base.txt
-RUN pip install nodeenv==1.8.0
+# https://github.com/openedx/edx-platform/blob/master/requirements/edx/assets.txt
+RUN pip install nodeenv==1.9.1
RUN nodeenv /openedx/nodeenv --node=18.20.1 --prebuilt
# Install nodejs requirements
diff --git a/tutor/templates/build/openedx/bin/site-configuration b/tutor/templates/build/openedx/bin/site-configuration
deleted file mode 100644
index 22e7788e77..0000000000
--- a/tutor/templates/build/openedx/bin/site-configuration
+++ /dev/null
@@ -1,83 +0,0 @@
-#! /usr/bin/env python3
-import argparse
-import lms.startup
-
-lms.startup.run()
-
-from django.conf import settings
-from django.contrib.sites.models import Site
-
-from openedx.core.djangoapps.site_configuration.models import SiteConfiguration
-
-
-def main():
- parser = argparse.ArgumentParser(description="Manage site configuration")
- subparsers = parser.add_subparsers()
-
- # Set command
- parser_set = subparsers.add_parser("set", help="Set a site configuration key/value")
- parser_set.add_argument(
- "-d", "--domain", help="Site domain: by default this will be the LMS domain"
- )
- parser_set.add_argument("key", help="Configuration key")
- parser_set.add_argument(
- "value",
- help="Configuration value: 'true' and 'false' will be converted to booleans.",
- )
- parser_set.set_defaults(func=set_command)
-
- # Unset command
- parser_unset = subparsers.add_parser(
- "unset", help="Remove a site configuration key"
- )
- parser_unset.add_argument(
- "-d", "--domain", help="Site domain: by default this will be the LMS domain"
- )
- parser_unset.add_argument("key", help="Configuration key")
- parser_unset.set_defaults(func=unset_command)
-
- args = parser.parse_args()
- if hasattr(args, "func"):
- args.func(args)
- else:
- parser.print_help()
-
-
-def set_command(args):
- configuration = get_site_configuration(args.domain)
-
- value = args.value
- if value == "true":
- value = True
- elif value == "false":
- value = False
-
- configuration.site_values[args.key] = args.value
- configuration.save()
-
-
-def get_site_configuration(domain):
- domain = domain or settings.LMS_BASE
- site, site_created = Site.objects.get_or_create(domain=domain)
- if site_created:
- # Limit the site name to 50 characters
- # https://github.com/django/django/blob/4.2.16/django/contrib/sites/models.py#L86
- site.name = domain[:50]
- site.save()
- configuration, configuration_created = SiteConfiguration.objects.get_or_create(site=site)
- if configuration_created:
- # Configuration is disabled by default
- configuration.enabled = True
- configuration.save()
- return configuration
-
-
-def unset_command(args):
- configuration = get_site_configuration(args.domain)
- if args.key in configuration.site_values:
- configuration.site_values.pop(args.key)
- configuration.save()
-
-
-if __name__ == "__main__":
- main()
diff --git a/tutor/templates/build/openedx/revisions.yml b/tutor/templates/build/openedx/revisions.yml
index 0ddb2fc922..e9b7878c47 100644
--- a/tutor/templates/build/openedx/revisions.yml
+++ b/tutor/templates/build/openedx/revisions.yml
@@ -1 +1 @@
-EDX_PLATFORM_REVISION: sumac
+EDX_PLATFORM_REVISION: teak
diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml
index 6186cb8724..b9036fccff 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: "open-release/sumac.3"
+OPENEDX_COMMON_VERSION: "release/teak.1"
OPENEDX_EXTRA_PIP_REQUIREMENTS: []
MYSQL_HOST: "mysql"
MYSQL_PORT: 3306