Repository: FlexMeasures/flexmeasures (language: python)

Issue:
Flask kept at <3.0
After deprecating FLASK_ENV the flask package could possibly be upgraded to 3.0 or higher but because of other dependencies did not yet move. We don't want flask to move to 3.0 without testing this extensively.
installation: bump piptools to target >=7.2
## Description

This PR improves the Makefile, by bumping the minimum requirement for piptools to 7.2.  This allows us to use the new `--constraint` flag while installing the required dependencies.

---

- [X] I agree to contribute to the project under Apache 2 License. 
- [X] To the best of my knowledge, the proposed patch is not based on code under GPL or other license that is incompatible with FlexMeasures



Discussion / hints:

Fix patch:
diff --git a/Makefile b/Makefile
index 78f35bdfe..f66b7d343 100644
--- a/Makefile
+++ b/Makefile
@@ -50,10 +50,7 @@ install-for-test:
 ifneq ($(pinned), no)
 	pip-sync requirements/${PYV}/app.txt requirements/${PYV}/test.txt
 else
-	# cutting off the -c inter-layer dependency (that's pip-tools specific)
-	tail -n +3 requirements/test.in >> temp-test.in
-	pip install --upgrade -r requirements/app.in -r temp-test.in
-	rm temp-test.in
+	pip install --upgrade -r requirements/app.in -r requirements/test.in
 endif
 	make install-flexmeasures
 # Locally install HiGS on macOS
diff --git a/requirements/3.10/app.txt b/requirements/3.10/app.txt
index a5c26e6d4..379326ab9 100644
--- a/requirements/3.10/app.txt
+++ b/requirements/3.10/app.txt
@@ -4,32 +4,40 @@
 #
 #    pip-compile --output-file=requirements/3.10/app.txt requirements/app.in
 #
-alembic==1.13.1
+alembic==1.13.2
     # via flask-migrate
-altair==5.3.0
+altair==5.4.1
     # via -r requirements/app.in
+appdirs==1.4.4
+    # via pint
+argon2-cffi==23.1.0
+    # via -r requirements/app.in
+argon2-cffi-bindings==21.2.0
+    # via argon2-cffi
 arrow==1.3.0
     # via rq-dashboard
 async-timeout==4.0.3
     # via redis
-attrs==23.2.0
+attrs==24.2.0
     # via
     #   jsonschema
     #   referencing
-babel==2.14.0
+babel==2.16.0
     # via py-moneyed
 bcrypt==4.0.1
     # via -r requirements/app.in
-blinker==1.7.0
+blinker==1.8.2
     # via
+    #   flask
     #   flask-mail
     #   flask-principal
-    #   flask-security-too
     #   sentry-sdk
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   requests
     #   sentry-sdk
+cffi==1.17.1
+    # via argon2-cffi-bindings
 charset-normalizer==3.3.2
     # via requests
 click==8.1.7
@@ -40,9 +48,7 @@ click==8.1.7
     #   rq
 click-default-group==1.2.4
     # via -r requirements/app.in
-colour==0.1.5
-    # via -r requirements/app.in
-contourpy==1.2.1
+contourpy==1.3.0
     # via matplotlib
 convertdate==2.4.0
     # via workalendar
@@ -52,13 +58,13 @@ dill==0.3.8
     # via openturns
 dnspython==2.6.1
     # via email-validator
-email-validator==2.1.1
+email-validator==2.2.0
     # via
     #   -r requirements/app.in
     #   flask-security-too
-filelock==3.13.3
+filelock==3.16.1
     # via tldextract
-flask==2.2.5
+flask==3.0.3
     # via
     #   -r requirements/app.in
     #   flask-classful
@@ -77,7 +83,7 @@ flask==2.2.5
     #   sentry-sdk
 flask-classful==0.16.0
     # via -r requirements/app.in
-flask-cors==4.0.0
+flask-cors==5.0.0
     # via -r requirements/app.in
 flask-json==0.4.0
     # via -r requirements/app.in
@@ -85,7 +91,7 @@ flask-login==0.6.3
     # via
     #   -r requirements/app.in
     #   flask-security-too
-flask-mail==0.9.1
+flask-mail==0.10.0
     # via -r requirements/app.in
 flask-marshmallow==1.2.1
     # via -r requirements/app.in
@@ -93,7 +99,7 @@ flask-migrate==4.0.7
     # via -r requirements/app.in
 flask-principal==0.4.0
     # via flask-security-too
-flask-security-too==5.1.2
+flask-security-too==5.5.2
     # via -r requirements/app.in
 flask-sqlalchemy==3.1.1
     # via
@@ -105,21 +111,27 @@ flask-wtf==1.2.1
     # via
     #   -r requirements/app.in
     #   flask-security-too
-fonttools==4.51.0
+flexcache==0.3
+    # via pint
+flexparser==0.3.1
+    # via pint
+fonttools==4.53.1
     # via matplotlib
-greenlet==3.0.3
+greenlet==3.1.0
     # via sqlalchemy
-humanize==4.9.0
+humanize==4.10.0
     # via -r requirements/app.in
-idna==3.6
+idna==3.10
     # via
     #   email-validator
     #   requests
     #   tldextract
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -r requirements/app.in
     #   timely-beliefs
+importlib-resources==6.4.5
+    # via flask-security-too
 inflect==6.0.2
     # via -r requirements/app.in
 inflection==0.5.1
@@ -130,35 +142,37 @@ isodate==0.6.1
     # via
     #   -r requirements/app.in
     #   timely-beliefs
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   flask
-    #   flask-security-too
     #   flask-wtf
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   altair
     #   flask
-joblib==1.3.2
-    # via scikit-learn
-jsonschema==4.21.1
+joblib==1.4.2
+    # via
+    #   scikit-learn
+    #   sktime
+jsonschema==4.23.0
     # via altair
 jsonschema-specifications==2023.12.1
     # via jsonschema
-kiwisolver==1.4.5
+kiwisolver==1.4.7
     # via matplotlib
 lunardate==0.2.2
     # via workalendar
-mako==1.3.2
+mako==1.3.5
     # via alembic
 markupsafe==2.1.5
     # via
+    #   flask-security-too
     #   jinja2
     #   mako
     #   sentry-sdk
     #   werkzeug
     #   wtforms
-marshmallow==3.21.1
+marshmallow==3.22.0
     # via
     #   -r requirements/app.in
     #   flask-marshmallow
@@ -167,14 +181,14 @@ marshmallow==3.21.1
     #   webargs
 marshmallow-polyfield==5.11
     # via -r requirements/app.in
-marshmallow-sqlalchemy==1.0.0
+marshmallow-sqlalchemy==1.1.0
     # via -r requirements/app.in
-matplotlib==3.8.4
+matplotlib==3.9.2
     # via timetomodel
-numpy==1.24.4
+narwhals==1.8.2
+    # via altair
+numpy==1.26.4
     # via
-    #   -r requirements/app.in
-    #   altair
     #   contourpy
     #   matplotlib
     #   pandas
@@ -187,9 +201,9 @@ numpy==1.24.4
     #   timely-beliefs
     #   timetomodel
     #   uniplot
-openturns==1.22
+openturns==1.23
     # via timely-beliefs
-packaging==24.0
+packaging==24.1
     # via
     #   altair
     #   marshmallow
@@ -200,7 +214,6 @@ packaging==24.0
 pandas==2.2.1
     # via
     #   -r requirements/app.in
-    #   altair
     #   sktime
     #   statsmodels
     #   timely-beliefs
@@ -209,19 +222,17 @@ passlib==1.7.4
     # via flask-security-too
 patsy==0.5.6
     # via statsmodels
-pillow==10.3.0
+pillow==10.4.0
     # via
     #   -r requirements/app.in
     #   matplotlib
-pint==0.23
+pint==0.24.3
     # via -r requirements/app.in
 ply==3.11
     # via pyomo
 properscoring==0.1
     # via timely-beliefs
-pscript==0.7.7
-    # via -r requirements/app.in
-psutil==5.9.8
+psutil==6.0.0
     # via openturns
 psycopg2-binary==2.9.9
     # via
@@ -229,7 +240,9 @@ psycopg2-binary==2.9.9
     #   timely-beliefs
 py-moneyed==3.0
     # via -r requirements/app.in
-pydantic==1.10.15
+pycparser==2.22
+    # via cffi
+pydantic==1.10.18
     # via
     #   -r requirements/app.in
     #   inflect
@@ -237,9 +250,9 @@ pyluach==2.2.0
     # via workalendar
 pymeeus==0.5.12
     # via convertdate
-pyomo==6.7.1
+pyomo==6.8.0
     # via -r requirements/app.in
-pyparsing==3.1.2
+pyparsing==3.1.4
     # via matplotlib
 python-dateutil==2.9.0.post0
     # via
@@ -250,15 +263,15 @@ python-dateutil==2.9.0.post0
     #   workalendar
 python-dotenv==1.0.1
     # via -r requirements/app.in
-pytz==2024.1
+pytz==2024.2
     # via
     #   -r requirements/app.in
     #   pandas
     #   timely-beliefs
     #   timetomodel
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via -r requirements/app.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -r requirements/app.in
     #   redis-sentinel-url
@@ -266,33 +279,33 @@ redis==4.6.0
     #   rq-dashboard
 redis-sentinel-url==1.0.1
     # via rq-dashboard
-referencing==0.34.0
+referencing==0.35.1
     # via
     #   jsonschema
     #   jsonschema-specifications
-requests==2.31.0
+requests==2.32.3
     # via
     #   requests-file
     #   tldextract
-requests-file==2.0.0
+requests-file==2.1.0
     # via tldextract
-rpds-py==0.18.0
+rpds-py==0.20.0
     # via
     #   jsonschema
     #   referencing
-rq==1.16.1
+rq==1.16.2
     # via
     #   -r requirements/app.in
     #   rq-dashboard
 rq-dashboard==0.8.0.2
     # via -r requirements/app.in
-scikit-base==0.7.5
+scikit-base==0.9.0
     # via sktime
-scikit-learn==1.4.1.post1
+scikit-learn==1.5.2
     # via
     #   sktime
     #   timetomodel
