From 1868fc1b05f6ca8ede247dd0445ad48cdbd10fb7 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Fri, 25 Oct 2024 15:13:12 +0100 Subject: [PATCH 01/38] TMMA-508: Refactor detecting mime types of file uploads --- CHANGELOG | 3 +++ browser/fields.py | 9 +++------ browser/validators.py | 6 +++--- requirements/requirements.in | 1 - requirements/requirements.txt | 4 +--- tests/run-django-tests.sh | 2 +- tests/test_clamav.py | 6 +++--- tests/test_uploads.py | 10 +++++----- 8 files changed, 19 insertions(+), 22 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 54e26930..f17e42f2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +9.9.0 TMMA-508: Refactor detecting mime types of files + Update Python dependencies + 9.8.1 TMMA-509: Improve security of Python packaging tool Update Python packaging tool diff --git a/browser/fields.py b/browser/fields.py index ca445f34..734f439d 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -1,9 +1,6 @@ -import bz2 -import gzip import logging -import magic +import mimetypes import os -import tempfile from xtract import xtract from django import forms @@ -27,8 +24,8 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) - mime_type = magic.from_buffer(value.read(1024), mime=True) - if mime_type in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): + mime_type = mimetypes.guess_type(value) + if mime_type[0] in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: extracted_file_path = xtract(value.temporary_file_path()) return self._create_upload_file_from_path(extracted_file_path) diff --git a/browser/validators.py b/browser/validators.py index 3e556399..1fa3b2c2 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- import logging -import magic +import mimetypes import re from django.core.exceptions import ValidationError @@ -24,8 +24,8 @@ def __init__(self, mimetypes): def __call__(self, value): try: - mime = magic.from_buffer(value.read(1024), mime=True) - if mime not in self.mimetypes: + mime = mimetypes.guess_type(value) + if mime[0] not in self.mimetypes: raise ValidationError('%s is not an acceptable file type. Please use a %s formatted file instead.' % (value, ' or '.join(self.mimetypes))) except AttributeError as e: logger.debug("AttributeError") diff --git a/requirements/requirements.in b/requirements/requirements.in index e3d05653..0f16224c 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -17,7 +17,6 @@ mysqlclient>=2.1.1 numexpr<2.8.7 # Drops support for Python 3.8 numpy>=1.24.2 pandas>=1.5.3 -python-magic>=0.4.27 redis<4 rq<2.0 # Drops support for Redis server < 4 unicodecsv>=0.14.1 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 4001f478..4faf24e9 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -498,9 +498,7 @@ python-dateutil==2.9.0.post0 \ python-magic==0.4.27 \ --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b \ --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3 - # via - # -r requirements/requirements.in - # xtract + # via xtract pytz==2024.2 \ --hash=sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a \ --hash=sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725 diff --git a/tests/run-django-tests.sh b/tests/run-django-tests.sh index 9b3d747c..722939d8 100644 --- a/tests/run-django-tests.sh +++ b/tests/run-django-tests.sh @@ -8,5 +8,5 @@ echo "Run coverage tests" cd $GITHUB_WORKSPACE cd lib/test/src/temmpo ../../bin/coverage -../../bin/coverage run --source='.' manage.py test --settings=temmpo.settings.test_mysql --exclude-tag=selenium-test --exclude-tag=skip-on-ubuntu +../../bin/coverage run --source='.' manage.py test --settings=temmpo.settings.test_mysql --exclude-tag=selenium-test ../../bin/coverage report --skip-empty --skip-covered -m diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 0e9ad825..3eeba82b 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -5,7 +5,7 @@ from time import sleep from unittest import skip -import magic +import mimetypes import requests from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By @@ -45,8 +45,8 @@ def _assert_file_upload(self, url, file_path): self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file - mime_type = magic.from_buffer(uploaded_file.read(2048), mime=True) - self.assertEqual(mime_type, "text/plain") + mime_type = mimetypes.guess_type(uploaded_file) + self.assertEqual(mime_type[0], "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): file_path = BASE_DIR + "/test_virus_file" diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 2d1f13fb..e642b110 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import logging import os -import magic +import mimetypes from django.urls import reverse from django.test import tag @@ -112,8 +112,8 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file - mime_type = magic.from_buffer(uploaded_file.read(2048), mime=True) - self.assertEqual(mime_type, "text/plain") + mime_type = mimetypes.guess_type(uploaded_file) + self.assertEqual(mime_type[0], "text/plain") def test_bz2_pub_med_upload_is_allowable(self): self._assert_file_is_uploaded_and_extracted_where_required(TEST_BZ_PUB_MED_ARCHIVE, reverse('search_pubmed')) @@ -121,11 +121,11 @@ def test_bz2_pub_med_upload_is_allowable(self): def test_gzip_pub_med_upload_is_allowable(self): self._assert_file_is_uploaded_and_extracted_where_required(TEST_GZIP_PUB_MED_ARCHIVE, reverse('search_pubmed')) - @tag('skip-on-ubuntu') + @tag('mimetype') def test_small_bz2_pub_med_upload_is_allowable(self): self._assert_file_is_uploaded_and_extracted_where_required(TEST_BZ_PUB_MED_SMALL_ARCHIVE, reverse('search_pubmed')) - @tag('skip-on-ubuntu') + @tag('mimetype') def test_small_gzip_pub_med_upload_is_allowable(self): self._assert_file_is_uploaded_and_extracted_where_required(TEST_GZIP_PUB_MED_SMALL_ARCHIVE, reverse('search_pubmed')) From f8f483b164d800d32d94138cdbe8c8034c976123 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Fri, 25 Oct 2024 15:24:09 +0100 Subject: [PATCH 02/38] Bug fix refactoring detecting mime types --- CHANGELOG | 2 +- browser/fields.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f17e42f2..3cfb2553 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,4 @@ -9.9.0 TMMA-508: Refactor detecting mime types of files +9.9.0 TMMA-508: Refactor detecting mime types of file uploads Update Python dependencies 9.8.1 TMMA-509: Improve security of Python packaging tool diff --git a/browser/fields.py b/browser/fields.py index 734f439d..eedcd9d7 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -24,7 +24,7 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) - mime_type = mimetypes.guess_type(value) + mime_type = mimetypes.guess_type(value.temporary_file_path()) if mime_type[0] in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: extracted_file_path = xtract(value.temporary_file_path()) From 55efed631a8b35075cac0a7aa13b329769bd8e7a Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Fri, 25 Oct 2024 15:32:21 +0100 Subject: [PATCH 03/38] Bug fix refactoring detecting mime types --- browser/validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/validators.py b/browser/validators.py index 1fa3b2c2..79c34026 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -24,7 +24,7 @@ def __init__(self, mimetypes): def __call__(self, value): try: - mime = mimetypes.guess_type(value) + mime = mimetypes.guess_type(value.temporary_file_path()) if mime[0] not in self.mimetypes: raise ValidationError('%s is not an acceptable file type. Please use a %s formatted file instead.' % (value, ' or '.join(self.mimetypes))) except AttributeError as e: From 5a49a83a3e94acc5471c051ffc9752b3094f7c7e Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Fri, 25 Oct 2024 16:02:17 +0100 Subject: [PATCH 04/38] Bug fix refactoring tests to use mimetypes package --- tests/test_clamav.py | 4 ++-- tests/test_uploads.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 3eeba82b..062b0c4f 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -44,8 +44,8 @@ def _assert_file_upload(self, url, file_path): previous_upload_count = Upload.objects.all().count() self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) - uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file - mime_type = mimetypes.guess_type(uploaded_file) + uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path + mime_type = mimetypes.guess_type(uploaded_file_path) self.assertEqual(mime_type[0], "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): diff --git a/tests/test_uploads.py b/tests/test_uploads.py index e642b110..a8a6428c 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -111,8 +111,8 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not an acceptable file type") self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) - uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file - mime_type = mimetypes.guess_type(uploaded_file) + uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path + mime_type = mimetypes.guess_type(uploaded_file_path) self.assertEqual(mime_type[0], "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From f63c6ce1851cf9ec20c0bafb25ff9ac50c5564c6 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Fri, 25 Oct 2024 16:11:35 +0100 Subject: [PATCH 05/38] Add more debug output to mime type validator --- browser/validators.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/browser/validators.py b/browser/validators.py index 79c34026..eacfc89a 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -25,6 +25,8 @@ def __init__(self, mimetypes): def __call__(self, value): try: mime = mimetypes.guess_type(value.temporary_file_path()) + logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) + logger.error("DEBUG: mime %s" % mime) if mime[0] not in self.mimetypes: raise ValidationError('%s is not an acceptable file type. Please use a %s formatted file instead.' % (value, ' or '.join(self.mimetypes))) except AttributeError as e: From 23a2ee4982bf949ba233b9c66bfc638fde79c9eb Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Thu, 31 Oct 2024 11:41:30 +0000 Subject: [PATCH 06/38] Update pip version --- deploy/Dockerfile | 6 +++--- deploy/fabfile.py | 10 +++++----- tests/build-test-env.sh | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/deploy/Dockerfile b/deploy/Dockerfile index ebff3a1c..1bee500e 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -1,9 +1,9 @@ -FROM python:3.8.20-slim +FROM python:3.9.20-slim ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 -ENV PIP_VERSION='24.2' -ENV SETUPTOOLS_VERSION='74.1.2' +ENV PIP_VERSION='24.3.1' +ENV SETUPTOOLS_VERSION='75.2.0' ENV PIP_TOOLS_VERSION='7.4.1' # NB: Version 15.1.0 is installed on RHEL ENV VE_VERSION='20.26.4' diff --git a/deploy/fabfile.py b/deploy/fabfile.py index 6005cbe4..54e3c508 100644 --- a/deploy/fabfile.py +++ b/deploy/fabfile.py @@ -18,8 +18,8 @@ # Tools not handled by pip-tools and/or requirements installs using pip # Also update pip version in tests/build-test-env.sh and Dockerfile -PIP_VERSION = '24.2' -SETUPTOOLS_VERSION = '74.1.2' +PIP_VERSION = '24.3.1' +SETUPTOOLS_VERSION = '75.2.0' PIP_TOOLS_VERSION = '7.4.1' @@ -82,7 +82,7 @@ def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch= stop_rqworker_service(use_local_mode) with change_dir(project_dir + 'lib/'): - caller('%s --python python3.8 %s' % (virtualenv, env)) + caller('%s --python python3.9 %s' % (virtualenv, env)) # Verify Python version in use caller('%s/bin/python3 -V' % env) @@ -172,7 +172,7 @@ def deploy(env="dev", branch="master", using_apache=True, migrate_db=True, use_l with change_dir(venv_dir): # Remove any python dependency pyc files - caller('rm -f `find lib/python3.8/site-packages/ -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') + caller('rm -f `find lib/python3.9/site-packages/ -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') # Ensure pip3 and setup tools is up to expected version for existing environments. caller('./bin/pip3 cache purge') @@ -290,7 +290,7 @@ def setup_apache(env="dev", use_local_mode=False, project_dir=PROJECT_ROOT): if env == "dev": # Set up SE Linux contexts for dev environments, puppet configured for VMs caller('chcon -R -t httpd_sys_content_t %s' % static_dir) # Only needs to be readable - caller('chcon -R -t httpd_sys_script_exec_t %slib/python3.8/' % venv_dir) + caller('chcon -R -t httpd_sys_script_exec_t %slib/python3.9/' % venv_dir) caller('chcon -R -t httpd_sys_script_exec_t %s' % src_dir) # caller('chcon -R -t httpd_sys_script_exec_t %s.settings' % PROJECT_ROOT) caller('chcon -R -t httpd_sys_rw_content_t %slog/django.log' % var_dir) diff --git a/tests/build-test-env.sh b/tests/build-test-env.sh index 1750135d..8783a0bf 100644 --- a/tests/build-test-env.sh +++ b/tests/build-test-env.sh @@ -24,7 +24,7 @@ mkdir -p var/tmp echo "Check the version of pip that is installed" pip3 -V echo "Ensure using a consistent version of pip as per on premises CI server" -pip3 install -U pip==24.2 +pip3 install -U pip==24.3.1 pip3 -V echo "Install Fabric" @@ -36,9 +36,9 @@ pip3 install virtualenv==20.26.3 # NB: Version 15.1.0 is installed on RHEL echo "Install wheel" sudo apt-get install -y python3-wheel-whl -echo "Check aliases for python3.8" +echo "Check aliases for python3.9" which python3 -which python3.8 +which python3.9 echo "Ensure Firefox is installed" which firefox From 98bd3953b195ac5a463dcf1f923559179df56731 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Thu, 31 Oct 2024 20:50:51 +0000 Subject: [PATCH 07/38] TMMA-511: Upgrade Python from 3.8.x to 3.9+; TMMA-347: Set up RHEL8 development docker environment; Update version of MySQL used in GitHub actions; Update Python dependencies --- .dockerignore | 2 + .github/workflows/check-python-dependcies.yml | 2 +- .github/workflows/docker.yml | 6 - .github/workflows/run-django-test.yml | 4 +- CHANGELOG | 5 + README.md | 6 + deploy/Dockerfile-rhel | 91 +++ deploy/Vagrantfile | 82 ++- deploy/deploy-centos.sh | 6 +- deploy/deploy-rhel.sh | 320 ++++++++++ deploy/fabfile.py | 2 +- deploy/setup-rhel-env.sh | 23 + deploy/temp/Vagrantfile | 77 +++ docker-compose.override.yml | 53 ++ docker-compose.yml | 66 ++ entrypoints/dev.sh | 11 + .../find-vulnerabilities-python-deps.sh | 7 + entrypoints/serve.sh | 6 + entrypoints/test.sh | 16 + requirements/dev.txt | 572 +++++++++--------- requirements/requirements.in | 8 +- requirements/requirements.txt | 402 ++++++------ requirements/test.txt | 545 +++++++++-------- sample.env | 10 + 24 files changed, 1552 insertions(+), 770 deletions(-) create mode 100644 .dockerignore create mode 100644 deploy/Dockerfile-rhel create mode 100644 deploy/deploy-rhel.sh create mode 100644 deploy/setup-rhel-env.sh create mode 100644 deploy/temp/Vagrantfile create mode 100755 docker-compose.override.yml create mode 100644 docker-compose.yml create mode 100644 entrypoints/dev.sh create mode 100644 entrypoints/find-vulnerabilities-python-deps.sh create mode 100755 entrypoints/serve.sh create mode 100755 entrypoints/test.sh create mode 100644 sample.env diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..73a6a178 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +deploy/Dockerfile +deploy/Dockerfile-rhel diff --git a/.github/workflows/check-python-dependcies.yml b/.github/workflows/check-python-dependcies.yml index a2c03b3f..69826b1d 100644 --- a/.github/workflows/check-python-dependcies.yml +++ b/.github/workflows/check-python-dependcies.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' architecture: 'x64' - name: Run checks for package updates run: bash tests/run-update-checks.sh diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 86c5b1f9..ddf29bf0 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -6,12 +6,6 @@ on: workflow_dispatch: pull_request: push: - paths: - # TODO: Review scope of GitHub action grows - - '.github/workflows/docker.yml' - - 'deploy/Dockerfile' - - 'entrypoints/**' - - 'requirements/**' # schedule: # - cron: 30 9 * * WED diff --git a/.github/workflows/run-django-test.yml b/.github/workflows/run-django-test.yml index 767033d5..d3cfef06 100644 --- a/.github/workflows/run-django-test.yml +++ b/.github/workflows/run-django-test.yml @@ -18,7 +18,7 @@ jobs: ports: - 6379:6379 db: - image: mysql:8.0.39 + image: mysql:8.0.40 ports: - 3306:3306 env: @@ -27,7 +27,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.8' + python-version: '3.9' architecture: 'x64' - name: Run Python 3/Django tests run: bash tests/run-django-tests.sh diff --git a/CHANGELOG b/CHANGELOG index 54e26930..809eae5f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +9.9.0 TMMA-511: Upgrade Python from 3.8.x to 3.9+ + TMMA-347: Set up RHEL8 development docker environment + Update version of MySQL used in GitHub actions + Update Python dependencies + 9.8.1 TMMA-509: Improve security of Python packaging tool Update Python packaging tool diff --git a/README.md b/README.md index 1a572a6b..6827fa4c 100644 --- a/README.md +++ b/README.md @@ -148,6 +148,12 @@ Alternatively docker build -f deploy/Dockerfile -t temmpo-web . docker run --rm -it -v $PWD:/srv -w /srv temmpo-web bash /srv/entrypoints/update-requirements.sh +Alternatively + + docker compose build web + docker compose run --no-deps web bash /srv/entrypoints/update-requirements.sh + + #### Create Docker images for different environments docker build -f deploy/Dockerfile -t temmpo-web-dev . --build-arg REQUIREMENTS_FILE=dev.txt diff --git a/deploy/Dockerfile-rhel b/deploy/Dockerfile-rhel new file mode 100644 index 00000000..a5ce0ef0 --- /dev/null +++ b/deploy/Dockerfile-rhel @@ -0,0 +1,91 @@ +FROM redhat/ubi8:8.10 + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +RUN yum -C repolist + +ARG RHEL_ORG_ID +ARG RHEL_ACTIVATION_KEY +RUN subscription-manager register --org ${RHEL_ORG_ID} --activationkey ${RHEL_ACTIVATION_KEY} + +RUN subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-debug-rpms +RUN subscription-manager repos --enable rhel-8-for-x86_64-supplementary-source-rpms +RUN subscription-manager repos --enable rhel-8-for-x86_64-baseos-e4s-source-rpms + +RUN yum -C repolist +RUN subscription-manager repos --list + +# Install EPEL +RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + +# Update system packages and install dependencies +RUN yum update -y && \ + yum -y install \ + bzip2 \ + clamav \ + clamav-data \ + clamav-devel \ + clamav-filesystem \ + clamav-freshclam \ + clamav-lib \ + clamd \ + curl \ + # firefox-esr \ + gcc \ + libffi \ + libxml2 \ + pkg-config \ + mariadb-connector-c-devel \ + perl-DBD-MySQL \ + python39 \ + python39-devel \ + python39-lxml \ + python39-setuptools \ + python39-wheel \ + zip + +ENV PIP_VERSION='24.3.1' +ENV SETUPTOOLS_VERSION='75.2.0' +ENV PIP_TOOLS_VERSION='7.4.1' +ENV VE_VERSION='20.26.3' +ENV FABRIC_VERSION='1.15.0' + +RUN pip3 install -U pip==${PIP_VERSION} +RUN pip3 install -U setuptools==${SETUPTOOLS_VERSION} +RUN pip3 install pip-tools==${PIP_TOOLS_VERSION} +RUN pip3 install virtualenv==${VE_VERSION} +RUN pip3 install fabric==${FABRIC_VERSION} + +RUN pip3 freeze +RUN virtualenv --version + +ENV ENVIRON="test" +ENV REQUIREMENTS="test" + +ENV PROJECT_PATH=/usr/local/projects/temmpo +ENV CODE_PATH=${PROJECT_PATH}/lib/${ENVIRON}/src/temmpo + +WORKDIR ${CODE_PATH} + +COPY deploy/setup-rhel-env.sh deploy/ +RUN bash deploy/setup-rhel-env.sh + +COPY deploy/fabfile.py deploy/ +COPY requirements/test.txt requirements/test.txt +COPY temmpo/settings/github_actions_ci_private_settings.py temmpo/settings/ + +RUN ln -s temmpo/settings/github_actions_ci_private_settings.py ${PROJECT_PATH}/.settings/private_settings.py + +RUN fab -l -f deploy/fabfile.py +RUN fab make_virtualenv:env=${ENVIRON},configure_apache=False,clone_repo=False,branch=None,migrate_db=False,use_local_mode=True,requirements=${REQUIREMENTS},restart_rqworker=False,virtualenv=virtualenv,project_dir=${PROJECT_PATH}/ -f deploy/fabfile.py + +COPY . ${CODE_PATH} + +VOLUME [ ${CODE_PATH} ] + +RUN ls -l /usr/local/projects/temmpo/.settings/private_settings.py + +CMD [ "pip3", "check" ] # TODO replace with command to run tests + +# CMD ../../bin/python3 manage.py test --settings=temmpo.settings.test_mysql --exclude-tag=selenium-test --exclude-tag=skip-on-ubuntu \ No newline at end of file diff --git a/deploy/Vagrantfile b/deploy/Vagrantfile index b7e7726a..c44b9985 100644 --- a/deploy/Vagrantfile +++ b/deploy/Vagrantfile @@ -5,8 +5,7 @@ Vagrant.configure("2") do |config| - config.vm.box = "centos/7" - config.vm.box_version = "2004.01" + config.vm.box = "generic/rhel8" # Used to allow pass phrase free SSH access to allow # remote testing of Fabric scripts against Vagrant VMs @@ -14,26 +13,35 @@ Vagrant.configure("2") do |config| config.vm.define "db" do |db| + db.vm.synced_folder ".", "/vagrant", # type: "sshfs", + owner: "vagrant", group: "vagrant" + db.vm.provision "shell", inline: <<-SHELL sudo timedatectl set-timezone Europe/London sudo yum update - echo "Install dev utils" - sudo yum install -y unzip - sudo yum install -y nano - - echo "Install essential tools & repos" + echo "Install essential tools & EPEL 8 repo" sudo yum install -y wget - wget -N https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm - sudo rpm -ivh --replacepkgs epel-release-latest-7.noarch.rpm + wget -N https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + sudo rpm -ivh --replacepkgs epel-release-latest-8.noarch.rpm - # Install database server and client - sudo yum -y install mariadb-server mariadb + # Install database server + sudo yum install libaio libsepol lsof + wget https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm + sudo yum localinstall -y mysql84-community-release-el8-1.noarch.rpm - echo "Run services" - sudo systemctl start mariadb - sudo systemctl enable mariadb + # sudo yum repolist enabled | grep mysql.*-community + # sudo yum repolist enabled | grep mysql + # sudo yum --disablerepo=\* --enablerepo='mysql*-community*' list available + + sudo yum-config-manager --disable mysql-8.4-lts-community + sudo yum-config-manager --enable mysql80-community + + sudo yum update + + sudo yum install -y mysql-community-libs + sudo yum install -y --nobest mysql-community-server echo "Allow external connections from mysql" cat > allow-external-connections.cnf << CONF @@ -41,42 +49,68 @@ Vagrant.configure("2") do |config| bind-address=0.0.0.0 CONF sudo mv allow-external-connections.cnf /etc/my.cnf.d/ - sudo systemctl restart mariadb - mysql -u root < /vagrant/db-setup.sql - SHELL + + echo "Run services" + sudo systemctl status mysqld + sudo systemctl restart mysqld + sudo systemctl enable mysqld + sudo systemctl status mysqld + + # echo "Insecure installation" + # mysqld --initialize-insecure=ON --user=mysql -y + # echo "Run setup scripts" + # mysql -u root --skip-password < /vagrant/db-setup.sql + echo "Secure installation" + mysql_secure_installation -u mysql --password=tmp-dev-environment-12345 --use-default=true + echo "Run setup scripts" + mysql -u root --password=tmp-dev-environment-12345 < /vagrant/db-setup.sql + + SHELL db.vm.network "forwarded_port", guest: 3306, host: 3306 - db.vm.network "private_network", ip: "10.0.1.20" + db.vm.network "private_network", ip: "192.168.56.0" end # Django box config.vm.define "django", primary: true do |django| # Run the Django setup - django.vm.provision "shell", path: "deploy-centos.sh" + django.vm.provision "shell", path: "deploy-rhel.sh" - django.vm.synced_folder "../", "/usr/local/projects/temmpo/lib/dev/src/temmpo", type: "sshfs", + django.vm.synced_folder "../", "/usr/local/projects/temmpo/lib/dev/src/temmpo", # type: "sshfs", owner: "vagrant", group: "vagrant" django.vm.network "forwarded_port", guest: 59099, host: 59099 - django.vm.network "private_network", ip: "10.0.1.21" + django.vm.network "private_network", ip: "192.168.56.11" end # Apache/Django box config.vm.define "apache", autostart: false do |apache| # Run the Django setup - apache.vm.provision "shell", path: "deploy-centos.sh" + apache.vm.provision "shell", path: "deploy-rhel.sh" - apache.vm.synced_folder "../", "/vagrant", type: "sshfs", + apache.vm.synced_folder "../", "/vagrant", # type: "sshfs", owner: "vagrant", group: "vagrant" apache.vm.network "forwarded_port", guest: 80, host: 8800 - apache.vm.network "private_network", ip: "10.0.1.19" + apache.vm.network "private_network", ip: "192.168.56.19" end config.vm.provider "virtualbox" do |v| v.memory = 4096 v.cpus = 2 end + + # config.vbguest.iso_path = "VBoxGuestAdditions_7.0.22.iso" + # config.vbguest.auto_update = true + # config.vbguest.no_remote = false + # no_install + + # config.vm.provider "docker" do |d| + # d.image = "redhat/ubi8" + # # d.vagrant_vagrantfile + # # v.memory = 4096 + # # v.cpus = 2 + # end end \ No newline at end of file diff --git a/deploy/deploy-centos.sh b/deploy/deploy-centos.sh index 7c05f1bc..266d117d 100644 --- a/deploy/deploy-centos.sh +++ b/deploy/deploy-centos.sh @@ -46,9 +46,9 @@ echo "### Install Python 3.8 and components" yum -y install gcc gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel cd /opt -wget https://www.python.org/ftp/python/3.8.13/Python-3.8.13.tgz -tar -xzf Python-3.8.13.tgz -cd Python-3.8.13/ +wget https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz +tar -xzf Python-3.9.20.tgz +cd Python-3.9.20/ ./configure --enable-optimizations --enable-shared make altinstall # Create symlinks diff --git a/deploy/deploy-rhel.sh b/deploy/deploy-rhel.sh new file mode 100644 index 00000000..38ee762d --- /dev/null +++ b/deploy/deploy-rhel.sh @@ -0,0 +1,320 @@ +#!/bin/sh + +python3 --version +yum repolist enabled + +# yum-config-manager --add-repo + +echo "### Build script for a development TeMMPo environment on RHEL" +timedatectl set-timezone Europe/London + +subscription-manager repos --enable rhel-8-server-optional-rpms +subscription-manager repos --enable rhel-8-server-extras-rpms +subscription-manager repos --enable codeready-builder-for-rhel-8-x86_64-rpms +subscription-manager repos --enable docker +subscription-manager repos --enable epel +subscription-manager repos --enable mysql-connectors-community +subscription-manager repos --enable mysql-tools-community +subscription-manager repos --enable mysql57-community +subscription-manager repos --enable rhel-8-for-x86_64-appstream-rpms +subscription-manager repos --enable rhel-8-for-x86_64-baseos-rpms + +yum repolist enabled + +# rhel-8-for-x86_64-appstream-rpms + +yum install -y wget +# 8-21.el8 +wget -N https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm +rpm -ivh --replacepkgs epel-release-latest-8.noarch.rpm + +yum -y update + +echo "Install Centos dev tools, like audit2allow" +yum -y install policycoreutils-python +yum -y install mlocate + +echo "### Install dev tools" +yum -y install rh-git227 +yum -y install nano +yum -y install unzip +yum -y install sqlite-devel + +echo "MySQL client stuff" + +# Refresh the MySQL GPG keys - important if we want the mysqll client to install properly. +rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 +# Clean up default mariadb installations +yum -y remove mariadb-libs +yum -y install mysql-devel +wget https://repo.mysql.com/mysql84-community-release-el8-1.noarch.rpm +yum localinstall -y mysql84-community-release-el8-1.noarch.rpm +yum -y install mysql-community-libs +yum -y install mysql-community-client + +echo "### Setup Web server components" +yum -y install httpd +yum -y install httpd-devel +# yum -y install httpd-manual +# Required to connect to DB successfully from web server and be able to send emails +setsebool -P httpd_can_network_connect 1 +setsebool -P httpd_can_network_connect_db 1 +setsebool -P httpd_can_sendmail 1 + +echo "### Install Python 3.9 and components" + +yum -y install gcc gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel +cd /opt +wget https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz +tar -xzf Python-3.9.20.tgz +cd Python-3.9.20/ +./configure --enable-optimizations --enable-shared +make altinstall +# Create symlinks +ln -sfn /usr/local/bin/python3.9 /usr/bin/python3.9 +ln -sfn /usr/local/bin/pip3.9 /usr/bin/pip3.9 + +echo "export LD_LIBRARY_PATH=/usr/local/lib/" > ld_library.sh +mv ld_library.sh /etc/profile.d/ld_library.sh +export set LD_LIBRARY_PATH=/usr/local/lib/ + +# Install symtem wide python requirements +pip3.9 install -U pip==19.3.1 # As per app servers +pip3.9 install Fabric==1.15.0 # NB: v1.15.0 supports Python 2, & 3.6, 3.7, & 3.8 + +pip3.9 install mod_wsgi==4.9.4 # As per app servers +ls /usr/local/lib64/python3.9/site-packages/mod_wsgi/server/ +pip3.9 install virtualenv==20.24.5 # As per app servers + +ln -s /usr/local/bin/virtualenv /usr/bin/virtualenv-3.9 + +yum -y install python3-pip-wheel-9.0.3-24.el8 +yum -y install python3-lxml + +echo "### Install anti-virus tools used with Apache fronted instances" +yum -y install clamav +yum -y install clamd +# ref: https://github.com/vstoykov/django-clamd#configuration +# Installed on prod +yum -y install clamav-data +yum -y install clamav-devel + +setsebool -P antivirus_can_scan_system 1 +setsebool -P daemons_enable_cluster_mode 1 +# Use production config as per puppet config, +# see https://gitlab.isys.bris.ac.uk/research_it/clamav/-/blob/master/files/freshclam.conf +# and https://gitlab.isys.bris.ac.uk/research_it/clamav/-/blob/master/templates/scan.conf.epp +if [ -f /usr/local/projects/temmpo/lib/dev/src/temmpo/deploy/freshclam.conf ] + then + cp /usr/local/projects/temmpo/lib/dev/src/temmpo/deploy/freshclam.conf /etc/ + else + # apache VMs do not mount local source code + cp /vagrant/deploy/freshclam.conf /etc/ +fi +if [ -f /usr/local/projects/temmpo/lib/dev/src/temmpo/deploy/scan.conf ] + then + cp /usr/local/projects/temmpo/lib/dev/src/temmpo/deploy/scan.conf /etc/clamd.d/ + else + # apache VMs do not mount local source code + cp /vagrant/deploy/scan.conf /etc/clamd.d/ +fi + +touch /var/log/clamd.scan +chown clamscan:clamscan /var/log/clamd.scan +usermod -a -G clamscan apache +usermod -a -G virusgroup apache +usermod -a -G clamscan vagrant +usermod -a -G virusgroup vagrant + +systemctl start clamd@scan +systemctl enable clamd@scan + +# Update virus DB +/bin/freshclam + +echo "### Install redis" +yum -y install redis +sed -i s'/appendonly no/appendonly yes/' /etc/redis.conf +systemctl start redis.service +systemctl enable redis +# Test redis +redis-cli ping + +echo "### Step up django-rq services" +# TMMA-382: Review and increase number of workers for matching code +for i in 1 2 3 4 +do + cat > /etc/systemd/system/rqworker$i.service <> /home/vagrant/.ssh/known_hosts + ssh-keyscan -H 104.192.143.2 >> /home/vagrant/.ssh/known_hosts + ssh-keyscan -H 104.192.143.3 >> /home/vagrant/.ssh/known_hosts + ssh-keyscan -H bitbucket.org >> /home/vagrant/.ssh/known_hosts + ssh-keyscan -H github.com >> /home/vagrant/.ssh/known_hosts + + chown -R vagrant:vagrant /home/vagrant/.ssh/ + chmod 700 /home/vagrant/.ssh/* + +fi + +## TODO: Fix path to mod_wsgi module +echo "### Add basic catch all Apache config normally managed by Puppet" +cat > /etc/httpd/conf.d/temmpo.conf < + ServerName www.temmpo.org.uk + ServerAlias temmpo.org.uk + ServerAlias dev.temmpo.org.uk + ServerAlias vagrant.temmpo.org.uk + + ## Vhost docroot + DocumentRoot "/usr/local/projects/temmpo/var/www" + + ## Directories, there should at least be a declaration for /usr/local/projects/temmpo/var/www + + + Options Indexes FollowSymLinks MultiViews + AllowOverride None + Require all granted + + + ## Load additional static includes + IncludeOptional "/usr/local/projects/temmpo/etc/apache/conf.d/*.conf" + +APACHE_CONF + +echo "### Add placeholder private_settings.py" +mkdir -p /usr/local/projects/temmpo/.settings/ +cat > /usr/local/projects/temmpo/.settings/private_settings.py <=1.4.0 hiredis>=2.2.2 lxml>=4.9.2 more-itertools>=9.1.0 -mysql-connector-python<9.0.0 +mysql-connector-python>=9.1.0 mysqlclient>=2.1.1 -numexpr<2.8.7 # Drops support for Python 3.8 +numexpr>=2.10.1 numpy>=1.24.2 pandas>=1.5.3 python-magic>=0.4.27 -redis<4 -rq<2.0 # Drops support for Redis server < 4 +redis # redis<3.6 redis-cli redis-cli 5.0.3 redis_version:5.0.3 redis_version:3.2.12 requires - 3.5.3 +requires # NB: 2.0 drops support for Redis server < 4 unicodecsv>=0.14.1 xtract>=0.1a3 \ No newline at end of file diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 4001f478..f5072aed 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,76 +1,56 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.9 # by the following command: # # pip-compile --generate-hashes --output-file=requirements/requirements.txt requirements/requirements.in # --index-url https://pypi.python.org/simple/ +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 + # via xtyping asgiref==3.8.1 \ --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 \ --hash=sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590 # via django -backports-zoneinfo==0.2.1 \ - --hash=sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf \ - --hash=sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328 \ - --hash=sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546 \ - --hash=sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6 \ - --hash=sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570 \ - --hash=sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9 \ - --hash=sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7 \ - --hash=sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987 \ - --hash=sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722 \ - --hash=sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582 \ - --hash=sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc \ - --hash=sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b \ - --hash=sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1 \ - --hash=sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08 \ - --hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \ - --hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2 - # via django -bottleneck==1.4.0 \ - --hash=sha256:03c43150f180d86a5633a6da788660d335983f6798fca306ba7f47ff27a1b7e7 \ - --hash=sha256:1490348b3bbc0225523dc2c00c6bb3e66168c537d62797bd29783c0826c09838 \ - --hash=sha256:14b3334a39308fbb05dacd35ac100842aa9e9bc70afbdcebe43e46179d183fd0 \ - --hash=sha256:1b4dac5d2a871b7bd296c2b92426daa27d5b07aa84ef2557db097d29135da4eb \ - --hash=sha256:2110af22aa8c2779faba8aa021d6b559df04449bdf21d510eacd7910934189fe \ - --hash=sha256:220b72405f77aebb0137b733b464c2526ded471e4289ac1e840bab8852759a55 \ - --hash=sha256:23834d82177d6997f21fa63156550668cd07a9a6e5a1b66ea80f1a14ac6ffd07 \ - --hash=sha256:28260197ab8a4a6b7adf810523147b1a3e85607f4e26a0f685eb9d155cfc75af \ - --hash=sha256:2861ff645d236f1a6f5c6d1ddb3db37d19af1d91057bdc4fd7b76299a15b3079 \ - --hash=sha256:2bb79a2ac135567694f13339f0bebcee96aec09c596b324b61cd7fd5e306f49d \ - --hash=sha256:381cbd1e52338fcdf9ff01c962e6aa187b2d8b3b369d42e779b6d33ac61f8d35 \ - --hash=sha256:44305c70c2a1539b0ae968e033f301ad868a6146b47e3cccd73fdfe3fc07c4ee \ - --hash=sha256:4a91e40bbb8452e77772614d882be2c34b3b514d9f15460f703293525a6e173d \ - --hash=sha256:520d7a83cd48b3f58e5df1a258acb547f8a5386a8c21ca9e1058d83a0d622fdf \ - --hash=sha256:59604949aea476f5075b965129eaa3c2d90891fd43b0dfaf2ad7621bb5db14a5 \ - --hash=sha256:5d6bf45ed58d5e7414c0011ef2da75474fe597a51970df83596b0bcb79c14c5e \ - --hash=sha256:6136ce7dcf825c432a20b80ab1c460264a437d8430fff32536176147e0b6b832 \ - --hash=sha256:6179791c0119aec3708ef74ddadab8d183e3742adb93a9028718e8696bdf572b \ - --hash=sha256:67347b0f01f32a232a6269c37afc1c079e08f6455fa12e91f4a1cd12eb0d11a5 \ - --hash=sha256:6a36280ee33d9db799163f04e88b950261e590cc71d089f5e179b21680b5d491 \ - --hash=sha256:817aa43a671ede696ea023d8f35839a391244662340cc95a0f46965dda8b35cf \ - --hash=sha256:834816c316ad184cae7ecb615b69876a42cd2cafb07ee66c57a9c1ccacb63339 \ - --hash=sha256:8746f0f727997ce4c7457dc1fec4e4e3c0fdd8803514baa3d1c4ea6515ab04b2 \ - --hash=sha256:889e6855b77345622b4ba927335d3118745d590492941f5f78554f157d259e92 \ - --hash=sha256:90d5d188a0cca0b9655ff2904ee61e7f183079e97550be98c2541a2eec358a72 \ - --hash=sha256:9903f017b9d6f2f69ce241b424ddad7265624f64dc6eafbe257d45661febf8bd \ - --hash=sha256:a704165552496cbcc8bcc5921bb679fd6fa66bb1e758888de091b1223231c9f0 \ - --hash=sha256:b1339b9ad3ee217253f246cde5c3789eb527cf9dd31ff0a1f5a8bf7fc89eadad \ - --hash=sha256:b5f72b66ccc0272de46b67346cf8490737ba2adc6a302664f5326e7741b6d5ab \ - --hash=sha256:beb36df519b8709e7d357c0c9639b03b885ca6355bbf5e53752c685de51605b8 \ - --hash=sha256:c2c92545e1bc8e859d8d137aefa3b24843bd374b17c9814dafa3bbcea9fc4ec0 \ - --hash=sha256:c6097bf39723e76ff5bba160daab92ae599df212c859db8d46648548584d04a8 \ - --hash=sha256:d53f1a72b12cfd76b56934c33bc0cb7c1a295f23a2d3ffba8c764514c9b5e0ff \ - --hash=sha256:d69907d8d679cb5091a3f479c46bf1076f149f6311ff3298bac5089b86a2fab1 \ - --hash=sha256:de17e012694e6a987bb4eb050dd7f0cf939195a8e00cb23aa93ebee5fd5e64a8 \ - --hash=sha256:e720ff24370324c84a82b1a18195274715c23181748b2b9e3dacad24198ca06f \ - --hash=sha256:ed209f8f3cb9954773764b0fa2510a7a9247ad245593187ac90bd0747771bc5c \ - --hash=sha256:eea333dbcadb780356c54f5c4fa7754f143573b57508fff43d5daf63298eb26a \ - --hash=sha256:f2749602200aaa0e12a0f3f936dd6d4035384ad10d3acf7ac4f418c501683397 \ - --hash=sha256:f63e79bfa2f82a7432c8b147ed321d01ca7769bc17cc04644286a4ce58d30549 \ - --hash=sha256:fbcdd01db9e27741fb16a02b720cf02389d4b0b99cefe3c834c7df88c2d7412d \ - --hash=sha256:ffb4e4edf7997069719b9269926cc00a2a12c6e015422d1ebc2f621c4541396a +bottleneck==1.4.2 \ + --hash=sha256:037315c56605128a39f77d19af6a6019dc8c21a63694a4bfef3c026ed963be2e \ + --hash=sha256:070d22f2f62ab81297380a89492cca931e4d9443fa4b84c2baeb52db09c3b1b4 \ + --hash=sha256:122845e3106c85465551d4a9a3777841347cfedfbebb3aa985cca110e07030b1 \ + --hash=sha256:125436df93751a226eab1732783aa8f6125e88e779587aa61be071fb66e41f9d \ + --hash=sha256:1f61658ebdf5a178298544336b65020730bf86cc092dab5f6579a99a86bd888b \ + --hash=sha256:1fc4e7645bd425c05e05acd5541e9e09cb4179e71164e862f082561bf4509eac \ + --hash=sha256:26b5f0531f7044befaad95c20365dd666372e66bdacbfaf009ff65d60285534d \ + --hash=sha256:2c9dbaf737b605b30c81611f2c1d197c2fd2e46c33f605876c1d332d3360c4fc \ + --hash=sha256:2db287f6ecdbb1c998085eca9b717fec2bfc48a4ab6ae070a9820ba8ab59c90b \ + --hash=sha256:2e2fe327dc2d0564e295a5857a252755103f8c6e05b07d3ff80a69afaa9f5065 \ + --hash=sha256:48c6b9d9287c4102b803fcb01ae66ae7ef6b310b711b4b7b7e23bf952894dc05 \ + --hash=sha256:48d2e101d99a9d72aa86da1a048d2094f4e1db0cf77519d1c33239f9d62da162 \ + --hash=sha256:4c6df9a60ec6ab88fec934ca864266ba95edd89c490af71dc9cd8afb2a54ebd9 \ + --hash=sha256:52248f3e0fead78c17912fb086a585c86f567019247d21c69e87645241b97b02 \ + --hash=sha256:6282fa925ac3768f66e3547f89a512376d3f9de7ef53bdd37aa29232fd864054 \ + --hash=sha256:6b7790ca8658cd69e3cc0d0e4ff0e9829d60849bf7945fbd7344fbce05b2bbb8 \ + --hash=sha256:72d6aa95cdd782833d2589f81434fd865ba004b8938e07920b6ef02796ce8918 \ + --hash=sha256:7363b3c8ce6ca433779cd7e96bcb94c0e516dcacadff0011adcbf0b3ac86bc9d \ + --hash=sha256:7b459d08f1f3e2da85db0a9e2d3e6e3541105f5866e9026dbca32dafc5106f2b \ + --hash=sha256:7c7d29c044a3511b36fd744503c3e697e279c273a8477a6d91a2831d04fd19e0 \ + --hash=sha256:7ebbcbe5d4062e37507b9a81e2aacdb1fcccc6193f7feff124ef2b5a6a5eb740 \ + --hash=sha256:89651ef18c06616850203bf8875c958c5d316ea48d8ba60d9b450199d39ae391 \ + --hash=sha256:964f6ac4118ddab3bbbac79d4f726b093459be751baba73ee0aa364666e8068e \ + --hash=sha256:99778329331d5fae8df19772a019e8b73ba4d9d1650f110cd995ab7657114db0 \ + --hash=sha256:9d7b12936516f944e3d981a64038f99acb21f0e99f92fad16d9a468248c2b231 \ + --hash=sha256:a74ddd0417f42eeaba37375f0fc065b28451e0fba45cb2f99e88880b10b3fa43 \ + --hash=sha256:b33e83665e7daf7f513fe1f7b04b13944d44b6635c45d5a9c89c9e5ed11811b6 \ + --hash=sha256:b6902ebf3e85315b481bc084f10c5770f8240275ad1e039ac69c7c8d2013b040 \ + --hash=sha256:c1c885ad02a6a8fa1f7ee9099f29b9d4c03eb1da2c7ab25839482d5cce739021 \ + --hash=sha256:c2fd34b9b490204f95288f0dd35d37042486a95029617246c88c0f94a0ab49fe \ + --hash=sha256:c663cbba8f52011fd82ee08c6a85c93b34b19e0e7ebba322d2d67809f34e0597 \ + --hash=sha256:dce1a3c5ff89a56fb2678c9bda17b89f60f710d6002ab7cd72b7661bc3fae64d \ + --hash=sha256:e56a206fbf48e3b8054a964398bf1ed843e9625d3c6bdbeb7898cb48bf97441b \ + --hash=sha256:e7a1b023de1de3d84b18826462718fba548fed41870df44354f9ab6a414ea82f \ + --hash=sha256:eb0c611d15b0fd8f511d288e8964e4725b4b3b0d9d310880cf0ff6b8dd03c859 \ + --hash=sha256:fa8e8e1799dea5483ce6669462660f9d9a95649f6f98a80d315b84ec89f449f4 # via -r requirements/requirements.in clamd==1.0.2 \ --hash=sha256:5c32546b7d1eb00fd6be00a889d79e00fbf980ed082826ccfa369bce3dcff5e7 \ @@ -105,9 +85,9 @@ django-js-asset==2.2.0 \ --hash=sha256:0c57a82cae2317e83951d956110ce847f58ff0cdc24e314dbc18b35033917e94 \ --hash=sha256:7ef3e858e13d06f10799b56eea62b1e76706f42cf4e709be4e13356bc0ae30d8 # via django-mptt -django-mptt==0.14.0 \ - --hash=sha256:2c92a2b1614c53086278795ccf50580cf1f9b8564f3ff03055dd62bab5987711 \ - --hash=sha256:d9a87433ab0e4f35247c6f6d5a93ace6990860a4ba8796f815d185f773b9acfc +django-mptt==0.16.0 \ + --hash=sha256:56c9606bf0b329b5f5afd55dd8bfd073612ea1d5999b10903b09de62bee84c8e \ + --hash=sha256:8716849ba3318d94e2e100ed0923a05c1ffdf8195f8472b690dbaf737d2af3b5 # via -r requirements/requirements.in django-redis-cache==3.0.1 \ --hash=sha256:a7fbef101a053d2e430bd3befe6a87e6e730f98e335b516f25f30b17d9fe66e3 @@ -116,10 +96,14 @@ django-registration-redux==2.13 \ --hash=sha256:547c86ad9b951cf743075b5486f304e51e450b45d04e5ef04392838a9cff3da8 \ --hash=sha256:9793a05b32b1d7342c6ef3e0140b2951b7dbde058b3ba6e8a232b534928279f9 # via -r requirements/requirements.in -django-rq==2.10.2 \ - --hash=sha256:5fe340e071c141a23ea0859df73c48b0a3df33a851835b2a8f8c4fca7a8b1849 \ - --hash=sha256:d1690b6a409934a0ea23c208ccb00d69477899f8edc61106ce5395c19dcdfb1e +django-rq==3.0.0 \ + --hash=sha256:7bdadb85d9909c118cf1ee1b9bdd1a74ebf141bf8f3c2de2409fcac6080f67ac \ + --hash=sha256:bd2ef287a28301f64c4282293648e4f8c6076dd895a545c9c6b98bde4a82a4ce # via -r requirements/requirements.in +funkify==0.4.5 \ + --hash=sha256:42df845f4afa63e0e66239a986d26b6572ab0b7ad600d7d6365d44d8a0cff3d5 \ + --hash=sha256:43f1e6c27263468a60ba560dfc13e6e4df57aa75376438a62f741ffc7c83cdfe + # via requires hiredis==3.0.0 \ --hash=sha256:00018f22f38530768b73ea86c11f47e8d4df65facd4e562bd78773bd1baef35e \ --hash=sha256:034925b5fb514f7b11aac38cd55b3fd7e9d3af23bd6497f3f20aa5b8ba58e232 \ @@ -360,33 +344,34 @@ more-itertools==10.5.0 \ --hash=sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef \ --hash=sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6 # via -r requirements/requirements.in -mysql-connector-python==8.4.0 \ - --hash=sha256:085024bf12d15f9b428938fdbeb50bd9b15dda9c4d3a474e6df061cb08713e6a \ - --hash=sha256:276bae0d5d44abb7ba1205003b55628e4e6f1d399f1825d518bc607320997b1f \ - --hash=sha256:2b5c6fea6513cf208c7116a4a5e36b3ae54e0d37f324a7cfe43fb01cfdf03be6 \ - --hash=sha256:35939c4ff28f395a5550bae67bafa4d1658ea72ea3206f457fff64a0fbec17e4 \ - --hash=sha256:3ae951f2e16d089975cb9f05b3f3e58807dc33a2e5a627047bba1c8ad5439d82 \ - --hash=sha256:42542d131d63c78416d410fdc9e84b9acb960d715c2e7b28c57ac9577c6d8165 \ - --hash=sha256:427a84027b8314c73f5ff3eb1abdc709a8201b44a491d7b580bdf430b4820a16 \ - --hash=sha256:44a99d44a925ea29c2e423e6d8b1d97ce740c3078d8b41923a81bbcd0a821972 \ - --hash=sha256:4e83fc8ed95005b171ffa36a289dac48625048263b09b56718e8395539ea07d9 \ - --hash=sha256:651c7824af57eb50f4a79ea04bf6f453b24381e1bb56eee45c0035b4c0c624c0 \ - --hash=sha256:655dccbdc0e2943e62cf69e10a024329248b17b58bfac59c60fd2103db3ba0b0 \ - --hash=sha256:74b1759d8bd9ccd4296dc2e5abe22ec7efbd1ad12a9032c2cb4d17fa5d0ca6e0 \ - --hash=sha256:76c13fde35a038afe50550a9af7b31b28ca3a04cce06f3030980afb20460d28c \ - --hash=sha256:a6d24ea29b3c2bdbba6861590de557665420bfb938f74b5cecc630bac5457d35 \ - --hash=sha256:accf10425c6af39a9595a47e7119ebcbcd7351f7df28755dbee01bca5a605b7c \ - --hash=sha256:aed505adc76b58282c76e6cbf3da195be0f84029a41f05c470be977481896074 \ - --hash=sha256:af40b5bdd91547d3dbf5fa62bde37e9e840bd7cba3b9246b55c09e6a1cde536f \ - --hash=sha256:b7876358d9e51f25edc492088c4ce16cd14c2db87c279a965b0f9c327723359c \ - --hash=sha256:bb4f3edab78f3fd6f80c6c0a9e5a533704044fc01bfb9e8736e1a993f74aa42d \ - --hash=sha256:c0a2688d95d53cfbea9352ed61926b47bc9042570570fb8fe0a8d19b1e20f1c4 \ - --hash=sha256:cd89d1c8c2d1e33e5ac2d4eac5813422c150a8427fb60a16c59be18c29dd9a94 \ - --hash=sha256:cda868bb4e1641362d148f5b0d2a86188cffa2f7188831589781b13f2df6f51a \ - --hash=sha256:d343a4a8133ae9561bd537fc8cdbcab74a0607a5f40698569010fa3c7d4a048f \ - --hash=sha256:e549674c72b596a7386f4a76bbac2ee9581f6632e6713618a70468713b162964 \ - --hash=sha256:e6d5a418ef124dd1b18a73fd89431a1862ce7bf68f61275c7d006e8e2f8afcd2 \ - --hash=sha256:ed276c4e7907da0ad95a9ad122004294d6fb425127064af2ae880033b8e72166 +mysql-connector-python==9.1.0 \ + --hash=sha256:109e17a4ada1442e3881a51e2bbabcb336ad229a619ac61e9ad24bd6b9b117bd \ + --hash=sha256:25e261f3260ec798c48cb910862a299e565548a1b5421dec84315ddbc9ef28c4 \ + --hash=sha256:28fd99ee464ac3b02d1e2a71a63ca4f25c6110e4414a46a5b64631e6d2096899 \ + --hash=sha256:30a8f0ba84f8adf15a4877e80b3f97f786ce35616d918b9310578a2bd22952d5 \ + --hash=sha256:346261a2aeb743a39cf66ba8bde5e45931d313b76ce0946a69a6d1187ec7d279 \ + --hash=sha256:4f102452c64332b7e042fa37b84d4f15332bd639e479d15035f2a005fb9fbb34 \ + --hash=sha256:6d7d5d458d0d600bbbebd9f2bce551e386b359bcce6026f7369b57922d26f13a \ + --hash=sha256:72dcce5f2e4f5910d65f02eb318c1e4622464da007a3ae5e9ccd64169d8efac3 \ + --hash=sha256:7b2eb48518b8c2bc9636883d264b291e5c93824fc6b61823ca9cf396a09474ad \ + --hash=sha256:7d99c0a841a2c2a0e4d5b28376c1bfac794ec3821b66eb6fa2f7702cec820ee8 \ + --hash=sha256:948ef0c7da87901176d4320e0f40a3277ee06fe6f58ce151c1e60d8d50fdeaf4 \ + --hash=sha256:9b23a8e2acee91b5120febe00c53e7f472b9b6d49618e39fa1af86cdc1f0ade8 \ + --hash=sha256:abf16fc1155ebeba5558e5702dd7210d634ac8da484eca05a640b68a548dc7cf \ + --hash=sha256:aceaab679b852c0a2ec0eed9eb2a490171b3493484f1881b605cbf2f9c5fde6d \ + --hash=sha256:c350b1aaf257b1b778f44b8bfaeda07751f55e150f5a7464342f36e4aac8e805 \ + --hash=sha256:c36a9b9ebf9587aaa5d7928468fefe8faf6fc993a03cb242bb160ede9cf75b2d \ + --hash=sha256:c75f674a52b8820c90d466183b2bb59f89bcf09d17ebe9b391313d89565c8896 \ + --hash=sha256:d627ebafc0327b935d8783454e7a4b5c32324ed39a2a1589239490ab850bf7d7 \ + --hash=sha256:dacf1aa84dc7dd8ae908626c3ae50fce956d0105130c7465fd248a4f035d50b1 \ + --hash=sha256:dcdcf380d07b9ca6f18a95e9516a6185f2ab31a53d290d5e698e77e59c043c9e \ + --hash=sha256:e15153cb8ab5fcec00b99077de536489d22d4809fc28f633850398fef0560b1f \ + --hash=sha256:e26a08a9500407fa8f4a6504f7077d1312bec4fa52cb0a58c1ad324ca1f3eeaa \ + --hash=sha256:e2f0876e1efd76e05853cb0a623dba2746ee70686c043019d811737dd5c3d871 \ + --hash=sha256:e75ecb3df2c2cbe4d92d5dd58a318fa708edebc0fa2d850fc2a9d42481dbb808 \ + --hash=sha256:ec4386b2426bfb07f83455bf895d8a7e2d6c067343ac05be5511083ca2424991 \ + --hash=sha256:f67b22e3eaf5b03ffac97232d3dd67b56abcacad907ad4391c847bad5ba58f0e \ + --hash=sha256:fec943d333851c4b5e57cd0b04dde36e6817f0d4d62b2a58ce028a82be444866 # via -r requirements/requirements.in mysqlclient==2.2.5 \ --hash=sha256:1d2e2ca0fe8405d8d6464edd01bf059951279e4bc27284d39341bd4737b2bc64 \ @@ -398,98 +383,131 @@ mysqlclient==2.2.5 \ --hash=sha256:b78438314199504c64f69e1e3521f2c9b419f19fcd85158b44c997b64409a6af \ --hash=sha256:e871ede4261d0d42b8ed20a2459db411c7deafedd8e77b7e4ba760be4a6a752b # via -r requirements/requirements.in -numexpr==2.8.6 \ - --hash=sha256:15469dc722b5ceb92324ec8635411355ebc702303db901ae8cc87f47c5e3a124 \ - --hash=sha256:18b1804923cfa3be7bbb45187d01c0540c8f6df4928c22a0f786e15568e9ebc5 \ - --hash=sha256:1967c16f61c27df1cdc43ba3c0ba30346157048dd420b4259832276144d0f64e \ - --hash=sha256:211804ec25a9f6d188eadf4198dd1a92b2f61d7d20993c6c7706139bc4199c5b \ - --hash=sha256:27782177a0081bd0aab229be5d37674e7f0ab4264ef576697323dd047432a4cd \ - --hash=sha256:31cf610c952eec57081171f0b4427f9bed2395ec70ec432bbf45d260c5c0cdeb \ - --hash=sha256:38b8b90967026bbc36c7aa6e8ca3b8906e1990914fd21f446e2a043f4ee3bc06 \ - --hash=sha256:47b45da5aa25600081a649f5e8b2aa640e35db3703f4631f34bb1f2f86d1b5b4 \ - --hash=sha256:6336f8dba3f456e41a4ffc3c97eb63d89c73589ff6e1707141224b930263260d \ - --hash=sha256:681812e2e71ff1ba9145fac42d03f51ddf6ba911259aa83041323f68e7458002 \ - --hash=sha256:6d7003497d82ef19458dce380b36a99343b96a3bd5773465c2d898bf8f5a38f9 \ - --hash=sha256:6e884687da8af5955dc9beb6a12d469675c90b8fb38b6c93668c989cfc2cd982 \ - --hash=sha256:80acbfefb68bd92e708e09f0a02b29e04d388b9ae72f9fcd57988aca172a7833 \ - --hash=sha256:84979bf14143351c2db8d9dd7fef8aca027c66ad9df9cb5e75c93bf5f7b5a338 \ - --hash=sha256:8564186aad5a2c88d597ebc79b8171b52fd33e9b085013e1ff2208f7e4b387e3 \ - --hash=sha256:8e3e6f1588d6c03877cb3b3dcc3096482da9d330013b886b29cb9586af5af3eb \ - --hash=sha256:95b9da613761e4fc79748535b2a1f58cada22500e22713ae7d9571fa88d1c2e2 \ - --hash=sha256:95c09e814b0d6549de98b5ded7cdf7d954d934bb6b505432ff82e83a6d330bda \ - --hash=sha256:9ef7e8aaa84fce3aba2e65f243d14a9f8cc92aafd5d90d67283815febfe43eeb \ - --hash=sha256:aa0f661f5f4872fd7350cc9895f5d2594794b2a7e7f1961649a351724c64acc9 \ - --hash=sha256:b5f96c89aa0b1f13685ec32fa3d71028db0b5981bfd99a0bbc271035949136b3 \ - --hash=sha256:c48221b6a85494a7be5a022899764e58259af585dff031cecab337277278cc93 \ - --hash=sha256:c8f37f7a6af3bdd61f2efd1cafcc083a9525ab0aaf5dc641e7ec8fc0ae2d3aa1 \ - --hash=sha256:d126938c2c3784673c9c58d94e00b1570aa65517d9c33662234d442fc9fb5795 \ - --hash=sha256:d36528a33aa9c23743b3ea686e57526a4f71e7128a1be66210e1511b09c4e4e9 \ - --hash=sha256:d6a88d71c166e86b98d34701285d23e3e89d548d9f5ae3f4b60919ac7151949f \ - --hash=sha256:dee04d72307c09599f786b9231acffb10df7d7a74b2ce3681d74a574880d13ce \ - --hash=sha256:e640bc0eaf1b59f3dde52bc02bbfda98e62f9950202b0584deba28baf9f36bbb \ - --hash=sha256:e93d64cd20940b726477c3cb64926e683d31b778a1e18f9079a5088fd0d8e7c8 \ - --hash=sha256:ef6e8896457a60a539cb6ba27da78315a9bb31edb246829b25b5b0304bfcee91 +numexpr==2.10.1 \ + --hash=sha256:00204e5853713b5eba5f3d0bc586a5d8d07f76011b597c8b4087592cc2ec2928 \ + --hash=sha256:22cc65e9121aeb3187a2b50827715b2b087ea70e8ab21416ea52662322087b43 \ + --hash=sha256:300e577b3c006dd7a8270f1bb2e8a00ee15bf235b1650fe2a6febec2954bc2c3 \ + --hash=sha256:368a1972c3186355160f6ee330a7eea146d8443da75a38a30083289ae251ef5a \ + --hash=sha256:37598cca41f8f50dc889b0b72be1616a288758c16ab7d48c9ac8719e1a39d835 \ + --hash=sha256:44f6d12a8c44be90199bbb10d3abf467f88951f48a3d1fbbd3c219d121f39c9d \ + --hash=sha256:45f598182b4f5c153222e47d5163c3bee8d5ebcaee7e56dd2a5898d4d97e4473 \ + --hash=sha256:4f0985bd1c493b23b5aad7d81fa174798f3812efb78d14844194834c9fee38b8 \ + --hash=sha256:552c8d4b2e3b87cdb2abb40a781b9a61a9090a9f66ac7357fc5a0b93aff76be3 \ + --hash=sha256:56648a04679063175681195670ad53e5c8ca19668166ed13875199b5600089c7 \ + --hash=sha256:5a4db4456e0779d5e024220b7b6a7477ac900679bfa74836b06fa526aaed4e3c \ + --hash=sha256:6a50370bea77ba94c3734a44781c716751354c6bfda2d369af3aed3d67d42871 \ + --hash=sha256:78b14c19c403df7498954468385768c86b0d2c52ad03dffb74e45d44ae5a9c77 \ + --hash=sha256:82bf04a1495ac475de4ab49fbe0a3a2710ed3fd1a00bc03847316b5d7602402d \ + --hash=sha256:82fc95c301b15ff4823f98989ee363a2d5555d16a7cfd3710e98ddee726eaaaa \ + --hash=sha256:926dd426c68f1d927412a2ad843831c1eb9a95871e7bb0bd8b20d547c12238d2 \ + --hash=sha256:9bba99d354a65f1a008ab8b87f07d84404c668e66bab624df5b6b5373403cf81 \ + --hash=sha256:a3c0b0bf165b2d886eb981afa4e77873ca076f5d51c491c4d7b8fc10f17c876f \ + --hash=sha256:ac23a72eff10f928f23b147bdeb0f1b774e862abe332fc9bf4837e9f1bc0bbf9 \ + --hash=sha256:b28eaf45f1cc1048aad9e90e3a8ada1aef58c5f8155a85267dc781b37998c046 \ + --hash=sha256:b2efa499f460124538a5b4f1bf2e77b28eb443ee244cc5573ed0f6a069ebc635 \ + --hash=sha256:bbd35f17f6efc00ebd4a480192af1ee30996094a0d5343b131b0e90e61e8b554 \ + --hash=sha256:ca8ae46481d0b0689ca0d00a8670bc464ce375e349599fe674a6d4957e7b7eb6 \ + --hash=sha256:cbf79fef834f88607f977ab9867061dcd9b40ccb08bb28547c6dc6c73e560895 \ + --hash=sha256:ce04ae6efe2a9d0be1a0e114115c3ae70c68b8b8fbc615c5c55c15704b01e6a4 \ + --hash=sha256:fa4009d84a8e6e21790e718a80a22d57fe7f215283576ef2adc4183f7247f3c7 \ + --hash=sha256:fb704620657a1c99d64933e8a982148d8bfb2b738a1943e107a2bfdee887ce56 \ + --hash=sha256:fcbf013bb8494e8ef1d11fa3457827c1571c6a3153982d709e5d17594999d4dd \ + --hash=sha256:fecdf4bf3c1250e56583db0a4a80382a259ba4c2e1efa13e04ed43f0938071f5 # via -r requirements/requirements.in -numpy==1.24.4 \ - --hash=sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f \ - --hash=sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61 \ - --hash=sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7 \ - --hash=sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400 \ - --hash=sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef \ - --hash=sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2 \ - --hash=sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d \ - --hash=sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc \ - --hash=sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835 \ - --hash=sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706 \ - --hash=sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5 \ - --hash=sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4 \ - --hash=sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6 \ - --hash=sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463 \ - --hash=sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a \ - --hash=sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f \ - --hash=sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e \ - --hash=sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e \ - --hash=sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694 \ - --hash=sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8 \ - --hash=sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64 \ - --hash=sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d \ - --hash=sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc \ - --hash=sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254 \ - --hash=sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2 \ - --hash=sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1 \ - --hash=sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810 \ - --hash=sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9 +numpy==2.0.2 \ + --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ + --hash=sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195 \ + --hash=sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951 \ + --hash=sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1 \ + --hash=sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c \ + --hash=sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc \ + --hash=sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b \ + --hash=sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd \ + --hash=sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4 \ + --hash=sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd \ + --hash=sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318 \ + --hash=sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448 \ + --hash=sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece \ + --hash=sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d \ + --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ + --hash=sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8 \ + --hash=sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57 \ + --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ + --hash=sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66 \ + --hash=sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a \ + --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ + --hash=sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c \ + --hash=sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa \ + --hash=sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d \ + --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ + --hash=sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729 \ + --hash=sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97 \ + --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ + --hash=sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9 \ + --hash=sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669 \ + --hash=sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4 \ + --hash=sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73 \ + --hash=sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385 \ + --hash=sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8 \ + --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ + --hash=sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b \ + --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ + --hash=sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15 \ + --hash=sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131 \ + --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ + --hash=sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326 \ + --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ + --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded \ + --hash=sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04 \ + --hash=sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd # via # -r requirements/requirements.in # bottleneck # numexpr # pandas -pandas==2.0.3 \ - --hash=sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682 \ - --hash=sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc \ - --hash=sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b \ - --hash=sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089 \ - --hash=sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5 \ - --hash=sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26 \ - --hash=sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210 \ - --hash=sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b \ - --hash=sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641 \ - --hash=sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd \ - --hash=sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78 \ - --hash=sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b \ - --hash=sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e \ - --hash=sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061 \ - --hash=sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0 \ - --hash=sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e \ - --hash=sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8 \ - --hash=sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d \ - --hash=sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0 \ - --hash=sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c \ - --hash=sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183 \ - --hash=sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df \ - --hash=sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8 \ - --hash=sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f \ - --hash=sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02 +pandas==2.2.3 \ + --hash=sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a \ + --hash=sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d \ + --hash=sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5 \ + --hash=sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4 \ + --hash=sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0 \ + --hash=sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32 \ + --hash=sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea \ + --hash=sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28 \ + --hash=sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f \ + --hash=sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348 \ + --hash=sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18 \ + --hash=sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468 \ + --hash=sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5 \ + --hash=sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e \ + --hash=sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667 \ + --hash=sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645 \ + --hash=sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13 \ + --hash=sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30 \ + --hash=sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3 \ + --hash=sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d \ + --hash=sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb \ + --hash=sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3 \ + --hash=sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039 \ + --hash=sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8 \ + --hash=sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd \ + --hash=sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761 \ + --hash=sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659 \ + --hash=sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57 \ + --hash=sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c \ + --hash=sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c \ + --hash=sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4 \ + --hash=sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a \ + --hash=sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9 \ + --hash=sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42 \ + --hash=sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2 \ + --hash=sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39 \ + --hash=sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc \ + --hash=sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698 \ + --hash=sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed \ + --hash=sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015 \ + --hash=sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24 \ + --hash=sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319 # via -r requirements/requirements.in python-dateutil==2.9.0.post0 \ --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ @@ -513,12 +531,14 @@ redis==3.5.3 \ # django-redis-cache # django-rq # rq -rq==1.16.2 \ - --hash=sha256:52e619f6cb469b00e04da74305045d244b75fecb2ecaa4f26422add57d3c5f09 \ - --hash=sha256:5c5b9ad5fbaf792b8fada25cc7627f4d206a9a4455aced371d4f501cc3f13b34 - # via - # -r requirements/requirements.in - # django-rq +requires==0.10.5 \ + --hash=sha256:498cc3a5ad0c2d9f149362ab0cd3e7176a0036658872e50d40f765d09af81ef3 \ + --hash=sha256:de4ed110b9d199327ea2e91fa60c00e1878cb180d75620589b11e6d519e7b5a0 + # via -r requirements/requirements.in +rq==2.0.0 \ + --hash=sha256:76d2a4a27f8fd5c4cfa200cd442efe3c1fd73525c676af06f07fcc0b81bdb70d \ + --hash=sha256:a3a767876675dcc42683bac1869494c5020ba7fcf5c026d1f6d36a8ab98573a6 + # via django-rq six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 @@ -530,7 +550,9 @@ sqlparse==0.5.1 \ typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via asgiref + # via + # asgiref + # xtyping tzdata==2024.2 \ --hash=sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc \ --hash=sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd @@ -542,3 +564,7 @@ xtract==0.1a3 \ --hash=sha256:1baac33be7494a106233e0db9de8d3ccc743635092a9b134641151c71bc322e3 \ --hash=sha256:e085b268480f2123d1f7e25411a13721e987cfa064447afdbe895949cfe2899a # via -r requirements/requirements.in +xtyping==0.8.2 \ + --hash=sha256:219d14d2782d986e86d7310e4190701e2b521f158350cf9b5afc0f0c793cb98f \ + --hash=sha256:9c80bbf5bcc9aa4ec5d5ad4b05c1778ac5312476a7169502e79f31eedbf77590 + # via requires diff --git a/requirements/test.txt b/requirements/test.txt index b364f76a..513e4048 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,11 +1,17 @@ # -# This file is autogenerated by pip-compile with Python 3.8 +# This file is autogenerated by pip-compile with Python 3.9 # by the following command: # # pip-compile --generate-hashes --output-file=requirements/test.txt requirements/test.in # --index-url https://pypi.python.org/simple/ +annotated-types==0.7.0 \ + --hash=sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53 \ + --hash=sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89 + # via + # -r requirements/requirements.txt + # xtyping asgiref==3.8.1 \ --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 \ --hash=sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590 @@ -18,69 +24,43 @@ attrs==24.2.0 \ # via # outcome # trio -backports-zoneinfo==0.2.1 \ - --hash=sha256:17746bd546106fa389c51dbea67c8b7c8f0d14b5526a579ca6ccf5ed72c526cf \ - --hash=sha256:1b13e654a55cd45672cb54ed12148cd33628f672548f373963b0bff67b217328 \ - --hash=sha256:1c5742112073a563c81f786e77514969acb58649bcdf6cdf0b4ed31a348d4546 \ - --hash=sha256:4a0f800587060bf8880f954dbef70de6c11bbe59c673c3d818921f042f9954a6 \ - --hash=sha256:5c144945a7752ca544b4b78c8c41544cdfaf9786f25fe5ffb10e838e19a27570 \ - --hash=sha256:7b0a64cda4145548fed9efc10322770f929b944ce5cee6c0dfe0c87bf4c0c8c9 \ - --hash=sha256:8439c030a11780786a2002261569bdf362264f605dfa4d65090b64b05c9f79a7 \ - --hash=sha256:8961c0f32cd0336fb8e8ead11a1f8cd99ec07145ec2931122faaac1c8f7fd987 \ - --hash=sha256:89a48c0d158a3cc3f654da4c2de1ceba85263fafb861b98b59040a5086259722 \ - --hash=sha256:a76b38c52400b762e48131494ba26be363491ac4f9a04c1b7e92483d169f6582 \ - --hash=sha256:da6013fd84a690242c310d77ddb8441a559e9cb3d3d59ebac9aca1a57b2e18bc \ - --hash=sha256:e55b384612d93be96506932a786bbcde5a2db7a9e6a4bb4bffe8b733f5b9036b \ - --hash=sha256:e81b76cace8eda1fca50e345242ba977f9be6ae3945af8d46326d776b4cf78d1 \ - --hash=sha256:e8236383a20872c0cdf5a62b554b27538db7fa1bbec52429d8d106effbaeca08 \ - --hash=sha256:f04e857b59d9d1ccc39ce2da1021d196e47234873820cbeaad210724b1ee28ac \ - --hash=sha256:fadbfe37f74051d024037f223b8e001611eac868b5c5b06144ef4d8b799862f2 - # via - # -r requirements/requirements.txt - # django -bottleneck==1.4.0 \ - --hash=sha256:03c43150f180d86a5633a6da788660d335983f6798fca306ba7f47ff27a1b7e7 \ - --hash=sha256:1490348b3bbc0225523dc2c00c6bb3e66168c537d62797bd29783c0826c09838 \ - --hash=sha256:14b3334a39308fbb05dacd35ac100842aa9e9bc70afbdcebe43e46179d183fd0 \ - --hash=sha256:1b4dac5d2a871b7bd296c2b92426daa27d5b07aa84ef2557db097d29135da4eb \ - --hash=sha256:2110af22aa8c2779faba8aa021d6b559df04449bdf21d510eacd7910934189fe \ - --hash=sha256:220b72405f77aebb0137b733b464c2526ded471e4289ac1e840bab8852759a55 \ - --hash=sha256:23834d82177d6997f21fa63156550668cd07a9a6e5a1b66ea80f1a14ac6ffd07 \ - --hash=sha256:28260197ab8a4a6b7adf810523147b1a3e85607f4e26a0f685eb9d155cfc75af \ - --hash=sha256:2861ff645d236f1a6f5c6d1ddb3db37d19af1d91057bdc4fd7b76299a15b3079 \ - --hash=sha256:2bb79a2ac135567694f13339f0bebcee96aec09c596b324b61cd7fd5e306f49d \ - --hash=sha256:381cbd1e52338fcdf9ff01c962e6aa187b2d8b3b369d42e779b6d33ac61f8d35 \ - --hash=sha256:44305c70c2a1539b0ae968e033f301ad868a6146b47e3cccd73fdfe3fc07c4ee \ - --hash=sha256:4a91e40bbb8452e77772614d882be2c34b3b514d9f15460f703293525a6e173d \ - --hash=sha256:520d7a83cd48b3f58e5df1a258acb547f8a5386a8c21ca9e1058d83a0d622fdf \ - --hash=sha256:59604949aea476f5075b965129eaa3c2d90891fd43b0dfaf2ad7621bb5db14a5 \ - --hash=sha256:5d6bf45ed58d5e7414c0011ef2da75474fe597a51970df83596b0bcb79c14c5e \ - --hash=sha256:6136ce7dcf825c432a20b80ab1c460264a437d8430fff32536176147e0b6b832 \ - --hash=sha256:6179791c0119aec3708ef74ddadab8d183e3742adb93a9028718e8696bdf572b \ - --hash=sha256:67347b0f01f32a232a6269c37afc1c079e08f6455fa12e91f4a1cd12eb0d11a5 \ - --hash=sha256:6a36280ee33d9db799163f04e88b950261e590cc71d089f5e179b21680b5d491 \ - --hash=sha256:817aa43a671ede696ea023d8f35839a391244662340cc95a0f46965dda8b35cf \ - --hash=sha256:834816c316ad184cae7ecb615b69876a42cd2cafb07ee66c57a9c1ccacb63339 \ - --hash=sha256:8746f0f727997ce4c7457dc1fec4e4e3c0fdd8803514baa3d1c4ea6515ab04b2 \ - --hash=sha256:889e6855b77345622b4ba927335d3118745d590492941f5f78554f157d259e92 \ - --hash=sha256:90d5d188a0cca0b9655ff2904ee61e7f183079e97550be98c2541a2eec358a72 \ - --hash=sha256:9903f017b9d6f2f69ce241b424ddad7265624f64dc6eafbe257d45661febf8bd \ - --hash=sha256:a704165552496cbcc8bcc5921bb679fd6fa66bb1e758888de091b1223231c9f0 \ - --hash=sha256:b1339b9ad3ee217253f246cde5c3789eb527cf9dd31ff0a1f5a8bf7fc89eadad \ - --hash=sha256:b5f72b66ccc0272de46b67346cf8490737ba2adc6a302664f5326e7741b6d5ab \ - --hash=sha256:beb36df519b8709e7d357c0c9639b03b885ca6355bbf5e53752c685de51605b8 \ - --hash=sha256:c2c92545e1bc8e859d8d137aefa3b24843bd374b17c9814dafa3bbcea9fc4ec0 \ - --hash=sha256:c6097bf39723e76ff5bba160daab92ae599df212c859db8d46648548584d04a8 \ - --hash=sha256:d53f1a72b12cfd76b56934c33bc0cb7c1a295f23a2d3ffba8c764514c9b5e0ff \ - --hash=sha256:d69907d8d679cb5091a3f479c46bf1076f149f6311ff3298bac5089b86a2fab1 \ - --hash=sha256:de17e012694e6a987bb4eb050dd7f0cf939195a8e00cb23aa93ebee5fd5e64a8 \ - --hash=sha256:e720ff24370324c84a82b1a18195274715c23181748b2b9e3dacad24198ca06f \ - --hash=sha256:ed209f8f3cb9954773764b0fa2510a7a9247ad245593187ac90bd0747771bc5c \ - --hash=sha256:eea333dbcadb780356c54f5c4fa7754f143573b57508fff43d5daf63298eb26a \ - --hash=sha256:f2749602200aaa0e12a0f3f936dd6d4035384ad10d3acf7ac4f418c501683397 \ - --hash=sha256:f63e79bfa2f82a7432c8b147ed321d01ca7769bc17cc04644286a4ce58d30549 \ - --hash=sha256:fbcdd01db9e27741fb16a02b720cf02389d4b0b99cefe3c834c7df88c2d7412d \ - --hash=sha256:ffb4e4edf7997069719b9269926cc00a2a12c6e015422d1ebc2f621c4541396a +bottleneck==1.4.2 \ + --hash=sha256:037315c56605128a39f77d19af6a6019dc8c21a63694a4bfef3c026ed963be2e \ + --hash=sha256:070d22f2f62ab81297380a89492cca931e4d9443fa4b84c2baeb52db09c3b1b4 \ + --hash=sha256:122845e3106c85465551d4a9a3777841347cfedfbebb3aa985cca110e07030b1 \ + --hash=sha256:125436df93751a226eab1732783aa8f6125e88e779587aa61be071fb66e41f9d \ + --hash=sha256:1f61658ebdf5a178298544336b65020730bf86cc092dab5f6579a99a86bd888b \ + --hash=sha256:1fc4e7645bd425c05e05acd5541e9e09cb4179e71164e862f082561bf4509eac \ + --hash=sha256:26b5f0531f7044befaad95c20365dd666372e66bdacbfaf009ff65d60285534d \ + --hash=sha256:2c9dbaf737b605b30c81611f2c1d197c2fd2e46c33f605876c1d332d3360c4fc \ + --hash=sha256:2db287f6ecdbb1c998085eca9b717fec2bfc48a4ab6ae070a9820ba8ab59c90b \ + --hash=sha256:2e2fe327dc2d0564e295a5857a252755103f8c6e05b07d3ff80a69afaa9f5065 \ + --hash=sha256:48c6b9d9287c4102b803fcb01ae66ae7ef6b310b711b4b7b7e23bf952894dc05 \ + --hash=sha256:48d2e101d99a9d72aa86da1a048d2094f4e1db0cf77519d1c33239f9d62da162 \ + --hash=sha256:4c6df9a60ec6ab88fec934ca864266ba95edd89c490af71dc9cd8afb2a54ebd9 \ + --hash=sha256:52248f3e0fead78c17912fb086a585c86f567019247d21c69e87645241b97b02 \ + --hash=sha256:6282fa925ac3768f66e3547f89a512376d3f9de7ef53bdd37aa29232fd864054 \ + --hash=sha256:6b7790ca8658cd69e3cc0d0e4ff0e9829d60849bf7945fbd7344fbce05b2bbb8 \ + --hash=sha256:72d6aa95cdd782833d2589f81434fd865ba004b8938e07920b6ef02796ce8918 \ + --hash=sha256:7363b3c8ce6ca433779cd7e96bcb94c0e516dcacadff0011adcbf0b3ac86bc9d \ + --hash=sha256:7b459d08f1f3e2da85db0a9e2d3e6e3541105f5866e9026dbca32dafc5106f2b \ + --hash=sha256:7c7d29c044a3511b36fd744503c3e697e279c273a8477a6d91a2831d04fd19e0 \ + --hash=sha256:7ebbcbe5d4062e37507b9a81e2aacdb1fcccc6193f7feff124ef2b5a6a5eb740 \ + --hash=sha256:89651ef18c06616850203bf8875c958c5d316ea48d8ba60d9b450199d39ae391 \ + --hash=sha256:964f6ac4118ddab3bbbac79d4f726b093459be751baba73ee0aa364666e8068e \ + --hash=sha256:99778329331d5fae8df19772a019e8b73ba4d9d1650f110cd995ab7657114db0 \ + --hash=sha256:9d7b12936516f944e3d981a64038f99acb21f0e99f92fad16d9a468248c2b231 \ + --hash=sha256:a74ddd0417f42eeaba37375f0fc065b28451e0fba45cb2f99e88880b10b3fa43 \ + --hash=sha256:b33e83665e7daf7f513fe1f7b04b13944d44b6635c45d5a9c89c9e5ed11811b6 \ + --hash=sha256:b6902ebf3e85315b481bc084f10c5770f8240275ad1e039ac69c7c8d2013b040 \ + --hash=sha256:c1c885ad02a6a8fa1f7ee9099f29b9d4c03eb1da2c7ab25839482d5cce739021 \ + --hash=sha256:c2fd34b9b490204f95288f0dd35d37042486a95029617246c88c0f94a0ab49fe \ + --hash=sha256:c663cbba8f52011fd82ee08c6a85c93b34b19e0e7ebba322d2d67809f34e0597 \ + --hash=sha256:dce1a3c5ff89a56fb2678c9bda17b89f60f710d6002ab7cd72b7661bc3fae64d \ + --hash=sha256:e56a206fbf48e3b8054a964398bf1ed843e9625d3c6bdbeb7898cb48bf97441b \ + --hash=sha256:e7a1b023de1de3d84b18826462718fba548fed41870df44354f9ab6a414ea82f \ + --hash=sha256:eb0c611d15b0fd8f511d288e8964e4725b4b3b0d9d310880cf0ff6b8dd03c859 \ + --hash=sha256:fa8e8e1799dea5483ce6669462660f9d9a95649f6f98a80d315b84ec89f449f4 # via -r requirements/requirements.txt certifi==2024.8.30 \ --hash=sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8 \ @@ -207,79 +187,69 @@ click==8.1.7 \ # via # -r requirements/requirements.txt # rq -coverage==7.6.1 \ - --hash=sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca \ - --hash=sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d \ - --hash=sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6 \ - --hash=sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989 \ - --hash=sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c \ - --hash=sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b \ - --hash=sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223 \ - --hash=sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f \ - --hash=sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56 \ - --hash=sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3 \ - --hash=sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8 \ - --hash=sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb \ - --hash=sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388 \ - --hash=sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0 \ - --hash=sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a \ - --hash=sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8 \ - --hash=sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f \ - --hash=sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a \ - --hash=sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962 \ - --hash=sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8 \ - --hash=sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391 \ - --hash=sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc \ - --hash=sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2 \ - --hash=sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155 \ - --hash=sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb \ - --hash=sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0 \ - --hash=sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c \ - --hash=sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a \ - --hash=sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004 \ - --hash=sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060 \ - --hash=sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232 \ - --hash=sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93 \ - --hash=sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129 \ - --hash=sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163 \ - --hash=sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de \ - --hash=sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6 \ - --hash=sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23 \ - --hash=sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569 \ - --hash=sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d \ - --hash=sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778 \ - --hash=sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d \ - --hash=sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36 \ - --hash=sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a \ - --hash=sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6 \ - --hash=sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34 \ - --hash=sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704 \ - --hash=sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106 \ - --hash=sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9 \ - --hash=sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862 \ - --hash=sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b \ - --hash=sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255 \ - --hash=sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16 \ - --hash=sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3 \ - --hash=sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133 \ - --hash=sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb \ - --hash=sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657 \ - --hash=sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d \ - --hash=sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca \ - --hash=sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36 \ - --hash=sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c \ - --hash=sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e \ - --hash=sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff \ - --hash=sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7 \ - --hash=sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5 \ - --hash=sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02 \ - --hash=sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c \ - --hash=sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df \ - --hash=sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3 \ - --hash=sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a \ - --hash=sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959 \ - --hash=sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234 \ - --hash=sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc +coverage==7.6.4 \ + --hash=sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376 \ + --hash=sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9 \ + --hash=sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111 \ + --hash=sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172 \ + --hash=sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491 \ + --hash=sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546 \ + --hash=sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2 \ + --hash=sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11 \ + --hash=sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08 \ + --hash=sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c \ + --hash=sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2 \ + --hash=sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963 \ + --hash=sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613 \ + --hash=sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0 \ + --hash=sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db \ + --hash=sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf \ + --hash=sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73 \ + --hash=sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117 \ + --hash=sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1 \ + --hash=sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e \ + --hash=sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522 \ + --hash=sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25 \ + --hash=sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc \ + --hash=sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea \ + --hash=sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52 \ + --hash=sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a \ + --hash=sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07 \ + --hash=sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06 \ + --hash=sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa \ + --hash=sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901 \ + --hash=sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b \ + --hash=sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17 \ + --hash=sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0 \ + --hash=sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21 \ + --hash=sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19 \ + --hash=sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5 \ + --hash=sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51 \ + --hash=sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3 \ + --hash=sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3 \ + --hash=sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f \ + --hash=sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076 \ + --hash=sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a \ + --hash=sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718 \ + --hash=sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba \ + --hash=sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e \ + --hash=sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27 \ + --hash=sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e \ + --hash=sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09 \ + --hash=sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e \ + --hash=sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70 \ + --hash=sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f \ + --hash=sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72 \ + --hash=sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a \ + --hash=sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef \ + --hash=sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b \ + --hash=sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b \ + --hash=sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f \ + --hash=sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806 \ + --hash=sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b \ + --hash=sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1 \ + --hash=sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c \ + --hash=sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858 # via -r requirements/test.in csvvalidator==1.2 \ --hash=sha256:f1f222993589f9d8f8d83088d0bf80475462e5fa848baf920d0c03c03690c37e @@ -311,9 +281,9 @@ django-js-asset==2.2.0 \ # via # -r requirements/requirements.txt # django-mptt -django-mptt==0.14.0 \ - --hash=sha256:2c92a2b1614c53086278795ccf50580cf1f9b8564f3ff03055dd62bab5987711 \ - --hash=sha256:d9a87433ab0e4f35247c6f6d5a93ace6990860a4ba8796f815d185f773b9acfc +django-mptt==0.16.0 \ + --hash=sha256:56c9606bf0b329b5f5afd55dd8bfd073612ea1d5999b10903b09de62bee84c8e \ + --hash=sha256:8716849ba3318d94e2e100ed0923a05c1ffdf8195f8472b690dbaf737d2af3b5 # via -r requirements/requirements.txt django-redis-cache==3.0.1 \ --hash=sha256:a7fbef101a053d2e430bd3befe6a87e6e730f98e335b516f25f30b17d9fe66e3 @@ -322,9 +292,9 @@ django-registration-redux==2.13 \ --hash=sha256:547c86ad9b951cf743075b5486f304e51e450b45d04e5ef04392838a9cff3da8 \ --hash=sha256:9793a05b32b1d7342c6ef3e0140b2951b7dbde058b3ba6e8a232b534928279f9 # via -r requirements/requirements.txt -django-rq==2.10.2 \ - --hash=sha256:5fe340e071c141a23ea0859df73c48b0a3df33a851835b2a8f8c4fca7a8b1849 \ - --hash=sha256:d1690b6a409934a0ea23c208ccb00d69477899f8edc61106ce5395c19dcdfb1e +django-rq==3.0.0 \ + --hash=sha256:7bdadb85d9909c118cf1ee1b9bdd1a74ebf141bf8f3c2de2409fcac6080f67ac \ + --hash=sha256:bd2ef287a28301f64c4282293648e4f8c6076dd895a545c9c6b98bde4a82a4ce # via -r requirements/requirements.txt easyprocess==1.1 \ --hash=sha256:82eed523a0a5eb12a81fa4eacd9f342caeb3f900eb4b798740e6696ad07e63f9 \ @@ -340,6 +310,12 @@ exceptiongroup==1.2.2 \ # via # trio # trio-websocket +funkify==0.4.5 \ + --hash=sha256:42df845f4afa63e0e66239a986d26b6572ab0b7ad600d7d6365d44d8a0cff3d5 \ + --hash=sha256:43f1e6c27263468a60ba560dfc13e6e4df57aa75376438a62f741ffc7c83cdfe + # via + # -r requirements/requirements.txt + # requires h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 @@ -598,33 +574,34 @@ mss==9.0.2 \ --hash=sha256:685fa442cc96d8d88b4eb7aadbcccca7b858e789c9259b603e1ef0e435b60425 \ --hash=sha256:c96a4ec73224da7db22bc07ef3cfaa18f8b86900d1872e29113bbcef0093a21e # via pyscreenshot -mysql-connector-python==8.4.0 \ - --hash=sha256:085024bf12d15f9b428938fdbeb50bd9b15dda9c4d3a474e6df061cb08713e6a \ - --hash=sha256:276bae0d5d44abb7ba1205003b55628e4e6f1d399f1825d518bc607320997b1f \ - --hash=sha256:2b5c6fea6513cf208c7116a4a5e36b3ae54e0d37f324a7cfe43fb01cfdf03be6 \ - --hash=sha256:35939c4ff28f395a5550bae67bafa4d1658ea72ea3206f457fff64a0fbec17e4 \ - --hash=sha256:3ae951f2e16d089975cb9f05b3f3e58807dc33a2e5a627047bba1c8ad5439d82 \ - --hash=sha256:42542d131d63c78416d410fdc9e84b9acb960d715c2e7b28c57ac9577c6d8165 \ - --hash=sha256:427a84027b8314c73f5ff3eb1abdc709a8201b44a491d7b580bdf430b4820a16 \ - --hash=sha256:44a99d44a925ea29c2e423e6d8b1d97ce740c3078d8b41923a81bbcd0a821972 \ - --hash=sha256:4e83fc8ed95005b171ffa36a289dac48625048263b09b56718e8395539ea07d9 \ - --hash=sha256:651c7824af57eb50f4a79ea04bf6f453b24381e1bb56eee45c0035b4c0c624c0 \ - --hash=sha256:655dccbdc0e2943e62cf69e10a024329248b17b58bfac59c60fd2103db3ba0b0 \ - --hash=sha256:74b1759d8bd9ccd4296dc2e5abe22ec7efbd1ad12a9032c2cb4d17fa5d0ca6e0 \ - --hash=sha256:76c13fde35a038afe50550a9af7b31b28ca3a04cce06f3030980afb20460d28c \ - --hash=sha256:a6d24ea29b3c2bdbba6861590de557665420bfb938f74b5cecc630bac5457d35 \ - --hash=sha256:accf10425c6af39a9595a47e7119ebcbcd7351f7df28755dbee01bca5a605b7c \ - --hash=sha256:aed505adc76b58282c76e6cbf3da195be0f84029a41f05c470be977481896074 \ - --hash=sha256:af40b5bdd91547d3dbf5fa62bde37e9e840bd7cba3b9246b55c09e6a1cde536f \ - --hash=sha256:b7876358d9e51f25edc492088c4ce16cd14c2db87c279a965b0f9c327723359c \ - --hash=sha256:bb4f3edab78f3fd6f80c6c0a9e5a533704044fc01bfb9e8736e1a993f74aa42d \ - --hash=sha256:c0a2688d95d53cfbea9352ed61926b47bc9042570570fb8fe0a8d19b1e20f1c4 \ - --hash=sha256:cd89d1c8c2d1e33e5ac2d4eac5813422c150a8427fb60a16c59be18c29dd9a94 \ - --hash=sha256:cda868bb4e1641362d148f5b0d2a86188cffa2f7188831589781b13f2df6f51a \ - --hash=sha256:d343a4a8133ae9561bd537fc8cdbcab74a0607a5f40698569010fa3c7d4a048f \ - --hash=sha256:e549674c72b596a7386f4a76bbac2ee9581f6632e6713618a70468713b162964 \ - --hash=sha256:e6d5a418ef124dd1b18a73fd89431a1862ce7bf68f61275c7d006e8e2f8afcd2 \ - --hash=sha256:ed276c4e7907da0ad95a9ad122004294d6fb425127064af2ae880033b8e72166 +mysql-connector-python==9.1.0 \ + --hash=sha256:109e17a4ada1442e3881a51e2bbabcb336ad229a619ac61e9ad24bd6b9b117bd \ + --hash=sha256:25e261f3260ec798c48cb910862a299e565548a1b5421dec84315ddbc9ef28c4 \ + --hash=sha256:28fd99ee464ac3b02d1e2a71a63ca4f25c6110e4414a46a5b64631e6d2096899 \ + --hash=sha256:30a8f0ba84f8adf15a4877e80b3f97f786ce35616d918b9310578a2bd22952d5 \ + --hash=sha256:346261a2aeb743a39cf66ba8bde5e45931d313b76ce0946a69a6d1187ec7d279 \ + --hash=sha256:4f102452c64332b7e042fa37b84d4f15332bd639e479d15035f2a005fb9fbb34 \ + --hash=sha256:6d7d5d458d0d600bbbebd9f2bce551e386b359bcce6026f7369b57922d26f13a \ + --hash=sha256:72dcce5f2e4f5910d65f02eb318c1e4622464da007a3ae5e9ccd64169d8efac3 \ + --hash=sha256:7b2eb48518b8c2bc9636883d264b291e5c93824fc6b61823ca9cf396a09474ad \ + --hash=sha256:7d99c0a841a2c2a0e4d5b28376c1bfac794ec3821b66eb6fa2f7702cec820ee8 \ + --hash=sha256:948ef0c7da87901176d4320e0f40a3277ee06fe6f58ce151c1e60d8d50fdeaf4 \ + --hash=sha256:9b23a8e2acee91b5120febe00c53e7f472b9b6d49618e39fa1af86cdc1f0ade8 \ + --hash=sha256:abf16fc1155ebeba5558e5702dd7210d634ac8da484eca05a640b68a548dc7cf \ + --hash=sha256:aceaab679b852c0a2ec0eed9eb2a490171b3493484f1881b605cbf2f9c5fde6d \ + --hash=sha256:c350b1aaf257b1b778f44b8bfaeda07751f55e150f5a7464342f36e4aac8e805 \ + --hash=sha256:c36a9b9ebf9587aaa5d7928468fefe8faf6fc993a03cb242bb160ede9cf75b2d \ + --hash=sha256:c75f674a52b8820c90d466183b2bb59f89bcf09d17ebe9b391313d89565c8896 \ + --hash=sha256:d627ebafc0327b935d8783454e7a4b5c32324ed39a2a1589239490ab850bf7d7 \ + --hash=sha256:dacf1aa84dc7dd8ae908626c3ae50fce956d0105130c7465fd248a4f035d50b1 \ + --hash=sha256:dcdcf380d07b9ca6f18a95e9516a6185f2ab31a53d290d5e698e77e59c043c9e \ + --hash=sha256:e15153cb8ab5fcec00b99077de536489d22d4809fc28f633850398fef0560b1f \ + --hash=sha256:e26a08a9500407fa8f4a6504f7077d1312bec4fa52cb0a58c1ad324ca1f3eeaa \ + --hash=sha256:e2f0876e1efd76e05853cb0a623dba2746ee70686c043019d811737dd5c3d871 \ + --hash=sha256:e75ecb3df2c2cbe4d92d5dd58a318fa708edebc0fa2d850fc2a9d42481dbb808 \ + --hash=sha256:ec4386b2426bfb07f83455bf895d8a7e2d6c067343ac05be5511083ca2424991 \ + --hash=sha256:f67b22e3eaf5b03ffac97232d3dd67b56abcacad907ad4391c847bad5ba58f0e \ + --hash=sha256:fec943d333851c4b5e57cd0b04dde36e6817f0d4d62b2a58ce028a82be444866 # via -r requirements/requirements.txt mysqlclient==2.2.5 \ --hash=sha256:1d2e2ca0fe8405d8d6464edd01bf059951279e4bc27284d39341bd4737b2bc64 \ @@ -636,67 +613,83 @@ mysqlclient==2.2.5 \ --hash=sha256:b78438314199504c64f69e1e3521f2c9b419f19fcd85158b44c997b64409a6af \ --hash=sha256:e871ede4261d0d42b8ed20a2459db411c7deafedd8e77b7e4ba760be4a6a752b # via -r requirements/requirements.txt -numexpr==2.8.6 \ - --hash=sha256:15469dc722b5ceb92324ec8635411355ebc702303db901ae8cc87f47c5e3a124 \ - --hash=sha256:18b1804923cfa3be7bbb45187d01c0540c8f6df4928c22a0f786e15568e9ebc5 \ - --hash=sha256:1967c16f61c27df1cdc43ba3c0ba30346157048dd420b4259832276144d0f64e \ - --hash=sha256:211804ec25a9f6d188eadf4198dd1a92b2f61d7d20993c6c7706139bc4199c5b \ - --hash=sha256:27782177a0081bd0aab229be5d37674e7f0ab4264ef576697323dd047432a4cd \ - --hash=sha256:31cf610c952eec57081171f0b4427f9bed2395ec70ec432bbf45d260c5c0cdeb \ - --hash=sha256:38b8b90967026bbc36c7aa6e8ca3b8906e1990914fd21f446e2a043f4ee3bc06 \ - --hash=sha256:47b45da5aa25600081a649f5e8b2aa640e35db3703f4631f34bb1f2f86d1b5b4 \ - --hash=sha256:6336f8dba3f456e41a4ffc3c97eb63d89c73589ff6e1707141224b930263260d \ - --hash=sha256:681812e2e71ff1ba9145fac42d03f51ddf6ba911259aa83041323f68e7458002 \ - --hash=sha256:6d7003497d82ef19458dce380b36a99343b96a3bd5773465c2d898bf8f5a38f9 \ - --hash=sha256:6e884687da8af5955dc9beb6a12d469675c90b8fb38b6c93668c989cfc2cd982 \ - --hash=sha256:80acbfefb68bd92e708e09f0a02b29e04d388b9ae72f9fcd57988aca172a7833 \ - --hash=sha256:84979bf14143351c2db8d9dd7fef8aca027c66ad9df9cb5e75c93bf5f7b5a338 \ - --hash=sha256:8564186aad5a2c88d597ebc79b8171b52fd33e9b085013e1ff2208f7e4b387e3 \ - --hash=sha256:8e3e6f1588d6c03877cb3b3dcc3096482da9d330013b886b29cb9586af5af3eb \ - --hash=sha256:95b9da613761e4fc79748535b2a1f58cada22500e22713ae7d9571fa88d1c2e2 \ - --hash=sha256:95c09e814b0d6549de98b5ded7cdf7d954d934bb6b505432ff82e83a6d330bda \ - --hash=sha256:9ef7e8aaa84fce3aba2e65f243d14a9f8cc92aafd5d90d67283815febfe43eeb \ - --hash=sha256:aa0f661f5f4872fd7350cc9895f5d2594794b2a7e7f1961649a351724c64acc9 \ - --hash=sha256:b5f96c89aa0b1f13685ec32fa3d71028db0b5981bfd99a0bbc271035949136b3 \ - --hash=sha256:c48221b6a85494a7be5a022899764e58259af585dff031cecab337277278cc93 \ - --hash=sha256:c8f37f7a6af3bdd61f2efd1cafcc083a9525ab0aaf5dc641e7ec8fc0ae2d3aa1 \ - --hash=sha256:d126938c2c3784673c9c58d94e00b1570aa65517d9c33662234d442fc9fb5795 \ - --hash=sha256:d36528a33aa9c23743b3ea686e57526a4f71e7128a1be66210e1511b09c4e4e9 \ - --hash=sha256:d6a88d71c166e86b98d34701285d23e3e89d548d9f5ae3f4b60919ac7151949f \ - --hash=sha256:dee04d72307c09599f786b9231acffb10df7d7a74b2ce3681d74a574880d13ce \ - --hash=sha256:e640bc0eaf1b59f3dde52bc02bbfda98e62f9950202b0584deba28baf9f36bbb \ - --hash=sha256:e93d64cd20940b726477c3cb64926e683d31b778a1e18f9079a5088fd0d8e7c8 \ - --hash=sha256:ef6e8896457a60a539cb6ba27da78315a9bb31edb246829b25b5b0304bfcee91 +numexpr==2.10.1 \ + --hash=sha256:00204e5853713b5eba5f3d0bc586a5d8d07f76011b597c8b4087592cc2ec2928 \ + --hash=sha256:22cc65e9121aeb3187a2b50827715b2b087ea70e8ab21416ea52662322087b43 \ + --hash=sha256:300e577b3c006dd7a8270f1bb2e8a00ee15bf235b1650fe2a6febec2954bc2c3 \ + --hash=sha256:368a1972c3186355160f6ee330a7eea146d8443da75a38a30083289ae251ef5a \ + --hash=sha256:37598cca41f8f50dc889b0b72be1616a288758c16ab7d48c9ac8719e1a39d835 \ + --hash=sha256:44f6d12a8c44be90199bbb10d3abf467f88951f48a3d1fbbd3c219d121f39c9d \ + --hash=sha256:45f598182b4f5c153222e47d5163c3bee8d5ebcaee7e56dd2a5898d4d97e4473 \ + --hash=sha256:4f0985bd1c493b23b5aad7d81fa174798f3812efb78d14844194834c9fee38b8 \ + --hash=sha256:552c8d4b2e3b87cdb2abb40a781b9a61a9090a9f66ac7357fc5a0b93aff76be3 \ + --hash=sha256:56648a04679063175681195670ad53e5c8ca19668166ed13875199b5600089c7 \ + --hash=sha256:5a4db4456e0779d5e024220b7b6a7477ac900679bfa74836b06fa526aaed4e3c \ + --hash=sha256:6a50370bea77ba94c3734a44781c716751354c6bfda2d369af3aed3d67d42871 \ + --hash=sha256:78b14c19c403df7498954468385768c86b0d2c52ad03dffb74e45d44ae5a9c77 \ + --hash=sha256:82bf04a1495ac475de4ab49fbe0a3a2710ed3fd1a00bc03847316b5d7602402d \ + --hash=sha256:82fc95c301b15ff4823f98989ee363a2d5555d16a7cfd3710e98ddee726eaaaa \ + --hash=sha256:926dd426c68f1d927412a2ad843831c1eb9a95871e7bb0bd8b20d547c12238d2 \ + --hash=sha256:9bba99d354a65f1a008ab8b87f07d84404c668e66bab624df5b6b5373403cf81 \ + --hash=sha256:a3c0b0bf165b2d886eb981afa4e77873ca076f5d51c491c4d7b8fc10f17c876f \ + --hash=sha256:ac23a72eff10f928f23b147bdeb0f1b774e862abe332fc9bf4837e9f1bc0bbf9 \ + --hash=sha256:b28eaf45f1cc1048aad9e90e3a8ada1aef58c5f8155a85267dc781b37998c046 \ + --hash=sha256:b2efa499f460124538a5b4f1bf2e77b28eb443ee244cc5573ed0f6a069ebc635 \ + --hash=sha256:bbd35f17f6efc00ebd4a480192af1ee30996094a0d5343b131b0e90e61e8b554 \ + --hash=sha256:ca8ae46481d0b0689ca0d00a8670bc464ce375e349599fe674a6d4957e7b7eb6 \ + --hash=sha256:cbf79fef834f88607f977ab9867061dcd9b40ccb08bb28547c6dc6c73e560895 \ + --hash=sha256:ce04ae6efe2a9d0be1a0e114115c3ae70c68b8b8fbc615c5c55c15704b01e6a4 \ + --hash=sha256:fa4009d84a8e6e21790e718a80a22d57fe7f215283576ef2adc4183f7247f3c7 \ + --hash=sha256:fb704620657a1c99d64933e8a982148d8bfb2b738a1943e107a2bfdee887ce56 \ + --hash=sha256:fcbf013bb8494e8ef1d11fa3457827c1571c6a3153982d709e5d17594999d4dd \ + --hash=sha256:fecdf4bf3c1250e56583db0a4a80382a259ba4c2e1efa13e04ed43f0938071f5 # via -r requirements/requirements.txt -numpy==1.24.4 \ - --hash=sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f \ - --hash=sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61 \ - --hash=sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7 \ - --hash=sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400 \ - --hash=sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef \ - --hash=sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2 \ - --hash=sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d \ - --hash=sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc \ - --hash=sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835 \ - --hash=sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706 \ - --hash=sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5 \ - --hash=sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4 \ - --hash=sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6 \ - --hash=sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463 \ - --hash=sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a \ - --hash=sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f \ - --hash=sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e \ - --hash=sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e \ - --hash=sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694 \ - --hash=sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8 \ - --hash=sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64 \ - --hash=sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d \ - --hash=sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc \ - --hash=sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254 \ - --hash=sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2 \ - --hash=sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1 \ - --hash=sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810 \ - --hash=sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9 +numpy==2.0.2 \ + --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ + --hash=sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195 \ + --hash=sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951 \ + --hash=sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1 \ + --hash=sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c \ + --hash=sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc \ + --hash=sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b \ + --hash=sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd \ + --hash=sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4 \ + --hash=sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd \ + --hash=sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318 \ + --hash=sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448 \ + --hash=sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece \ + --hash=sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d \ + --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ + --hash=sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8 \ + --hash=sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57 \ + --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ + --hash=sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66 \ + --hash=sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a \ + --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ + --hash=sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c \ + --hash=sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa \ + --hash=sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d \ + --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ + --hash=sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729 \ + --hash=sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97 \ + --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ + --hash=sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9 \ + --hash=sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669 \ + --hash=sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4 \ + --hash=sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73 \ + --hash=sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385 \ + --hash=sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8 \ + --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ + --hash=sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b \ + --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ + --hash=sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15 \ + --hash=sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131 \ + --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ + --hash=sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326 \ + --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ + --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded \ + --hash=sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04 \ + --hash=sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd # via # -r requirements/requirements.txt # bottleneck @@ -706,32 +699,49 @@ outcome==1.3.0.post0 \ --hash=sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8 \ --hash=sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b # via trio -pandas==2.0.3 \ - --hash=sha256:04dbdbaf2e4d46ca8da896e1805bc04eb85caa9a82e259e8eed00254d5e0c682 \ - --hash=sha256:1168574b036cd8b93abc746171c9b4f1b83467438a5e45909fed645cf8692dbc \ - --hash=sha256:1994c789bf12a7c5098277fb43836ce090f1073858c10f9220998ac74f37c69b \ - --hash=sha256:258d3624b3ae734490e4d63c430256e716f488c4fcb7c8e9bde2d3aa46c29089 \ - --hash=sha256:32fca2ee1b0d93dd71d979726b12b61faa06aeb93cf77468776287f41ff8fdc5 \ - --hash=sha256:37673e3bdf1551b95bf5d4ce372b37770f9529743d2498032439371fc7b7eb26 \ - --hash=sha256:3ef285093b4fe5058eefd756100a367f27029913760773c8bf1d2d8bebe5d210 \ - --hash=sha256:5247fb1ba347c1261cbbf0fcfba4a3121fbb4029d95d9ef4dc45406620b25c8b \ - --hash=sha256:5ec591c48e29226bcbb316e0c1e9423622bc7a4eaf1ef7c3c9fa1a3981f89641 \ - --hash=sha256:694888a81198786f0e164ee3a581df7d505024fbb1f15202fc7db88a71d84ebd \ - --hash=sha256:69d7f3884c95da3a31ef82b7618af5710dba95bb885ffab339aad925c3e8ce78 \ - --hash=sha256:6a21ab5c89dcbd57f78d0ae16630b090eec626360085a4148693def5452d8a6b \ - --hash=sha256:81af086f4543c9d8bb128328b5d32e9986e0c84d3ee673a2ac6fb57fd14f755e \ - --hash=sha256:9e4da0d45e7f34c069fe4d522359df7d23badf83abc1d1cef398895822d11061 \ - --hash=sha256:9eae3dc34fa1aa7772dd3fc60270d13ced7346fcbcfee017d3132ec625e23bb0 \ - --hash=sha256:9ee1a69328d5c36c98d8e74db06f4ad518a1840e8ccb94a4ba86920986bb617e \ - --hash=sha256:b084b91d8d66ab19f5bb3256cbd5ea661848338301940e17f4492b2ce0801fe8 \ - --hash=sha256:b9cb1e14fdb546396b7e1b923ffaeeac24e4cedd14266c3497216dd4448e4f2d \ - --hash=sha256:ba619e410a21d8c387a1ea6e8a0e49bb42216474436245718d7f2e88a2f8d7c0 \ - --hash=sha256:c02f372a88e0d17f36d3093a644c73cfc1788e876a7c4bcb4020a77512e2043c \ - --hash=sha256:ce0c6f76a0f1ba361551f3e6dceaff06bde7514a374aa43e33b588ec10420183 \ - --hash=sha256:d9cd88488cceb7635aebb84809d087468eb33551097d600c6dad13602029c2df \ - --hash=sha256:e4c7c9f27a4185304c7caf96dc7d91bc60bc162221152de697c98eb0b2648dd8 \ - --hash=sha256:f167beed68918d62bffb6ec64f2e1d8a7d297a038f86d4aed056b9493fca407f \ - --hash=sha256:f3421a7afb1a43f7e38e82e844e2bca9a6d793d66c1a7f9f0ff39a795bbc5e02 +pandas==2.2.3 \ + --hash=sha256:062309c1b9ea12a50e8ce661145c6aab431b1e99530d3cd60640e255778bd43a \ + --hash=sha256:15c0e1e02e93116177d29ff83e8b1619c93ddc9c49083f237d4312337a61165d \ + --hash=sha256:1948ddde24197a0f7add2bdc4ca83bf2b1ef84a1bc8ccffd95eda17fd836ecb5 \ + --hash=sha256:1db71525a1538b30142094edb9adc10be3f3e176748cd7acc2240c2f2e5aa3a4 \ + --hash=sha256:22a9d949bfc9a502d320aa04e5d02feab689d61da4e7764b62c30b991c42c5f0 \ + --hash=sha256:29401dbfa9ad77319367d36940cd8a0b3a11aba16063e39632d98b0e931ddf32 \ + --hash=sha256:31d0ced62d4ea3e231a9f228366919a5ea0b07440d9d4dac345376fd8e1477ea \ + --hash=sha256:3508d914817e153ad359d7e069d752cdd736a247c322d932eb89e6bc84217f28 \ + --hash=sha256:37e0aced3e8f539eccf2e099f65cdb9c8aa85109b0be6e93e2baff94264bdc6f \ + --hash=sha256:381175499d3802cde0eabbaf6324cce0c4f5d52ca6f8c377c29ad442f50f6348 \ + --hash=sha256:38cf8125c40dae9d5acc10fa66af8ea6fdf760b2714ee482ca691fc66e6fcb18 \ + --hash=sha256:3b71f27954685ee685317063bf13c7709a7ba74fc996b84fc6821c59b0f06468 \ + --hash=sha256:3fc6873a41186404dad67245896a6e440baacc92f5b716ccd1bc9ed2995ab2c5 \ + --hash=sha256:4850ba03528b6dd51d6c5d273c46f183f39a9baf3f0143e566b89450965b105e \ + --hash=sha256:4f18ba62b61d7e192368b84517265a99b4d7ee8912f8708660fb4a366cc82667 \ + --hash=sha256:56534ce0746a58afaf7942ba4863e0ef81c9c50d3f0ae93e9497d6a41a057645 \ + --hash=sha256:59ef3764d0fe818125a5097d2ae867ca3fa64df032331b7e0917cf5d7bf66b13 \ + --hash=sha256:5dbca4c1acd72e8eeef4753eeca07de9b1db4f398669d5994086f788a5d7cc30 \ + --hash=sha256:5de54125a92bb4d1c051c0659e6fcb75256bf799a732a87184e5ea503965bce3 \ + --hash=sha256:61c5ad4043f791b61dd4752191d9f07f0ae412515d59ba8f005832a532f8736d \ + --hash=sha256:6374c452ff3ec675a8f46fd9ab25c4ad0ba590b71cf0656f8b6daa5202bca3fb \ + --hash=sha256:63cc132e40a2e084cf01adf0775b15ac515ba905d7dcca47e9a251819c575ef3 \ + --hash=sha256:66108071e1b935240e74525006034333f98bcdb87ea116de573a6a0dccb6c039 \ + --hash=sha256:6dfcb5ee8d4d50c06a51c2fffa6cff6272098ad6540aed1a76d15fb9318194d8 \ + --hash=sha256:7c2875855b0ff77b2a64a0365e24455d9990730d6431b9e0ee18ad8acee13dbd \ + --hash=sha256:7eee9e7cea6adf3e3d24e304ac6b8300646e2a5d1cd3a3c2abed9101b0846761 \ + --hash=sha256:800250ecdadb6d9c78eae4990da62743b857b470883fa27f652db8bdde7f6659 \ + --hash=sha256:86976a1c5b25ae3f8ccae3a5306e443569ee3c3faf444dfd0f41cda24667ad57 \ + --hash=sha256:8cd6d7cc958a3910f934ea8dbdf17b2364827bb4dafc38ce6eef6bb3d65ff09c \ + --hash=sha256:99df71520d25fade9db7c1076ac94eb994f4d2673ef2aa2e86ee039b6746d20c \ + --hash=sha256:a5a1595fe639f5988ba6a8e5bc9649af3baf26df3998a0abe56c02609392e0a4 \ + --hash=sha256:ad5b65698ab28ed8d7f18790a0dc58005c7629f227be9ecc1072aa74c0c1d43a \ + --hash=sha256:b1d432e8d08679a40e2a6d8b2f9770a5c21793a6f9f47fdd52c5ce1948a5a8a9 \ + --hash=sha256:b8661b0238a69d7aafe156b7fa86c44b881387509653fdf857bebc5e4008ad42 \ + --hash=sha256:ba96630bc17c875161df3818780af30e43be9b166ce51c9a18c1feae342906c2 \ + --hash=sha256:bc6b93f9b966093cb0fd62ff1a7e4c09e6d546ad7c1de191767baffc57628f39 \ + --hash=sha256:c124333816c3a9b03fbeef3a9f230ba9a737e9e5bb4060aa2107a86cc0a497fc \ + --hash=sha256:cd8d0c3be0515c12fed0bdbae072551c8b54b7192c7b1fda0ba56059a0179698 \ + --hash=sha256:d9c45366def9a3dd85a6454c0e7908f2b3b8e9c138f5dc38fed7ce720d8453ed \ + --hash=sha256:f00d1345d84d8c86a63e476bb4955e46458b304b9575dcf71102b5c705320015 \ + --hash=sha256:f3a255b2c19987fbbe62a9dfd6cff7ff2aa9ccab3fc75218fd4b7530f01efa24 \ + --hash=sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319 # via -r requirements/requirements.txt pyscreenshot==3.1 \ --hash=sha256:73d406d41a0977125bdfd2f6488f0caf1394e84d1d4c1065d5e8b1400b307096 \ @@ -776,15 +786,19 @@ requests==2.32.3 \ --hash=sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760 \ --hash=sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6 # via -r requirements/test.in -rq==1.16.2 \ - --hash=sha256:52e619f6cb469b00e04da74305045d244b75fecb2ecaa4f26422add57d3c5f09 \ - --hash=sha256:5c5b9ad5fbaf792b8fada25cc7627f4d206a9a4455aced371d4f501cc3f13b34 +requires==0.10.5 \ + --hash=sha256:498cc3a5ad0c2d9f149362ab0cd3e7176a0036658872e50d40f765d09af81ef3 \ + --hash=sha256:de4ed110b9d199327ea2e91fa60c00e1878cb180d75620589b11e6d519e7b5a0 + # via -r requirements/requirements.txt +rq==2.0.0 \ + --hash=sha256:76d2a4a27f8fd5c4cfa200cd442efe3c1fd73525c676af06f07fcc0b81bdb70d \ + --hash=sha256:a3a767876675dcc42683bac1869494c5020ba7fcf5c026d1f6d36a8ab98573a6 # via # -r requirements/requirements.txt # django-rq -selenium==4.25.0 \ - --hash=sha256:3798d2d12b4a570bc5790163ba57fef10b2afee958bf1d80f2a3cf07c4141f33 \ - --hash=sha256:95d08d3b82fb353f3c474895154516604c7f0e6a9a565ae6498ef36c9bac6921 +selenium==4.26.0 \ + --hash=sha256:48013f36e812de5b3948ef53d04e73f77bc923ee3e1d7d99eaf0618179081b99 \ + --hash=sha256:f0780f85f10310aa5d085b81e79d73d3c93b83d8de121d0400d543a50ee963e8 # via -r requirements/test.in six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ @@ -823,6 +837,7 @@ typing-extensions==4.12.2 \ # -r requirements/requirements.txt # asgiref # selenium + # xtyping tzdata==2024.2 \ --hash=sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc \ --hash=sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd @@ -851,3 +866,9 @@ xtract==0.1a3 \ --hash=sha256:1baac33be7494a106233e0db9de8d3ccc743635092a9b134641151c71bc322e3 \ --hash=sha256:e085b268480f2123d1f7e25411a13721e987cfa064447afdbe895949cfe2899a # via -r requirements/requirements.txt +xtyping==0.8.2 \ + --hash=sha256:219d14d2782d986e86d7310e4190701e2b521f158350cf9b5afc0f0c793cb98f \ + --hash=sha256:9c80bbf5bcc9aa4ec5d5ad4b05c1778ac5312476a7169502e79f31eedbf77590 + # via + # -r requirements/requirements.txt + # requires diff --git a/sample.env b/sample.env new file mode 100644 index 00000000..2d51b30d --- /dev/null +++ b/sample.env @@ -0,0 +1,10 @@ +# RHEL django image +RHEL_ORG_ID= +RHEL_ACTIVATION_KEY= + +# Django app +DJANGO_HOST=0.0.0.0 +DJANGO_PORT=59066 + +# MySQL db image +MYSQL_ROOT_PASSWORD= \ No newline at end of file From 60384e867a96e80cb20fbd99fc8f7c83832c67a4 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Sun, 3 Nov 2024 01:27:48 +0000 Subject: [PATCH 08/38] Update Python version in probe test --- browser/probe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/probe.py b/browser/probe.py index 3eb3ebcd..80cfbbbd 100644 --- a/browser/probe.py +++ b/browser/probe.py @@ -99,7 +99,7 @@ def probe_email(self): return True def python_version(self): - if sys.version_info.major == 3 and sys.version_info.minor == 8: + if sys.version_info.major == 3 and sys.version_info.minor == 9: return True else: return False From 6a568f651fb7d03b71389b91be3caf40b0e21abe Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Mon, 4 Nov 2024 15:45:05 +0000 Subject: [PATCH 09/38] Bug fix typo in debug messages --- browser/validators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/validators.py b/browser/validators.py index eacfc89a..a60f87ae 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -26,7 +26,7 @@ def __call__(self, value): try: mime = mimetypes.guess_type(value.temporary_file_path()) logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) - logger.error("DEBUG: mime %s" % mime) + logger.error("DEBUG: mime %s" % mime[0]) if mime[0] not in self.mimetypes: raise ValidationError('%s is not an acceptable file type. Please use a %s formatted file instead.' % (value, ' or '.join(self.mimetypes))) except AttributeError as e: From 99bb858253afdf058d8428b06d755d4b8f33e589 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Mon, 4 Nov 2024 15:51:58 +0000 Subject: [PATCH 10/38] Bug fix location protocol required by change in redis connector --- temmpo/settings/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/temmpo/settings/base.py b/temmpo/settings/base.py index dcb83477..65ccc8bd 100644 --- a/temmpo/settings/base.py +++ b/temmpo/settings/base.py @@ -234,7 +234,7 @@ CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.redis.RedisCache', - 'LOCATION': '127.0.0.1:6379', + 'LOCATION': 'redis://127.0.0.1:6379', 'OPTIONS': { 'DB': 1, # 'PARSER_CLASS': 'redis.connection.HiredisParser', From c3f82dfa5f0de444f5bf1d631ce96ebaea7ea9a0 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Mon, 4 Nov 2024 16:19:20 +0000 Subject: [PATCH 11/38] Bug fix settings required with change in redis connector package --- temmpo/settings/base.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/temmpo/settings/base.py b/temmpo/settings/base.py index 65ccc8bd..c7a498f8 100644 --- a/temmpo/settings/base.py +++ b/temmpo/settings/base.py @@ -233,13 +233,11 @@ CACHES = { 'default': { - 'BACKEND': 'django.core.cache.backends.redis.RedisCache', - 'LOCATION': 'redis://127.0.0.1:6379', + 'BACKEND': 'django_redis.cache.RedisCache', + 'LOCATION': 'redis://127.0.0.1:6379/1', 'OPTIONS': { - 'DB': 1, - # 'PARSER_CLASS': 'redis.connection.HiredisParser', + 'CLIENT_CLASS': 'django_redis.client.DefaultClient', 'PARSER_CLASS': 'redis.connection._HiredisParser', - # NB: if using version 5 of redis-py, use "redis.connection._HiredisParser" for the PARSER_CLASS due to an internal rename of classes within that package. }, }, } From ddc4bd5fe6f10bc09a05f6081017338b7dde469b Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Mon, 4 Nov 2024 16:42:21 +0000 Subject: [PATCH 12/38] Fix deprecation warning --- browser/probe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/probe.py b/browser/probe.py index 80cfbbbd..a088d09f 100644 --- a/browser/probe.py +++ b/browser/probe.py @@ -57,7 +57,7 @@ def check(self, components, label='', function=None, max_duration=5, allow_fail= success = function() end = time.time() if end - start > max_duration: - logger.warn( + logger.warning( "Check timestamp exceeded for '%s' (%s took longer than %s)" % (label, end - start, max_duration)) except Exception as e: end = time.time() From 4a75d2ad1e033be94dec06291d331266b9c2cf68 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Mon, 4 Nov 2024 16:48:14 +0000 Subject: [PATCH 13/38] Attempt to resolve issue with detecting mimetypes of compressed files --- browser/fields.py | 2 +- browser/validators.py | 2 +- tests/test_clamav.py | 2 +- tests/test_uploads.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/browser/fields.py b/browser/fields.py index eedcd9d7..0feaebf2 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -24,7 +24,7 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) - mime_type = mimetypes.guess_type(value.temporary_file_path()) + mime_type = mimetypes.guess_type(value.temporary_file_path(), strict=False) if mime_type[0] in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: extracted_file_path = xtract(value.temporary_file_path()) diff --git a/browser/validators.py b/browser/validators.py index a60f87ae..b803e645 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -24,7 +24,7 @@ def __init__(self, mimetypes): def __call__(self, value): try: - mime = mimetypes.guess_type(value.temporary_file_path()) + mime = mimetypes.guess_type(value.temporary_file_path(), strict=False) logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) logger.error("DEBUG: mime %s" % mime[0]) if mime[0] not in self.mimetypes: diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 062b0c4f..671f19e1 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -45,7 +45,7 @@ def _assert_file_upload(self, url, file_path): self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = mimetypes.guess_type(uploaded_file_path) + mime_type = mimetypes.guess_type(uploaded_file_path, strict=False) self.assertEqual(mime_type[0], "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): diff --git a/tests/test_uploads.py b/tests/test_uploads.py index a8a6428c..598a1db6 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -112,7 +112,7 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = mimetypes.guess_type(uploaded_file_path) + mime_type = mimetypes.guess_type(uploaded_file_path, strict=False) self.assertEqual(mime_type[0], "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From ee307d187e5a81556d11065c655ff6fa6a15170b Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 01:06:23 +0000 Subject: [PATCH 14/38] Refactor determining mime types --- browser/fields.py | 6 +++--- browser/validators.py | 8 ++++---- requirements/dev.txt | 4 ++++ requirements/requirements.in | 1 + requirements/requirements.txt | 4 ++++ requirements/test.txt | 4 ++++ tests/test_clamav.py | 6 +++--- tests/test_uploads.py | 6 +++--- 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/browser/fields.py b/browser/fields.py index 0feaebf2..0a120410 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -1,5 +1,5 @@ import logging -import mimetypes +import filetype import os from xtract import xtract @@ -24,8 +24,8 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) - mime_type = mimetypes.guess_type(value.temporary_file_path(), strict=False) - if mime_type[0] in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): + mime_type = filetype.guess(value.temporary_file_path()).mime + if mime_type in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: extracted_file_path = xtract(value.temporary_file_path()) return self._create_upload_file_from_path(extracted_file_path) diff --git a/browser/validators.py b/browser/validators.py index b803e645..039df5dd 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- import logging -import mimetypes +import filetype import re from django.core.exceptions import ValidationError @@ -24,10 +24,10 @@ def __init__(self, mimetypes): def __call__(self, value): try: - mime = mimetypes.guess_type(value.temporary_file_path(), strict=False) + mime = filetype.guess(value.temporary_file_path()).mime logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) - logger.error("DEBUG: mime %s" % mime[0]) - if mime[0] not in self.mimetypes: + logger.error("DEBUG: mime %s" % mime) + if mime not in self.mimetypes: raise ValidationError('%s is not an acceptable file type. Please use a %s formatted file instead.' % (value, ' or '.join(self.mimetypes))) except AttributeError as e: logger.debug("AttributeError") diff --git a/requirements/dev.txt b/requirements/dev.txt index 9e67e2cb..aa62f1aa 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -343,6 +343,10 @@ executing==2.1.0 \ --hash=sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf \ --hash=sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab # via stack-data +filetype==1.2.0 \ + --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ + --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 + # via -r /srv/requirements/test.txt h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 diff --git a/requirements/requirements.in b/requirements/requirements.in index ada7adc3..d5ad7de7 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -9,6 +9,7 @@ django-rq>=2.7.0 django-autocomplete-light>=3.9.4 Django<4.3 django-hcaptcha-field>=1.4.0 +filetype>=1.2.0 hiredis>=2.2.2 lxml>=4.9.2 more-itertools>=9.1.0 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 18711d74..8e20961e 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -102,6 +102,10 @@ django-rq==3.0.0 \ --hash=sha256:7bdadb85d9909c118cf1ee1b9bdd1a74ebf141bf8f3c2de2409fcac6080f67ac \ --hash=sha256:bd2ef287a28301f64c4282293648e4f8c6076dd895a545c9c6b98bde4a82a4ce # via -r requirements/requirements.in +filetype==1.2.0 \ + --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ + --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 + # via -r requirements/requirements.in hiredis==3.0.0 \ --hash=sha256:00018f22f38530768b73ea86c11f47e8d4df65facd4e562bd78773bd1baef35e \ --hash=sha256:034925b5fb514f7b11aac38cd55b3fd7e9d3af23bd6497f3f20aa5b8ba58e232 \ diff --git a/requirements/test.txt b/requirements/test.txt index fec820ff..e91e1718 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -312,6 +312,10 @@ exceptiongroup==1.2.2 \ # via # trio # trio-websocket +filetype==1.2.0 \ + --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ + --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 + # via -r /srv/requirements/requirements.txt h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 671f19e1..b61b1f34 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -5,7 +5,7 @@ from time import sleep from unittest import skip -import mimetypes +import filetype import requests from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By @@ -45,8 +45,8 @@ def _assert_file_upload(self, url, file_path): self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = mimetypes.guess_type(uploaded_file_path, strict=False) - self.assertEqual(mime_type[0], "text/plain") + mime_type = filetype.guess(uploaded_file_path).mime + self.assertEqual(mime_type, "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): file_path = BASE_DIR + "/test_virus_file" diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 598a1db6..c918b1c2 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import logging import os -import mimetypes +import filetype from django.urls import reverse from django.test import tag @@ -112,8 +112,8 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = mimetypes.guess_type(uploaded_file_path, strict=False) - self.assertEqual(mime_type[0], "text/plain") + mime_type = filetype.guess(uploaded_file_path).mime + self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): self._assert_file_is_uploaded_and_extracted_where_required(TEST_BZ_PUB_MED_ARCHIVE, reverse('search_pubmed')) From 32abee5ef4e492b49a27d43d9dc84da01cbcedca Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 01:34:22 +0000 Subject: [PATCH 15/38] Add fallback for detecting mime types --- browser/fields.py | 7 ++++++- browser/validators.py | 7 ++++++- tests/test_clamav.py | 7 ++++++- tests/test_uploads.py | 7 ++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/browser/fields.py b/browser/fields.py index 0a120410..6dfe7eb5 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -1,5 +1,6 @@ import logging import filetype +import mimetypes import os from xtract import xtract @@ -24,7 +25,11 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) - mime_type = filetype.guess(value.temporary_file_path()).mime + mime_type = filetype.guess(value.temporary_file_path()) + if mime_type == None: + mime_type, encoding = mimetypes.guess_type(value.temporary_file_path()) + else: + mime_type = mime_type.mime if mime_type in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: extracted_file_path = xtract(value.temporary_file_path()) diff --git a/browser/validators.py b/browser/validators.py index 039df5dd..f27ff5ab 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import logging import filetype +import mimetypes import re from django.core.exceptions import ValidationError @@ -24,7 +25,11 @@ def __init__(self, mimetypes): def __call__(self, value): try: - mime = filetype.guess(value.temporary_file_path()).mime + mime = filetype.guess(value.temporary_file_path()) + if mime == None: + mime, encoding = mimetypes.guess_type(value.temporary_file_path()) + else: + mime = mime.mime logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) logger.error("DEBUG: mime %s" % mime) if mime not in self.mimetypes: diff --git a/tests/test_clamav.py b/tests/test_clamav.py index b61b1f34..5965eebe 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from datetime import datetime import logging +import mimetypes import os from time import sleep from unittest import skip @@ -45,7 +46,11 @@ def _assert_file_upload(self, url, file_path): self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = filetype.guess(uploaded_file_path).mime + mime_type = filetype.guess(uploaded_file_path) + if mime_type == None: + mime_type, encoding = mimetypes.guess_type(uploaded_file_path) + else: + mime_type = mime_type.mime self.assertEqual(mime_type, "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): diff --git a/tests/test_uploads.py b/tests/test_uploads.py index c918b1c2..1eb978db 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -2,6 +2,7 @@ import logging import os import filetype +import mimetypes from django.urls import reverse from django.test import tag @@ -112,7 +113,11 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = filetype.guess(uploaded_file_path).mime + mime_type = filetype.guess(uploaded_file_path) + if mime_type == None: + mime_type, encoding = mimetypes.guess_type(self.path) + else: + mime_type = mime_type.mime self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From e147b71d6ecb5ec2cbc8a7d7b9674109a6fdd580 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 13:25:29 +0000 Subject: [PATCH 16/38] Attempt to upgrade to Python 3.12 - WIP known issue re mimetype detection --- deploy/Dockerfile | 2 +- deploy/Dockerfile-rhel | 10 +-- deploy/deploy-rhel.sh | 8 +-- deploy/fabfile.py | 6 +- requirements/dev.txt | 126 ++++++++++++++++------------------ requirements/requirements.txt | 112 +++++++++++++++--------------- requirements/test.txt | 121 ++++++++++++++++---------------- tests/build-test-env.sh | 4 +- 8 files changed, 190 insertions(+), 199 deletions(-) diff --git a/deploy/Dockerfile b/deploy/Dockerfile index 1bee500e..27c8717d 100644 --- a/deploy/Dockerfile +++ b/deploy/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9.20-slim +FROM python:3.12.7-slim ENV PYTHONDONTWRITEBYTECODE=1 ENV PYTHONUNBUFFERED=1 diff --git a/deploy/Dockerfile-rhel b/deploy/Dockerfile-rhel index a5ce0ef0..5a027405 100644 --- a/deploy/Dockerfile-rhel +++ b/deploy/Dockerfile-rhel @@ -38,11 +38,11 @@ RUN yum update -y && \ pkg-config \ mariadb-connector-c-devel \ perl-DBD-MySQL \ - python39 \ - python39-devel \ - python39-lxml \ - python39-setuptools \ - python39-wheel \ + python312 \ + python312-devel \ + python312-lxml \ + python312-setuptools \ + python312-wheel \ zip ENV PIP_VERSION='24.3.1' diff --git a/deploy/deploy-rhel.sh b/deploy/deploy-rhel.sh index 38ee762d..9379a6a5 100644 --- a/deploy/deploy-rhel.sh +++ b/deploy/deploy-rhel.sh @@ -61,7 +61,7 @@ setsebool -P httpd_can_network_connect 1 setsebool -P httpd_can_network_connect_db 1 setsebool -P httpd_can_sendmail 1 -echo "### Install Python 3.9 and components" +echo "### Install Python 3.12 and components" yum -y install gcc gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel cd /opt @@ -71,7 +71,7 @@ cd Python-3.9.20/ ./configure --enable-optimizations --enable-shared make altinstall # Create symlinks -ln -sfn /usr/local/bin/python3.9 /usr/bin/python3.9 +ln -sfn /usr/local/bin/python3.12 /usr/bin/python3.12 ln -sfn /usr/local/bin/pip3.9 /usr/bin/pip3.9 echo "export LD_LIBRARY_PATH=/usr/local/lib/" > ld_library.sh @@ -83,7 +83,7 @@ pip3.9 install -U pip==19.3.1 # As per app servers pip3.9 install Fabric==1.15.0 # NB: v1.15.0 supports Python 2, & 3.6, 3.7, & 3.8 pip3.9 install mod_wsgi==4.9.4 # As per app servers -ls /usr/local/lib64/python3.9/site-packages/mod_wsgi/server/ +ls /usr/local/lib64/python3.12/site-packages/mod_wsgi/server/ pip3.9 install virtualenv==20.24.5 # As per app servers ln -s /usr/local/bin/virtualenv /usr/bin/virtualenv-3.9 @@ -252,7 +252,7 @@ fi ## TODO: Fix path to mod_wsgi module echo "### Add basic catch all Apache config normally managed by Puppet" cat > /etc/httpd/conf.d/temmpo.conf < diff --git a/deploy/fabfile.py b/deploy/fabfile.py index e34e1e2d..4b1dac10 100644 --- a/deploy/fabfile.py +++ b/deploy/fabfile.py @@ -82,7 +82,7 @@ def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch= stop_rqworker_service(use_local_mode) with change_dir(project_dir + 'lib/'): - caller('%s --python python3.9 %s' % (virtualenv, env)) + caller('%s --python python3.12 %s' % (virtualenv, env)) # Verify Python version in use caller('%s/bin/python3 -V' % env) @@ -172,7 +172,7 @@ def deploy(env="dev", branch="master", using_apache=True, migrate_db=True, use_l with change_dir(venv_dir): # Remove any python dependency pyc files - caller('rm -f `find lib/python3.9/site-packages/ -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') + caller('rm -f `find lib/python3.12/site-packages/ -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') # Ensure pip3 and setup tools is up to expected version for existing environments. caller('./bin/pip3 cache purge') @@ -290,7 +290,7 @@ def setup_apache(env="dev", use_local_mode=False, project_dir=PROJECT_ROOT): if env == "dev": # Set up SE Linux contexts for dev environments, puppet configured for VMs caller('chcon -R -t httpd_sys_content_t %s' % static_dir) # Only needs to be readable - caller('chcon -R -t httpd_sys_script_exec_t %slib/python3.9/' % venv_dir) + caller('chcon -R -t httpd_sys_script_exec_t %slib/python3.12/' % venv_dir) caller('chcon -R -t httpd_sys_script_exec_t %s' % src_dir) # caller('chcon -R -t httpd_sys_script_exec_t %s.settings' % PROJECT_ROOT) caller('chcon -R -t httpd_sys_rw_content_t %slog/django.log' % var_dir) diff --git a/requirements/dev.txt b/requirements/dev.txt index aa62f1aa..a9e2062d 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --generate-hashes --output-file=requirements/dev.txt requirements/dev.in @@ -16,12 +16,6 @@ asttokens==2.4.1 \ --hash=sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24 \ --hash=sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0 # via stack-data -async-timeout==5.0.0 \ - --hash=sha256:49675ec889daacfe65ff66d2dde7dd1447a6f4b2f23721022e4ba121f8772a85 \ - --hash=sha256:904719a4bd6e0520047d0ddae220aabee67b877f7ca17bf8cea20f67f6247ae0 - # via - # -r /srv/requirements/test.txt - # redis attrs==24.2.0 \ --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 @@ -331,14 +325,6 @@ entrypoint2==1.1 \ # via # -r /srv/requirements/test.txt # pyscreenshot -exceptiongroup==1.2.2 \ - --hash=sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b \ - --hash=sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc - # via - # -r /srv/requirements/test.txt - # ipython - # trio - # trio-websocket executing==2.1.0 \ --hash=sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf \ --hash=sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab @@ -456,9 +442,9 @@ idna==3.10 \ # -r /srv/requirements/test.txt # requests # trio -ipython==8.18.1 \ - --hash=sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27 \ - --hash=sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397 +ipython==8.29.0 \ + --hash=sha256:0188a1bd83267192123ccea7f4a8ed0a78910535dbaa3f37671dca76ebd429c8 \ + --hash=sha256:40b60e15b22591450eef73e40a027cf77bd652e757523eebc5bd7c7c498290eb # via -r requirements/dev.in jedi==0.19.1 \ --hash=sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd \ @@ -694,52 +680,62 @@ numexpr==2.10.1 \ --hash=sha256:fcbf013bb8494e8ef1d11fa3457827c1571c6a3153982d709e5d17594999d4dd \ --hash=sha256:fecdf4bf3c1250e56583db0a4a80382a259ba4c2e1efa13e04ed43f0938071f5 # via -r /srv/requirements/test.txt -numpy==2.0.2 \ - --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ - --hash=sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195 \ - --hash=sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951 \ - --hash=sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1 \ - --hash=sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c \ - --hash=sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc \ - --hash=sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b \ - --hash=sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd \ - --hash=sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4 \ - --hash=sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd \ - --hash=sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318 \ - --hash=sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448 \ - --hash=sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece \ - --hash=sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d \ - --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ - --hash=sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8 \ - --hash=sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57 \ - --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ - --hash=sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66 \ - --hash=sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a \ - --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ - --hash=sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c \ - --hash=sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa \ - --hash=sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d \ - --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ - --hash=sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729 \ - --hash=sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97 \ - --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ - --hash=sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9 \ - --hash=sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669 \ - --hash=sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4 \ - --hash=sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73 \ - --hash=sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385 \ - --hash=sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8 \ - --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ - --hash=sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b \ - --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ - --hash=sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15 \ - --hash=sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131 \ - --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ - --hash=sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326 \ - --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ - --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded \ - --hash=sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04 \ - --hash=sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd +numpy==2.1.3 \ + --hash=sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe \ + --hash=sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0 \ + --hash=sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48 \ + --hash=sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a \ + --hash=sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564 \ + --hash=sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958 \ + --hash=sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17 \ + --hash=sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0 \ + --hash=sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee \ + --hash=sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b \ + --hash=sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4 \ + --hash=sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4 \ + --hash=sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6 \ + --hash=sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4 \ + --hash=sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d \ + --hash=sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f \ + --hash=sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f \ + --hash=sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f \ + --hash=sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56 \ + --hash=sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9 \ + --hash=sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd \ + --hash=sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23 \ + --hash=sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed \ + --hash=sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a \ + --hash=sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098 \ + --hash=sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1 \ + --hash=sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512 \ + --hash=sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f \ + --hash=sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09 \ + --hash=sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f \ + --hash=sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc \ + --hash=sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8 \ + --hash=sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0 \ + --hash=sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761 \ + --hash=sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef \ + --hash=sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5 \ + --hash=sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e \ + --hash=sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b \ + --hash=sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d \ + --hash=sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43 \ + --hash=sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c \ + --hash=sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41 \ + --hash=sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff \ + --hash=sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408 \ + --hash=sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2 \ + --hash=sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9 \ + --hash=sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57 \ + --hash=sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb \ + --hash=sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9 \ + --hash=sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3 \ + --hash=sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a \ + --hash=sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0 \ + --hash=sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e \ + --hash=sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598 \ + --hash=sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4 # via # -r /srv/requirements/test.txt # bottleneck @@ -936,8 +932,6 @@ typing-extensions==4.12.2 \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 # via # -r /srv/requirements/test.txt - # asgiref - # ipython # selenium tzdata==2024.2 \ --hash=sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc \ diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 8e20961e..d679b4b5 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --generate-hashes --output-file=requirements/requirements.txt requirements/requirements.in @@ -10,10 +10,6 @@ asgiref==3.8.1 \ --hash=sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47 \ --hash=sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590 # via django -async-timeout==5.0.0 \ - --hash=sha256:49675ec889daacfe65ff66d2dde7dd1447a6f4b2f23721022e4ba121f8772a85 \ - --hash=sha256:904719a4bd6e0520047d0ddae220aabee67b877f7ca17bf8cea20f67f6247ae0 - # via redis bottleneck==1.4.2 \ --hash=sha256:037315c56605128a39f77d19af6a6019dc8c21a63694a4bfef3c026ed963be2e \ --hash=sha256:070d22f2f62ab81297380a89492cca931e4d9443fa4b84c2baeb52db09c3b1b4 \ @@ -416,52 +412,62 @@ numexpr==2.10.1 \ --hash=sha256:fcbf013bb8494e8ef1d11fa3457827c1571c6a3153982d709e5d17594999d4dd \ --hash=sha256:fecdf4bf3c1250e56583db0a4a80382a259ba4c2e1efa13e04ed43f0938071f5 # via -r requirements/requirements.in -numpy==2.0.2 \ - --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ - --hash=sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195 \ - --hash=sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951 \ - --hash=sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1 \ - --hash=sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c \ - --hash=sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc \ - --hash=sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b \ - --hash=sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd \ - --hash=sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4 \ - --hash=sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd \ - --hash=sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318 \ - --hash=sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448 \ - --hash=sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece \ - --hash=sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d \ - --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ - --hash=sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8 \ - --hash=sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57 \ - --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ - --hash=sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66 \ - --hash=sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a \ - --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ - --hash=sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c \ - --hash=sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa \ - --hash=sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d \ - --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ - --hash=sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729 \ - --hash=sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97 \ - --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ - --hash=sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9 \ - --hash=sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669 \ - --hash=sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4 \ - --hash=sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73 \ - --hash=sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385 \ - --hash=sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8 \ - --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ - --hash=sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b \ - --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ - --hash=sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15 \ - --hash=sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131 \ - --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ - --hash=sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326 \ - --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ - --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded \ - --hash=sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04 \ - --hash=sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd +numpy==2.1.3 \ + --hash=sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe \ + --hash=sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0 \ + --hash=sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48 \ + --hash=sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a \ + --hash=sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564 \ + --hash=sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958 \ + --hash=sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17 \ + --hash=sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0 \ + --hash=sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee \ + --hash=sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b \ + --hash=sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4 \ + --hash=sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4 \ + --hash=sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6 \ + --hash=sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4 \ + --hash=sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d \ + --hash=sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f \ + --hash=sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f \ + --hash=sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f \ + --hash=sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56 \ + --hash=sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9 \ + --hash=sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd \ + --hash=sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23 \ + --hash=sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed \ + --hash=sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a \ + --hash=sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098 \ + --hash=sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1 \ + --hash=sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512 \ + --hash=sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f \ + --hash=sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09 \ + --hash=sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f \ + --hash=sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc \ + --hash=sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8 \ + --hash=sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0 \ + --hash=sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761 \ + --hash=sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef \ + --hash=sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5 \ + --hash=sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e \ + --hash=sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b \ + --hash=sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d \ + --hash=sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43 \ + --hash=sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c \ + --hash=sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41 \ + --hash=sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff \ + --hash=sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408 \ + --hash=sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2 \ + --hash=sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9 \ + --hash=sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57 \ + --hash=sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb \ + --hash=sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9 \ + --hash=sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3 \ + --hash=sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a \ + --hash=sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0 \ + --hash=sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e \ + --hash=sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598 \ + --hash=sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4 # via # -r requirements/requirements.in # bottleneck @@ -545,10 +551,6 @@ sqlparse==0.5.1 \ --hash=sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4 \ --hash=sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e # via django -typing-extensions==4.12.2 \ - --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ - --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via asgiref tzdata==2024.2 \ --hash=sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc \ --hash=sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd diff --git a/requirements/test.txt b/requirements/test.txt index e91e1718..6dd77d59 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.9 +# This file is autogenerated by pip-compile with Python 3.12 # by the following command: # # pip-compile --generate-hashes --output-file=requirements/test.txt requirements/test.in @@ -12,12 +12,6 @@ asgiref==3.8.1 \ # via # -r /srv/requirements/requirements.txt # django -async-timeout==5.0.0 \ - --hash=sha256:49675ec889daacfe65ff66d2dde7dd1447a6f4b2f23721022e4ba121f8772a85 \ - --hash=sha256:904719a4bd6e0520047d0ddae220aabee67b877f7ca17bf8cea20f67f6247ae0 - # via - # -r /srv/requirements/requirements.txt - # redis attrs==24.2.0 \ --hash=sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346 \ --hash=sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2 @@ -306,12 +300,6 @@ entrypoint2==1.1 \ --hash=sha256:eeb8c327bdb65cdd1668c023a6b110b7e3d1a046fb05e043861ebd9264b3a257 \ --hash=sha256:fc0b7fe7b21acdab47a585ab9407ca7e5c4f96cb6888575db6b0ceb91f0e105a # via pyscreenshot -exceptiongroup==1.2.2 \ - --hash=sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b \ - --hash=sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc - # via - # trio - # trio-websocket filetype==1.2.0 \ --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 @@ -644,52 +632,62 @@ numexpr==2.10.1 \ --hash=sha256:fcbf013bb8494e8ef1d11fa3457827c1571c6a3153982d709e5d17594999d4dd \ --hash=sha256:fecdf4bf3c1250e56583db0a4a80382a259ba4c2e1efa13e04ed43f0938071f5 # via -r /srv/requirements/requirements.txt -numpy==2.0.2 \ - --hash=sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a \ - --hash=sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195 \ - --hash=sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951 \ - --hash=sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1 \ - --hash=sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c \ - --hash=sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc \ - --hash=sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b \ - --hash=sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd \ - --hash=sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4 \ - --hash=sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd \ - --hash=sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318 \ - --hash=sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448 \ - --hash=sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece \ - --hash=sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d \ - --hash=sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5 \ - --hash=sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8 \ - --hash=sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57 \ - --hash=sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78 \ - --hash=sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66 \ - --hash=sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a \ - --hash=sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e \ - --hash=sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c \ - --hash=sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa \ - --hash=sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d \ - --hash=sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c \ - --hash=sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729 \ - --hash=sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97 \ - --hash=sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c \ - --hash=sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9 \ - --hash=sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669 \ - --hash=sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4 \ - --hash=sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73 \ - --hash=sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385 \ - --hash=sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8 \ - --hash=sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c \ - --hash=sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b \ - --hash=sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692 \ - --hash=sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15 \ - --hash=sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131 \ - --hash=sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a \ - --hash=sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326 \ - --hash=sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b \ - --hash=sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded \ - --hash=sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04 \ - --hash=sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd +numpy==2.1.3 \ + --hash=sha256:016d0f6f5e77b0f0d45d77387ffa4bb89816b57c835580c3ce8e099ef830befe \ + --hash=sha256:02135ade8b8a84011cbb67dc44e07c58f28575cf9ecf8ab304e51c05528c19f0 \ + --hash=sha256:08788d27a5fd867a663f6fc753fd7c3ad7e92747efc73c53bca2f19f8bc06f48 \ + --hash=sha256:0d30c543f02e84e92c4b1f415b7c6b5326cbe45ee7882b6b77db7195fb971e3a \ + --hash=sha256:0fa14563cc46422e99daef53d725d0c326e99e468a9320a240affffe87852564 \ + --hash=sha256:13138eadd4f4da03074851a698ffa7e405f41a0845a6b1ad135b81596e4e9958 \ + --hash=sha256:14e253bd43fc6b37af4921b10f6add6925878a42a0c5fe83daee390bca80bc17 \ + --hash=sha256:15cb89f39fa6d0bdfb600ea24b250e5f1a3df23f901f51c8debaa6a5d122b2f0 \ + --hash=sha256:17ee83a1f4fef3c94d16dc1802b998668b5419362c8a4f4e8a491de1b41cc3ee \ + --hash=sha256:2312b2aa89e1f43ecea6da6ea9a810d06aae08321609d8dc0d0eda6d946a541b \ + --hash=sha256:2564fbdf2b99b3f815f2107c1bbc93e2de8ee655a69c261363a1172a79a257d4 \ + --hash=sha256:3522b0dfe983a575e6a9ab3a4a4dfe156c3e428468ff08ce582b9bb6bd1d71d4 \ + --hash=sha256:4394bc0dbd074b7f9b52024832d16e019decebf86caf909d94f6b3f77a8ee3b6 \ + --hash=sha256:45966d859916ad02b779706bb43b954281db43e185015df6eb3323120188f9e4 \ + --hash=sha256:4d1167c53b93f1f5d8a139a742b3c6f4d429b54e74e6b57d0eff40045187b15d \ + --hash=sha256:4f2015dfe437dfebbfce7c85c7b53d81ba49e71ba7eadbf1df40c915af75979f \ + --hash=sha256:50ca6aba6e163363f132b5c101ba078b8cbd3fa92c7865fd7d4d62d9779ac29f \ + --hash=sha256:50d18c4358a0a8a53f12a8ba9d772ab2d460321e6a93d6064fc22443d189853f \ + --hash=sha256:5641516794ca9e5f8a4d17bb45446998c6554704d888f86df9b200e66bdcce56 \ + --hash=sha256:576a1c1d25e9e02ed7fa5477f30a127fe56debd53b8d2c89d5578f9857d03ca9 \ + --hash=sha256:6a4825252fcc430a182ac4dee5a505053d262c807f8a924603d411f6718b88fd \ + --hash=sha256:72dcc4a35a8515d83e76b58fdf8113a5c969ccd505c8a946759b24e3182d1f23 \ + --hash=sha256:747641635d3d44bcb380d950679462fae44f54b131be347d5ec2bce47d3df9ed \ + --hash=sha256:762479be47a4863e261a840e8e01608d124ee1361e48b96916f38b119cfda04a \ + --hash=sha256:78574ac2d1a4a02421f25da9559850d59457bac82f2b8d7a44fe83a64f770098 \ + --hash=sha256:825656d0743699c529c5943554d223c021ff0494ff1442152ce887ef4f7561a1 \ + --hash=sha256:8637dcd2caa676e475503d1f8fdb327bc495554e10838019651b76d17b98e512 \ + --hash=sha256:96fe52fcdb9345b7cd82ecd34547fca4321f7656d500eca497eb7ea5a926692f \ + --hash=sha256:973faafebaae4c0aaa1a1ca1ce02434554d67e628b8d805e61f874b84e136b09 \ + --hash=sha256:996bb9399059c5b82f76b53ff8bb686069c05acc94656bb259b1d63d04a9506f \ + --hash=sha256:a38c19106902bb19351b83802531fea19dee18e5b37b36454f27f11ff956f7fc \ + --hash=sha256:a6b46587b14b888e95e4a24d7b13ae91fa22386c199ee7b418f449032b2fa3b8 \ + --hash=sha256:a9f7f672a3388133335589cfca93ed468509cb7b93ba3105fce780d04a6576a0 \ + --hash=sha256:aa08e04e08aaf974d4458def539dece0d28146d866a39da5639596f4921fd761 \ + --hash=sha256:b0df3635b9c8ef48bd3be5f862cf71b0a4716fa0e702155c45067c6b711ddcef \ + --hash=sha256:b47fbb433d3260adcd51eb54f92a2ffbc90a4595f8970ee00e064c644ac788f5 \ + --hash=sha256:baed7e8d7481bfe0874b566850cb0b85243e982388b7b23348c6db2ee2b2ae8e \ + --hash=sha256:bc6f24b3d1ecc1eebfbf5d6051faa49af40b03be1aaa781ebdadcbc090b4539b \ + --hash=sha256:c006b607a865b07cd981ccb218a04fc86b600411d83d6fc261357f1c0966755d \ + --hash=sha256:c181ba05ce8299c7aa3125c27b9c2167bca4a4445b7ce73d5febc411ca692e43 \ + --hash=sha256:c7662f0e3673fe4e832fe07b65c50342ea27d989f92c80355658c7f888fcc83c \ + --hash=sha256:c80e4a09b3d95b4e1cac08643f1152fa71a0a821a2d4277334c88d54b2219a41 \ + --hash=sha256:c894b4305373b9c5576d7a12b473702afdf48ce5369c074ba304cc5ad8730dff \ + --hash=sha256:d7aac50327da5d208db2eec22eb11e491e3fe13d22653dce51b0f4109101b408 \ + --hash=sha256:d89dd2b6da69c4fff5e39c28a382199ddedc3a5be5390115608345dec660b9e2 \ + --hash=sha256:d9beb777a78c331580705326d2367488d5bc473b49a9bc3036c154832520aca9 \ + --hash=sha256:dc258a761a16daa791081d026f0ed4399b582712e6fc887a95af09df10c5ca57 \ + --hash=sha256:e14e26956e6f1696070788252dcdff11b4aca4c3e8bd166e0df1bb8f315a67cb \ + --hash=sha256:e6988e90fcf617da2b5c78902fe8e668361b43b4fe26dbf2d7b0f8034d4cafb9 \ + --hash=sha256:e711e02f49e176a01d0349d82cb5f05ba4db7d5e7e0defd026328e5cfb3226d3 \ + --hash=sha256:ea4dedd6e394a9c180b33c2c872b92f7ce0f8e7ad93e9585312b0c5a04777a4a \ + --hash=sha256:ecc76a9ba2911d8d37ac01de72834d8849e55473457558e12995f4cd53e778e0 \ + --hash=sha256:f55ba01150f52b1027829b50d70ef1dafd9821ea82905b63936668403c3b471e \ + --hash=sha256:f653490b33e9c3a4c1c01d41bc2aef08f9475af51146e4a7710c450cf9761598 \ + --hash=sha256:fa2d1337dc61c8dc417fbccf20f6d1e139896a30721b7f1e832b2bb6ef4eb6c4 # via # -r /srv/requirements/requirements.txt # bottleneck @@ -829,10 +827,7 @@ trio-websocket==0.11.1 \ typing-extensions==4.12.2 \ --hash=sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d \ --hash=sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8 - # via - # -r /srv/requirements/requirements.txt - # asgiref - # selenium + # via selenium tzdata==2024.2 \ --hash=sha256:7d85cc416e9382e69095b7bdf4afd9e3880418a2413feec7069d533d6b4e31cc \ --hash=sha256:a48093786cdcde33cad18c2555e8532f34422074448fbc874186f0abd79565cd diff --git a/tests/build-test-env.sh b/tests/build-test-env.sh index 8783a0bf..c56bff1a 100644 --- a/tests/build-test-env.sh +++ b/tests/build-test-env.sh @@ -36,9 +36,9 @@ pip3 install virtualenv==20.26.3 # NB: Version 15.1.0 is installed on RHEL echo "Install wheel" sudo apt-get install -y python3-wheel-whl -echo "Check aliases for python3.9" +echo "Check aliases for python3.12" which python3 -which python3.9 +which python3.12 echo "Ensure Firefox is installed" which firefox From 0a83e40c1d59819f29e839836e8ac6d83ad04ac9 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 13:32:59 +0000 Subject: [PATCH 17/38] Attempt to upgrade to Python 3.12 - WIP known issue re mimetype detection --- .github/workflows/check-python-dependcies.yml | 2 +- .github/workflows/run-django-test.yml | 2 +- .github/workflows/run-fabric-test.yml | 4 ++++ deploy/deploy-centos.sh | 6 +++--- deploy/deploy-rhel.sh | 20 +++++++++---------- deploy/fabfile.py | 2 +- 6 files changed, 20 insertions(+), 16 deletions(-) diff --git a/.github/workflows/check-python-dependcies.yml b/.github/workflows/check-python-dependcies.yml index 69826b1d..30b32394 100644 --- a/.github/workflows/check-python-dependcies.yml +++ b/.github/workflows/check-python-dependcies.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.12' architecture: 'x64' - name: Run checks for package updates run: bash tests/run-update-checks.sh diff --git a/.github/workflows/run-django-test.yml b/.github/workflows/run-django-test.yml index 569b9317..ebab6943 100644 --- a/.github/workflows/run-django-test.yml +++ b/.github/workflows/run-django-test.yml @@ -27,7 +27,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: - python-version: '3.9' + python-version: '3.12' architecture: 'x64' - name: Run Python 3/Django tests run: bash tests/run-django-tests.sh diff --git a/.github/workflows/run-fabric-test.yml b/.github/workflows/run-fabric-test.yml index f36ba434..81585ed8 100644 --- a/.github/workflows/run-fabric-test.yml +++ b/.github/workflows/run-fabric-test.yml @@ -14,5 +14,9 @@ jobs: runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + architecture: 'x64' - name: Syntax check Python 3 Fabric deployment script run: bash tests/run-fabric-tests.sh diff --git a/deploy/deploy-centos.sh b/deploy/deploy-centos.sh index 266d117d..aa3f8d1a 100644 --- a/deploy/deploy-centos.sh +++ b/deploy/deploy-centos.sh @@ -46,9 +46,9 @@ echo "### Install Python 3.8 and components" yum -y install gcc gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel cd /opt -wget https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz -tar -xzf Python-3.9.20.tgz -cd Python-3.9.20/ +wget https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz +tar -xzf Python-3.12.7.tgz +cd Python-3.12.7/ ./configure --enable-optimizations --enable-shared make altinstall # Create symlinks diff --git a/deploy/deploy-rhel.sh b/deploy/deploy-rhel.sh index 9379a6a5..004d2acf 100644 --- a/deploy/deploy-rhel.sh +++ b/deploy/deploy-rhel.sh @@ -65,28 +65,28 @@ echo "### Install Python 3.12 and components" yum -y install gcc gcc-c++ openssl-devel bzip2-devel libffi-devel zlib-devel cd /opt -wget https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz -tar -xzf Python-3.9.20.tgz -cd Python-3.9.20/ +wget https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz +tar -xzf Python-3.12.7.tgz +cd Python-3.12.7/ ./configure --enable-optimizations --enable-shared make altinstall # Create symlinks ln -sfn /usr/local/bin/python3.12 /usr/bin/python3.12 -ln -sfn /usr/local/bin/pip3.9 /usr/bin/pip3.9 +ln -sfn /usr/local/bin/pip3.12 /usr/bin/pip3.12 echo "export LD_LIBRARY_PATH=/usr/local/lib/" > ld_library.sh mv ld_library.sh /etc/profile.d/ld_library.sh export set LD_LIBRARY_PATH=/usr/local/lib/ # Install symtem wide python requirements -pip3.9 install -U pip==19.3.1 # As per app servers -pip3.9 install Fabric==1.15.0 # NB: v1.15.0 supports Python 2, & 3.6, 3.7, & 3.8 +pip3.12 install -U pip==19.3.1 # As per app servers +pip3.12 install Fabric==1.15.0 # NB: v1.15.0 supports Python 2, & 3.6, 3.7, & 3.8 -pip3.9 install mod_wsgi==4.9.4 # As per app servers +pip3.12 install mod_wsgi==4.9.4 # As per app servers ls /usr/local/lib64/python3.12/site-packages/mod_wsgi/server/ -pip3.9 install virtualenv==20.24.5 # As per app servers +pip3.12 install virtualenv==20.24.5 # As per app servers -ln -s /usr/local/bin/virtualenv /usr/bin/virtualenv-3.9 +ln -s /usr/local/bin/virtualenv /usr/bin/virtualenv-3.12 yum -y install python3-pip-wheel-9.0.3-24.el8 yum -y install python3-lxml @@ -180,7 +180,7 @@ chromedriver -v echo "### Confirm install list" yum list installed pip freeze -pip3.9 freeze +pip3.12 freeze echo "### Create directories normally managed by Puppet" mkdir -p /usr/local/projects/temmpo/etc/apache/conf.d diff --git a/deploy/fabfile.py b/deploy/fabfile.py index 4b1dac10..535f8841 100644 --- a/deploy/fabfile.py +++ b/deploy/fabfile.py @@ -56,7 +56,7 @@ def _toggle_local_remote(use_local_mode): return (caller, change_dir) -def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch=None, migrate_db=True, use_local_mode=False, requirements="requirements", restart_rqworker=True, virtualenv="virtualenv-3.9", project_dir=PROJECT_ROOT): +def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch=None, migrate_db=True, use_local_mode=False, requirements="requirements", restart_rqworker=True, virtualenv="virtualenv-3.12", project_dir=PROJECT_ROOT): """NB: env = dev|prod, configure_apache=False, clone_repo=False, branch=None, migrate_db=True, use_local_mode=False, requirements="requirements".""" # Convert any string command line arguments to boolean values, where required. configure_apache = (str(configure_apache).lower() == 'true') From 1549cfbb35b0a927c3512c3a09c9d506795bc913 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 13:36:49 +0000 Subject: [PATCH 18/38] Remove unused / unnecessary functions or commands that trigger warnings in Python 3.12 --- deploy/fabfile.py | 90 ----------------------------------------------- 1 file changed, 90 deletions(-) diff --git a/deploy/fabfile.py b/deploy/fabfile.py index 535f8841..7b8435de 100644 --- a/deploy/fabfile.py +++ b/deploy/fabfile.py @@ -95,9 +95,6 @@ def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch= with change_dir(src_dir): caller('git clone %s temmpo' % GIT_URL) with change_dir(src_dir + "temmpo"): - # Remove any Python 2 cached files - caller('rm -f `find . -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') - # Alternatively Remove all cache file - find . -type f -name "*.py[co]" -delete -or -type d -name "__pycache__" -delete # Ensure file mode changes do not trigger changes that can block a git pull command caller('git config core.fileMode false') caller('git fetch --all') @@ -160,8 +157,6 @@ def deploy(env="dev", branch="master", using_apache=True, migrate_db=True, use_l src_dir = project_dir + "lib/" + env + "/src/temmpo/" with cd(src_dir): - # Remove any cached python project files - caller('rm -f `find . -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') # Ensure file mode changes do not trigger changes that can block a git pull command caller('git config core.fileMode false') caller('git fetch --all') @@ -345,91 +340,6 @@ def restart_apache(env="dev", use_local_mode=False, run_checks=True, project_dir if toggled_maintenance_mode: disable_apache_site(use_local_mode) - -def migrate_sqlite_data_to_mysql(env="dev", use_local_mode=False, using_apache=True, swap_db=True, project_dir=PROJECT_ROOT): - """env="dev", use_local_mode=False, using_apache=True, swap_db=True - NB: Written to migrate the data once, not to drop any existing MySQL tables.""" - use_local_mode = (str(use_local_mode).lower() == 'true') - using_apache = (str(using_apache).lower() == 'true') - swap_db = (str(swap_db).lower() == 'true') - caller, change_dir = _toggle_local_remote(use_local_mode) - venv_dir = project_dir + "lib/" + env + "/" - now = datetime.now() - date_string = "%s-%s-%s-%s-%s" % (now.year, now.month, now.day, now.hour, now.minute) - sqlite_db = '/usr/local/projects/temmpo/var/data/db.sqlite3' - output_file = "/usr/local/projects/temmpo/var/data/export-db-%s.sql" % date_string - sqlite_table_counts_file = "/usr/local/projects/temmpo/var/data/sqlite-counts-%s.txt" % date_string - mysql_table_counts_file = "/usr/local/projects/temmpo/var/data/mysql-counts-%s.txt" % date_string - sqlite_status_file = "/usr/local/projects/temmpo/var/data/sqlite-status-%s.txt" % date_string - mysql_status_file = "/usr/local/projects/temmpo/var/data/mysql-status-%s.txt" % date_string - tables = ('auth_group', - 'browser_searchcriteria_genes', - 'auth_group_permissions', - 'browser_searchcriteria_mediator_terms', - 'auth_permission', - 'browser_searchcriteria_outcome_terms', - 'auth_user', - 'browser_searchresult', - 'auth_user_groups', - 'browser_upload', - 'auth_user_user_permissions', - 'django_admin_log', - 'browser_abstract', - 'django_content_type', - 'browser_gene', - 'django_migrations', - 'browser_meshterm', - 'django_session', - 'browser_searchcriteria', - 'registration_registrationprofile',) - compare_data = '' - for table in tables: - compare_data += "SELECT count(*) FROM %s; " % table - - compare_sqlite = ".tables" - compare_mysql = "SHOW TABLES" - - if using_apache: - disable_apache_site(use_local_mode) - - with change_dir(venv_dir): - # Export data - NB: No drop table commands are included in this dump - caller("sqlite3 %s .dump > %s" % (sqlite_db, output_file)) - # Export comparison from SQLite - caller("sqlite3 %s '%s' > %s" % (sqlite_db, compare_data, sqlite_table_counts_file)) - caller("echo '%s' | ./bin/python3 src/temmpo/manage.py dbshell --settings=temmpo.settings.%s --database=sqlite > %s" % (compare_sqlite, env, sqlite_status_file)) - # Convert certain commands from SQLite to the MySQL equivalents - caller("sed -i -e 's/PRAGMA.*/SET SESSION sql_mode = ANSI_QUOTES;/' -e 's/BEGIN/START/' -e 's/AUTOINCREMENT/AUTO_INCREMENT/g' -e 's/^.*sqlite_sequence.*$//g' %s" % output_file) - # Import data - caller("cat %s | ./bin/python3 src/temmpo/manage.py dbshell --settings=temmpo.settings.%s --database=admin" % (output_file, env)) - # Export comparison data from MySQL - caller("echo '%s' | ./bin/python3 src/temmpo/manage.py dbshell --settings=temmpo.settings.%s --database=mysql > %s" % (compare_mysql, env, mysql_status_file)) - caller("echo '%s' | ./bin/python3 src/temmpo/manage.py dbshell --settings=temmpo.settings.%s --database=mysql > %s" % (compare_data, env, mysql_table_counts_file)) - # Trim header of MySQL output file - caller("sed -i 1,1d %s " % mysql_status_file) - # Trim output headers from MySQL table counts - caller("sed -i 1,1d %s " % mysql_table_counts_file) - caller("sed -i -e 's/count(\*)//g' %s" % mysql_table_counts_file) - caller("tr --squeeze-repeats '\\n' < %s > tmp.txt && mv tmp.txt %s" % (mysql_table_counts_file, mysql_table_counts_file)) - # Trim trailing white space - caller("sed -i -e 's/ \{1,\}$//g' %s" % sqlite_status_file) - # Split into one column - caller("sed -i -e 's/ \{1,\}/\\n/g' %s" % sqlite_status_file) - caller("sort %s -o %s" % (sqlite_status_file, sqlite_status_file)) - caller("diff %s %s" % (sqlite_status_file, mysql_status_file)) - caller("diff %s %s" % (sqlite_table_counts_file, mysql_table_counts_file)) - - if swap_db: - with change_dir(PROJECT_ROOT): - # Update database default - caller("echo -e '\nDATABASES[\"default\"] = DATABASES[\"mysql\"]' >> .settings/private_settings.py") - # Move SQLite DB to one side - caller("mv %s %s-old" % (sqlite_db, sqlite_db)) - - if using_apache: - enable_apache_site(use_local_mode) - restart_apache(env, use_local_mode, run_checks=True) - - def sym_link_private_settings(env="dev", use_local_mode=False, project_dir=PROJECT_ROOT): """env="dev", use_local_mode=False.""" use_local_mode = (str(use_local_mode).lower() == 'true') From 801f6d69a30af792a1280754bdb1ec117354ffac Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 13:38:19 +0000 Subject: [PATCH 19/38] Remove unused / unnecessary functions or commands that trigger warnings in Python 3.12 --- deploy/fabfile.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/deploy/fabfile.py b/deploy/fabfile.py index 7b8435de..a0e13278 100644 --- a/deploy/fabfile.py +++ b/deploy/fabfile.py @@ -165,10 +165,6 @@ def deploy(env="dev", branch="master", using_apache=True, migrate_db=True, use_l caller('git pull origin %s' % branch) with change_dir(venv_dir): - - # Remove any python dependency pyc files - caller('rm -f `find lib/python3.12/site-packages/ -type d \( -name __pycache__ -o -path name \) -prune -false -o -name *.pyc`') - # Ensure pip3 and setup tools is up to expected version for existing environments. caller('./bin/pip3 cache purge') caller('./bin/pip3 install -U pip==%s' % PIP_VERSION) From dd33ff50d47488712148dd3ea0453222d387b858 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 13:43:25 +0000 Subject: [PATCH 20/38] Use explict regular expresson r prefixed strings --- browser/models.py | 5 ++--- browser/validators.py | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/browser/models.py b/browser/models.py index 85de286e..9cc60623 100644 --- a/browser/models.py +++ b/browser/models.py @@ -22,9 +22,8 @@ def get_user_upload_location(instance, filename): """Based on slugify code - from django.utils.text import slugify.""" - # TODO Test changes explictly - filename = re.sub('[^\.\w\s-]', '', filename).strip().lower() - filename = re.sub('[-\s]+', '-', filename) + filename = re.sub(r'[^\.\w\s-]', '', filename).strip().lower() + filename = re.sub(r'[-\s]+', '-', filename) return timezone.now().strftime('/'.join(['abstracts', str(instance.user.id), '%Y-%m-%d', '%H-%M-%S-' + filename])) diff --git a/browser/validators.py b/browser/validators.py index f27ff5ab..a674d28c 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -8,12 +8,12 @@ logger = logging.getLogger(__name__) -OVID_MEDLINE_IDENTIFIER_PATTERN = re.compile(b"^<\d+>") -OVID_MEDLINE_IDENTIFIER_LABEL_PATTERN = re.compile(b"^Unique Identifier") -OVID_MEDLINE_IDENTIFIER_MESH_PATTERN = re.compile(b"^MeSH Subject Headings") +OVID_MEDLINE_IDENTIFIER_PATTERN = re.compile(r"^<\d+>") +OVID_MEDLINE_IDENTIFIER_LABEL_PATTERN = re.compile(r"^Unique Identifier") +OVID_MEDLINE_IDENTIFIER_MESH_PATTERN = re.compile(r"^MeSH Subject Headings") -PUBMED_IDENTIFIER_PATTERN = re.compile(b"^PMID- \d+") -PUBMED_IDENTIFIER_MH_PATTERN = re.compile(b"^MH -") +PUBMED_IDENTIFIER_PATTERN = re.compile(r"^PMID- \d+") +PUBMED_IDENTIFIER_MH_PATTERN = re.compile(r"^MH -") class MimetypeValidator(object): From 55d9f4262ee8e8efb9aae6bca68ce8deb6926414 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 14:04:42 +0000 Subject: [PATCH 21/38] Bug fix using explict regular expresson rb prefixed byte strings --- browser/validators.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/browser/validators.py b/browser/validators.py index a674d28c..ad5f1446 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -8,12 +8,12 @@ logger = logging.getLogger(__name__) -OVID_MEDLINE_IDENTIFIER_PATTERN = re.compile(r"^<\d+>") -OVID_MEDLINE_IDENTIFIER_LABEL_PATTERN = re.compile(r"^Unique Identifier") -OVID_MEDLINE_IDENTIFIER_MESH_PATTERN = re.compile(r"^MeSH Subject Headings") +OVID_MEDLINE_IDENTIFIER_PATTERN = re.compile(rb"^<\d+>") +OVID_MEDLINE_IDENTIFIER_LABEL_PATTERN = re.compile(rb"^Unique Identifier") +OVID_MEDLINE_IDENTIFIER_MESH_PATTERN = re.compile(rb"^MeSH Subject Headings") -PUBMED_IDENTIFIER_PATTERN = re.compile(r"^PMID- \d+") -PUBMED_IDENTIFIER_MH_PATTERN = re.compile(r"^MH -") +PUBMED_IDENTIFIER_PATTERN = re.compile(rb"^PMID- \d+") +PUBMED_IDENTIFIER_MH_PATTERN = re.compile(rb"^MH -") class MimetypeValidator(object): From 3a1334b6cae60ff635ef614ac93c4e0c7a2e3eec Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 14:06:24 +0000 Subject: [PATCH 22/38] Update Probe page test --- browser/probe.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/probe.py b/browser/probe.py index a088d09f..57984ca3 100644 --- a/browser/probe.py +++ b/browser/probe.py @@ -99,7 +99,7 @@ def probe_email(self): return True def python_version(self): - if sys.version_info.major == 3 and sys.version_info.minor == 9: + if sys.version_info.major == 3 and sys.version_info.minor == 12: return True else: return False From 20bb56a9b8a4df9f5a225c1f9c22ba8a65b594cc Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 14:31:38 +0000 Subject: [PATCH 23/38] Update to use Python 3.12 pip and related system packages instead --- deploy/Dockerfile-rhel | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/deploy/Dockerfile-rhel b/deploy/Dockerfile-rhel index 5a027405..30933be4 100644 --- a/deploy/Dockerfile-rhel +++ b/deploy/Dockerfile-rhel @@ -39,10 +39,11 @@ RUN yum update -y && \ mariadb-connector-c-devel \ perl-DBD-MySQL \ python312 \ - python312-devel \ - python312-lxml \ - python312-setuptools \ - python312-wheel \ + python3.12-pip \ + python3.12-devel \ + python3.12-lxml \ + python3.12-setuptools \ + python3.12-wheel \ zip ENV PIP_VERSION='24.3.1' @@ -51,13 +52,16 @@ ENV PIP_TOOLS_VERSION='7.4.1' ENV VE_VERSION='20.26.3' ENV FABRIC_VERSION='1.15.0' -RUN pip3 install -U pip==${PIP_VERSION} -RUN pip3 install -U setuptools==${SETUPTOOLS_VERSION} -RUN pip3 install pip-tools==${PIP_TOOLS_VERSION} -RUN pip3 install virtualenv==${VE_VERSION} -RUN pip3 install fabric==${FABRIC_VERSION} +RUN pip3 -V +RUN pip3.12 -V -RUN pip3 freeze +RUN pip3.12 install -U pip==${PIP_VERSION} +RUN pip3.12 install -U setuptools==${SETUPTOOLS_VERSION} +RUN pip3.12 install pip-tools==${PIP_TOOLS_VERSION} +RUN pip3.12 install virtualenv==${VE_VERSION} +RUN pip3.12 install fabric==${FABRIC_VERSION} + +RUN pip3.12 freeze RUN virtualenv --version ENV ENVIRON="test" @@ -86,6 +90,6 @@ VOLUME [ ${CODE_PATH} ] RUN ls -l /usr/local/projects/temmpo/.settings/private_settings.py -CMD [ "pip3", "check" ] # TODO replace with command to run tests +CMD [ "pip3.12", "check" ] # TODO replace with command to run tests # CMD ../../bin/python3 manage.py test --settings=temmpo.settings.test_mysql --exclude-tag=selenium-test --exclude-tag=skip-on-ubuntu \ No newline at end of file From 63673cf50e7f34bf24d2e76f86087de9ef81bffa Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 14:48:54 +0000 Subject: [PATCH 24/38] Re-instate using python-magic egg to detect mimetype, add support to fall back to built in mimetypes package and then fall back filetypes egg if required --- browser/fields.py | 20 ++++++++++++++++---- browser/validators.py | 16 ++++++++++++---- requirements/requirements.in | 1 + requirements/requirements.txt | 4 +++- 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/browser/fields.py b/browser/fields.py index 6dfe7eb5..9422a9d8 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -1,7 +1,9 @@ import logging -import filetype import mimetypes import os + +import filetype +import magic from xtract import xtract from django import forms @@ -25,11 +27,21 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) - mime_type = filetype.guess(value.temporary_file_path()) + mime_type = magic.from_buffer(value.read(1024), mime=True) if mime_type == None: - mime_type, encoding = mimetypes.guess_type(value.temporary_file_path()) + mime_type = filetype.guess(value.temporary_file_path()) + if mime_type == None: + mime_type, encoding = mimetypes.guess_type(value.temporary_file_path()) + logger.error("DEBUG: Using mimetypes package") + else: + mime_type = mime_type.mime + logger.error("DEBUG: Using filetype package") else: - mime_type = mime_type.mime + logger.error("DEBUG: Using magic package") + + logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) + logger.error("DEBUG: mime %s" % mime_type) + if mime_type in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: extracted_file_path = xtract(value.temporary_file_path()) diff --git a/browser/validators.py b/browser/validators.py index ad5f1446..bad57d56 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- import logging -import filetype import mimetypes import re +import filetype +import magic + from django.core.exceptions import ValidationError logger = logging.getLogger(__name__) @@ -25,11 +27,17 @@ def __init__(self, mimetypes): def __call__(self, value): try: - mime = filetype.guess(value.temporary_file_path()) + mime = magic.from_buffer(value.read(1024), mime=True) if mime == None: - mime, encoding = mimetypes.guess_type(value.temporary_file_path()) + mime = filetype.guess(value.temporary_file_path()) + if mime == None: + logger.error("DEBUG: Using mimetypes package") + mime, encoding = mimetypes.guess_type(value.temporary_file_path()) + else: + logger.error("DEBUG: Using filetype package") + mime = mime.mime else: - mime = mime.mime + logger.error("DEBUG: Using magic package") logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) logger.error("DEBUG: mime %s" % mime) if mime not in self.mimetypes: diff --git a/requirements/requirements.in b/requirements/requirements.in index d5ad7de7..fb785a7b 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -18,6 +18,7 @@ mysqlclient>=2.1.1 numexpr>=2.10.1 numpy>=1.24.2 pandas>=1.5.3 +python-magic>=0.4.27 redis>=3.5.3 # redis<3.6 requierd for CentOS 7 VM because redis_version:3.2.12 requires - 3.5.3; For RHEL8 can use latest paackage redis-cli 5.0.3 redis_version:5.0.3 rq>=2.0.0 # NB: 2.0.0. drops support for Redis server < 4 unicodecsv>=0.14.1 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index d679b4b5..43d5987d 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -524,7 +524,9 @@ python-dateutil==2.9.0.post0 \ python-magic==0.4.27 \ --hash=sha256:c1ba14b08e4a5f5c31a302b7721239695b2f0f058d125bd5ce1ee36b9d9d3c3b \ --hash=sha256:c212960ad306f700aa0d01e5d7a325d20548ff97eb9920dcd29513174f0294d3 - # via xtract + # via + # -r requirements/requirements.in + # xtract pytz==2024.2 \ --hash=sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a \ --hash=sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725 From 02c860b8f8785b09b654e7b16696566787c27a49 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 15:09:39 +0000 Subject: [PATCH 25/38] Bug fix typo in updated test --- tests/test_uploads.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 1eb978db..3cd22639 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -115,7 +115,7 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path mime_type = filetype.guess(uploaded_file_path) if mime_type == None: - mime_type, encoding = mimetypes.guess_type(self.path) + mime_type, encoding = mimetypes.guess_type(uploaded_file_path) else: mime_type = mime_type.mime self.assertEqual(mime_type, "text/plain") From 61af05acd0a64400a1204e070f3f51cb583c2c6b Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 15:10:04 +0000 Subject: [PATCH 26/38] Update to use python 3.12 test assertion --- tests/test_searching.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_searching.py b/tests/test_searching.py index be5d7c99..1a0c62a2 100644 --- a/tests/test_searching.py +++ b/tests/test_searching.py @@ -337,7 +337,7 @@ def test_reuse_upload(self): self._find_expected_content(path, msg='Select exposures') recent_search_criteria = SearchCriteria.objects.latest('id') # Ensure a search criteria new object has been created. - self.assertNotEquals(original_criteria.id, recent_search_criteria.id) + self.assertNotEqual(original_criteria.id, recent_search_criteria.id) # Ensure no terms settings were carried over self.assertEqual(recent_search_criteria.exposure_terms.all().count(), 0) self.assertEqual(recent_search_criteria.mediator_terms.all().count(), 0) @@ -356,7 +356,7 @@ def test_edit_search(self): recent_search_criteria = SearchCriteria.objects.latest('id') # Ensure a search criteria new object has been created. - self.assertNotEquals(original_criteria.id, recent_search_criteria.id) + self.assertNotEqual(original_criteria.id, recent_search_criteria.id) # Ensure exact terms settings were carried over self.assertEqual(list(original_criteria.exposure_terms.values_list("id", flat=True)), list(recent_search_criteria.exposure_terms.values_list("id", flat=True))) @@ -385,7 +385,7 @@ def test_edit_search_with_previous_release_year(self): recent_search_criteria = SearchCriteria.objects.latest('id') # Ensure a search criteria new object has been created. - self.assertNotEquals(original_criteria.id, recent_search_criteria.id) + self.assertNotEqual(original_criteria.id, recent_search_criteria.id) # Ensure expected terms settings were carried over self.assertEqual(list(original_criteria.exposure_terms.values_list("term", flat=True)), list(recent_search_criteria.exposure_terms.values_list("term", flat=True))) From 5c92473f339844958ca62650bd1df87647ddecda Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 15:33:55 +0000 Subject: [PATCH 27/38] Revert change to mime type detection which appears to work well with python 3.12 --- CHANGELOG | 7 +++---- browser/fields.py | 12 ------------ browser/validators.py | 12 ------------ requirements/dev.txt | 4 ---- requirements/requirements.in | 1 - requirements/requirements.txt | 4 ---- requirements/test.txt | 4 ---- tests/test_clamav.py | 17 +++-------------- tests/test_uploads.py | 12 ++++-------- 9 files changed, 10 insertions(+), 63 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 969c9fce..2e2512c2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,10 +1,9 @@ # Changelog -9.9.1 TMMA-508: Refactor detecting mime types of file uploads - Update packages used to connect to redis - -9.9.0 TMMA-511: Upgrade Python from 3.8.x to 3.9+ +9.9.0 TMMA-511: Upgrade Python from 3.8.x to 3.12.x + Apply MySQL Connector/Python connector security update TMMA-347: Set up RHEL8 development docker environment + Update packages used to connect to redis Update version of MySQL used in GitHub actions Update Python dependencies diff --git a/browser/fields.py b/browser/fields.py index 9422a9d8..95675ea2 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -1,8 +1,6 @@ import logging -import mimetypes import os -import filetype import magic from xtract import xtract @@ -28,16 +26,6 @@ def _create_upload_file_from_path(self, file_path): def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) mime_type = magic.from_buffer(value.read(1024), mime=True) - if mime_type == None: - mime_type = filetype.guess(value.temporary_file_path()) - if mime_type == None: - mime_type, encoding = mimetypes.guess_type(value.temporary_file_path()) - logger.error("DEBUG: Using mimetypes package") - else: - mime_type = mime_type.mime - logger.error("DEBUG: Using filetype package") - else: - logger.error("DEBUG: Using magic package") logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) logger.error("DEBUG: mime %s" % mime_type) diff --git a/browser/validators.py b/browser/validators.py index bad57d56..c78f5f39 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -1,9 +1,7 @@ # -*- coding: utf-8 -*- import logging -import mimetypes import re -import filetype import magic from django.core.exceptions import ValidationError @@ -28,16 +26,6 @@ def __init__(self, mimetypes): def __call__(self, value): try: mime = magic.from_buffer(value.read(1024), mime=True) - if mime == None: - mime = filetype.guess(value.temporary_file_path()) - if mime == None: - logger.error("DEBUG: Using mimetypes package") - mime, encoding = mimetypes.guess_type(value.temporary_file_path()) - else: - logger.error("DEBUG: Using filetype package") - mime = mime.mime - else: - logger.error("DEBUG: Using magic package") logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) logger.error("DEBUG: mime %s" % mime) if mime not in self.mimetypes: diff --git a/requirements/dev.txt b/requirements/dev.txt index a9e2062d..e52f1190 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -329,10 +329,6 @@ executing==2.1.0 \ --hash=sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf \ --hash=sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab # via stack-data -filetype==1.2.0 \ - --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ - --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 - # via -r /srv/requirements/test.txt h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 diff --git a/requirements/requirements.in b/requirements/requirements.in index fb785a7b..e66bb0cf 100644 --- a/requirements/requirements.in +++ b/requirements/requirements.in @@ -9,7 +9,6 @@ django-rq>=2.7.0 django-autocomplete-light>=3.9.4 Django<4.3 django-hcaptcha-field>=1.4.0 -filetype>=1.2.0 hiredis>=2.2.2 lxml>=4.9.2 more-itertools>=9.1.0 diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 43d5987d..1ba42729 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -98,10 +98,6 @@ django-rq==3.0.0 \ --hash=sha256:7bdadb85d9909c118cf1ee1b9bdd1a74ebf141bf8f3c2de2409fcac6080f67ac \ --hash=sha256:bd2ef287a28301f64c4282293648e4f8c6076dd895a545c9c6b98bde4a82a4ce # via -r requirements/requirements.in -filetype==1.2.0 \ - --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ - --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 - # via -r requirements/requirements.in hiredis==3.0.0 \ --hash=sha256:00018f22f38530768b73ea86c11f47e8d4df65facd4e562bd78773bd1baef35e \ --hash=sha256:034925b5fb514f7b11aac38cd55b3fd7e9d3af23bd6497f3f20aa5b8ba58e232 \ diff --git a/requirements/test.txt b/requirements/test.txt index 6dd77d59..6df90634 100644 --- a/requirements/test.txt +++ b/requirements/test.txt @@ -300,10 +300,6 @@ entrypoint2==1.1 \ --hash=sha256:eeb8c327bdb65cdd1668c023a6b110b7e3d1a046fb05e043861ebd9264b3a257 \ --hash=sha256:fc0b7fe7b21acdab47a585ab9407ca7e5c4f96cb6888575db6b0ceb91f0e105a # via pyscreenshot -filetype==1.2.0 \ - --hash=sha256:66b56cd6474bf41d8c54660347d37afcc3f7d1970648de365c102ef77548aadb \ - --hash=sha256:7ce71b6880181241cf7ac8697a2f1eb6a8bd9b429f7ad6d27b8db9ba5f1c2d25 - # via -r /srv/requirements/requirements.txt h11==0.14.0 \ --hash=sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d \ --hash=sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761 diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 5965eebe..fff4fd9d 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -1,21 +1,14 @@ # -*- coding: utf-8 -*- -from datetime import datetime import logging -import mimetypes import os -from time import sleep -from unittest import skip -import filetype +import magic import requests -from selenium.common.exceptions import WebDriverException from selenium.webdriver.common.by import By -from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait -from django.conf import settings from django.urls import reverse -from django.test import override_settings, tag +from django.test import tag from browser.models import Upload from tests.base_selenium_test_case import SeleniumBaseTestCase @@ -46,11 +39,7 @@ def _assert_file_upload(self, url, file_path): self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = filetype.guess(uploaded_file_path) - if mime_type == None: - mime_type, encoding = mimetypes.guess_type(uploaded_file_path) - else: - mime_type = mime_type.mime + mime_type = magic.from_buffer(uploaded_file_path.read(2048), mime=True) self.assertEqual(mime_type, "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 3cd22639..50de6dda 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import logging import os -import filetype -import mimetypes + +import magic from django.urls import reverse from django.test import tag -from browser.models import SearchCriteria, SearchResult, MeshTerm, Upload, OVID, PUBMED, Gene +from browser.models import Upload, OVID, PUBMED from tests.base_test_case import BaseTestCase @@ -113,11 +113,7 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = filetype.guess(uploaded_file_path) - if mime_type == None: - mime_type, encoding = mimetypes.guess_type(uploaded_file_path) - else: - mime_type = mime_type.mime + mime_type = magic.from_buffer(uploaded_file_path.read(2048), mime=True) self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From a03789f71f612d84c967ce87139a2dc6ab87bff2 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 15:53:44 +0000 Subject: [PATCH 28/38] Bug fix reverting test to using python-magic package; Lower debugging output --- browser/fields.py | 4 ++-- browser/validators.py | 4 ++-- tests/test_uploads.py | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/browser/fields.py b/browser/fields.py index 95675ea2..a6b36e8d 100644 --- a/browser/fields.py +++ b/browser/fields.py @@ -27,8 +27,8 @@ def to_python(self, value): value = super(ExtractorFileField, self).to_python(value) mime_type = magic.from_buffer(value.read(1024), mime=True) - logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) - logger.error("DEBUG: mime %s" % mime_type) + logger.debug("DEBUG: temp file path %s" % value.temporary_file_path()) + logger.debug("DEBUG: mime %s" % mime_type) if mime_type in ('application/gzip', 'application/x-gzip', 'application/bzip', 'application/bzip2', 'application/x-bzip', 'application/x-bzip2'): try: diff --git a/browser/validators.py b/browser/validators.py index c78f5f39..9ddfe2d3 100644 --- a/browser/validators.py +++ b/browser/validators.py @@ -26,8 +26,8 @@ def __init__(self, mimetypes): def __call__(self, value): try: mime = magic.from_buffer(value.read(1024), mime=True) - logger.error("DEBUG: temp file path %s" % value.temporary_file_path()) - logger.error("DEBUG: mime %s" % mime) + logger.debug("DEBUG: temp file path %s" % value.temporary_file_path()) + logger.debug("DEBUG: mime %s" % mime) if mime not in self.mimetypes: raise ValidationError('%s is not an acceptable file type. Please use a %s formatted file instead.' % (value, ' or '.join(self.mimetypes))) except AttributeError as e: diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 50de6dda..477a0cc5 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -112,8 +112,8 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not an acceptable file type") self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) - uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = magic.from_buffer(uploaded_file_path.read(2048), mime=True) + uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file + mime_type = magic.from_buffer(uploaded_file.read(2048), mime=True) self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From 71060790c43675eaf3821af855be61a7fcf16dbb Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Tue, 5 Nov 2024 16:44:37 +0000 Subject: [PATCH 29/38] Adjust failing tests; Temp only run failing tests --- tests/run-django-tests.sh | 3 ++- tests/test_clamav.py | 3 ++- tests/test_uploads.py | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/run-django-tests.sh b/tests/run-django-tests.sh index 722939d8..98872695 100644 --- a/tests/run-django-tests.sh +++ b/tests/run-django-tests.sh @@ -8,5 +8,6 @@ echo "Run coverage tests" cd $GITHUB_WORKSPACE cd lib/test/src/temmpo ../../bin/coverage -../../bin/coverage run --source='.' manage.py test --settings=temmpo.settings.test_mysql --exclude-tag=selenium-test +# TODO revert to runnign all tests +../../bin/coverage run --source='.' manage.py test --settings=temmpo.settings.test_mysql --tag mimetype --exclude-tag=selenium-test ../../bin/coverage report --skip-empty --skip-covered -m diff --git a/tests/test_clamav.py b/tests/test_clamav.py index fff4fd9d..99581d53 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -39,7 +39,8 @@ def _assert_file_upload(self, url, file_path): self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = magic.from_buffer(uploaded_file_path.read(2048), mime=True) + logger.error(f"uploaded_file_path {uploaded_file_path}") + mime_type = magic.from_file(uploaded_file_path, mime=True) self.assertEqual(mime_type, "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 477a0cc5..f67029ea 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -112,8 +112,9 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not an acceptable file type") self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) - uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file - mime_type = magic.from_buffer(uploaded_file.read(2048), mime=True) + uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path + logger.error(f"uploaded_file_path {uploaded_file_path}") + mime_type = magic.from_file(uploaded_file_path, mime=True) self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From 90c8208e4f85c0826437576c8aa20a52871a8032 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 00:33:35 +0000 Subject: [PATCH 30/38] Add further debug output and fallback mimetpye check --- tests/test_uploads.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_uploads.py b/tests/test_uploads.py index f67029ea..1a3b9930 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -113,8 +113,12 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - logger.error(f"uploaded_file_path {uploaded_file_path}") mime_type = magic.from_file(uploaded_file_path, mime=True) + if mime_type == None: + logger.error(f"uploaded_file_path {uploaded_file_path}") + logger.error(self.driver.page_source) + uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file + mime_type = magic.from_buffer(uploaded_file.read(1024), mime=True) self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From 7c9ac08e65f37c0757bbf84f7b77d4fd2e75a940 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 00:36:23 +0000 Subject: [PATCH 31/38] Add further debug output and fallback mimetpye check --- tests/test_uploads.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 1a3b9930..1e285fc7 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -114,7 +114,7 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path mime_type = magic.from_file(uploaded_file_path, mime=True) - if mime_type == None: + if mime_type != 'text/plain': logger.error(f"uploaded_file_path {uploaded_file_path}") logger.error(self.driver.page_source) uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file From 046b0789fcd78dc460ec18794644cd3992bd826a Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 00:39:14 +0000 Subject: [PATCH 32/38] Add further debug output and fallback mimetpye check --- tests/test_uploads.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 1e285fc7..39c65ed7 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -116,7 +116,7 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil mime_type = magic.from_file(uploaded_file_path, mime=True) if mime_type != 'text/plain': logger.error(f"uploaded_file_path {uploaded_file_path}") - logger.error(self.driver.page_source) + logger.error(response.page_source) uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file mime_type = magic.from_buffer(uploaded_file.read(1024), mime=True) self.assertEqual(mime_type, "text/plain") From e134796a876686b1378773436ebbd8dbd10e5a96 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 00:44:17 +0000 Subject: [PATCH 33/38] Add further debug output and fallback mimetpye check --- tests/test_uploads.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_uploads.py b/tests/test_uploads.py index 39c65ed7..acc2a396 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -116,7 +116,7 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil mime_type = magic.from_file(uploaded_file_path, mime=True) if mime_type != 'text/plain': logger.error(f"uploaded_file_path {uploaded_file_path}") - logger.error(response.page_source) + logger.error(response) uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file mime_type = magic.from_buffer(uploaded_file.read(1024), mime=True) self.assertEqual(mime_type, "text/plain") From cb7cd5f81ca8cca21847db9db56bd61d36e164b4 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 00:52:00 +0000 Subject: [PATCH 34/38] Bug fix mime type check --- tests/test_uploads.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tests/test_uploads.py b/tests/test_uploads.py index acc2a396..5f35ccd2 100644 --- a/tests/test_uploads.py +++ b/tests/test_uploads.py @@ -112,13 +112,8 @@ def _assert_file_is_uploaded_and_extracted_where_required(self, test_archive_fil self.assertNotContains(response, "is not an acceptable file type") self.assertNotContains(response, "is not a plain text file") self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) - uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - mime_type = magic.from_file(uploaded_file_path, mime=True) - if mime_type != 'text/plain': - logger.error(f"uploaded_file_path {uploaded_file_path}") - logger.error(response) - uploaded_file = Upload.objects.all().order_by("id").last().abstracts_upload.file - mime_type = magic.from_buffer(uploaded_file.read(1024), mime=True) + upload = Upload.objects.all().order_by("id").last().abstracts_upload + mime_type = magic.from_buffer(upload.file.read(1024), mime=True) self.assertEqual(mime_type, "text/plain") def test_bz2_pub_med_upload_is_allowable(self): From ec33542135af2f28e9db2fd8058dc9bb7ba2ac73 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 01:02:43 +0000 Subject: [PATCH 35/38] Update clamd tests; Re-enable Django tests --- tests/run-django-tests.sh | 4 ++-- tests/test_clamav.py | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/run-django-tests.sh b/tests/run-django-tests.sh index 98872695..9c89951d 100644 --- a/tests/run-django-tests.sh +++ b/tests/run-django-tests.sh @@ -8,6 +8,6 @@ echo "Run coverage tests" cd $GITHUB_WORKSPACE cd lib/test/src/temmpo ../../bin/coverage -# TODO revert to runnign all tests -../../bin/coverage run --source='.' manage.py test --settings=temmpo.settings.test_mysql --tag mimetype --exclude-tag=selenium-test + +../../bin/coverage run --source='.' manage.py test --settings=temmpo.settings.test_mysql --exclude-tag=selenium-test ../../bin/coverage report --skip-empty --skip-covered -m diff --git a/tests/test_clamav.py b/tests/test_clamav.py index 99581d53..422754f5 100644 --- a/tests/test_clamav.py +++ b/tests/test_clamav.py @@ -38,9 +38,8 @@ def _assert_file_upload(self, url, file_path): previous_upload_count = Upload.objects.all().count() self._upload_file(url, file_path) self.assertEqual(Upload.objects.all().count(), previous_upload_count + 1) - uploaded_file_path = Upload.objects.all().order_by("id").last().abstracts_upload.path - logger.error(f"uploaded_file_path {uploaded_file_path}") - mime_type = magic.from_file(uploaded_file_path, mime=True) + upload = Upload.objects.all().order_by("id").last().abstracts_upload + mime_type = magic.from_buffer(upload.file.read(1024), mime=True) self.assertEqual(mime_type, "text/plain") def _assert_virus_scanning(self, upload_url, virus_file_url): From 8c934846b3fa468385310f006b0686634f711785 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 15:18:57 +0000 Subject: [PATCH 36/38] Revert and modify when Debian docker image related Github actions are triggered --- .github/workflows/docker.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index ddf29bf0..4dff4484 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -6,6 +6,12 @@ on: workflow_dispatch: pull_request: push: + paths: + # TODO: Review scope of GitHub action grows + - '.github/workflows/docker.yml' + - 'deploy/Dockerfile' + # - 'entrypoints/**' + - 'requirements/**' # schedule: # - cron: 30 9 * * WED From 1a6b65f9341f88591c0b787f6b038e827b58a088 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 15:38:43 +0000 Subject: [PATCH 37/38] Ensure using virtualenv by default for future runs of make_virtualenv fabric command --- deploy/fabfile.py | 2 +- tests/build-test-env.sh | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/deploy/fabfile.py b/deploy/fabfile.py index a0e13278..39900691 100644 --- a/deploy/fabfile.py +++ b/deploy/fabfile.py @@ -56,7 +56,7 @@ def _toggle_local_remote(use_local_mode): return (caller, change_dir) -def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch=None, migrate_db=True, use_local_mode=False, requirements="requirements", restart_rqworker=True, virtualenv="virtualenv-3.12", project_dir=PROJECT_ROOT): +def make_virtualenv(env="dev", configure_apache=False, clone_repo=False, branch=None, migrate_db=True, use_local_mode=False, requirements="requirements", restart_rqworker=True, virtualenv="virtualenv", project_dir=PROJECT_ROOT): """NB: env = dev|prod, configure_apache=False, clone_repo=False, branch=None, migrate_db=True, use_local_mode=False, requirements="requirements".""" # Convert any string command line arguments to boolean values, where required. configure_apache = (str(configure_apache).lower() == 'true') diff --git a/tests/build-test-env.sh b/tests/build-test-env.sh index c56bff1a..c23a1b59 100644 --- a/tests/build-test-env.sh +++ b/tests/build-test-env.sh @@ -39,6 +39,7 @@ sudo apt-get install -y python3-wheel-whl echo "Check aliases for python3.12" which python3 which python3.12 +which virtualenv echo "Ensure Firefox is installed" which firefox From 1dbbfde9fd3f1358da3dddd71803e56440d99c92 Mon Sep 17 00:00:00 2001 From: Tessa Alexander Date: Wed, 6 Nov 2024 15:57:59 +0000 Subject: [PATCH 38/38] [skip ci] Remove temp file --- deploy/temp/Vagrantfile | 77 ----------------------------------------- 1 file changed, 77 deletions(-) delete mode 100644 deploy/temp/Vagrantfile diff --git a/deploy/temp/Vagrantfile b/deploy/temp/Vagrantfile deleted file mode 100644 index c79044c5..00000000 --- a/deploy/temp/Vagrantfile +++ /dev/null @@ -1,77 +0,0 @@ -# -*- mode: ruby -*- -# vi: set ft=ruby : - -# All Vagrant configuration is done below. The "2" in Vagrant.configure -# configures the configuration version (we support older styles for -# backwards compatibility). Please don't change it unless you know what -# you're doing. -Vagrant.configure("2") do |config| - # The most common configuration options are documented and commented below. - # For a complete reference, please see the online documentation at - # https://docs.vagrantup.com. - - # Every Vagrant development environment requires a box. You can search for - # boxes at https://vagrantcloud.com/search. - config.vm.box = "centos/7" - - # Disable automatic box update checking. If you disable this, then - # boxes will only be checked for updates when the user runs - # `vagrant box outdated`. This is not recommended. - # config.vm.box_check_update = false - - # Create a forwarded port mapping which allows access to a specific port - # within the machine from a port on the host machine. In the example below, - # accessing "localhost:8080" will access port 80 on the guest machine. - # NOTE: This will enable public access to the opened port - # config.vm.network "forwarded_port", guest: 80, host: 8080 - - # Create a forwarded port mapping which allows access to a specific port - # within the machine from a port on the host machine and only allow access - # via 127.0.0.1 to disable public access - # config.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1" - - # Create a private network, which allows host-only access to the machine - # using a specific IP. - # config.vm.network "private_network", ip: "192.168.33.10" - - # Create a public network, which generally matched to bridged network. - # Bridged networks make the machine appear as another physical device on - # your network. - # config.vm.network "public_network" - - # Share an additional folder to the guest VM. The first argument is - # the path on the host to the actual folder. The second argument is - # the path on the guest to mount the folder. And the optional third - # argument is a set of non-required options. - # config.vm.synced_folder "../data", "/vagrant_data" - - # Disable the default share of the current code directory. Doing this - # provides improved isolation between the vagrant box and your host - # by making sure your Vagrantfile isn't accessible to the vagrant box. - # If you use this you may want to enable additional shared subfolders as - # shown above. - # config.vm.synced_folder ".", "/vagrant", disabled: true - - # Provider-specific configuration so you can fine-tune various - # backing providers for Vagrant. These expose provider-specific options. - # Example for VirtualBox: - # - # config.vm.provider "virtualbox" do |vb| - # # Display the VirtualBox GUI when booting the machine - # vb.gui = true - # - # # Customize the amount of memory on the VM: - # vb.memory = "1024" - # end - # - # View the documentation for the provider you are using for more - # information on available options. - - # Enable provisioning with a shell script. Additional provisioners such as - # Ansible, Chef, Docker, Puppet and Salt are also available. Please see the - # documentation for more information about their specific syntax and use. - # config.vm.provision "shell", inline: <<-SHELL - # apt-get update - # apt-get install -y apache2 - # SHELL -end