diff --git a/.github/docker-compose-ci.yml b/.github/docker-compose-ci.yml index 6c134873..8574aa6b 100644 --- a/.github/docker-compose-ci.yml +++ b/.github/docker-compose-ci.yml @@ -11,7 +11,7 @@ services: xqueue: container_name: xqueue - image: edxops/xqueue-dev:latest + image: ubuntu:22.04 command: tail -f /dev/null volumes: - ..:/edx/app/xqueue/xqueue diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f42fdd5c..032bd0f0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,8 +13,8 @@ jobs: strategy: fail-fast: false matrix: - python-version: ['py311', 'py312'] - env-name: ['django42','django52', 'quality'] + python-version: ['py312'] + env-name: ['django52', 'quality'] db-version: ['mysql80'] steps: @@ -26,11 +26,11 @@ jobs: - name: Setup Python ${{ matrix.python-version }} inside container run: | - PY_VER=$(if [ "${{ matrix.python-version }}" = "py312" ]; then echo "3.12"; else echo "3.11"; fi) + PY_VER=3.12 - docker exec xqueue bash -c " + docker exec -e DEBIAN_FRONTEND=noninteractive xqueue bash -c " apt update && - apt install -y software-properties-common curl && + apt install -y software-properties-common curl build-essential pkg-config default-libmysqlclient-dev git memcached && add-apt-repository ppa:deadsnakes/ppa -y && apt install -y python$PY_VER python$PY_VER-dev python$PY_VER-venv && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python$PY_VER 1 && @@ -43,4 +43,13 @@ jobs: TOXENV: ${{ matrix.python-version }}-${{ matrix.env-name }} run: | docker exec xqueue bash -c "cd /edx/app/xqueue/xqueue/; /tmp/venv/bin/pip install -r requirements/ci.txt" - docker exec xqueue bash -c "cd /edx/app/xqueue/xqueue/ && DB_HOST=${{ matrix.db-version }} tox -e ${TOXENV}" + docker exec xqueue bash -c "cd /edx/app/xqueue/xqueue/ && DB_HOST=${{ matrix.db-version }} /tmp/venv/bin/tox -e ${TOXENV}" + + # Aggregate check required by the master branch ruleset. + tests: + needs: build + if: always() + runs-on: ubuntu-latest + steps: + - name: Fail unless all build jobs succeeded + run: test "${{ needs.build.result }}" = "success" diff --git a/.github/workflows/mysql8-migrations-check.yml b/.github/workflows/mysql8-migrations-check.yml index 49980414..46de8184 100644 --- a/.github/workflows/mysql8-migrations-check.yml +++ b/.github/workflows/mysql8-migrations-check.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest ] - python-version: [ '3.11', '3.12' ] + python-version: [ '3.12' ] steps: - name: Checkout repo diff --git a/Makefile b/Makefile index 26a1404f..eb2c4d6c 100644 --- a/Makefile +++ b/Makefile @@ -57,9 +57,6 @@ upgrade: $(COMMON_CONSTRAINTS_TXT) ## update the requirements/*.txt files with t pip-compile --upgrade -o requirements/test.txt requirements/test.in pip-compile --upgrade -o requirements/ci.txt requirements/ci.in pip-compile --upgrade -o requirements/dev.txt requirements/dev.in - # Let tox control the Django version for tests - sed '/^[dD]jango==/d' requirements/test.txt > requirements/test.tmp - mv requirements/test.tmp requirements/test.txt quality: ## check coding style with pycodestyle and pylint isort --recursive --check-only submission_queue/ xqueue/ diff --git a/requirements.txt b/requirements.txt index a9e8370d..e2d47890 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,28 +1,28 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.8.1 +asgiref==3.12.1 # via django backoff==2.2.1 # via -r requirements/base.in -boto3==1.38.43 +boto3==1.43.106 # via -r requirements/base.in -botocore==1.38.43 +botocore==1.43.106 # via # boto3 # s3transfer -certifi==2025.6.15 +certifi==2026.7.22 # via requests -cffi==1.17.1 +cffi==2.1.1 # via pynacl -charset-normalizer==3.4.2 +charset-normalizer==3.5.2 # via requests -click==8.2.1 +click==8.5.0 # via edx-django-utils -django==4.2.23 +django==5.2.17 # via # -c requirements/common_constraints.txt # -r requirements/base.in @@ -39,57 +39,51 @@ django-waffle==5.0.0 # via edx-django-utils edx-django-release-util==1.5.0 # via -r requirements/base.in -edx-django-utils==8.0.0 +edx-django-utils==8.0.2 # via -r requirements/base.in -gunicorn==23.0.0 +gunicorn==26.2.0 # via -r requirements/base.in -idna==3.10 +idna==3.20 # via requests -isort==6.0.1 +isort==9.0.2 # via -r requirements/base.in -jmespath==1.0.1 +jmespath==1.1.0 # via # boto3 # botocore -mysqlclient==2.2.7 +mypy-extensions==1.1.0 + # via isort +mysqlclient==2.3.0 # via -r requirements/base.in -newrelic==10.14.0 +newrelic==13.6.1 # via -r requirements/base.in -packaging==25.0 - # via gunicorn -path==17.1.0 +path==17.1.1 # via -r requirements/base.in -pbr==6.1.1 - # via stevedore -psutil==7.0.0 +psutil==7.2.2 # via edx-django-utils -pycparser==2.22 +pycparser==3.0 # via cffi -pynacl==1.5.0 +pynacl==1.6.2 # via edx-django-utils python-dateutil==2.9.0.post0 # via botocore python-memcached==1.62 # via -r requirements/base.in -pyyaml==6.0.2 +pyyaml==6.0.3 # via edx-django-release-util -requests==2.32.4 +requests==2.34.2 # via -r requirements/base.in -s3transfer==0.13.0 +s3transfer==0.19.2 # via boto3 six==1.17.0 # via # edx-django-release-util # python-dateutil -sqlparse==0.5.3 +sqlparse==0.6.0 # via django -stevedore==5.4.1 +stevedore==5.9.1 # via edx-django-utils -urllib3==2.2.3 +urllib3==2.8.0 # via - # -c requirements/common_constraints.txt # botocore # requests - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/requirements/ci.txt b/requirements/ci.txt index ef6cc183..41a209fe 100644 --- a/requirements/ci.txt +++ b/requirements/ci.txt @@ -1,34 +1,42 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -cachetools==6.1.0 - # via tox -chardet==5.2.0 +cachetools==7.2.0 # via tox colorama==0.4.6 # via tox -distlib==0.3.9 +distlib==0.4.3 # via virtualenv -filelock==3.18.0 +filelock==4.0.8 # via + # python-discovery # tox # virtualenv -packaging==25.0 +packaging==26.3 # via # pyproject-api # tox -platformdirs==4.3.8 + # virtualenv +platformdirs==4.12.2 # via # tox # virtualenv pluggy==1.6.0 # via tox -pyproject-api==1.9.1 +pyproject-api==1.11.2 # via tox -tox==4.27.0 +python-discovery==1.6.1 + # via + # tox + # virtualenv +tomli-w==1.2.0 + # via tox +tox==4.64.6 # via -r requirements/ci.in -virtualenv==20.31.2 +typing-extensions==4.16.0 + # via tox +virtualenv==21.14.2 # via tox diff --git a/requirements/common_constraints.txt b/requirements/common_constraints.txt index 75193d3f..50d07f65 100644 --- a/requirements/common_constraints.txt +++ b/requirements/common_constraints.txt @@ -17,20 +17,32 @@ # this file from Github directly. It does not require packaging in edx-lint. # using LTS django version -Django<5.0 +Django<6.0 # elasticsearch>=7.14.0 includes breaking changes in it which caused issues in discovery upgrade process. # elastic search changelog: https://www.elastic.co/guide/en/enterprise-search/master/release-notes-7.14.0.html # See https://github.com/openedx/edx-platform/issues/35126 for more info elasticsearch<7.14.0 -# django-simple-history>3.0.0 adds indexing and causes a lot of migrations to be affected -django-simple-history==3.0.0 +# 2026-07-06: Constrain social-auth-* packages to the latest version compatible with +# edx-drf-extensions<=10.6.0. (Newer versions require a POST instead of a GET.) +# Tracking issue: https://github.com/openedx/edx-drf-extensions/issues/561 +social-auth-app-django<6.0.0 +social-auth-core<5.0.0 -# Cause: https://github.com/openedx/edx-lint/issues/458 -# This can be unpinned once https://github.com/openedx/edx-lint/issues/459 has been resolved. -pip<24.3 - -# Cause: https://github.com/openedx/edx-lint/issues/475 -# This can be unpinned once https://github.com/openedx/edx-lint/issues/476 has been resolved. -urllib3<2.3.0 +# 2026-08-11: pip-tools is only tested against the latest pip released at the time +# pip-tools was released; also, pip-tools package dependencies are extremely permissive +# about the pip version required, so the dependency resolver will not prevent an unwanted +# pip upgrade which would break pip-tools. The end result is that pip MUST be constrained +# by all pip-tools users in order to avoid potentially weeks-long lapses in pip <-> +# pip-tools compatibility. We've constrained pip here in common_constraints.txt in the +# past, but always removed it once the issue was "fixed". Removing this constraint was +# always a mistake. +# +# This is a semi-permanent constraint and should be manually bumped after each pip-tools +# release. +# +# Exceptional conditions for removal: +# - We stop using pip-tools, OR +# - We migrate to the proposed `pip-tools[stable]` extra: https://github.com/jazzband/pip-tools/pull/2257 +pip<26.2.1 # Known to work with pip-tools==7.6.1 diff --git a/requirements/dev.txt b/requirements/dev.txt index f5be1e05..e7a212c7 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,47 +1,43 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.8.1 +asgiref==3.12.1 # via # -r requirements/test.txt # django backoff==2.2.1 # via -r requirements/test.txt -boto3==1.38.43 +boto3==1.43.106 # via -r requirements/test.txt -botocore==1.38.43 +botocore==1.43.106 # via # -r requirements/test.txt # boto3 # s3transfer -build==1.2.2.post1 +build==1.6.1 # via # -r requirements/pip-tools.txt # pip-tools -cachetools==6.1.0 +cachetools==7.2.0 # via # -r requirements/ci.txt # tox -certifi==2025.6.15 +certifi==2026.7.22 # via # -r requirements/test.txt # requests -cffi==1.17.1 +cffi==2.1.1 # via # -r requirements/test.txt # pynacl -chardet==5.2.0 - # via - # -r requirements/ci.txt - # tox -charset-normalizer==3.4.2 +charset-normalizer==3.5.2 # via # -r requirements/test.txt # requests -click==8.2.1 +click==8.5.0 # via # -r requirements/pip-tools.txt # -r requirements/test.txt @@ -51,15 +47,15 @@ colorama==0.4.6 # via # -r requirements/ci.txt # tox -coverage[toml]==7.9.1 +coverage[toml]==7.16.2 # via # -r requirements/test.txt # pytest-cov -distlib==0.3.9 +distlib==0.4.3 # via # -r requirements/ci.txt # virtualenv -django==4.2.23 +django==5.2.17 # via # -c requirements/common_constraints.txt # -r requirements/test.txt @@ -80,53 +76,55 @@ django-waffle==5.0.0 # edx-django-utils edx-django-release-util==1.5.0 # via -r requirements/test.txt -edx-django-utils==8.0.0 +edx-django-utils==8.0.2 # via -r requirements/test.txt -filelock==3.18.0 +filelock==4.0.8 # via # -r requirements/ci.txt + # python-discovery # tox # virtualenv -gunicorn==23.0.0 +gunicorn==26.2.0 # via -r requirements/test.txt -idna==3.10 +idna==3.20 # via # -r requirements/test.txt # requests -iniconfig==2.1.0 +iniconfig==2.3.0 # via # -r requirements/test.txt # pytest -isort==6.0.1 +isort==9.0.2 # via -r requirements/test.txt -jmespath==1.0.1 +jmespath==1.1.0 # via # -r requirements/test.txt # boto3 # botocore -mysqlclient==2.2.7 +mypy-extensions==1.1.0 + # via + # -r requirements/test.txt + # isort +mysqlclient==2.3.0 # via -r requirements/test.txt -newrelic==10.14.0 +newrelic==13.6.1 # via -r requirements/test.txt -packaging==25.0 +packaging==26.3 # via # -r requirements/ci.txt # -r requirements/pip-tools.txt # -r requirements/test.txt # build - # gunicorn # pyproject-api # pytest # tox -path==17.1.0 + # virtualenv + # wheel +path==17.1.1 # via -r requirements/test.txt -pbr==6.1.1 - # via - # -r requirements/test.txt - # stevedore -pip-tools==7.4.1 +pip-tools==7.6.1 # via -r requirements/pip-tools.txt -platformdirs==4.3.8 +platformdirs==4.12.2 # via # -r requirements/ci.txt # tox @@ -138,55 +136,62 @@ pluggy==1.6.0 # pytest # pytest-cov # tox -psutil==7.0.0 +psutil==7.2.2 # via # -r requirements/test.txt # edx-django-utils -pycodestyle==2.14.0 +pycodestyle==2.15.0 # via -r requirements/quality.txt -pycparser==2.22 +pycparser==3.0 # via # -r requirements/test.txt # cffi -pygments==2.19.2 +pygments==2.21.0 # via # -r requirements/test.txt # pytest -pynacl==1.5.0 +pynacl==1.6.2 # via # -r requirements/test.txt # edx-django-utils -pyproject-api==1.9.1 +pyproject-api==1.11.2 # via # -r requirements/ci.txt # tox -pyproject-hooks==1.2.0 +pyproject-hooks==1.3.3 # via # -r requirements/pip-tools.txt # build # pip-tools -pytest==8.4.1 +pytest==9.1.1 # via # -r requirements/test.txt # pytest-cov # pytest-django -pytest-cov==6.2.1 +pytest-cov==7.1.0 # via -r requirements/test.txt -pytest-django==4.11.1 +pytest-django==4.14.0 # via -r requirements/test.txt python-dateutil==2.9.0.post0 # via # -r requirements/test.txt # botocore +python-discovery==1.6.1 + # via + # -r requirements/ci.txt + # tox + # virtualenv python-memcached==1.62 # via -r requirements/test.txt -pyyaml==6.0.2 +pywatchman==4.0.0 ; "linux" in sys_platform + # via -r requirements/dev.in +pyyaml==6.0.3 # via # -r requirements/test.txt # edx-django-release-util -requests==2.32.4 +requests==2.34.2 # via -r requirements/test.txt -s3transfer==0.13.0 +s3transfer==0.19.2 # via # -r requirements/test.txt # boto3 @@ -195,27 +200,34 @@ six==1.17.0 # -r requirements/test.txt # edx-django-release-util # python-dateutil -sqlparse==0.5.3 +sqlparse==0.6.0 # via # -r requirements/test.txt # django -stevedore==5.4.1 +stevedore==5.9.1 # via # -r requirements/test.txt # edx-django-utils -tox==4.27.0 +tomli-w==1.2.0 + # via + # -r requirements/ci.txt + # tox +tox==4.64.6 # via -r requirements/ci.txt -urllib3==2.2.3 +typing-extensions==4.16.0 + # via + # -r requirements/ci.txt + # tox +urllib3==2.8.0 # via - # -c requirements/common_constraints.txt # -r requirements/test.txt # botocore # requests -virtualenv==20.31.2 +virtualenv==21.14.2 # via # -r requirements/ci.txt # tox -wheel==0.45.1 +wheel==0.48.0 # via # -r requirements/pip-tools.txt # pip-tools diff --git a/requirements/pip-tools.txt b/requirements/pip-tools.txt index 990b4234..df8bedd6 100644 --- a/requirements/pip-tools.txt +++ b/requirements/pip-tools.txt @@ -1,22 +1,24 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -build==1.2.2.post1 +build==1.6.1 # via pip-tools -click==8.2.1 +click==8.5.0 # via pip-tools -packaging==25.0 - # via build -pip-tools==7.4.1 +packaging==26.3 + # via + # build + # wheel +pip-tools==7.6.1 # via -r requirements/pip-tools.in -pyproject-hooks==1.2.0 +pyproject-hooks==1.3.3 # via # build # pip-tools -wheel==0.45.1 +wheel==0.48.0 # via pip-tools # The following packages are considered to be unsafe in a requirements file: diff --git a/requirements/pip.txt b/requirements/pip.txt index dabfa8f0..582d6205 100644 --- a/requirements/pip.txt +++ b/requirements/pip.txt @@ -1,16 +1,18 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -wheel==0.45.1 +packaging==26.3 + # via wheel +wheel==0.48.0 # via -r requirements/pip.in # The following packages are considered to be unsafe in a requirements file: -pip==24.2 +pip==26.2 # via # -c requirements/common_constraints.txt # -r requirements/pip.in -setuptools==80.9.0 +setuptools==84.0.0 # via -r requirements/pip.in diff --git a/requirements/quality.txt b/requirements/quality.txt index 12a5f8a5..9e1fc87c 100644 --- a/requirements/quality.txt +++ b/requirements/quality.txt @@ -1,8 +1,8 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -pycodestyle==2.14.0 +pycodestyle==2.15.0 # via -r requirements/quality.in diff --git a/requirements/test.txt b/requirements/test.txt index e2b2f497..fb33ce81 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,43 +1,44 @@ # -# This file is autogenerated by pip-compile with Python 3.11 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # make upgrade # -asgiref==3.8.1 +asgiref==3.12.1 # via - # -r requirements/../requirements.txt + # -r requirements.txt # django backoff==2.2.1 - # via -r requirements/../requirements.txt -boto3==1.38.43 - # via -r requirements/../requirements.txt -botocore==1.38.43 + # via -r requirements.txt +boto3==1.43.106 + # via -r requirements.txt +botocore==1.43.106 # via - # -r requirements/../requirements.txt + # -r requirements.txt # boto3 # s3transfer -certifi==2025.6.15 +certifi==2026.7.22 # via - # -r requirements/../requirements.txt + # -r requirements.txt # requests -cffi==1.17.1 +cffi==2.1.1 # via - # -r requirements/../requirements.txt + # -r requirements.txt # pynacl -charset-normalizer==3.4.2 +charset-normalizer==3.5.2 # via - # -r requirements/../requirements.txt + # -r requirements.txt # requests -click==8.2.1 +click==8.5.0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-utils -coverage[toml]==7.9.1 +coverage[toml]==7.16.2 # via pytest-cov +django==5.2.17 # via # -c requirements/common_constraints.txt - # -r requirements/../requirements.txt + # -r requirements.txt # django-crum # django-storages # django-waffle @@ -45,110 +46,103 @@ coverage[toml]==7.9.1 # edx-django-utils django-crum==0.7.9 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-utils django-storages==1.14.6 - # via -r requirements/../requirements.txt + # via -r requirements.txt django-waffle==5.0.0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-utils edx-django-release-util==1.5.0 - # via -r requirements/../requirements.txt -edx-django-utils==8.0.0 - # via -r requirements/../requirements.txt -gunicorn==23.0.0 - # via -r requirements/../requirements.txt -idna==3.10 - # via - # -r requirements/../requirements.txt + # via -r requirements.txt +edx-django-utils==8.0.2 + # via -r requirements.txt +gunicorn==26.2.0 + # via -r requirements.txt +idna==3.20 + # via + # -r requirements.txt # requests -iniconfig==2.1.0 +iniconfig==2.3.0 # via pytest -isort==6.0.1 - # via -r requirements/../requirements.txt -jmespath==1.0.1 +isort==9.0.2 + # via -r requirements.txt +jmespath==1.1.0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # boto3 # botocore -mysqlclient==2.2.7 - # via -r requirements/../requirements.txt -newrelic==10.14.0 - # via -r requirements/../requirements.txt -packaging==25.0 - # via - # -r requirements/../requirements.txt - # gunicorn - # pytest -path==17.1.0 - # via -r requirements/../requirements.txt -pbr==6.1.1 - # via - # -r requirements/../requirements.txt - # stevedore +mypy-extensions==1.1.0 + # via + # -r requirements.txt + # isort +mysqlclient==2.3.0 + # via -r requirements.txt +newrelic==13.6.1 + # via -r requirements.txt +packaging==26.3 + # via pytest +path==17.1.1 + # via -r requirements.txt pluggy==1.6.0 # via # pytest # pytest-cov -psutil==7.0.0 +psutil==7.2.2 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-utils -pycparser==2.22 +pycparser==3.0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # cffi -pygments==2.19.2 +pygments==2.21.0 # via pytest -pynacl==1.5.0 +pynacl==1.6.2 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-utils -pytest==8.4.1 +pytest==9.1.1 # via # -r requirements/test.in # pytest-cov # pytest-django -pytest-cov==6.2.1 +pytest-cov==7.1.0 # via -r requirements/test.in -pytest-django==4.11.1 +pytest-django==4.14.0 # via -r requirements/test.in python-dateutil==2.9.0.post0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # botocore python-memcached==1.62 - # via -r requirements/../requirements.txt -pyyaml==6.0.2 + # via -r requirements.txt +pyyaml==6.0.3 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-release-util -requests==2.32.4 - # via -r requirements/../requirements.txt -s3transfer==0.13.0 +requests==2.34.2 + # via -r requirements.txt +s3transfer==0.19.2 # via - # -r requirements/../requirements.txt + # -r requirements.txt # boto3 six==1.17.0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-release-util # python-dateutil -sqlparse==0.5.3 +sqlparse==0.6.0 # via - # -r requirements/../requirements.txt + # -r requirements.txt # django -stevedore==5.4.1 +stevedore==5.9.1 # via - # -r requirements/../requirements.txt + # -r requirements.txt # edx-django-utils -urllib3==2.2.3 +urllib3==2.8.0 # via - # -c requirements/common_constraints.txt - # -r requirements/../requirements.txt + # -r requirements.txt # botocore # requests - -# The following packages are considered to be unsafe in a requirements file: -# setuptools diff --git a/tox.ini b/tox.ini index 8ab2fb21..d9ab8faa 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py{311,312}-django{42,52},py{311,312}-quality +envlist = py312-django52,py312-quality skipsdist = True [pycodestyle] @@ -13,7 +13,6 @@ norecursedirs = .* jenkins load_tests log reports script test_framework xqueue [testenv] deps = - django42: Django>=4.2,<5.0 django52: Django>=5.2,<6.0 -r{toxinidir}/requirements/test.txt passenv = diff --git a/xqueue/production.py b/xqueue/production.py index aa2ec9f8..f8fc6324 100644 --- a/xqueue/production.py +++ b/xqueue/production.py @@ -21,7 +21,7 @@ def get_env_setting(setting): # Keep track of the names of settings that represent dicts. Instead of overriding the values in settings.py, # the values read from disk should UPDATE the pre-configured dicts. -DICT_UPDATE_KEYS = () +DICT_UPDATE_KEYS = ('STORAGES',) CONFIG_FILE = get_env_setting('XQUEUE_CFG') with codecs.open(CONFIG_FILE, encoding='utf-8') as f: @@ -35,6 +35,17 @@ def get_env_setting(setting): if value: vars()[key].update(value) + # Fallback for DEFAULT_FILE_STORAGE and STATICFILES_STORAGE settings. + # If these keys are present in the YAML config, use them to override the default storage backends. + default_backend = config_from_yaml.pop('DEFAULT_FILE_STORAGE', None) + static_backend = config_from_yaml.pop('STATICFILES_STORAGE', None) + + if default_backend: + STORAGES['default']['BACKEND'] = default_backend + + if static_backend: + STORAGES['staticfiles']['BACKEND'] = static_backend + vars().update(config_from_yaml) LOGGING = get_logger_config(LOG_DIR, diff --git a/xqueue/settings.py b/xqueue/settings.py index b5323833..467b91dc 100644 --- a/xqueue/settings.py +++ b/xqueue/settings.py @@ -84,6 +84,15 @@ # Examples: "http://media.lawrence.com/media/", "http://example.com/media/" MEDIA_URL = '' +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage", + }, +} + # Make this unique, and don't share it with anybody. SECRET_KEY = '[PLACEHOLDER]'