-scipy==1.13.0
+scipy==1.14.1
     # via
     #   properscoring
     #   scikit-learn
@@ -300,16 +313,16 @@ scipy==1.13.0
     #   statsmodels
     #   timely-beliefs
     #   timetomodel
-sentry-sdk[flask]==1.44.1
+sentry-sdk[flask]==2.14.0
     # via -r requirements/app.in
 six==1.16.0
     # via
     #   isodate
     #   patsy
     #   python-dateutil
-sktime==0.28.0
+sktime==0.33.0
     # via timely-beliefs
-sqlalchemy==2.0.29
+sqlalchemy==2.0.35
     # via
     #   -r requirements/app.in
     #   alembic
@@ -317,43 +330,43 @@ sqlalchemy==2.0.29
     #   marshmallow-sqlalchemy
     #   timely-beliefs
     #   timetomodel
-statsmodels==0.14.1
+statsmodels==0.14.3
     # via timetomodel
 tabulate==0.9.0
     # via -r requirements/app.in
-threadpoolctl==3.4.0
+threadpoolctl==3.5.0
     # via scikit-learn
-timely-beliefs[forecast]==3.0.2
+timely-beliefs[forecast]==3.1.0
     # via -r requirements/app.in
 timetomodel==0.7.3
     # via -r requirements/app.in
 tldextract==5.1.2
     # via -r requirements/app.in
-toolz==0.12.1
-    # via altair
-types-python-dateutil==2.9.0.20240316
+types-python-dateutil==2.9.0.20240906
     # via arrow
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   alembic
     #   altair
+    #   flexcache
+    #   flexparser
     #   pint
     #   py-moneyed
     #   pydantic
     #   sqlalchemy
 tzdata==2024.1
     # via pandas
-uniplot==0.12.5
+uniplot==0.14.1
     # via -r requirements/app.in
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   requests
     #   sentry-sdk
-vl-convert-python==1.3.0
+vl-convert-python==1.6.1
     # via -r requirements/app.in
-webargs==8.4.0
+webargs==8.6.0
     # via -r requirements/app.in
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -r requirements/app.in
     #   flask
@@ -366,8 +379,5 @@ wtforms==3.1.2
     #   flask-wtf
 xlrd==2.0.1
     # via -r requirements/app.in
-zipp==3.18.1
+zipp==3.20.2
     # via importlib-metadata
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/requirements/3.10/dev.txt b/requirements/3.10/dev.txt
index de3162508..70187d283 100644
--- a/requirements/3.10/dev.txt
+++ b/requirements/3.10/dev.txt
@@ -4,7 +4,7 @@
 #
 #    pip-compile --constraint=requirements/3.10/app.txt --constraint=requirements/3.10/test.txt --output-file=requirements/3.10/dev.txt requirements/dev.in
 #
-black==22.3.0
+black==22.10.0
     # via -r requirements/dev.in
 cfgv==3.4.0
     # via pre-commit
@@ -15,52 +15,52 @@ click==8.1.7
     #   black
 distlib==0.3.8
     # via virtualenv
-filelock==3.13.3
+filelock==3.16.1
     # via
     #   -c requirements/3.10/app.txt
     #   virtualenv
-flake8==4.0.1
+flake8==6.0.0
     # via -r requirements/dev.in
 flake8-blind-except==0.2.1
     # via -r requirements/dev.in
-identify==2.5.35
+identify==2.6.1
     # via pre-commit
-mccabe==0.6.1
+mccabe==0.7.0
     # via flake8
-mypy==1.9.0
+mypy==1.11.2
     # via -r requirements/dev.in
 mypy-extensions==1.0.0
     # via
     #   black
     #   mypy
-nodeenv==1.8.0
+nodeenv==1.9.1
     # via pre-commit
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.10/app.txt
     #   -c requirements/3.10/test.txt
     #   setuptools-scm
 pathspec==0.12.1
     # via black
-platformdirs==4.2.0
+platformdirs==4.3.6
     # via
     #   black
     #   virtualenv
-pre-commit==3.7.0
+pre-commit==3.8.0
     # via -r requirements/dev.in
-pycodestyle==2.8.0
+pycodestyle==2.10.0
     # via flake8
-pyflakes==2.4.0
+pyflakes==3.0.1
     # via flake8
-pyinstrument==4.6.2
+pyinstrument==4.7.3
     # via -r requirements/dev.in
 pytest-runner==6.0.1
     # via -r requirements/dev.in
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via
     #   -c requirements/3.10/app.txt
     #   pre-commit
-setuptools-scm==8.0.4
+setuptools-scm==8.1.0
     # via -r requirements/dev.in
 tomli==2.0.1
     # via
@@ -68,14 +68,14 @@ tomli==2.0.1
     #   black
     #   mypy
     #   setuptools-scm
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   -c requirements/3.10/app.txt
+    #   -c requirements/3.10/test.txt
     #   mypy
-    #   setuptools-scm
-virtualenv==20.25.1
+virtualenv==20.26.5
     # via pre-commit
-watchdog==4.0.0
+watchdog==5.0.2
     # via -r requirements/dev.in
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/3.10/docs.txt b/requirements/3.10/docs.txt
index b072c380b..8f9d92962 100644
--- a/requirements/3.10/docs.txt
+++ b/requirements/3.10/docs.txt
@@ -6,11 +6,11 @@
 #
 alabaster==0.7.16
     # via sphinx
-babel==2.14.0
+babel==2.16.0
     # via
     #   -c requirements/3.10/app.txt
     #   sphinx
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   -c requirements/3.10/app.txt
     #   requests
@@ -23,13 +23,13 @@ docutils==0.20.1
     #   sphinx
     #   sphinx-rtd-theme
     #   sphinx-tabs
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.10/app.txt
     #   requests
 imagesize==1.4.1
     # via sphinx
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.10/app.txt
     #   sphinx
@@ -37,15 +37,15 @@ markupsafe==2.1.5
     # via
     #   -c requirements/3.10/app.txt
     #   jinja2
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.10/app.txt
     #   sphinx
-pygments==2.17.2
+pygments==2.18.0
     # via
     #   sphinx
     #   sphinx-tabs
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.10/app.txt
     #   sphinx
@@ -55,7 +55,7 @@ six==1.16.0
     #   sphinxcontrib-httpdomain
 snowballstemmer==2.2.0
     # via sphinx
-sphinx==7.2.6
+sphinx==7.4.7
     # via
     #   -r requirements/docs.in
     #   sphinx-copybutton
@@ -72,11 +72,11 @@ sphinx-rtd-theme==2.0.0
     # via -r requirements/docs.in
 sphinx-tabs==3.4.5
     # via -r requirements/docs.in
-sphinxcontrib-applehelp==1.0.8
+sphinxcontrib-applehelp==2.0.0
     # via sphinx
-sphinxcontrib-devhelp==1.0.6
+sphinxcontrib-devhelp==2.0.0
     # via sphinx
-sphinxcontrib-htmlhelp==2.0.5
+sphinxcontrib-htmlhelp==2.1.0
     # via sphinx
 sphinxcontrib-httpdomain==1.8.1
     # via -r requirements/docs.in
@@ -84,11 +84,13 @@ sphinxcontrib-jquery==4.1
     # via sphinx-rtd-theme
 sphinxcontrib-jsmath==1.0.1
     # via sphinx
-sphinxcontrib-qthelp==1.0.7
+sphinxcontrib-qthelp==2.0.0
     # via sphinx
-sphinxcontrib-serializinghtml==1.1.10
+sphinxcontrib-serializinghtml==2.0.0
     # via sphinx
-urllib3==2.2.1
+tomli==2.0.1
+    # via sphinx
+urllib3==2.2.3
     # via
     #   -c requirements/3.10/app.txt
     #   requests
diff --git a/requirements/3.11/app.txt b/requirements/3.11/app.txt
index e494cdf80..6cbdf868a 100644
--- a/requirements/3.11/app.txt
+++ b/requirements/3.11/app.txt
@@ -4,30 +4,38 @@
 #
 #    pip-compile --output-file=requirements/3.11/app.txt requirements/app.in
 #
-alembic==1.13.1
+alembic==1.13.2
     # via flask-migrate
-altair==5.3.0
+altair==5.4.1
     # via -r requirements/app.in
+appdirs==1.4.4
+    # via pint
+argon2-cffi==23.1.0
+    # via -r requirements/app.in
+argon2-cffi-bindings==21.2.0
+    # via argon2-cffi
 arrow==1.3.0
     # via rq-dashboard
-attrs==23.2.0
+attrs==24.2.0
     # via
     #   jsonschema
     #   referencing
-babel==2.14.0
+babel==2.16.0
     # via py-moneyed
 bcrypt==4.0.1
     # via -r requirements/app.in
-blinker==1.7.0
+blinker==1.8.2
     # via
+    #   flask
     #   flask-mail
     #   flask-principal
-    #   flask-security-too
     #   sentry-sdk
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   requests
     #   sentry-sdk
+cffi==1.17.1
+    # via argon2-cffi-bindings
 charset-normalizer==3.3.2
     # via requests
 click==8.1.7
@@ -38,9 +46,7 @@ click==8.1.7
     #   rq
 click-default-group==1.2.4
     # via -r requirements/app.in
-colour==0.1.5
-    # via -r requirements/app.in
-contourpy==1.2.1
+contourpy==1.3.0
     # via matplotlib
 convertdate==2.4.0
     # via workalendar
@@ -50,13 +56,13 @@ dill==0.3.8
     # via openturns
 dnspython==2.6.1
     # via email-validator
-email-validator==2.1.1
+email-validator==2.2.0
     # via
     #   -r requirements/app.in
     #   flask-security-too
-filelock==3.13.3
+filelock==3.16.1
     # via tldextract
-flask==2.2.5
+flask==3.0.3
     # via
     #   -r requirements/app.in
     #   flask-classful
@@ -75,7 +81,7 @@ flask==2.2.5
     #   sentry-sdk
 flask-classful==0.16.0
     # via -r requirements/app.in
-flask-cors==4.0.0
+flask-cors==5.0.0
     # via -r requirements/app.in
 flask-json==0.4.0
     # via -r requirements/app.in
