From 2fdd358c3fd31d34779f150fc913d33d11aeebe2 Mon Sep 17 00:00:00 2001 From: Oliver Stolpe Date: Tue, 10 Sep 2024 16:20:08 +0200 Subject: [PATCH] feat: upgrade to sodar core v1 (#1973) --- .github/workflows/main.yml | 8 +- backend/Makefile | 11 +- backend/Pipfile | 15 +- backend/Pipfile.lock | 2048 ++++++++--------- backend/beaconsite/tests/test_permissions.py | 8 +- .../beaconsite/tests/test_permissions_ajax.py | 6 +- .../beaconsite/tests/test_permissions_api.py | 6 +- backend/beaconsite/tests/test_views_ajax.py | 4 +- backend/beaconsite/urls.py | 60 +- backend/cases/tests/test_permissions.py | 4 +- backend/cases/tests/test_permissions_ajax.py | 26 +- backend/cases/tests/test_permissions_api.py | 24 +- backend/cases/tests/test_views.py | 4 +- backend/cases/tests/test_views_ajax.py | 24 +- backend/cases/urls.py | 114 +- .../tests/test_permissions_api.py | 6 +- backend/cases_import/models/executors.py | 2 +- .../tests/test_models_executor.py | 2 +- .../tests/test_permissions_api.py | 4 +- .../cases_qc/tests/test_permissions_api.py | 6 +- backend/cases_qc/tests/test_views_api.py | 2 +- .../migrations/0008_alter_cohort_user.py | 28 + .../cohorts/tests/test_permissions_ajax.py | 8 +- backend/cohorts/tests/test_permissions_api.py | 8 +- backend/cohorts/tests/test_views_ui.py | 4 +- backend/cohorts/urls.py | 58 +- backend/config/settings/base.py | 122 +- backend/config/urls.py | 136 +- backend/genepanels/forms.py | 7 +- backend/genepanels/tests/test_models.py | 6 +- backend/genepanels/tests/test_permissions.py | 4 +- backend/genepanels/urls.py | 62 +- .../0012_alter_importcasebgjob_bg_job.py | 25 + backend/importer/urls.py | 67 +- backend/seqmeta/tests/test_models.py | 2 +- backend/seqmeta/tests/test_permissions.py | 4 +- backend/seqmeta/urls.py | 30 +- backend/seqvars/tests/test_permissions_api.py | 34 +- ...buildbackgroundsvsetjob_bg_job_and_more.py | 59 + .../tests/test_permissions_ajax_presets.py | 4 +- .../tests/test_permissions_ajax_queries.py | 14 +- backend/svs/urls.py | 98 +- backend/varannos/tests/helpers.py | 6 +- backend/varannos/tests/test_models.py | 2 +- backend/varannos/tests/test_permissions.py | 4 +- .../varannos/tests/test_permissions_api.py | 4 +- backend/varannos/urls.py | 26 +- backend/varfish/templates/users/login.html | 111 +- .../varfish_api_schema.yaml | 1377 ++--------- .../users/management/commands/initdev.py | 2 +- backend/varfish/users/urls.py | 10 +- backend/varfish/vueapp/urls.py | 6 +- ...piredexportedfilesbgjob_bg_job_and_more.py | 141 ++ .../migrations/0110_drop_variant_summary.py | 110 + .../migrations/0111_create_variant_summary.py | 87 + backend/variants/models/maintenance.py | 77 + backend/variants/tests/helpers.py | 8 +- backend/variants/tests/test_file_export.py | 4 +- .../variants/tests/test_permissions_ajax.py | 12 +- .../tests/test_permissions_ajax_annos.py | 4 +- .../tests/test_permissions_ajax_presets.py | 58 +- .../variants/tests/test_permissions_api.py | 14 +- backend/variants/tests/test_ui.py | 2 +- .../variants/tests/test_views_ajax_presets.py | 303 +-- backend/variants/urls/__init__.py | 340 +-- backend/variants/urls/annos.py | 6 +- backend/variants/urls/presets.py | 118 +- .../SvFilterForm/GenesRegionsPane.vue | 4 +- .../StrucvarFilterLegacy.vue | 10 +- .../varfish/components/FilterForm/DevPane.vue | 6 +- .../components/FilterForm/ClinvarPane.vue | 2 +- .../components/FilterForm/EffectPane.vue | 2 +- .../components/FilterForm/FlagsPane.vue | 2 +- .../components/FilterForm/FrequencyPane.vue | 2 +- .../FilterForm/GenesRegionsPane.vue | 8 +- .../components/FilterForm/QualityPane.vue | 2 +- .../components/QueryPresets/SetEditor.vue | 6 +- .../components/QueryPresets/SetProperties.vue | 4 +- utils/docker/Dockerfile | 12 +- 79 files changed, 2633 insertions(+), 3423 deletions(-) create mode 100644 backend/cohorts/migrations/0008_alter_cohort_user.py create mode 100644 backend/importer/migrations/0012_alter_importcasebgjob_bg_job.py create mode 100644 backend/svs/migrations/0029_alter_buildbackgroundsvsetjob_bg_job_and_more.py create mode 100644 backend/variants/migrations/0109_alter_clearexpiredexportedfilesbgjob_bg_job_and_more.py create mode 100644 backend/variants/migrations/0110_drop_variant_summary.py create mode 100644 backend/variants/migrations/0111_create_variant_summary.py diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8d7c49d29..35c4a81e4 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ jobs: - 6379:6379 postgres: - image: postgres:14 + image: postgres:16 env: POSTGRES_DB: varfish_web POSTGRES_USER: varfish_web @@ -119,7 +119,7 @@ jobs: with: # We need to fix the patch version here otherwise, snapshot tests # with randomness will / may fail. - python-version: "3.10.13" + python-version: "3.11" - name: Install pip and Pipenv run: | @@ -171,7 +171,7 @@ jobs: - name: Install Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Checkout repository uses: actions/checkout@v4 @@ -182,7 +182,7 @@ jobs: - name: Install Python uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.11" - name: Install pip and Pipenv run: pip install pip pipenv diff --git a/backend/Makefile b/backend/Makefile index 87aae96bb..4194bc31f 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -109,13 +109,16 @@ ci: \ docs: pipenv run $(MAKE) -C ../docs clean html -.PHONY: _migrate -_migrate: +.PHONY: _makemigrations +_makemigrations: pipenv run $(MANAGE) makemigrations - pipenv run $(MANAGE) migrate + +.PHONY: makemigrations +makemigrations: _makemigrations format .PHONY: migrate -migrate: _migrate format +migrate: + pipenv run $(MANAGE) migrate .PHONY: shell shell: diff --git a/backend/Pipfile b/backend/Pipfile index 7c79d0846..01a1bfb1c 100644 --- a/backend/Pipfile +++ b/backend/Pipfile @@ -7,7 +7,7 @@ name = "pypi" aldjemy = "~=2.2" altamisa = "~=0.2.5" attrs = "~=24.2" -beautifulsoup4 = "~=4.9" +beautifulsoup4 = "~=4.12.3" cattrs = "*" django = "*" # whatever django-sodar-core enforces django-clone = "*" @@ -15,12 +15,13 @@ django-cryptographic-fields-bihealth = "~=0.6.0" django-debug-toolbar = "*" django-extensions = "~=3.2" django-postgres-copy = "~=2.3.5" # there are issues above 2.3 -django-plugins-bihealth = "~=0.4.0" -django-sodar-core = "~=0.13.4" +django-plugins-bihealth = "~=0.5.2" +django-sodar-core = "~=1.0.2" django-su = "~=1.0.0" djangorestframework-httpsignature = "~=1.0" +djangorestframework = "~=3.15" djproxy = "~=2.3" -drf-keyed-list-bihealth = "~=0.1.1" +drf-keyed-list-bihealth = "~=0.2.1" httpsig = "~=1.3" interval-binning = "~=1.0" intervaltree = "~=3.1" @@ -51,10 +52,10 @@ wrapt = "~=1.16" xlsxwriter = "~=3.2" django-pydantic-field = "*" pydantic = "*" +typing-extensions="*" universal-pathlib = "*" s3fs = "*" toml = "*" -black = "*" rich = "*" drf-writable-nested = "*" django-modelcluster = "*" @@ -96,7 +97,7 @@ django-types = "*" [ldap-packages] # Dependencies for enabling LDAP support. You will need the system library # named `libldap` (or similar). -django-auth-ldap = "~=4.1" +django-auth-ldap = "~=4.6" python-ldap = "~=3.4" # Packages needed in production. @@ -109,4 +110,4 @@ django-storages = "*" django_redis = "*" [requires] -python_version = "3.10" +python_version = "3.11" diff --git a/backend/Pipfile.lock b/backend/Pipfile.lock index 57d7bc2b7..22a00d07a 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "6be2e526b255ce226db170f2d62fac2d7b91e4415e63c884404592248e19ab27" + "sha256": "709ea6770b337e3b1b0011ffcfb73c14784ca23391fecab3bf95c581fa782f5c" }, "pipfile-spec": 6, "requires": { - "python_version": "3.10" + "python_version": "3.11" }, "sources": [ { @@ -159,7 +159,6 @@ "sha256:a739e2924bf7940daee3a17ccec99fd7175363a160d6e8c3329e61d6534a165e" ], "index": "pypi", - "markers": "python_full_version >= '3.6.1' and python_version < '4.0'", "version": "==2.6" }, "altamisa": { @@ -187,11 +186,11 @@ }, "anyio": { "hashes": [ - "sha256:137b4559cbb034c477165047febb6ff83f390fc3b20bf181c1fc0a728cb8beeb", - "sha256:c7d2e9d63e31599eeb636c8c5c03a7e108d73b345f064f1c19fdc87b79036a9a" + "sha256:4c8bc31ccdb51c7f7bd251f51c609e038d63e34219b44aa86e47576389880b4c", + "sha256:6d170c36fba3bdd840c73d3868c1e777e33676a69c3a72cf0a0d5d6d8009b61d" ], "markers": "python_version >= '3.9'", - "version": "==4.6.0" + "version": "==4.6.2.post1" }, "argon2-cffi": { "hashes": [ @@ -250,7 +249,6 @@ "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==24.2.0" }, "awesome-slugify": { @@ -273,44 +271,15 @@ "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], "index": "pypi", - "markers": "python_full_version >= '3.6.0'", "version": "==4.12.3" }, "billiard": { "hashes": [ - "sha256:299de5a8da28a783d51b197d496bef4f1595dd023a93a4f59dde1886ae905547", - "sha256:87103ea78fa6ab4d5c751c4909bcff74617d985de7fa8b672cf8618afd5a875b" - ], - "version": "==3.6.4.0" - }, - "black": { - "hashes": [ - "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", - "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd", - "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea", - "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981", - "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b", - "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7", - "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", - "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", - "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", - "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", - "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", - "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f", - "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f", - "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b", - "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", - "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", - "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800", - "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", - "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2", - "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812", - "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", - "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e" + "sha256:12b641b0c539073fc8d3f5b8b7be998956665c4233c7c1fcd66a7e677c4fb36f", + "sha256:40b59a4ac8806ba2c2369ea98d876bc6108b051c227baffd928c644d15d8f3cb" ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==24.10.0" + "markers": "python_version >= '3.7'", + "version": "==4.2.1" }, "botocore": { "hashes": [ @@ -326,16 +295,15 @@ "sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.1.2" }, "celery": { "hashes": [ - "sha256:138420c020cd58d6707e6257b6beda91fd39af7afde5d36c6334d175302c0e14", - "sha256:fafbd82934d30f8a004f81e8f7a062e31413a23d444be8ee3326553915958c6d" + "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9", + "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af" ], - "markers": "python_version >= '3.7'", - "version": "==5.2.7" + "markers": "python_version >= '3.8'", + "version": "==5.3.6" }, "certifi": { "hashes": [ @@ -420,99 +388,114 @@ }, "charset-normalizer": { "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", + "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", + "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", + "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", + "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", + "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", + "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", + "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", + "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", + "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", + "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", + "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", + "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", + "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", + "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", + "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", + "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", + "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", + "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", + "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", + "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", + "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", + "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", + "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", + "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", + "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", + "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", + "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", + "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", + "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", + "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", + "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", + "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", + "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", + "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", + "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", + "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", + "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", + "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", + "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", + "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", + "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", + "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", + "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", + "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", + "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", + "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", + "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", + "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", + "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", + "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", + "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", + "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", + "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", + "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", + "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", + "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", + "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", + "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", + "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", + "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", + "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", + "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", + "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", + "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", + "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", + "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", + "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", + "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", + "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", + "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", + "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", + "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", + "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", + "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", + "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", + "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", + "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", + "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", + "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", + "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", + "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", + "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", + "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", + "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", + "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", + "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", + "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", + "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", + "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", + "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" + "version": "==3.4.0" }, "click": { "hashes": [ @@ -550,7 +533,6 @@ "sha256:b3064769e3cf62bd19d12523d391496bce96ce2c057df2b49e53f922ef1369fb" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==0.18.2" }, "conditional": { @@ -563,67 +545,66 @@ }, "crispy-bootstrap4": { "hashes": [ - "sha256:5241ab1dc2188c95560aa786439bcbedec7416e6b0f5a52dded82380810367ec", - "sha256:f18386c4d96180c1bb1212487d6e8f5a3dd1a9bb58d3032183973d4d130b55f9" + "sha256:208673bf6a25892a656971af7a00e18ba2f7f06cd4a0d667923bd6134e64d276", + "sha256:46cf98777a28621d240bf71eb36d4a26ff86e9e19be1cfd822645f4043d18c31" ], - "markers": "python_version >= '3.7'", - "version": "==2022.1" + "markers": "python_version >= '3.8'", + "version": "==2024.1" }, "cryptography": { "hashes": [ - "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", - "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", - "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", - "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", - "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", - "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", - "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", - "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", - "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", - "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", - "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", - "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", - "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2", - "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", - "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", - "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365", - "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96", - "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", - "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", - "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d", - "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", - "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", - "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", - "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172", - "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034", - "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", - "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289" + "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362", + "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4", + "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa", + "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83", + "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff", + "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805", + "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6", + "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664", + "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08", + "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e", + "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18", + "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f", + "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73", + "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5", + "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984", + "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd", + "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3", + "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e", + "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405", + "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2", + "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c", + "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995", + "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73", + "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16", + "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7", + "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd", + "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7" ], "markers": "python_version >= '3.7'", - "version": "==43.0.1" + "version": "==43.0.3" }, "defusedxml": { "hashes": [ - "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", - "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61" + "sha256:138c7d540a78775182206c7c97fe65b246a2f40b29471e1a2f1b0da76e7a3942", + "sha256:1c812964311154c3bf4aaf3bc1443b31ee13530b7f255eaaa062c0553c76103d" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.7.1" + "markers": "python_version >= '3.6'", + "version": "==0.8.0rc2" }, "django": { "hashes": [ - "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", - "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" + "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898", + "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.25" + "version": "==4.2.16" }, "django-autocomplete-light": { "hashes": [ - "sha256:0f6da75c1c7186698b867a467a8cdb359f0513fdd8e09288a0c2fb018ae3d94e" + "sha256:212576a17e3308ef7ca77e280b86684167916d2091d4b73640f38845d9516328" ], - "version": "==3.9.4" + "version": "==3.11.0" }, "django-clone": { "hashes": [ @@ -631,16 +612,15 @@ "sha256:ea2e5a770d01c62ecf66d0dd6e8df284e26321245b8abcc6d82d8740765b42d5" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==5.3.3" }, "django-crispy-forms": { "hashes": [ - "sha256:90193b068bf948d9c68449bc8260afed1a8e2afe11ee0bac8c4ebfaeb175b322", - "sha256:d1d4e585929058a9ab3b797666ea5b69320b9ba7937f9d146d32173246a6fd13" + "sha256:4d7ec431933ad4d4b5c5a6de4a584d24613c347db9ac168723c9aaf63af4bb96", + "sha256:d592044771412ae1bd539cc377203aa61d4eebe77fcbc07fbc8f12d3746d4f6b" ], - "markers": "python_version >= '3.7'", - "version": "==2.0" + "markers": "python_version >= '3.8'", + "version": "==2.1" }, "django-cryptographic-fields-bihealth": { "hashes": [ @@ -651,18 +631,18 @@ }, "django-db-file-storage": { "hashes": [ - "sha256:5d5da694b78ab202accab4508b958e0e37b3d146310e76f6f6125e1bdeaaad14" + "sha256:3feac1e060b550c3c03c35e95d2111d9f100bc247863ace691a78b107f1fc3d5", + "sha256:f0c4540ed6b772e8b3141eae3222acde4c29ab771477a5c999013a3980856c7f" ], - "version": "==0.5.5" + "version": "==0.5.6.1" }, "django-debug-toolbar": { "hashes": [ - "sha256:0b0dddee5ea29b9cb678593bc0d7a6d76b21d7799cb68e091a2148341a80f3c4", - "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6" + "sha256:36e421cb908c2f0675e07f9f41e3d1d8618dc386392ec82d23bcfcd5d29c7044", + "sha256:3beb671c9ec44ffb817fad2780667f172bd1c067dbcabad6268ce39a81335f45" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.3.0" + "version": "==4.4.6" }, "django-dirtyfields": { "hashes": [ @@ -681,11 +661,11 @@ }, "django-environ": { "hashes": [ - "sha256:510f8c9c1d0a38b0815f91504270c29440a0cf44fab07f55942fa8d31bbb9be6", - "sha256:b3559a91439c9d774a9e0c1ced872364772c612cdf6dc919506a2b13f7a77225" + "sha256:0ff95ab4344bfeff693836aa978e6840abef2e2f1145adff7735892711590c05", + "sha256:f32a87aa0899894c27d4e1776fa6b477e8164ed7f6b3e410a62a6d72caaf64be" ], - "markers": "python_version >= '3.5' and python_version < '4'", - "version": "==0.10.0" + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==0.11.2" }, "django-extensions": { "hashes": [ @@ -693,16 +673,14 @@ "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.3" }, "django-iconify": { "hashes": [ - "sha256:f17960f1336af39c3a50ee719203b3fe33ce61fa7300c0627a7a315615ec325c", - "sha256:f624e16f242c6afadb06f0ee97610c9eefb27016649b05a8a51551c8990f71e0" + "sha256:ced9314f011b318ccf56dd5145ca54bb3ec2a7dde3880571552236a31ebbcd97" ], "markers": "python_version >= '3.7' and python_version < '4.0'", - "version": "==0.1.1" + "version": "==0.3" }, "django-markupfield": { "hashes": [ @@ -713,11 +691,11 @@ }, "django-model-utils": { "hashes": [ - "sha256:2e2e4f13e4f14613134a9777db7ad4265f59a1d8f1384107bcaa3028fe3c87c1", - "sha256:8c0b0177bab909a8635b602d960daa67e80607aa5469217857271a60726d7a4b" + "sha256:7b73179480e4d4a737d0188e7c49da03776bbadedad569a534c4e9f1afc004d4", + "sha256:d57143e8b7345fd4719c5a95d07d7a50f7d11134da6a729aa6b73fb9674bec9d" ], - "markers": "python_version >= '3.7'", - "version": "==4.3.1" + "markers": "python_version >= '3.8'", + "version": "==4.4.0" }, "django-modelcluster": { "hashes": [ @@ -725,7 +703,6 @@ "sha256:a8783d6565a0663f41cd6003ea361c3a5711e8a2a326160f1ec1eceb3e973d4f" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.3" }, "django-pagedown": { @@ -737,10 +714,10 @@ }, "django-plugins-bihealth": { "hashes": [ - "sha256:5f3d3922f3825348d6d4a7fceb6c6a705c527edcae396ef32ab181d8dbe69536" + "sha256:6f1d85b4225ce8b6ec3195fa158ad120b5aeea61cf1ab744f1512b3809ef6a33" ], "index": "pypi", - "version": "==0.4.0" + "version": "==0.5.2" }, "django-postgres-copy": { "hashes": [ @@ -756,7 +733,6 @@ "sha256:c9824962d300dacd7009b76a64ef9ede81858cc769edbeb25a2c81d338c6f9b8" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.3.10" }, "django-rest-knox": { @@ -767,20 +743,12 @@ "markers": "python_version >= '3.6'", "version": "==4.2.0" }, - "django-saml2-auth-ai": { - "hashes": [ - "sha256:5301846103429ba996f9c105474ea531928acebec24132a2516d06fcc6e6852a", - "sha256:6dca13d6d3633b7fb1b818fb3c54a62a71959697d6a2a94cdf3e009ae2704738" - ], - "version": "==2.1.6" - }, "django-sodar-core": { "hashes": [ - "sha256:55b6c73c4c0384d33c2a8cb2fae369475baa551aee924af20f05a07027201762" + "sha256:1efbce524671eae8645ab5516129b7d1a6d45cb76b196539f08ab887c143471b" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.13.4" + "version": "==1.0.2" }, "django-su": { "hashes": [ @@ -791,11 +759,11 @@ }, "djangorestframework": { "hashes": [ - "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8", - "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08" + "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20", + "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad" ], - "markers": "python_version >= '3.6'", - "version": "==3.14.0" + "index": "pypi", + "version": "==3.15.2" }, "djangorestframework-httpsignature": { "hashes": [ @@ -814,18 +782,18 @@ }, "docutils": { "hashes": [ - "sha256:23010f129180089fbcd3bc08cfefccb3b890b0050e1ca00c867036e9d161b98c", - "sha256:679987caf361a7539d76e584cbeddc311e3aee937877c87346f31debc63e9d06" + "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", + "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.18.1" + "markers": "python_version >= '3.7'", + "version": "==0.20.1" }, "drf-keyed-list-bihealth": { "hashes": [ - "sha256:e28d0111bfad9adae60a1ace79d50c28b9cf10f5bad950ac487014c7a16c9457" + "sha256:c43f456b0190853a185ff7d5288306d3735d4cca1acc9b00a5ff1a04c7d85e6f" ], "index": "pypi", - "version": "==0.1.1" + "version": "==0.2.1" }, "drf-spectacular": { "extras": [ @@ -835,7 +803,7 @@ "sha256:a199492f2163c4101055075ebdbb037d59c6e0030692fc83a1a8c0fc65929981", "sha256:b1c04bf8b2fbbeaf6f59414b4ea448c8787aba4d32f76055c3b13335cf7ec37b" ], - "markers": "python_version >= '3.7'", + "index": "pypi", "version": "==0.27.2" }, "drf-spectacular-sidecar": { @@ -850,17 +818,8 @@ "sha256:154c0381e8a3a477e0fd539d5e1caf8ff4c1097a9c0c0fe741d4858b11b0455b" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.7.0" }, - "elementpath": { - "hashes": [ - "sha256:a16438bcc6b2b3069dde204c1e105322378a108b28faea3055d1b294443babea", - "sha256:affdc8de95af1a4c10d1d2ed79c6fa56b59c26c7fce64b73497569e9dea46998" - ], - "markers": "python_version >= '3.8'", - "version": "==4.5.0" - }, "exceptiongroup": { "hashes": [ "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", @@ -871,12 +830,11 @@ }, "faker": { "hashes": [ - "sha256:37b5ab951f7367ea93edb865120e9717a7a649d6a4b223f1e4a47a8a20d9e85f", - "sha256:be0e548352c1be6f6d9c982003848a0d305868f160bb1fb7f945acffc347e676" + "sha256:3608c7fcac2acde0eaa6da28dae97628f18f14d54eaa2a92b96ae006f1621bd7", + "sha256:4cd0c5ea4bc1e4c902967f6e662f5f5da69f1674d9a94f54e516d27f3c2a6a16" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==30.6.0" + "version": "==30.8.0" }, "frozenlist": { "hashes": [ @@ -1155,16 +1113,15 @@ "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.23.0" }, "jsonschema-specifications": { "hashes": [ - "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc", - "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c" + "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", + "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" ], - "markers": "python_version >= '3.8'", - "version": "==2023.12.1" + "markers": "python_version >= '3.9'", + "version": "==2024.10.1" }, "kombu": { "hashes": [ @@ -1323,16 +1280,15 @@ "sha256:fb66442c2546446944437df74379e9cf9e9db353e61301d1a0e26482f43f0dd8" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==5.3.0" }, "markdown": { "hashes": [ - "sha256:08fb8465cffd03d10b9dd34a5c3fea908e20391a2a90b88d66362cb05beed186", - "sha256:3b809086bb6efad416156e00a0da66fe47618a5d6918dd688f53f40c8e4cfeff" + "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd", + "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8" ], - "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "markers": "python_version >= '3.8'", + "version": "==3.5.2" }, "markdown-it-py": { "hashes": [ @@ -1344,69 +1300,70 @@ }, "markupsafe": { "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.2" }, "mdurl": { "hashes": [ @@ -1418,10 +1375,11 @@ }, "mistune": { "hashes": [ - "sha256:0246113cb2492db875c6be56974a7c893333bf26cd92891c85f63151cee09d34", - "sha256:bad7f5d431886fcbaf5f758118ecff70d31f75231b34024a1341120340a65ce8" + "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205", + "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8" ], - "version": "==2.0.5" + "markers": "python_version >= '3.7'", + "version": "==3.0.2" }, "multidict": { "hashes": [ @@ -1521,14 +1479,6 @@ "markers": "python_version >= '3.8'", "version": "==6.1.0" }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, "numpy": { "hashes": [ "sha256:05b2d4e667895cc55e3ff2b56077e4c8a5604361fc21a042845ea3ad67465aa8", @@ -1586,9 +1536,16 @@ "sha256:fc44e3c68ff00fd991b59092a54350e6e4911152682b4782f68070985aa9e648" ], "index": "pypi", - "markers": "python_version >= '3.10'", "version": "==2.1.2" }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" + }, "packaging": { "hashes": [ "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", @@ -1643,119 +1600,96 @@ "sha256:fffb8ae78d8af97f849404f21411c95062db1496aeb3e56f146f0355c9989319" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==2.2.3" }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, "phenopackets": { "hashes": [ "sha256:6f3935d1875fb97e44584ffa4374d2078497f95c7331dc4a04ca6945ab110e45", "sha256:a262a28dbf9851d2ad2e98bea1ccac4d00bebb9613f868020d2cb5f8a06adb9e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.0.2.post4" }, "pillow": { "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" + "sha256:00177a63030d612148e659b55ba99527803288cea7c75fb05766ab7981a8c1b7", + "sha256:006bcdd307cc47ba43e924099a038cbf9591062e6c50e570819743f5607404f5", + "sha256:084a07ef0821cfe4858fe86652fffac8e187b6ae677e9906e192aafcc1b69903", + "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2", + "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38", + "sha256:1187739620f2b365de756ce086fdb3604573337cc28a0d3ac4a01ab6b2d2a6d2", + "sha256:16095692a253047fe3ec028e951fa4221a1f3ed3d80c397e83541a3037ff67c9", + "sha256:1a61b54f87ab5786b8479f81c4b11f4d61702830354520837f8cc791ebba0f5f", + "sha256:1c1d72714f429a521d8d2d018badc42414c3077eb187a59579f28e4270b4b0fc", + "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8", + "sha256:20ec184af98a121fb2da42642dea8a29ec80fc3efbaefb86d8fdd2606619045d", + "sha256:21a0d3b115009ebb8ac3d2ebec5c2982cc693da935f4ab7bb5c8ebe2f47d36f2", + "sha256:224aaa38177597bb179f3ec87eeefcce8e4f85e608025e9cfac60de237ba6316", + "sha256:2679d2258b7f1192b378e2893a8a0a0ca472234d4c2c0e6bdd3380e8dfa21b6a", + "sha256:27a7860107500d813fcd203b4ea19b04babe79448268403172782754870dac25", + "sha256:290f2cc809f9da7d6d622550bbf4c1e57518212da51b6a30fe8e0a270a5b78bd", + "sha256:2e46773dc9f35a1dd28bd6981332fd7f27bec001a918a72a79b4133cf5291dba", + "sha256:3107c66e43bda25359d5ef446f59c497de2b5ed4c7fdba0894f8d6cf3822dafc", + "sha256:375b8dd15a1f5d2feafff536d47e22f69625c1aa92f12b339ec0b2ca40263273", + "sha256:45c566eb10b8967d71bf1ab8e4a525e5a93519e29ea071459ce517f6b903d7fa", + "sha256:499c3a1b0d6fc8213519e193796eb1a86a1be4b1877d678b30f83fd979811d1a", + "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b", + "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a", + "sha256:5178952973e588b3f1360868847334e9e3bf49d19e169bbbdfaf8398002419ae", + "sha256:52a2d8323a465f84faaba5236567d212c3668f2ab53e1c74c15583cf507a0291", + "sha256:598b4e238f13276e0008299bd2482003f48158e2b11826862b1eb2ad7c768b97", + "sha256:5bd2d3bdb846d757055910f0a59792d33b555800813c3b39ada1829c372ccb06", + "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904", + "sha256:5d203af30149ae339ad1b4f710d9844ed8796e97fda23ffbc4cc472968a47d0b", + "sha256:5ddbfd761ee00c12ee1be86c9c0683ecf5bb14c9772ddbd782085779a63dd55b", + "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8", + "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527", + "sha256:6619654954dc4936fcff82db8eb6401d3159ec6be81e33c6000dfd76ae189947", + "sha256:674629ff60030d144b7bca2b8330225a9b11c482ed408813924619c6f302fdbb", + "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003", + "sha256:6f4dba50cfa56f910241eb7f883c20f1e7b1d8f7d91c750cd0b318bad443f4d5", + "sha256:70fbbdacd1d271b77b7721fe3cdd2d537bbbd75d29e6300c672ec6bb38d9672f", + "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739", + "sha256:7326a1787e3c7b0429659e0a944725e1b03eeaa10edd945a86dead1913383944", + "sha256:73853108f56df97baf2bb8b522f3578221e56f646ba345a372c78326710d3830", + "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f", + "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3", + "sha256:8069c5179902dcdce0be9bfc8235347fdbac249d23bd90514b7a47a72d9fecf4", + "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84", + "sha256:8594f42df584e5b4bb9281799698403f7af489fba84c34d53d1c4bfb71b7c4e7", + "sha256:86510e3f5eca0ab87429dd77fafc04693195eec7fd6a137c389c3eeb4cfb77c6", + "sha256:8853a3bf12afddfdf15f57c4b02d7ded92c7a75a5d7331d19f4f9572a89c17e6", + "sha256:88a58d8ac0cc0e7f3a014509f0455248a76629ca9b604eca7dc5927cc593c5e9", + "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de", + "sha256:8c676b587da5673d3c75bd67dd2a8cdfeb282ca38a30f37950511766b26858c4", + "sha256:8ec4a89295cd6cd4d1058a5e6aec6bf51e0eaaf9714774e1bfac7cfc9051db47", + "sha256:94f3e1780abb45062287b4614a5bc0874519c86a777d4a7ad34978e86428b8dd", + "sha256:9a0f748eaa434a41fccf8e1ee7a3eed68af1b690e75328fd7a60af123c193b50", + "sha256:a5629742881bcbc1f42e840af185fd4d83a5edeb96475a575f4da50d6ede337c", + "sha256:a65149d8ada1055029fcb665452b2814fe7d7082fcb0c5bed6db851cb69b2086", + "sha256:b3c5ac4bed7519088103d9450a1107f76308ecf91d6dabc8a33a2fcfb18d0fba", + "sha256:b4fd7bd29610a83a8c9b564d457cf5bd92b4e11e79a4ee4716a63c959699b306", + "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699", + "sha256:c12b5ae868897c7338519c03049a806af85b9b8c237b7d675b8c5e089e4a618e", + "sha256:c26845094b1af3c91852745ae78e3ea47abf3dbcd1cf962f16b9a5fbe3ee8488", + "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa", + "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2", + "sha256:c8b2351c85d855293a299038e1f89db92a2f35e8d2f783489c6f0b2b5f3fe8a3", + "sha256:cb929ca942d0ec4fac404cbf520ee6cac37bf35be479b970c4ffadf2b6a1cad9", + "sha256:d2c0a187a92a1cb5ef2c8ed5412dd8d4334272617f532d4ad4de31e0495bd923", + "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2", + "sha256:daffdf51ee5db69a82dd127eabecce20729e21f7a3680cf7cbb23f0829189790", + "sha256:e58876c91f97b0952eb766123bfef372792ab3f4e3e1f1a2267834c2ab131734", + "sha256:eda2616eb2313cbb3eebbe51f19362eb434b18e3bb599466a1ffa76a033fb916", + "sha256:ee217c198f2e41f184f3869f3e485557296d505b5195c513b2bfe0062dc537f1", + "sha256:f02541ef64077f22bf4924f225c0fd1248c168f86e4b7abdedd87d6ebaceab0f", + "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798", + "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb", + "sha256:fbbcb7b57dc9c794843e3d1258c0fbf0f48656d46ffe9e09b63bbd6e8cd5d0a2", + "sha256:fcb4621042ac4b7865c179bb972ed0da0218a076dc1820ffc48b1d74c1e37fe9" ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", - "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb" - ], - "markers": "python_version >= '3.8'", - "version": "==4.3.6" + "markers": "python_version >= '3.9'", + "version": "==11.0.0" }, "prettytable": { "hashes": [ @@ -1763,7 +1697,6 @@ "sha256:aa17083feb6c71da11a68b2c213b04675c4af4ce9c541762632ca3f2cb3546dd" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.11.0" }, "prompt-toolkit": { @@ -1904,129 +1837,118 @@ "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.20.3" }, "psutil": { "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" + "sha256:000d1d1ebd634b4efb383f4034437384e44a6d455260aaee2eca1e9c1b55f047", + "sha256:045f00a43c737f960d273a83973b2511430d61f283a44c96bf13a6e829ba8fdc", + "sha256:0895b8414afafc526712c498bd9de2b063deaac4021a3b3c34566283464aff8e", + "sha256:1209036fbd0421afde505a4879dee3b2fd7b1e14fee81c0069807adcbbcca747", + "sha256:1ad45a1f5d0b608253b11508f80940985d1d0c8f6111b5cb637533a0e6ddc13e", + "sha256:353815f59a7f64cdaca1c0307ee13558a0512f6db064e92fe833784f08539c7a", + "sha256:498c6979f9c6637ebc3a73b3f87f9eb1ec24e1ce53a7c5173b8508981614a90b", + "sha256:5cd2bcdc75b452ba2e10f0e8ecc0b57b827dd5d7aaffbc6821b2a9a242823a76", + "sha256:6d3fbbc8d23fcdcb500d2c9f94e07b1342df8ed71b948a2649b5cb060a7c94ca", + "sha256:6e2dcd475ce8b80522e51d923d10c7871e45f20918e027ab682f94f1c6351688", + "sha256:9118f27452b70bb1d9ab3198c1f626c2499384935aaf55388211ad982611407e", + "sha256:9dcbfce5d89f1d1f2546a2090f4fcf87c7f669d1d90aacb7d7582addece9fb38", + "sha256:a8506f6119cff7015678e2bce904a4da21025cc70ad283a53b099e7620061d85", + "sha256:a8fb3752b491d246034fa4d279ff076501588ce8cbcdbb62c32fd7a377d996be", + "sha256:c0e0c00aa18ca2d3b2b991643b799a15fc8f0563d2ebb6040f64ce8dc027b942", + "sha256:d905186d647b16755a800e7263d43df08b790d709d575105d419f8b6ef65423a", + "sha256:ff34df86226c0227c52f38b919213157588a678d049688eded74c76c8ba4a5d0" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" + "version": "==6.1.0" }, "psycopg2": { "hashes": [ - "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981", - "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516", - "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3", - "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa", - "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a", - "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693", - "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372", - "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e", - "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59", - "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156", - "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024", - "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913", - "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c" + "sha256:0435034157049f6846e95103bd8f5a668788dd913a7c30162ca9503fdf542cb4", + "sha256:12ec0b40b0273f95296233e8750441339298e6a572f7039da5b260e3c8b60e11", + "sha256:47c4f9875125344f4c2b870e41b6aad585901318068acd01de93f3677a6522c2", + "sha256:4a579d6243da40a7b3182e0430493dbd55950c493d8c68f4eec0b302f6bbf20e", + "sha256:5df2b672140f95adb453af93a7d669d7a7bf0a56bcd26f1502329166f4a61716", + "sha256:65a63d7ab0e067e2cdb3cf266de39663203d38d6a8ed97f5ca0cb315c73fe067", + "sha256:88138c8dedcbfa96408023ea2b0c369eda40fe5d75002c0964c78f46f11fa442", + "sha256:9d5b3b94b79a844a986d029eee38998232451119ad653aea42bb9220a8c5066b", + "sha256:c6f7b8561225f9e711a9c47087388a97fdc948211c10a4bccbf0ba68ab7b3b5a" ], - "markers": "python_version >= '3.7'", - "version": "==2.9.9" + "markers": "python_version >= '3.8'", + "version": "==2.9.10" }, "psycopg2-binary": { "hashes": [ - "sha256:03ef7df18daf2c4c07e2695e8cfd5ee7f748a1d54d802330985a78d2a5a6dca9", - "sha256:0a602ea5aff39bb9fac6308e9c9d82b9a35c2bf288e184a816002c9fae930b77", - "sha256:0c009475ee389757e6e34611d75f6e4f05f0cf5ebb76c6037508318e1a1e0d7e", - "sha256:0ef4854e82c09e84cc63084a9e4ccd6d9b154f1dbdd283efb92ecd0b5e2b8c84", - "sha256:1236ed0952fbd919c100bc839eaa4a39ebc397ed1c08a97fc45fee2a595aa1b3", - "sha256:143072318f793f53819048fdfe30c321890af0c3ec7cb1dfc9cc87aa88241de2", - "sha256:15208be1c50b99203fe88d15695f22a5bed95ab3f84354c494bcb1d08557df67", - "sha256:1873aade94b74715be2246321c8650cabf5a0d098a95bab81145ffffa4c13876", - "sha256:18d0ef97766055fec15b5de2c06dd8e7654705ce3e5e5eed3b6651a1d2a9a152", - "sha256:1ea665f8ce695bcc37a90ee52de7a7980be5161375d42a0b6c6abedbf0d81f0f", - "sha256:2293b001e319ab0d869d660a704942c9e2cce19745262a8aba2115ef41a0a42a", - "sha256:246b123cc54bb5361588acc54218c8c9fb73068bf227a4a531d8ed56fa3ca7d6", - "sha256:275ff571376626195ab95a746e6a04c7df8ea34638b99fc11160de91f2fef503", - "sha256:281309265596e388ef483250db3640e5f414168c5a67e9c665cafce9492eda2f", - "sha256:2d423c8d8a3c82d08fe8af900ad5b613ce3632a1249fd6a223941d0735fce493", - "sha256:2e5afae772c00980525f6d6ecf7cbca55676296b580c0e6abb407f15f3706996", - "sha256:30dcc86377618a4c8f3b72418df92e77be4254d8f89f14b8e8f57d6d43603c0f", - "sha256:31a34c508c003a4347d389a9e6fcc2307cc2150eb516462a7a17512130de109e", - "sha256:323ba25b92454adb36fa425dc5cf6f8f19f78948cbad2e7bc6cdf7b0d7982e59", - "sha256:34eccd14566f8fe14b2b95bb13b11572f7c7d5c36da61caf414d23b91fcc5d94", - "sha256:3a58c98a7e9c021f357348867f537017057c2ed7f77337fd914d0bedb35dace7", - "sha256:3f78fd71c4f43a13d342be74ebbc0666fe1f555b8837eb113cb7416856c79682", - "sha256:4154ad09dac630a0f13f37b583eae260c6aa885d67dfbccb5b02c33f31a6d420", - "sha256:420f9bbf47a02616e8554e825208cb947969451978dceb77f95ad09c37791dae", - "sha256:4686818798f9194d03c9129a4d9a702d9e113a89cb03bffe08c6cf799e053291", - "sha256:57fede879f08d23c85140a360c6a77709113efd1c993923c59fde17aa27599fe", - "sha256:60989127da422b74a04345096c10d416c2b41bd7bf2a380eb541059e4e999980", - "sha256:64cf30263844fa208851ebb13b0732ce674d8ec6a0c86a4e160495d299ba3c93", - "sha256:68fc1f1ba168724771e38bee37d940d2865cb0f562380a1fb1ffb428b75cb692", - "sha256:6e6f98446430fdf41bd36d4faa6cb409f5140c1c2cf58ce0bbdaf16af7d3f119", - "sha256:729177eaf0aefca0994ce4cffe96ad3c75e377c7b6f4efa59ebf003b6d398716", - "sha256:72dffbd8b4194858d0941062a9766f8297e8868e1dd07a7b36212aaa90f49472", - "sha256:75723c3c0fbbf34350b46a3199eb50638ab22a0228f93fb472ef4d9becc2382b", - "sha256:77853062a2c45be16fd6b8d6de2a99278ee1d985a7bd8b103e97e41c034006d2", - "sha256:78151aa3ec21dccd5cdef6c74c3e73386dcdfaf19bced944169697d7ac7482fc", - "sha256:7f01846810177d829c7692f1f5ada8096762d9172af1b1a28d4ab5b77c923c1c", - "sha256:804d99b24ad523a1fe18cc707bf741670332f7c7412e9d49cb5eab67e886b9b5", - "sha256:81ff62668af011f9a48787564ab7eded4e9fb17a4a6a74af5ffa6a457400d2ab", - "sha256:8359bf4791968c5a78c56103702000105501adb557f3cf772b2c207284273984", - "sha256:83791a65b51ad6ee6cf0845634859d69a038ea9b03d7b26e703f94c7e93dbcf9", - "sha256:8532fd6e6e2dc57bcb3bc90b079c60de896d2128c5d9d6f24a63875a95a088cf", - "sha256:876801744b0dee379e4e3c38b76fc89f88834bb15bf92ee07d94acd06ec890a0", - "sha256:8dbf6d1bc73f1d04ec1734bae3b4fb0ee3cb2a493d35ede9badbeb901fb40f6f", - "sha256:8f8544b092a29a6ddd72f3556a9fcf249ec412e10ad28be6a0c0d948924f2212", - "sha256:911dda9c487075abd54e644ccdf5e5c16773470a6a5d3826fda76699410066fb", - "sha256:977646e05232579d2e7b9c59e21dbe5261f403a88417f6a6512e70d3f8a046be", - "sha256:9dba73be7305b399924709b91682299794887cbbd88e38226ed9f6712eabee90", - "sha256:a148c5d507bb9b4f2030a2025c545fccb0e1ef317393eaba42e7eabd28eb6041", - "sha256:a6cdcc3ede532f4a4b96000b6362099591ab4a3e913d70bcbac2b56c872446f7", - "sha256:ac05fb791acf5e1a3e39402641827780fe44d27e72567a000412c648a85ba860", - "sha256:b0605eaed3eb239e87df0d5e3c6489daae3f7388d455d0c0b4df899519c6a38d", - "sha256:b58b4710c7f4161b5e9dcbe73bb7c62d65670a87df7bcce9e1faaad43e715245", - "sha256:b6356793b84728d9d50ead16ab43c187673831e9d4019013f1402c41b1db9b27", - "sha256:b76bedd166805480ab069612119ea636f5ab8f8771e640ae103e05a4aae3e417", - "sha256:bc7bb56d04601d443f24094e9e31ae6deec9ccb23581f75343feebaf30423359", - "sha256:c2470da5418b76232f02a2fcd2229537bb2d5a7096674ce61859c3229f2eb202", - "sha256:c332c8d69fb64979ebf76613c66b985414927a40f8defa16cf1bc028b7b0a7b0", - "sha256:c6af2a6d4b7ee9615cbb162b0738f6e1fd1f5c3eda7e5da17861eacf4c717ea7", - "sha256:c77e3d1862452565875eb31bdb45ac62502feabbd53429fdc39a1cc341d681ba", - "sha256:ca08decd2697fdea0aea364b370b1249d47336aec935f87b8bbfd7da5b2ee9c1", - "sha256:ca49a8119c6cbd77375ae303b0cfd8c11f011abbbd64601167ecca18a87e7cdd", - "sha256:cb16c65dcb648d0a43a2521f2f0a2300f40639f6f8c1ecbc662141e4e3e1ee07", - "sha256:d2997c458c690ec2bc6b0b7ecbafd02b029b7b4283078d3b32a852a7ce3ddd98", - "sha256:d3f82c171b4ccd83bbaf35aa05e44e690113bd4f3b7b6cc54d2219b132f3ae55", - "sha256:dc4926288b2a3e9fd7b50dc6a1909a13bbdadfc67d93f3374d984e56f885579d", - "sha256:ead20f7913a9c1e894aebe47cccf9dc834e1618b7aa96155d2091a626e59c972", - "sha256:ebdc36bea43063116f0486869652cb2ed7032dbc59fbcb4445c4862b5c1ecf7f", - "sha256:ed1184ab8f113e8d660ce49a56390ca181f2981066acc27cf637d5c1e10ce46e", - "sha256:ee825e70b1a209475622f7f7b776785bd68f34af6e7a46e2e42f27b659b5bc26", - "sha256:f7ae5d65ccfbebdfa761585228eb4d0df3a8b15cfb53bd953e713e09fbb12957", - "sha256:f7fc5a5acafb7d6ccca13bfa8c90f8c51f13d8fb87d95656d3950f0158d3ce53", - "sha256:f9b5571d33660d5009a8b3c25dc1db560206e2d2f89d3df1cb32d72c0d117d52" + "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff", + "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5", + "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f", + "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5", + "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0", + "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c", + "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c", + "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341", + "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f", + "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7", + "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d", + "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007", + "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92", + "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb", + "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5", + "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5", + "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8", + "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1", + "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68", + "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73", + "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1", + "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53", + "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d", + "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906", + "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0", + "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2", + "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a", + "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b", + "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44", + "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648", + "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7", + "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f", + "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa", + "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697", + "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d", + "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b", + "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526", + "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4", + "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287", + "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e", + "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673", + "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0", + "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30", + "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3", + "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e", + "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92", + "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a", + "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c", + "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8", + "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909", + "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47", + "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864", + "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc", + "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00", + "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb", + "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539", + "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b", + "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481", + "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5", + "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4", + "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64", + "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392", + "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4", + "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1", + "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1", + "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567", + "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863" ], - "markers": "python_version >= '3.7'", - "version": "==2.9.9" + "markers": "python_version >= '3.8'", + "version": "==2.9.10" }, "pycparser": { "hashes": [ @@ -2080,7 +2002,6 @@ "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.9.2" }, "pydantic-core": { @@ -2186,13 +2107,13 @@ "markers": "python_version >= '3.8'", "version": "==2.18.0" }, - "pyopenssl": { + "pyjwt": { "hashes": [ - "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", - "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d" + "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", + "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" ], - "markers": "python_version >= '3.7'", - "version": "==24.2.1" + "markers": "python_version >= '3.8'", + "version": "==2.9.0" }, "pysam": { "hashes": [ @@ -2225,24 +2146,14 @@ "sha256:faa5298291b54f185c7b8f84510224918bddc64bbdcb2e8426ff43e83452310f" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==0.22.1" }, - "pysaml2": { - "hashes": [ - "sha256:bc6627cc344476a83c757f440a73fda1369f13b6fda1b4e16bca63ffbabb5318", - "sha256:f36871d4e5ee857c6b85532e942550d2cf90ea4ee943d75eb681044bbc4f54f7" - ], - "markers": "python_version >= '3.9' and python_version < '4.0'", - "version": "==7.5.0" - }, "python-dateutil": { "hashes": [ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "python-dotenv": { @@ -2251,9 +2162,15 @@ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.0.1" }, + "python3-openid": { + "hashes": [ + "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf", + "sha256:6626f771e0417486701e0b4daff762e7212e820ca5b29fcc0d05f6f8736dfa6b" + ], + "version": "==3.2.0" + }, "pytz": { "hashes": [ "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", @@ -2318,7 +2235,6 @@ "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.0.2" }, "redis": { @@ -2327,7 +2243,6 @@ "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==5.1.1" }, "referencing": { @@ -2444,7 +2359,6 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "requests-http-signature": { @@ -2455,13 +2369,20 @@ "index": "pypi", "version": "==0.2.0" }, + "requests-oauthlib": { + "hashes": [ + "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + ], + "markers": "python_version >= '3.4'", + "version": "==2.0.0" + }, "rich": { "hashes": [ "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c", "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==13.9.2" }, "rpds-py": { @@ -2586,7 +2507,6 @@ "sha256:7a2025d60d5b1a6025726b3a5e292a8e5aa713abc3b16fd1f81735181f7bb282" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2024.10.0" }, "sentry-sdk": { @@ -2595,16 +2515,15 @@ "sha256:dd0a05352b78ffeacced73a94e86f38b32e2eae15fff5f30ca5abb568a72eacf" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==2.17.0" }, "setuptools": { "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" + "markers": "python_version >= '3.8'", + "version": "==70.0.0" }, "simplejson": { "hashes": [ @@ -2720,7 +2639,6 @@ "sha256:ff7bc1bbdaa3e487c9469128bf39408e91f5573901cb852e03af378d3582c52d" ], "index": "pypi", - "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2'", "version": "==3.19.3" }, "six": { @@ -2728,7 +2646,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==1.16.0" }, "sniffio": { @@ -2746,6 +2664,22 @@ ], "version": "==2.2.0" }, + "social-auth-app-django": { + "hashes": [ + "sha256:0c041a31707921aef9a930f143183c65d8c7b364381364a50f3f7c6fcc9d62f6", + "sha256:c8832c6cf13da6ad76f5613bcda2647d89ae7cfbc5217fadd13477a3406feaa8" + ], + "markers": "python_version >= '3.8'", + "version": "==5.4.2" + }, + "social-auth-core": { + "hashes": [ + "sha256:33cf970a623c442376f9d4a86fb187579e4438649daa5b5be993d05e74d7b2db", + "sha256:d3dbeb0999ffd0e68aa4bd73f2ac698a18133fd11b3fc890e1366f18c8889fac" + ], + "markers": "python_version >= '3.8'", + "version": "==4.5.4" + }, "sortedcontainers": { "hashes": [ "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", @@ -2763,11 +2697,11 @@ }, "sphinx": { "hashes": [ - "sha256:6d56a34697bb749ffa0152feafc4b19836c755d90a7c59b72bc7dfd371b9cc6b", - "sha256:97787ff1fa3256a3eef9eda523a63dbf299f7b47e053cfcf684a1c2a8380c912" + "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560", + "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5" ], - "markers": "python_version >= '3.8'", - "version": "==6.2.1" + "markers": "python_version >= '3.9'", + "version": "==7.2.6" }, "sphinx-jsonschema": { "hashes": [ @@ -2778,11 +2712,11 @@ }, "sphinx-rtd-theme": { "hashes": [ - "sha256:01c5c5a72e2d025bd23d1f06c59a4831b06e6ce6c01fdd5ebfe9986c0a880fc7", - "sha256:6a7e7d8af34eb8fc57d52a09c6b6b9c46ff44aea5951bc831eeb9245378f3689" + "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", + "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.2.2" + "markers": "python_version >= '3.6'", + "version": "==2.0.0" }, "sphinxcontrib-applehelp": { "hashes": [ @@ -2888,7 +2822,6 @@ "sha256:fc9ffd9a38e21fad3e8c5a88926d57f94a32546e937e0be46142b2702003eba7" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.4.54" }, "sqlparse": { @@ -2897,7 +2830,6 @@ "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.5.1" }, "tabulate": { @@ -2914,24 +2846,14 @@ "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], "index": "pypi", - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "version": "==0.10.2" }, - "tomli": { - "hashes": [ - "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38", - "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.2" - }, "tqdm": { "hashes": [ "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd", "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.66.5" }, "typing-extensions": { @@ -2939,7 +2861,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==4.12.2" }, "tzdata": { @@ -2963,7 +2885,6 @@ "sha256:ea5d4fb8178c2ab469cf4fa46d0ceb16ccb378da46dbbc28a8b9c1eebdccc655" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.2.5" }, "uritemplate": { @@ -2991,11 +2912,11 @@ }, "versioneer": { "hashes": [ - "sha256:11ffc09427ac99db4ce61bdc85785dae819618d0de28153adfce3085956125a8", - "sha256:7175ca8e7bb4dd0e3c9779dd2745e5b4a6036304af3f5e50bd896f10196586d6" + "sha256:0f1a137bb5d6811e96a79bb0486798aeae9b9c6efc24b389659cebb0ee396cb9", + "sha256:5ab283b9857211d61b53318b7c792cf68e798e765ee17c27ade9f6c924235731" ], "markers": "python_version >= '3.7'", - "version": "==0.28" + "version": "==0.29" }, "vine": { "hashes": [ @@ -3014,11 +2935,11 @@ }, "wheel": { "hashes": [ - "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873", - "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247" + "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d", + "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8" ], "markers": "python_version >= '3.7'", - "version": "==0.40.0" + "version": "==0.42.0" }, "wrapt": { "hashes": [ @@ -3094,7 +3015,6 @@ "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.16.0" }, "xlsxwriter": { @@ -3103,17 +3023,8 @@ "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.0" }, - "xmlschema": { - "hashes": [ - "sha256:4f7497de6c8b6dc2c28ad7b9ed6e21d186f4afe248a5bea4f54eedab4da44083", - "sha256:ec2b2a15c8896c1fcd14dcee34ca30032b99456c3c43ce793fdb9dca2fb4b869" - ], - "markers": "python_version >= '3.7'", - "version": "==2.5.1" - }, "xmltodict": { "hashes": [ "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56", @@ -3124,91 +3035,91 @@ }, "yarl": { "hashes": [ - "sha256:00bb3a559d7bd006a5302ecd7e409916939106a8cdbe31f4eb5e5b9ffcca57ea", - "sha256:0327081978fe186c3390dd4f73f95f825d0bb9c74967e22c2a1a87735974d8f5", - "sha256:041bafaa82b77fd4ec2826d42a55461ec86d999adf7ed9644eef7e8a9febb366", - "sha256:06ec070a2d71415f90dbe9d70af3158e7da97a128519dba2d1581156ee27fb92", - "sha256:07a4b53abe85813c538b9cdbb02909ebe3734e3af466a587df516e960d500cc8", - "sha256:0a843e692f9d5402b3455653f4607dc521de2385f01c5cad7ba4a87c46e2ea8d", - "sha256:10bfe0bef4cf5ea0383886beda004071faadedf2647048b9f876664284c5b60d", - "sha256:18940191ec9a83bbfe63eea61c3e9d12474bb910d5613bce8fa46e84a80b75b2", - "sha256:19e2a4b2935f95fad0949f420514c5d862f5f18058fbbfd8854f496a97d9fd87", - "sha256:1a6b6e95bc621c11cf9ff21012173337e789f2461ebc3b4e5bf65c74ef69adb8", - "sha256:1f5a1ca6eaabfe62718b87eac06d9a47b30cf92ffa065fee9196d3ecd24a3cf1", - "sha256:21050b6cd569980fe20ceeab4baeb900d3f7247270475e42bafe117416a5496c", - "sha256:2597a589859b94d0a5e2f5d30fee95081867926e57cb751f8b44a7dd92da4e79", - "sha256:294c742a273f44511f14b03a9e06b66094dcdf4bbb75a5e23fead548fd5310ae", - "sha256:2eeb9ba53c055740cd282ae9d34eb7970d65e73a46f15adec4b0c1b0f2e55cc2", - "sha256:30ca64521f1a96b72886dd9e8652f16eab11891b4572dcfcfc1ad6d6ccb27abd", - "sha256:325e2beb2cd8654b276e7686a3cd203628dd3fe32d5c616e632bc35a2901fb16", - "sha256:34816f1d833433a16c4832562a050b0a60eac53dcb71b2032e6ebff82d74b6a7", - "sha256:362da97ad4360e4ef1dd24ccdd3bceb18332da7f40026a42f49b7edd686e31c3", - "sha256:3b30f13fac56598474071a4f1ecd66c78fdaf2f8619042d7ca135f72dbb348cf", - "sha256:44088ec0be82fba118ed29b6b429f80bf295297727adae4c257ac297e01e8bcd", - "sha256:44359c52af9c383e5107f3b6301446fc8269599721fa42fafb2afb5f31a42dcb", - "sha256:4ac83b307cc4b8907345b52994055c6c3c2601ceb6fcb94c5ed6a93c6b4e8257", - "sha256:5093a453176a4fad4f9c3006f507cf300546190bb3e27944275a37cfd6323a65", - "sha256:524b3bb7dff320e305bc979c65eddc0342548c56ea9241502f907853fe53c408", - "sha256:5848500b6a01497560969e8c3a7eb1b2570853c74a0ca6f67ebaf6064106c49b", - "sha256:5882faa2a6e684f65ee44f18c701768749a950cbd5e72db452fc07805f6bdec0", - "sha256:5b8af4165e097ff84d9bbb97bb4f4d7f71b9c1c9565a2d0e27d93e5f92dae220", - "sha256:5c3ac5bdcc1375c8ee52784adf94edbce37c471dd2100a117cfef56fe8dbc2b4", - "sha256:5d6be369488d503c8edc14e2f63d71ab2a607041ad216a8ad444fa18e8dea792", - "sha256:5fadcf532fd9f6cbad71485ef8c2462dd9a91d3efc72ca01eb0970792c92552a", - "sha256:607683991bab8607e5158cd290dd8fdaa613442aeab802fe1c237d3a3eee7358", - "sha256:625f31d6650829fba4030b4e7bdb2d69e41510dddfa29a1da27076c199521757", - "sha256:63d46606b20f80a6476f1044bab78e1a69c2e0747f174583e2f12fc70bad2170", - "sha256:6493da9ba5c551978c679ab04856c2cf8f79c316e8ec8c503460a135705edc3b", - "sha256:6563394492c96cb57f4dff0c69c63d2b28b5469c59c66f35a1e6451583cd0ab4", - "sha256:68d21d0563d82aaf46163eac529adac301b20be3181b8a2811f7bd5615466055", - "sha256:68e837b3edfcd037f9706157e7cb8efda832de6248c7d9e893e2638356dfae5d", - "sha256:6b3d2767bd64c62909ea33525b954ba05c8f9726bfdf2141d175da4e344f19ae", - "sha256:6e2c674cfe4c03ad7a4d536b1f808221f0d11a360486b4b032d2557c0bd633ad", - "sha256:70d074d5a96e0954fe6db81ff356f4361397da1cda3f7c127fc0902f671a087e", - "sha256:71730658be0b5de7c570a9795d7404c577b2313c1db370407092c66f70e04ccb", - "sha256:73143dd279e641543da52c55652ad7b4c7c5f79e797f124f58f04cc060f14271", - "sha256:75d04ba8ed335042328086e643e01165e0c24598216f72da709b375930ae3bdb", - "sha256:7825506fbee4055265528ec3532a8197ff26fc53d4978917a4c8ddbb4c1667d7", - "sha256:7983290ede3aaa2c9620879530849532529b4dcbf5b12a0b6a91163a773eadb9", - "sha256:7abd7d15aedb3961a967cc65f8144dbbca42e3626a21c5f4f29919cf43eeafb9", - "sha256:8249147ee81c1cf4d1dc6f26ba28a1b9d92751529f83c308ad02164bb93abd0d", - "sha256:86648c53b10c53db8b967a75fb41e0c89dbec7398f6525e34af2b6c456bb0ac0", - "sha256:8669a110f655c9eb22f16fb68a7d4942020aeaa09f1def584a80183e3e89953c", - "sha256:8b7dd6983c81523f9de0ae6334c3b7a3cb33283936e0525f80c4f713f54a9bb6", - "sha256:8fc727f0fb388debc771eaa7091c092bd2e8b6b4741b73354b8efadcf96d6031", - "sha256:9162ea117ce8bad8ebc95b7376b4135988acd888d2cf4702f8281e3c11f8b81f", - "sha256:94189746c5ad62e1014a16298130e696fe593d031d442ef135fb7787b7a1f820", - "sha256:94ab1185900f43760d5487c8e49f5f1a66f864e36092f282f1813597479b9dfa", - "sha256:96ce879799fee124d241ea3b84448378f638e290c49493d00b706f3fd57ec22b", - "sha256:9aa054d97033beac9cb9b19b7c0b8784b85b12cd17879087ca6bffba57884e02", - "sha256:9c2d1109c8d92059314cc34dd8f0a31f74b720dc140744923ed7ca228bf9b491", - "sha256:a082dc948045606f62dca0228ab24f13737180b253378d6443f5b2b9ef8beefe", - "sha256:a7d317fb80bc17ed4b34a9aad8b80cef34bea0993654f3e8566daf323def7ef9", - "sha256:b06d8b05d0fafef204d635a4711283ddbf19c7c0facdc61b4b775f6e47e2d4be", - "sha256:b1217102a455e3ac9ac293081093f21f0183e978c7692171ff669fee5296fa28", - "sha256:b6c57972a406ea0f61e3f28f2b3a780fb71fbe1d82d267afe5a2f889a83ee7e7", - "sha256:b997a806846c00d1f41d6a251803732837771b2091bead7566f68820e317bfe7", - "sha256:bb129f77ddaea2d8e6e00417b8d907448de3407af4eddacca0a515574ad71493", - "sha256:bb707859218e8335447b210f41a755e7b1367c33e87add884128bba144694a7f", - "sha256:c166ad987265bb343be58cdf4fbc4478cc1d81f2246d2be9a15f94393b269faa", - "sha256:c884dfa56b050f718ea3cbbfd972e29a6f07f63a7449b10d9a20d64f7eec92e2", - "sha256:cbf36099a9b407e1456dbf55844743a98603fcba32d2a46fb3a698d926facf1b", - "sha256:cd529e637cd23204bd82072f6637cff7af2516ad2c132e8f3342cbc84871f7d1", - "sha256:d3309ee667f2d9c7ac9ecf44620d6b274bfdd8065b8c5019ff6795dd887b8fed", - "sha256:d56980374a10c74255fcea6ebcfb0aeca7166d212ee9fd7e823ddef35fb62ad0", - "sha256:d7fa4b033e2f267e37aabcc36949fa89f9f1716a723395912147f9cf3fb437c7", - "sha256:da48cdff56b01ea4282a6d04b83b07a2088351a4a3ff7aacc1e7e9b6b04b90b9", - "sha256:de6917946dc6bc237d4b354e38aa13a232e0c7948fdbdb160edee3862e9d735f", - "sha256:e27861251d9c094f641d39a8a78dd2371fb9a252ea2f689d1ad353a31d46a0bc", - "sha256:e652aa9f8dfa808bc5b2da4d1f4e286cf1d640570fdfa72ffc0c1d16ba114651", - "sha256:e8aa19c39cb20bfb16f0266df175a6004943122cf20707fbf0cacc21f6468a25", - "sha256:ed9c72d5361cfd5af5ccadffa8f8077f4929640e1f938aa0f4b92c5a24996ac5", - "sha256:f7de0d4b6b4d8a77e422eb54d765255c0ec6883ee03b8fd537101633948619d7", - "sha256:fcfd663dc88465ebe41c7c938bdc91c4b01cda96a0d64bf38fd66c1877323771", - "sha256:fd56de8b645421ff09c993fdb0ee9c5a3b50d290a8f55793b500d99b34d0c1ce" + "sha256:019f5d58093402aa8f6661e60fd82a28746ad6d156f6c5336a70a39bd7b162b9", + "sha256:0fd9c227990f609c165f56b46107d0bc34553fe0387818c42c02f77974402c36", + "sha256:1208ca14eed2fda324042adf8d6c0adf4a31522fa95e0929027cd487875f0240", + "sha256:122d8e7986043d0549e9eb23c7fd23be078be4b70c9eb42a20052b3d3149c6f2", + "sha256:147b0fcd0ee33b4b5f6edfea80452d80e419e51b9a3f7a96ce98eaee145c1581", + "sha256:178ccb856e265174a79f59721031060f885aca428983e75c06f78aa24b91d929", + "sha256:1a5cf32539373ff39d97723e39a9283a7277cbf1224f7aef0c56c9598b6486c3", + "sha256:1a5e9d8ce1185723419c487758d81ac2bde693711947032cce600ca7c9cda7d6", + "sha256:1bc22e00edeb068f71967ab99081e9406cd56dbed864fc3a8259442999d71552", + "sha256:1cf936ba67bc6c734f3aa1c01391da74ab7fc046a9f8bbfa230b8393b90cf472", + "sha256:234f3a3032b505b90e65b5bc6652c2329ea7ea8855d8de61e1642b74b4ee65d2", + "sha256:26768342f256e6e3c37533bf9433f5f15f3e59e3c14b2409098291b3efaceacb", + "sha256:27e11db3f1e6a51081a981509f75617b09810529de508a181319193d320bc5c7", + "sha256:2bd6a51010c7284d191b79d3b56e51a87d8e1c03b0902362945f15c3d50ed46b", + "sha256:2f1fe2b2e3ee418862f5ebc0c0083c97f6f6625781382f828f6d4e9b614eba9b", + "sha256:32468f41242d72b87ab793a86d92f885355bcf35b3355aa650bfa846a5c60058", + "sha256:35b4f7842154176523e0a63c9b871168c69b98065d05a4f637fce342a6a2693a", + "sha256:38fec8a2a94c58bd47c9a50a45d321ab2285ad133adefbbadf3012c054b7e656", + "sha256:3a91654adb7643cb21b46f04244c5a315a440dcad63213033826549fa2435f71", + "sha256:3ab3ed42c78275477ea8e917491365e9a9b69bb615cb46169020bd0aa5e2d6d3", + "sha256:3d375a19ba2bfe320b6d873f3fb165313b002cef8b7cc0a368ad8b8a57453837", + "sha256:4199db024b58a8abb2cfcedac7b1292c3ad421684571aeb622a02f242280e8d6", + "sha256:4f32c4cb7386b41936894685f6e093c8dfaf0960124d91fe0ec29fe439e201d0", + "sha256:4ffb7c129707dd76ced0a4a4128ff452cecf0b0e929f2668ea05a371d9e5c104", + "sha256:504e1fe1cc4f170195320eb033d2b0ccf5c6114ce5bf2f617535c01699479bca", + "sha256:542fa8e09a581bcdcbb30607c7224beff3fdfb598c798ccd28a8184ffc18b7eb", + "sha256:5570e6d47bcb03215baf4c9ad7bf7c013e56285d9d35013541f9ac2b372593e7", + "sha256:571f781ae8ac463ce30bacebfaef2c6581543776d5970b2372fbe31d7bf31a07", + "sha256:595ca5e943baed31d56b33b34736461a371c6ea0038d3baec399949dd628560b", + "sha256:5b8e265a0545637492a7e12fd7038370d66c9375a61d88c5567d0e044ded9202", + "sha256:5b9101f528ae0f8f65ac9d64dda2bb0627de8a50344b2f582779f32fda747c1d", + "sha256:5ff96da263740779b0893d02b718293cc03400c3a208fc8d8cd79d9b0993e532", + "sha256:621280719c4c5dad4c1391160a9b88925bb8b0ff6a7d5af3224643024871675f", + "sha256:62c7da0ad93a07da048b500514ca47b759459ec41924143e2ddb5d7e20fd3db5", + "sha256:649bddcedee692ee8a9b7b6e38582cb4062dc4253de9711568e5620d8707c2a3", + "sha256:66ea8311422a7ba1fc79b4c42c2baa10566469fe5a78500d4e7754d6e6db8724", + "sha256:676d96bafc8c2d0039cea0cd3fd44cee7aa88b8185551a2bb93354668e8315c2", + "sha256:707ae579ccb3262dfaef093e202b4c3fb23c3810e8df544b1111bd2401fd7b09", + "sha256:7118bdb5e3ed81acaa2095cba7ec02a0fe74b52a16ab9f9ac8e28e53ee299732", + "sha256:789a3423f28a5fff46fbd04e339863c169ece97c827b44de16e1a7a42bc915d2", + "sha256:7ace71c4b7a0c41f317ae24be62bb61e9d80838d38acb20e70697c625e71f120", + "sha256:7c7c30fb38c300fe8140df30a046a01769105e4cf4282567a29b5cdb635b66c4", + "sha256:7d7aaa8ff95d0840e289423e7dc35696c2b058d635f945bf05b5cd633146b027", + "sha256:7f8713717a09acbfee7c47bfc5777e685539fefdd34fa72faf504c8be2f3df4e", + "sha256:858728086914f3a407aa7979cab743bbda1fe2bdf39ffcd991469a370dd7414d", + "sha256:8791d66d81ee45866a7bb15a517b01a2bcf583a18ebf5d72a84e6064c417e64b", + "sha256:87dd10bc0618991c66cee0cc65fa74a45f4ecb13bceec3c62d78ad2e42b27a16", + "sha256:8994c42f4ca25df5380ddf59f315c518c81df6a68fed5bb0c159c6cb6b92f120", + "sha256:8a0296040e5cddf074c7f5af4a60f3fc42c0237440df7bcf5183be5f6c802ed5", + "sha256:8b37d5ec034e668b22cf0ce1074d6c21fd2a08b90d11b1b73139b750a8b0dd97", + "sha256:8c42998fd1cbeb53cd985bff0e4bc25fbe55fd6eb3a545a724c1012d69d5ec84", + "sha256:8f639e3f5795a6568aa4f7d2ac6057c757dcd187593679f035adbf12b892bb00", + "sha256:921b81b8d78f0e60242fb3db615ea3f368827a76af095d5a69f1c3366db3f596", + "sha256:995d0759004c08abd5d1b81300a91d18c8577c6389300bed1c7c11675105a44d", + "sha256:99a9dcd4b71dd5f5f949737ab3f356cfc058c709b4f49833aeffedc2652dac56", + "sha256:9a91217208306d82357c67daeef5162a41a28c8352dab7e16daa82e3718852a7", + "sha256:a5ace0177520bd4caa99295a9b6fb831d0e9a57d8e0501a22ffaa61b4c024283", + "sha256:a5b6c09b9b4253d6a208b0f4a2f9206e511ec68dce9198e0fbec4f160137aa67", + "sha256:a9394c65ae0ed95679717d391c862dece9afacd8fa311683fc8b4362ce8a410c", + "sha256:aa7943f04f36d6cafc0cf53ea89824ac2c37acbdb4b316a654176ab8ffd0f968", + "sha256:ab2b2ac232110a1fdb0d3ffcd087783edd3d4a6ced432a1bf75caf7b7be70916", + "sha256:ad7a852d1cd0b8d8b37fc9d7f8581152add917a98cfe2ea6e241878795f917ae", + "sha256:b140e532fe0266003c936d017c1ac301e72ee4a3fd51784574c05f53718a55d8", + "sha256:b439cae82034ade094526a8f692b9a2b5ee936452de5e4c5f0f6c48df23f8604", + "sha256:b6f687ced5510a9a2474bbae96a4352e5ace5fa34dc44a217b0537fec1db00b4", + "sha256:b9ca7b9147eb1365c8bab03c003baa1300599575effad765e0b07dd3501ea9af", + "sha256:bdcf667a5dec12a48f669e485d70c54189f0639c2157b538a4cffd24a853624f", + "sha256:cdcffe1dbcb4477d2b4202f63cd972d5baa155ff5a3d9e35801c46a415b7f71a", + "sha256:d1aab176dd55b59f77a63b27cffaca67d29987d91a5b615cbead41331e6b7428", + "sha256:d1b0796168b953bca6600c5f97f5ed407479889a36ad7d17183366260f29a6b9", + "sha256:d3f1cc3d3d4dc574bebc9b387f6875e228ace5748a7c24f49d8f01ac1bc6c31b", + "sha256:d743e3118b2640cef7768ea955378c3536482d95550222f908f392167fe62059", + "sha256:d8643975a0080f361639787415a038bfc32d29208a4bf6b783ab3075a20b1ef3", + "sha256:d9525f03269e64310416dbe6c68d3b23e5d34aaa8f47193a1c45ac568cecbc49", + "sha256:de6c14dd7c7c0badba48157474ea1f03ebee991530ba742d381b28d4f314d6f3", + "sha256:e49e0fd86c295e743fd5be69b8b0712f70a686bc79a16e5268386c2defacaade", + "sha256:e6980a558d8461230c457218bd6c92dfc1d10205548215c2c21d79dc8d0a96f3", + "sha256:e8be3aff14f0120ad049121322b107f8a759be76a6a62138322d4c8a337a9e2c", + "sha256:e9951afe6557c75a71045148890052cb942689ee4c9ec29f5436240e1fcc73b7", + "sha256:ed097b26f18a1f5ff05f661dc36528c5f6735ba4ce8c9645e83b064665131349", + "sha256:f1d1f45e3e8d37c804dca99ab3cf4ab3ed2e7a62cd82542924b14c0a4f46d243", + "sha256:fe8bba2545427418efc1929c5c42852bdb4143eb8d0a46b09de88d1fe99258e7" ], "markers": "python_version >= '3.9'", - "version": "==1.15.5" + "version": "==1.16.0" } }, "develop": { @@ -3225,37 +3136,35 @@ "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==24.2.0" }, "black": { "hashes": [ - "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6", - "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e", - "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f", - "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018", - "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e", - "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd", - "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4", - "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed", - "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2", - "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42", - "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af", - "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb", - "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368", - "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb", - "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af", - "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed", - "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47", - "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2", - "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a", - "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c", - "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920", - "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1" + "sha256:14b3502784f09ce2443830e3133dacf2c0110d45191ed470ecb04d0f5f6fcb0f", + "sha256:17374989640fbca88b6a448129cd1745c5eb8d9547b464f281b251dd00155ccd", + "sha256:1c536fcf674217e87b8cc3657b81809d3c085d7bf3ef262ead700da345bfa6ea", + "sha256:1cbacacb19e922a1d75ef2b6ccaefcd6e93a2c05ede32f06a21386a04cedb981", + "sha256:1f93102e0c5bb3907451063e08b9876dbeac810e7da5a8bfb7aeb5a9ef89066b", + "sha256:2cd9c95431d94adc56600710f8813ee27eea544dd118d45896bb734e9d7a0dc7", + "sha256:30d2c30dc5139211dda799758559d1b049f7f14c580c409d6ad925b74a4208a8", + "sha256:394d4ddc64782e51153eadcaaca95144ac4c35e27ef9b0a42e121ae7e57a9175", + "sha256:3bb2b7a1f7b685f85b11fed1ef10f8a9148bceb49853e47a294a3dd963c1dd7d", + "sha256:4007b1393d902b48b36958a216c20c4482f601569d19ed1df294a496eb366392", + "sha256:5a2221696a8224e335c28816a9d331a6c2ae15a2ee34ec857dcf3e45dbfa99ad", + "sha256:63f626344343083322233f175aaf372d326de8436f5928c042639a4afbbf1d3f", + "sha256:649fff99a20bd06c6f727d2a27f401331dc0cc861fb69cde910fe95b01b5928f", + "sha256:680359d932801c76d2e9c9068d05c6b107f2584b2a5b88831c83962eb9984c1b", + "sha256:846ea64c97afe3bc677b761787993be4991810ecc7a4a937816dd6bddedc4875", + "sha256:b5e39e0fae001df40f95bd8cc36b9165c5e2ea88900167bddf258bacef9bbdc3", + "sha256:ccfa1d0cb6200857f1923b602f978386a3a2758a65b52e0950299ea014be6800", + "sha256:d37d422772111794b26757c5b55a3eade028aa3fde43121ab7b673d050949d65", + "sha256:ddacb691cdcdf77b96f549cf9591701d8db36b2f19519373d60d31746068dbf2", + "sha256:e6668650ea4b685440857138e5fe40cde4d652633b1bdffc62933d0db4ed9812", + "sha256:f9da3333530dbcecc1be13e69c250ed8dfa67f43c4005fb537bb426e19200d50", + "sha256:fe4d6476887de70546212c99ac9bd803d90b42fc4767f058a0baa895013fbb3e" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.8.0" + "version": "==24.10.0" }, "certifi": { "hashes": [ @@ -3267,99 +3176,114 @@ }, "charset-normalizer": { "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + "sha256:0099d79bdfcf5c1f0c2c72f91516702ebf8b0b8ddd8905f97a8aecf49712c621", + "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", + "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", + "sha256:0b309d1747110feb25d7ed6b01afdec269c647d382c857ef4663bbe6ad95a912", + "sha256:0d99dd8ff461990f12d6e42c7347fd9ab2532fb70e9621ba520f9e8637161d7c", + "sha256:0de7b687289d3c1b3e8660d0741874abe7888100efe14bd0f9fd7141bcbda92b", + "sha256:1110e22af8ca26b90bd6364fe4c763329b0ebf1ee213ba32b68c73de5752323d", + "sha256:130272c698667a982a5d0e626851ceff662565379baf0ff2cc58067b81d4f11d", + "sha256:136815f06a3ae311fae551c3df1f998a1ebd01ddd424aa5603a4336997629e95", + "sha256:14215b71a762336254351b00ec720a8e85cada43b987da5a042e4ce3e82bd68e", + "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", + "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", + "sha256:2006769bd1640bdf4d5641c69a3d63b71b81445473cac5ded39740a226fa88ab", + "sha256:20587d20f557fe189b7947d8e7ec5afa110ccf72a3128d61a2a387c3313f46be", + "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", + "sha256:27623ba66c183eca01bf9ff833875b459cad267aeeb044477fedac35e19ba907", + "sha256:285e96d9d53422efc0d7a17c60e59f37fbf3dfa942073f666db4ac71e8d726d0", + "sha256:2de62e8801ddfff069cd5c504ce3bc9672b23266597d4e4f50eda28846c322f2", + "sha256:2f6c34da58ea9c1a9515621f4d9ac379871a8f21168ba1b5e09d74250de5ad62", + "sha256:309a7de0a0ff3040acaebb35ec45d18db4b28232f21998851cfa709eeff49d62", + "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", + "sha256:3710a9751938947e6327ea9f3ea6332a09bf0ba0c09cae9cb1f250bd1f1549bc", + "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", + "sha256:40d3ff7fc90b98c637bda91c89d51264a3dcf210cade3a2c6f838c7268d7a4ca", + "sha256:425c5f215d0eecee9a56cdb703203dda90423247421bf0d67125add85d0c4455", + "sha256:43193c5cda5d612f247172016c4bb71251c784d7a4d9314677186a838ad34858", + "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", + "sha256:47334db71978b23ebcf3c0f9f5ee98b8d65992b65c9c4f2d34c2eaf5bcaf0594", + "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", + "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", + "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", + "sha256:4ec9dd88a5b71abfc74e9df5ebe7921c35cbb3b641181a531ca65cdb5e8e4dea", + "sha256:4f9fc98dad6c2eaa32fc3af1417d95b5e3d08aff968df0cd320066def971f9a6", + "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", + "sha256:55f56e2ebd4e3bc50442fbc0888c9d8c94e4e06a933804e2af3e89e2f9c1c749", + "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", + "sha256:5d447056e2ca60382d460a604b6302d8db69476fd2015c81e7c35417cfabe4cd", + "sha256:5ed2e36c3e9b4f21dd9422f6893dec0abf2cca553af509b10cd630f878d3eb99", + "sha256:5ff2ed8194587faf56555927b3aa10e6fb69d931e33953943bc4f837dfee2242", + "sha256:62f60aebecfc7f4b82e3f639a7d1433a20ec32824db2199a11ad4f5e146ef5ee", + "sha256:63bc5c4ae26e4bc6be6469943b8253c0fd4e4186c43ad46e713ea61a0ba49129", + "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", + "sha256:6b493a043635eb376e50eedf7818f2f322eabbaa974e948bd8bdd29eb7ef2a51", + "sha256:6dba5d19c4dfab08e58d5b36304b3f92f3bd5d42c1a3fa37b5ba5cdf6dfcbcee", + "sha256:6fd30dc99682dc2c603c2b315bded2799019cea829f8bf57dc6b61efde6611c8", + "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", + "sha256:7706f5850360ac01d80c89bcef1640683cc12ed87f42579dab6c5d3ed6888613", + "sha256:7782afc9b6b42200f7362858f9e73b1f8316afb276d316336c0ec3bd73312742", + "sha256:79983512b108e4a164b9c8d34de3992f76d48cadc9554c9e60b43f308988aabe", + "sha256:7f683ddc7eedd742e2889d2bfb96d69573fde1d92fcb811979cdb7165bb9c7d3", + "sha256:82357d85de703176b5587dbe6ade8ff67f9f69a41c0733cf2425378b49954de5", + "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", + "sha256:86f4e8cca779080f66ff4f191a685ced73d2f72d50216f7112185dc02b90b9b7", + "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", + "sha256:8ce7fd6767a1cc5a92a639b391891bf1c268b03ec7e021c7d6d902285259685c", + "sha256:8ff4e7cdfdb1ab5698e675ca622e72d58a6fa2a8aa58195de0c0061288e6e3ea", + "sha256:9289fd5dddcf57bab41d044f1756550f9e7cf0c8e373b8cdf0ce8773dc4bd417", + "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", + "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", + "sha256:95c3c157765b031331dd4db3c775e58deaee050a3042fcad72cbc4189d7c8dca", + "sha256:980b4f289d1d90ca5efcf07958d3eb38ed9c0b7676bf2831a54d4f66f9c27dfa", + "sha256:9ae4ef0b3f6b41bad6366fb0ea4fc1d7ed051528e113a60fa2a65a9abb5b1d99", + "sha256:9c98230f5042f4945f957d006edccc2af1e03ed5e37ce7c373f00a5a4daa6149", + "sha256:9fa2566ca27d67c86569e8c85297aaf413ffab85a8960500f12ea34ff98e4c41", + "sha256:a14969b8691f7998e74663b77b4c36c0337cb1df552da83d5c9004a93afdb574", + "sha256:a8aacce6e2e1edcb6ac625fb0f8c3a9570ccc7bfba1f63419b3769ccf6a00ed0", + "sha256:a8e538f46104c815be19c975572d74afb53f29650ea2025bbfaef359d2de2f7f", + "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", + "sha256:aa693779a8b50cd97570e5a0f343538a8dbd3e496fa5dcb87e29406ad0299654", + "sha256:ab22fbd9765e6954bc0bcff24c25ff71dcbfdb185fcdaca49e81bac68fe724d3", + "sha256:ab2e5bef076f5a235c3774b4f4028a680432cded7cad37bba0fd90d64b187d19", + "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", + "sha256:af73657b7a68211996527dbfeffbb0864e043d270580c5aef06dc4b659a4b578", + "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", + "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", + "sha256:b8831399554b92b72af5932cdbbd4ddc55c55f631bb13ff8fe4e6536a06c5c51", + "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", + "sha256:bcb4f8ea87d03bc51ad04add8ceaf9b0f085ac045ab4d74e73bbc2dc033f0236", + "sha256:bd7af3717683bea4c87acd8c0d3d5b44d56120b26fd3f8a692bdd2d5260c620a", + "sha256:bf4475b82be41b07cc5e5ff94810e6a01f276e37c2d55571e3fe175e467a1a1c", + "sha256:c3e446d253bd88f6377260d07c895816ebf33ffffd56c1c792b13bff9c3e1ade", + "sha256:c57516e58fd17d03ebe67e181a4e4e2ccab1168f8c2976c6a334d4f819fe5944", + "sha256:c94057af19bc953643a33581844649a7fdab902624d2eb739738a30e2b3e60fc", + "sha256:cab5d0b79d987c67f3b9e9c53f54a61360422a5a0bc075f43cab5621d530c3b6", + "sha256:ce031db0408e487fd2775d745ce30a7cd2923667cf3b69d48d219f1d8f5ddeb6", + "sha256:cee4373f4d3ad28f1ab6290684d8e2ebdb9e7a1b74fdc39e4c211995f77bec27", + "sha256:d5b054862739d276e09928de37c79ddeec42a6e1bfc55863be96a36ba22926f6", + "sha256:dbe03226baf438ac4fda9e2d0715022fd579cb641c4cf639fa40d53b2fe6f3e2", + "sha256:dc15e99b2d8a656f8e666854404f1ba54765871104e50c8e9813af8a7db07f12", + "sha256:dcaf7c1524c0542ee2fc82cc8ec337f7a9f7edee2532421ab200d2b920fc97cf", + "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", + "sha256:dd9a8bd8900e65504a305bf8ae6fa9fbc66de94178c420791d0293702fce2df7", + "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", + "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", + "sha256:e91f541a85298cf35433bf66f3fab2a4a2cff05c127eeca4af174f6d497f0d4b", + "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", + "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", + "sha256:f09cb5a7bbe1ecae6e87901a2eb23e0256bb524a79ccc53eb0b7629fbe7677c4", + "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", + "sha256:f1a2f519ae173b5b6a2c9d5fa3116ce16e48b3462c8b96dfdded11055e3d6365", + "sha256:f28f891ccd15c514a0981f3b9db9aa23d62fe1a99997512b0491d2ed323d229a", + "sha256:f3e73a4255342d4eb26ef6df01e3962e73aa29baa3124a8e824c5d3364a65748", + "sha256:f606a1881d2663630ea5b8ce2efe2111740df4b687bd78b34a8131baa007f79b", + "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", + "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" + "version": "==3.4.0" }, "click": { "hashes": [ @@ -3374,81 +3298,71 @@ "toml" ], "hashes": [ - "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", - "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", - "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", - "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", - "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", - "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", - "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", - "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", - "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", - "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", - "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", - "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", - "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", - "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", - "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", - "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", - "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", - "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", - "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", - "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", - "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", - "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", - "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", - "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", - "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", - "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", - "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", - "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", - "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", - "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", - "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", - "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", - "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", - "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", - "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", - "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", - "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", - "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", - "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", - "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", - "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", - "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", - "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", - "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", - "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", - "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", - "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", - "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", - "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", - "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", - "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", - "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", - "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", - "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", - "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", - "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", - "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", - "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", - "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", - "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", - "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", - "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", - "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", - "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", - "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", - "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", - "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", - "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", - "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", - "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", - "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", - "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" + "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", + "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", + "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", + "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", + "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", + "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", + "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", + "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", + "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", + "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", + "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", + "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", + "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", + "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", + "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", + "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", + "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", + "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", + "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", + "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", + "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", + "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", + "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", + "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", + "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", + "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", + "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", + "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", + "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", + "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", + "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", + "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", + "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", + "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", + "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", + "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", + "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", + "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", + "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", + "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", + "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", + "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", + "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", + "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", + "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", + "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", + "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", + "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", + "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", + "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", + "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", + "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", + "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", + "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", + "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", + "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", + "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", + "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", + "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", + "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", + "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", + "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858" ], - "markers": "python_version >= '3.8'", - "version": "==7.6.1" + "markers": "python_version >= '3.9'", + "version": "==7.6.4" }, "coveralls": { "hashes": [ @@ -3456,7 +3370,6 @@ "sha256:7b2a0a2bcef94f295e3cf28dcc55ca40b71c77d1c2446b538e85f0f7bc21aa69" ], "index": "pypi", - "markers": "python_version < '3.13' and python_version >= '3.8'", "version": "==4.0.1" }, "decorator": { @@ -3481,7 +3394,6 @@ "sha256:96e4e16fabd3e0339a4b46e02a0a88c92c19800de38d00446571ea036614d332" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.2.4" }, "django-types": { @@ -3490,7 +3402,6 @@ "sha256:b3f529de17f6374d41ca67232aa01330c531bbbaa3ac4097896f31ac33c96c30" ], "index": "pypi", - "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==0.19.1" }, "docopt": { @@ -3529,17 +3440,15 @@ "sha256:8317aa5289cdfc45f9cae570feb07a6177316c82e34d14df3c2e1f22f26abef0" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.3.1" }, "faker": { "hashes": [ - "sha256:dbf81295c948270a9e96cd48a9a3ebec73acac9a153d0c854fbbd0294557609f", - "sha256:e0593931bd7be9a9ea984b5d8c302ef1cec19392585d1e90d444199271d0a94d" + "sha256:3608c7fcac2acde0eaa6da28dae97628f18f14d54eaa2a92b96ae006f1621bd7", + "sha256:4cd0c5ea4bc1e4c902967f6e662f5f5da69f1674d9a94f54e516d27f3c2a6a16" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==30.1.0" + "version": "==30.8.0" }, "fastdiff": { "hashes": [ @@ -3554,7 +3463,6 @@ "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==7.1.1" }, "flake8-import-order": { @@ -3570,7 +3478,6 @@ "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.2.3" }, "freezegun": { @@ -3579,7 +3486,6 @@ "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.5.1" }, "future": { @@ -3612,7 +3518,6 @@ "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.13.13" }, "ipython": { @@ -3629,7 +3534,6 @@ "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==5.13.2" }, "jedi": { @@ -3638,7 +3542,6 @@ "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==0.19.1" }, "jsonmatch": { @@ -3650,69 +3553,70 @@ }, "markupsafe": { "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", + "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", + "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", + "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", + "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", + "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", + "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", + "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", + "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", + "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", + "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", + "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", + "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", + "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", + "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", + "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", + "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", + "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", + "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", + "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", + "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", + "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", + "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", + "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", + "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", + "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", + "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", + "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", + "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", + "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", + "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", + "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", + "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", + "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", + "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", + "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", + "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", + "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", + "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", + "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", + "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", + "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", + "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", + "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", + "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", + "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", + "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", + "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", + "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", + "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", + "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", + "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", + "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", + "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", + "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", + "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", + "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", + "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", + "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", + "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", + "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.2" }, "matplotlib-inline": { "hashes": [ @@ -3744,7 +3648,6 @@ "sha256:24f3b0aecb06656e983f58e07c732a90577b9d7af3e1066fc2b663bbf0370248" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.3.0" }, "openpyxl": { @@ -3753,7 +3656,6 @@ "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.1.5" }, "outcome": { @@ -3778,7 +3680,6 @@ "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.9.0" }, "parso": { @@ -3847,7 +3748,6 @@ "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.20.3" }, "protolint-bin": { @@ -3915,7 +3815,6 @@ "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "requests": { @@ -3924,7 +3823,6 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "requests-mock": { @@ -3933,7 +3831,6 @@ "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==1.12.1" }, "selenium": { @@ -3942,16 +3839,15 @@ "sha256:95d08d3b82fb353f3c474895154516604c7f0e6a9a565ae6498ef36c9bac6921" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.25.0" }, "setuptools": { "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" + "markers": "python_version >= '3.8'", + "version": "==70.0.0" }, "six": { "hashes": [ @@ -3997,7 +3893,6 @@ "sha256:93622790a0a29e04f0346458face1e144dc4d32f493714c6c3dff82a4adb77e6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.0.0" }, "termcolor": { @@ -4026,11 +3921,11 @@ }, "trio": { "hashes": [ - "sha256:0346c3852c15e5c7d40ea15972c4805689ef2cb8b5206f794c9c19450119f3a4", - "sha256:c5237e8133eb0a1d72f09a971a55c28ebe69e351c783fc64bc37db8db8bbe1d0" + "sha256:1dcc95ab1726b2da054afea8fd761af74bad79bd52381b84eae408e983c76831", + "sha256:68eabbcf8f457d925df62da780eff15ff5dc68fd6b367e2dde59f7aaf2a0b884" ], "markers": "python_version >= '3.8'", - "version": "==0.26.2" + "version": "==0.27.0" }, "trio-websocket": { "hashes": [ @@ -4046,23 +3941,22 @@ "sha256:d181af8a256e5a91ce8d5adb53496e880efd9144c7d54483e3653332b60296f0" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==5.28.0.20240924" }, "types-psycopg2": { "hashes": [ - "sha256:4ed6b47464d6374fa64e5e3b234cea0f710e72123a4596d67ab50b7415a84666", - "sha256:c9192311c27d7ad561eef705f1b2df1074f2cdcf445a98a6a2fcaaaad43278cf" + "sha256:44d091e67732d16a941baae48cd7b53bf91911bc36888652447cf1ef0c1fb3f6", + "sha256:bca89b988d2ebd19bcd08b177d22a877ea8b841decb10ed130afcf39404612fa" ], "markers": "python_version >= '3.8'", - "version": "==2.9.21.20240819" + "version": "==2.9.21.20241019" }, "typing-extensions": { "hashes": [ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==4.12.2" }, "uritemplate": { @@ -4153,7 +4047,6 @@ "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==5.0.3" }, "wcwidth": { @@ -4177,7 +4070,6 @@ "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.0.4" }, "wsproto": { @@ -4200,12 +4092,11 @@ }, "django": { "hashes": [ - "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", - "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" + "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898", + "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.25" + "version": "==4.2.16" }, "django-auth-ldap": { "hashes": [ @@ -4213,7 +4104,6 @@ "sha256:604250938ddc9fda619f247c7a59b0b2f06e53a7d3f46a156f28aa30dd71a738" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.8.0" }, "pyasn1": { @@ -4237,7 +4127,6 @@ "sha256:7edb0accec4e037797705f3a05cbf36a9fde50d08c8f67f2aef99a2628fab828" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.4.4" }, "sqlparse": { @@ -4246,7 +4135,6 @@ "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.5.1" }, "typing-extensions": { @@ -4254,7 +4142,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==4.12.2" } }, @@ -4277,29 +4165,27 @@ }, "boto3": { "hashes": [ - "sha256:291e7b97a34967ed93297e6171f1bebb8529e64633dd48426760e3fdef1cdea8", - "sha256:57e6ee8504e7929bc094bb2afc879943906064179a1e88c23b4812e2c6f61532" + "sha256:9f4a081e1940846171b51d903000a04322f1356d53225ce1028fc1760a155a70", + "sha256:f16c7edfcbbeb0a0c22d67d6ebbfcb332fa78d3ea88275e082260ba04fe65347" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.35.34" + "version": "==1.35.45" }, "botocore": { "hashes": [ - "sha256:25b17a9ccba6ad32bb5bf7ba4f52656aa03c1cb29f6b4e438050ee4ad1967a3b", - "sha256:cab9ec4e0367b9f33f0bc02c5a29f587b0119ecffd6d125bacee085dcbc8817d" + "sha256:354ec1b766f0029b5d6ff0c45d1a0f9e5007b7d2f3ec89bcdd755b208c5bc797", + "sha256:64241c778bf2dc863d93abab159e14024d97a926a5715056ef6411418cb9ead3" ], "markers": "python_version >= '3.8'", - "version": "==1.35.23" + "version": "==1.35.36" }, "django": { "hashes": [ - "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", - "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" + "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898", + "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.25" + "version": "==4.2.16" }, "django-redis": { "hashes": [ @@ -4307,7 +4193,6 @@ "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==5.4.0" }, "django-storages": { @@ -4316,56 +4201,51 @@ "sha256:d61930acb4a25e3aebebc6addaf946a3b1df31c803a6bf1af2f31c9047febaa3" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.14.4" }, "gevent": { "hashes": [ - "sha256:03aa5879acd6b7076f6a2a307410fb1e0d288b84b03cdfd8c74db8b4bc882fc5", - "sha256:117e5837bc74a1673605fb53f8bfe22feb6e5afa411f524c835b2ddf768db0de", - "sha256:141a2b24ad14f7b9576965c0c84927fc85f824a9bb19f6ec1e61e845d87c9cd8", - "sha256:14532a67f7cb29fb055a0e9b39f16b88ed22c66b96641df8c04bdc38c26b9ea5", - "sha256:1dffb395e500613e0452b9503153f8f7ba587c67dd4a85fc7cd7aa7430cb02cc", - "sha256:2955eea9c44c842c626feebf4459c42ce168685aa99594e049d03bedf53c2800", - "sha256:2ae3a25ecce0a5b0cd0808ab716bfca180230112bb4bc89b46ae0061d62d4afe", - "sha256:2e9ac06f225b696cdedbb22f9e805e2dd87bf82e8fa5e17756f94e88a9d37cf7", - "sha256:368a277bd9278ddb0fde308e6a43f544222d76ed0c4166e0d9f6b036586819d9", - "sha256:3adfb96637f44010be8abd1b5e73b5070f851b817a0b182e601202f20fa06533", - "sha256:3d5325ccfadfd3dcf72ff88a92fb8fc0b56cacc7225f0f4b6dcf186c1a6eeabc", - "sha256:432fc76f680acf7cf188c2ee0f5d3ab73b63c1f03114c7cd8a34cebbe5aa2056", - "sha256:44098038d5e2749b0784aabb27f1fcbb3f43edebedf64d0af0d26955611be8d6", - "sha256:5a1df555431f5cd5cc189a6ee3544d24f8c52f2529134685f1e878c4972ab026", - "sha256:6c47ae7d1174617b3509f5d884935e788f325eb8f1a7efc95d295c68d83cce40", - "sha256:6f947a9abc1a129858391b3d9334c45041c08a0f23d14333d5b844b6e5c17a07", - "sha256:782a771424fe74bc7e75c228a1da671578c2ba4ddb2ca09b8f959abdf787331e", - "sha256:7899a38d0ae7e817e99adb217f586d0a4620e315e4de577444ebeeed2c5729be", - "sha256:7b00f8c9065de3ad226f7979154a7b27f3b9151c8055c162332369262fc025d8", - "sha256:8f4b8e777d39013595a7740b4463e61b1cfe5f462f1b609b28fbc1e4c4ff01e5", - "sha256:90cbac1ec05b305a1b90ede61ef73126afdeb5a804ae04480d6da12c56378df1", - "sha256:918cdf8751b24986f915d743225ad6b702f83e1106e08a63b736e3a4c6ead789", - "sha256:9202f22ef811053077d01f43cc02b4aaf4472792f9fd0f5081b0b05c926cca19", - "sha256:94138682e68ec197db42ad7442d3cf9b328069c3ad8e4e5022e6b5cd3e7ffae5", - "sha256:968581d1717bbcf170758580f5f97a2925854943c45a19be4d47299507db2eb7", - "sha256:9d8d0642c63d453179058abc4143e30718b19a85cbf58c2744c9a63f06a1d388", - "sha256:a7ceb59986456ce851160867ce4929edaffbd2f069ae25717150199f8e1548b8", - "sha256:b9913c45d1be52d7a5db0c63977eebb51f68a2d5e6fd922d1d9b5e5fd758cc98", - "sha256:bde283313daf0b34a8d1bab30325f5cb0f4e11b5869dbe5bc61f8fe09a8f66f3", - "sha256:bf5b9c72b884c6f0c4ed26ef204ee1f768b9437330422492c319470954bc4cc7", - "sha256:ca80b121bbec76d7794fcb45e65a7eca660a76cc1a104ed439cdbd7df5f0b060", - "sha256:cdf66977a976d6a3cfb006afdf825d1482f84f7b81179db33941f2fc9673bb1d", - "sha256:d4faf846ed132fd7ebfbbf4fde588a62d21faa0faa06e6f468b7faa6f436b661", - "sha256:d7f87c2c02e03d99b95cfa6f7a776409083a9e4d468912e18c7680437b29222c", - "sha256:dd23df885318391856415e20acfd51a985cba6919f0be78ed89f5db9ff3a31cb", - "sha256:f5de3c676e57177b38857f6e3cdfbe8f38d1cd754b63200c0615eaa31f514b4f", - "sha256:f5e8e8d60e18d5f7fd49983f0c4696deeddaf6e608fbab33397671e2fcc6cc91", - "sha256:f7cac622e11b4253ac4536a654fe221249065d9a69feb6cdcd4d9af3503602e0", - "sha256:f8a04cf0c5b7139bc6368b461257d4a757ea2fe89b3773e494d235b7dd51119f", - "sha256:f8bb35ce57a63c9a6896c71a285818a3922d8ca05d150fd1fe49a7f57287b836", - "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682" + "sha256:051b22e2758accfddb0457728bfc9abf8c3f2ce6bca43f1ff6e07b5ed9e49bf4", + "sha256:0de6eb3d55c03138fda567d9bfed28487ce5d0928c5107549767a93efdf2be26", + "sha256:18e6984ec96fc95fd67488555c38ece3015be1f38b1bcceb27b7d6c36b343008", + "sha256:1c3a828b033fb02b7c31da4d75014a1f82e6c072fc0523456569a57f8b025861", + "sha256:1ce6dab94c0b0d24425ba55712de2f8c9cb21267150ca63f5bb3a0e1f165da99", + "sha256:1e24ffea72e27987979c009536fd0868e52239b44afe6cf7135ce8aafd0f108e", + "sha256:26ca7a6b42d35129617025ac801135118333cad75856ffc3217b38e707383eba", + "sha256:34aea15f9c79f27a8faeaa361bc1e72c773a9b54a1996a2ec4eefc8bcd59a824", + "sha256:385710355eadecdb70428a5ae3e7e5a45dcf888baa1426884588be9d25ac4290", + "sha256:3ac83b74304487afa211a01909c7dd257e574db0cd429d866c298e21df7aeedf", + "sha256:3ad8fb70aa0ebc935729c9699ac31b210a49b689a7b27b7ac9f91676475f3f53", + "sha256:40ea3e40e8bb4fdb143c2a8edf2ccfdebd56016c7317c341ce8094c7bee08818", + "sha256:57a5c4e0bdac482c5f02f240d0354e61362df73501ef6ebafce8ef635cad7527", + "sha256:5d850a453d66336272be4f1d3a8126777f3efdaea62d053b4829857f91e09755", + "sha256:68c3a0d8402755eba7f69022e42e8021192a721ca8341908acc222ea597029b6", + "sha256:7021e26d70189b33c27173d4173f27bf4685d6b6f1c0ea50e5335f8491cb110c", + "sha256:70e9ed7ecb70e0df7dc97c3bc420de9a45a7c76bd5861c6cfec8c549700e681e", + "sha256:89c4115e3f5ada55f92b61701a46043fe42f702b5af863b029e4c1a76f6cc2d4", + "sha256:8af65a4d4feaec6042c666d22c322a310fba3b47e841ad52f724b9c3ce5da48e", + "sha256:8e58ee3723f1fbe07d66892f1caa7481c306f653a6829b6fd16cb23d618a5915", + "sha256:9ca2266e08f43c0e22c028801dff7d92a0b102ef20e4caeb6a46abfb95f6a328", + "sha256:9e1210334a9bc9f76c3d008e0785ca62214f8a54e1325f6c2ecab3b6a572a015", + "sha256:a9a89d6e396ef6f1e3968521bf56e8c4bee25b193bbf5d428b7782d582410822", + "sha256:aa7ee1bd5cabb2b7ef35105f863b386c8d5e332f754b60cfc354148bd70d35d1", + "sha256:b52382124eca13135a3abe4f65c6bd428656975980a48e51b17aeab68bdb14db", + "sha256:c1d80090485da1ea3d99205fe97908b31188c1f4857f08b333ffaf2de2e89d18", + "sha256:ce417bcaaab496bc9c77f75566531e9d93816262037b8b2dbb88b0fdcd66587c", + "sha256:d67daed8383326dc8b5e58d88e148d29b6b52274a489e383530b0969ae7b9cb9", + "sha256:d758f0d4dbf32502ec87bb9b536ca8055090a16f8305f0ada3ce6f34e70f2fd7", + "sha256:d7a1ad0f2da582f5bd238bca067e1c6c482c30c15a6e4d14aaa3215cbb2232f3", + "sha256:e534e6a968d74463b11de6c9c67f4b4bf61775fb00f2e6e0f7fcdd412ceade18", + "sha256:eb5edb6433764119a664bbb148d2aea9990950aa89cc3498f475c2408d523ea3", + "sha256:f0c129f81d60cda614acb4b0c5731997ca05b031fb406fcb58ad53a7ade53b13", + "sha256:f147e38423fbe96e8731f60a63475b3d2cab2f3d10578d8ee9d10c507c58a2ff", + "sha256:f18689f7a70d2ed0e75bad5036ec3c89690a493d4cfac8d7cdb258ac04b132bd", + "sha256:f2ae3efbbd120cdf4a68b7abc27a37e61e6f443c5a06ec2c6ad94c37cd8471ec", + "sha256:f4e526fdc279c655c1e809b0c34b45844182c2a6b219802da5e411bd2cf5a8ad", + "sha256:f7f4f171d4d2018170454d84c934842e1b5f6ce7468ba298f6e7f7cff15000a3" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.2.1" + "version": "==24.10.3" }, "greenlet": { "hashes": [ @@ -4452,7 +4332,6 @@ "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==23.0.0" }, "jmespath": { @@ -4477,7 +4356,6 @@ "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", "version": "==2.9.0.post0" }, "redis": { @@ -4486,24 +4364,23 @@ "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==5.1.1" }, "s3transfer": { "hashes": [ - "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6", - "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69" + "sha256:263ed587a5803c6c708d3ce44dc4dfedaab4c1a32e8329bab818933d79ddcf5d", + "sha256:4f50ed74ab84d474ce614475e0b8d5047ff080810aac5d01ea25231cfc944b0c" ], "markers": "python_version >= '3.8'", - "version": "==0.10.2" + "version": "==0.10.3" }, "setuptools": { "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" + "markers": "python_version >= '3.8'", + "version": "==70.0.0" }, "six": { "hashes": [ @@ -4519,7 +4396,6 @@ "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.5.1" }, "typing-extensions": { @@ -4527,7 +4403,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==4.12.2" }, "urllib3": { @@ -4544,7 +4420,6 @@ "sha256:a1ae85e01fdc9815d12fa33f17765bc132ed2c54fa76daf9e39e879dd93566f6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.7.0" }, "zope.event": { @@ -4557,43 +4432,46 @@ }, "zope.interface": { "hashes": [ - "sha256:01e6e58078ad2799130c14a1d34ec89044ada0e1495329d72ee0407b9ae5100d", - "sha256:064ade95cb54c840647205987c7b557f75d2b2f7d1a84bfab4cf81822ef6e7d1", - "sha256:11fa1382c3efb34abf16becff8cb214b0b2e3144057c90611621f2d186b7e1b7", - "sha256:1bee1b722077d08721005e8da493ef3adf0b7908e0cd85cc7dc836ac117d6f32", - "sha256:1eeeb92cb7d95c45e726e3c1afe7707919370addae7ed14f614e22217a536958", - "sha256:21a207c6b2c58def5011768140861a73f5240f4f39800625072ba84e76c9da0b", - "sha256:2545d6d7aac425d528cd9bf0d9e55fcd47ab7fd15f41a64b1c4bf4c6b24946dc", - "sha256:2c4316a30e216f51acbd9fb318aa5af2e362b716596d82cbb92f9101c8f8d2e7", - "sha256:35062d93bc49bd9b191331c897a96155ffdad10744ab812485b6bad5b588d7e4", - "sha256:382d31d1e68877061daaa6499468e9eb38eb7625d4369b1615ac08d3860fe896", - "sha256:3aa8fcbb0d3c2be1bfd013a0f0acd636f6ed570c287743ae2bbd467ee967154d", - "sha256:3d4b91821305c8d8f6e6207639abcbdaf186db682e521af7855d0bea3047c8ca", - "sha256:3de1d553ce72868b77a7e9d598c9bff6d3816ad2b4cc81c04f9d8914603814f3", - "sha256:3fcdc76d0cde1c09c37b7c6b0f8beba2d857d8417b055d4f47df9c34ec518bdd", - "sha256:5112c530fa8aa2108a3196b9c2f078f5738c1c37cfc716970edc0df0414acda8", - "sha256:53d678bb1c3b784edbfb0adeebfeea6bf479f54da082854406a8f295d36f8386", - "sha256:6195c3c03fef9f87c0dbee0b3b6451df6e056322463cf35bca9a088e564a3c58", - "sha256:6d04b11ea47c9c369d66340dbe51e9031df2a0de97d68f442305ed7625ad6493", - "sha256:6dd647fcd765030638577fe6984284e0ebba1a1008244c8a38824be096e37fe3", - "sha256:799ef7a444aebbad5a145c3b34bff012b54453cddbde3332d47ca07225792ea4", - "sha256:7d92920416f31786bc1b2f34cc4fc4263a35a407425319572cbf96b51e835cd3", - "sha256:7e0c151a6c204f3830237c59ee4770cc346868a7a1af6925e5e38650141a7f05", - "sha256:84f8794bd59ca7d09d8fce43ae1b571be22f52748169d01a13d3ece8394d8b5b", - "sha256:95e5913ec718010dc0e7c215d79a9683b4990e7026828eedfda5268e74e73e11", - "sha256:9b9369671a20b8d039b8e5a1a33abd12e089e319a3383b4cc0bf5c67bd05fe7b", - "sha256:ab985c566a99cc5f73bc2741d93f1ed24a2cc9da3890144d37b9582965aff996", - "sha256:af94e429f9d57b36e71ef4e6865182090648aada0cb2d397ae2b3f7fc478493a", - "sha256:c96b3e6b0d4f6ddfec4e947130ec30bd2c7b19db6aa633777e46c8eecf1d6afd", - "sha256:cd2690d4b08ec9eaf47a85914fe513062b20da78d10d6d789a792c0b20307fb1", - "sha256:d3b7ce6d46fb0e60897d62d1ff370790ce50a57d40a651db91a3dde74f73b738", - "sha256:d976fa7b5faf5396eb18ce6c132c98e05504b52b60784e3401f4ef0b2e66709b", - "sha256:db6237e8fa91ea4f34d7e2d16d74741187e9105a63bbb5686c61fea04cdbacca", - "sha256:ecd32f30f40bfd8511b17666895831a51b532e93fc106bfa97f366589d3e4e0e", - "sha256:f418c88f09c3ba159b95a9d1cfcdbe58f208443abb1f3109f4b9b12fd60b187c" + "sha256:07add15de0cc7e69917f7d286b64d54125c950aeb43efed7a5ea7172f000fbc1", + "sha256:0ac20581fc6cd7c754f6dff0ae06fedb060fa0e9ea6309d8be8b2701d9ea51c4", + "sha256:124149e2d42067b9c6597f4dafdc7a0983d0163868f897b7bb5dc850b14f9a87", + "sha256:27cfb5205d68b12682b6e55ab8424662d96e8ead19550aad0796b08dd2c9a45e", + "sha256:2a29ac607e970b5576547f0e3589ec156e04de17af42839eedcf478450687317", + "sha256:2b6a4924f5bad9fe21d99f66a07da60d75696a136162427951ec3cb223a5570d", + "sha256:2bd9e9f366a5df08ebbdc159f8224904c1c5ce63893984abb76954e6fbe4381a", + "sha256:3bcff5c09d0215f42ba64b49205a278e44413d9bf9fa688fd9e42bfe472b5f4f", + "sha256:3f005869a1a05e368965adb2075f97f8ee9a26c61898a9e52a9764d93774f237", + "sha256:4a00ead2e24c76436e1b457a5132d87f83858330f6c923640b7ef82d668525d1", + "sha256:4af4a12b459a273b0b34679a5c3dc5e34c1847c3dd14a628aa0668e19e638ea2", + "sha256:5501e772aff595e3c54266bc1bfc5858e8f38974ce413a8f1044aae0f32a83a3", + "sha256:5e28ea0bc4b084fc93a483877653a033062435317082cdc6388dec3438309faf", + "sha256:5e956b1fd7f3448dd5e00f273072e73e50dfafcb35e4227e6d5af208075593c9", + "sha256:5fcf379b875c610b5a41bc8a891841533f98de0520287d7f85e25386cd10d3e9", + "sha256:6159e767d224d8f18deff634a1d3722e68d27488c357f62ebeb5f3e2f5288b1f", + "sha256:661d5df403cd3c5b8699ac480fa7f58047a3253b029db690efa0c3cf209993ef", + "sha256:711eebc77f2092c6a8b304bad0b81a6ce3cf5490b25574e7309fbc07d881e3af", + "sha256:80a3c00b35f6170be5454b45abe2719ea65919a2f09e8a6e7b1362312a872cd3", + "sha256:848b6fa92d7c8143646e64124ed46818a0049a24ecc517958c520081fd147685", + "sha256:91b6c30689cfd87c8f264acb2fc16ad6b3c72caba2aec1bf189314cf1a84ca33", + "sha256:9733a9a0f94ef53d7aa64661811b20875b5bc6039034c6e42fb9732170130573", + "sha256:9940d5bc441f887c5f375ec62bcf7e7e495a2d5b1da97de1184a88fb567f06af", + "sha256:9e3e48f3dea21c147e1b10c132016cb79af1159facca9736d231694ef5a740a8", + "sha256:a14c9decf0eb61e0892631271d500c1e306c7b6901c998c7035e194d9150fdd1", + "sha256:a735f82d2e3ed47ca01a20dfc4c779b966b16352650a8036ab3955aad151ed8a", + "sha256:a99240b1d02dc469f6afbe7da1bf617645e60290c272968f4e53feec18d7dce8", + "sha256:b7b25db127db3e6b597c5f74af60309c4ad65acd826f89609662f0dc33a54728", + "sha256:b936d61dbe29572fd2cfe13e30b925e5383bed1aba867692670f5a2a2eb7b4e9", + "sha256:bec001798ab62c3fc5447162bf48496ae9fba02edc295a9e10a0b0c639a6452e", + "sha256:cc8a318162123eddbdf22fcc7b751288ce52e4ad096d3766ff1799244352449d", + "sha256:d0a45b5af9f72c805ee668d1479480ca85169312211bed6ed18c343e39307d5f", + "sha256:e53c291debef523b09e1fe3dffe5f35dde164f1c603d77f770b88a1da34b7ed6", + "sha256:ec1ef1fdb6f014d5886b97e52b16d0f852364f447d2ab0f0c6027765777b6667", + "sha256:ec59fe53db7d32abb96c6d4efeed84aab4a7c38c62d7a901a9b20c09dd936e7a", + "sha256:f245d039f72e6f802902375755846f5de1ee1e14c3e8736c078565599bcab621", + "sha256:ff115ef91c0eeac69cd92daeba36a9d8e14daee445b504eeea2b1c0b55821984" ], "markers": "python_version >= '3.8'", - "version": "==7.0.3" + "version": "==7.1.0" } } } diff --git a/backend/beaconsite/tests/test_permissions.py b/backend/beaconsite/tests/test_permissions.py index a834747dc..493aa1733 100644 --- a/backend/beaconsite/tests/test_permissions.py +++ b/backend/beaconsite/tests/test_permissions.py @@ -1,5 +1,5 @@ from django.urls import reverse -from projectroles.tests.test_permissions import TestProjectPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase from beaconsite.tests.factories import ConsortiumFactory, SiteFactory @@ -24,14 +24,14 @@ def setUp(self): ] -class TestIndexView(UsersMixin, TestProjectPermissionBase): +class TestIndexView(UsersMixin, ProjectPermissionTestBase): def test_index(self): url = reverse("beaconsite:index") self.assert_response(url, self.good_users, 200) self.assert_response(url, self.bad_users, 302) -class TestConsortiumViews(UsersMixin, TestProjectPermissionBase): +class TestConsortiumViews(UsersMixin, ProjectPermissionTestBase): def test_list(self): url = reverse("beaconsite:consortium-list") self.assert_response(url, self.good_users, 200) @@ -59,7 +59,7 @@ def test_delete(self): self.assert_response(url, self.bad_users, 302) -class TestSiteViews(UsersMixin, TestProjectPermissionBase): +class TestSiteViews(UsersMixin, ProjectPermissionTestBase): def test_list(self): url = reverse("beaconsite:site-list") self.assert_response(url, self.good_users, 200) diff --git a/backend/beaconsite/tests/test_permissions_ajax.py b/backend/beaconsite/tests/test_permissions_ajax.py index 37641008e..97ea70c7d 100644 --- a/backend/beaconsite/tests/test_permissions_ajax.py +++ b/backend/beaconsite/tests/test_permissions_ajax.py @@ -1,6 +1,6 @@ import cattr from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase import requests_mock from ..models import Site @@ -8,7 +8,7 @@ from .factories import SiteFactory -class TestOrganisationAjaxViews(TestProjectAPIPermissionBase): +class TestOrganisationAjaxViews(ProjectAPIPermissionTestBase): @requests_mock.Mocker() def test_get(self, r_mock): _local_site = SiteFactory(role=Site.LOCAL) # noqa: F841 @@ -57,7 +57,7 @@ def test_get(self, r_mock): self.assert_response(url, bad_users, 302, method="GET") # redirect to login -class TestBeaconQueryAjaxView(TestProjectAPIPermissionBase): +class TestBeaconQueryAjaxView(ProjectAPIPermissionTestBase): @requests_mock.Mocker() def test_get(self, r_mock): _local_site = SiteFactory(role=Site.LOCAL) # noqa: F841 diff --git a/backend/beaconsite/tests/test_permissions_api.py b/backend/beaconsite/tests/test_permissions_api.py index e47925497..4a4aef1f0 100644 --- a/backend/beaconsite/tests/test_permissions_api.py +++ b/backend/beaconsite/tests/test_permissions_api.py @@ -7,7 +7,7 @@ from django.shortcuts import reverse from django.utils import timezone import httpsig -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.tests.factories import SmallVariantFactory @@ -42,7 +42,7 @@ def get_accept_header(self, media_type, version): return {_header_canonical(k): v for k, v in signed_headers_dict.items()} -class TestBeaconInfoApiView(AcceptHeaderMixin, TestProjectAPIPermissionBase): +class TestBeaconInfoApiView(AcceptHeaderMixin, ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.consortium = ConsortiumWithLocalAndRemoteSiteFactory() @@ -110,7 +110,7 @@ def _get_date(): self.get_date = old_get_date -class TestBeaconQueryApiView(AcceptHeaderMixin, TestProjectAPIPermissionBase): +class TestBeaconQueryApiView(AcceptHeaderMixin, ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.consortium = ConsortiumWithLocalAndRemoteSiteFactory() diff --git a/backend/beaconsite/tests/test_views_ajax.py b/backend/beaconsite/tests/test_views_ajax.py index 6d7260c4d..a33fd1fa2 100644 --- a/backend/beaconsite/tests/test_views_ajax.py +++ b/backend/beaconsite/tests/test_views_ajax.py @@ -2,14 +2,14 @@ from django.urls import reverse import jsonmatch -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase import requests_mock RE_UUID4 = re.compile(r"^[0-9a-f-]+$") RE_DATETIME = re.compile(r"^\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ$") -class TestBeaconInfoAjaxView(TestProjectAPIPermissionBase): +class TestBeaconInfoAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the AJAX views dealing with Organisation.""" def setUp(self): diff --git a/backend/beaconsite/urls.py b/backend/beaconsite/urls.py index 1d6e97844..262482825 100644 --- a/backend/beaconsite/urls.py +++ b/backend/beaconsite/urls.py @@ -1,87 +1,87 @@ """URL configuration for the ``beaconsite`` app. """ -from django.conf.urls import url +from django.urls import path from . import views, views_ajax, views_api app_name = "beaconsite" ui_urlpatterns = [ - url( - regex=r"^$", + path( + route="", view=views.IndexView.as_view(), name="index", ), - url( - regex=r"^consortium$", + path( + route="consortium/", view=views.ConsortiumListView.as_view(), name="consortium-list", ), - url( - regex=r"^consortium/(?P[0-9a-f-]+)$", + path( + route="consortium//", view=views.ConsortiumDetailView.as_view(), name="consortium-detail", ), - url( - regex=r"^consortium/create/$", + path( + route="consortium/create/", view=views.ConsortiumCreateView.as_view(), name="consortium-create", ), - url( - regex=r"^consortium/update/(?P[0-9a-f-]+)$", + path( + route="consortium/update//", view=views.ConsortiumUpdateView.as_view(), name="consortium-update", ), - url( - regex=r"^consortium/delete/(?P[0-9a-f-]+)$", + path( + route="consortium/delete//", view=views.ConsortiumDeleteView.as_view(), name="consortium-delete", ), - url( - regex=r"^site$", + path( + route="site/", view=views.SiteListView.as_view(), name="site-list", ), - url( - regex=r"^site/(?P[0-9a-f-]+)$", + path( + route="site//", view=views.SiteDetailView.as_view(), name="site-detail", ), - url( - regex=r"^site/create/$", + path( + route="site/create/", view=views.SiteCreateView.as_view(), name="site-create", ), - url( - regex=r"^site/update/(?P[0-9a-f-]+)$", + path( + route="site/update//", view=views.SiteUpdateView.as_view(), name="site-update", ), - url( - regex=r"^site/delete/(?P[0-9a-f-]+)$", + path( + route="site/delete//", view=views.SiteDeleteView.as_view(), name="site-delete", ), ] ajax_urlpatterns = [ - url( - regex=r"^ajax/beacon/info/(?P[0-9a-f-]+)$", + path( + route="ajax/beacon/info//", view=views_ajax.BeaconInfoAjaxView.as_view(), name="ajax-beacon-info", ), - url( - regex=r"^ajax/beacon/query/(?P[0-9a-f-]+)$", + path( + route="ajax/beacon/query//", view=views_ajax.BeaconQueryAjaxView.as_view(), name="ajax-beacon-query", ), ] beacon_api_urlpatterns = [ - url(regex=r"^endpoint/?$", view=views_api.BeaconInfoApiView.as_view(), name="beacon-api-info"), - url( - regex=r"^endpoint/query/?$", + path(route="endpoint", view=views_api.BeaconInfoApiView.as_view(), name="beacon-api-info"), + path( + route="endpoint/query/", view=views_api.BeaconQueryApiView.as_view(), name="beacon-api-query", ), diff --git a/backend/cases/tests/test_permissions.py b/backend/cases/tests/test_permissions.py index c76fd71b0..764e44d4d 100644 --- a/backend/cases/tests/test_permissions.py +++ b/backend/cases/tests/test_permissions.py @@ -1,8 +1,8 @@ from django.urls import reverse -from projectroles.tests.test_permissions import TestProjectPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase -class TestCasesViews(TestProjectPermissionBase): +class TestCasesViews(ProjectPermissionTestBase): """Permission tests for the ``cases`` views""" def test_entrypoint(self): diff --git a/backend/cases/tests/test_permissions_ajax.py b/backend/cases/tests/test_permissions_ajax.py index 98f00c915..19a79e9dd 100644 --- a/backend/cases/tests/test_permissions_ajax.py +++ b/backend/cases/tests/test_permissions_ajax.py @@ -1,13 +1,13 @@ import json from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.models import Case, CaseComments, CasePhenotypeTerms from variants.tests.factories import CaseCommentsFactory, CaseFactory, CasePhenotypeTermsFactory -class TestCaseAjaxView(TestProjectAPIPermissionBase): +class TestCaseAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``Case``.""" def setUp(self): @@ -94,7 +94,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestCasePhenotypeTermsCreateListAjaxView(TestProjectAPIPermissionBase): +class TestCasePhenotypeTermsCreateListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the create/list API views dealing with ``CasePhenotypeTerms``.""" def setUp(self): @@ -149,7 +149,7 @@ def cleanup(): ) -class TestAnnotationReleaseInfoListAjaxView(TestProjectAPIPermissionBase): +class TestAnnotationReleaseInfoListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the list AJAX views dealing with ``AnnotationReleaseInfo``.""" def setUp(self): @@ -175,7 +175,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSvAnnotationReleaseInfoListAjaxView(TestProjectAPIPermissionBase): +class TestSvAnnotationReleaseInfoListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the list AJAX views dealing with ``SvAnnotationReleaseInfo``.""" def setUp(self): @@ -201,7 +201,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestCasePhenotypeTermsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestCasePhenotypeTermsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the retrieve/update/destroy AJAX views dealing with ``CasePhenotypeTerms``.""" def setUp(self): @@ -285,7 +285,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestCaseCommentCreateListAjaxView(TestProjectAPIPermissionBase): +class TestCaseCommentCreateListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the create/list API views dealing with ``CaseComment``.""" def setUp(self): @@ -333,7 +333,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestCaseCommentRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestCaseCommentRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the retrieve/update/destroy AJAX views dealing with ``CaseComment``.""" def setUp(self): @@ -413,7 +413,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestCaseGeneAnnotationListAjaxView(TestProjectAPIPermissionBase): +class TestCaseGeneAnnotationListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CaseGeneAnnotation``.""" def setUp(self): @@ -439,7 +439,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestProjectUserPermissionsAjaxView(TestProjectAPIPermissionBase): +class TestProjectUserPermissionsAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the API views returning permissions.""" def setUp(self): @@ -462,7 +462,7 @@ def test_list(self): self.assert_response(url, good_users, 200, method="GET") -class TestCaseAlignmentStatsListAjaxView(TestProjectAPIPermissionBase): +class TestCaseAlignmentStatsListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CaseAlignmentStats``.""" def setUp(self): @@ -488,7 +488,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSampleVariantStatisticsListAjaxView(TestProjectAPIPermissionBase): +class TestSampleVariantStatisticsListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``SampleVariantStatistics``.""" def setUp(self): @@ -514,7 +514,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestPedigreeRelatednessListAjaxView(TestProjectAPIPermissionBase): +class TestPedigreeRelatednessListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``PedigreeRelatedness``.""" def setUp(self): diff --git a/backend/cases/tests/test_permissions_api.py b/backend/cases/tests/test_permissions_api.py index d2f93c8ea..036381772 100644 --- a/backend/cases/tests/test_permissions_api.py +++ b/backend/cases/tests/test_permissions_api.py @@ -1,13 +1,13 @@ import json from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.models import Case, CaseComments, CasePhenotypeTerms from variants.tests.factories import CaseCommentsFactory, CaseFactory, CasePhenotypeTermsFactory -class TestCaseApiView(TestProjectAPIPermissionBase): +class TestCaseApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``Case``.""" def setUp(self): @@ -102,7 +102,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestCasePhenotypeTermsCreateListAjaxView(TestProjectAPIPermissionBase): +class TestCasePhenotypeTermsCreateListAjaxView(ProjectAPIPermissionTestBase): """Permission tests for the create/list API views dealing with ``CasePhenotypeTerms``.""" def setUp(self): @@ -153,7 +153,7 @@ def cleanup(): ) -class TestCasePhenotypeTermsRetrieveUpdateDestroyApiView(TestProjectAPIPermissionBase): +class TestCasePhenotypeTermsRetrieveUpdateDestroyApiView(ProjectAPIPermissionTestBase): """Permission tests for the retrieve/update/destroy AJAX views dealing with ``CasePhenotypeTerms``.""" def setUp(self): @@ -235,7 +235,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestAnnotationReleaseInfoListApiView(TestProjectAPIPermissionBase): +class TestAnnotationReleaseInfoListApiView(ProjectAPIPermissionTestBase): """Permission tests for the list API views dealing with ``AnnotationReleaseInfo``.""" def setUp(self): @@ -261,7 +261,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSvAnnotationReleaseInfoListApiView(TestProjectAPIPermissionBase): +class TestSvAnnotationReleaseInfoListApiView(ProjectAPIPermissionTestBase): """Permission tests for the list API views dealing with ``SvAnnotationReleaseInfo``.""" def setUp(self): @@ -287,7 +287,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestCaseCommentCreateListApiView(TestProjectAPIPermissionBase): +class TestCaseCommentCreateListApiView(ProjectAPIPermissionTestBase): """Permission tests for the create/list API views dealing with ``CaseComment``.""" def setUp(self): @@ -337,7 +337,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestCaseCommentRetrieveUpdateDestroyApiView(TestProjectAPIPermissionBase): +class TestCaseCommentRetrieveUpdateDestroyApiView(ProjectAPIPermissionTestBase): """Permission tests for the retrieve/update/destroy API views dealing with ``CaseComment``.""" def setUp(self): @@ -419,7 +419,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestCaseGeneAnnotationListApiView(TestProjectAPIPermissionBase): +class TestCaseGeneAnnotationListApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CaseGeneAnnotation``.""" def setUp(self): @@ -445,7 +445,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestCaseAlignmentStatsListApiView(TestProjectAPIPermissionBase): +class TestCaseAlignmentStatsListApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CaseAlignmentStats``.""" def setUp(self): @@ -471,7 +471,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSampleVariantStatisticsListApiView(TestProjectAPIPermissionBase): +class TestSampleVariantStatisticsListApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``SampleVariantStatistics``.""" def setUp(self): @@ -497,7 +497,7 @@ def test_list(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestPedigreeRelatednessListApiView(TestProjectAPIPermissionBase): +class TestPedigreeRelatednessListApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``PedigreeRelatedness``.""" def setUp(self): diff --git a/backend/cases/tests/test_views.py b/backend/cases/tests/test_views.py index 7edcc9203..17095b385 100644 --- a/backend/cases/tests/test_views.py +++ b/backend/cases/tests/test_views.py @@ -1,8 +1,8 @@ from django.urls import reverse -from projectroles.tests.test_permissions import TestProjectPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase -class TestCasesViews(TestProjectPermissionBase): +class TestCasesViews(ProjectPermissionTestBase): """Tests for the ``cases`` views""" def test_entrypoint(self): diff --git a/backend/cases/tests/test_views_ajax.py b/backend/cases/tests/test_views_ajax.py index 838376c83..3e7965c1c 100644 --- a/backend/cases/tests/test_views_ajax.py +++ b/backend/cases/tests/test_views_ajax.py @@ -5,7 +5,7 @@ from django.conf import settings from django.urls import reverse import jsonmatch -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cases.tests.factories import ( BAM_STATS_SAMPLE, @@ -38,7 +38,7 @@ TIMEF = settings.REST_FRAMEWORK["DATETIME_FORMAT"] -class TestCaseListAjaxView(TestProjectAPIPermissionBase): +class TestCaseListAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -147,7 +147,7 @@ def test_get_querylimit(self): self.assertEqual(response.status_code, 200) -class TestCaseRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestCaseRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -225,7 +225,7 @@ def test_destroy_case_no_roles(self): self._test_destroy_case_base(self.user_no_roles, allowed=False) -class TestCasePhenotypeTermsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestCasePhenotypeTermsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -290,7 +290,7 @@ def test_post(self): self.assertEqual(CasePhenotypeTerms.objects.count(), 1) -class TestCasePhenotypeTermsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestCasePhenotypeTermsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -360,7 +360,7 @@ def test_delete(self): self.assertEqual(CasePhenotypeTerms.objects.count(), 0) -class TestCaseCommentListCreateAjaxView(TestProjectAPIPermissionBase): +class TestCaseCommentListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.casecomment = CaseCommentsFactory(case__project=self.project) @@ -414,7 +414,7 @@ def test_post(self): self.assertEqual(CaseComments.objects.count(), 2) -class TestCaseCommentRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestCaseCommentRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.casecomment = CaseCommentsFactory( @@ -485,7 +485,7 @@ def test_delete(self): self.assertEqual(CaseComments.objects.count(), 0) -class TestCaseGeneAnnotationListAjaxView(TestProjectAPIPermissionBase): +class TestCaseGeneAnnotationListAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case_gene_annotation = CaseGeneAnnotationEntryFactory(case__project=self.project) @@ -513,7 +513,7 @@ def test_get(self): expected0.assert_matches(res_json[0]) -class TestProjectUserPermissionsAjaxView(TestProjectAPIPermissionBase): +class TestProjectUserPermissionsAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -596,7 +596,7 @@ def test_get_with_other_users(self): self.assertEqual(response.data, expected_perms, f"user={user}") -class TestCaseAlignmentStatsListApiView(TestProjectAPIPermissionBase): +class TestCaseAlignmentStatsListApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.casealignmentstats = CaseAlignmentStatsFactory(case__project=self.project) @@ -624,7 +624,7 @@ def test_get(self): ) -class TestSampleVariantStatisticsListApiView(TestProjectAPIPermissionBase): +class TestSampleVariantStatisticsListApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case, variant_set, _ = CaseWithVariantSetFactory.get("small", project=self.project) @@ -664,7 +664,7 @@ def test_get(self): ) -class TestPedigreeRelatednessListApiView(TestProjectAPIPermissionBase): +class TestPedigreeRelatednessListApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.pedigreerelatedness = PedigreeRelatednessFactory( diff --git a/backend/cases/urls.py b/backend/cases/urls.py index 2e2ee005f..728034379 100644 --- a/backend/cases/urls.py +++ b/backend/cases/urls.py @@ -1,152 +1,152 @@ -from django.conf.urls import url +from django.urls import path from cases import views, views_ajax, views_api app_name = "cases" ui_urlpatterns = [ - url( - regex=r"^vueapp/(?P[0-9a-f-]+)/?$", + path( + route="vueapp//", view=views.EntrypointView.as_view(), name="entrypoint", ), ] ajax_urlpatterns = [ - url( - regex=r"^ajax/case/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case/list//", view=views_ajax.CaseListAjaxView.as_view(), name="ajax-case-list", ), - url( - regex=r"^ajax/case/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case/retrieve-update-destroy//", view=views_ajax.CaseRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-case-retrieveupdatedestroy", ), - url( - regex=r"^ajax/case-comment/list-create/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-comment/list-create//", view=views_ajax.CaseCommentListCreateAjaxView.as_view(), name="ajax-casecomment-listcreate", ), - url( - regex=r"^ajax/case-comment/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-comment/retrieve-update-destroy//", view=views_ajax.CaseCommentRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-casecomment-retrieveupdatedestroy", ), - url( - regex=r"^ajax/case-phenotype-terms/list-create/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-phenotype-terms/list-create//", view=views_ajax.CasePhenotypeTermsListCreateAjaxView.as_view(), name="ajax-casephenotypeterms-listcreate", ), - url( - regex=r"^ajax/case-phenotype-terms/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-phenotype-terms/retrieve-update-destroy//", view=views_ajax.CasePhenotypeTermsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-casephenotypeterms-retrieveupdatedestroy", ), - url( - regex=r"^ajax/annotation-release-info/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/annotation-release-info/list//", view=views_ajax.AnnotationReleaseInfoAjaxView.as_view(), name="ajax-annotationreleaseinfo-list", ), - url( - regex=r"^ajax/sv-annotation-release-info/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/sv-annotation-release-info/list//", view=views_ajax.SvAnnotationReleaseInfoAjaxView.as_view(), name="ajax-svannotationreleaseinfo-list", ), - url( - regex=r"^ajax/case-gene-annotation/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-gene-annotation/list//", view=views_ajax.CaseGeneAnnotationListAjaxView.as_view(), name="ajax-casegeneannotation-list", ), - url( - regex=r"ajax/user-permissions/(?P[0-9a-f-]+)/?$", + path( + route="ajax/user-permissions//", view=views_ajax.ProjectUserPermissionsAjaxView.as_view(), name="ajax-userpermissions", ), - url( - regex=r"^ajax/case-alignment-stats/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-alignment-stats/list//", view=views_ajax.CaseAlignmentStatsListAjaxView.as_view(), name="ajax-casealignmentstats-list", ), - url( - regex=r"^ajax/case-variant-stats/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-variant-stats/list//", view=views_ajax.SampleVariantStatisticsListAjaxView.as_view(), name="ajax-casevariantstats-list", ), - url( - regex=r"^ajax/case-relatedness/list/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-relatedness/list//", view=views_ajax.PedigreeRelatednessListAjaxView.as_view(), name="ajax-caserelatedness-list", ), ] api_urlpatterns = [ - url( - regex=r"^api/case/count/(?P[0-9a-f-]+)/?$", + path( + route="api/case/count//", view=views_api.CaseCountApiView.as_view(), name="api-case-count", ), - url( - regex=r"^api/case/list/(?P[0-9a-f-]+)/?$", + path( + route="api/case/list//", view=views_api.CaseListApiView.as_view(), name="api-case-list", ), - url( - regex=r"^api/case/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + route="api/case/retrieve-update-destroy//", view=views_api.CaseRetrieveUpdateDestroyApiView.as_view(), name="api-case-retrieveupdatedestroy", ), - url( - regex=r"^api/case-comment/list-create/(?P[0-9a-f-]+)/?$", + path( + route="api/case-comment/list-create//", view=views_api.CaseCommentListCreateApiView.as_view(), name="api-casecomment-listcreate", ), - url( - regex=r"^ajax/case-comment/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + route="ajax/case-comment/retrieve-update-destroy//", view=views_api.CaseCommentRetrieveUpdateDestroyApiView.as_view(), name="api-casecomment-retrieveupdatedestroy", ), - url( - regex=r"^api/case-phenotype-terms/list-create/(?P[0-9a-f-]+)/?$", + path( + route="api/case-phenotype-terms/list-create//", view=views_api.CasePhenotypeTermsListCreateApiView.as_view(), name="api-casephenotypeterms-listcreate", ), - url( - regex=r"^api/case-phenotype-terms/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + route="api/case-phenotype-terms/retrieve-update-destroy//", view=views_api.CasePhenotypeTermsRetrieveUpdateDestroyApiView.as_view(), name="api-casephenotypeterms-retrieveupdatedestroy", ), - url( - regex=r"^api/annotation-release-info/list/(?P[0-9a-f-]+)/?$", + path( + route="api/annotation-release-info/list//", view=views_api.AnnotationReleaseInfoApiView.as_view(), name="api-annotationreleaseinfo-list", ), - url( - regex=r"^api/sv-annotation-release-info/list/(?P[0-9a-f-]+)/?$", + path( + route="api/sv-annotation-release-info/list//", view=views_api.SvAnnotationReleaseInfoApiView.as_view(), name="api-svannotationreleaseinfo-list", ), - url( - regex=r"^api/case-gene-annotation/list/(?P[0-9a-f-]+)/?$", + path( + route="api/case-gene-annotation/list//", view=views_ajax.CaseGeneAnnotationListAjaxView.as_view(), name="api-casegeneannotation-list", ), - url( - regex=r"^api/case-alignment-stats/list/(?P[0-9a-f-]+)/?$", + path( + route="api/case-alignment-stats/list//", view=views_ajax.CaseAlignmentStatsListAjaxView.as_view(), name="api-casealignmentstats-list", ), - url( - regex=r"^api/case-variant-stats/list/(?P[0-9a-f-]+)/?$", + path( + route="api/case-variant-stats/list//", view=views_ajax.SampleVariantStatisticsListAjaxView.as_view(), name="api-casevariantstats-list", ), - url( - regex=r"^api/case-relatedness/list/(?P[0-9a-f-]+)/?$", + path( + route="api/case-relatedness/list//", view=views_ajax.PedigreeRelatednessListAjaxView.as_view(), name="api-caserelatedness-list", ), - url( - regex=r"^api/user-and-global-settings/?$", + path( + route="api/user-and-global-settings/", view=views_api.UserAndGlobalSettingsView.as_view(), name="api-userandglobalsettings", ), diff --git a/backend/cases_analysis/tests/test_permissions_api.py b/backend/cases_analysis/tests/test_permissions_api.py index 4d7a10ffc..8ba4119e8 100644 --- a/backend/cases_analysis/tests/test_permissions_api.py +++ b/backend/cases_analysis/tests/test_permissions_api.py @@ -1,11 +1,11 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cases_analysis.tests.factories import CaseAnalysisFactory, CaseAnalysisSessionFactory from variants.tests.factories import CaseFactory -class TestCaseAnalysisViewSet(TestProjectAPIPermissionBase): +class TestCaseAnalysisViewSet(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``Case``.""" def setUp(self): @@ -52,7 +52,7 @@ def test_retrieve(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestCasenalysisSessionViewSet(TestProjectAPIPermissionBase): +class TestCasenalysisSessionViewSet(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``Case``.""" def setUp(self): diff --git a/backend/cases_import/models/executors.py b/backend/cases_import/models/executors.py index f539cfc3d..512f8cd7b 100644 --- a/backend/cases_import/models/executors.py +++ b/backend/cases_import/models/executors.py @@ -136,7 +136,7 @@ def __init__(self, project: Project): def _build_fs_options(self, project: Project) -> FileSystemOptions: """Build `FileSystemOptions` from project settings.""" app_settings = AppSettingAPI() - kwargs = {"app_name": "cases_import", "project": project} + kwargs = {"plugin_name": "cases_import", "project": project} path = app_settings.get(setting_name="import_data_path", **kwargs) or None if not path: diff --git a/backend/cases_import/tests/test_models_executor.py b/backend/cases_import/tests/test_models_executor.py index 51eb40ad9..1abac3c63 100644 --- a/backend/cases_import/tests/test_models_executor.py +++ b/backend/cases_import/tests/test_models_executor.py @@ -51,7 +51,7 @@ def _setUpExecutor(self, action, fac_kwargs=None): app_settings = AppSettingAPI() app_settings.set( - app_name="cases_import", + plugin_name="cases_import", setting_name="import_data_protocol", value="file", project=self.project, diff --git a/backend/cases_import/tests/test_permissions_api.py b/backend/cases_import/tests/test_permissions_api.py index ea3243383..690688f55 100644 --- a/backend/cases_import/tests/test_permissions_api.py +++ b/backend/cases_import/tests/test_permissions_api.py @@ -5,7 +5,7 @@ """ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cases_import.models.base import CaseImportAction from cases_import.proto import family_payload_with_updated_case_name @@ -13,7 +13,7 @@ from variants.tests.factories import CaseFactory -class CaseImportActionApiPermissionTest(TestProjectAPIPermissionBase): +class CaseImportActionApiPermissionTest(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.maxDiff = None diff --git a/backend/cases_qc/tests/test_permissions_api.py b/backend/cases_qc/tests/test_permissions_api.py index f615d3e32..9dbebe2c0 100644 --- a/backend/cases_qc/tests/test_permissions_api.py +++ b/backend/cases_qc/tests/test_permissions_api.py @@ -1,10 +1,10 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cases_qc.tests.factories import CaseQcFactory -class TestCaseQcRetrieveApiView(TestProjectAPIPermissionBase): +class TestCaseQcRetrieveApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CaseQc``.""" def setUp(self): @@ -32,7 +32,7 @@ def test_retrieve(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestVarfishStatsRetrieveApiView(TestProjectAPIPermissionBase): +class TestVarfishStatsRetrieveApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``VarfishStats``.""" def setUp(self): diff --git a/backend/cases_qc/tests/test_views_api.py b/backend/cases_qc/tests/test_views_api.py index ada8e82e4..87eccfc84 100644 --- a/backend/cases_qc/tests/test_views_api.py +++ b/backend/cases_qc/tests/test_views_api.py @@ -91,7 +91,7 @@ def _setUpExecutor(self, fac_kwargs: typing.Dict[str, str]): app_settings = AppSettingAPI() app_settings.set( - app_name="cases_import", + plugin_name="cases_import", setting_name="import_data_protocol", value="file", project=self.project, diff --git a/backend/cohorts/migrations/0008_alter_cohort_user.py b/backend/cohorts/migrations/0008_alter_cohort_user.py new file mode 100644 index 000000000..93b4c0557 --- /dev/null +++ b/backend/cohorts/migrations/0008_alter_cohort_user.py @@ -0,0 +1,28 @@ +# Generated by Django 4.2.16 on 2024-10-07 12:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("cohorts", "0007_alter_cohort_cases"), + ] + + operations = [ + migrations.AlterField( + model_name="cohort", + name="user", + field=models.ForeignKey( + blank=True, + help_text="User who created the cohorts", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(app_label)s_%(class)s_related", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/backend/cohorts/tests/test_permissions_ajax.py b/backend/cohorts/tests/test_permissions_ajax.py index 4a081c9ad..d33e69408 100644 --- a/backend/cohorts/tests/test_permissions_ajax.py +++ b/backend/cohorts/tests/test_permissions_ajax.py @@ -1,12 +1,12 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cohorts.models import CohortCase from cohorts.tests.factories import CohortCaseFactory, CohortFactory from variants.tests.factories import CaseFactory -class TestCohortApiView(TestProjectAPIPermissionBase): +class TestCohortApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``Case``.""" def setUp(self): @@ -98,7 +98,7 @@ def restore_cohort(): self.assert_response(url, bad_users, 403, method="DELETE") -class TestAccessibleProjectsCasesApiView(TestProjectAPIPermissionBase): +class TestAccessibleProjectsCasesApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views listing accessible projects included cases.""" def setUp(self): @@ -123,7 +123,7 @@ def test_list(self): self.assert_response(url, bad_users, 403, method="GET") -class TestCohortCaseApiView(TestProjectAPIPermissionBase): +class TestCohortCaseApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CohortCase``.""" def setUp(self): diff --git a/backend/cohorts/tests/test_permissions_api.py b/backend/cohorts/tests/test_permissions_api.py index d46c1b9ac..df6ef13bc 100644 --- a/backend/cohorts/tests/test_permissions_api.py +++ b/backend/cohorts/tests/test_permissions_api.py @@ -1,12 +1,12 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cohorts.models import CohortCase from cohorts.tests.factories import CohortCaseFactory, CohortFactory from variants.tests.factories import CaseFactory -class TestCohortApiView(TestProjectAPIPermissionBase): +class TestCohortApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``Case``.""" def setUp(self): @@ -105,7 +105,7 @@ def restore_cohort(): self.assert_response_api(url, bad_users_403, 403, method="DELETE") -class TestAccessibleProjectsCasesApiView(TestProjectAPIPermissionBase): +class TestAccessibleProjectsCasesApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views listing accessible projects included cases.""" def setUp(self): @@ -134,7 +134,7 @@ def test_list(self): self.assert_response_api(url, bad_users_403, 403, method="GET") -class TestCohortCaseApiView(TestProjectAPIPermissionBase): +class TestCohortCaseApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``CohortCase``.""" def setUp(self): diff --git a/backend/cohorts/tests/test_views_ui.py b/backend/cohorts/tests/test_views_ui.py index 8a149a459..ebf9864b8 100644 --- a/backend/cohorts/tests/test_views_ui.py +++ b/backend/cohorts/tests/test_views_ui.py @@ -1,8 +1,8 @@ -# from variants.tests.test_ui import TestUIBase +# from variants.tests.test_ui import UITestBase # # # TODO -# class TestEntrypointView(TestUIBase): +# class TestEntrypointView(UITestBase): # """Tests for cohorts entrypoint view.""" # # view = "cohorts:entrypoint" diff --git a/backend/cohorts/urls.py b/backend/cohorts/urls.py index c6ea11f69..00b9d85d9 100644 --- a/backend/cohorts/urls.py +++ b/backend/cohorts/urls.py @@ -1,85 +1,85 @@ """URL configuration for the ``importer`` app. """ -from django.conf.urls import url +from django.urls import path from . import views, views_ajax, views_api app_name = "cohorts" ui_urlpatterns = [ - url( - regex=r"^vueapp/(?P[0-9a-f-]+)/?$", + path( + "vueapp//", view=views.EntrypointView.as_view(), name="entrypoint", ), ] ajax_urlpatterns = [ - url( - regex=r"^ajax/cohort/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/cohort/list-create//", view=views_ajax.CohortListCreateAjaxView.as_view(), name="ajax-cohort-list-create", ), - url( - regex=r"^ajax/cohort/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/cohort/retrieve-update-destroy//", view=views_ajax.CohortRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-cohort-retrieve-update-destroy", ), - url( - regex=r"^ajax/cohortcase/create/(?P[0-9a-f-]+)/?$", + path( + "ajax/cohortcase/create//", view=views_ajax.CohortCaseCreateAjaxView.as_view(), name="ajax-cohortcase-create", ), - url( - regex=r"^ajax/cohortcase/list/(?P[0-9a-f-]+)/?$", + path( + "ajax/cohortcase/list//", view=views_ajax.CohortCaseListAjaxView.as_view(), name="ajax-cohortcase-list", ), - url( - regex=r"^ajax/cohortcase/destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/cohortcase/destroy//", view=views_ajax.CohortCaseDestroyAjaxView.as_view(), name="ajax-cohortcase-destroy", ), - url( - regex=r"^ajax/accessible-projects-cases/list/(?P[0-9a-f-]+)/?$", + path( + "ajax/accessible-projects-cases/list//", view=views_ajax.AccessibleProjectsCasesAjaxView.as_view(), name="ajax-accessible-projects-cases-list", ), - url( - regex=r"ajax/user-permissions/(?P[0-9a-f-]+)/?$", + path( + "ajax/user-permissions//", view=views_ajax.ProjectUserPermissionsAjaxView.as_view(), name="ajax-userpermissions", ), ] api_urlpatterns = [ - url( - regex=r"^api/cohort/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/cohort/list-create//", view=views_api.CohortListCreateApiView.as_view(), name="api-cohort-list-create", ), - url( - regex=r"^api/cohort/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "api/cohort/retrieve-update-destroy//", view=views_api.CohortRetrieveUpdateDestroyApiView.as_view(), name="api-cohort-retrieve-update-destroy", ), - url( - regex=r"^api/cohortcase/create/(?P[0-9a-f-]+)/?$", + path( + "api/cohortcase/create//", view=views_api.CohortCaseCreateApiView.as_view(), name="api-cohortcase-create", ), - url( - regex=r"^api/cohortcase/list/(?P[0-9a-f-]+)/?$", + path( + "api/cohortcase/list//", view=views_api.CohortCaseListApiView.as_view(), name="api-cohortcase-list", ), - url( - regex=r"^api/cohortcase/destroy/(?P[0-9a-f-]+)/?$", + path( + "api/cohortcase/destroy//", view=views_api.CohortCaseDestroyApiView.as_view(), name="api-cohortcase-destroy", ), - url( - regex=r"^api/accessible-projects-cases/list/(?P[0-9a-f-]+)/?$", + path( + "api/accessible-projects-cases/list//", view=views_api.AccessibleProjectsCasesApiView.as_view(), name="api-accessible-projects-cases-list", ), diff --git a/backend/config/settings/base.py b/backend/config/settings/base.py index ea570342e..122907363 100644 --- a/backend/config/settings/base.py +++ b/backend/config/settings/base.py @@ -77,11 +77,12 @@ "markupfield", "rest_framework", "knox", + "social_django", # For OIDC authentication "aldjemy", "adminalerts", + "projectroles.apps.ProjectrolesConfig", "appalerts.apps.AppalertsConfig", "userprofile.apps.UserprofileConfig", - "projectroles.apps.ProjectrolesConfig", "timeline.apps.TimelineConfig", "siteinfo.apps.SiteinfoConfig", "docs", # For the online user documentation/manual @@ -89,7 +90,6 @@ "dal_select2", "cryptographic_fields", "rest_framework_httpsignature", - "django_saml2_auth", "dj_iconify.apps.DjIconifyConfig", "drf_spectacular", "drf_spectacular_sidecar", @@ -435,7 +435,7 @@ # Location of root django.contrib.admin URL, use {% url 'admin:index' %} -ADMIN_URL = r"^admin/" +ADMIN_URL = "admin/" # Celery # ------------------------------------------------------------------------------ @@ -684,6 +684,18 @@ "DATETIME_FORMAT": "%Y-%m-%dT%H:%M:%SZ", } + +def custom_preprocessing_hook(endpoints): + filtered = [] + for path, path_regex, method, callback in endpoints: + # Remove all but DRF API endpoints + if path.startswith(("/project/", "/timeline/")): + continue + else: + filtered.append((path, path_regex, method, callback)) + return filtered + + SPECTACULAR_SETTINGS = { # Basic Settings "TITLE": "VarFish", @@ -694,6 +706,7 @@ # Skip schema generation for some paths. "PREPROCESSING_HOOKS": [ "varfish.spectacular_utils.spectacular_preprocess_hook", + "config.settings.base.custom_preprocessing_hook", ], # We add some explicit choices naming to work around warning. "ENUM_NAME_OVERRIDES": { @@ -861,85 +874,36 @@ def set_logging(level): DJANGO_SU_CUSTOM_LOGIN_ACTION = None -# SAML configuration +# OpenID Connect (OIDC) configuration # ------------------------------------------------------------------------------ +ENABLE_OIDC = env.bool("ENABLE_OIDC", False) -ENABLE_SAML = env.bool("ENABLE_SAML", False) -SAML2_AUTH = { - # Required setting - # - # Pysaml2 Saml client settings, cf. - # https://pysaml2.readthedocs.io/en/latest/howto/config.html - "SAML_CLIENT_SETTINGS": { - # The optional entity ID string to be passed in the 'Issuer' - # element of authn request, if required by the IDP. - "entityid": env.str("SAML_CLIENT_ENTITY_ID", "SODARcore"), - "entitybaseurl": env.str("SAML_CLIENT_ENTITY_URL", "https://localhost:8000"), - "metadata": { - "local": [ - env.str( - "SAML_CLIENT_METADATA_FILE", "metadata.xml" - ), # The auto(dynamic) metadata configuration URL of SAML2 - ], - }, - "service": { - "sp": { - "idp": env.str( - "SAML_CLIENT_IDP", - "https://sso.hpc.bihealth.org/auth/realms/cubi", - ), - # Keycloak expects client signature - "authn_requests_signed": "true", - # Enforce POST binding which is required by keycloak - "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST", - }, - }, - "key_file": env.str("SAML_CLIENT_KEY_FILE", "key.pem"), - "cert_file": env.str("SAML_CLIENT_CERT_FILE", "cert.pem"), - "xmlsec_binary": env.str("SAML_CLIENT_XMLSEC1", "/usr/bin/xmlsec1"), - "encryption_keypairs": [ - { - "key_file": env.str("SAML_CLIENT_KEY_FILE", "key.pem"), - "cert_file": env.str("SAML_CLIENT_CERT_FILE", "cert.pem"), - } - ], - }, - # Custom target redirect URL after the user get logged in. Default to - # /admin if not set. This setting will be overwritten if you have parameter - # ?next= specificed in the login URL. - "DEFAULT_NEXT_URL": "/", - # Optional settings - "NEW_USER_PROFILE": { - "USER_GROUPS": env.list("SAML_NEW_USER_GROUPS", default=[]), - "ACTIVE_STATUS": env.bool("SAML_NEW_USER_ACTIVE_STATUS", True), - "STAFF_STATUS": env.bool("SAML_NEW_USER_STAFF_STATUS", True), - "SUPERUSER_STATUS": env.bool("SAML_NEW_USER_SUPERUSER_STATUS", False), - }, - "ATTRIBUTES_MAP": env.dict( - "SAML_ATTRIBUTES_MAP", - default={ - "email": "urn:oid:1.2.840.113549.1.9.1", - "username": "username", - "first_name": "urn:oid:2.5.4.42", - "last_name": "urn:oid:2.5.4.4", - }, - ), - # Optional SAML Trigger - # Very unlikely to be needed in configuration, since it requires - # changes to the codebase - # 'TRIGGER': { - # 'FIND_USER': 'path.to.your.find.user.hook.method', - # 'NEW_USER': 'path.to.your.new.user.hook.method', - # 'CREATE_USER': 'path.to.your.create.user.hook.method', - # 'BEFORE_LOGIN': 'path.to.your.login.hook.method', - # }, -} - -# 'ASSERTION_URL': 'https://your.url.here', # Custom URL to validate incoming SAML requests against -assertion_url = env.str("SAML_ASSERTION_URL", None) -if assertion_url is not None: - SAML2_AUTH = {**SAML2_AUTH, **{"ASSERTION_URL": assertion_url}} +if ENABLE_OIDC: + AUTHENTICATION_BACKENDS = tuple( + itertools.chain( + ("social_core.backends.open_id_connect.OpenIdConnectAuth",), + AUTHENTICATION_BACKENDS, + ) + ) + TEMPLATES[0]["OPTIONS"]["context_processors"] += [ + "social_django.context_processors.backends", + "social_django.context_processors.login_redirect", + ] + SOCIAL_AUTH_JSONFIELD_ENABLED = True + SOCIAL_AUTH_JSONFIELD_CUSTOM = "django.db.models.JSONField" + SOCIAL_AUTH_USER_MODEL = AUTH_USER_MODEL + SOCIAL_AUTH_ADMIN_USER_SEARCH_FIELDS = [ + "username", + "name", + "first_name", + "last_name", + "email", + ] + SOCIAL_AUTH_OIDC_OIDC_ENDPOINT = env.str("SOCIAL_AUTH_OIDC_OIDC_ENDPOINT", None) + SOCIAL_AUTH_OIDC_KEY = env.str("SOCIAL_AUTH_OIDC_KEY", "CHANGEME") + SOCIAL_AUTH_OIDC_SECRET = env.str("SOCIAL_AUTH_OIDC_SECRET", "CHANGEME") + SOCIAL_AUTH_OIDC_USERNAME_KEY = env.str("SOCIAL_AUTH_OIDC_USERNAME_KEY", "username") # STORAGE CONFIGURATION diff --git a/backend/config/urls.py b/backend/config/urls.py index 52638824c..ffa0768d7 100644 --- a/backend/config/urls.py +++ b/backend/config/urls.py @@ -1,16 +1,15 @@ from django.conf import settings -from django.conf.urls import include, url +from django.conf.urls import include from django.conf.urls.static import static from django.contrib import admin from django.contrib.auth import views as auth_views from django.contrib.staticfiles import finders from django.http import HttpResponse from django.shortcuts import render -from django.urls import path +from django.urls import path, re_path from django.views import View from django.views import defaults as default_views from django.views.generic import TemplateView -import django_saml2_auth.views from djproxy.views import HttpProxy from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView from projectroles.views import HomeView as ProjectRolesHomeView @@ -24,74 +23,51 @@ def handler500(request, *args, **argv): return HttpResponse(status=500) -# URL Patterns for SAML / Logins -# ------------------------------------------------------------------------------ - -urlpatterns = [ - # These are the SAML2 related URLs. You can change "^saml2_auth/" regex to - # any path you want, like "^sso_auth/", "^sso_login/", etc. (required) - url(r"^saml2_auth/", include("django_saml2_auth.urls")), - # The following line will replace the default user login with SAML2 (optional) - # If you want to specific the after-login-redirect-URL, use parameter "?next=/the/path/you/want" - # with this view. - url(r"^sso/login/$", django_saml2_auth.views.signin), - # The following line will replace the admin login with SAML2 (optional) - # If you want to specific the after-login-redirect-URL, use parameter "?next=/the/path/you/want" - # with this view. - url(r"^sso/admin/login/$", django_saml2_auth.views.signin), - # The following line will replace the default user logout with the signout page (optional) - url(r"^sso/logout/$", django_saml2_auth.views.signout), - # The following line will replace the default admin user logout with the signout page (optional) - url(r"^sso/admin/logout/$", django_saml2_auth.views.signout), -] - # URL Patterns for SODAR Core # ------------------------------------------------------------------------------ -urlpatterns += [url(r"^$", ProjectRolesHomeView.as_view(), name="home")] +urlpatterns = [path("", ProjectRolesHomeView.as_view(), name="home")] HomeView = ProjectRolesHomeView # URL Patterns for VarFish # ------------------------------------------------------------------------------ urlpatterns += [ - url(r"^icons/", include("dj_iconify.urls")), - # url(r'^$', TemplateView.as_view(template_name='pages/home.html'), name='home'), - url(r"^variants/", include("variants.urls")), - url(r"^importer/", include("importer.urls")), - url(r"^svs/", include("svs.urls")), - url(r"^bgjobs/", include("bgjobs.urls")), - url(r"^about/$", TemplateView.as_view(template_name="pages/about.html"), name="about"), + path("icons/", include("dj_iconify.urls")), + path("variants/", include("variants.urls")), + path("importer/", include("importer.urls")), + path("svs/", include("svs.urls")), + path("bgjobs/", include("bgjobs.urls")), + path("about/", TemplateView.as_view(template_name="pages/about.html"), name="about"), # Django Admin, use {% url 'admin:index' %} - url(settings.ADMIN_URL, admin.site.urls), + path(settings.ADMIN_URL, admin.site.urls), # User management - # url(r'^users/', include('varfish.users.urls', namespace='users')), # Your stuff: custom urls includes go here - url(r"api/auth/", include("knox.urls")), - url(r"^login/$", auth_views.LoginView.as_view(template_name="users/login.html"), name="login"), - url(r"^logout/$", auth_views.logout_then_login, name="logout"), + path("api/auth/", include("knox.urls")), + path("login/", auth_views.LoginView.as_view(template_name="users/login.html"), name="login"), + path("logout/", auth_views.logout_then_login, name="logout"), # SODAR-core - url(r"^project/", include("projectroles.urls")), - url(r"^timeline/", include("timeline.urls")), - url(r"^admin_alerts/", include("adminalerts.urls")), - url(r"^app_alerts/", include("appalerts.urls")), - url(r"^siteinfo/", include("siteinfo.urls")), - url(r"^userprofile/", include("userprofile.urls")), - url(r"^tokens/", include("tokens.urls")), # will go to SODAR-core + path("project/", include("projectroles.urls")), + path("timeline/", include("timeline.urls")), + path("admin_alerts/", include("adminalerts.urls")), + path("app_alerts/", include("appalerts.urls")), + path("siteinfo/", include("siteinfo.urls")), + path("userprofile/", include("userprofile.urls")), + path("tokens/", include("tokens.urls")), # will go to SODAR-core # The rendered Sphinx-based manual. - url(r"^manual/", include("docs.urls")), - url(r"^su/", include("django_su.urls")), - url(r"^cohorts/", include("cohorts.urls")), - url(r"^beaconsite/", include("beaconsite.urls")), - url(r"^genepanels/", include("genepanels.urls")), - url(r"^vueapp/", include("varfish.vueapp.urls")), - url(r"^cases/", include("cases.urls")), - url(r"^varannos/", include("varannos.urls")), - url(r"^seqmeta/", include("seqmeta.urls")), - url(r"^cases-import/", include("cases_import.urls")), - url(r"^cases-qc/", include("cases_qc.urls")), - url(r"^cases-analysis/", include("cases_analysis.urls")), - url(r"^seqvars/", include("seqvars.urls")), + path("manual/", include("docs.urls")), + path("su/", include("django_su.urls")), + path("cohorts/", include("cohorts.urls")), + path("beaconsite/", include("beaconsite.urls")), + path("genepanels/", include("genepanels.urls")), + path("vueapp/", include("varfish.vueapp.urls")), + path("cases/", include("cases.urls")), + path("varannos/", include("varannos.urls")), + path("seqmeta/", include("seqmeta.urls")), + path("cases-import/", include("cases_import.urls")), + path("cases-qc/", include("cases_qc.urls")), + path("cases-analysis/", include("cases_analysis.urls")), + path("seqvars/", include("seqvars.urls")), ] # URL Patterns for DRF Spectacular @@ -115,53 +91,53 @@ def handler500(request, *args, **argv): urlpatterns += [ # Augment url patterns with proxy for genomics england panelapp. - url( - r"^proxy/panelapp/(?P.*)$", + re_path( + r"proxy/panelapp/(?P.*)$", HttpProxy.as_view( base_url="https://panelapp.genomicsengland.co.uk/api/", ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), # Augment url patterns with proxy for variantvalidator.org. - url( - r"^proxy/variantvalidator/(?P.*)$", + re_path( + r"proxy/variantvalidator/(?P.*)$", HttpProxy.as_view( base_url="https://rest.variantvalidator.org/VariantValidator/variantvalidator/", ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), # Augment URL patterns with proxy for local services. - url( - r"^proxy/varfish/annonars/(?P.*)$", + re_path( + r"proxy/varfish/annonars/(?P.*)$", HttpProxy.as_view( base_url=settings.VARFISH_BACKEND_URL_ANNONARS, ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), - url( - r"^proxy/varfish/mehari/(?P.*)$", + re_path( + r"proxy/varfish/mehari/(?P.*)$", HttpProxy.as_view( base_url=settings.VARFISH_BACKEND_URL_MEHARI, ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), - url( - r"^proxy/varfish/nginx/(?P.*)$", + re_path( + r"proxy/varfish/nginx/(?P.*)$", HttpProxy.as_view( base_url=settings.VARFISH_BACKEND_URL_NGINX, ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), # Augment url patterns with proxy for PubTator3 - url( - r"^proxy/remote/pubtator3-api/(?P.*)$", + re_path( + r"proxy/remote/pubtator3-api/(?P.*)$", HttpProxy.as_view( base_url="https://www.ncbi.nlm.nih.gov/research/pubtator3-api/", ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), - url( - r"^proxy/varfish/viguno/(?P.*)$", + re_path( + r"proxy/varfish/viguno/(?P.*)$", HttpProxy.as_view( base_url=settings.VARFISH_BACKEND_URL_VIGUNO, ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], @@ -189,8 +165,8 @@ def get(self, *args, **kwargs): return HttpResponse(content, content_type="text/html") urlpatterns += [ - url( - r"^-.*", + path( + "-.*", ServeStringView.as_view(), name="vueapp-entrypoint", ) @@ -203,20 +179,20 @@ def get(self, *args, **kwargs): # This allows the error pages to be debugged during development, just visit # these url in browser to see how these error pages look like. urlpatterns += [ - url(r"^400/$", default_views.bad_request, kwargs={"exception": Exception("Bad Request!")}), - url( - r"^403/$", + path("400/", default_views.bad_request, kwargs={"exception": Exception("Bad Request!")}), + path( + "403/", default_views.permission_denied, kwargs={"exception": Exception("Permission Denied")}, ), - url( - r"^404/$", + path( + "404/", default_views.page_not_found, kwargs={"exception": Exception("Page not Found")}, ), - url(r"^500/$", default_views.server_error), + path("500/", default_views.server_error), ] if "debug_toolbar" in settings.INSTALLED_APPS: import debug_toolbar - urlpatterns = [url(r"^__debug__/", include(debug_toolbar.urls))] + urlpatterns + urlpatterns = [path("__debug__/", include(debug_toolbar.urls))] + urlpatterns diff --git a/backend/genepanels/forms.py b/backend/genepanels/forms.py index 436638c50..491435849 100644 --- a/backend/genepanels/forms.py +++ b/backend/genepanels/forms.py @@ -24,8 +24,11 @@ def __init__(self, *args, **kwargs): self.fields["genes"] = self._build_genes_field() def _build_genes_field(self): - rows = [entry.symbol for entry in self.instance.genepanelentry_set.all()] - initial_value = "\n".join(rows) + if self.instance.pk: + rows = [entry.symbol for entry in self.instance.genepanelentry_set.all()] + initial_value = "\n".join(rows) + else: + initial_value = "" return forms.CharField( label="Genes", widget=forms.Textarea, diff --git a/backend/genepanels/tests/test_models.py b/backend/genepanels/tests/test_models.py index 2380cf354..4d18a3725 100644 --- a/backend/genepanels/tests/test_models.py +++ b/backend/genepanels/tests/test_models.py @@ -24,7 +24,9 @@ def test_create(self): def test_get_absolute_url(self): category = GenePanelCategoryFactory() - self.assertEqual(category.get_absolute_url(), f"/genepanels/category/{category.sodar_uuid}") + self.assertEqual( + category.get_absolute_url(), f"/genepanels/category/{category.sodar_uuid}/" + ) def test_str(self): category = GenePanelCategoryFactory() @@ -46,7 +48,7 @@ def test_create(self): def test_get_absolute_url(self): panel = GenePanelFactory() - self.assertEqual(panel.get_absolute_url(), f"/genepanels/panel/{panel.sodar_uuid}") + self.assertEqual(panel.get_absolute_url(), f"/genepanels/panel/{panel.sodar_uuid}/") def test_get_hgnc_list(self): panel = GenePanelFactory() diff --git a/backend/genepanels/tests/test_permissions.py b/backend/genepanels/tests/test_permissions.py index e7550ea59..9703bae70 100644 --- a/backend/genepanels/tests/test_permissions.py +++ b/backend/genepanels/tests/test_permissions.py @@ -1,5 +1,5 @@ from django.urls import reverse -from projectroles.tests.test_permissions import TestProjectPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase from genepanels.models import GenePanelState from genepanels.tests.factories import GenePanelFactory @@ -26,7 +26,7 @@ def setUp(self): ] -class TestGenepanelsView(UsersMixin, TestProjectPermissionBase): +class TestGenepanelsView(UsersMixin, ProjectPermissionTestBase): def test_index(self): url = reverse("genepanels:index") self.assert_response(url, self.users_edit + self.users_view, 200) diff --git a/backend/genepanels/urls.py b/backend/genepanels/urls.py index 34fd62f7d..25f2789f5 100644 --- a/backend/genepanels/urls.py +++ b/backend/genepanels/urls.py @@ -1,88 +1,88 @@ """URL configuration for the ``genepanels`` app. """ -from django.conf.urls import url +from django.urls import path from genepanels import views, views_api app_name = "genepanels" ui_urlpatterns = [ - url( - regex=r"^$", + path( + "", view=views.IndexView.as_view(), name="index", ), - url( - regex=r"^category/$", + path( + "category/", view=views.GenePanelCategoryListView.as_view(), name="category-list", ), - url( - regex=r"^category/create/$", + path( + "category/create/", view=views.GenePanelCategoryCreateView.as_view(), name="category-create", ), - url( - regex=r"^category/update/(?P[0-9a-f-]+)$", + path( + "category/update//", view=views.GenePanelCategoryUpdateView.as_view(), name="category-update", ), - url( - regex=r"^category/(?P[0-9a-f-]+)$", + path( + "category//", view=views.GenePanelCategoryDetailView.as_view(), name="category-detail", ), - url( - regex=r"^category/delete/(?P[0-9a-f-]+)$", + path( + "category/delete//", view=views.GenePanelCategoryDeleteView.as_view(), name="category-delete", ), - url( - regex=r"^panel/create/$", + path( + "panel/create/", view=views.GenePanelCreateView.as_view(), name="genepanel-create", ), - url( - regex=r"^panel/update/(?P[0-9a-f-]+)$", + path( + "panel/update//", view=views.GenePanelUpdateView.as_view(), name="genepanel-update", ), - url( - regex=r"^panel/(?P[0-9a-f-]+)$", + path( + "panel//", view=views.GenePanelDetailView.as_view(), name="genepanel-detail", ), - url( - regex=r"^panel/delete/(?P[0-9a-f-]+)$", + path( + "panel/delete//", view=views.GenePanelDeleteView.as_view(), name="genepanel-delete", ), - url( - regex=r"^panel/copy-as-draft/(?P[0-9a-f-]+)$", + path( + "panel/copy-as-draft//", view=views.GenePanelCopyAsDraftView.as_view(), name="genepanel-copy-as-draft", ), - url( - regex=r"^panel/release/(?P[0-9a-f-]+)$", + path( + "panel/release//", view=views.GenePanelReleaseView.as_view(), name="genepanel-release", ), - url( - regex=r"^panel/retire/(?P[0-9a-f-]+)$", + path( + "panel/retire//", view=views.GenePanelRetireView.as_view(), name="genepanel-retire", ), ] api_patterns = [ - url( - regex=r"^api/genepanel-category/list/$", + path( + "api/genepanel-category/list/", view=views_api.GenePanelCategoryListApiView.as_view(), name="genepanel-category-list", ), - url( - regex=r"^api/lookup-genepanel/$", + path( + "api/lookup-genepanel/", view=views_api.LookupGenePanelApiView.as_view(), name="lookup-genepanel", ), diff --git a/backend/importer/migrations/0012_alter_importcasebgjob_bg_job.py b/backend/importer/migrations/0012_alter_importcasebgjob_bg_job.py new file mode 100644 index 000000000..4d3db4033 --- /dev/null +++ b/backend/importer/migrations/0012_alter_importcasebgjob_bg_job.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.16 on 2024-10-07 12:53 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("bgjobs", "0001_squashed_0006_auto_20200526_1657"), + ("importer", "0011_casegeneannotationfile"), + ] + + operations = [ + migrations.AlterField( + model_name="importcasebgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + ] diff --git a/backend/importer/urls.py b/backend/importer/urls.py index 2bdc4a395..ba6d08d1a 100644 --- a/backend/importer/urls.py +++ b/backend/importer/urls.py @@ -1,92 +1,89 @@ """URL configuration for the ``importer`` app. """ -from django.conf.urls import url +from django.urls import path from . import views, views_api app_name = "importer" ui_urlpatterns = [ - url(regex=r"^import-info$", view=views.ImportInfoView.as_view(), name="import-info"), - url( - regex=r"^(?P[0-9a-f-]+)/import/(?P[0-9a-f-]+)/$", + path("import-info/", view=views.ImportInfoView.as_view(), name="import-info"), + path( + "/import//", view=views.ImportCaseBgJobDetailView.as_view(), name="import-case-job-detail", ), ] api_urlpatterns = [ - url( - regex=r"^api/case-import-info/(?P[0-9a-f-]+)/$", + path( + "api/case-import-info//", view=views_api.CaseImportInfoListCreateView.as_view(), name="api-case-import-info-list-create", ), - url( - regex=r"^api/case-import-info/(?P[0-9a-f-]+)/(?P[0-9a-f-]+)/$", + path( + "api/case-import-info///", view=views_api.CaseImportInfoRetrieveUpdateDestroyView.as_view(), name="api-case-import-info-retrieve-update-destroy", ), - url( - regex=r"^api/variant-set-import-info/(?P[0-9a-f-]+)/$", + path( + "api/variant-set-import-info//", view=views_api.VariantSetImportInfoListCreateView.as_view(), name="api-variant-set-import-info-list-create", ), - url( - regex=r"^api/variant-set-import-info/(?P[0-9a-f-]+)/(?P[0-9a-f-]+)/$", + path( + "api/variant-set-import-info///", view=views_api.VariantSetImportInfoRetrieveUpdateDestroyView.as_view(), name="api-variant-set-import-info-retrieve-update-destroy", ), - url( - regex=r"^api/bam-qc-file/(?P[0-9a-f-]+)/$", + path( + "api/bam-qc-file//", view=views_api.BamQcFileListCreateView.as_view(), name="api-bam-qc-file-list-create", ), - url( - regex=r"^api/bam-qc-file/(?P[0-9a-f-]+)/(?P[0-9a-f-]+)/$", + path( + "api/bam-qc-file///", view=views_api.BamQcFileRetrieveDestroyView.as_view(), name="api-bam-qc-file-retrieve-destroy", ), - url( - regex=r"^api/case-gene-annotation-file/(?P[0-9a-f-]+)/$", + path( + "api/case-gene-annotation-file//", view=views_api.CaseGeneAnnotationFileListCreateView.as_view(), name="api-case-gene-annotation-file-list-create", ), - url( - regex=( - r"^api/case-gene-annotation-file/(?P[0-9a-f-]+)/" - r"(?P[0-9a-f-]+)/$" - ), + path( + "api/case-gene-annotation-file///", view=views_api.CaseGeneAnnotationFileRetrieveDestroyView.as_view(), name="api-case-gene-annotation-file-retrieve-destroy", ), - url( - regex=r"^api/genotype-file/(?P[0-9a-f-]+)/$", + path( + "api/genotype-file//", view=views_api.GenotypeFileListCreateView.as_view(), name="api-genotype-file-list-create", ), - url( - regex=r"^api/genotype-file/(?P[0-9a-f-]+)/(?P[0-9a-f-]+)/$", + path( + "api/genotype-file///", view=views_api.GenotypeFileRetrieveDestroyView.as_view(), name="api-genotype-file-retrieve-destroy", ), - url( - regex=r"^api/effects-file/(?P[0-9a-f-]+)/$", + path( + "api/effects-file//", view=views_api.EffectsFileListCreateView.as_view(), name="api-effects-file-list-create", ), - url( - regex=r"^api/effects-file/(?P[0-9a-f-]+)/(?P[0-9a-f-]+)/$", + path( + "api/effects-file///", view=views_api.EffectsFileRetrieveDestroyView.as_view(), name="api-effects-file-retrieve-destroy", ), - url( - regex=r"^api/database-info-file/(?P[0-9a-f-]+)/$", + path( + "api/database-info-file//", view=views_api.DatabaseInfoFileListCreateView.as_view(), name="api-db-info-file-list-create", ), - url( - regex=r"^api/database-info-file/(?P[0-9a-f-]+)/(?P[0-9a-f-]+)/$", + path( + "api/database-info-file///", view=views_api.DatabaseInfoFileRetrieveDestroyView.as_view(), name="api-db-info-file-retrieve-destroy", ), diff --git a/backend/seqmeta/tests/test_models.py b/backend/seqmeta/tests/test_models.py index 96acef346..22492066e 100644 --- a/backend/seqmeta/tests/test_models.py +++ b/backend/seqmeta/tests/test_models.py @@ -12,7 +12,7 @@ def test_create(self): def test_get_absolute_url(self): kit = EnrichmentKitFactory() - self.assertEqual(kit.get_absolute_url(), f"/seqmeta/enrichmentkit/{kit.sodar_uuid}") + self.assertEqual(kit.get_absolute_url(), f"/seqmeta/enrichmentkit/{kit.sodar_uuid}/") def test_str(self): kit = EnrichmentKitFactory() diff --git a/backend/seqmeta/tests/test_permissions.py b/backend/seqmeta/tests/test_permissions.py index 4d996a957..648396038 100644 --- a/backend/seqmeta/tests/test_permissions.py +++ b/backend/seqmeta/tests/test_permissions.py @@ -1,5 +1,5 @@ from django.urls import reverse -from projectroles.tests.test_permissions import TestProjectPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase from seqmeta.tests.factories import EnrichmentKitFactory @@ -23,7 +23,7 @@ def setUp(self): ] -class TestSeqmetaView(UsersMixin, TestProjectPermissionBase): +class TestSeqmetaView(UsersMixin, ProjectPermissionTestBase): def test_index(self): url = reverse("seqmeta:index") self.assert_response(url, self.users_edit + self.users_view, 200) diff --git a/backend/seqmeta/urls.py b/backend/seqmeta/urls.py index f3a9a54e3..7fd9afc4c 100644 --- a/backend/seqmeta/urls.py +++ b/backend/seqmeta/urls.py @@ -1,22 +1,22 @@ -from django.conf.urls import url +from django.urls import path from seqmeta import views, views_api app_name = "seqmeta" ui_urlpatterns = [ - url( - regex=r"^$", + path( + "", view=views.IndexView.as_view(), name="index", ), - url( - regex=r"^enrichmentkit/?$", + path( + "enrichmentkit/", view=views.EnrichmentKitListView.as_view(), name="enrichmentkit-list", ), - url( - regex=r"^enrichmentkit/(?P[0-9a-f-]+)/?$", + path( + "enrichmentkit//", view=views.EnrichmentKitDetailView.as_view(), name="enrichmentkit-detail", ), @@ -25,23 +25,23 @@ ajax_urlpatterns = [] api_urlpatterns = [ - url( - regex=r"^api/enrichmentkit/list-create/?$", + path( + "api/enrichmentkit/list-create/", view=views_api.EnrichmentKitListCreateApiView.as_view(), name="api-enrichmentkit-listcreate", ), - url( - regex=r"^api/enrichmentkit/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "api/enrichmentkit/retrieve-update-destroy//", view=views_api.EnrichmentKitRetrieveUpdateDestroyApiView.as_view(), name="api-enrichmentkit-retrieveupdatedestroy", ), - url( - regex=r"^api/targetbedfile/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/targetbedfile/list-create//", view=views_api.TargetBedFileListCreateApiView.as_view(), name="api-targetbedfile-listcreate", ), - url( - regex=r"^api/targetbedfile/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "api/targetbedfile/retrieve-update-destroy//", view=views_api.TargetBedFileRetrieveUpdateDestroyApiView.as_view(), name="api-targetbedfile-retrieveupdatedestroy", ), diff --git a/backend/seqvars/tests/test_permissions_api.py b/backend/seqvars/tests/test_permissions_api.py index 713cb0954..083b3f305 100644 --- a/backend/seqvars/tests/test_permissions_api.py +++ b/backend/seqvars/tests/test_permissions_api.py @@ -1,5 +1,5 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from cases_analysis.tests.factories import CaseAnalysisFactory, CaseAnalysisSessionFactory from seqvars.factory_defaults import create_seqvarspresetsset_short_read_exome_legacy @@ -59,7 +59,7 @@ from variants.tests.factories import CaseFactory -class TestQueryPresetsSetViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsSetViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -202,7 +202,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsVersionSetViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsVersionSetViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -353,7 +353,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsFrequencyViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsFrequencyViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -507,7 +507,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsQualityViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsQualityViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -659,7 +659,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsConsequenceViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsConsequenceViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -813,7 +813,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsLocusViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsLocusViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -963,7 +963,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsPhenotypePrioViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsPhenotypePrioViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -1117,7 +1117,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsVariantPrioViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsVariantPrioViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -1271,7 +1271,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsColumnsViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsColumnsViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -1423,7 +1423,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryPresetsClinvarViewSet(TestProjectAPIPermissionBase): +class TestQueryPresetsClinvarViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -1575,7 +1575,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestPredefinedQueryViewSet(TestProjectAPIPermissionBase): +class TestPredefinedQueryViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -1725,7 +1725,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQuerySettingsViewSet(TestProjectAPIPermissionBase): +class TestQuerySettingsViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -1923,7 +1923,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestQueryViewSet(TestProjectAPIPermissionBase): +class TestQueryViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -2192,7 +2192,7 @@ def cleanup(): ) -class TestQueryExecutionViewSet(TestProjectAPIPermissionBase): +class TestQueryExecutionViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -2246,7 +2246,7 @@ def test_retrieve(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestResultSetViewSet(TestProjectAPIPermissionBase): +class TestResultSetViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() @@ -2301,7 +2301,7 @@ def test_retrieve(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestResultRowViewSet(TestProjectAPIPermissionBase): +class TestResultRowViewSet(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() diff --git a/backend/svs/migrations/0029_alter_buildbackgroundsvsetjob_bg_job_and_more.py b/backend/svs/migrations/0029_alter_buildbackgroundsvsetjob_bg_job_and_more.py new file mode 100644 index 000000000..f1668d2ac --- /dev/null +++ b/backend/svs/migrations/0029_alter_buildbackgroundsvsetjob_bg_job_and_more.py @@ -0,0 +1,59 @@ +# Generated by Django 4.2.16 on 2024-10-07 12:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("bgjobs", "0001_squashed_0006_auto_20200526_1657"), + ("svs", "0028_auto_20240807_0850"), + ] + + operations = [ + migrations.AlterField( + model_name="buildbackgroundsvsetjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="cleanupbackgroundsvsetjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="importstructuralvariantbgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="svquery", + name="user", + field=models.ForeignKey( + blank=True, + help_text="User who created the query", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(app_label)s_%(class)s_related", + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/backend/svs/tests/test_permissions_ajax_presets.py b/backend/svs/tests/test_permissions_ajax_presets.py index f4521447f..de64b4c3a 100644 --- a/backend/svs/tests/test_permissions_ajax_presets.py +++ b/backend/svs/tests/test_permissions_ajax_presets.py @@ -1,12 +1,12 @@ """Permission tests for the views in ``svs.views.ajax.presets``.""" from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.tests.factories import CaseFactory -class TestSvQuerySettingsShortcutAjaxView(TestProjectAPIPermissionBase): +class TestSvQuerySettingsShortcutAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) diff --git a/backend/svs/tests/test_permissions_ajax_queries.py b/backend/svs/tests/test_permissions_ajax_queries.py index 0f3b22ef2..0faffd64e 100644 --- a/backend/svs/tests/test_permissions_ajax_queries.py +++ b/backend/svs/tests/test_permissions_ajax_queries.py @@ -1,14 +1,14 @@ """Permission tests for the views in ``svs.views.ajax.queries``.""" from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from svs.models import SvQuery from svs.tests.factories import SvQueryFactory, SvQueryResultRowFactory, SvQueryResultSetFactory from variants.tests.factories import CaseFactory -class TestSvQueryListCreateAjaxView(TestProjectAPIPermissionBase): +class TestSvQueryListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -45,7 +45,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestSvQueryRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestSvQueryRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -108,7 +108,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestSvQueryResultSetListAjaxView(TestProjectAPIPermissionBase): +class TestSvQueryResultSetListAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -131,7 +131,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSvQueryResultSetRetrieveAjaxView(TestProjectAPIPermissionBase): +class TestSvQueryResultSetRetrieveAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -157,7 +157,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSvQueryResultRowListAjaxView(TestProjectAPIPermissionBase): +class TestSvQueryResultRowListAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -183,7 +183,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSvQueryResultRowRetrieveView(TestProjectAPIPermissionBase): +class TestSvQueryResultRowRetrieveView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) diff --git a/backend/svs/urls.py b/backend/svs/urls.py index 8924958cb..ce964caf6 100644 --- a/backend/svs/urls.py +++ b/backend/svs/urls.py @@ -1,5 +1,5 @@ from django.conf import settings -from django.conf.urls import url +from django.urls import path, re_path from djproxy.views import HttpProxy from svs import views @@ -8,136 +8,136 @@ urlpatterns_ui = [ # Views related to background SV jobs. - url( - regex=r"^(?P[0-9a-f-]+)/import/(?P[0-9a-f-]+)/?$", + path( + "/import//", view=views.ImportStructuralVariantsJobDetailView.as_view(), name="import-job-detail", ), - url( - regex=r"^build-bg-sv/(?P[0-9a-f-]+)/?$", + path( + "build-bg-sv//", view=views.BuildBackgroundSvSetJobDetailView.as_view(), name="build-bg-sv-set-job-detail", ), - url( - regex=r"^cleanup-bg-sv/(?P[0-9a-f-]+)/?$", + path( + "cleanup-bg-sv//", view=views.CleanupBackgroundSvSetJobDetailView.as_view(), name="cleanup-bg-sv-set-job-detail", ), ] urlpatterns_ajax = [ - url( - regex=r"^ajax/fetch-variants/(?P[0-9a-f-]+)/?$", + path( + "ajax/fetch-variants//", view=views.SvFetchVariantsAjaxView.as_view(), name="ajax-variants-fetch", ), - url( - regex=r"^ajax/query-case/quick-presets/?$", + path( + "ajax/query-case/quick-presets", view=views.SvQuickPresetsAjaxView.as_view(), name="ajax-quick-presets", ), - url( - regex=r"^ajax/query-case/category-presets/(?P[a-zA-Z0-9\._-]+)/?$", + path( + "ajax/query-case/category-presets//", view=views.SvCategoryPresetsApiView.as_view(), name="ajax-category-presets", ), - url( - regex=r"^ajax/query-case/inheritance-presets/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/inheritance-presets//", view=views.SvInheritancePresetsApiView.as_view(), name="ajax-inheritance-presets", ), # URLs for ``svs.queries.presets`` - url( - regex=r"^ajax/query-case/query-settings-shortcut/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/query-settings-shortcut//", view=views.SvQuerySettingsShortcutAjaxView.as_view(), name="ajax-svquerysettings-shortcut", ), # URLs for ``svs.queries.results`` - url( - regex=r"^ajax/sv-query/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/sv-query/list-create//", view=views.SvQueryListCreateAjaxView.as_view(), name="ajax-svquery-listcreate", ), - url( - regex=r"^ajax/sv-query/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/sv-query/retrieve-update-destroy//", view=views.SvQueryRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-svquery-retrieveupdatedestroy", ), - url( - regex=r"^sv-query-result-set/list/(?P[0-9a-f-]+)/?$", + path( + "sv-query-result-set/list//", view=views.SvQueryResultSetListAjaxView.as_view(), name="ajax-svqueryresultset-list", ), - url( - regex=r"^sv-query-result-set/retrieve/(?P[0-9a-f-]+)/?$", + path( + "sv-query-result-set/retrieve//", view=views.SvQueryResultSetRetrieveAjaxView.as_view(), name="ajax-svqueryresultset-retrieve", ), - url( - regex=r"^sv-query-result-row/list/(?P[0-9a-f-]+)/?$", + path( + "sv-query-result-row/list//", view=views.SvQueryResultRowListAjaxView.as_view(), name="ajax-svqueryresultrow-list", ), - url( - regex=r"^sv-query-result-row/retrieve/(?P[0-9a-f-]+)/?$", + path( + "sv-query-result-row/retrieve//", view=views.SvQueryResultRowRetrieveAjaxView.as_view(), name="ajax-svqueryresultrow-retrieve", ), # URLs user annotations (flags, comments) - url( - regex=r"^ajax/structural-variant-flags/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-flags/list-create//", view=views.StructuralVariantFlagsListCreateAjaxView.as_view(), name="ajax-structuralvariantflags-listcreate", ), - url( - regex=r"^ajax/structural-variant-flags/list-project/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-flags/list-project//", view=views.StructuralVariantFlagsListProjectAjaxView.as_view(), name="ajax-structuralvariantflags-listproject", ), - url( - regex=r"^ajax/structural-variant-flags/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-flags/retrieve-update-destroy//", view=views.StructuralVariantFlagsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-structuralvariantflags-retrieveupdatedestroy", ), - url( - regex=r"^ajax/structural-variant-comment/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-comment/list-create//", view=views.StructuralVariantCommentListCreateAjaxView.as_view(), name="ajax-structuralvariantcomment-listcreate", ), - url( - regex=r"^ajax/structural-variant-comment/list-project/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-comment/list-project//", view=views.StructuralVariantCommentListProjectAjaxView.as_view(), name="ajax-structuralvariantcomment-listproject", ), - url( - regex=r"^ajax/structural-variant-comment/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-comment/retrieve-update-destroy//", view=views.StructuralVariantCommentRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-structuralvariantcomment-retrieveupdatedestroy", ), - url( - regex=r"^ajax/structural-variant-acmg-rating/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-acmg-rating/list-create//", view=views.StructuralVariantAcmgRatingListCreateAjaxView.as_view(), name="ajax-structuralvariantacmgrating-listcreate", ), - url( - regex=r"^ajax/structural-variant-acmg-rating/list-project/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-acmg-rating/list-project//", view=views.StructuralVariantAcmgRatingListProjectAjaxView.as_view(), name="ajax-structuralvariantacmgrating-listproject", ), - url( - regex=r"^ajax/structural-variant-acmg-rating/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/structural-variant-acmg-rating/retrieve-update-destroy//", view=views.StructuralVariantAcmgRatingRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-structuralvariantacmgrating-retrieveupdatedestroy", ), # Augment url patterns with proxy to worker. - url( + re_path( r"^worker/(?P.*)$", HttpProxy.as_view( base_url=f"{settings.WORKER_REST_BASE_URL}/public/svs/", ignored_request_headers=HttpProxy.ignored_upstream_headers + ["cookie"], ), ), - url( + re_path( r"^tracks/(?P.*)$", HttpProxy.as_view( base_url=f"{settings.WORKER_REST_BASE_URL}/public/tracks/", diff --git a/backend/varannos/tests/helpers.py b/backend/varannos/tests/helpers.py index cb40d4c23..69d67b68a 100644 --- a/backend/varannos/tests/helpers.py +++ b/backend/varannos/tests/helpers.py @@ -1,6 +1,6 @@ from django.conf import settings from django.test import RequestFactory -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from test_plus import TestCase from variants.tests.factories import ProjectFactory @@ -11,7 +11,7 @@ VARFISH_INVALID_VERSION = "0.0.0" -class TestViewsBase(TestCase): +class ViewTestBase(TestCase): def setUp(self): super().setUp() self.superuser = self.make_user("superuser") @@ -28,7 +28,7 @@ def setUp(self): self.request_factory = RequestFactory() -class ApiViewTestBase(ViewTestBaseMixin, TestProjectAPIPermissionBase): +class ApiViewTestBase(ViewTestBaseMixin, ProjectAPIPermissionTestBase): """Base class for API view testing (and file export)""" media_type = settings.SODAR_API_MEDIA_TYPE diff --git a/backend/varannos/tests/test_models.py b/backend/varannos/tests/test_models.py index bea8b47b9..4567fe96b 100644 --- a/backend/varannos/tests/test_models.py +++ b/backend/varannos/tests/test_models.py @@ -17,7 +17,7 @@ def test_create(self): def test_get_absolute_url(self): obj = VarAnnoSetFactory() - self.assertEqual(obj.get_absolute_url(), f"/varannos/varannoset/details/{obj.sodar_uuid}") + self.assertEqual(obj.get_absolute_url(), f"/varannos/varannoset/details/{obj.sodar_uuid}/") def test_days_since_modification(self): with freeze_time((datetime.now() - timedelta(days=10)).strftime("%Y-%m-%d")): diff --git a/backend/varannos/tests/test_permissions.py b/backend/varannos/tests/test_permissions.py index fcc0d3dc9..6316f1a02 100644 --- a/backend/varannos/tests/test_permissions.py +++ b/backend/varannos/tests/test_permissions.py @@ -1,10 +1,10 @@ from django.urls import reverse -from projectroles.tests.test_permissions import TestProjectPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase from varannos.tests.factories import VarAnnoSetFactory -class TestVarAnnoSetViews(TestProjectPermissionBase): +class TestVarAnnoSetViews(ProjectPermissionTestBase): """Permission tests for the ``VarAnnoSet`` views""" def setUp(self): diff --git a/backend/varannos/tests/test_permissions_api.py b/backend/varannos/tests/test_permissions_api.py index 12c0ab92e..474874a5f 100644 --- a/backend/varannos/tests/test_permissions_api.py +++ b/backend/varannos/tests/test_permissions_api.py @@ -1,11 +1,11 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from varannos.models import VarAnnoSet from varannos.tests.factories import VarAnnoSetFactory -class TestVarAnnoSetApiView(TestProjectAPIPermissionBase): +class TestVarAnnoSetApiView(ProjectAPIPermissionTestBase): """Permission tests for the API views dealing with ``VarAnnoSet``.""" def setUp(self): diff --git a/backend/varannos/urls.py b/backend/varannos/urls.py index db9887cf6..68cabcfcd 100644 --- a/backend/varannos/urls.py +++ b/backend/varannos/urls.py @@ -1,16 +1,16 @@ -from django.conf.urls import url +from django.urls import path from varannos import views, views_api app_name = "varannos" ui_urlpatterns = [ - url( - regex=r"^varannoset/list/(?P[0-9a-f-]+)/?$", + path( + "varannoset/list//", view=views.VarAnnoSetListView.as_view(), name="varannoset-list", ), - url( - regex=r"^varannoset/details/(?P[0-9a-f-]+)/?$", + path( + "varannoset/details//", view=views.VarAnnoSetDetailView.as_view(), name="varannoset-detail", ), @@ -19,23 +19,23 @@ ajax_urlpatterns = [] api_urlpatterns = [ - url( - regex=r"^api/varannoset/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/varannoset/list-create//", view=views_api.VarAnnoSetListCreateApiView.as_view(), name="api-varannoset-listcreate", ), - url( - regex=r"^api/varannoset/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "api/varannoset/retrieve-update-destroy//", view=views_api.VarAnnoSetRetrieveUpdateDestroyApiView.as_view(), name="api-varannoset-retrieveupdatedestroy", ), - url( - regex=r"^api/varannosetentry/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/varannosetentry/list-create//", view=views_api.VarAnnoSetEntryListCreateApiView.as_view(), name="api-varannosetentry-listcreate", ), - url( - regex=r"^api/varannosetentry/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "api/varannosetentry/retrieve-update-destroy//", view=views_api.VarAnnoSetEntryRetrieveUpdateDestroyApiView.as_view(), name="api-varannosetentry-retrieveupdatedestroy", ), diff --git a/backend/varfish/templates/users/login.html b/backend/varfish/templates/users/login.html index 80e5d7d45..a55b1755b 100644 --- a/backend/varfish/templates/users/login.html +++ b/backend/varfish/templates/users/login.html @@ -1,110 +1 @@ -{# Custom login page based on SODAR Core v0.10 #} -{% extends 'base.html' %} - -{% load static %} - -{% load cases_tags %} -{% load projectroles_tags %} -{% load projectroles_common_tags %} - -{% get_django_setting 'SITE_INSTANCE_TITLE' as site_title %} - -{% block title %}Login{% endblock title %} - -{% block content %} - -
- - {# Django messages / site app messages #} - {% include 'projectroles/_messages.html' %} - - {# Display error if login was unsuccessful. #} - {% if request.POST %} -
- Login failed. Please make sure the user name, domain and password are correct. - - - -
- {% endif %} - -
-

Login

- - {% autoescape off %} - {% get_login_info %} - {% get_login_page_text %} - {% endautoescape %} - - - {% get_django_setting 'ENABLE_SAML' as enable_saml %} - {% if enable_saml %} -
-

To log in with your SSO provider, please click below.

- - Single Sign-On - - {% endif %} -
-
- -{% endblock content %} - -{% block javascript %} - {{ block.super }} - - - - - {# Tour content #} - -{% endblock javascript %} +{% extends 'projectroles/login.html' %} \ No newline at end of file diff --git a/backend/varfish/tests/drf_openapi_schema/varfish_api_schema.yaml b/backend/varfish/tests/drf_openapi_schema/varfish_api_schema.yaml index 79f53d6e9..a3e204ebd 100644 --- a/backend/varfish/tests/drf_openapi_schema/varfish_api_schema.yaml +++ b/backend/varfish/tests/drf_openapi_schema/varfish_api_schema.yaml @@ -441,7 +441,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -484,7 +484,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -526,7 +526,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -579,7 +579,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -621,7 +621,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -662,7 +662,7 @@ paths: name: casephenotypeterms schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -690,7 +690,7 @@ paths: name: casephenotypeterms schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -730,7 +730,7 @@ paths: name: casephenotypeterms schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -769,7 +769,7 @@ paths: name: casephenotypeterms schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -789,7 +789,7 @@ paths: name: project schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true - in: query name: q @@ -844,7 +844,7 @@ paths: name: project schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true - in: query name: q @@ -879,7 +879,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -909,7 +909,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -951,7 +951,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -992,7 +992,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -1017,7 +1017,7 @@ paths: name: case schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - cases @@ -1107,974 +1107,249 @@ paths: schema: $ref: '#/components/schemas/GenePanel' description: '' - /project/api/create: - post: - operationId: project_api_create_create - description: |- - Create a project or a category. - - **URL:** ``/project/api/create`` - - **Methods:** ``POST`` - - **Parameters:** - - - ``title``: Project title (string) - - ``type``: Project type (string, options: ``PROJECT`` or ``CATEGORY``) - - ``parent``: Parent category UUID (string) - - ``description``: Project description (string, optional) - - ``readme``: Project readme (string, optional, supports markdown) - - ``public_guest_access``: Guest access for all users (boolean) - - ``owner``: User UUID of the project owner (string) + /seqmeta/api/enrichmentkit/list-create/: + get: + operationId: seqmeta_api_enrichmentkit_list_create_list + description: DRF list-create API view the ``EnrichmentKit`` model. tags: - - project - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ProjectRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/ProjectRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/ProjectRequest' - required: true + - seqmeta security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: - '201': + '200': content: - application/vnd.bihealth.sodar-core+json: + application/vnd.bihealth.varfish+json: schema: - $ref: '#/components/schemas/Project' + type: array + items: + $ref: '#/components/schemas/EnrichmentKit' description: '' - /project/api/invites/create/{project}: post: - operationId: project_api_invites_create_create - description: |- - Create a project invite. - - **URL:** ``/project/api/invites/create/{Project.sodar_uuid}`` - - **Methods:** ``POST`` - - **Parameters:** - - - ``email``: User email (string) - - ``role``: Desired role for user (string, e.g. "project contributor") - parameters: - - in: path - name: project - schema: - type: string - format: uuid - required: true + operationId: seqmeta_api_enrichmentkit_list_create_create + description: DRF list-create API view the ``EnrichmentKit`` model. tags: - - project + - seqmeta requestBody: content: application/json: schema: - $ref: '#/components/schemas/ProjectInviteRequest' + $ref: '#/components/schemas/EnrichmentKitRequest' application/x-www-form-urlencoded: schema: - $ref: '#/components/schemas/ProjectInviteRequest' + $ref: '#/components/schemas/EnrichmentKitRequest' multipart/form-data: schema: - $ref: '#/components/schemas/ProjectInviteRequest' + $ref: '#/components/schemas/EnrichmentKitRequest' required: true security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: '201': content: - application/vnd.bihealth.sodar-core+json: + application/vnd.bihealth.varfish+json: schema: - $ref: '#/components/schemas/ProjectInvite' + $ref: '#/components/schemas/EnrichmentKit' description: '' - /project/api/invites/list/{project}: + /seqmeta/api/enrichmentkit/retrieve-update-destroy/{enrichmentkit}/: get: - operationId: project_api_invites_list_list - description: |- - List user invites for a project. - - **URL:** ``/project/api/invites/list/{Project.sodar_uuid}`` - - **Methods:** ``GET`` - - **Returns:** List of project invite details + operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_retrieve + description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` + model. parameters: - in: path - name: project + name: enrichmentkit schema: type: string format: uuid required: true tags: - - project + - seqmeta security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: '200': content: - application/vnd.bihealth.sodar-core+json: + application/vnd.bihealth.varfish+json: schema: - type: array - items: - $ref: '#/components/schemas/ProjectInvite' + $ref: '#/components/schemas/EnrichmentKit' description: '' - /project/api/invites/resend/{projectinvite}: - post: - operationId: project_api_invites_resend_create - description: Handle invite resending in a POST request + put: + operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_update + description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` + model. parameters: - in: path - name: projectinvite + name: enrichmentkit schema: type: string format: uuid required: true tags: - - project + - seqmeta + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EnrichmentKitRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/EnrichmentKitRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/EnrichmentKitRequest' + required: true security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: '200': - description: No response body - /project/api/invites/revoke/{projectinvite}: - post: - operationId: project_api_invites_revoke_create - description: Handle invite revoking in a POST request + content: + application/vnd.bihealth.varfish+json: + schema: + $ref: '#/components/schemas/EnrichmentKit' + description: '' + patch: + operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_partial_update + description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` + model. parameters: - in: path - name: projectinvite + name: enrichmentkit schema: type: string format: uuid required: true tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - description: No response body - /project/api/list: - get: - operationId: project_api_list_retrieve - description: |- - List all projects and categories for which the requesting user has access. - - **URL:** ``/project/api/list`` - - **Methods:** ``GET`` - - **Returns:** - - List of project details (see ``ProjectRetrieveAPIView``). For project finder - role, only lists title and UUID of projects. - tags: - - project + - seqmeta + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedEnrichmentKitRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedEnrichmentKitRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedEnrichmentKitRequest' security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: '200': - description: No response body - /project/api/remote/get/{secret}: - get: - operationId: project_api_remote_get_retrieve - description: API view for retrieving remote projects from a source site + content: + application/vnd.bihealth.varfish+json: + schema: + $ref: '#/components/schemas/EnrichmentKit' + description: '' + delete: + operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_destroy + description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` + model. parameters: - in: path - name: secret + name: enrichmentkit schema: type: string + format: uuid required: true tags: - - project + - seqmeta security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] - {} responses: - '200': + '204': description: No response body - /project/api/retrieve/{project}: + /seqmeta/api/targetbedfile/list-create/{enrichmentkit}/: get: - operationId: project_api_retrieve_retrieve - description: |- - Retrieve a project or category by its UUID. - - **URL:** ``/project/api/retrieve/{Project.sodar_uuid}`` - - **Methods:** ``GET`` - - **Returns:** - - - ``description``: Project description (string) - - ``parent``: Parent category UUID (string or null) - - ``readme``: Project readme (string, supports markdown) - - ``public_guest_access``: Guest access for all users (boolean) - - ``roles``: Project role assignments (dict, assignment UUID as key) - - ``sodar_uuid``: Project UUID (string) - - ``title``: Project title (string) - - ``type``: Project type (string, options: ``PROJECT`` or ``CATEGORY``) + operationId: seqmeta_api_targetbedfile_list_create_list + description: DRF list-create API view the ``TargetBedFile`` model. parameters: - in: path - name: project + name: enrichmentkit schema: type: string format: uuid required: true tags: - - project + - seqmeta security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: '200': content: - application/vnd.bihealth.sodar-core+json: + application/vnd.bihealth.varfish+json: schema: - $ref: '#/components/schemas/Project' + type: array + items: + $ref: '#/components/schemas/TargetBedFile' description: '' - /project/api/roles/create/{project}: post: - operationId: project_api_roles_create_create - description: |- - Create a role assignment in a project. - - **URL:** ``/project/api/roles/create/{Project.sodar_uuid}`` - - **Methods:** ``POST`` - - **Parameters:** - - - ``role``: Desired role for user (string, e.g. "project contributor") - - ``user``: User UUID (string) + operationId: seqmeta_api_targetbedfile_list_create_create + description: DRF list-create API view the ``TargetBedFile`` model. parameters: - in: path - name: project + name: enrichmentkit schema: type: string format: uuid required: true tags: - - project + - seqmeta requestBody: content: application/json: schema: - $ref: '#/components/schemas/RoleAssignmentRequest' + $ref: '#/components/schemas/TargetBedFileRequest' application/x-www-form-urlencoded: schema: - $ref: '#/components/schemas/RoleAssignmentRequest' + $ref: '#/components/schemas/TargetBedFileRequest' multipart/form-data: schema: - $ref: '#/components/schemas/RoleAssignmentRequest' + $ref: '#/components/schemas/TargetBedFileRequest' required: true security: - basicAuth: [] - cookieAuth: [] - knoxApiToken: [] + - {} responses: '201': content: - application/vnd.bihealth.sodar-core+json: + application/vnd.bihealth.varfish+json: schema: - $ref: '#/components/schemas/RoleAssignment' + $ref: '#/components/schemas/TargetBedFile' description: '' - /project/api/roles/destroy/{roleassignment}: - delete: - operationId: project_api_roles_destroy_destroy - description: |- - Destroy a role assignment. - - The owner role can not be destroyed using this view. - - **URL:** ``/project/api/roles/destroy/{RoleAssignment.sodar_uuid}`` - - **Methods:** ``DELETE`` - parameters: - - in: path - name: roleassignment - schema: - type: string - format: uuid - required: true - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '204': - description: No response body - /project/api/roles/owner-transfer/{project}: - post: - operationId: project_api_roles_owner_transfer_create - description: Handle ownership transfer in a POST request + /seqmeta/api/targetbedfile/retrieve-update-destroy/{targetbedfile}/: + get: + operationId: seqmeta_api_targetbedfile_retrieve_update_destroy_retrieve + description: DRF retrieve-update-destroy API view for the ``TargetBedFile`` + model. parameters: - in: path - name: project + name: targetbedfile schema: type: string - format: uuid - required: true - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - description: No response body - /project/api/roles/update/{roleassignment}: - put: - operationId: project_api_roles_update_update - description: |- - Update the role assignment for a user in a project. - - The user can not be changed in this API view. - - **URL:** ``/project/api/roles/update/{RoleAssignment.sodar_uuid}`` - - **Methods:** ``PUT``, ``PATCH`` - - **Parameters:** - - - ``role``: Desired role for user (string, e.g. "project contributor") - - ``user``: User UUID (string) - parameters: - - in: path - name: roleassignment - schema: - type: string - format: uuid - required: true - tags: - - project - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/RoleAssignmentRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/RoleAssignmentRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/RoleAssignmentRequest' - required: true - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/RoleAssignment' - description: '' - patch: - operationId: project_api_roles_update_partial_update - description: |- - Update the role assignment for a user in a project. - - The user can not be changed in this API view. - - **URL:** ``/project/api/roles/update/{RoleAssignment.sodar_uuid}`` - - **Methods:** ``PUT``, ``PATCH`` - - **Parameters:** - - - ``role``: Desired role for user (string, e.g. "project contributor") - - ``user``: User UUID (string) - parameters: - - in: path - name: roleassignment - schema: - type: string - format: uuid - required: true - tags: - - project - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/PatchedRoleAssignmentRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/PatchedRoleAssignmentRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/PatchedRoleAssignmentRequest' - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/RoleAssignment' - description: '' - /project/api/settings/retrieve/{project}: - get: - operationId: project_api_settings_retrieve_retrieve - description: |- - API view for retrieving an app setting with the PROJECT or PROJECT_USER - scope. - - **URL:** ``project/api/settings/retrieve/{Project.sodar_uuid}`` - - **Methods:** ``GET`` - - **Parameters:** - - - ``app_name``: Name of app plugin for the setting, use "projectroles" for projectroles settings (string) - - ``setting_name``: Setting name (string) - - ``user``: User UUID for a PROJECT_USER setting (string or None, optional) - parameters: - - in: path - name: project - schema: - type: string - format: uuid - required: true - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/AppSetting' - description: '' - /project/api/settings/retrieve/user: - get: - operationId: project_api_settings_retrieve_user_retrieve - description: |- - API view for retrieving an app setting with the USER scope. - - **URL:** ``project/api/settings/retrieve/user`` - - **Methods:** ``GET`` - - **Parameters:** - - - ``app_name``: Name of app plugin for the setting, use "projectroles" for projectroles settings (string) - - ``setting_name``: Setting name (string) - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/AppSetting' - description: '' - /project/api/settings/set/{project}: - post: - operationId: project_api_settings_set_create - description: |- - API view for setting the value of an app setting with the PROJECT or - PROJECT_USER scope. - - **URL:** ``project/api/settings/set/{Project.sodar_uuid}`` - - **Methods:** ``POST`` - - **Parameters:** - - - ``app_name``: Name of app plugin for the setting, use "projectroles" for projectroles settings (string) - - ``setting_name``: Setting name (string) - - ``value``: Setting value (string, may contain JSON for JSON settings) - - ``user``: User UUID for a PROJECT_USER setting (string or None, optional) - parameters: - - in: path - name: project - schema: - type: string - format: uuid - required: true - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - description: No response body - /project/api/settings/set/user: - post: - operationId: project_api_settings_set_user_create - description: |- - API view for setting the value of an app setting with the USER scope. Only - allows the user to set the value of their own settings. - - **URL:** ``project/api/settings/set/user`` - - **Methods:** ``POST`` - - **Parameters:** - - - ``app_name``: Name of app plugin for the setting, use "projectroles" for projectroles settings (string) - - ``setting_name``: Setting name (string) - - ``value``: Setting value (string, may contain JSON for JSON settings) - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - description: No response body - /project/api/update/{project}: - put: - operationId: project_api_update_update - description: |- - Update the metadata of a project or a category. - - Note that the project owner can not be updated here. Instead, use the - dedicated API view ``RoleAssignmentOwnerTransferAPIView``. - - The project type can not be updated once a project has been created. The - parameter is still required for non-partial updates via the ``PUT`` method. - - **URL:** ``/project/api/update/{Project.sodar_uuid}`` - - **Methods:** ``PUT``, ``PATCH`` - - **Parameters:** - - - ``title``: Project title (string) - - ``type``: Project type (string, can not be modified) - - ``parent``: Parent category UUID (string) - - ``description``: Project description (string, optional) - - ``readme``: Project readme (string, optional, supports markdown) - - ``public_guest_access``: Guest access for all users (boolean) - parameters: - - in: path - name: project - schema: - type: string - format: uuid - required: true - tags: - - project - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/ProjectRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/ProjectRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/ProjectRequest' - required: true - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/Project' - description: '' - patch: - operationId: project_api_update_partial_update - description: |- - Update the metadata of a project or a category. - - Note that the project owner can not be updated here. Instead, use the - dedicated API view ``RoleAssignmentOwnerTransferAPIView``. - - The project type can not be updated once a project has been created. The - parameter is still required for non-partial updates via the ``PUT`` method. - - **URL:** ``/project/api/update/{Project.sodar_uuid}`` - - **Methods:** ``PUT``, ``PATCH`` - - **Parameters:** - - - ``title``: Project title (string) - - ``type``: Project type (string, can not be modified) - - ``parent``: Parent category UUID (string) - - ``description``: Project description (string, optional) - - ``readme``: Project readme (string, optional, supports markdown) - - ``public_guest_access``: Guest access for all users (boolean) - parameters: - - in: path - name: project - schema: - type: string - format: uuid - required: true - tags: - - project - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/PatchedProjectRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/PatchedProjectRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/PatchedProjectRequest' - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/Project' - description: '' - /project/api/users/current: - get: - operationId: project_api_users_current_retrieve - description: |- - Return information on the user making the request. - - **URL:** ``/project/api/users/current`` - - **Methods:** ``GET`` - - **Returns**: - - For current user: - - - ``email``: Email address of the user (string) - - ``is_superuser``: Superuser status (boolean) - - ``name``: Full name of the user (string) - - ``sodar_uuid``: User UUID (string) - - ``username``: Username of the user (string) - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - $ref: '#/components/schemas/SODARUser' - description: '' - /project/api/users/list: - get: - operationId: project_api_users_list_list - description: |- - Return a list of all users on the site. Excludes system users, unless called - with superuser access. - - **URL:** ``/project/api/users/list`` - - **Methods:** ``GET`` - - **Returns**: List of serializers users (see ``CurrentUserRetrieveAPIView``) - tags: - - project - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - responses: - '200': - content: - application/vnd.bihealth.sodar-core+json: - schema: - type: array - items: - $ref: '#/components/schemas/SODARUser' - description: '' - /seqmeta/api/enrichmentkit/list-create/: - get: - operationId: seqmeta_api_enrichmentkit_list_create_list - description: DRF list-create API view the ``EnrichmentKit`` model. - tags: - - seqmeta - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - content: - application/vnd.bihealth.varfish+json: - schema: - type: array - items: - $ref: '#/components/schemas/EnrichmentKit' - description: '' - post: - operationId: seqmeta_api_enrichmentkit_list_create_create - description: DRF list-create API view the ``EnrichmentKit`` model. - tags: - - seqmeta - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/EnrichmentKitRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/EnrichmentKitRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/EnrichmentKitRequest' - required: true - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '201': - content: - application/vnd.bihealth.varfish+json: - schema: - $ref: '#/components/schemas/EnrichmentKit' - description: '' - /seqmeta/api/enrichmentkit/retrieve-update-destroy/{enrichmentkit}/: - get: - operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_retrieve - description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` - model. - parameters: - - in: path - name: enrichmentkit - schema: - type: string - pattern: ^[0-9a-f-]+$ - required: true - tags: - - seqmeta - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - content: - application/vnd.bihealth.varfish+json: - schema: - $ref: '#/components/schemas/EnrichmentKit' - description: '' - put: - operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_update - description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` - model. - parameters: - - in: path - name: enrichmentkit - schema: - type: string - pattern: ^[0-9a-f-]+$ - required: true - tags: - - seqmeta - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/EnrichmentKitRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/EnrichmentKitRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/EnrichmentKitRequest' - required: true - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - content: - application/vnd.bihealth.varfish+json: - schema: - $ref: '#/components/schemas/EnrichmentKit' - description: '' - patch: - operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_partial_update - description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` - model. - parameters: - - in: path - name: enrichmentkit - schema: - type: string - pattern: ^[0-9a-f-]+$ - required: true - tags: - - seqmeta - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/PatchedEnrichmentKitRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/PatchedEnrichmentKitRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/PatchedEnrichmentKitRequest' - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - content: - application/vnd.bihealth.varfish+json: - schema: - $ref: '#/components/schemas/EnrichmentKit' - description: '' - delete: - operationId: seqmeta_api_enrichmentkit_retrieve_update_destroy_destroy - description: DRF retrieve-update-destroy API view for the ``EnrichmentKit`` - model. - parameters: - - in: path - name: enrichmentkit - schema: - type: string - pattern: ^[0-9a-f-]+$ - required: true - tags: - - seqmeta - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '204': - description: No response body - /seqmeta/api/targetbedfile/list-create/{enrichmentkit}/: - get: - operationId: seqmeta_api_targetbedfile_list_create_list - description: DRF list-create API view the ``TargetBedFile`` model. - parameters: - - in: path - name: enrichmentkit - schema: - type: string - pattern: ^[0-9a-f-]+$ - required: true - tags: - - seqmeta - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '200': - content: - application/vnd.bihealth.varfish+json: - schema: - type: array - items: - $ref: '#/components/schemas/TargetBedFile' - description: '' - post: - operationId: seqmeta_api_targetbedfile_list_create_create - description: DRF list-create API view the ``TargetBedFile`` model. - parameters: - - in: path - name: enrichmentkit - schema: - type: string - pattern: ^[0-9a-f-]+$ - required: true - tags: - - seqmeta - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/TargetBedFileRequest' - application/x-www-form-urlencoded: - schema: - $ref: '#/components/schemas/TargetBedFileRequest' - multipart/form-data: - schema: - $ref: '#/components/schemas/TargetBedFileRequest' - required: true - security: - - basicAuth: [] - - cookieAuth: [] - - knoxApiToken: [] - - {} - responses: - '201': - content: - application/vnd.bihealth.varfish+json: - schema: - $ref: '#/components/schemas/TargetBedFile' - description: '' - /seqmeta/api/targetbedfile/retrieve-update-destroy/{targetbedfile}/: - get: - operationId: seqmeta_api_targetbedfile_retrieve_update_destroy_retrieve - description: DRF retrieve-update-destroy API view for the ``TargetBedFile`` - model. - parameters: - - in: path - name: targetbedfile - schema: - type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - seqmeta @@ -2099,7 +1374,7 @@ paths: name: targetbedfile schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - seqmeta @@ -2136,7 +1411,7 @@ paths: name: targetbedfile schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - seqmeta @@ -2172,7 +1447,7 @@ paths: name: targetbedfile schema: type: string - pattern: ^[0-9a-f-]+$ + format: uuid required: true tags: - seqmeta @@ -5321,50 +4596,6 @@ components: - release - table - timestamp - AppSetting: - type: object - description: |- - Serializer for the AppSetting model. Should only be used for read and list - views. The sodar_uuid is not provided, as interacting with database objects - directly is not the intended way to set/get app settings. - properties: - app_name: - type: string - readOnly: true - project: - type: string - format: uuid - description: Project SODAR UUID - readOnly: true - user: - allOf: - - $ref: '#/components/schemas/SODARUser' - readOnly: true - name: - type: string - readOnly: true - description: Name of the setting - type: - type: string - readOnly: true - description: Type of the setting - value: - type: string - readOnly: true - nullable: true - description: Value of the setting - user_modifiable: - type: boolean - readOnly: true - description: Setting visibility in forms - required: - - app_name - - name - - project - - type - - user - - user_modifiable - - value BcftoolsStatsAfRecordList: type: array items: @@ -7705,32 +6936,47 @@ components: type: object PaginatedCaseAnalysisList: type: object + required: + - results properties: next: type: string nullable: true + format: uri + example: http://api.example.org/accounts/?cursor=cD00ODY%3D" previous: type: string nullable: true + format: uri + example: http://api.example.org/accounts/?cursor=cj0xJnA9NDg3 results: type: array items: $ref: '#/components/schemas/CaseAnalysis' PaginatedCaseAnalysisSessionList: type: object + required: + - results properties: next: type: string nullable: true + format: uri + example: http://api.example.org/accounts/?cursor=cD00ODY%3D" previous: type: string nullable: true + format: uri + example: http://api.example.org/accounts/?cursor=cj0xJnA9NDg3 results: type: array items: $ref: '#/components/schemas/CaseAnalysisSession' PaginatedCaseImportActionList: type: object + required: + - count + - results properties: count: type: integer @@ -7751,6 +6997,9 @@ components: $ref: '#/components/schemas/CaseImportAction' PaginatedCaseSerializerNgList: type: object + required: + - count + - results properties: count: type: integer @@ -7771,6 +7020,9 @@ components: $ref: '#/components/schemas/CaseSerializerNg' PaginatedSeqvarsPredefinedQueryList: type: object + required: + - count + - results properties: count: type: integer @@ -7791,6 +7043,9 @@ components: $ref: '#/components/schemas/SeqvarsPredefinedQuery' PaginatedSeqvarsQueryExecutionList: type: object + required: + - count + - results properties: count: type: integer @@ -7811,6 +7066,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryExecution' PaginatedSeqvarsQueryList: type: object + required: + - count + - results properties: count: type: integer @@ -7831,6 +7089,9 @@ components: $ref: '#/components/schemas/SeqvarsQuery' PaginatedSeqvarsQueryPresetsClinvarList: type: object + required: + - count + - results properties: count: type: integer @@ -7851,6 +7112,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsClinvar' PaginatedSeqvarsQueryPresetsColumnsList: type: object + required: + - count + - results properties: count: type: integer @@ -7871,6 +7135,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsColumns' PaginatedSeqvarsQueryPresetsConsequenceList: type: object + required: + - count + - results properties: count: type: integer @@ -7891,6 +7158,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsConsequence' PaginatedSeqvarsQueryPresetsFrequencyList: type: object + required: + - count + - results properties: count: type: integer @@ -7911,6 +7181,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsFrequency' PaginatedSeqvarsQueryPresetsLocusList: type: object + required: + - count + - results properties: count: type: integer @@ -7931,6 +7204,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsLocus' PaginatedSeqvarsQueryPresetsPhenotypePrioList: type: object + required: + - count + - results properties: count: type: integer @@ -7951,6 +7227,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsPhenotypePrio' PaginatedSeqvarsQueryPresetsQualityList: type: object + required: + - count + - results properties: count: type: integer @@ -7971,6 +7250,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsQuality' PaginatedSeqvarsQueryPresetsSetList: type: object + required: + - count + - results properties: count: type: integer @@ -7991,6 +7273,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsSet' PaginatedSeqvarsQueryPresetsSetVersionList: type: object + required: + - count + - results properties: count: type: integer @@ -8011,6 +7296,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsSetVersion' PaginatedSeqvarsQueryPresetsVariantPrioList: type: object + required: + - count + - results properties: count: type: integer @@ -8031,6 +7319,9 @@ components: $ref: '#/components/schemas/SeqvarsQueryPresetsVariantPrio' PaginatedSeqvarsQuerySettingsList: type: object + required: + - count + - results properties: count: type: integer @@ -8051,6 +7342,9 @@ components: $ref: '#/components/schemas/SeqvarsQuerySettings' PaginatedSeqvarsResultRowList: type: object + required: + - count + - results properties: count: type: integer @@ -8071,6 +7365,9 @@ components: $ref: '#/components/schemas/SeqvarsResultRow' PaginatedSeqvarsResultSetList: type: object + required: + - count + - results properties: count: type: integer @@ -8161,55 +7458,6 @@ components: type: string nullable: true description: Optional description of the enrichment kit - PatchedProjectRequest: - type: object - description: Serializer for the Project model - properties: - title: - type: string - minLength: 1 - description: Project title - maxLength: 255 - type: - allOf: - - $ref: '#/components/schemas/TypeEnum' - description: |- - Type of project ("CATEGORY", "PROJECT") - - * `CATEGORY` - Category - * `PROJECT` - Project - parent: - type: string - format: uuid - description: Project SODAR UUID - nullable: true - description: - type: string - nullable: true - description: Short project description - maxLength: 512 - readme: - type: string - public_guest_access: - type: boolean - description: Allow public guest access for the project, also including unauthenticated - users if allowed on the site - owner: - type: string - writeOnly: true - minLength: 1 - PatchedRoleAssignmentRequest: - type: object - description: Serializer for the RoleAssignment model - properties: - role: - type: string - minLength: 1 - description: Name of role - user: - type: string - format: uuid - description: User SODAR UUID PatchedSeqvarsPredefinedQueryRequest: type: object description: Serializer for ``PredefinedQuery``. @@ -8782,160 +8030,6 @@ components: * `grch37` - GRCh37 * `grch38` - GRCh38 - Project: - type: object - description: Serializer for the Project model - properties: - title: - type: string - description: Project title - maxLength: 255 - type: - allOf: - - $ref: '#/components/schemas/TypeEnum' - description: |- - Type of project ("CATEGORY", "PROJECT") - - * `CATEGORY` - Category - * `PROJECT` - Project - parent: - type: string - format: uuid - description: Project SODAR UUID - nullable: true - description: - type: string - nullable: true - description: Short project description - maxLength: 512 - readme: - type: string - public_guest_access: - type: boolean - description: Allow public guest access for the project, also including unauthenticated - users if allowed on the site - archive: - type: boolean - readOnly: true - roles: - type: array - items: - $ref: '#/components/schemas/RoleAssignmentNestedList' - readOnly: true - sodar_uuid: - type: string - readOnly: true - required: - - archive - - parent - - roles - - sodar_uuid - - title - ProjectInvite: - type: object - description: Serializer for the ProjectInvite model - properties: - email: - type: string - format: email - description: Email address of the person to be invited - maxLength: 254 - project: - type: string - format: uuid - description: Project SODAR UUID - readOnly: true - role: - type: string - description: Name of role - issuer: - allOf: - - $ref: '#/components/schemas/SODARUser' - readOnly: true - date_created: - type: string - format: date-time - readOnly: true - description: DateTime of invite creation - date_expire: - type: string - format: date-time - readOnly: true - description: Expiration of invite as DateTime - message: - type: string - description: Message to be included in the invite email (optional) - sodar_uuid: - type: string - readOnly: true - required: - - date_created - - date_expire - - email - - issuer - - project - - role - - sodar_uuid - ProjectInviteRequest: - type: object - description: Serializer for the ProjectInvite model - properties: - email: - type: string - format: email - minLength: 1 - description: Email address of the person to be invited - maxLength: 254 - role: - type: string - minLength: 1 - description: Name of role - message: - type: string - description: Message to be included in the invite email (optional) - required: - - email - - role - ProjectRequest: - type: object - description: Serializer for the Project model - properties: - title: - type: string - minLength: 1 - description: Project title - maxLength: 255 - type: - allOf: - - $ref: '#/components/schemas/TypeEnum' - description: |- - Type of project ("CATEGORY", "PROJECT") - - * `CATEGORY` - Category - * `PROJECT` - Project - parent: - type: string - format: uuid - description: Project SODAR UUID - nullable: true - description: - type: string - nullable: true - description: Short project description - maxLength: 512 - readme: - type: string - public_guest_access: - type: boolean - description: Allow public guest access for the project, also including unauthenticated - users if allowed on the site - owner: - type: string - writeOnly: true - minLength: 1 - required: - - parent - - title RcnvConstraintsPydantic: description: Store RCNV constraints. properties: @@ -9052,73 +8146,6 @@ components: type: integer title: ResourcesUsedPydantic type: object - RoleAssignment: - type: object - description: Serializer for the RoleAssignment model - properties: - project: - type: string - format: uuid - description: Project SODAR UUID - readOnly: true - role: - type: string - description: Name of role - user: - type: string - format: uuid - description: User SODAR UUID - sodar_uuid: - type: string - readOnly: true - required: - - project - - role - - sodar_uuid - - user - RoleAssignmentNestedList: - type: object - description: Nested list serializer for the RoleAssignment model. - properties: - role: - type: string - description: Name of role - user: - allOf: - - $ref: '#/components/schemas/SODARUser' - readOnly: true - sodar_uuid: - type: string - readOnly: true - required: - - role - - sodar_uuid - - user - RoleAssignmentNestedListRequest: - type: object - description: Nested list serializer for the RoleAssignment model. - properties: - role: - type: string - minLength: 1 - description: Name of role - required: - - role - RoleAssignmentRequest: - type: object - description: Serializer for the RoleAssignment model - properties: - role: - type: string - minLength: 1 - description: Name of role - user: - type: string - format: uuid - description: User SODAR UUID - required: - - role - - user SODARUser: type: object description: Serializer for the user model used in SODAR Core based sites @@ -9138,6 +8165,9 @@ components: format: email title: Email address maxLength: 254 + additional_emails: + type: string + readOnly: true is_superuser: type: boolean title: Superuser status @@ -9147,6 +8177,7 @@ components: type: string readOnly: true required: + - additional_emails - sodar_uuid - username SODARUserRequest: @@ -13659,14 +12690,6 @@ components: - label title: TermPydantic type: object - TypeEnum: - enum: - - CATEGORY - - PROJECT - type: string - description: |- - * `CATEGORY` - Category - * `PROJECT` - Project UserAndGlobalSettings: type: object description: Serializer for ``UserAndGlobalSettingsSerializer``. diff --git a/backend/varfish/users/management/commands/initdev.py b/backend/varfish/users/management/commands/initdev.py index 470b78607..924a37c5a 100644 --- a/backend/varfish/users/management/commands/initdev.py +++ b/backend/varfish/users/management/commands/initdev.py @@ -282,7 +282,7 @@ def _create_project( for setting_name, value in setting_value.items(): if project_settings.get(setting_name) != value: app_settings.set( - app_name="cases_import", + plugin_name="cases_import", setting_name=setting_name, value=value, project=project, diff --git a/backend/varfish/users/urls.py b/backend/varfish/users/urls.py index 12e7099db..0be621cce 100644 --- a/backend/varfish/users/urls.py +++ b/backend/varfish/users/urls.py @@ -1,10 +1,10 @@ -from django.conf.urls import url +from django.urls import path from . import views urlpatterns = [ - url(regex=r"^$", view=views.UserListView.as_view(), name="list"), - url(regex=r"^~redirect/$", view=views.UserRedirectView.as_view(), name="redirect"), - url(regex=r"^(?P[\w.@+-]+)/$", view=views.UserDetailView.as_view(), name="detail"), - url(regex=r"^~update/$", view=views.UserUpdateView.as_view(), name="update"), + path("", view=views.UserListView.as_view(), name="list"), + path("~redirect/", view=views.UserRedirectView.as_view(), name="redirect"), + path("/", view=views.UserDetailView.as_view(), name="detail"), + path("~update/", view=views.UserUpdateView.as_view(), name="update"), ] diff --git a/backend/varfish/vueapp/urls.py b/backend/varfish/vueapp/urls.py index 0307a9bf5..b12c2bb2f 100644 --- a/backend/varfish/vueapp/urls.py +++ b/backend/varfish/vueapp/urls.py @@ -1,11 +1,11 @@ -from django.conf.urls import url +from django.urls import path from varfish.vueapp import views_ajax app_name = "vueapp" ajax_urlpatterns = [ - url( - regex=r"^ajax/user-setting/(?P[0-9a-zA-Z\._-]+)/$", + path( + "ajax/user-setting//", view=views_ajax.UserSettingView.as_view(), name="user-setting", ), diff --git a/backend/variants/migrations/0109_alter_clearexpiredexportedfilesbgjob_bg_job_and_more.py b/backend/variants/migrations/0109_alter_clearexpiredexportedfilesbgjob_bg_job_and_more.py new file mode 100644 index 000000000..3026e0120 --- /dev/null +++ b/backend/variants/migrations/0109_alter_clearexpiredexportedfilesbgjob_bg_job_and_more.py @@ -0,0 +1,141 @@ +# Generated by Django 4.2.16 on 2024-10-07 12:53 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("bgjobs", "0001_squashed_0006_auto_20200526_1657"), + ("variants", "0108_auto_20240807_0850"), + ] + + operations = [ + migrations.AlterField( + model_name="clearexpiredexportedfilesbgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="clearinactivevariantsetsbgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="clearoldkioskcasesbgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="deletecasebgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="exportfilebgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="exportprojectcasesfilebgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="importvariantsbgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="kioskannotatebgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="projectcasessmallvariantquery", + name="user", + field=models.ForeignKey( + blank=True, + help_text="User who created the query", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(app_label)s_%(class)s_related", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="refreshsmallvariantsummarybgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + migrations.AlterField( + model_name="smallvariantquery", + name="user", + field=models.ForeignKey( + blank=True, + help_text="User who created the query", + null=True, + on_delete=django.db.models.deletion.SET_NULL, + related_name="%(app_label)s_%(class)s_related", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="synccaselistbgjob", + name="bg_job", + field=models.ForeignKey( + help_text="Background job for state etc.", + on_delete=django.db.models.deletion.CASCADE, + related_name="%(app_label)s_%(class)s_related", + to="bgjobs.backgroundjob", + ), + ), + ] diff --git a/backend/variants/migrations/0110_drop_variant_summary.py b/backend/variants/migrations/0110_drop_variant_summary.py new file mode 100644 index 000000000..7ddf10120 --- /dev/null +++ b/backend/variants/migrations/0110_drop_variant_summary.py @@ -0,0 +1,110 @@ +# Generated by Django 4.2.16 on 2024-10-09 13:00 + +from django.conf import settings +from django.db import connection, migrations, utils +from django.db.migrations.recorder import MigrationRecorder + + +def is_migration_applied(app_name, migration_name): + recorder = MigrationRecorder(connection) + try: + return recorder.migration_qs.filter(app=app_name, name=migration_name).exists() + except utils.ProgrammingError: + return False # migration table does not exist yet + + +if not is_migration_applied("projectroles", "0001_initial"): + run_before = [] # fresh installation, will run projectroles squashed migrations +elif is_migration_applied("projectroles", "0032_alter_appsetting_value"): + run_before = [] # critical projectroles migration already applied +else: + # We will not execute the squashed projectroles migration 0001..0032 and the + # projectroles migration 0032 has not been applied yet. + run_before = [ + ("projectroles", "0032_alter_appsetting_value"), + ] + + +SQL_OUTER = r""" +DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + +CREATE MATERIALIZED VIEW variants_smallvariantsummary +AS + %s +WITH NO DATA; + +CREATE UNIQUE INDEX variants_smallvariantsummary_id ON variants_smallvariantsummary(id); +CREATE INDEX variants_smallvariantsummary_coord ON variants_smallvariantsummary( + release, chromosome, start, "end", bin, reference, alternative +); +""" + + +SQL_INNER = r""" +WITH excluded_case_ids AS ( + SELECT DISTINCT variants_case.id AS case_id + FROM variants_case + JOIN projectroles_project ON variants_case.project_id = projectroles_project.id + JOIN projectroles_appsetting ON + projectroles_project.id = projectroles_appsetting.project_id AND + projectroles_appsetting.name = 'exclude_from_inhouse_db' AND + projectroles_appsetting.value = '1' +) +SELECT + row_number() OVER (PARTITION BY true) AS id, + release, + chromosome, + start, + "end", + bin, + reference, + alternative, + sum(num_hom_ref) AS count_hom_ref, + sum(num_het) AS count_het, + sum(num_hom_alt) AS count_hom_alt, + sum(num_hemi_ref) AS count_hemi_ref, + sum(num_hemi_alt) AS count_hemi_alt +FROM ( + SELECT DISTINCT + variants.release, + variants.chromosome, + variants.start, + variants."end", + variants.bin, + variants.reference, + variants.alternative, + variants.num_hom_ref, + variants.num_het, + variants.num_hom_alt, + variants.num_hemi_ref, + variants.num_hemi_alt, + variants.case_id + FROM variants_smallvariant AS variants + WHERE NOT EXISTS (SELECT 1 from excluded_case_ids AS e WHERE e.case_id = variants.case_id) +) AS variants_per_case +GROUP BY (release, chromosome, start, "end", bin, reference, alternative) +""" + + +if settings.IS_TESTING: + operations = [] +else: + operations = [ + migrations.RunSQL( + """ + DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + """, + SQL_OUTER % SQL_INNER, + ) + ] + + +class Migration(migrations.Migration): + + dependencies = [ + ("variants", "0109_alter_clearexpiredexportedfilesbgjob_bg_job_and_more"), + ] + + run_before = run_before + + operations = operations diff --git a/backend/variants/migrations/0111_create_variant_summary.py b/backend/variants/migrations/0111_create_variant_summary.py new file mode 100644 index 000000000..a5863cd71 --- /dev/null +++ b/backend/variants/migrations/0111_create_variant_summary.py @@ -0,0 +1,87 @@ +# Generated by Django 4.2.16 on 2024-10-09 13:00 + +from django.conf import settings +from django.db import migrations + +SQL_OUTER = r""" +DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + +CREATE MATERIALIZED VIEW variants_smallvariantsummary +AS + %s +WITH NO DATA; + +CREATE UNIQUE INDEX variants_smallvariantsummary_id ON variants_smallvariantsummary(id); +CREATE INDEX variants_smallvariantsummary_coord ON variants_smallvariantsummary( + release, chromosome, start, "end", bin, reference, alternative +); +""" + + +SQL_INNER = r""" +WITH excluded_case_ids AS ( + SELECT DISTINCT variants_case.id AS case_id + FROM variants_case + JOIN projectroles_project ON variants_case.project_id = projectroles_project.id + JOIN projectroles_appsetting ON + projectroles_project.id = projectroles_appsetting.project_id AND + projectroles_appsetting.name = 'exclude_from_inhouse_db' AND + projectroles_appsetting.value = '1' +) +SELECT + row_number() OVER (PARTITION BY true) AS id, + release, + chromosome, + start, + "end", + bin, + reference, + alternative, + sum(num_hom_ref) AS count_hom_ref, + sum(num_het) AS count_het, + sum(num_hom_alt) AS count_hom_alt, + sum(num_hemi_ref) AS count_hemi_ref, + sum(num_hemi_alt) AS count_hemi_alt +FROM ( + SELECT DISTINCT + variants.release, + variants.chromosome, + variants.start, + variants."end", + variants.bin, + variants.reference, + variants.alternative, + variants.num_hom_ref, + variants.num_het, + variants.num_hom_alt, + variants.num_hemi_ref, + variants.num_hemi_alt, + variants.case_id + FROM variants_smallvariant AS variants + WHERE NOT EXISTS (SELECT 1 from excluded_case_ids AS e WHERE e.case_id = variants.case_id) +) AS variants_per_case +GROUP BY (release, chromosome, start, "end", bin, reference, alternative) +""" + + +if settings.IS_TESTING: + operations = [] +else: + operations = [ + migrations.RunSQL( + SQL_OUTER % SQL_INNER, + """ + DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + """, + ) + ] + + +class Migration(migrations.Migration): + + dependencies = [ + ("variants", "0110_drop_variant_summary"), + ("projectroles", "0032_alter_appsetting_value"), + ] + + operations = operations diff --git a/backend/variants/models/maintenance.py b/backend/variants/models/maintenance.py index dba3999c1..5125af605 100644 --- a/backend/variants/models/maintenance.py +++ b/backend/variants/models/maintenance.py @@ -109,3 +109,80 @@ def refresh_variants_smallvariantsummary(): except utils.NotSupportedError: with transaction.atomic(): cursor.execute("REFRESH MATERIALIZED VIEW variants_smallvariantsummary") + + +def drop_variants_smallvariantsummary(): + """Drop the ``SmallVariantSummary`` materialized view.""" + + with transaction.atomic(): + with connection.cursor() as cursor: + cursor.execute("DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary") + + +SQL_OUTER = r""" +DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + +CREATE MATERIALIZED VIEW variants_smallvariantsummary +AS + %s +WITH NO DATA; + +CREATE UNIQUE INDEX variants_smallvariantsummary_id ON variants_smallvariantsummary(id); +CREATE INDEX variants_smallvariantsummary_coord ON variants_smallvariantsummary( + release, chromosome, start, "end", bin, reference, alternative +); +""" + + +SQL_INNER = r""" +WITH excluded_case_ids AS ( + SELECT DISTINCT variants_case.id AS case_id + FROM variants_case + JOIN projectroles_project ON variants_case.project_id = projectroles_project.id + JOIN projectroles_appsetting ON + projectroles_project.id = projectroles_appsetting.project_id AND + projectroles_appsetting.name = 'exclude_from_inhouse_db' AND + projectroles_appsetting.value = '1' +) +SELECT + row_number() OVER (PARTITION BY true) AS id, + release, + chromosome, + start, + "end", + bin, + reference, + alternative, + sum(num_hom_ref) AS count_hom_ref, + sum(num_het) AS count_het, + sum(num_hom_alt) AS count_hom_alt, + sum(num_hemi_ref) AS count_hemi_ref, + sum(num_hemi_alt) AS count_hemi_alt +FROM ( + SELECT DISTINCT + variants.release, + variants.chromosome, + variants.start, + variants."end", + variants.bin, + variants.reference, + variants.alternative, + variants.num_hom_ref, + variants.num_het, + variants.num_hom_alt, + variants.num_hemi_ref, + variants.num_hemi_alt, + variants.case_id + FROM variants_smallvariant AS variants + WHERE NOT EXISTS (SELECT 1 from excluded_case_ids AS e WHERE e.case_id = variants.case_id) +) AS variants_per_case +GROUP BY (release, chromosome, start, "end", bin, reference, alternative) +""" + + +def create_variants_smallvariantsummary(): + """Create the ``SmallVariantSummary`` materialized view.""" + + with transaction.atomic(): + with connection.cursor() as cursor: + cursor.execute(SQL_OUTER % SQL_INNER) diff --git a/backend/variants/tests/helpers.py b/backend/variants/tests/helpers.py index 35b145ac6..89f6a61d4 100644 --- a/backend/variants/tests/helpers.py +++ b/backend/variants/tests/helpers.py @@ -2,8 +2,8 @@ from django.conf import settings from django.test import RequestFactory -from projectroles.tests.test_permissions import TestProjectPermissionBase -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions import ProjectPermissionTestBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from test_plus.test import TestCase from beaconsite.models import Site @@ -31,7 +31,7 @@ def setUp(self): self.request_factory = RequestFactory() -class ApiViewTestBase(ViewTestBaseMixin, TestProjectAPIPermissionBase): +class ApiViewTestBase(ViewTestBaseMixin, ProjectAPIPermissionTestBase): """Base class for API view testing (and file export)""" media_type = settings.SODAR_API_MEDIA_TYPE @@ -44,7 +44,7 @@ def setUp(self): self.knox_token = self.get_token(self.superuser) -class ViewTestBase(ViewTestBaseMixin, TestProjectPermissionBase): +class ViewTestBase(ViewTestBaseMixin, ProjectPermissionTestBase): """Base class for UI view testing (and file export)""" diff --git a/backend/variants/tests/test_file_export.py b/backend/variants/tests/test_file_export.py index d4fb7ba20..cd2a2b58c 100644 --- a/backend/variants/tests/test_file_export.py +++ b/backend/variants/tests/test_file_export.py @@ -15,7 +15,7 @@ from projectroles.models import Project from requests_mock import Mocker from test_plus.test import TestCase -from timeline.models import ProjectEvent +from timeline.models import TimelineEvent from clinvar.tests.factories import ClinvarFactory from cohorts.tests.factories import TestCohortBase @@ -975,7 +975,7 @@ def _run_test(self, file_type): self.assertIsNotNone(self.export_job.export_result) self.assertEquals(self.export_job.export_result.payload, _fake_generate(self)) # Check side effects - self.assertEquals(ProjectEvent.objects.count(), 1) + self.assertEquals(TimelineEvent.objects.count(), 1) @patch.object(file_export.CaseExporterTsv, "generate", new=_fake_generate, create=True) def test_export_tsv(self): diff --git a/backend/variants/tests/test_permissions_ajax.py b/backend/variants/tests/test_permissions_ajax.py index b9152a600..5d23a6fdd 100644 --- a/backend/variants/tests/test_permissions_ajax.py +++ b/backend/variants/tests/test_permissions_ajax.py @@ -3,7 +3,7 @@ import json from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.models import SmallVariantQuery from variants.tests.factories import ( @@ -17,7 +17,7 @@ # expected: 401, got: 403 -class TestSmallVariantQueryListCreateAjaxView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -59,7 +59,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestSmallVariantQueryRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -124,7 +124,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestSmallVariantQueryResultSetListAjaxView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultSetListAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -152,7 +152,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSmallVariantQueryResultSetRetrieveAjaxView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultSetRetrieveAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -180,7 +180,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSmallVariantQueryResultRowListAjaxView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultRowListAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) diff --git a/backend/variants/tests/test_permissions_ajax_annos.py b/backend/variants/tests/test_permissions_ajax_annos.py index 3a407bd08..36a419e31 100644 --- a/backend/variants/tests/test_permissions_ajax_annos.py +++ b/backend/variants/tests/test_permissions_ajax_annos.py @@ -1,10 +1,10 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.tests.factories import CaseFactory -class TestCaseUserAnnotatedVariantsAjaxView(TestProjectAPIPermissionBase): +class TestCaseUserAnnotatedVariantsAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) diff --git a/backend/variants/tests/test_permissions_ajax_presets.py b/backend/variants/tests/test_permissions_ajax_presets.py index 2f8aa9d16..ab807ff4b 100644 --- a/backend/variants/tests/test_permissions_ajax_presets.py +++ b/backend/variants/tests/test_permissions_ajax_presets.py @@ -1,5 +1,5 @@ from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.models import QuickPresets from variants.tests.factories import ( @@ -14,7 +14,7 @@ from variants.tests.utils import model_to_dict_for_api -class TestFrequencyPresetsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestFrequencyPresetsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.frequencypresets = FrequencyPresetsFactory(presetset__project=self.project) @@ -61,7 +61,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestFrequencyPresetsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestFrequencyPresetsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.frequencypresets = FrequencyPresetsFactory(presetset__project=self.project) @@ -137,7 +137,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestFrequencyPresetsCloneFactoryDefaultsView(TestProjectAPIPermissionBase): +class TestFrequencyPresetsCloneFactoryDefaultsView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -164,7 +164,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestFrequencyPresetsCloneOtherView(TestProjectAPIPermissionBase): +class TestFrequencyPresetsCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.frequencypreset = FrequencyPresetsFactory(presetset__project=self.project) @@ -192,7 +192,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestImpactPresetsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestImpactPresetsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.impactpresets = ImpactPresetsFactory(presetset__project=self.project) @@ -239,7 +239,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestImpactPresetsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestImpactPresetsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.impactpresets = ImpactPresetsFactory(presetset__project=self.project) @@ -315,7 +315,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestImpactPresetsCloneFactoryDefaultsView(TestProjectAPIPermissionBase): +class TestImpactPresetsCloneFactoryDefaultsView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -342,7 +342,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestImpactPresetsCloneOtherView(TestProjectAPIPermissionBase): +class TestImpactPresetsCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.impactpreset = ImpactPresetsFactory(presetset__project=self.project) @@ -370,7 +370,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestQualityPresetsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestQualityPresetsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.qualitypresets = QualityPresetsFactory(presetset__project=self.project) @@ -417,7 +417,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestQualityPresetsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestQualityPresetsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.qualitypresets = QualityPresetsFactory(presetset__project=self.project) @@ -493,7 +493,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestQualityPresetsCloneFactoryDefaultsView(TestProjectAPIPermissionBase): +class TestQualityPresetsCloneFactoryDefaultsView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -518,7 +518,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestQualityPresetsCloneOtherView(TestProjectAPIPermissionBase): +class TestQualityPresetsCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.qualitypreset = QualityPresetsFactory(presetset__project=self.project) @@ -546,7 +546,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestChromosomePresetsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestChromosomePresetsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.chromosomepresets = ChromosomePresetsFactory(presetset__project=self.project) @@ -593,7 +593,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestChromosomePresetsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestChromosomePresetsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.chromosomepresets = ChromosomePresetsFactory(presetset__project=self.project) @@ -669,7 +669,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestChromosomePresetsCloneFactoryDefaultsView(TestProjectAPIPermissionBase): +class TestChromosomePresetsCloneFactoryDefaultsView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -696,7 +696,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestChromosomePresetsCloneOtherView(TestProjectAPIPermissionBase): +class TestChromosomePresetsCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.chromosomepreset = ChromosomePresetsFactory(presetset__project=self.project) @@ -724,7 +724,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestFlagsEtcPresetsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestFlagsEtcPresetsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.flagsetcpresets = FlagsEtcPresetsFactory(presetset__project=self.project) @@ -771,7 +771,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestFlagsEtcPresetsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestFlagsEtcPresetsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.flagsetcpresets = FlagsEtcPresetsFactory(presetset__project=self.project) @@ -847,7 +847,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestFlagsEtcPresetsCloneFactoryDefaultsView(TestProjectAPIPermissionBase): +class TestFlagsEtcPresetsCloneFactoryDefaultsView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -874,7 +874,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestFlagsEtcPresetsCloneOtherView(TestProjectAPIPermissionBase): +class TestFlagsEtcPresetsCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.flagsetcpreset = FlagsEtcPresetsFactory(presetset__project=self.project) @@ -902,7 +902,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestQuickPresetsListCreateAjaxView(TestProjectAPIPermissionBase): +class TestQuickPresetsListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.quickpresets = QuickPresetsFactory(presetset__project=self.project) @@ -958,7 +958,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestQuickPresetsRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestQuickPresetsRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.quickpresets = QuickPresetsFactory(presetset__project=self.project) @@ -1034,7 +1034,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestQuickPresetsCloneOtherView(TestProjectAPIPermissionBase): +class TestQuickPresetsCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.quickpresets = QuickPresetsFactory(presetset__project=self.project) @@ -1068,7 +1068,7 @@ def get_project(self, *args, **kwargs): return QuickPresets.objects.get(sodar_uuid=self.kwargs["sodar_uuid"]).presetset.project -class TestPresetSetListCreateAjaxView(TestProjectAPIPermissionBase): +class TestPresetSetListCreateAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -1114,7 +1114,7 @@ def test_create(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestPresetSetListAllAjaxView(TestProjectAPIPermissionBase): +class TestPresetSetListAllAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -1138,7 +1138,7 @@ def test_listall(self): self.assert_response(url, bad_users_302, 302, method="GET") -class TestPresetSetRetrieveUpdateDestroyAjaxView(TestProjectAPIPermissionBase): +class TestPresetSetRetrieveUpdateDestroyAjaxView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -1214,7 +1214,7 @@ def test_destroy(self): self.assert_response(url, bad_users_403, 403, method="DELETE") -class TestPresetSetCloneFactoryDefaultsView(TestProjectAPIPermissionBase): +class TestPresetSetCloneFactoryDefaultsView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) @@ -1241,7 +1241,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestPresetSetCloneOtherView(TestProjectAPIPermissionBase): +class TestPresetSetCloneOtherView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.presetset = PresetSetFactory(project=self.project) diff --git a/backend/variants/tests/test_permissions_api.py b/backend/variants/tests/test_permissions_api.py index 8039257e4..9aedf8a97 100644 --- a/backend/variants/tests/test_permissions_api.py +++ b/backend/variants/tests/test_permissions_api.py @@ -3,7 +3,7 @@ import json from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.models import SmallVariantQuery from variants.tests.factories import ( @@ -15,7 +15,7 @@ ) -class TestSmallVariantQueryListCreateApiView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryListCreateApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -57,7 +57,7 @@ def test_post(self): self.assert_response(url, bad_users_403, 403, method="POST", data=data) -class TestSmallVariantQueryRetrieveUpdateDestroyApiView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryRetrieveUpdateDestroyApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -122,7 +122,7 @@ def cleanup(): self.assert_response(url, bad_users_403, 403, method="DELETE", cleanup_method=cleanup) -class TestSmallVariantQueryResultSetListApiView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultSetListApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -150,7 +150,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSmallVariantQueryResultSetRetrieveApiView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultSetRetrieveApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -178,7 +178,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSmallVariantQueryResultRowListApiView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultRowListApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) @@ -206,7 +206,7 @@ def test_get(self): self.assert_response(url, bad_users_403, 403, method="GET") -class TestSmallVariantQueryResultRowRetrieveApiView(TestProjectAPIPermissionBase): +class TestSmallVariantQueryResultRowRetrieveApiView(ProjectAPIPermissionTestBase): def setUp(self): super().setUp() self.case = CaseFactory(project=self.project) diff --git a/backend/variants/tests/test_ui.py b/backend/variants/tests/test_ui.py index 0ea583c55..e50e09fe1 100644 --- a/backend/variants/tests/test_ui.py +++ b/backend/variants/tests/test_ui.py @@ -161,7 +161,7 @@ def _make_user(cls, user_name, superuser): return user -class TestUIBase(projectroles.tests.test_ui.TestUIBase): +class UITestBase(projectroles.tests.test_ui.UITestBase): """Base class for UI tests""" def compile_url_and_login(self, kwargs={}): diff --git a/backend/variants/tests/test_views_ajax_presets.py b/backend/variants/tests/test_views_ajax_presets.py index c87c5f88c..ddb662f19 100644 --- a/backend/variants/tests/test_views_ajax_presets.py +++ b/backend/variants/tests/test_views_ajax_presets.py @@ -1,8 +1,6 @@ -from unittest.mock import MagicMock, patch - from django.conf import settings from django.urls import reverse -from projectroles.tests.test_permissions_api import TestProjectAPIPermissionBase +from projectroles.tests.test_permissions_api import ProjectAPIPermissionTestBase from variants.models import ( ChromosomePresets, @@ -25,7 +23,7 @@ from variants.tests.utils import model_to_dict_for_api -class ApiViewTestBase(TestProjectAPIPermissionBase): +class ApiViewTestBase(ProjectAPIPermissionTestBase): media_type = settings.SODAR_API_MEDIA_TYPE api_version = settings.SODAR_API_DEFAULT_VERSION @@ -121,20 +119,16 @@ def setUp(self): def test_post(self): data = {"presetset": self.presetset.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.FrequencyPresetsManager.create_as_copy_of_factory_preset", - MagicMock(return_value=FrequencyPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-frequencypresets-clonefactorypresets", - kwargs={"name": "the-name"}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-frequencypresets-clonefactorypresets", + kwargs={"name": "any"}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with("the-name", data["label"], self.presetset) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestFrequencyPresetsCloneOtherAjaxView(ApiViewTestBase): @@ -149,22 +143,16 @@ def test_post(self): "presetset": self.presetset.sodar_uuid, "label": "my label", } - with patch( - "variants.models.presets.FrequencyPresetsManager.create_as_copy_of_other_preset", - MagicMock(return_value=FrequencyPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-frequencypresets-cloneother", - kwargs={"frequencypresets": self.frequencypresets.sodar_uuid}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-frequencypresets-cloneother", + kwargs={"frequencypresets": self.frequencypresets.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with( - self.frequencypresets, presetset=self.presetset, label=data["label"] - ) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestImpactPresetsListCreateAjaxView(ApiViewTestBase): @@ -253,20 +241,16 @@ def setUp(self): def test_post(self): data = {"presetset": self.presetset.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.ImpactPresetsManager.create_as_copy_of_factory_preset", - MagicMock(return_value=ImpactPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-impactpresets-clonefactorypresets", - kwargs={"name": "the-name"}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-impactpresets-clonefactorypresets", + kwargs={"name": "any"}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with("the-name", data["label"], self.presetset) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestImpactPresetsCloneOtherAjaxView(ApiViewTestBase): @@ -281,22 +265,16 @@ def test_post(self): "presetset": self.presetset.sodar_uuid, "label": "my label", } - with patch( - "variants.models.presets.ImpactPresetsManager.create_as_copy_of_other_preset", - MagicMock(return_value=ImpactPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-impactpresets-cloneother", - kwargs={"impactpresets": self.impactpresets.sodar_uuid}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-impactpresets-cloneother", + kwargs={"impactpresets": self.impactpresets.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with( - self.impactpresets, presetset=self.presetset, label=data["label"] - ) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestQualityPresetsListCreateAjaxView(ApiViewTestBase): @@ -385,20 +363,16 @@ def setUp(self): def test_post(self): data = {"presetset": self.presetset.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.QualityPresetsManager.create_as_copy_of_factory_preset", - MagicMock(return_value=QualityPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-qualitypresets-clonefactorypresets", - kwargs={"name": "the-name"}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-qualitypresets-clonefactorypresets", + kwargs={"name": "any"}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with("the-name", data["label"], self.presetset) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestQualityPresetsCloneOtherAjaxView(ApiViewTestBase): @@ -413,22 +387,16 @@ def test_post(self): "presetset": self.presetset.sodar_uuid, "label": "my label", } - with patch( - "variants.models.presets.QualityPresetsManager.create_as_copy_of_other_preset", - MagicMock(return_value=QualityPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-qualitypresets-cloneother", - kwargs={"qualitypresets": self.qualitypresets.sodar_uuid}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-qualitypresets-cloneother", + kwargs={"qualitypresets": self.qualitypresets.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with( - self.qualitypresets, presetset=self.presetset, label=data["label"] - ) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestChromosomePresetsListCreateAjaxView(ApiViewTestBase): @@ -517,20 +485,16 @@ def setUp(self): def test_post(self): data = {"presetset": self.presetset.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.ChromosomePresetsManager.create_as_copy_of_factory_preset", - MagicMock(return_value=ChromosomePresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-chromosomepresets-clonefactorypresets", - kwargs={"name": "the-name"}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-chromosomepresets-clonefactorypresets", + kwargs={"name": "whole_genome"}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with("the-name", data["label"], self.presetset) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestChromosomePresetsCloneOtherAjaxView(ApiViewTestBase): @@ -545,22 +509,16 @@ def test_post(self): "presetset": self.presetset.sodar_uuid, "label": "my label", } - with patch( - "variants.models.presets.ChromosomePresetsManager.create_as_copy_of_other_preset", - MagicMock(return_value=ChromosomePresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-chromosomepresets-cloneother", - kwargs={"chromosomepresets": self.chromosomepresets.sodar_uuid}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-chromosomepresets-cloneother", + kwargs={"chromosomepresets": self.chromosomepresets.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with( - self.chromosomepresets, presetset=self.presetset, label=data["label"] - ) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestFlagsEtcPresetsListCreateAjaxView(ApiViewTestBase): @@ -649,20 +607,16 @@ def setUp(self): def test_post(self): data = {"presetset": self.presetset.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.FlagsEtcPresetsManager.create_as_copy_of_factory_preset", - MagicMock(return_value=FlagsEtcPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-flagsetcpresets-clonefactorypresets", - kwargs={"name": "the-name"}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-flagsetcpresets-clonefactorypresets", + kwargs={"name": "defaults"}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with("the-name", data["label"], self.presetset) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestFlagsEtcPresetsCloneOtherAjaxView(ApiViewTestBase): @@ -677,22 +631,16 @@ def test_post(self): "presetset": self.presetset.sodar_uuid, "label": "my label", } - with patch( - "variants.models.presets.FlagsEtcPresetsManager.create_as_copy_of_other_preset", - MagicMock(return_value=FlagsEtcPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-flagsetcpresets-cloneother", - kwargs={"flagsetcpresets": self.flagsetcpresets.sodar_uuid}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-flagsetcpresets-cloneother", + kwargs={"flagsetcpresets": self.flagsetcpresets.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with( - self.flagsetcpresets, presetset=self.presetset, label=data["label"] - ) + self.assertEqual(response.json()["presetset"], str(self.presetset.sodar_uuid)) class TestQuickPresetsListCreateAjaxView(ApiViewTestBase): @@ -781,20 +729,16 @@ def setUp(self): def test_post(self): data = {"label": "my label"} - with patch( - "variants.models.presets.QuickPresetsManager.create_as_copy_of_other_preset", - MagicMock(return_value=QuickPresetsFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-quickpresets-cloneother", - kwargs={"quickpresets": self.quickpresets.sodar_uuid}, - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-quickpresets-cloneother", + kwargs={"quickpresets": self.quickpresets.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with(self.quickpresets, label=data["label"]) + self.assertEqual(response.json()["presetset"], str(self.quickpresets.presetset.sodar_uuid)) class TestPresetSetListCreateAjaxView(ApiViewTestBase): @@ -895,19 +839,16 @@ def test_delete(self): class TestPresetSetCloneFactoryPresetsAjaxView(ApiViewTestBase): def test_post(self): data = {"project": self.project.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.PresetSetManager.create_as_copy_of_factory_preset_set", - MagicMock(return_value=PresetSetFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-presetset-clonefactorypresets", - ), - data=data, - ) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-presetset-clonefactorypresets", + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with(project=self.project, label=data["label"]) + self.assertEqual(response.json()["project"], str(self.project.sodar_uuid)) + self.assertEqual(PresetSet.objects.count(), 1) class TestPresetSetCloneOtherAjaxView(ApiViewTestBase): @@ -917,17 +858,15 @@ def setUp(self): def test_post(self): data = {"project": self.project.sodar_uuid, "label": "my label"} - with patch( - "variants.models.presets.PresetSetManager.create_as_copy_of_other_preset_set", - MagicMock(return_value=PresetSetFactory.build()), - ) as mock_create: - with self.login(self.superuser): - response = self.client.post( - reverse( - "variants:ajax-presetset-cloneother", - kwargs={"presetset": self.presetset.sodar_uuid}, - ), - data=data, - ) + self.assertEqual(PresetSet.objects.count(), 1) + with self.login(self.superuser): + response = self.client.post( + reverse( + "variants:ajax-presetset-cloneother", + kwargs={"presetset": self.presetset.sodar_uuid}, + ), + data=data, + ) self.assertEqual(response.status_code, 201) - mock_create.assert_called_with(self.presetset, project=self.project, label=data["label"]) + self.assertEqual(response.json()["project"], str(self.project.sodar_uuid)) + self.assertEqual(PresetSet.objects.count(), 2) diff --git a/backend/variants/urls/__init__.py b/backend/variants/urls/__init__.py index 659a8df36..7838f5844 100644 --- a/backend/variants/urls/__init__.py +++ b/backend/variants/urls/__init__.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import path from variants import views from variants.urls.annos import annos_ajax_urlpatterns @@ -9,143 +9,143 @@ app_name = "variants" ui_urlpatterns = [ # Views for Case - url( - regex=r"^(?P[0-9a-f-]+)/case-delete-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/case-delete-job/detail//", view=views.CaseDeleteJobDetailView.as_view(), name="case-delete-job-detail", ), # View for list background jobs - url( - regex=r"^(?P[0-9a-f-]+)/jobs/list/(?P[0-9a-f-]+)/?$", + path( + "/jobs/list//", view=views.BackgroundJobListView.as_view(), name="job-list", ), # Views for project sync jobs. - url( - regex=r"^(?P[0-9a-f-]+)/sync-job/(?P[0-9a-f-]+)/?$", + path( + "/sync-job//", view=views.SyncJobDetailView.as_view(), name="sync-job-detail", ), # Views for variants import job. - url( - regex=r"^(?P[0-9a-f-]+)/import/(?P[0-9a-f-]+)/?$", + path( + "/import//", view=views.ImportVariantsJobDetailView.as_view(), name="import-job-detail", ), # Views for single-case file export jobs. - url( - regex=r"^(?P[0-9a-f-]+)/export-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/export-job/detail//", view=views.ExportFileJobDetailView.as_view(), name="export-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/export-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/export-job/resubmit//", view=views.ExportFileJobResubmitView.as_view(), name="export-job-resubmit", ), - url( - regex=r"^(?P[0-9a-f-]+)/export-job/download/(?P[0-9a-f-]+)/?$", + path( + "/export-job/download//", view=views.ExportFileJobDownloadView.as_view(), name="export-job-download", ), # Views for project-wide cases file export jobs. - url( - regex=r"^(?P[0-9a-f-]+)/project-cases-export-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/project-cases-export-job/detail//", view=views.ExportProjectCasesFileJobDetailView.as_view(), name="project-cases-export-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/project-cases-export-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/project-cases-export-job/resubmit//", view=views.ExportProjectCasesFileJobResubmitView.as_view(), name="project-cases-export-job-resubmit", ), - url( - regex=r"^(?P[0-9a-f-]+)/project-cases-export-job/download/(?P[0-9a-f-]+)/?$", + path( + "/project-cases-export-job/download//", view=views.ExportProjectCasesFileJobDownloadView.as_view(), name="project-cases-export-job-download", ), # Views for MutationDistiller submission jobs - url( - regex=r"^(?P[0-9a-f-]+)/distiller-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/distiller-job/detail//", view=views.DistillerSubmissionJobDetailView.as_view(), name="distiller-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/distiller-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/distiller-job/resubmit//", view=views.DistillerSubmissionJobResubmitView.as_view(), name="distiller-job-resubmit", ), # Views for CADD submission jobs - url( - regex=r"^(?P[0-9a-f-]+)/cadd-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/cadd-job/detail//", view=views.CaddSubmissionJobDetailView.as_view(), name="cadd-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/cadd-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/cadd-job/resubmit//", view=views.CaddSubmissionJobResubmitView.as_view(), name="cadd-job-resubmit", ), # Views for SPANR submission jobs - url( - regex=r"^(?P[0-9a-f-]+)/spanr-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/spanr-job/detail//", view=views.SpanrSubmissionJobDetailView.as_view(), name="spanr-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/spanr-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/spanr-job/resubmit//", view=views.SpanrSubmissionJobResubmitView.as_view(), name="spanr-job-resubmit", ), # Views for Project-wide Statistics Computation submission jobs - url( - regex=r"^(?P[0-9a-f-]+)/project-stats-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/project-stats-job/detail//", view=views.ProjectStatsJobDetailView.as_view(), name="project-stats-job-detail", ), # Views for filtering and storing case query results jobs - url( - regex=r"^(?P[0-9a-f-]+)/filter-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/filter-job/detail//", view=views.FilterJobDetailView.as_view(), name="filter-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/filter-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/filter-job/resubmit//", view=views.FilterJobResubmitView.as_view(), name="filter-job-resubmit", ), # Views for filtering and storing project cases query results jobs - url( - regex=r"^(?P[0-9a-f-]+)/project-cases-filter-job/detail/(?P[0-9a-f-]+)/?$", + path( + "/project-cases-filter-job/detail//", view=views.ProjectCasesFilterJobDetailView.as_view(), name="project-cases-filter-job-detail", ), - url( - regex=r"^(?P[0-9a-f-]+)/project-cases-filter-job/resubmit/(?P[0-9a-f-]+)/?$", + path( + "/project-cases-filter-job/resubmit//", view=views.ProjectCasesFilterJobResubmitView.as_view(), name="project-cases-filter-job-resubmit", ), # Set last seen changelog version for user and redirect to changelog. # TODO: move to sodar-core? - url(regex=r"^new-features/?$", view=views.NewFeaturesView.as_view(), name="new-features"), + path("new-features/", view=views.NewFeaturesView.as_view(), name="new-features"), #: Detail views for site-wide maintenance jobs. - url( - regex=r"^clear-expired-job/(?P[0-9a-f-]+)/?$", + path( + "clear-expired-job//", view=views.ClearExpiredExportedFilesJobDetailView.as_view(), name="clear-expired-job-detail", ), - url( - regex=r"^clear-inactive-variant-set-job/(?P[0-9a-f-]+)/?$", + path( + "clear-inactive-variant-set-job//", view=views.ClearInactiveVariantSetsJobDetailView.as_view(), name="clear-inactive-variant-set-job", ), - url( - regex=r"^clear-old-kiosk-cases-job/(?P[0-9a-f-]+)/?$", + path( + "clear-old-kiosk-cases-job//", view=views.ClearOldKioskCasesJobDetailView.as_view(), name="clear-old-kiosk-cases-job-detail", ), - url( - regex=r"^refresh-small-variant-summaries-job/(?P[0-9a-f-]+)/?$", + path( + "refresh-small-variant-summaries-job//", view=views.RefreshSmallVariantSummaryJobDetailView.as_view(), name="refresh-small-variant-summaries-job-detail", ), @@ -153,301 +153,301 @@ # Ajax API views ajax_urlpatterns = [ - url( - regex=r"^ajax/project/qc/(?P[0-9a-f-]+)/?$", + path( + "ajax/project/qc//", view=views_ajax.CaseListQcStatsAjaxView.as_view(), name="ajax-project-qc", ), - url( - regex=r"^ajax/case/retrieve/(?P[0-9a-f-]+)/?$", + path( + "ajax/case/retrieve//", view=views_ajax.CaseRetrieveAjaxView.as_view(), name="ajax-case-retrieve", ), - url( - regex=r"^ajax/query-case/list/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/list//", view=views_ajax.SmallVariantQueryListAjaxView.as_view(), name="ajax-query-case-list", ), - url( - regex=r"^ajax/query/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/query/list-create//", view=views_ajax.SmallVariantQueryListCreateAjaxView.as_view(), name="ajax-query-list-create", ), - url( - regex=r"^ajax/query/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/query/retrieve-update-destroy//", view=views_ajax.SmallVariantQueryRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-query-retrieve-update-destroy", ), - url( - regex=r"^ajax/query-result-set/list/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-result-set/list//", view=views_ajax.SmallVariantQueryResultSetListAjaxView.as_view(), name="ajax-query-result-set-list", ), - url( - regex=r"^ajax/query-result-set/retrieve/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-result-set/retrieve//", view=views_ajax.SmallVariantQueryResultSetRetrieveAjaxView.as_view(), name="ajax-query-result-set-retrieve", ), - url( - regex=r"^ajax/query-result-row/list/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-result-row/list//", view=views_ajax.SmallVariantQueryResultRowListAjaxView.as_view(), name="ajax-query-result-row-list", ), - url( - regex=r"^ajax/query-result-row/retrieve/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-result-row/retrieve//", view=views_ajax.SmallVariantQueryResultRowRetrieveAjaxView.as_view(), name="ajax-query-result-row-retrieve", ), - url( - r"^ajax/query-case/query-settings-shortcut/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/query-settings-shortcut//", view=views_ajax.SmallVariantQuerySettingsShortcutAjaxView.as_view(), name="ajax-query-settings-shortcut", ), - url( - r"^ajax/query-case/download/generate/tsv/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/download/generate/tsv//", view=views_ajax.SmallVariantQueryDownloadGenerateAjaxView.as_view(), name="ajax-query-case-download-generate-tsv", ), - url( - r"^ajax/query-case/download/generate/vcf/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/download/generate/vcf//", view=views_ajax.SmallVariantQueryDownloadGenerateAjaxView.as_view(), name="ajax-query-case-download-generate-vcf", ), - url( - r"^ajax/query-case/download/generate/xlsx/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/download/generate/xlsx//", view=views_ajax.SmallVariantQueryDownloadGenerateAjaxView.as_view(), name="ajax-query-case-download-generate-xlsx", ), - url( - r"^ajax/query-case/download/serve/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/download/serve//", view=views_ajax.SmallVariantQueryDownloadServeAjaxView.as_view(), name="ajax-query-case-download-serve", ), - url( - r"^ajax/query-case/download/status/(?P[0-9a-f-]+)/?$", + path( + "ajax/query-case/download/status//", view=views_ajax.SmallVariantQueryDownloadStatusAjaxView.as_view(), name="ajax-query-case-download-status", ), - url( - r"^ajax/small-variant-comment/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-comment/list-create//", view=views_ajax.SmallVariantCommentListCreateAjaxView.as_view(), name="ajax-small-variant-comment-list-create", ), - url( - r"^ajax/small-variant-comment/list-project/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-comment/list-project//", view=views_ajax.SmallVariantCommentListProjectAjaxView.as_view(), name="ajax-small-variant-comment-list-project", ), - url( - r"^ajax/small-variant-comment/update/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-comment/update//", view=views_ajax.SmallVariantCommentUpdateAjaxView.as_view(), name="ajax-small-variant-comment-update", ), - url( - r"^ajax/small-variant-comment/delete/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-comment/delete//", view=views_ajax.SmallVariantCommentDeleteAjaxView.as_view(), name="ajax-small-variant-comment-delete", ), - url( - r"^ajax/small-variant-flags/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-flags/list-create//", view=views_ajax.SmallVariantFlagsListCreateAjaxView.as_view(), name="ajax-small-variant-flags-list-create", ), - url( - r"^ajax/small-variant-flags/list-project/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-flags/list-project//", view=views_ajax.SmallVariantFlagsListProjectAjaxView.as_view(), name="ajax-small-variant-flags-list-project", ), - url( - r"^ajax/small-variant-flags/update/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-flags/update//", view=views_ajax.SmallVariantFlagsUpdateAjaxView.as_view(), name="ajax-small-variant-flags-update", ), - url( - r"^ajax/small-variant-flags/delete/(?P[0-9a-f-]+)/?$", + path( + "ajax/small-variant-flags/delete//", view=views_ajax.SmallVariantFlagsDeleteAjaxView.as_view(), name="ajax-small-variant-flags-delete", ), - url( - r"^ajax/acmg-criteria-rating/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/acmg-criteria-rating/list-create//", view=views_ajax.AcmgCriteriaRatingListCreateAjaxView.as_view(), name="ajax-acmg-criteria-rating-list-create", ), - url( - r"^ajax/acmg-criteria-rating/update/(?P[0-9a-f-]+)/?$", + path( + "ajax/acmg-criteria-rating/update//", view=views_ajax.AcmgCriteriaRatingUpdateAjaxView.as_view(), name="ajax-acmg-criteria-rating-update", ), - url( - r"^ajax/acmg-criteria-rating/delete/(?P[0-9a-f-]+)/?$", + path( + "ajax/acmg-criteria-rating/delete//", view=views_ajax.AcmgCriteriaRatingDeleteAjaxView.as_view(), name="ajax-acmg-criteria-rating-delete", ), - url( - r"^ajax/extra-anno-fields/?$", + path( + "ajax/extra-anno-fields/", view=views_ajax.ExtraAnnoFieldsApiView.as_view(), name="ajax-extra-anno-fields", ), - url( - regex=r"^ajax/project-settings/retrieve/(?P[0-9a-f-]+)/?$", + path( + "ajax/project-settings/retrieve//", view=views_ajax.ProjectSettingsRetrieveAjaxView.as_view(), name="ajax-project-settings-retrieve", ), ] api_urlpatterns = [ - url( - regex=r"^api/project/qc/(?P[0-9a-f-]+)/?$", + path( + "api/project/qc//", view=views_api.CaseListQcStatsApiView.as_view(), name="api-project-qc", ), - url( - regex=r"^api/case/retrieve/(?P[0-9a-f-]+)/?$", + path( + "api/case/retrieve//", view=views_api.CaseRetrieveApiView.as_view(), name="api-case-retrieve", ), - url( - regex=r"^api/query-case/list/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/list//", view=views_api.SmallVariantQueryListApiView.as_view(), name="api-query-case-list", ), - url( - regex=r"^api/query/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/query/list-create//", view=views_api.SmallVariantQueryListCreateApiView.as_view(), name="api-query-list-create", ), - url( - regex=r"^api/query/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "api/query/retrieve-update-destroy//", view=views_api.SmallVariantQueryRetrieveUpdateDestroyApiView.as_view(), name="api-query-retrieve-update-destroy", ), - url( - regex=r"^api/query-result-set/list/(?P[0-9a-f-]+)/?$", + path( + "api/query-result-set/list//", view=views_api.SmallVariantQueryResultSetListApiView.as_view(), name="api-query-result-set-list", ), - url( - regex=r"^api/query-result-set/retrieve/(?P[0-9a-f-]+)/?$", + path( + "api/query-result-set/retrieve//", view=views_api.SmallVariantQueryResultSetRetrieveApiView.as_view(), name="api-query-result-set-retrieve", ), - url( - regex=r"^api/query-result-row/list/(?P[0-9a-f-]+)/?$", + path( + "api/query-result-row/list//", view=views_api.SmallVariantQueryResultRowListApiView.as_view(), name="api-query-result-row-list", ), - url( - regex=r"^api/query-result-row/retrieve/(?P[0-9a-f-]+)/?$", + path( + "api/query-result-row/retrieve//", view=views_api.SmallVariantQueryResultRowRetrieveApiView.as_view(), name="api-query-result-row-retrieve", ), - url( - regex=r"^api/query-case/query-settings-shortcut/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/query-settings-shortcut//", view=views_api.SmallVariantQuerySettingsShortcutApiView.as_view(), name="api-query-settings-shortcut", ), - url( - regex=r"^api/query-case/quick-presets/?$", + path( + "api/query-case/quick-presets/", view=views_api.SmallVariantQuickPresetsApiView.as_view(), name="api-quick-presets", ), - url( - regex=r"^api/query-case/category-presets/(?P[a-zA-Z0-9\._-]+)/?$", + path( + "api/query-case/category-presets//", view=views_api.SmallVariantCategoryPresetsApiView.as_view(), name="api-category-presets", ), - url( - regex=r"^api/query-case/inheritance-presets/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/inheritance-presets//", view=views_api.SmallVariantInheritancePresetsApiView.as_view(), name="api-inheritance-presets", ), - url( - regex=r"^api/query-case/download/generate/tsv/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/download/generate/tsv//", view=views_api.SmallVariantQueryDownloadGenerateApiView.as_view(), name="api-query-case-download-generate-tsv", ), - url( - regex=r"^api/query-case/download/generate/vcf/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/download/generate/vcf//", view=views_api.SmallVariantQueryDownloadGenerateApiView.as_view(), name="api-query-case-download-generate-vcf", ), - url( - regex=r"^api/query-case/download/generate/xlsx/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/download/generate/xlsx//", view=views_api.SmallVariantQueryDownloadGenerateApiView.as_view(), name="api-query-case-download-generate-xlsx", ), - url( - regex=r"^api/query-case/download/serve/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/download/serve//", view=views_api.SmallVariantQueryDownloadServeApiView.as_view(), name="api-query-case-download-serve", ), - url( - regex=r"^api/query-case/download/status/(?P[0-9a-f-]+)/?$", + path( + "api/query-case/download/status//", view=views_api.SmallVariantQueryDownloadStatusApiView.as_view(), name="api-query-case-download-status", ), - url( - r"^api/small-variant-comment/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-comment/list-create//", view=views_api.SmallVariantCommentListCreateApiView.as_view(), name="api-small-variant-comment-list-create", ), - url( - r"^api/small-variant-comment/list-project/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-comment/list-project//", view=views_api.SmallVariantCommentListProjectApiView.as_view(), name="api-small-variant-comment-list-project", ), - url( - r"^api/small-variant-comment/update/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-comment/update//", view=views_api.SmallVariantCommentUpdateApiView.as_view(), name="api-small-variant-comment-update", ), - url( - r"^api/small-variant-comment/delete/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-comment/delete//", view=views_api.SmallVariantCommentDeleteApiView.as_view(), name="api-small-variant-comment-delete", ), - url( - r"^api/small-variant-flags/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-flags/list-create//", view=views_api.SmallVariantFlagsListCreateApiView.as_view(), name="api-small-variant-flags-list-create", ), - url( - r"^api/small-variant-flags/list-project/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-flags/list-project//", view=views_api.SmallVariantFlagsListProjectApiView.as_view(), name="api-small-variant-flags-list-project", ), - url( - r"^api/small-variant-flags/update/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-flags/update//", view=views_api.SmallVariantFlagsUpdateApiView.as_view(), name="api-small-variant-flags-update", ), - url( - r"^api/small-variant-flags/delete/(?P[0-9a-f-]+)/?$", + path( + "api/small-variant-flags/delete//", view=views_api.SmallVariantFlagsDeleteApiView.as_view(), name="api-small-variant-flags-delete", ), - url( - r"^api/acmg-criteria-rating/list-create/(?P[0-9a-f-]+)/?$", + path( + "api/acmg-criteria-rating/list-create//", view=views_api.AcmgCriteriaRatingListCreateApiView.as_view(), name="api-acmg-criteria-rating-list-create", ), - url( - r"^api/acmg-criteria-rating/update/(?P[0-9a-f-]+)/?$", + path( + "api/acmg-criteria-rating/update//", view=views_api.AcmgCriteriaRatingUpdateApiView.as_view(), name="api-acmg-criteria-rating-update", ), - url( - r"^api/acmg-criteria-rating/delete/(?P[0-9a-f-]+)/?$", + path( + "api/acmg-criteria-rating/delete//", view=views_api.AcmgCriteriaRatingDeleteApiView.as_view(), name="api-acmg-criteria-rating-delete", ), - url( - r"^api/extra-anno-fields/?$", + path( + "api/extra-anno-fields/", view=views_api.ExtraAnnoFieldsApiView.as_view(), name="api-extra-anno-fields", ), - url( - regex=r"^api/project-settings/retrieve/(?P[0-9a-f-]+)/?$", + path( + "api/project-settings/retrieve//", view=views_api.ProjectSettingsRetrieveApiView.as_view(), name="api-project-settings-retrieve", ), diff --git a/backend/variants/urls/annos.py b/backend/variants/urls/annos.py index 75e9fb7c7..28ba689c3 100644 --- a/backend/variants/urls/annos.py +++ b/backend/variants/urls/annos.py @@ -1,14 +1,14 @@ """User annotation--related urls.""" -from django.conf.urls import url +from django.urls import path from variants.views.ajax.annos import CaseUserAnnotatedVariantsAjaxView ui_urlpatterns = [] ajax_urlpatterns = [ - url( - regex=r"^ajax/smallvariant/user-annotated-case/(?P[0-9a-f-]+)/?$", + path( + "ajax/smallvariant/user-annotated-case//", view=CaseUserAnnotatedVariantsAjaxView.as_view(), name="ajax-smallvariant-userannotatedcase", ), diff --git a/backend/variants/urls/presets.py b/backend/variants/urls/presets.py index 6f806ff83..b1e7dd30e 100644 --- a/backend/variants/urls/presets.py +++ b/backend/variants/urls/presets.py @@ -1,6 +1,6 @@ """Presets-related urls.""" -from django.conf.urls import url +from django.urls import path import variants.views.ajax.presets as views_ajax @@ -9,158 +9,158 @@ ### "Regular" PresetSet members ### ################################### # FrequencyPresets - url( - regex=r"^ajax/frequencypresets/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/frequencypresets/list-create//", view=views_ajax.FrequencyPresetsListCreateAjaxView.as_view(), name="ajax-frequencypresets-listcreate", ), - url( - regex=r"^ajax/frequencypresets/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/frequencypresets/retrieve-update-destroy//", view=views_ajax.FrequencyPresetsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-frequencypresets-retrieveupdatedestroy", ), - url( - regex=r"^ajax/frequencypresets/clone-factory-presets/(?P[a-zA-Z_-]+)/?$", + path( + "ajax/frequencypresets/clone-factory-presets//", view=views_ajax.FrequencyPresetsCloneFactoryPresetsAjaxView.as_view(), name="ajax-frequencypresets-clonefactorypresets", ), - url( - regex=r"ajax/frequencypresets/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/frequencypresets/clone-other//", view=views_ajax.FrequencyPresetsCloneOtherAjaxView.as_view(), name="ajax-frequencypresets-cloneother", ), # FlagsEtcPresets - url( - regex=r"^ajax/flagsetcpresets/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/flagsetcpresets/list-create//", view=views_ajax.FlagsEtcPresetsListCreateAjaxView.as_view(), name="ajax-flagsetcpresets-listcreate", ), - url( - regex=r"^ajax/flagsetcpresets/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/flagsetcpresets/retrieve-update-destroy//", view=views_ajax.FlagsEtcPresetsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-flagsetcpresets-retrieveupdatedestroy", ), - url( - regex=r"^ajax/flagsetcpresets/clone-factory-presets/(?P[a-zA-Z_-]+)/?$", + path( + "ajax/flagsetcpresets/clone-factory-presets//", view=views_ajax.FlagsEtcPresetsCloneFactoryPresetsAjaxView.as_view(), name="ajax-flagsetcpresets-clonefactorypresets", ), - url( - regex=r"ajax/flagsetcpresets/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/flagsetcpresets/clone-other//", view=views_ajax.FlagsEtcPresetsCloneOtherAjaxView.as_view(), name="ajax-flagsetcpresets-cloneother", ), # ImpactPresets - url( - regex=r"^ajax/impactpresets/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/impactpresets/list-create//", view=views_ajax.ImpactPresetsListCreateAjaxView.as_view(), name="ajax-impactpresets-listcreate", ), - url( - regex=r"^ajax/impactpresets/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/impactpresets/retrieve-update-destroy//", view=views_ajax.ImpactPresetsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-impactpresets-retrieveupdatedestroy", ), - url( - regex=r"^ajax/impactpresets/clone-factory-presets/(?P[a-zA-Z_-]+)/?$", + path( + "ajax/impactpresets/clone-factory-presets//", view=views_ajax.ImpactPresetsCloneFactoryPresetsAjaxView.as_view(), name="ajax-impactpresets-clonefactorypresets", ), - url( - regex=r"ajax/impactpresets/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/impactpresets/clone-other//", view=views_ajax.ImpactPresetsCloneOtherAjaxView.as_view(), name="ajax-impactpresets-cloneother", ), # QualityPresets - url( - regex=r"^ajax/qualitypresets/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/qualitypresets/list-create//", view=views_ajax.QualityPresetsListCreateAjaxView.as_view(), name="ajax-qualitypresets-listcreate", ), - url( - regex=r"^ajax/qualitypresets/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/qualitypresets/retrieve-update-destroy//", view=views_ajax.QualityPresetsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-qualitypresets-retrieveupdatedestroy", ), - url( - regex=r"^ajax/qualitypresets/clone-factory-presets/(?P[a-zA-Z_-]+)/?$", + path( + "ajax/qualitypresets/clone-factory-presets//", view=views_ajax.QualityPresetsCloneFactoryPresetsAjaxView.as_view(), name="ajax-qualitypresets-clonefactorypresets", ), - url( - regex=r"ajax/qualitypresets/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/qualitypresets/clone-other//", view=views_ajax.QualityPresetsCloneOtherAjaxView.as_view(), name="ajax-qualitypresets-cloneother", ), # ChromosomePresets - url( - regex=r"^ajax/chromosomepresets/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/chromosomepresets/list-create//", view=views_ajax.ChromosomePresetsListCreateAjaxView.as_view(), name="ajax-chromosomepresets-listcreate", ), - url( - regex=r"^ajax/chromosomepresets/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/chromosomepresets/retrieve-update-destroy//", view=views_ajax.ChromosomePresetsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-chromosomepresets-retrieveupdatedestroy", ), - url( - regex=r"^ajax/chromosomepresets/clone-factory-presets/(?P[a-zA-Z_-]+)/?$", + path( + "ajax/chromosomepresets/clone-factory-presets//", view=views_ajax.ChromosomePresetsCloneFactoryPresetsAjaxView.as_view(), name="ajax-chromosomepresets-clonefactorypresets", ), - url( - regex=r"ajax/chromosomepresets/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/chromosomepresets/clone-other//", view=views_ajax.ChromosomePresetsCloneOtherAjaxView.as_view(), name="ajax-chromosomepresets-cloneother", ), ############################################# ### Quick Presets (only clone from other) ### ############################################# - url( - regex=r"^ajax/quickpresets/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/quickpresets/list-create//", view=views_ajax.QuickPresetsListCreateAjaxView.as_view(), name="ajax-quickpresets-listcreate", ), - url( - regex=r"^ajax/quickpresets/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/quickpresets/retrieve-update-destroy//", view=views_ajax.QuickPresetsRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-quickpresets-retrieveupdatedestroy", ), - url( - regex=r"^ajax/quickpresets/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/quickpresets/clone-other//", view=views_ajax.QuickPresetsCloneOtherAjaxView.as_view(), name="ajax-quickpresets-cloneother", ), ################# ### PresetSet ### ################# - url( - regex=r"^ajax/presetset/list/?$", + path( + "ajax/presetset/list/", view=views_ajax.PresetSetListAllAjaxView.as_view(), name="ajax-presetset-listall", ), - url( - regex=r"^ajax/presetset/list-create/(?P[0-9a-f-]+)/?$", + path( + "ajax/presetset/list-create//", view=views_ajax.PresetSetListCreateAjaxView.as_view(), name="ajax-presetset-listcreate", ), - url( - regex=r"^ajax/presetset/retrieve-update-destroy/(?P[0-9a-f-]+)/?$", + path( + "ajax/presetset/retrieve-update-destroy//", view=views_ajax.PresetSetRetrieveUpdateDestroyAjaxView.as_view(), name="ajax-presetset-retrieveupdatedestroy", ), - url( - regex=r"^ajax/presetset/clone-factory-presets/?$", + path( + "ajax/presetset/clone-factory-presets/", view=views_ajax.PresetSetCloneFactoryPresetsAjaxView.as_view(), name="ajax-presetset-clonefactorypresets", ), - url( - regex=r"^ajax/presetset/clone-other/(?P[0-9a-f-]+)/?$", + path( + "ajax/presetset/clone-other//", view=views_ajax.PresetSetCloneOtherAjaxView.as_view(), name="ajax-presetset-cloneother", ), - url( - regex=r"^ajax/project-default-presetset/retrieve/(?P[a-zA-Z0-9\._-]+)/?$", + path( + "ajax/project-default-presetset/retrieve//", view=views_ajax.ProjectDefaultPresetSetRetrieveAjaxView.as_view(), name="ajax-project-default-presetset-retrieve", ), diff --git a/frontend/src/svs/components/SvFilterForm/GenesRegionsPane.vue b/frontend/src/svs/components/SvFilterForm/GenesRegionsPane.vue index 3268a7b75..894bb7873 100644 --- a/frontend/src/svs/components/SvFilterForm/GenesRegionsPane.vue +++ b/frontend/src/svs/components/SvFilterForm/GenesRegionsPane.vue @@ -306,14 +306,14 @@ defineExpose({ :options="genomicsEnglandPanels" placeholder="Add from GE PanelApp" :searchable="true" - @select="insertGenomicsEnglandPanel" style="width: 400px" + @select="insertGenomicsEnglandPanel" />