diff --git a/CHANGELOG.md b/CHANGELOG.md
index ab6fecc3f5..beb4b980fe 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,6 +20,29 @@ instructions, because git commits are used to generate release notes:
+
+## v15.0.0 (2022-12-06)
+
+
+- 💥[Feature] Upgrade to Olive (by @regisb):
+ - Mypy type checking options were modified: developers are encouraged to add the `--implicit-reexport` option to their IDE.
+- [Bugfix] Update problem templates according newer python versions. (by @mariajgrimaldi)
+- [Improvement] Add the `-h` help option to all commands and subcommands. Previously, we could only use `--help`, which is quite long for lazy fingers. (by @regisb)
+- 💥[Feature] Add an extensible `local/dev/k8s do ...` command to trigger custom job commands. These commands are used to run a series of bash scripts in designated containers. Any plugin can add custom jobs thanks to the `CLI_DO_COMMANDS` filter. This causes the following breaking changes:
+ - The "init", "createuser", "settheme", "importdemocourse" commands were all migrated to this new interface. For instance, `tutor local init` was replaced by `tutor local do init`.
+ - Plugin developers are encouraged to replace calls to the `COMMANDS_INIT` and `COMMANDS_PRE_INIT` filters by `CLI_DO_INIT_TASKS`.
+- [Feature] Implement hook filter priorities, which work like action priorities. (by @regisb)
+- 💥[Improvement] Remove the `local/dev bindmount` commands, which have been marked as deprecated for some time. The `--mount` option should be used instead.
+- 💥[Bugfix] Fix local installation requirements. Plugins that implemented the "openedx-dockerfile-post-python-requirements" patch and that needed access to the edx-platform repo will no longer work. Instead, these plugins should implement the "openedx-dockerfile-pre-assets" patch. This scenario should be very rare, though. (by @regisb)
+- 💥[Improvement] Rename the implementation of tutor quickstart to tutor launch. (by @Carlos-Muniz)
+- 💥[Improvement] Remove the implementation of tutor dev runserver. (by @Carlos-Muniz)
+- [Bugfix] Fix MongoDB replica set connection error resulting from edx-platform's pymongo (3.10.1 -> 3.12.3) upgrade ([edx-platform#30569](https://github.com/openedx/edx-platform/pull/30569)). (by @ormsbee)
+- [Improvement] For Tutor Nightly (and only Nightly), official plugins are now installed from their nightly branches on GitHub instead of a version range on PyPI. This will allow Nightly users to install all official plugins by running ``pip install -e ".[full]"``.
+- [Bugfix] Remove edX references from bulk emails ([issue](https://github.com/openedx/build-test-release-wg/issues/100)).
+- [Bugfix] Update ``celery`` invocations for lms-worker and cms-worker to be compatible with Celery 5 CLI.
+- [Improvement] Point CMS at its config file using ``CMS_CFG`` environment variable instead of deprecated ``STUDIO_CFG``.
+- [Bugfix] Start MongoDB when running migrations, because a new data migration fails if MongoDB is not running.
+
## v14.2.3 (2022-12-06)
diff --git a/README.rst b/README.rst
index 39ee708487..aa832d4c9a 100644
--- a/README.rst
+++ b/README.rst
@@ -55,13 +55,12 @@ Features
* No technical skill required with the `zero-click Tutor AWS image `__
.. _readme_intro_end:
-..
- TODO: replace image + alt with tutor local launch
-.. image:: ./docs/img/quickstart.gif
- :alt: Tutor local quickstart
- :target: https://terminalizer.com/view/91b0bfdd557
-Launch
+.. image:: ./docs/img/launch.webp
+ :alt: Tutor local launch
+ :target: https://www.terminalizer.com/view/3a8d55835686
+
+Quickstart
----------
1. Install the `latest stable release `_ of Tutor
@@ -71,7 +70,8 @@ Launch
Documentation
-------------
-Extensive documentation is available online: https://docs.tutor.overhang.io/
+Extensive documentation is available: https://docs.tutor.overhang.io/
+Extensive documentation is available: https://docs.tutor.overhang.io/
Is there a problem?
-------------------
diff --git a/changelog.d/20221124_172610_regis_nightly.md b/changelog.d/20221124_172610_regis_nightly.md
deleted file mode 100644
index cb257ff200..0000000000
--- a/changelog.d/20221124_172610_regis_nightly.md
+++ /dev/null
@@ -1,15 +0,0 @@
-- [Improvement] Add the `-h` help option to all commands and subcommands. Previously, we could only use `--help`, which is quite long for lazy fingers. (by @regisb)
-- 💥[Feature] Add an extensible `local/dev/k8s do ...` command to trigger custom job commands. These commands are used to run a series of bash scripts in designated containers. Any plugin can add custom jobs thanks to the `CLI_DO_COMMANDS` filter. This causes the following breaking changes:
- - The "init", "createuser", "settheme", "importdemocourse" commands were all migrated to this new interface. For instance, `tutor local init` was replaced by `tutor local do init`.
- - Plugin developers are encouraged to replace calls to the `COMMANDS_INIT` and `COMMANDS_PRE_INIT` filters by `CLI_DO_INIT_TASKS`.
-- [Feature] Implement hook filter priorities, which work like action priorities. (by @regisb)
-- 💥[Improvement] Remove the `local/dev bindmount` commands, which have been marked as deprecated for some time. The `--mount` option should be used instead.
-- 💥[Bugfix] Fix local installation requirements. Plugins that implemented the "openedx-dockerfile-post-python-requirements" patch and that needed access to the edx-platform repo will no longer work. Instead, these plugins should implement the "openedx-dockerfile-pre-assets" patch. This scenario should be very rare, though. (by @regisb)
-- 💥[Improvement] Rename the implementation of tutor quickstart to tutor launch. (by @Carlos-Muniz)
-- 💥[Improvement] Remove the implementation of tutor dev runserver. (by @Carlos-Muniz)
-- [Bugfix] Fix MongoDB replica set connection error resulting from edx-platform's pymongo (3.10.1 -> 3.12.3) upgrade ([edx-platform#30569](https://github.com/openedx/edx-platform/pull/30569)). (by @ormsbee)
-- [Improvement] For Tutor Nightly (and only Nightly), official plugins are now installed from their nightly branches on GitHub instead of a version range on PyPI. This will allow Nightly users to install all official plugins by running ``pip install -e ".[full]"``.
-- [Bugfix] Remove edX references from bulk emails ([issue](https://github.com/openedx/build-test-release-wg/issues/100)).
-- [Bugfix] Update ``celery`` invocations for lms-worker and cms-worker to be compatible with Celery 5 CLI.
-- [Improvement] Point CMS at its config file using ``CMS_CFG`` environment variable instead of deprecated ``STUDIO_CFG``.
-- [Bugfix] Start MongoDB when running migrations, because a new data migration fails if MongoDB is not running
diff --git a/docs/configuration.rst b/docs/configuration.rst
index 30d467a5af..b156950a48 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -130,7 +130,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/nutmeg.1"``)
+- ``OPENEDX_COMMON_VERSION`` (default: ``"open-release/olive.1"``)
This defines the default version that will be pulled from all Open edX git repositories.
@@ -150,7 +150,7 @@ These two configuration parameters define which Redis database to use for Open e
.. _openedx_extra_pip_requirements:
-- ``OPENEDX_EXTRA_PIP_REQUIREMENTS`` (default: ``openedx-scorm-xblock<13.0.0,>=12.0.0``)
+- ``OPENEDX_EXTRA_PIP_REQUIREMENTS`` (default: ``openedx-scorm-xblock>=15.0.0,<16.0.0``)
This defines extra pip packages that are going to be installed for Open edX.
@@ -170,10 +170,6 @@ This configuration parameter sets the Django setting ``AWS_SECRET_ACCESS_KEY`` i
This configuration parameter sets the name of the MySQL Database to be used by the Open edX Instance.
-- ``OPENEDX_CSMH_MYSQL_DATABASE`` (default: ``"{{ OPENEDX_MYSQL_DATABASE }}_csmh"``)
-
-This configuration parameter allows you to configure the name of the separate Courseware Student-Module History (CSMH) database.
-
- ``OPENEDX_MYSQL_USERNAME`` (default: ``"openedx"``)
This configuration parameter sets the username associated with the MySQL Database.
@@ -408,14 +404,14 @@ If you don't create your fork from this tag, you *will* have important compatibi
- Do not try to run a fork from an older (pre-Nutmeg) 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/nutmeg.master branch: Tutor will attempt to apply security and bug fix patches that might already be included in the open-release/nutmeg.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/nutmeg.master branch.
+- Do not try to run a fork from the open-release/olive.master branch: Tutor will attempt to apply security and bug fix patches that might already be included in the open-release/olive.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/olive.master branch.
.. _i18n:
Adding custom translations
~~~~~~~~~~~~~~~~~~~~~~~~~~
-If you are not running Open edX in English (``LANGUAGE_CODE`` default: ``"en"``), chances are that some strings will not be properly translated. In most cases, this is because not enough contributors have helped translate Open edX into your language. It happens! With Tutor, available translated languages include those that come bundled with `edx-platform `__ as well as those from `openedx-i18n `__.
+If you are not running Open edX in English (``LANGUAGE_CODE`` default: ``"en"``), chances are that some strings will not be properly translated. In most cases, this is because not enough contributors have helped translate Open edX into your language. It happens! With Tutor, available translated languages include those that come bundled with `edx-platform `__ as well as those from `openedx-i18n `__.
Tutor offers a relatively simple mechanism to add custom translations to the openedx Docker image. You should create a folder that corresponds to your language code in the "build/openedx/locale" folder of the Tutor environment. This folder should contain a "LC_MESSAGES" folder. For instance::
@@ -436,9 +432,9 @@ Then, add a "django.po" file there that will contain your custom translations::
.. warning::
Don't forget to specify the file ``Content-Type`` when adding message strings with non-ASCII characters; otherwise a ``UnicodeDecodeError`` will be raised during compilation.
-The "String to translate" part should match *exactly* the string that you would like to translate. You cannot make it up! The best way to find this string is to copy-paste it from the `upstream django.po file for the English language `__.
+The "String to translate" part should match *exactly* the string that you would like to translate. You cannot make it up! The best way to find this string is to copy-paste it from the `upstream django.po file for the English language `__.
-If you cannot find the string to translate in this file, then it means that you are trying to translate a string that is used in some piece of javascript code. Those strings are stored in a different file named "djangojs.po". You can check it out `in the edx-platform repo as well `__. Your custom javascript strings should also be stored in a "djangojs.po" file that should be placed in the same directory.
+If you cannot find the string to translate in this file, then it means that you are trying to translate a string that is used in some piece of javascript code. Those strings are stored in a different file named "djangojs.po". You can check it out `in the edx-platform repo as well `__. Your custom javascript strings should also be stored in a "djangojs.po" file that should be placed in the same directory.
To recap, here is an example. To translate a few strings in French, both from django.po and djangojs.po, we would have the following file hierarchy::
diff --git a/docs/dev.rst b/docs/dev.rst
index d52457f377..4ff7c933a6 100644
--- a/docs/dev.rst
+++ b/docs/dev.rst
@@ -92,7 +92,7 @@ The ``openedx-dev`` Docker image is based on the same ``openedx`` image used by
- 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/faq.rst b/docs/faq.rst
index cb6581debd..045eaa550b 100644
--- a/docs/faq.rst
+++ b/docs/faq.rst
@@ -38,7 +38,7 @@ The `devstack `_ is meant for development o
Is Tutor officially supported by edX?
-------------------------------------
-Yes: as of the Open edX Maple release (December 9th 2021), Tutor is the only officially supported installation method for Open edX: see the `official installation instructions `__.
+Yes: as of the Open edX Maple release (December 9th 2021), Tutor is the only officially supported installation method for Open edX: see the `official installation instructions `__.
What features are missing from Tutor?
-------------------------------------
diff --git a/docs/gettingstarted.rst b/docs/gettingstarted.rst
index b40792b3d7..3341091c78 100644
--- a/docs/gettingstarted.rst
+++ b/docs/gettingstarted.rst
@@ -8,5 +8,5 @@ Getting started
install
intro
- quickstart
+ quickstart
whatnext
diff --git a/docs/img/launch.webp b/docs/img/launch.webp
new file mode 100644
index 0000000000..1520accd15
Binary files /dev/null and b/docs/img/launch.webp differ
diff --git a/docs/img/quickstart.gif b/docs/img/quickstart.gif
deleted file mode 100644
index 901f9e50de..0000000000
Binary files a/docs/img/quickstart.gif and /dev/null differ
diff --git a/docs/index.rst b/docs/index.rst
index 4a2b1f49b0..7cabf55239 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -1,11 +1,10 @@
.. include:: ../README.rst
:start-after: _readme_intro_start:
:end-before: _readme_intro_end:
-..
- TODO replace quickstart.gif + alt with 'launch'
-.. image:: ./img/quickstart.gif
- :alt: Tutor local quickstart
- :target: https://terminalizer.com/view/91b0bfdd557
+
+.. image:: ./img/launch.webp
+ :alt: Tutor local launch
+ :target: https://www.terminalizer.com/view/3a8d55835686
----------------------------------
diff --git a/docs/k8s.rst b/docs/k8s.rst
index b8e8ae37c5..a7a80ad693 100644
--- a/docs/k8s.rst
+++ b/docs/k8s.rst
@@ -85,7 +85,7 @@ The other benefit of ``kubectl apply`` is that it allows you to customise the Ku
To learn more about "kustomizations", refer to the `official documentation `__.
-Launch
+Quickstart
----------
Launch the platform on Kubernetes in one command::
diff --git a/docs/local.rst b/docs/local.rst
index d9c4e1331a..62cb431d89 100644
--- a/docs/local.rst
+++ b/docs/local.rst
@@ -17,9 +17,6 @@ In the following, environment and data files will be generated in a user-specifi
export TUTOR_ROOT=/path/to/tutorroot
tutor run ...
-.. note::
- As of v10.0.0, a locally-running Open edX platform can no longer be accessed from http://localhost or http://studio.localhost. Instead, when running ``tutor local launch``, you must now decide whether you are running a platform that will be used in production. If not, the platform will be automatically be bound to http://local.overhang.io and http://studio.local.overhang.io, which are domain names that point to 127.0.0.1 (localhost). This change was made to facilitate internal communication between Docker containers.
-
Main commands
-------------
diff --git a/docs/quickstart.rst b/docs/quickstart.rst
index 5fb7f766fc..b8aba1d57e 100644
--- a/docs/quickstart.rst
+++ b/docs/quickstart.rst
@@ -1,4 +1,4 @@
-.. _launch:
+.. _quickstart:
Quickstart (1-click install)
----------------------------
@@ -22,7 +22,7 @@ Yes :) This is what happens when you run ``tutor local launch``:
2. Configuration files are generated from templates.
3. Docker images are downloaded.
4. Docker containers are provisioned.
-5. A full, production-ready Open edX platform (`Nutmeg `__ release) is run with docker-compose.
+5. A full, production-ready Open edX platform (`Nutmeg `__ release) is run with docker-compose.
The whole procedure should require less than 10 minutes, on a server with good bandwidth. Note that your host environment will not be affected in any way, since everything runs inside docker containers. Root access is not even necessary.
diff --git a/docs/whatnext.rst b/docs/whatnext.rst
index 37ce52117c..f185605222 100644
--- a/docs/whatnext.rst
+++ b/docs/whatnext.rst
@@ -3,7 +3,7 @@
What next?
==========
-You have gone through the :ref:`Launch installation `: at this point, you should have a running Open edX platform. If you don't, please follow the instructions from the :ref:`Troubleshooting ` section.
+You have gone through the :ref:`Quickstart installation `: at this point, you should have a running Open edX platform. If you don't, please follow the instructions from the :ref:`Troubleshooting ` section.
Logging-in as administrator
---------------------------
diff --git a/requirements/base.in b/requirements/base.in
index 8f2c811a05..a731194ea9 100644
--- a/requirements/base.in
+++ b/requirements/base.in
@@ -4,4 +4,4 @@ mypy
pycryptodome
jinja2>=2.10
kubernetes
-pyyaml>=4.2b1
+pyyaml>=6.0
diff --git a/requirements/base.txt b/requirements/base.txt
index 483b04a899..c389db18b2 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -1,5 +1,5 @@
#
-# This file is autogenerated by pip-compile with python 3.8
+# This file is autogenerated by pip-compile with python 3.10
# To update, run:
#
# pip-compile requirements/base.in
@@ -8,7 +8,7 @@ appdirs==1.4.4
# via -r requirements/base.in
cachetools==5.2.0
# via google-auth
-certifi==2022.9.24
+certifi==2022.12.7
# via
# kubernetes
# requests
@@ -16,7 +16,7 @@ charset-normalizer==2.1.1
# via requests
click==8.1.3
# via -r requirements/base.in
-google-auth==2.14.1
+google-auth==2.15.0
# via kubernetes
idna==3.4
# via requests
@@ -38,7 +38,7 @@ pyasn1==0.4.8
# rsa
pyasn1-modules==0.2.8
# via google-auth
-pycryptodome==3.15.0
+pycryptodome==3.16.0
# via -r requirements/base.in
python-dateutil==2.8.2
# via kubernetes
@@ -63,7 +63,7 @@ tomli==2.0.1
# via mypy
typing-extensions==4.4.0
# via mypy
-urllib3==1.26.12
+urllib3==1.26.13
# via
# kubernetes
# requests
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 5d30588368..586daf327f 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -1,5 +1,5 @@
#
-# This file is autogenerated by pip-compile with python 3.8
+# This file is autogenerated by pip-compile with python 3.10
# To update, run:
#
# pip-compile requirements/dev.in
@@ -22,7 +22,7 @@ cachetools==5.2.0
# via
# -r requirements/base.txt
# google-auth
-certifi==2022.9.24
+certifi==2022.12.7
# via
# -r requirements/base.txt
# kubernetes
@@ -46,7 +46,7 @@ commonmark==0.9.1
# via rich
coverage==6.5.0
# via -r requirements/dev.in
-cryptography==38.0.3
+cryptography==38.0.4
# via secretstorage
dill==0.3.6
# via pylint
@@ -54,7 +54,7 @@ docutils==0.17.1
# via
# -r requirements/dev.in
# readme-renderer
-google-auth==2.14.1
+google-auth==2.15.0
# via
# -r requirements/base.txt
# kubernetes
@@ -62,7 +62,7 @@ idna==3.4
# via
# -r requirements/base.txt
# requests
-importlib-metadata==5.0.0
+importlib-metadata==5.1.0
# via
# keyring
# twine
@@ -103,17 +103,17 @@ oauthlib==3.2.2
# via
# -r requirements/base.txt
# requests-oauthlib
-packaging==21.3
+packaging==22.0
# via build
pathspec==0.10.2
# via black
pep517==0.13.0
# via build
-pip-tools==6.10.0
+pip-tools==6.11.0
# via -r requirements/dev.in
-pkginfo==1.8.3
+pkginfo==1.9.2
# via twine
-platformdirs==2.5.4
+platformdirs==2.6.0
# via
# black
# pylint
@@ -128,20 +128,18 @@ pyasn1-modules==0.2.8
# google-auth
pycparser==2.21
# via cffi
-pycryptodome==3.15.0
+pycryptodome==3.16.0
# via -r requirements/base.txt
pygments==2.13.0
# via
# readme-renderer
# rich
-pyinstaller==5.6.2
+pyinstaller==5.7.0
# via -r requirements/dev.in
-pyinstaller-hooks-contrib==2022.13
+pyinstaller-hooks-contrib==2022.14
# via pyinstaller
-pylint==2.15.6
+pylint==2.15.8
# via -r requirements/dev.in
-pyparsing==3.0.9
- # via packaging
python-dateutil==2.8.2
# via
# -r requirements/base.txt
@@ -174,7 +172,7 @@ rsa==4.9
# via
# -r requirements/base.txt
# google-auth
-scriv==0.17.0
+scriv==1.0.0
# via -r requirements/dev.in
secretstorage==3.3.3
# via keyring
@@ -195,23 +193,19 @@ tomli==2.0.1
# pylint
tomlkit==0.11.6
# via pylint
-twine==4.0.1
+twine==4.0.2
# via -r requirements/dev.in
types-docutils==0.19.1.1
# via -r requirements/dev.in
types-pyyaml==6.0.12.2
# via -r requirements/dev.in
-types-setuptools==65.6.0.0
+types-setuptools==65.6.0.2
# via -r requirements/dev.in
typing-extensions==4.4.0
# via
# -r requirements/base.txt
- # astroid
- # black
# mypy
- # pylint
- # rich
-urllib3==1.26.12
+urllib3==1.26.13
# via
# -r requirements/base.txt
# kubernetes
@@ -227,7 +221,7 @@ wheel==0.38.4
# via pip-tools
wrapt==1.14.1
# via astroid
-zipp==3.10.0
+zipp==3.11.0
# via importlib-metadata
# The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/docs.txt b/requirements/docs.txt
index 67cffc56db..0b4da19d22 100644
--- a/requirements/docs.txt
+++ b/requirements/docs.txt
@@ -1,5 +1,5 @@
#
-# This file is autogenerated by pip-compile with python 3.8
+# This file is autogenerated by pip-compile with python 3.10
# To update, run:
#
# pip-compile requirements/docs.in
@@ -14,7 +14,7 @@ cachetools==5.2.0
# via
# -r requirements/base.txt
# google-auth
-certifi==2022.9.24
+certifi==2022.12.7
# via
# -r requirements/base.txt
# kubernetes
@@ -32,7 +32,7 @@ docutils==0.17.1
# sphinx
# sphinx-click
# sphinx-rtd-theme
-google-auth==2.14.1
+google-auth==2.15.0
# via
# -r requirements/base.txt
# kubernetes
@@ -42,8 +42,6 @@ idna==3.4
# requests
imagesize==1.4.1
# via sphinx
-importlib-metadata==5.0.0
- # via sphinx
jinja2==3.1.2
# via
# -r requirements/base.txt
@@ -64,7 +62,7 @@ oauthlib==3.2.2
# via
# -r requirements/base.txt
# requests-oauthlib
-packaging==21.3
+packaging==22.0
# via sphinx
pyasn1==0.4.8
# via
@@ -75,12 +73,10 @@ pyasn1-modules==0.2.8
# via
# -r requirements/base.txt
# google-auth
-pycryptodome==3.15.0
+pycryptodome==3.16.0
# via -r requirements/base.txt
pygments==2.13.0
# via sphinx
-pyparsing==3.0.9
- # via packaging
python-dateutil==2.8.2
# via
# -r requirements/base.txt
@@ -118,7 +114,7 @@ sphinx==5.3.0
# -r requirements/docs.in
# sphinx-click
# sphinx-rtd-theme
-sphinx-click==4.3.0
+sphinx-click==4.4.0
# via -r requirements/docs.in
sphinx-rtd-theme==1.1.1
# via -r requirements/docs.in
@@ -142,7 +138,7 @@ typing-extensions==4.4.0
# via
# -r requirements/base.txt
# mypy
-urllib3==1.26.12
+urllib3==1.26.13
# via
# -r requirements/base.txt
# kubernetes
@@ -151,8 +147,6 @@ websocket-client==1.4.2
# via
# -r requirements/base.txt
# kubernetes
-zipp==3.10.0
- # via importlib-metadata
# The following packages are considered to be unsafe in a requirements file:
# setuptools
diff --git a/requirements/plugins.txt b/requirements/plugins.txt
index 2f6f675c3e..7958312d7b 100644
--- a/requirements/plugins.txt
+++ b/requirements/plugins.txt
@@ -1,13 +1,11 @@
-# For Tutor Nightly, we install plugins from their nightly branches instead of from PyPI
-# (except tutor-license, for which we just want the latest version from PyPI).
-tutor-android @ git+https://github.com/overhangio/tutor-android@nightly
-tutor-discovery @ git+https://github.com/overhangio/tutor-discovery@nightly
-tutor-ecommerce @ git+https://github.com/overhangio/tutor-ecommerce@nightly
-tutor-forum @ git+https://github.com/overhangio/tutor-forum@nightly
-tutor-license
-tutor-mfe @ git+https://github.com/overhangio/tutor-mfe@nightly
-tutor-minio @ git+https://github.com/overhangio/tutor-minio@nightly
-tutor-notes @ git+https://github.com/overhangio/tutor-notes@nightly
-tutor-webui @ git+https://github.com/overhangio/tutor-webui@nightly
-tutor-xqueue @ git+https://github.com/overhangio/tutor-xqueue@nightly
-
+# change version ranges when upgrading from olive
+tutor-android>=15.0.0,<16.0.0
+tutor-discovery>=15.0.0,<16.0.0
+tutor-ecommerce>=15.0.0,<16.0.0
+tutor-forum>=15.0.0,<16.0.0
+tutor-license>=15.0.0,<16.0.0
+tutor-mfe>=15.0.0,<16.0.0
+tutor-minio>=15.0.0,<16.0.0
+tutor-notes>=15.0.0,<16.0.0
+tutor-webui>=15.0.0,<16.0.0
+tutor-xqueue>=15.0.0,<16.0.0
diff --git a/tests/test_env.py b/tests/test_env.py
index e74475d19d..969ef81a8f 100644
--- a/tests/test_env.py
+++ b/tests/test_env.py
@@ -258,6 +258,6 @@ def test_current_version_in_latest_env(self) -> None:
) as f:
f.write(__version__)
self.assertEqual(__version__, env.current_version(root))
- self.assertEqual("nutmeg", env.get_env_release(root))
+ self.assertEqual("olive", 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 de27f3a853..e7c1701a81 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__ = "14.2.3"
+__version__ = "15.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
@@ -10,7 +10,7 @@
# the nightly branch.
# The suffix is cleanly separated from the __version__ in this module to avoid
# conflicts when merging branches.
-__version_suffix__ = "nightly"
+__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/k8s.py b/tutor/commands/upgrade/k8s.py
index af970a0b19..0ab49b63b6 100644
--- a/tutor/commands/upgrade/k8s.py
+++ b/tutor/commands/upgrade/k8s.py
@@ -32,6 +32,10 @@ def upgrade_from(context: Context, from_release: str) -> None:
upgrade_from_maple(context, config)
running_release = "nutmeg"
+ if running_release == "nutmeg":
+ # Upgrade is a no-op
+ running_release = "olive"
+
def upgrade_from_ironwood(config: Config) -> None:
if not config["RUN_MONGODB"]:
diff --git a/tutor/commands/upgrade/local.py b/tutor/commands/upgrade/local.py
index b92f78aaf3..068111c29a 100644
--- a/tutor/commands/upgrade/local.py
+++ b/tutor/commands/upgrade/local.py
@@ -35,6 +35,10 @@ def upgrade_from(context: click.Context, from_release: str) -> None:
upgrade_from_maple(context, config)
running_release = "nutmeg"
+ if running_release == "nutmeg":
+ # Upgrade is a no-op
+ running_release = "olive"
+
def upgrade_from_ironwood(context: click.Context, config: Config) -> None:
click.echo(fmt.title("Upgrading from Ironwood"))
diff --git a/tutor/env.py b/tutor/env.py
index 6206092935..b3e2299507 100644
--- a/tutor/env.py
+++ b/tutor/env.py
@@ -384,6 +384,7 @@ def get_release(version: str) -> str:
"12": "lilac",
"13": "maple",
"14": "nutmeg",
+ "15": "olive",
}[version.split(".", maxsplit=1)[0]]
diff --git a/tutor/templates/apps/openedx/config/cms.env.yml b/tutor/templates/apps/openedx/config/cms.env.yml
index 9aa9b15200..c062b2c230 100644
--- a/tutor/templates/apps/openedx/config/cms.env.yml
+++ b/tutor/templates/apps/openedx/config/cms.env.yml
@@ -37,37 +37,4 @@ HTTPS: "{{ "on" if ENABLE_HTTPS else "off" }}"
LANGUAGE_CODE: "{{ LANGUAGE_CODE }}"
SESSION_COOKIE_DOMAIN: "{{ CMS_HOST }}"
{{ patch("cms-env") }}
-CACHES:
- default:
- KEY_PREFIX: "default"
- VERSION: "1"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- general:
- KEY_PREFIX: "general"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- mongo_metadata_inheritance:
- KEY_PREFIX: "mongo_metadata_inheritance"
- TIMEOUT: 300
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- staticfiles:
- KEY_PREFIX: "staticfiles_cms"
- BACKEND: "django.core.cache.backends.locmem.LocMemCache"
- LOCATION: "staticfiles_cms"
- configuration:
- KEY_PREFIX: "configuration"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- celery:
- KEY_PREFIX: "celery"
- TIMEOUT: "7200"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- course_structure_cache:
- KEY_PREFIX: "course_structure"
- TIMEOUT: "7200"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
{% include "apps/openedx/config/partials/auth.yml" %}
diff --git a/tutor/templates/apps/openedx/config/lms.env.yml b/tutor/templates/apps/openedx/config/lms.env.yml
index 81fcef8828..a1f93eb9a5 100644
--- a/tutor/templates/apps/openedx/config/lms.env.yml
+++ b/tutor/templates/apps/openedx/config/lms.env.yml
@@ -21,7 +21,6 @@ FEATURES:
ENABLE_PREREQUISITE_COURSES: true
ENABLE_THIRD_PARTY_AUTH: true
MILESTONES_APP: true
- PERSISTENT_GRADES_ENABLED_FOR_ALL_TESTS: true
LMS_ROOT_URL: "{{ "https" if ENABLE_HTTPS else "http" }}://{{ LMS_HOST }}"
CMS_ROOT_URL: "{{ "https" if ENABLE_HTTPS else "http" }}://{{ CMS_HOST }}"
CMS_BASE: "{{ CMS_HOST }}"
@@ -45,41 +44,4 @@ HTTPS: "{{ "on" if ENABLE_HTTPS else "off" }}"
LANGUAGE_CODE: "{{ LANGUAGE_CODE }}"
SESSION_COOKIE_DOMAIN: "{{ LMS_HOST }}"
{{ patch("lms-env") }}
-CACHES:
- default:
- KEY_PREFIX: "default"
- VERSION: "1"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- general:
- KEY_PREFIX: "general"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- mongo_metadata_inheritance:
- KEY_PREFIX: "mongo_metadata_inheritance"
- TIMEOUT: 300
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- staticfiles:
- KEY_PREFIX: "staticfiles_lms"
- BACKEND: "django.core.cache.backends.locmem.LocMemCache"
- LOCATION: "staticfiles_lms"
- configuration:
- KEY_PREFIX: "configuration"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- celery:
- KEY_PREFIX: "celery"
- TIMEOUT: "7200"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- course_structure_cache:
- KEY_PREFIX: "course_structure"
- TIMEOUT: "7200"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
- ora2-storage:
- KEY_PREFIX: "ora2-storage"
- BACKEND: "django_redis.cache.RedisCache"
- LOCATION: "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}"
{% include "apps/openedx/config/partials/auth.yml" %}
diff --git a/tutor/templates/apps/openedx/settings/partials/common_all.py b/tutor/templates/apps/openedx/settings/partials/common_all.py
index b22519922c..fb39fa8a9d 100644
--- a/tutor/templates/apps/openedx/settings/partials/common_all.py
+++ b/tutor/templates/apps/openedx/settings/partials/common_all.py
@@ -40,8 +40,46 @@
"port": {{ ELASTICSEARCH_PORT }},
}]
-CONTACT_MAILING_ADDRESS = "{{ PLATFORM_NAME }} - {% if ENABLE_HTTPS %}https{% else %}http{% endif %}://{{ LMS_HOST }}"
+# Common cache config
+CACHES = {
+ "default": {
+ "KEY_PREFIX": "default",
+ "VERSION": "1",
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+ },
+ "general": {
+ "KEY_PREFIX": "general",
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+ },
+ "mongo_metadata_inheritance": {
+ "KEY_PREFIX": "mongo_metadata_inheritance",
+ "TIMEOUT": 300,
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+ },
+ "configuration": {
+ "KEY_PREFIX": "configuration",
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+ },
+ "celery": {
+ "KEY_PREFIX": "celery",
+ "TIMEOUT": 7200,
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+ },
+ "course_structure_cache": {
+ "KEY_PREFIX": "course_structure",
+ "TIMEOUT": 7200,
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+ },
+}
+# Contact addresses
+CONTACT_MAILING_ADDRESS = "{{ PLATFORM_NAME }} - {% if ENABLE_HTTPS %}https{% else %}http{% endif %}://{{ LMS_HOST }}"
DEFAULT_FROM_EMAIL = ENV_TOKENS.get("DEFAULT_FROM_EMAIL", ENV_TOKENS["CONTACT_EMAIL"])
DEFAULT_FEEDBACK_EMAIL = ENV_TOKENS.get("DEFAULT_FEEDBACK_EMAIL", ENV_TOKENS["CONTACT_EMAIL"])
SERVER_EMAIL = ENV_TOKENS.get("SERVER_EMAIL", ENV_TOKENS["CONTACT_EMAIL"])
diff --git a/tutor/templates/apps/openedx/settings/partials/common_cms.py b/tutor/templates/apps/openedx/settings/partials/common_cms.py
index d609345920..c513de5364 100644
--- a/tutor/templates/apps/openedx/settings/partials/common_cms.py
+++ b/tutor/templates/apps/openedx/settings/partials/common_cms.py
@@ -1,8 +1,13 @@
{% include "apps/openedx/settings/partials/common_all.py" %}
######## Common CMS settings
+STUDIO_NAME = "{{ PLATFORM_NAME }} - Studio"
-STUDIO_NAME = u"{{ PLATFORM_NAME }} - Studio"
+CACHES["staticfiles"] = {
+ "KEY_PREFIX": "staticfiles_cms",
+ "BACKEND": "django.core.cache.backends.locmem.LocMemCache",
+ "LOCATION": "staticfiles_cms",
+}
# Authentication
SOCIAL_AUTH_EDX_OAUTH2_SECRET = "{{ CMS_OAUTH2_SECRET }}"
diff --git a/tutor/templates/apps/openedx/settings/partials/common_lms.py b/tutor/templates/apps/openedx/settings/partials/common_lms.py
index 522d6f1a68..5461d65aa6 100644
--- a/tutor/templates/apps/openedx/settings/partials/common_lms.py
+++ b/tutor/templates/apps/openedx/settings/partials/common_lms.py
@@ -21,10 +21,27 @@
# Email settings
DEFAULT_EMAIL_LOGO_URL = LMS_ROOT_URL + "/theming/asset/images/logo.png"
BULK_EMAIL_SEND_USING_EDX_ACE = True
+FEATURES["ENABLE_FOOTER_MOBILE_APP_LINKS"] = False
+
+# Branding
+MOBILE_STORE_ACE_URLS = {}
+SOCIAL_MEDIA_FOOTER_ACE_URLS = {}
# Make it possible to hide courses by default from the studio
SEARCH_SKIP_SHOW_IN_CATALOG_FILTERING = False
+# Caching
+CACHES["staticfiles"] = {
+ "KEY_PREFIX": "staticfiles_lms",
+ "BACKEND": "django.core.cache.backends.locmem.LocMemCache",
+ "LOCATION": "staticfiles_lms",
+}
+CACHES["ora2-storage"] = {
+ "KEY_PREFIX": "ora2-storage",
+ "BACKEND": "django_redis.cache.RedisCache",
+ "LOCATION": "redis://{% if REDIS_USERNAME and REDIS_PASSWORD %}{{ REDIS_USERNAME }}:{{ REDIS_PASSWORD }}{% endif %}@{{ REDIS_HOST }}:{{ REDIS_PORT }}/{{ OPENEDX_CACHE_REDIS_DB }}",
+}
+
# Create folders if necessary
for folder in [DATA_DIR, LOG_DIR, MEDIA_ROOT, STATIC_ROOT_BASE, ORA2_FILEUPLOAD_ROOT]:
if not os.path.exists(folder):
diff --git a/tutor/templates/build/openedx/Dockerfile b/tutor/templates/build/openedx/Dockerfile
index 4e8dd8becc..73513f4dc0 100644
--- a/tutor/templates/build/openedx/Dockerfile
+++ b/tutor/templates/build/openedx/Dockerfile
@@ -47,6 +47,9 @@ RUN git config --global user.email "tutor@overhang.io" \
{{ patch("openedx-dockerfile-git-patches-default") }}
{%- else %}
# Patch edx-platform
+# Fix broken Circuit Schematic Builder problem template
+# https://github.com/openedx/edx-platform/pull/31365
+RUN curl -fsSL https://github.com/openedx/edx-platform/commit/20b93b8b01276edadddfbbb67f15714fddd81c31.patch | git am
{%- endif %}
{# Example: RUN curl -fsSL https://github.com/openedx/edx-platform/commit/ | git am #}
@@ -73,7 +76,7 @@ RUN apt update && apt install -y software-properties-common libmysqlclient-dev l
# https://pypi.org/project/setuptools/
# https://pypi.org/project/pip/
# https://pypi.org/project/wheel/
-RUN pip install setuptools==62.1.0 pip==22.0.4 wheel==0.37.1
+RUN pip install setuptools==65.5.1 pip==22.3.1. wheel==0.38.4
# Install base requirements
COPY --from=code /openedx/edx-platform/requirements/edx/base.txt /tmp/base.txt
@@ -85,7 +88,7 @@ RUN pip install django-redis==5.2.0
# Install uwsgi
# https://pypi.org/project/uWSGI/
-RUN pip install uwsgi==2.0.20
+RUN pip install uwsgi==2.0.21
{{ patch("openedx-dockerfile-post-python-requirements") }}
@@ -103,7 +106,8 @@ FROM python as nodejs-requirements
ENV PATH /openedx/nodeenv/bin:/openedx/venv/bin:${PATH}
# Install nodeenv with the version provided by edx-platform
-RUN pip install nodeenv==1.6.0
+# https://github.com/openedx/edx-platform/blob/master/requirements/edx/base.txt
+RUN pip install nodeenv==1.7.0
RUN nodeenv /openedx/nodeenv --node=16.14.0 --prebuilt
# Install nodejs requirements
diff --git a/tutor/templates/build/openedx/revisions.yml b/tutor/templates/build/openedx/revisions.yml
index d75f161c43..ecd9dcea73 100644
--- a/tutor/templates/build/openedx/revisions.yml
+++ b/tutor/templates/build/openedx/revisions.yml
@@ -1 +1 @@
-EDX_PLATFORM_REVISION: nutmeg
+EDX_PLATFORM_REVISION: olive
diff --git a/tutor/templates/config/defaults.yml b/tutor/templates/config/defaults.yml
index 33a2cead22..819a476b75 100644
--- a/tutor/templates/config/defaults.yml
+++ b/tutor/templates/config/defaults.yml
@@ -50,11 +50,10 @@ OPENEDX_CELERY_REDIS_DB: 0
OPENEDX_CMS_UWSGI_WORKERS: 2
OPENEDX_LMS_UWSGI_WORKERS: 2
OPENEDX_MYSQL_DATABASE: "openedx"
-OPENEDX_CSMH_MYSQL_DATABASE: "{{ OPENEDX_MYSQL_DATABASE }}_csmh"
OPENEDX_MYSQL_USERNAME: "openedx"
-OPENEDX_COMMON_VERSION: "master"
+OPENEDX_COMMON_VERSION: "open-release/olive.1"
OPENEDX_EXTRA_PIP_REQUIREMENTS:
- - "openedx-scorm-xblock<15.0.0,>=14.0.0"
+ - "openedx-scorm-xblock>=15.0.0,<16.0.0"
MYSQL_HOST: "mysql"
MYSQL_PORT: 3306
MYSQL_ROOT_USERNAME: "root"