@@ -83,7 +89,7 @@ flask-login==0.6.3
     # via
     #   -r requirements/app.in
     #   flask-security-too
-flask-mail==0.9.1
+flask-mail==0.10.0
     # via -r requirements/app.in
 flask-marshmallow==1.2.1
     # via -r requirements/app.in
@@ -91,7 +97,7 @@ flask-migrate==4.0.7
     # via -r requirements/app.in
 flask-principal==0.4.0
     # via flask-security-too
-flask-security-too==5.1.2
+flask-security-too==5.5.2
     # via -r requirements/app.in
 flask-sqlalchemy==3.1.1
     # via
@@ -103,21 +109,27 @@ flask-wtf==1.2.1
     # via
     #   -r requirements/app.in
     #   flask-security-too
-fonttools==4.51.0
+flexcache==0.3
+    # via pint
+flexparser==0.3.1
+    # via pint
+fonttools==4.53.1
     # via matplotlib
-greenlet==3.0.3
+greenlet==3.1.0
     # via sqlalchemy
-humanize==4.9.0
+humanize==4.10.0
     # via -r requirements/app.in
-idna==3.6
+idna==3.10
     # via
     #   email-validator
     #   requests
     #   tldextract
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -r requirements/app.in
     #   timely-beliefs
+importlib-resources==6.4.5
+    # via flask-security-too
 inflect==6.0.2
     # via -r requirements/app.in
 inflection==0.5.1
@@ -128,35 +140,37 @@ isodate==0.6.1
     # via
     #   -r requirements/app.in
     #   timely-beliefs
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   flask
-    #   flask-security-too
     #   flask-wtf
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   altair
     #   flask
-joblib==1.3.2
-    # via scikit-learn
-jsonschema==4.21.1
+joblib==1.4.2
+    # via
+    #   scikit-learn
+    #   sktime
+jsonschema==4.23.0
     # via altair
 jsonschema-specifications==2023.12.1
     # via jsonschema
-kiwisolver==1.4.5
+kiwisolver==1.4.7
     # via matplotlib
 lunardate==0.2.2
     # via workalendar
-mako==1.3.2
+mako==1.3.5
     # via alembic
 markupsafe==2.1.5
     # via
+    #   flask-security-too
     #   jinja2
     #   mako
     #   sentry-sdk
     #   werkzeug
     #   wtforms
-marshmallow==3.21.1
+marshmallow==3.22.0
     # via
     #   -r requirements/app.in
     #   flask-marshmallow
@@ -165,14 +179,14 @@ marshmallow==3.21.1
     #   webargs
 marshmallow-polyfield==5.11
     # via -r requirements/app.in
-marshmallow-sqlalchemy==1.0.0
+marshmallow-sqlalchemy==1.1.0
     # via -r requirements/app.in
-matplotlib==3.8.4
+matplotlib==3.9.2
     # via timetomodel
-numpy==1.24.4
+narwhals==1.8.2
+    # via altair
+numpy==1.26.4
     # via
-    #   -r requirements/app.in
-    #   altair
     #   contourpy
     #   matplotlib
     #   pandas
@@ -185,9 +199,9 @@ numpy==1.24.4
     #   timely-beliefs
     #   timetomodel
     #   uniplot
-openturns==1.22
+openturns==1.23
     # via timely-beliefs
-packaging==24.0
+packaging==24.1
     # via
     #   altair
     #   marshmallow
@@ -198,7 +212,6 @@ packaging==24.0
 pandas==2.2.1
     # via
     #   -r requirements/app.in
-    #   altair
     #   sktime
     #   statsmodels
     #   timely-beliefs
@@ -207,19 +220,17 @@ passlib==1.7.4
     # via flask-security-too
 patsy==0.5.6
     # via statsmodels
-pillow==10.3.0
+pillow==10.4.0
     # via
     #   -r requirements/app.in
     #   matplotlib
-pint==0.23
+pint==0.24.3
     # via -r requirements/app.in
 ply==3.11
     # via pyomo
 properscoring==0.1
     # via timely-beliefs
-pscript==0.7.7
-    # via -r requirements/app.in
-psutil==5.9.8
+psutil==6.0.0
     # via openturns
 psycopg2-binary==2.9.9
     # via
@@ -227,7 +238,9 @@ psycopg2-binary==2.9.9
     #   timely-beliefs
 py-moneyed==3.0
     # via -r requirements/app.in
-pydantic==1.10.15
+pycparser==2.22
+    # via cffi
+pydantic==1.10.18
     # via
     #   -r requirements/app.in
     #   inflect
@@ -235,9 +248,9 @@ pyluach==2.2.0
     # via workalendar
 pymeeus==0.5.12
     # via convertdate
-pyomo==6.7.1
+pyomo==6.8.0
     # via -r requirements/app.in
-pyparsing==3.1.2
+pyparsing==3.1.4
     # via matplotlib
 python-dateutil==2.9.0.post0
     # via
@@ -248,15 +261,15 @@ python-dateutil==2.9.0.post0
     #   workalendar
 python-dotenv==1.0.1
     # via -r requirements/app.in
-pytz==2024.1
+pytz==2024.2
     # via
     #   -r requirements/app.in
     #   pandas
     #   timely-beliefs
     #   timetomodel
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via -r requirements/app.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -r requirements/app.in
     #   redis-sentinel-url
@@ -264,33 +277,33 @@ redis==4.6.0
     #   rq-dashboard
 redis-sentinel-url==1.0.1
     # via rq-dashboard
-referencing==0.34.0
+referencing==0.35.1
     # via
     #   jsonschema
     #   jsonschema-specifications
-requests==2.31.0
+requests==2.32.3
     # via
     #   requests-file
     #   tldextract
-requests-file==2.0.0
+requests-file==2.1.0
     # via tldextract
-rpds-py==0.18.0
+rpds-py==0.20.0
     # via
     #   jsonschema
     #   referencing
-rq==1.16.1
+rq==1.16.2
     # via
     #   -r requirements/app.in
     #   rq-dashboard
 rq-dashboard==0.8.0.2
     # via -r requirements/app.in
-scikit-base==0.7.5
+scikit-base==0.9.0
     # via sktime
-scikit-learn==1.4.1.post1
+scikit-learn==1.5.2
     # via
     #   sktime
     #   timetomodel
-scipy==1.13.0
+scipy==1.14.1
     # via
     #   properscoring
     #   scikit-learn
@@ -298,16 +311,16 @@ scipy==1.13.0
     #   statsmodels
     #   timely-beliefs
     #   timetomodel
-sentry-sdk[flask]==1.44.1
+sentry-sdk[flask]==2.14.0
     # via -r requirements/app.in
 six==1.16.0
     # via
     #   isodate
     #   patsy
     #   python-dateutil
-sktime==0.28.0
+sktime==0.33.0
     # via timely-beliefs
-sqlalchemy==2.0.29
+sqlalchemy==2.0.35
     # via
     #   -r requirements/app.in
     #   alembic
@@ -315,42 +328,43 @@ sqlalchemy==2.0.29
     #   marshmallow-sqlalchemy
     #   timely-beliefs
     #   timetomodel
-statsmodels==0.14.1
+statsmodels==0.14.3
     # via timetomodel
 tabulate==0.9.0
     # via -r requirements/app.in
-threadpoolctl==3.4.0
+threadpoolctl==3.5.0
     # via scikit-learn
-timely-beliefs[forecast]==3.0.2
+timely-beliefs[forecast]==3.1.0
     # via -r requirements/app.in
 timetomodel==0.7.3
     # via -r requirements/app.in
 tldextract==5.1.2
     # via -r requirements/app.in
-toolz==0.12.1
-    # via altair
-types-python-dateutil==2.9.0.20240316
+types-python-dateutil==2.9.0.20240906
     # via arrow
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   alembic
+    #   altair
+    #   flexcache
+    #   flexparser
     #   pint
     #   py-moneyed
     #   pydantic
     #   sqlalchemy
 tzdata==2024.1
     # via pandas
-uniplot==0.12.5
+uniplot==0.14.1
     # via -r requirements/app.in
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   requests
     #   sentry-sdk
-vl-convert-python==1.3.0
+vl-convert-python==1.6.1
     # via -r requirements/app.in
-webargs==8.4.0
+webargs==8.6.0
     # via -r requirements/app.in
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -r requirements/app.in
     #   flask
@@ -363,8 +377,5 @@ wtforms==3.1.2
     #   flask-wtf
 xlrd==2.0.1
     # via -r requirements/app.in
-zipp==3.18.1
+zipp==3.20.2
     # via importlib-metadata
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/requirements/3.11/dev.txt b/requirements/3.11/dev.txt
index 6dd137150..f563977b6 100644
--- a/requirements/3.11/dev.txt
+++ b/requirements/3.11/dev.txt
@@ -4,7 +4,7 @@
 #
 #    pip-compile --constraint=requirements/3.11/app.txt --constraint=requirements/3.11/test.txt --output-file=requirements/3.11/dev.txt requirements/dev.in
 #
-black==22.3.0
+black==22.10.0
     # via -r requirements/dev.in
 cfgv==3.4.0
     # via pre-commit
@@ -15,61 +15,60 @@ click==8.1.7
     #   black
 distlib==0.3.8
     # via virtualenv
-filelock==3.13.3
+filelock==3.16.1
     # via
     #   -c requirements/3.11/app.txt
     #   virtualenv
-flake8==4.0.1
+flake8==6.0.0
     # via -r requirements/dev.in
 flake8-blind-except==0.2.1
     # via -r requirements/dev.in
-identify==2.5.35
+identify==2.6.1
     # via pre-commit
-mccabe==0.6.1
+mccabe==0.7.0
     # via flake8
-mypy==1.9.0
+mypy==1.11.2
     # via -r requirements/dev.in
 mypy-extensions==1.0.0
     # via
     #   black
     #   mypy
-nodeenv==1.8.0
+nodeenv==1.9.1
     # via pre-commit
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.11/app.txt
     #   -c requirements/3.11/test.txt
     #   setuptools-scm
 pathspec==0.12.1
     # via black
-platformdirs==4.2.0
+platformdirs==4.3.6
     # via
     #   black
     #   virtualenv
-pre-commit==3.7.0
+pre-commit==3.8.0
     # via -r requirements/dev.in
-pycodestyle==2.8.0
+pycodestyle==2.10.0
     # via flake8
-pyflakes==2.4.0
+pyflakes==3.0.1
     # via flake8
-pyinstrument==4.6.2
+pyinstrument==4.7.3
     # via -r requirements/dev.in
 pytest-runner==6.0.1
     # via -r requirements/dev.in
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via
     #   -c requirements/3.11/app.txt
     #   pre-commit
-setuptools-scm==8.0.4
+setuptools-scm==8.1.0
     # via -r requirements/dev.in
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   -c requirements/3.11/app.txt
     #   mypy
-    #   setuptools-scm
-virtualenv==20.25.1
+virtualenv==20.26.5
     # via pre-commit
-watchdog==4.0.0
+watchdog==5.0.2
     # via -r requirements/dev.in
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/3.11/docs.txt b/requirements/3.11/docs.txt
index 51fdfa5ac..617f43807 100644
--- a/requirements/3.11/docs.txt
+++ b/requirements/3.11/docs.txt
@@ -6,11 +6,11 @@
 #
 alabaster==0.7.16
     # via sphinx
-babel==2.14.0
+babel==2.16.0
     # via
     #   -c requirements/3.11/app.txt
     #   sphinx
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   -c requirements/3.11/app.txt
     #   requests
@@ -23,13 +23,13 @@ docutils==0.20.1
     #   sphinx
     #   sphinx-rtd-theme
     #   sphinx-tabs
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.11/app.txt
     #   requests
 imagesize==1.4.1
     # via sphinx
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.11/app.txt
     #   sphinx
@@ -37,15 +37,15 @@ markupsafe==2.1.5
     # via
     #   -c requirements/3.11/app.txt
     #   jinja2
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.11/app.txt
     #   sphinx
-pygments==2.17.2
+pygments==2.18.0
     # via
     #   sphinx
     #   sphinx-tabs
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.11/app.txt
     #   sphinx
@@ -55,7 +55,7 @@ six==1.16.0
     #   sphinxcontrib-httpdomain
 snowballstemmer==2.2.0
     # via sphinx
-sphinx==7.2.6
+sphinx==7.4.7
     # via
     #   -r requirements/docs.in
     #   sphinx-copybutton
@@ -72,11 +72,11 @@ sphinx-rtd-theme==2.0.0
     # via -r requirements/docs.in
 sphinx-tabs==3.4.5
     # via -r requirements/docs.in
-sphinxcontrib-applehelp==1.0.8
+sphinxcontrib-applehelp==2.0.0
     # via sphinx
-sphinxcontrib-devhelp==1.0.6
+sphinxcontrib-devhelp==2.0.0
     # via sphinx
-sphinxcontrib-htmlhelp==2.0.5
+sphinxcontrib-htmlhelp==2.1.0
     # via sphinx
 sphinxcontrib-httpdomain==1.8.1
     # via -r requirements/docs.in
@@ -84,11 +84,11 @@ sphinxcontrib-jquery==4.1
     # via sphinx-rtd-theme
 sphinxcontrib-jsmath==1.0.1
     # via sphinx
-sphinxcontrib-qthelp==1.0.7
+sphinxcontrib-qthelp==2.0.0
     # via sphinx
-sphinxcontrib-serializinghtml==1.1.10
+sphinxcontrib-serializinghtml==2.0.0
     # via sphinx
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   -c requirements/3.11/app.txt
     #   requests
diff --git a/requirements/3.8/app.txt b/requirements/3.8/app.txt
index 7dd86bea1..fbf61d932 100644
--- a/requirements/3.8/app.txt
+++ b/requirements/3.8/app.txt
@@ -4,34 +4,40 @@
 #
 #    pip-compile --output-file=requirements/3.8/app.txt requirements/app.in
 #
-alembic==1.13.1
+alembic==1.13.2
     # via flask-migrate
-altair==5.3.0
+altair==5.4.1
     # via -r requirements/app.in
+argon2-cffi==23.1.0
+    # via -r requirements/app.in
+argon2-cffi-bindings==21.2.0
+    # via argon2-cffi
 arrow==1.3.0
     # via rq-dashboard
 async-timeout==4.0.3
     # via redis
-attrs==23.2.0
+attrs==24.2.0
     # via
     #   jsonschema
     #   referencing
-babel==2.14.0
+babel==2.16.0
     # via py-moneyed
 backports-zoneinfo==0.2.1
     # via workalendar
 bcrypt==4.0.1
     # via -r requirements/app.in
-blinker==1.7.0
+blinker==1.8.2
     # via
+    #   flask
     #   flask-mail
     #   flask-principal
-    #   flask-security-too
     #   sentry-sdk
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   requests
     #   sentry-sdk
+cffi==1.17.1
+    # via argon2-cffi-bindings
 charset-normalizer==3.3.2
     # via requests
 click==8.1.7
@@ -42,8 +48,6 @@ click==8.1.7
     #   rq
 click-default-group==1.2.4
     # via -r requirements/app.in
-colour==0.1.5
-    # via -r requirements/app.in
 contourpy==1.1.1
     # via matplotlib
 convertdate==2.4.0
@@ -54,13 +58,13 @@ dill==0.3.8
     # via openturns
 dnspython==2.6.1
     # via email-validator
-email-validator==2.1.1
+email-validator==2.2.0
     # via
     #   -r requirements/app.in
     #   flask-security-too
-filelock==3.13.3
+filelock==3.16.1
     # via tldextract
-flask==2.2.5
+flask==3.0.3
     # via
     #   -r requirements/app.in
     #   flask-classful
@@ -79,7 +83,7 @@ flask==2.2.5
     #   sentry-sdk
 flask-classful==0.16.0
     # via -r requirements/app.in
-flask-cors==4.0.0
+flask-cors==5.0.0
     # via -r requirements/app.in
 flask-json==0.4.0
     # via -r requirements/app.in
@@ -87,7 +91,7 @@ flask-login==0.6.3
     # via
     #   -r requirements/app.in
     #   flask-security-too
-flask-mail==0.9.1
+flask-mail==0.10.0
     # via -r requirements/app.in
 flask-marshmallow==1.2.1
     # via -r requirements/app.in
@@ -95,7 +99,7 @@ flask-migrate==4.0.7
     # via -r requirements/app.in
 flask-principal==0.4.0
     # via flask-security-too
-flask-security-too==5.1.2
+flask-security-too==5.4.3
     # via -r requirements/app.in
 flask-sqlalchemy==3.1.1
     # via
@@ -107,26 +111,27 @@ flask-wtf==1.2.1
     # via
     #   -r requirements/app.in
     #   flask-security-too
-fonttools==4.51.0
+fonttools==4.53.1
     # via matplotlib
-greenlet==3.0.3
+greenlet==3.1.0
     # via sqlalchemy
-humanize==4.9.0
+humanize==4.10.0
     # via -r requirements/app.in
-idna==3.6
+idna==3.10
     # via
     #   email-validator
     #   requests
     #   tldextract
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -r requirements/app.in
     #   alembic
     #   flask
     #   timely-beliefs
-importlib-resources==6.4.0
+importlib-resources==6.4.5
     # via
     #   alembic
+    #   flask-security-too
     #   jsonschema
     #   jsonschema-specifications
     #   matplotlib
@@ -140,35 +145,35 @@ isodate==0.6.1
     # via
     #   -r requirements/app.in
     #   timely-beliefs
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   flask
-    #   flask-security-too
     #   flask-wtf
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   altair
     #   flask
-joblib==1.3.2
+joblib==1.4.2
     # via scikit-learn
-jsonschema==4.21.1
+jsonschema==4.23.0
     # via altair
 jsonschema-specifications==2023.12.1
     # via jsonschema
-kiwisolver==1.4.5
+kiwisolver==1.4.7
     # via matplotlib
 lunardate==0.2.2
     # via workalendar
-mako==1.3.2
+mako==1.3.5
     # via alembic
 markupsafe==2.1.5
     # via
+    #   flask-security-too
     #   jinja2
     #   mako
     #   sentry-sdk
     #   werkzeug
     #   wtforms
-marshmallow==3.21.1
+marshmallow==3.22.0
     # via
     #   -r requirements/app.in
     #   flask-marshmallow
@@ -177,14 +182,14 @@ marshmallow==3.21.1
     #   webargs
 marshmallow-polyfield==5.11
     # via -r requirements/app.in
-marshmallow-sqlalchemy==1.0.0
+marshmallow-sqlalchemy==1.1.0
     # via -r requirements/app.in
 matplotlib==3.7.5
     # via timetomodel
+narwhals==1.8.2
+    # via altair
 numpy==1.24.4
     # via
-    #   -r requirements/app.in
-    #   altair
     #   contourpy
     #   matplotlib
     #   pandas
@@ -197,9 +202,9 @@ numpy==1.24.4
     #   timely-beliefs
     #   timetomodel
     #   uniplot
-openturns==1.22
+openturns==1.23
     # via timely-beliefs
-packaging==24.0
+packaging==24.1
     # via
     #   altair
     #   marshmallow
@@ -210,7 +215,6 @@ packaging==24.0
 pandas==2.0.3
     # via
     #   -r requirements/app.in
-    #   altair
     #   sktime
     #   statsmodels
     #   timely-beliefs
@@ -219,7 +223,7 @@ passlib==1.7.4
     # via flask-security-too
 patsy==0.5.6
     # via statsmodels
-pillow==10.3.0
+pillow==10.4.0
     # via
     #   -r requirements/app.in
     #   matplotlib
@@ -231,9 +235,7 @@ ply==3.11
     # via pyomo
 properscoring==0.1
     # via timely-beliefs
-pscript==0.7.7
-    # via -r requirements/app.in
-psutil==5.9.8
+psutil==6.0.0
     # via openturns
 psycopg2-binary==2.9.9
     # via
@@ -241,7 +243,9 @@ psycopg2-binary==2.9.9
     #   timely-beliefs
 py-moneyed==3.0
     # via -r requirements/app.in
-pydantic==1.10.15
+pycparser==2.22
+    # via cffi
+pydantic==1.10.18
     # via
     #   -r requirements/app.in
     #   inflect
@@ -249,9 +253,9 @@ pyluach==2.2.0
     # via workalendar
 pymeeus==0.5.12
     # via convertdate
-pyomo==6.7.1
+pyomo==6.8.0
     # via -r requirements/app.in
-pyparsing==3.1.2
+pyparsing==3.1.4
     # via matplotlib
 python-dateutil==2.9.0.post0
     # via
@@ -262,16 +266,16 @@ python-dateutil==2.9.0.post0
     #   workalendar
 python-dotenv==1.0.1
     # via -r requirements/app.in
-pytz==2024.1
+pytz==2024.2
     # via
     #   -r requirements/app.in
     #   babel
     #   pandas
     #   timely-beliefs
     #   timetomodel
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via -r requirements/app.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -r requirements/app.in
     #   redis-sentinel-url
@@ -279,27 +283,27 @@ redis==4.6.0
     #   rq-dashboard
 redis-sentinel-url==1.0.1
     # via rq-dashboard
-referencing==0.34.0
+referencing==0.35.1
     # via
     #   jsonschema
     #   jsonschema-specifications
-requests==2.31.0
+requests==2.32.3
     # via
     #   requests-file
     #   tldextract
-requests-file==2.0.0
+requests-file==2.1.0
     # via tldextract
-rpds-py==0.18.0
+rpds-py==0.20.0
     # via
     #   jsonschema
     #   referencing
-rq==1.16.1
+rq==1.16.2
     # via
     #   -r requirements/app.in
     #   rq-dashboard
 rq-dashboard==0.8.0.2
     # via -r requirements/app.in
-scikit-base==0.7.5
+scikit-base==0.7.8
     # via sktime
 scikit-learn==1.3.2
     # via
@@ -313,16 +317,16 @@ scipy==1.10.1
     #   statsmodels
     #   timely-beliefs
     #   timetomodel
-sentry-sdk[flask]==1.44.1
+sentry-sdk[flask]==2.14.0
     # via -r requirements/app.in
 six==1.16.0
     # via
     #   isodate
     #   patsy
     #   python-dateutil
-sktime==0.28.0
+sktime==0.29.1
     # via timely-beliefs
-sqlalchemy==2.0.29
+sqlalchemy==2.0.35
     # via
     #   -r requirements/app.in
     #   alembic
@@ -334,19 +338,17 @@ statsmodels==0.14.1
     # via timetomodel
 tabulate==0.9.0
     # via -r requirements/app.in
-threadpoolctl==3.4.0
+threadpoolctl==3.5.0
     # via scikit-learn
-timely-beliefs[forecast]==3.0.2
+timely-beliefs[forecast]==3.1.0
     # via -r requirements/app.in
 timetomodel==0.7.3
     # via -r requirements/app.in
 tldextract==5.1.2
     # via -r requirements/app.in
-toolz==0.12.1
-    # via altair
-types-python-dateutil==2.9.0.20240316
+types-python-dateutil==2.9.0.20240906
     # via arrow
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   alembic
     #   altair
@@ -355,17 +357,17 @@ typing-extensions==4.11.0
     #   sqlalchemy
 tzdata==2024.1
     # via pandas
-uniplot==0.12.5
+uniplot==0.14.1
     # via -r requirements/app.in
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   requests
     #   sentry-sdk
-vl-convert-python==1.3.0
+vl-convert-python==1.6.1
     # via -r requirements/app.in
-webargs==8.4.0
+webargs==8.6.0
     # via -r requirements/app.in
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -r requirements/app.in
     #   flask
@@ -378,10 +380,7 @@ wtforms==3.1.2
     #   flask-wtf
 xlrd==2.0.1
     # via -r requirements/app.in
-zipp==3.18.1
+zipp==3.20.2
     # via
     #   importlib-metadata
     #   importlib-resources
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/requirements/3.8/dev.txt b/requirements/3.8/dev.txt
index b7ba06b41..bba6d3012 100644
--- a/requirements/3.8/dev.txt
+++ b/requirements/3.8/dev.txt
@@ -4,7 +4,7 @@
 #
 #    pip-compile --constraint=requirements/3.8/app.txt --constraint=requirements/3.8/test.txt --output-file=requirements/3.8/dev.txt requirements/dev.in
 #
-black==22.3.0
+black==22.10.0
     # via -r requirements/dev.in
 cfgv==3.4.0
     # via pre-commit
@@ -15,52 +15,52 @@ click==8.1.7
     #   black
 distlib==0.3.8
     # via virtualenv
-filelock==3.13.3
+filelock==3.16.1
     # via
     #   -c requirements/3.8/app.txt
     #   virtualenv
-flake8==4.0.1
+flake8==6.0.0
     # via -r requirements/dev.in
 flake8-blind-except==0.2.1
     # via -r requirements/dev.in
-identify==2.5.35
+identify==2.6.1
     # via pre-commit
-mccabe==0.6.1
+mccabe==0.7.0
     # via flake8
-mypy==1.9.0
+mypy==1.11.2
     # via -r requirements/dev.in
 mypy-extensions==1.0.0
     # via
     #   black
     #   mypy
-nodeenv==1.8.0
+nodeenv==1.9.1
     # via pre-commit
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.8/app.txt
     #   -c requirements/3.8/test.txt
     #   setuptools-scm
 pathspec==0.12.1
     # via black
-platformdirs==4.2.0
+platformdirs==4.3.6
     # via
     #   black
     #   virtualenv
 pre-commit==3.5.0
     # via -r requirements/dev.in
-pycodestyle==2.8.0
+pycodestyle==2.10.0
     # via flake8
-pyflakes==2.4.0
+pyflakes==3.0.1
     # via flake8
-pyinstrument==4.6.2
+pyinstrument==4.7.3
     # via -r requirements/dev.in
 pytest-runner==6.0.1
     # via -r requirements/dev.in
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via
     #   -c requirements/3.8/app.txt
     #   pre-commit
-setuptools-scm==8.0.4
+setuptools-scm==8.1.0
     # via -r requirements/dev.in
 tomli==2.0.1
     # via
@@ -68,15 +68,16 @@ tomli==2.0.1
     #   black
     #   mypy
     #   setuptools-scm
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   -c requirements/3.8/app.txt
+    #   -c requirements/3.8/test.txt
     #   black
     #   mypy
     #   setuptools-scm
-virtualenv==20.25.1
+virtualenv==20.26.5
     # via pre-commit
-watchdog==4.0.0
+watchdog==4.0.2
     # via -r requirements/dev.in
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/3.8/docs.txt b/requirements/3.8/docs.txt
index 8ec8b78d2..f10561f04 100644
--- a/requirements/3.8/docs.txt
+++ b/requirements/3.8/docs.txt
@@ -6,11 +6,11 @@
 #
 alabaster==0.7.13
     # via sphinx
-babel==2.14.0
+babel==2.16.0
     # via
     #   -c requirements/3.8/app.txt
     #   sphinx
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   -c requirements/3.8/app.txt
     #   requests
@@ -23,17 +23,17 @@ docutils==0.20.1
     #   sphinx
     #   sphinx-rtd-theme
     #   sphinx-tabs
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.8/app.txt
     #   requests
 imagesize==1.4.1
     # via sphinx
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -c requirements/3.8/app.txt
     #   sphinx
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.8/app.txt
     #   sphinx
@@ -41,19 +41,19 @@ markupsafe==2.1.5
     # via
     #   -c requirements/3.8/app.txt
     #   jinja2
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.8/app.txt
     #   sphinx
-pygments==2.17.2
+pygments==2.18.0
     # via
     #   sphinx
     #   sphinx-tabs
-pytz==2024.1
+pytz==2024.2
     # via
     #   -c requirements/3.8/app.txt
     #   babel
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.8/app.txt
     #   sphinx
@@ -96,11 +96,11 @@ sphinxcontrib-qthelp==1.0.3
     # via sphinx
 sphinxcontrib-serializinghtml==1.1.5
     # via sphinx
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   -c requirements/3.8/app.txt
     #   requests
-zipp==3.18.1
+zipp==3.20.2
     # via
     #   -c requirements/3.8/app.txt
     #   importlib-metadata
diff --git a/requirements/3.9/app.txt b/requirements/3.9/app.txt
index ae0df1a7b..34857dc35 100644
--- a/requirements/3.9/app.txt
+++ b/requirements/3.9/app.txt
@@ -4,32 +4,40 @@
 #
 #    pip-compile --output-file=requirements/3.9/app.txt requirements/app.in
 #
-alembic==1.13.1
+alembic==1.13.2
     # via flask-migrate
-altair==5.3.0
+altair==5.4.1
     # via -r requirements/app.in
+appdirs==1.4.4
+    # via pint
+argon2-cffi==23.1.0
+    # via -r requirements/app.in
+argon2-cffi-bindings==21.2.0
+    # via argon2-cffi
 arrow==1.3.0
     # via rq-dashboard
 async-timeout==4.0.3
     # via redis
-attrs==23.2.0
+attrs==24.2.0
     # via
     #   jsonschema
     #   referencing
-babel==2.14.0
+babel==2.16.0
     # via py-moneyed
 bcrypt==4.0.1
     # via -r requirements/app.in
-blinker==1.7.0
+blinker==1.8.2
     # via
+    #   flask
     #   flask-mail
     #   flask-principal
-    #   flask-security-too
     #   sentry-sdk
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   requests
     #   sentry-sdk
+cffi==1.17.1
+    # via argon2-cffi-bindings
 charset-normalizer==3.3.2
     # via requests
 click==8.1.7
@@ -40,9 +48,7 @@ click==8.1.7
     #   rq
 click-default-group==1.2.4
     # via -r requirements/app.in
-colour==0.1.5
-    # via -r requirements/app.in
-contourpy==1.2.1
+contourpy==1.3.0
     # via matplotlib
 convertdate==2.4.0
     # via workalendar
@@ -52,13 +58,13 @@ dill==0.3.8
     # via openturns
 dnspython==2.6.1
     # via email-validator
-email-validator==2.1.1
+email-validator==2.2.0
     # via
     #   -r requirements/app.in
     #   flask-security-too
-filelock==3.13.3
+filelock==3.16.1
     # via tldextract
-flask==2.2.5
+flask==3.0.3
     # via
     #   -r requirements/app.in
     #   flask-classful
@@ -77,7 +83,7 @@ flask==2.2.5
     #   sentry-sdk
 flask-classful==0.16.0
     # via -r requirements/app.in
-flask-cors==4.0.0
+flask-cors==5.0.0
     # via -r requirements/app.in
 flask-json==0.4.0
     # via -r requirements/app.in
@@ -85,7 +91,7 @@ flask-login==0.6.3
     # via
     #   -r requirements/app.in
     #   flask-security-too
-flask-mail==0.9.1
+flask-mail==0.10.0
     # via -r requirements/app.in
 flask-marshmallow==1.2.1
     # via -r requirements/app.in
@@ -93,7 +99,7 @@ flask-migrate==4.0.7
     # via -r requirements/app.in
 flask-principal==0.4.0
     # via flask-security-too
-flask-security-too==5.1.2
+flask-security-too==5.5.2
     # via -r requirements/app.in
 flask-sqlalchemy==3.1.1
     # via
@@ -105,24 +111,30 @@ flask-wtf==1.2.1
     # via
     #   -r requirements/app.in
     #   flask-security-too
-fonttools==4.51.0
+flexcache==0.3
+    # via pint
+flexparser==0.3.1
+    # via pint
+fonttools==4.53.1
     # via matplotlib
-greenlet==3.0.3
+greenlet==3.1.0
     # via sqlalchemy
-humanize==4.9.0
+humanize==4.10.0
     # via -r requirements/app.in
-idna==3.6
+idna==3.10
     # via
     #   email-validator
     #   requests
     #   tldextract
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -r requirements/app.in
     #   flask
     #   timely-beliefs
-importlib-resources==6.4.0
-    # via matplotlib
+importlib-resources==6.4.5
+    # via
+    #   flask-security-too
+    #   matplotlib
 inflect==6.0.2
     # via -r requirements/app.in
 inflection==0.5.1
@@ -133,35 +145,37 @@ isodate==0.6.1
     # via
     #   -r requirements/app.in
     #   timely-beliefs
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   flask
-    #   flask-security-too
     #   flask-wtf
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   altair
     #   flask
-joblib==1.3.2
-    # via scikit-learn
-jsonschema==4.21.1
+joblib==1.4.2
+    # via
+    #   scikit-learn
+    #   sktime
+jsonschema==4.23.0
     # via altair
 jsonschema-specifications==2023.12.1
     # via jsonschema
-kiwisolver==1.4.5
+kiwisolver==1.4.7
     # via matplotlib
 lunardate==0.2.2
     # via workalendar
-mako==1.3.2
+mako==1.3.5
     # via alembic
 markupsafe==2.1.5
     # via
+    #   flask-security-too
     #   jinja2
     #   mako
     #   sentry-sdk
     #   werkzeug
     #   wtforms
-marshmallow==3.21.1
+marshmallow==3.22.0
     # via
     #   -r requirements/app.in
     #   flask-marshmallow
@@ -170,14 +184,14 @@ marshmallow==3.21.1
     #   webargs
 marshmallow-polyfield==5.11
     # via -r requirements/app.in
-marshmallow-sqlalchemy==1.0.0
+marshmallow-sqlalchemy==1.1.0
     # via -r requirements/app.in
-matplotlib==3.8.4
+matplotlib==3.9.2
     # via timetomodel
-numpy==1.24.4
+narwhals==1.8.2
+    # via altair
+numpy==1.26.4
     # via
-    #   -r requirements/app.in
-    #   altair
     #   contourpy
     #   matplotlib
     #   pandas
@@ -190,9 +204,9 @@ numpy==1.24.4
     #   timely-beliefs
     #   timetomodel
     #   uniplot
-openturns==1.22
+openturns==1.23
     # via timely-beliefs
-packaging==24.0
+packaging==24.1
     # via
     #   altair
     #   marshmallow
@@ -203,7 +217,6 @@ packaging==24.0
 pandas==2.2.1
     # via
     #   -r requirements/app.in
-    #   altair
     #   sktime
     #   statsmodels
     #   timely-beliefs
@@ -212,19 +225,17 @@ passlib==1.7.4
     # via flask-security-too
 patsy==0.5.6
     # via statsmodels
-pillow==10.3.0
+pillow==10.4.0
     # via
     #   -r requirements/app.in
     #   matplotlib
-pint==0.23
+pint==0.24.3
     # via -r requirements/app.in
 ply==3.11
     # via pyomo
 properscoring==0.1
     # via timely-beliefs
-pscript==0.7.7
-    # via -r requirements/app.in
-psutil==5.9.8
+psutil==6.0.0
     # via openturns
 psycopg2-binary==2.9.9
     # via
@@ -232,7 +243,9 @@ psycopg2-binary==2.9.9
     #   timely-beliefs
 py-moneyed==3.0
     # via -r requirements/app.in
-pydantic==1.10.15
+pycparser==2.22
+    # via cffi
+pydantic==1.10.18
     # via
     #   -r requirements/app.in
     #   inflect
@@ -240,9 +253,9 @@ pyluach==2.2.0
     # via workalendar
 pymeeus==0.5.12
     # via convertdate
-pyomo==6.7.1
+pyomo==6.8.0
     # via -r requirements/app.in
-pyparsing==3.1.2
+pyparsing==3.1.4
     # via matplotlib
 python-dateutil==2.9.0.post0
     # via
@@ -253,15 +266,15 @@ python-dateutil==2.9.0.post0
     #   workalendar
 python-dotenv==1.0.1
     # via -r requirements/app.in
-pytz==2024.1
+pytz==2024.2
     # via
     #   -r requirements/app.in
     #   pandas
     #   timely-beliefs
     #   timetomodel
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via -r requirements/app.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -r requirements/app.in
     #   redis-sentinel-url
@@ -269,33 +282,33 @@ redis==4.6.0
     #   rq-dashboard
 redis-sentinel-url==1.0.1
     # via rq-dashboard
-referencing==0.34.0
+referencing==0.35.1
     # via
     #   jsonschema
     #   jsonschema-specifications
-requests==2.31.0
+requests==2.32.3
     # via
     #   requests-file
     #   tldextract
-requests-file==2.0.0
+requests-file==2.1.0
     # via tldextract
-rpds-py==0.18.0
+rpds-py==0.20.0
     # via
     #   jsonschema
     #   referencing
-rq==1.16.1
+rq==1.16.2
     # via
     #   -r requirements/app.in
     #   rq-dashboard
 rq-dashboard==0.8.0.2
     # via -r requirements/app.in
-scikit-base==0.7.5
+scikit-base==0.9.0
     # via sktime
-scikit-learn==1.4.1.post1
+scikit-learn==1.5.2
     # via
     #   sktime
     #   timetomodel
-scipy==1.13.0
+scipy==1.13.1
     # via
     #   properscoring
     #   scikit-learn
@@ -303,16 +316,16 @@ scipy==1.13.0
     #   statsmodels
     #   timely-beliefs
     #   timetomodel
-sentry-sdk[flask]==1.44.1
+sentry-sdk[flask]==2.14.0
     # via -r requirements/app.in
 six==1.16.0
     # via
     #   isodate
     #   patsy
     #   python-dateutil
-sktime==0.28.0
+sktime==0.33.0
     # via timely-beliefs
-sqlalchemy==2.0.29
+sqlalchemy==2.0.35
     # via
     #   -r requirements/app.in
     #   alembic
@@ -320,43 +333,43 @@ sqlalchemy==2.0.29
     #   marshmallow-sqlalchemy
     #   timely-beliefs
     #   timetomodel
-statsmodels==0.14.1
+statsmodels==0.14.3
     # via timetomodel
 tabulate==0.9.0
     # via -r requirements/app.in
-threadpoolctl==3.4.0
+threadpoolctl==3.5.0
     # via scikit-learn
-timely-beliefs[forecast]==3.0.2
+timely-beliefs[forecast]==3.1.0
     # via -r requirements/app.in
 timetomodel==0.7.3
     # via -r requirements/app.in
 tldextract==5.1.2
     # via -r requirements/app.in
-toolz==0.12.1
-    # via altair
-types-python-dateutil==2.9.0.20240316
+types-python-dateutil==2.9.0.20240906
     # via arrow
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   alembic
     #   altair
+    #   flexcache
+    #   flexparser
     #   pint
     #   py-moneyed
     #   pydantic
     #   sqlalchemy
 tzdata==2024.1
     # via pandas
-uniplot==0.12.5
+uniplot==0.14.1
     # via -r requirements/app.in
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   requests
     #   sentry-sdk
-vl-convert-python==1.3.0
+vl-convert-python==1.6.1
     # via -r requirements/app.in
-webargs==8.4.0
+webargs==8.6.0
     # via -r requirements/app.in
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -r requirements/app.in
     #   flask
@@ -369,10 +382,7 @@ wtforms==3.1.2
     #   flask-wtf
 xlrd==2.0.1
     # via -r requirements/app.in
-zipp==3.18.1
+zipp==3.20.2
     # via
     #   importlib-metadata
     #   importlib-resources
-
-# The following packages are considered to be unsafe in a requirements file:
-# setuptools
diff --git a/requirements/3.9/dev.txt b/requirements/3.9/dev.txt
index 081c37254..6fc8a47c4 100644
--- a/requirements/3.9/dev.txt
+++ b/requirements/3.9/dev.txt
@@ -4,7 +4,7 @@
 #
 #    pip-compile --constraint=requirements/3.9/app.txt --constraint=requirements/3.9/test.txt --output-file=requirements/3.9/dev.txt requirements/dev.in
 #
-black==22.3.0
+black==22.10.0
     # via -r requirements/dev.in
 cfgv==3.4.0
     # via pre-commit
@@ -15,52 +15,52 @@ click==8.1.7
     #   black
 distlib==0.3.8
     # via virtualenv
-filelock==3.13.3
+filelock==3.16.1
     # via
     #   -c requirements/3.9/app.txt
     #   virtualenv
-flake8==4.0.1
+flake8==6.0.0
     # via -r requirements/dev.in
 flake8-blind-except==0.2.1
     # via -r requirements/dev.in
-identify==2.5.35
+identify==2.6.1
     # via pre-commit
-mccabe==0.6.1
+mccabe==0.7.0
     # via flake8
-mypy==1.9.0
+mypy==1.11.2
     # via -r requirements/dev.in
 mypy-extensions==1.0.0
     # via
     #   black
     #   mypy
-nodeenv==1.8.0
+nodeenv==1.9.1
     # via pre-commit
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.9/app.txt
     #   -c requirements/3.9/test.txt
     #   setuptools-scm
 pathspec==0.12.1
     # via black
-platformdirs==4.2.0
+platformdirs==4.3.6
     # via
     #   black
     #   virtualenv
-pre-commit==3.7.0
+pre-commit==3.8.0
     # via -r requirements/dev.in
-pycodestyle==2.8.0
+pycodestyle==2.10.0
     # via flake8
-pyflakes==2.4.0
+pyflakes==3.0.1
     # via flake8
-pyinstrument==4.6.2
+pyinstrument==4.7.3
     # via -r requirements/dev.in
 pytest-runner==6.0.1
     # via -r requirements/dev.in
-pyyaml==6.0.1
+pyyaml==6.0.2
     # via
     #   -c requirements/3.9/app.txt
     #   pre-commit
-setuptools-scm==8.0.4
+setuptools-scm==8.1.0
     # via -r requirements/dev.in
 tomli==2.0.1
     # via
@@ -68,15 +68,16 @@ tomli==2.0.1
     #   black
     #   mypy
     #   setuptools-scm
-typing-extensions==4.11.0
+typing-extensions==4.12.2
     # via
     #   -c requirements/3.9/app.txt
+    #   -c requirements/3.9/test.txt
     #   black
     #   mypy
     #   setuptools-scm
-virtualenv==20.25.1
+virtualenv==20.26.5
     # via pre-commit
-watchdog==4.0.0
+watchdog==5.0.2
     # via -r requirements/dev.in
 
 # The following packages are considered to be unsafe in a requirements file:
diff --git a/requirements/3.9/docs.txt b/requirements/3.9/docs.txt
index aad2522c2..dfd9313eb 100644
--- a/requirements/3.9/docs.txt
+++ b/requirements/3.9/docs.txt
@@ -6,11 +6,11 @@
 #
 alabaster==0.7.16
     # via sphinx
-babel==2.14.0
+babel==2.16.0
     # via
     #   -c requirements/3.9/app.txt
     #   sphinx
-certifi==2024.2.2
+certifi==2024.8.30
     # via
     #   -c requirements/3.9/app.txt
     #   requests
@@ -23,17 +23,17 @@ docutils==0.20.1
     #   sphinx
     #   sphinx-rtd-theme
     #   sphinx-tabs
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.9/app.txt
     #   requests
 imagesize==1.4.1
     # via sphinx
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -c requirements/3.9/app.txt
     #   sphinx
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.9/app.txt
     #   sphinx
@@ -41,15 +41,15 @@ markupsafe==2.1.5
     # via
     #   -c requirements/3.9/app.txt
     #   jinja2
-packaging==24.0
+packaging==24.1
     # via
     #   -c requirements/3.9/app.txt
     #   sphinx
-pygments==2.17.2
+pygments==2.18.0
     # via
     #   sphinx
     #   sphinx-tabs
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.9/app.txt
     #   sphinx
@@ -59,7 +59,7 @@ six==1.16.0
     #   sphinxcontrib-httpdomain
 snowballstemmer==2.2.0
     # via sphinx
-sphinx==7.2.6
+sphinx==7.4.7
     # via
     #   -r requirements/docs.in
     #   sphinx-copybutton
@@ -76,11 +76,11 @@ sphinx-rtd-theme==2.0.0
     # via -r requirements/docs.in
 sphinx-tabs==3.4.5
     # via -r requirements/docs.in
-sphinxcontrib-applehelp==1.0.8
+sphinxcontrib-applehelp==2.0.0
     # via sphinx
-sphinxcontrib-devhelp==1.0.6
+sphinxcontrib-devhelp==2.0.0
     # via sphinx
-sphinxcontrib-htmlhelp==2.0.5
+sphinxcontrib-htmlhelp==2.1.0
     # via sphinx
 sphinxcontrib-httpdomain==1.8.1
     # via -r requirements/docs.in
@@ -88,15 +88,17 @@ sphinxcontrib-jquery==4.1
     # via sphinx-rtd-theme
 sphinxcontrib-jsmath==1.0.1
     # via sphinx
-sphinxcontrib-qthelp==1.0.7
+sphinxcontrib-qthelp==2.0.0
     # via sphinx
-sphinxcontrib-serializinghtml==1.1.10
+sphinxcontrib-serializinghtml==2.0.0
     # via sphinx
-urllib3==2.2.1
+tomli==2.0.1
+    # via sphinx
+urllib3==2.2.3
     # via
     #   -c requirements/3.9/app.txt
     #   requests
-zipp==3.18.1
+zipp==3.20.2
     # via
     #   -c requirements/3.9/app.txt
     #   importlib-metadata
diff --git a/requirements/app.in b/requirements/app.in
index 692ed8b53..9c1a068b6 100644
--- a/requirements/app.in
+++ b/requirements/app.in
@@ -1,8 +1,5 @@
-# see ui/utils/plotting_utils: separate_legend() and create_hover_tool()
 pyyaml
 altair
-colour
-pscript
 pandas
 pint>=0.19.1
 py-moneyed
@@ -15,11 +12,11 @@ inflect<=6.0.2
 pydantic<2
 humanize
 psycopg2-binary
-# due to https://github.com/Flask-Middleware/flask-security/issues/907
+# due to https://github.com/pallets-eco/flask-security/issues/907 (should be re-opened as of Sep 24) -> https://foss.heptapod.net/python-libs/passlib/-/issues/187
 bcrypt<=4.0.1
+# hashing backend for passlib, not sure why we need it now
+argon2_cffi
 pytz
-# limit the numpy version to make it compatible with dependencies in timely-beliefs >=1.18 (libraries sktime, numba).
-numpy<1.25
 isodate
 click
 click-default-group
@@ -29,14 +26,14 @@ rq
 rq-dashboard>=0.8.0.2
 # the following uses environment markers (see PEP 496)
 rq-win; os_name == 'nt' or os_name == 'win'
-# This limit resolves a conflict with test.in. The culprit is fakeredis (check their pyproject.toml)
-redis >4.5, <5
+# Note: we sometimes limit redis due to our use of fakeredis (check their pyproject.toml)
+redis>4.5
 tldextract
 pyomo>=5.6
 tabulate
 timetomodel>=0.7.3
-# significantly faster db queries, incl. bulk saving
-timely-beliefs[forecast]>=3.0.2
+# 3.0.2: significantly faster db queries, incl. bulk saving, 3.1: numpy/pandas upgrade
+timely-beliefs[forecast]>=3.1
 python-dotenv
 # a backport, not needed in Python3.8
 importlib_metadata
@@ -64,8 +61,7 @@ uniplot>=0.7.0
 # >=2.5.2: https://github.com/marshmallow-code/flask-marshmallow/issues/262
 Flask-SQLAlchemy>=2.5.2
 # flask should be after all the flask plugins, because setup might find they ARE flask
-# <3.0 https://github.com/FlexMeasures/flexmeasures/issues/936
-flask>=1.0, <3.0 
-werkzeug<=2.2.3
+flask>=1.0 
+werkzeug
 vl-convert-python
-Pillow>=10.0.1  # https://github.com/FlexMeasures/flexmeasures/security/dependabot/91
\ No newline at end of file
+Pillow>=10.0.1  # https://github.com/FlexMeasures/flexmeasures/security/dependabot/91
diff --git a/requirements/dev.in b/requirements/dev.in
index 5fddad151..66f5fbe2d 100644
--- a/requirements/dev.in
+++ b/requirements/dev.in
@@ -1,7 +1,7 @@
 pre-commit
 # we're pinning the following two to what .pre-commit-config.yaml says
-black==22.3.0
-flake8==4.0.1
+black==22.10.0
+flake8==6.0.0
 flake8-blind-except
 mypy
 pytest-runner


Test patch:
diff --git a/requirements/3.10/test.txt b/requirements/3.10/test.txt
index 80f38cd06..563ab2923 100644
--- a/requirements/3.10/test.txt
+++ b/requirements/3.10/test.txt
@@ -8,7 +8,11 @@ async-timeout==4.0.3
     # via
     #   -c requirements/3.10/app.txt
     #   redis
-certifi==2024.2.2
+blinker==1.8.2
+    # via
+    #   -c requirements/3.10/app.txt
+    #   flask
+certifi==2024.8.30
     # via
     #   -c requirements/3.10/app.txt
     #   requests
@@ -20,47 +24,51 @@ click==8.1.7
     # via
     #   -c requirements/3.10/app.txt
     #   flask
-coverage[toml]==7.4.4
+coverage[toml]==7.6.1
     # via pytest-cov
-exceptiongroup==1.2.0
+exceptiongroup==1.2.2
     # via pytest
-fakeredis==2.21.3
+fakeredis==2.24.1
     # via -r requirements/test.in
-flask==2.2.5
+flask==3.0.3
     # via
     #   -c requirements/3.10/app.txt
     #   pytest-flask
-highspy==1.5.3
+highspy==1.7.2
     # via -r requirements/test.in
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.10/app.txt
     #   requests
 iniconfig==2.0.0
     # via pytest
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   -c requirements/3.10/app.txt
     #   flask
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.10/app.txt
     #   flask
-lupa==2.1
+lupa==2.2
     # via -r requirements/test.in
 markupsafe==2.1.5
     # via
     #   -c requirements/3.10/app.txt
     #   jinja2
     #   werkzeug
-packaging==24.0
+numpy==1.26.4
+    # via
+    #   -c requirements/3.10/app.txt
+    #   highspy
+packaging==24.1
     # via
     #   -c requirements/3.10/app.txt
     #   pytest
     #   pytest-sugar
-pluggy==1.4.0
+pluggy==1.5.0
     # via pytest
-pytest==8.1.1
+pytest==8.3.3
     # via
     #   -r requirements/test.in
     #   pytest-cov
@@ -75,11 +83,11 @@ pytest-mock==3.14.0
     # via -r requirements/test.in
 pytest-sugar==1.0.0
     # via -r requirements/test.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -c requirements/3.10/app.txt
     #   fakeredis
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.10/app.txt
     #   -r requirements/test.in
@@ -94,11 +102,15 @@ tomli==2.0.1
     # via
     #   coverage
     #   pytest
-urllib3==2.2.1
+typing-extensions==4.12.2
+    # via
+    #   -c requirements/3.10/app.txt
+    #   fakeredis
+urllib3==2.2.3
     # via
     #   -c requirements/3.10/app.txt
     #   requests
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -c requirements/3.10/app.txt
     #   flask
diff --git a/requirements/3.11/test.txt b/requirements/3.11/test.txt
index db90f8874..1e54b4542 100644
--- a/requirements/3.11/test.txt
+++ b/requirements/3.11/test.txt
@@ -4,7 +4,11 @@
 #
 #    pip-compile --constraint=requirements/3.11/app.txt --output-file=requirements/3.11/test.txt requirements/test.in
 #
-certifi==2024.2.2
+blinker==1.8.2
+    # via
+    #   -c requirements/3.11/app.txt
+    #   flask
+certifi==2024.8.30
     # via
     #   -c requirements/3.11/app.txt
     #   requests
@@ -16,45 +20,49 @@ click==8.1.7
     # via
     #   -c requirements/3.11/app.txt
     #   flask
-coverage[toml]==7.4.4
+coverage[toml]==7.6.1
     # via pytest-cov
-fakeredis==2.21.3
+fakeredis==2.24.1
     # via -r requirements/test.in
-flask==2.2.5
+flask==3.0.3
     # via
     #   -c requirements/3.11/app.txt
     #   pytest-flask
-highspy==1.5.3
+highspy==1.7.2
     # via -r requirements/test.in
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.11/app.txt
     #   requests
 iniconfig==2.0.0
     # via pytest
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   -c requirements/3.11/app.txt
     #   flask
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.11/app.txt
     #   flask
-lupa==2.1
+lupa==2.2
     # via -r requirements/test.in
 markupsafe==2.1.5
     # via
     #   -c requirements/3.11/app.txt
     #   jinja2
     #   werkzeug
-packaging==24.0
+numpy==1.26.4
+    # via
+    #   -c requirements/3.11/app.txt
+    #   highspy
+packaging==24.1
     # via
     #   -c requirements/3.11/app.txt
     #   pytest
     #   pytest-sugar
-pluggy==1.4.0
+pluggy==1.5.0
     # via pytest
-pytest==8.1.1
+pytest==8.3.3
     # via
     #   -r requirements/test.in
     #   pytest-cov
@@ -69,11 +77,11 @@ pytest-mock==3.14.0
     # via -r requirements/test.in
 pytest-sugar==1.0.0
     # via -r requirements/test.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -c requirements/3.11/app.txt
     #   fakeredis
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.11/app.txt
     #   -r requirements/test.in
@@ -84,11 +92,11 @@ sortedcontainers==2.4.0
     # via fakeredis
 termcolor==2.4.0
     # via pytest-sugar
-urllib3==2.2.1
+urllib3==2.2.3
     # via
     #   -c requirements/3.11/app.txt
     #   requests
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -c requirements/3.11/app.txt
     #   flask
diff --git a/requirements/3.8/test.txt b/requirements/3.8/test.txt
index be8227fad..eb0a50b42 100644
--- a/requirements/3.8/test.txt
+++ b/requirements/3.8/test.txt
@@ -8,7 +8,11 @@ async-timeout==4.0.3
     # via
     #   -c requirements/3.8/app.txt
     #   redis
-certifi==2024.2.2
+blinker==1.8.2
+    # via
+    #   -c requirements/3.8/app.txt
+    #   flask
+certifi==2024.8.30
     # via
     #   -c requirements/3.8/app.txt
     #   requests
@@ -20,51 +24,55 @@ click==8.1.7
     # via
     #   -c requirements/3.8/app.txt
     #   flask
-coverage[toml]==7.4.4
+coverage[toml]==7.6.1
     # via pytest-cov
-exceptiongroup==1.2.0
+exceptiongroup==1.2.2
     # via pytest
-fakeredis==2.21.3
+fakeredis==2.24.1
     # via -r requirements/test.in
-flask==2.2.5
+flask==3.0.3
     # via
     #   -c requirements/3.8/app.txt
     #   pytest-flask
-highspy==1.5.3
+highspy==1.7.2
     # via -r requirements/test.in
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.8/app.txt
     #   requests
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -c requirements/3.8/app.txt
     #   flask
 iniconfig==2.0.0
     # via pytest
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   -c requirements/3.8/app.txt
     #   flask
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.8/app.txt
     #   flask
-lupa==2.1
+lupa==2.2
     # via -r requirements/test.in
 markupsafe==2.1.5
     # via
     #   -c requirements/3.8/app.txt
     #   jinja2
     #   werkzeug
-packaging==24.0
+numpy==1.24.4
+    # via
+    #   -c requirements/3.8/app.txt
+    #   highspy
+packaging==24.1
     # via
     #   -c requirements/3.8/app.txt
     #   pytest
     #   pytest-sugar
-pluggy==1.4.0
+pluggy==1.5.0
     # via pytest
-pytest==8.1.1
+pytest==8.3.3
     # via
     #   -r requirements/test.in
     #   pytest-cov
@@ -79,11 +87,11 @@ pytest-mock==3.14.0
     # via -r requirements/test.in
 pytest-sugar==1.0.0
     # via -r requirements/test.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -c requirements/3.8/app.txt
     #   fakeredis
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.8/app.txt
     #   -r requirements/test.in
@@ -98,16 +106,20 @@ tomli==2.0.1
     # via
     #   coverage
     #   pytest
-urllib3==2.2.1
+typing-extensions==4.12.2
+    # via
+    #   -c requirements/3.8/app.txt
+    #   fakeredis
+urllib3==2.2.3
     # via
     #   -c requirements/3.8/app.txt
     #   requests
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -c requirements/3.8/app.txt
     #   flask
     #   pytest-flask
-zipp==3.18.1
+zipp==3.20.2
     # via
     #   -c requirements/3.8/app.txt
     #   importlib-metadata
diff --git a/requirements/3.9/test.txt b/requirements/3.9/test.txt
index eb9c07a0a..94b351224 100644
--- a/requirements/3.9/test.txt
+++ b/requirements/3.9/test.txt
@@ -8,7 +8,11 @@ async-timeout==4.0.3
     # via
     #   -c requirements/3.9/app.txt
     #   redis
-certifi==2024.2.2
+blinker==1.8.2
+    # via
+    #   -c requirements/3.9/app.txt
+    #   flask
+certifi==2024.8.30
     # via
     #   -c requirements/3.9/app.txt
     #   requests
@@ -20,51 +24,55 @@ click==8.1.7
     # via
     #   -c requirements/3.9/app.txt
     #   flask
-coverage[toml]==7.4.4
+coverage[toml]==7.6.1
     # via pytest-cov
-exceptiongroup==1.2.0
+exceptiongroup==1.2.2
     # via pytest
-fakeredis==2.21.3
+fakeredis==2.24.1
     # via -r requirements/test.in
-flask==2.2.5
+flask==3.0.3
     # via
     #   -c requirements/3.9/app.txt
     #   pytest-flask
-highspy==1.5.3
+highspy==1.7.2
     # via -r requirements/test.in
-idna==3.6
+idna==3.10
     # via
     #   -c requirements/3.9/app.txt
     #   requests
-importlib-metadata==7.1.0
+importlib-metadata==8.5.0
     # via
     #   -c requirements/3.9/app.txt
     #   flask
 iniconfig==2.0.0
     # via pytest
-itsdangerous==2.1.2
+itsdangerous==2.2.0
     # via
     #   -c requirements/3.9/app.txt
     #   flask
-jinja2==3.1.3
+jinja2==3.1.4
     # via
     #   -c requirements/3.9/app.txt
     #   flask
-lupa==2.1
+lupa==2.2
     # via -r requirements/test.in
 markupsafe==2.1.5
     # via
     #   -c requirements/3.9/app.txt
     #   jinja2
     #   werkzeug
-packaging==24.0
+numpy==1.26.4
+    # via
+    #   -c requirements/3.9/app.txt
+    #   highspy
+packaging==24.1
     # via
     #   -c requirements/3.9/app.txt
     #   pytest
     #   pytest-sugar
-pluggy==1.4.0
+pluggy==1.5.0
     # via pytest
-pytest==8.1.1
+pytest==8.3.3
     # via
     #   -r requirements/test.in
     #   pytest-cov
@@ -79,11 +87,11 @@ pytest-mock==3.14.0
     # via -r requirements/test.in
 pytest-sugar==1.0.0
     # via -r requirements/test.in
-redis==4.6.0
+redis==5.0.8
     # via
     #   -c requirements/3.9/app.txt
     #   fakeredis
-requests==2.31.0
+requests==2.32.3
     # via
     #   -c requirements/3.9/app.txt
     #   -r requirements/test.in
@@ -98,16 +106,20 @@ tomli==2.0.1
     # via
     #   coverage
     #   pytest
-urllib3==2.2.1
+typing-extensions==4.12.2
+    # via
+    #   -c requirements/3.9/app.txt
+    #   fakeredis
+urllib3==2.2.3
     # via
     #   -c requirements/3.9/app.txt
     #   requests
-werkzeug==2.2.3
+werkzeug==3.0.4
     # via
     #   -c requirements/3.9/app.txt
     #   flask
     #   pytest-flask
-zipp==3.18.1
+zipp==3.20.2
     # via
     #   -c requirements/3.9/app.txt
     #   importlib-metadata