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 43bff831a..2b8f4c992 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 7688e97aa..5849a9c85 100644 --- a/backend/Pipfile.lock +++ b/backend/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "28d7249fbd6fe67e7c98b69c35b11c7c707babab70888abe49439437398810e2" + "sha256": "f7d82a0c2527f207a09bf1da618cbccae611273ef6597304e8d619053b77c33f" }, "pipfile-spec": 6, "requires": { - "python_version": "3.10" + "python_version": "3.11" }, "sources": [ { @@ -18,11 +18,11 @@ "default": { "aiobotocore": { "hashes": [ - "sha256:0f738cde74108553b753b24655094289a3c7ea0f0f179ed1c0f8cea488999a35", - "sha256:1f9f16eec2a3da32df162b5db12da779ec6d6c6311715c936cad511f436efa74" + "sha256:9ac1cfcaccccc80602968174aa032bf978abe36bd4e55e6781d6500909af1375", + "sha256:d4d3128b4b558e2b4c369bfa963b022d7e87303adb82eec623cec8aa77ae578a" ], "markers": "python_version >= '3.8'", - "version": "==2.15.1" + "version": "==2.15.2" }, "aiohappyeyeballs": { "hashes": [ @@ -34,100 +34,100 @@ }, "aiohttp": { "hashes": [ - "sha256:02d1d6610588bcd743fae827bd6f2e47e0d09b346f230824b4c6fb85c6065f9c", - "sha256:03690541e4cc866eef79626cfa1ef4dd729c5c1408600c8cb9e12e1137eed6ab", - "sha256:0bc059ecbce835630e635879f5f480a742e130d9821fbe3d2f76610a6698ee25", - "sha256:0c21c82df33b264216abffff9f8370f303dab65d8eee3767efbbd2734363f677", - "sha256:1298b854fd31d0567cbb916091be9d3278168064fca88e70b8468875ef9ff7e7", - "sha256:1321658f12b6caffafdc35cfba6c882cb014af86bef4e78c125e7e794dfb927b", - "sha256:143b0026a9dab07a05ad2dd9e46aa859bffdd6348ddc5967b42161168c24f857", - "sha256:16e6a51d8bc96b77f04a6764b4ad03eeef43baa32014fce71e882bd71302c7e4", - "sha256:172ad884bb61ad31ed7beed8be776eb17e7fb423f1c1be836d5cb357a096bf12", - "sha256:17c272cfe7b07a5bb0c6ad3f234e0c336fb53f3bf17840f66bd77b5815ab3d16", - "sha256:1a0ee6c0d590c917f1b9629371fce5f3d3f22c317aa96fbdcce3260754d7ea21", - "sha256:2746d8994ebca1bdc55a1e998feff4e94222da709623bb18f6e5cfec8ec01baf", - "sha256:2914caa46054f3b5ff910468d686742ff8cff54b8a67319d75f5d5945fd0a13d", - "sha256:2bbf94d4a0447705b7775417ca8bb8086cc5482023a6e17cdc8f96d0b1b5aba6", - "sha256:2bd9f3eac515c16c4360a6a00c38119333901b8590fe93c3257a9b536026594d", - "sha256:2c33fa6e10bb7ed262e3ff03cc69d52869514f16558db0626a7c5c61dde3c29f", - "sha256:2d37f4718002863b82c6f391c8efd4d3a817da37030a29e2682a94d2716209de", - "sha256:3668d0c2a4d23fb136a753eba42caa2c0abbd3d9c5c87ee150a716a16c6deec1", - "sha256:36d4fba838be5f083f5490ddd281813b44d69685db910907636bc5dca6322316", - "sha256:40ff5b7660f903dc587ed36ef08a88d46840182d9d4b5694e7607877ced698a1", - "sha256:42775de0ca04f90c10c5c46291535ec08e9bcc4756f1b48f02a0657febe89b10", - "sha256:482c85cf3d429844396d939b22bc2a03849cb9ad33344689ad1c85697bcba33a", - "sha256:4e6cb75f8ddd9c2132d00bc03c9716add57f4beff1263463724f6398b813e7eb", - "sha256:4edc3fd701e2b9a0d605a7b23d3de4ad23137d23fc0dbab726aa71d92f11aaaf", - "sha256:4fd16b30567c5b8e167923be6e027eeae0f20cf2b8a26b98a25115f28ad48ee0", - "sha256:5002a02c17fcfd796d20bac719981d2fca9c006aac0797eb8f430a58e9d12431", - "sha256:51d0a4901b27272ae54e42067bc4b9a90e619a690b4dc43ea5950eb3070afc32", - "sha256:558b3d223fd631ad134d89adea876e7fdb4c93c849ef195049c063ada82b7d08", - "sha256:5c070430fda1a550a1c3a4c2d7281d3b8cfc0c6715f616e40e3332201a253067", - "sha256:5f392ef50e22c31fa49b5a46af7f983fa3f118f3eccb8522063bee8bfa6755f8", - "sha256:60555211a006d26e1a389222e3fab8cd379f28e0fbf7472ee55b16c6c529e3a6", - "sha256:608cecd8d58d285bfd52dbca5b6251ca8d6ea567022c8a0eaae03c2589cd9af9", - "sha256:60ad5b8a7452c0f5645c73d4dad7490afd6119d453d302cd5b72b678a85d6044", - "sha256:63649309da83277f06a15bbdc2a54fbe75efb92caa2c25bb57ca37762789c746", - "sha256:6ebdc3b3714afe1b134b3bbeb5f745eed3ecbcff92ab25d80e4ef299e83a5465", - "sha256:6f3c6648aa123bcd73d6f26607d59967b607b0da8ffcc27d418a4b59f4c98c7c", - "sha256:7003f33f5f7da1eb02f0446b0f8d2ccf57d253ca6c2e7a5732d25889da82b517", - "sha256:776e9f3c9b377fcf097c4a04b241b15691e6662d850168642ff976780609303c", - "sha256:85711eec2d875cd88c7eb40e734c4ca6d9ae477d6f26bd2b5bb4f7f60e41b156", - "sha256:87d1e4185c5d7187684d41ebb50c9aeaaaa06ca1875f4c57593071b0409d2444", - "sha256:8a3f063b41cc06e8d0b3fcbbfc9c05b7420f41287e0cd4f75ce0a1f3d80729e6", - "sha256:8b3fb28a9ac8f2558760d8e637dbf27aef1e8b7f1d221e8669a1074d1a266bb2", - "sha256:8bd9125dd0cc8ebd84bff2be64b10fdba7dc6fd7be431b5eaf67723557de3a31", - "sha256:8be1a65487bdfc285bd5e9baf3208c2132ca92a9b4020e9f27df1b16fab998a9", - "sha256:8cc0d13b4e3b1362d424ce3f4e8c79e1f7247a00d792823ffd640878abf28e56", - "sha256:8d9d10d10ec27c0d46ddaecc3c5598c4db9ce4e6398ca872cdde0525765caa2f", - "sha256:8debb45545ad95b58cc16c3c1cc19ad82cffcb106db12b437885dbee265f0ab5", - "sha256:91aa966858593f64c8a65cdefa3d6dc8fe3c2768b159da84c1ddbbb2c01ab4ef", - "sha256:9331dd34145ff105177855017920dde140b447049cd62bb589de320fd6ddd582", - "sha256:99f9678bf0e2b1b695e8028fedac24ab6770937932eda695815d5a6618c37e04", - "sha256:9fdf5c839bf95fc67be5794c780419edb0dbef776edcfc6c2e5e2ffd5ee755fa", - "sha256:a14e4b672c257a6b94fe934ee62666bacbc8e45b7876f9dd9502d0f0fe69db16", - "sha256:a19caae0d670771ea7854ca30df76f676eb47e0fd9b2ee4392d44708f272122d", - "sha256:a35ed3d03910785f7d9d6f5381f0c24002b2b888b298e6f941b2fc94c5055fcd", - "sha256:a61df62966ce6507aafab24e124e0c3a1cfbe23c59732987fc0fd0d71daa0b88", - "sha256:a6e00c8a92e7663ed2be6fcc08a2997ff06ce73c8080cd0df10cc0321a3168d7", - "sha256:ac3196952c673822ebed8871cf8802e17254fff2a2ed4835d9c045d9b88c5ec7", - "sha256:ac74e794e3aee92ae8f571bfeaa103a141e409863a100ab63a253b1c53b707eb", - "sha256:ad3675c126f2a95bde637d162f8231cff6bc0bc9fbe31bd78075f9ff7921e322", - "sha256:aeebd3061f6f1747c011e1d0b0b5f04f9f54ad1a2ca183e687e7277bef2e0da2", - "sha256:ba1a599255ad6a41022e261e31bc2f6f9355a419575b391f9655c4d9e5df5ff5", - "sha256:bbdb8def5268f3f9cd753a265756f49228a20ed14a480d151df727808b4531dd", - "sha256:c2555e4949c8d8782f18ef20e9d39730d2656e218a6f1a21a4c4c0b56546a02e", - "sha256:c2695c61cf53a5d4345a43d689f37fc0f6d3a2dc520660aec27ec0f06288d1f9", - "sha256:c2b627d3c8982691b06d89d31093cee158c30629fdfebe705a91814d49b554f8", - "sha256:c46131c6112b534b178d4e002abe450a0a29840b61413ac25243f1291613806a", - "sha256:c54dc329cd44f7f7883a9f4baaefe686e8b9662e2c6c184ea15cceee587d8d69", - "sha256:c7d7cafc11d70fdd8801abfc2ff276744ae4cb39d8060b6b542c7e44e5f2cfc2", - "sha256:cb0b2d5d51f96b6cc19e6ab46a7b684be23240426ae951dcdac9639ab111b45e", - "sha256:d15a29424e96fad56dc2f3abed10a89c50c099f97d2416520c7a543e8fddf066", - "sha256:d1f5c9169e26db6a61276008582d945405b8316aae2bb198220466e68114a0f5", - "sha256:d271f770b52e32236d945911b2082f9318e90ff835d45224fa9e28374303f729", - "sha256:d646fdd74c25bbdd4a055414f0fe32896c400f38ffbdfc78c68e62812a9e0257", - "sha256:d6e395c3d1f773cf0651cd3559e25182eb0c03a2777b53b4575d8adc1149c6e9", - "sha256:d7c071235a47d407b0e93aa6262b49422dbe48d7d8566e1158fecc91043dd948", - "sha256:d97273a52d7f89a75b11ec386f786d3da7723d7efae3034b4dda79f6f093edc1", - "sha256:dcf354661f54e6a49193d0b5653a1b011ba856e0b7a76bda2c33e4c6892f34ea", - "sha256:e3e7fabedb3fe06933f47f1538df7b3a8d78e13d7167195f51ca47ee12690373", - "sha256:e525b69ee8a92c146ae5b4da9ecd15e518df4d40003b01b454ad694a27f498b5", - "sha256:e709d6ac598c5416f879bb1bae3fd751366120ac3fa235a01de763537385d036", - "sha256:e83dfefb4f7d285c2d6a07a22268344a97d61579b3e0dce482a5be0251d672ab", - "sha256:e86260b76786c28acf0b5fe31c8dca4c2add95098c709b11e8c35b424ebd4f5b", - "sha256:e883b61b75ca6efc2541fcd52a5c8ccfe288b24d97e20ac08fdf343b8ac672ea", - "sha256:f0a44bb40b6aaa4fb9a5c1ee07880570ecda2065433a96ccff409c9c20c1624a", - "sha256:f82ace0ec57c94aaf5b0e118d4366cff5889097412c75aa14b4fd5fc0c44ee3e", - "sha256:f9ca09414003c0e96a735daa1f071f7d7ed06962ef4fa29ceb6c80d06696d900", - "sha256:fa430b871220dc62572cef9c69b41e0d70fcb9d486a4a207a5de4c1f25d82593", - "sha256:fc262c3df78c8ff6020c782d9ce02e4bcffe4900ad71c0ecdad59943cba54442", - "sha256:fcd546782d03181b0b1d20b43d612429a90a68779659ba8045114b867971ab71", - "sha256:fd4ceeae2fb8cabdd1b71c82bfdd39662473d3433ec95b962200e9e752fb70d0", - "sha256:fec5fac7aea6c060f317f07494961236434928e6f4374e170ef50b3001e14581" - ], - "markers": "python_version >= '3.8'", - "version": "==3.10.9" + "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", + "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c", + "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24", + "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480", + "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2", + "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5", + "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", + "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", + "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", + "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", + "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486", + "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", + "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", + "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", + "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", + "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", + "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d", + "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", + "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", + "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", + "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7", + "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", + "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", + "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", + "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", + "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", + "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", + "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", + "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8", + "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", + "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", + "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", + "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", + "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce", + "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", + "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8", + "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", + "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", + "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a", + "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", + "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", + "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab", + "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", + "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", + "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", + "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572", + "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554", + "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", + "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", + "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", + "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b", + "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", + "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090", + "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", + "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc", + "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", + "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", + "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", + "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", + "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", + "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", + "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", + "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb", + "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", + "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", + "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", + "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", + "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983", + "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", + "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", + "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa", + "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c", + "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2", + "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", + "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", + "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762", + "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", + "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8", + "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", + "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", + "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", + "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91", + "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23", + "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527", + "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", + "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", + "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7", + "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f", + "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", + "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", + "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414" + ], + "markers": "python_version >= '3.8'", + "version": "==3.10.10" }, "aioitertools": { "hashes": [ @@ -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,52 +271,23 @@ "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": [ - "sha256:25b17a9ccba6ad32bb5bf7ba4f52656aa03c1cb29f6b4e438050ee4ad1967a3b", - "sha256:cab9ec4e0367b9f33f0bc02c5a29f587b0119ecffd6d125bacee085dcbc8817d" + "sha256:354ec1b766f0029b5d6ff0c45d1a0f9e5007b7d2f3ec89bcdd755b208c5bc797", + "sha256:64241c778bf2dc863d93abab159e14024d97a926a5715056ef6411418cb9ead3" ], "markers": "python_version >= '3.8'", - "version": "==1.35.23" + "version": "==1.35.36" }, "cattrs": { "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,11 +545,11 @@ }, "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": [ @@ -604,26 +586,25 @@ }, "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:8760fbb34564fbb2f394345eef24aec5b8f6506b6cfcefe8195ed66dd1032bdb", - "sha256:e8a15fd1b0f72992b008f5ea94c70d3baa0cb51b0d5a0e899c17b1d1b23d2771" + "sha256:6fd328db7195e70cdee479ee687fef6623c9b57b8023c582adbe88a01dc54297", + "sha256:b6c2d61861dcf1084b8e10959418fe3380a1a3dcd2796a73d43f738a42aabb4c" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==30.3.0" + "version": "==30.4.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:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396", + "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38", + "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a", + "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8", + "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b", + "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad", + "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a", + "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a", + "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da", + "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6", + "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8", + "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344", + "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a", + "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8", + "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5", + "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7", + "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170", + "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132", + "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9", + "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd", + "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9", + "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346", + "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc", + "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589", + "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5", + "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915", + "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295", + "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453", + "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea", + "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b", + "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d", + "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b", + "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4", + "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b", + "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7", + "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf", + "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f", + "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91", + "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd", + "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50", + "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b", + "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583", + "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a", + "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984", + "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c", + "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c", + "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25", + "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa", + "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4", + "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3", + "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97", + "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1", + "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd", + "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772", + "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a", + "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729", + "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca", + "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6", + "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635", + "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b", + "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.1" }, "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" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", - "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb" + "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": "==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": { @@ -1774,6 +1707,110 @@ "markers": "python_full_version >= '3.7.0'", "version": "==3.0.48" }, + "propcache": { + "hashes": [ + "sha256:00181262b17e517df2cd85656fcd6b4e70946fe62cd625b9d74ac9977b64d8d9", + "sha256:0e53cb83fdd61cbd67202735e6a6687a7b491c8742dfc39c9e01e80354956763", + "sha256:1235c01ddaa80da8235741e80815ce381c5267f96cc49b1477fdcf8c047ef325", + "sha256:140fbf08ab3588b3468932974a9331aff43c0ab8a2ec2c608b6d7d1756dbb6cb", + "sha256:191db28dc6dcd29d1a3e063c3be0b40688ed76434622c53a284e5427565bbd9b", + "sha256:1e41d67757ff4fbc8ef2af99b338bfb955010444b92929e9e55a6d4dcc3c4f09", + "sha256:1ec43d76b9677637a89d6ab86e1fef70d739217fefa208c65352ecf0282be957", + "sha256:20a617c776f520c3875cf4511e0d1db847a076d720714ae35ffe0df3e440be68", + "sha256:218db2a3c297a3768c11a34812e63b3ac1c3234c3a086def9c0fee50d35add1f", + "sha256:22aa8f2272d81d9317ff5756bb108021a056805ce63dd3630e27d042c8092798", + "sha256:25a1f88b471b3bc911d18b935ecb7115dff3a192b6fef46f0bfaf71ff4f12418", + "sha256:25c8d773a62ce0451b020c7b29a35cfbc05de8b291163a7a0f3b7904f27253e6", + "sha256:2a60ad3e2553a74168d275a0ef35e8c0a965448ffbc3b300ab3a5bb9956c2162", + "sha256:2a66df3d4992bc1d725b9aa803e8c5a66c010c65c741ad901e260ece77f58d2f", + "sha256:2ccc28197af5313706511fab3a8b66dcd6da067a1331372c82ea1cb74285e036", + "sha256:2e900bad2a8456d00a113cad8c13343f3b1f327534e3589acc2219729237a2e8", + "sha256:2ee7606193fb267be4b2e3b32714f2d58cad27217638db98a60f9efb5efeccc2", + "sha256:33ac8f098df0585c0b53009f039dfd913b38c1d2edafed0cedcc0c32a05aa110", + "sha256:3444cdba6628accf384e349014084b1cacd866fbb88433cd9d279d90a54e0b23", + "sha256:363ea8cd3c5cb6679f1c2f5f1f9669587361c062e4899fce56758efa928728f8", + "sha256:375a12d7556d462dc64d70475a9ee5982465fbb3d2b364f16b86ba9135793638", + "sha256:388f3217649d6d59292b722d940d4d2e1e6a7003259eb835724092a1cca0203a", + "sha256:3947483a381259c06921612550867b37d22e1df6d6d7e8361264b6d037595f44", + "sha256:39e104da444a34830751715f45ef9fc537475ba21b7f1f5b0f4d71a3b60d7fe2", + "sha256:3c997f8c44ec9b9b0bcbf2d422cc00a1d9b9c681f56efa6ca149a941e5560da2", + "sha256:3dfafb44f7bb35c0c06eda6b2ab4bfd58f02729e7c4045e179f9a861b07c9850", + "sha256:3ebbcf2a07621f29638799828b8d8668c421bfb94c6cb04269130d8de4fb7136", + "sha256:3f88a4095e913f98988f5b338c1d4d5d07dbb0b6bad19892fd447484e483ba6b", + "sha256:439e76255daa0f8151d3cb325f6dd4a3e93043e6403e6491813bcaaaa8733887", + "sha256:4569158070180c3855e9c0791c56be3ceeb192defa2cdf6a3f39e54319e56b89", + "sha256:466c219deee4536fbc83c08d09115249db301550625c7fef1c5563a584c9bc87", + "sha256:4a9d9b4d0a9b38d1c391bb4ad24aa65f306c6f01b512e10a8a34a2dc5675d348", + "sha256:4c7dde9e533c0a49d802b4f3f218fa9ad0a1ce21f2c2eb80d5216565202acab4", + "sha256:53d1bd3f979ed529f0805dd35ddaca330f80a9a6d90bc0121d2ff398f8ed8861", + "sha256:55346705687dbd7ef0d77883ab4f6fabc48232f587925bdaf95219bae072491e", + "sha256:56295eb1e5f3aecd516d91b00cfd8bf3a13991de5a479df9e27dd569ea23959c", + "sha256:56bb5c98f058a41bb58eead194b4db8c05b088c93d94d5161728515bd52b052b", + "sha256:5a5b3bb545ead161be780ee85a2b54fdf7092815995661947812dde94a40f6fb", + "sha256:5f2564ec89058ee7c7989a7b719115bdfe2a2fb8e7a4543b8d1c0cc4cf6478c1", + "sha256:608cce1da6f2672a56b24a015b42db4ac612ee709f3d29f27a00c943d9e851de", + "sha256:63f13bf09cc3336eb04a837490b8f332e0db41da66995c9fd1ba04552e516354", + "sha256:662dd62358bdeaca0aee5761de8727cfd6861432e3bb828dc2a693aa0471a563", + "sha256:676135dcf3262c9c5081cc8f19ad55c8a64e3f7282a21266d05544450bffc3a5", + "sha256:67aeb72e0f482709991aa91345a831d0b707d16b0257e8ef88a2ad246a7280bf", + "sha256:67b69535c870670c9f9b14a75d28baa32221d06f6b6fa6f77a0a13c5a7b0a5b9", + "sha256:682a7c79a2fbf40f5dbb1eb6bfe2cd865376deeac65acf9beb607505dced9e12", + "sha256:6994984550eaf25dd7fc7bd1b700ff45c894149341725bb4edc67f0ffa94efa4", + "sha256:69d3a98eebae99a420d4b28756c8ce6ea5a29291baf2dc9ff9414b42676f61d5", + "sha256:6e2e54267980349b723cff366d1e29b138b9a60fa376664a157a342689553f71", + "sha256:73e4b40ea0eda421b115248d7e79b59214411109a5bc47d0d48e4c73e3b8fcf9", + "sha256:74acd6e291f885678631b7ebc85d2d4aec458dd849b8c841b57ef04047833bed", + "sha256:7665f04d0c7f26ff8bb534e1c65068409bf4687aa2534faf7104d7182debb336", + "sha256:7735e82e3498c27bcb2d17cb65d62c14f1100b71723b68362872bca7d0913d90", + "sha256:77a86c261679ea5f3896ec060be9dc8e365788248cc1e049632a1be682442063", + "sha256:7cf18abf9764746b9c8704774d8b06714bcb0a63641518a3a89c7f85cc02c2ad", + "sha256:83928404adf8fb3d26793665633ea79b7361efa0287dfbd372a7e74311d51ee6", + "sha256:8e40876731f99b6f3c897b66b803c9e1c07a989b366c6b5b475fafd1f7ba3fb8", + "sha256:8f188cfcc64fb1266f4684206c9de0e80f54622c3f22a910cbd200478aeae61e", + "sha256:91997d9cb4a325b60d4e3f20967f8eb08dfcb32b22554d5ef78e6fd1dda743a2", + "sha256:91ee8fc02ca52e24bcb77b234f22afc03288e1dafbb1f88fe24db308910c4ac7", + "sha256:92fe151145a990c22cbccf9ae15cae8ae9eddabfc949a219c9f667877e40853d", + "sha256:945db8ee295d3af9dbdbb698cce9bbc5c59b5c3fe328bbc4387f59a8a35f998d", + "sha256:9517d5e9e0731957468c29dbfd0f976736a0e55afaea843726e887f36fe017df", + "sha256:952e0d9d07609d9c5be361f33b0d6d650cd2bae393aabb11d9b719364521984b", + "sha256:97a58a28bcf63284e8b4d7b460cbee1edaab24634e82059c7b8c09e65284f178", + "sha256:97e48e8875e6c13909c800fa344cd54cc4b2b0db1d5f911f840458a500fde2c2", + "sha256:9e0f07b42d2a50c7dd2d8675d50f7343d998c64008f1da5fef888396b7f84630", + "sha256:a3dc1a4b165283bd865e8f8cb5f0c64c05001e0718ed06250d8cac9bec115b48", + "sha256:a3ebe9a75be7ab0b7da2464a77bb27febcb4fab46a34f9288f39d74833db7f61", + "sha256:a64e32f8bd94c105cc27f42d3b658902b5bcc947ece3c8fe7bc1b05982f60e89", + "sha256:a6ed8db0a556343d566a5c124ee483ae113acc9a557a807d439bcecc44e7dfbb", + "sha256:ad9c9b99b05f163109466638bd30ada1722abb01bbb85c739c50b6dc11f92dc3", + "sha256:b33d7a286c0dc1a15f5fc864cc48ae92a846df287ceac2dd499926c3801054a6", + "sha256:bc092ba439d91df90aea38168e11f75c655880c12782facf5cf9c00f3d42b562", + "sha256:c436130cc779806bdf5d5fae0d848713105472b8566b75ff70048c47d3961c5b", + "sha256:c5869b8fd70b81835a6f187c5fdbe67917a04d7e52b6e7cc4e5fe39d55c39d58", + "sha256:c5ecca8f9bab618340c8e848d340baf68bcd8ad90a8ecd7a4524a81c1764b3db", + "sha256:cfac69017ef97db2438efb854edf24f5a29fd09a536ff3a992b75990720cdc99", + "sha256:d2f0d0f976985f85dfb5f3d685697ef769faa6b71993b46b295cdbbd6be8cc37", + "sha256:d5bed7f9805cc29c780f3aee05de3262ee7ce1f47083cfe9f77471e9d6777e83", + "sha256:d6a21ef516d36909931a2967621eecb256018aeb11fc48656e3257e73e2e247a", + "sha256:d9b6ddac6408194e934002a69bcaadbc88c10b5f38fb9307779d1c629181815d", + "sha256:db47514ffdbd91ccdc7e6f8407aac4ee94cc871b15b577c1c324236b013ddd04", + "sha256:df81779732feb9d01e5d513fad0122efb3d53bbc75f61b2a4f29a020bc985e70", + "sha256:e4a91d44379f45f5e540971d41e4626dacd7f01004826a18cb048e7da7e96544", + "sha256:e63e3e1e0271f374ed489ff5ee73d4b6e7c60710e1f76af5f0e1a6117cd26394", + "sha256:e70fac33e8b4ac63dfc4c956fd7d85a0b1139adcfc0d964ce288b7c527537fea", + "sha256:ecddc221a077a8132cf7c747d5352a15ed763b674c0448d811f408bf803d9ad7", + "sha256:f45eec587dafd4b2d41ac189c2156461ebd0c1082d2fe7013571598abb8505d1", + "sha256:f52a68c21363c45297aca15561812d542f8fc683c85201df0bebe209e349f793", + "sha256:f571aea50ba5623c308aa146eb650eebf7dbe0fd8c5d946e28343cb3b5aad577", + "sha256:f60f0ac7005b9f5a6091009b09a419ace1610e163fa5deaba5ce3484341840e7", + "sha256:f6475a1b2ecb310c98c28d271a30df74f9dd436ee46d09236a6b750a7599ce57", + "sha256:f6d5749fdd33d90e34c2efb174c7e236829147a2713334d708746e94c4bde40d", + "sha256:f902804113e032e2cdf8c71015651c97af6418363bea8d78dc0911d56c335032", + "sha256:fa1076244f54bb76e65e22cb6910365779d5c3d71d1f18b275f1dfc7b0d71b4d", + "sha256:fc2db02409338bf36590aa985a461b2c96fce91f8e7e0f14c50c5fcc4f229016", + "sha256:ffcad6c564fe6b9b8916c1aefbb37a362deebf9394bd2974e9d84232e3e08504" + ], + "markers": "python_version >= '3.8'", + "version": "==0.2.0" + }, "protobuf": { "hashes": [ "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7", @@ -1800,7 +1837,6 @@ "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.20.3" }, "psutil": { @@ -1824,7 +1860,6 @@ "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" ], "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" }, "psycopg2": { @@ -1976,7 +2011,6 @@ "sha256:f048cec7b26778210e28a0459867920654d48e5e62db0958433636cde4254f12" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.9.2" }, "pydantic-core": { @@ -2082,13 +2116,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": [ @@ -2121,24 +2155,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": { @@ -2147,9 +2171,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", @@ -2214,7 +2244,6 @@ "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.0.2" }, "redis": { @@ -2223,7 +2252,6 @@ "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==5.1.1" }, "referencing": { @@ -2340,7 +2368,6 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "requests-http-signature": { @@ -2351,13 +2378,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": { @@ -2482,7 +2516,6 @@ "sha256:6493705abb50374d6b7994f9616d27adbdd8a219c8635100bdc286382efd91f5" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2024.9.0" }, "sentry-sdk": { @@ -2491,16 +2524,15 @@ "sha256:90f733b32e15dfc1999e6b7aca67a38688a567329de4d6e184154a73f96c6892" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==2.16.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": [ @@ -2616,7 +2648,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": { @@ -2624,7 +2655,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": { @@ -2642,6 +2673,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", @@ -2659,11 +2706,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": [ @@ -2674,11 +2721,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": [ @@ -2784,7 +2831,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": { @@ -2793,7 +2839,6 @@ "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.5.1" }, "tabulate": { @@ -2810,24 +2855,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": { @@ -2835,7 +2870,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version < '3.11'", + "index": "pypi", "version": "==4.12.2" }, "tzdata": { @@ -2859,7 +2894,6 @@ "sha256:ea5d4fb8178c2ab469cf4fa46d0ceb16ccb378da46dbbc28a8b9c1eebdccc655" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.2.5" }, "uritemplate": { @@ -2887,11 +2921,11 @@ }, "versioneer": { "hashes": [ - "sha256:11ffc09427ac99db4ce61bdc85785dae819618d0de28153adfce3085956125a8", - "sha256:7175ca8e7bb4dd0e3c9779dd2745e5b4a6036304af3f5e50bd896f10196586d6" + "sha256:0f1a137bb5d6811e96a79bb0486798aeae9b9c6efc24b389659cebb0ee396cb9", + "sha256:5ab283b9857211d61b53318b7c792cf68e798e765ee17c27ade9f6c924235731" ], "markers": "python_version >= '3.7'", - "version": "==0.28" + "version": "==0.29" }, "vine": { "hashes": [ @@ -2910,11 +2944,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": [ @@ -2990,7 +3024,6 @@ "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.16.0" }, "xlsxwriter": { @@ -2999,17 +3032,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", @@ -3020,101 +3044,91 @@ }, "yarl": { "hashes": [ - "sha256:08d7148ff11cb8e886d86dadbfd2e466a76d5dd38c7ea8ebd9b0e07946e76e4b", - "sha256:098b870c18f1341786f290b4d699504e18f1cd050ed179af8123fd8232513424", - "sha256:11b3ca8b42a024513adce810385fcabdd682772411d95bbbda3b9ed1a4257644", - "sha256:1891d69a6ba16e89473909665cd355d783a8a31bc84720902c5911dbb6373465", - "sha256:1bbb418f46c7f7355084833051701b2301092e4611d9e392360c3ba2e3e69f88", - "sha256:1d0828e17fa701b557c6eaed5edbd9098eb62d8838344486248489ff233998b8", - "sha256:1d8e3ca29f643dd121f264a7c89f329f0fcb2e4461833f02de6e39fef80f89da", - "sha256:1fa56f34b2236f5192cb5fceba7bbb09620e5337e0b6dfe2ea0ddbd19dd5b154", - "sha256:216a6785f296169ed52cd7dcdc2612f82c20f8c9634bf7446327f50398732a51", - "sha256:22b739f99c7e4787922903f27a892744189482125cc7b95b747f04dd5c83aa9f", - "sha256:2430cf996113abe5aee387d39ee19529327205cda975d2b82c0e7e96e5fdabdc", - "sha256:269c201bbc01d2cbba5b86997a1e0f73ba5e2f471cfa6e226bcaa7fd664b598d", - "sha256:298c1eecfd3257aa16c0cb0bdffb54411e3e831351cd69e6b0739be16b1bdaa8", - "sha256:2a93a4557f7fc74a38ca5a404abb443a242217b91cd0c4840b1ebedaad8919d4", - "sha256:2b2442a415a5f4c55ced0fade7b72123210d579f7d950e0b5527fc598866e62c", - "sha256:2db874dd1d22d4c2c657807562411ffdfabec38ce4c5ce48b4c654be552759dc", - "sha256:309c104ecf67626c033845b860d31594a41343766a46fa58c3309c538a1e22b2", - "sha256:31497aefd68036d8e31bfbacef915826ca2e741dbb97a8d6c7eac66deda3b606", - "sha256:373f16f38721c680316a6a00ae21cc178e3a8ef43c0227f88356a24c5193abd6", - "sha256:396e59b8de7e4d59ff5507fb4322d2329865b909f29a7ed7ca37e63ade7f835c", - "sha256:3bb83a0f12701c0b91112a11148b5217617982e1e466069d0555be9b372f2734", - "sha256:3de86547c820e4f4da4606d1c8ab5765dd633189791f15247706a2eeabc783ae", - "sha256:3fdbf0418489525231723cdb6c79e7738b3cbacbaed2b750cb033e4ea208f220", - "sha256:40c6e73c03a6befb85b72da213638b8aaa80fe4136ec8691560cf98b11b8ae6e", - "sha256:44a4c40a6f84e4d5955b63462a0e2a988f8982fba245cf885ce3be7618f6aa7d", - "sha256:44b07e1690f010c3c01d353b5790ec73b2f59b4eae5b0000593199766b3f7a5c", - "sha256:45d23c4668d4925688e2ea251b53f36a498e9ea860913ce43b52d9605d3d8177", - "sha256:45f209fb4bbfe8630e3d2e2052535ca5b53d4ce2d2026bed4d0637b0416830da", - "sha256:4afdf84610ca44dcffe8b6c22c68f309aff96be55f5ea2fa31c0c225d6b83e23", - "sha256:4feaaa4742517eaceafcbe74595ed335a494c84634d33961214b278126ec1485", - "sha256:576365c9f7469e1f6124d67b001639b77113cfd05e85ce0310f5f318fd02fe85", - "sha256:5820bd4178e6a639b3ef1db8b18500a82ceab6d8b89309e121a6859f56585b05", - "sha256:5989a38ba1281e43e4663931a53fbf356f78a0325251fd6af09dd03b1d676a09", - "sha256:5a9bacedbb99685a75ad033fd4de37129449e69808e50e08034034c0bf063f99", - "sha256:5b66c87da3c6da8f8e8b648878903ca54589038a0b1e08dde2c86d9cd92d4ac9", - "sha256:5c5e32fef09ce101fe14acd0f498232b5710effe13abac14cd95de9c274e689e", - "sha256:658e8449b84b92a4373f99305de042b6bd0d19bf2080c093881e0516557474a5", - "sha256:6a2acde25be0cf9be23a8f6cbd31734536a264723fca860af3ae5e89d771cd71", - "sha256:6a5185ad722ab4dd52d5fb1f30dcc73282eb1ed494906a92d1a228d3f89607b0", - "sha256:6b7f6e699304717fdc265a7e1922561b02a93ceffdaefdc877acaf9b9f3080b8", - "sha256:703b0f584fcf157ef87816a3c0ff868e8c9f3c370009a8b23b56255885528f10", - "sha256:7055bbade838d68af73aea13f8c86588e4bcc00c2235b4b6d6edb0dbd174e246", - "sha256:78f271722423b2d4851cf1f4fa1a1c4833a128d020062721ba35e1a87154a049", - "sha256:7addd26594e588503bdef03908fc207206adac5bd90b6d4bc3e3cf33a829f57d", - "sha256:81bad32c8f8b5897c909bf3468bf601f1b855d12f53b6af0271963ee67fff0d2", - "sha256:82e692fb325013a18a5b73a4fed5a1edaa7c58144dc67ad9ef3d604eccd451ad", - "sha256:84bbcdcf393139f0abc9f642bf03f00cac31010f3034faa03224a9ef0bb74323", - "sha256:86c438ce920e089c8c2388c7dcc8ab30dfe13c09b8af3d306bcabb46a053d6f7", - "sha256:8be8cdfe20787e6a5fcbd010f8066227e2bb9058331a4eccddec6c0db2bb85b2", - "sha256:8c723c91c94a3bc8033dd2696a0f53e5d5f8496186013167bddc3fb5d9df46a3", - "sha256:8ca53632007c69ddcdefe1e8cbc3920dd88825e618153795b57e6ebcc92e752a", - "sha256:8f722f30366474a99745533cc4015b1781ee54b08de73260b2bbe13316079851", - "sha256:942c80a832a79c3707cca46bd12ab8aa58fddb34b1626d42b05aa8f0bcefc206", - "sha256:94a993f976cdcb2dc1b855d8b89b792893220db8862d1a619efa7451817c836b", - "sha256:95c6737f28069153c399d875317f226bbdea939fd48a6349a3b03da6829fb550", - "sha256:9915300fe5a0aa663c01363db37e4ae8e7c15996ebe2c6cce995e7033ff6457f", - "sha256:9a18595e6a2ee0826bf7dfdee823b6ab55c9b70e8f80f8b77c37e694288f5de1", - "sha256:9c8854b9f80693d20cec797d8e48a848c2fb273eb6f2587b57763ccba3f3bd4b", - "sha256:9cec42a20eae8bebf81e9ce23fb0d0c729fc54cf00643eb251ce7c0215ad49fe", - "sha256:9d2e1626be8712333a9f71270366f4a132f476ffbe83b689dd6dc0d114796c74", - "sha256:9d74f3c335cfe9c21ea78988e67f18eb9822f5d31f88b41aec3a1ec5ecd32da5", - "sha256:9fb4134cc6e005b99fa29dbc86f1ea0a298440ab6b07c6b3ee09232a3b48f495", - "sha256:a0ae6637b173d0c40b9c1462e12a7a2000a71a3258fa88756a34c7d38926911c", - "sha256:a31d21089894942f7d9a8df166b495101b7258ff11ae0abec58e32daf8088813", - "sha256:a3442c31c11088e462d44a644a454d48110f0588de830921fd201060ff19612a", - "sha256:ab9524e45ee809a083338a749af3b53cc7efec458c3ad084361c1dbf7aaf82a2", - "sha256:b1481c048fe787f65e34cb06f7d6824376d5d99f1231eae4778bbe5c3831076d", - "sha256:b8c837ab90c455f3ea8e68bee143472ee87828bff19ba19776e16ff961425b57", - "sha256:bbf2c3f04ff50f16404ce70f822cdc59760e5e2d7965905f0e700270feb2bbfc", - "sha256:bbf9c2a589be7414ac4a534d54e4517d03f1cbb142c0041191b729c2fa23f320", - "sha256:bcd5bf4132e6a8d3eb54b8d56885f3d3a38ecd7ecae8426ecf7d9673b270de43", - "sha256:c14c16831b565707149c742d87a6203eb5597f4329278446d5c0ae7a1a43928e", - "sha256:c49f3e379177f4477f929097f7ed4b0622a586b0aa40c07ac8c0f8e40659a1ac", - "sha256:c92b89bffc660f1274779cb6fbb290ec1f90d6dfe14492523a0667f10170de26", - "sha256:cd66152561632ed4b2a9192e7f8e5a1d41e28f58120b4761622e0355f0fe034c", - "sha256:cf1ad338620249f8dd6d4b6a91a69d1f265387df3697ad5dc996305cf6c26fb2", - "sha256:d07b52c8c450f9366c34aa205754355e933922c79135125541daae6cbf31c799", - "sha256:d0d12fe78dcf60efa205e9a63f395b5d343e801cf31e5e1dda0d2c1fb618073d", - "sha256:d4ee1d240b84e2f213565f0ec08caef27a0e657d4c42859809155cf3a29d1735", - "sha256:d959fe96e5c2712c1876d69af0507d98f0b0e8d81bee14cfb3f6737470205419", - "sha256:dcaef817e13eafa547cdfdc5284fe77970b891f731266545aae08d6cce52161e", - "sha256:df4e82e68f43a07735ae70a2d84c0353e58e20add20ec0af611f32cd5ba43fb4", - "sha256:ec8cfe2295f3e5e44c51f57272afbd69414ae629ec7c6b27f5a410efc78b70a0", - "sha256:ec9dd328016d8d25702a24ee274932aebf6be9787ed1c28d021945d264235b3c", - "sha256:ef9b85fa1bc91c4db24407e7c4da93a5822a73dd4513d67b454ca7064e8dc6a3", - "sha256:f3bf60444269345d712838bb11cc4eadaf51ff1a364ae39ce87a5ca8ad3bb2c8", - "sha256:f452cc1436151387d3d50533523291d5f77c6bc7913c116eb985304abdbd9ec9", - "sha256:f7917697bcaa3bc3e83db91aa3a0e448bf5cde43c84b7fc1ae2427d2417c0224", - "sha256:f90575e9fe3aae2c1e686393a9689c724cd00045275407f71771ae5d690ccf38", - "sha256:fb382fd7b4377363cc9f13ba7c819c3c78ed97c36a82f16f3f92f108c787cbbf", - "sha256:fb9f59f3848edf186a76446eb8bcf4c900fe147cb756fbbd730ef43b2e67c6a7", - "sha256:fc2931ac9ce9c61c9968989ec831d3a5e6fcaaff9474e7cfa8de80b7aff5a093" + "sha256:04f930fcc940f96b8b29110c56882bcff8703f87a7b9354d3acf60ffded5a23d", + "sha256:05183fd49244517cb11c208d0ae128f2e8a85ddb7caf22ad8b0ffcdf5481fcb6", + "sha256:0ace3927502a9f90a868d62c66623703cf5096dcb586187266e9b964d8dd6c81", + "sha256:12c80ec2af97ff3e433699bcabc787ef34e7c08ec038a6e6a25fb81d7bb83607", + "sha256:14d6f07b7b4b3b8fba521904db58442281730b44318d6abb9908de79e2a4e4f4", + "sha256:14effa29db6113be065a594e13a0f45afb9c1e374fd22b4bc3a4eff0725184b2", + "sha256:19077525cd36c797cae19262e15f2881da33c602fb35d075ff0e4263b51b8b88", + "sha256:1c3e9ae98719fe180751b093d02dbcc33b78a37e861d0f2c9571720bd31555db", + "sha256:1c49fe426c45520b4b8a48544d3a9a58194f39c1b57d92451883f847c299a137", + "sha256:20f8bdaf667386cea1a8f49cb69a85f90346656d750d3c1278be1dbc76601065", + "sha256:2128315cdc517a45ceb72ec17b256a7940eeb4843c66834c203e7d6580c83405", + "sha256:2207491555af5dbbee4c3179a76766f7bc1ecff858f420ea96f2e105ca42c4dd", + "sha256:24cad94cf2f46cc8e4b9cd44e4e8a84483536a6c54554960b02b10b5724ab122", + "sha256:270fef2b335e60c91ee835c524445e2248af841c8b72f48769ed6c02fbff5873", + "sha256:2a5cbbb06559757f091f9e71d3f76c27d4dfe0652cc3f17ccce398b8377bfda4", + "sha256:2e61b72cf15922a7a665299a6b6825bd9901d67ec3b9d3cf9b256dc1667c9bb1", + "sha256:32e8ebf0080ddd38ec05f8be940a3719e5fe1ab8bb6d2b3f6f8b89c9e34149aa", + "sha256:3487c57bc8f17f2586ae7fd0e77f65cd298d45b64d15f604bbb29f4cce0e7961", + "sha256:353306ba6f0218af1aefe4b9c8b3a0b81b209bc75d79357dac6aca70a7b09d6a", + "sha256:370f646d3654e196ddbf772a2d737fe4e1dd738267015b73ff6267ca592fd9d6", + "sha256:380f30073cbd9b740891bb56f44ee31f870e8721269b618ccc9913400936d9f6", + "sha256:39533b927c665bcff7da80bf299218e4af12f3e2be27e9c456e29547bcefd631", + "sha256:3cf2b50352df8775591869aaa22c52b64d60376ba99c0802b42778fedc90b775", + "sha256:45c05b87a8494d9820ea1ac82118fd2f1d795d868e94766fe8ff670377bf6280", + "sha256:46653b5fd29e63ffe63335da343829a2b00bb43b0bd9bb21240d3b42629629e2", + "sha256:493760c4ced954582db83c4760166992c016e1777ebc0f3ef1bb5eb60b2b5924", + "sha256:5685ebc333c95b75be3a0a83a81b82b6411beee9585eaeb9e2e588ae8df23848", + "sha256:59b77f0682e1917be197fc8229530f0c6fb3ef8e242d8256ba091a3a1c0ef7e6", + "sha256:59dce412b2515de05ab2eb6aef19ad7f70857ad436cd65fc4276df007106fb42", + "sha256:5a63ed17af784da3de39b82adfd4f8404ad5ee2ec8f616b063f37da3e64e0521", + "sha256:5c4cc1a438ac52562427330e33891f50a78ffd38d335abc64f93f201c83bdc82", + "sha256:63ba82841ce315e4b5dc8b9345062638c74b1864d38172d0a0403e5a083b0950", + "sha256:66ddcd7ee3264bc937860f4780290d60f6472ca0484c214fe805116a831121e8", + "sha256:68b27a7d9fb0f145de608da2e45e37fd2397b00266f10487e557f769afa2842d", + "sha256:690d8f702945506b58c9c5834d586e8fd819b845fe6239ab16ebc64a92a6fd3d", + "sha256:69c2d111e67a818e702ba957da8c8e62de916f5c1b3da043f744084c63f12d46", + "sha256:6d1aba1f644d6e5e16edada31938c11b6c9c97e3bf065742a2c7740d38af0c19", + "sha256:6da6f6c6ee5595658f21bb9d1ecd702f7a7f22f224ac063dfb595624aec4a2e0", + "sha256:6f2911cae6dd012adaaf51494dad4cafb4284ad1f3b588df6ea3e3017e053750", + "sha256:7794aade99be0d48b69bd5942acddfeff0de3d09c724d9abe4f19736708ef18f", + "sha256:7ccb4667e0c0a25815efbfe251d24b56624449a319d4bb497074dd49444fb306", + "sha256:8df77742b403e71c5d62d22d150e6e35efd6096a15f2c7419815911c62225100", + "sha256:8f0b33fd088e93ba5f7f6dd55226630e7b78212752479c8fcc6abbd143b9c1ce", + "sha256:90257bc627897a2c1d562efcd6a6b18887e9dacae795cad2367e8e16df47d966", + "sha256:925e72fc7a4222a5bf6d288876d5afacc8f833b49c4cca85f65089131ba25afa", + "sha256:92f9a45230d3aa8568c1d692ab27bf505a32dfe3b404721458fc374f411e8bd2", + "sha256:956975a3a1ce1f4537be22278d6a283b8bc74d77671f7f6469ab1e800f4e9b02", + "sha256:a1d49ed6f4b812dde88e937d4c2bd3f13d72c23ef7de1e17a63b7cacef4b5691", + "sha256:a3a98d70c667c957c7cd0b153d4cb5e45d43f5e2e23de73be6f7b5c883c01f72", + "sha256:ac26e43b56dbafb30256906bc763cc1f22e05825ae1ced4c6afbd0e6584f18de", + "sha256:acdfe626607a245aedca35b211f9305a9e7a33349da525bf4ef3caaec8ef51cd", + "sha256:adeac55335669a189189373c93d131ebfc2de3ec04f0d3aa7dff6661f83b89b6", + "sha256:b55cc82ba92c07af6ba619dcf70cc89f7b9626adefb87d251f80f2e77419f1da", + "sha256:b5ab6c64921802176f56c36aa67c5e6a8baf9557ec1662cb41ecdb5580b67eb9", + "sha256:b6316af233610b9868eda92cf68c016750cbf50085ac6c51faa17905ddd25605", + "sha256:b765f19e23c29b68e4f8bbadd36f1da2333ba983d8da2d6518e5f0a7eb2579c2", + "sha256:bde319602111e9acca3c4f87f4205b38ba6166004bf108de47553633f9a580fc", + "sha256:c24debeec87908a864a2b4cb700f863db9441cabacdb22dc448c5d38b55c6f62", + "sha256:cb474a06023d01ead9c072b2580c22b2691aa1cabdcc19c3171ab1fa6d8496e3", + "sha256:cc4b999718287073dccd3acb0ef1593961bd7923af08991cb3c94080db503935", + "sha256:ce65ed7ad7b6cbca06b0c011b170bd2b0bc56b0a740540e2713e5ac12d7b9b2e", + "sha256:d0328f798052a33803a77d0868c7f802e952127092c1738fc9e7bfcaac7207c5", + "sha256:d2a70e8bec768be7423d8d465858a3646b34257a20cc02fd92612f1b14931f50", + "sha256:d798de0b50efb66583fc096bcdaa852ed6ea3485a4eb610d6a634f8010d932f4", + "sha256:d80c019083506886df098b7bb0d844e19db7e226736829ef49f892ed0a070fa5", + "sha256:d9cd73f7bff5079d87c2622aa418a75d5d3cdc944d3edb905c5dfc3235466eb0", + "sha256:db32a5c2912db45e73f80107d178e30f5c48cf596762b3c60ddfebdd655385f0", + "sha256:dbd4808a209b175b5ebbac24c4798dd7511c5ee522a16f2f0eac78c717dfcdfc", + "sha256:decf9d76191bfe34835f1abd3fa8ebe8a9cd7e16300a5c7e82b18c0812bb22a2", + "sha256:df494e5a79f2ef8f81f966f787e515760e639c6319a321c16198b379c256a157", + "sha256:df7784a29b9689341c17d06d826e3b52ee59d6b6916177e4db0477be7aad5f72", + "sha256:e337737b8c9d837e5b4d9e906cc57ed7a639e16e515c8094509b17f556fdb642", + "sha256:e924040582499f7514ec64691031504e6224b5ae7224216208fc2c94f8b13c89", + "sha256:eacd9de9b5b8262818a2e1f88efbd8d523abc8453de238c5d2f6a91fa85032dd", + "sha256:ef67989d480358482830dc3bc232709804f46a61e7e9841d3f0b1c13a4735b3b", + "sha256:efe758958a7bffce68d91ade238df72667e1f18966ed7b1d3d390eead51a8903", + "sha256:f5f0a0691e39c2e7b5c0f23e6765fa6cb162dce99d9ab1897fdd0f7a4a38b6fb", + "sha256:f785d83ece0998e4ce4fadda22fa6c1ecc40e10f41617013a8726d2e9af0d98f", + "sha256:f94d8adfdec402ff97cecc243b310c01d571362ca87bcf8def8e15cb3aaac3ee", + "sha256:f9b251d3f90e125ff0d1f76257329a9190fa1bfd2157344c875580bff6dedc62", + "sha256:fbcff47f8ba82467f203037f7a30decf5c724211b224682f7236edb0dcbb5b95", + "sha256:fe03cea925d884b8f1157a7037df2f5b6a6478a64b78ee600832d8a9f044c83e" ], - "markers": "python_version >= '3.8'", - "version": "==1.13.1" + "markers": "python_version >= '3.9'", + "version": "==1.15.3" } }, "develop": { @@ -3131,37 +3145,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": [ @@ -3173,99 +3185,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": [ @@ -3280,81 +3307,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:04f2189716e85ec9192df307f7c255f90e78b6e9863a03223c3b998d24a3c6c6", + "sha256:0c6c0f4d53ef603397fc894a895b960ecd7d44c727df42a8d500031716d4e8d2", + "sha256:0ca37993206402c6c35dc717f90d4c8f53568a8b80f0bf1a1b2b334f4d488fba", + "sha256:12f9515d875859faedb4144fd38694a761cd2a61ef9603bf887b13956d0bbfbb", + "sha256:1990b1f4e2c402beb317840030bb9f1b6a363f86e14e21b4212e618acdfce7f6", + "sha256:2341a78ae3a5ed454d524206a3fcb3cec408c2a0c7c2752cd78b606a2ff15af4", + "sha256:23bb63ae3f4c645d2d82fa22697364b0046fbafb6261b258a58587441c5f7bd0", + "sha256:27bd5f18d8f2879e45724b0ce74f61811639a846ff0e5c0395b7818fae87aec6", + "sha256:2dc7d6b380ca76f5e817ac9eef0c3686e7834c8346bef30b041a4ad286449990", + "sha256:331b200ad03dbaa44151d74daeb7da2cf382db424ab923574f6ecca7d3b30de3", + "sha256:365defc257c687ce3e7d275f39738dcd230777424117a6c76043459db131dd43", + "sha256:37be7b5ea3ff5b7c4a9db16074dc94523b5f10dd1f3b362a827af66a55198175", + "sha256:3c2e6fa98032fec8282f6b27e3f3986c6e05702828380618776ad794e938f53a", + "sha256:40e8b1983080439d4802d80b951f4a93d991ef3261f69e81095a66f86cf3c3c6", + "sha256:43517e1f6b19f610a93d8227e47790722c8bf7422e46b365e0469fc3d3563d97", + "sha256:43b32a06c47539fe275106b376658638b418c7cfdfff0e0259fbf877e845f14b", + "sha256:43d6a66e33b1455b98fc7312b124296dad97a2e191c80320587234a77b1b736e", + "sha256:4c59d6a4a4633fad297f943c03d0d2569867bd5372eb5684befdff8df8522e39", + "sha256:52ac29cc72ee7e25ace7807249638f94c9b6a862c56b1df015d2b2e388e51dbd", + "sha256:54356a76b67cf8a3085818026bb556545ebb8353951923b88292556dfa9f812d", + "sha256:583049c63106c0555e3ae3931edab5669668bbef84c15861421b94e121878d3f", + "sha256:6d99198203f0b9cb0b5d1c0393859555bc26b548223a769baf7e321a627ed4fc", + "sha256:6da42bbcec130b188169107ecb6ee7bd7b4c849d24c9370a0c884cf728d8e976", + "sha256:6e484e479860e00da1f005cd19d1c5d4a813324e5951319ac3f3eefb497cc549", + "sha256:70a6756ce66cd6fe8486c775b30889f0dc4cb20c157aa8c35b45fd7868255c5c", + "sha256:70d24936ca6c15a3bbc91ee9c7fc661132c6f4c9d42a23b31b6686c05073bde5", + "sha256:71967c35828c9ff94e8c7d405469a1fb68257f686bca7c1ed85ed34e7c2529c4", + "sha256:79644f68a6ff23b251cae1c82b01a0b51bc40c8468ca9585c6c4b1aeee570e0b", + "sha256:87cd2e29067ea397a47e352efb13f976eb1b03e18c999270bb50589323294c6e", + "sha256:8d4c6ea0f498c7c79111033a290d060c517853a7bcb2f46516f591dab628ddd3", + "sha256:9134032f5aa445ae591c2ba6991d10136a1f533b1d2fa8f8c21126468c5025c6", + "sha256:921fbe13492caf6a69528f09d5d7c7d518c8d0e7b9f6701b7719715f29a71e6e", + "sha256:99670790f21a96665a35849990b1df447993880bb6463a0a1d757897f30da929", + "sha256:9975442f2e7a5cfcf87299c26b5a45266ab0696348420049b9b94b2ad3d40234", + "sha256:99ded130555c021d99729fabd4ddb91a6f4cc0707df4b1daf912c7850c373b13", + "sha256:a3328c3e64ea4ab12b85999eb0779e6139295bbf5485f69d42cf794309e3d007", + "sha256:a4fb91d5f72b7e06a14ff4ae5be625a81cd7e5f869d7a54578fc271d08d58ae3", + "sha256:aa23ce39661a3e90eea5f99ec59b763b7d655c2cada10729ed920a38bfc2b167", + "sha256:aac7501ae73d4a02f4b7ac8fcb9dc55342ca98ffb9ed9f2dfb8a25d53eda0e4d", + "sha256:ab84a8b698ad5a6c365b08061920138e7a7dd9a04b6feb09ba1bfae68346ce6d", + "sha256:b4adeb878a374126f1e5cf03b87f66279f479e01af0e9a654cf6d1509af46c40", + "sha256:b9853509b4bf57ba7b1f99b9d866c422c9c5248799ab20e652bbb8a184a38181", + "sha256:bb7d5fe92bd0dc235f63ebe9f8c6e0884f7360f88f3411bfed1350c872ef2054", + "sha256:bca4c8abc50d38f9773c1ec80d43f3768df2e8576807d1656016b9d3eeaa96fd", + "sha256:c222958f59b0ae091f4535851cbb24eb57fc0baea07ba675af718fb5302dddb2", + "sha256:c30e42ea11badb147f0d2e387115b15e2bd8205a5ad70d6ad79cf37f6ac08c91", + "sha256:c3a79f56dee9136084cf84a6c7c4341427ef36e05ae6415bf7d787c96ff5eaa3", + "sha256:c51ef82302386d686feea1c44dbeef744585da16fcf97deea2a8d6c1556f519b", + "sha256:c77326300b839c44c3e5a8fe26c15b7e87b2f32dfd2fc9fee1d13604347c9b38", + "sha256:d33a785ea8354c480515e781554d3be582a86297e41ccbea627a5c632647f2cd", + "sha256:d546cfa78844b8b9c1c0533de1851569a13f87449897bbc95d698d1d3cb2a30f", + "sha256:da29ceabe3025a1e5a5aeeb331c5b1af686daab4ff0fb4f83df18b1180ea83e2", + "sha256:df8c05a0f574d480947cba11b947dc41b1265d721c3777881da2fb8d3a1ddfba", + "sha256:e266af4da2c1a4cbc6135a570c64577fd3e6eb204607eaff99d8e9b710003c6f", + "sha256:e279f3db904e3b55f520f11f983cc8dc8a4ce9b65f11692d4718ed021ec58b83", + "sha256:ea52bd218d4ba260399a8ae4bb6b577d82adfc4518b93566ce1fddd4a49d1dce", + "sha256:ebec65f5068e7df2d49466aab9128510c4867e532e07cb6960075b27658dca38", + "sha256:ec1e3b40b82236d100d259854840555469fad4db64f669ab817279eb95cd535c", + "sha256:ee77c7bef0724165e795b6b7bf9c4c22a9b8468a6bdb9c6b4281293c6b22a90f", + "sha256:f263b18692f8ed52c8de7f40a0751e79015983dbd77b16906e5b310a39d3ca21", + "sha256:f7b26757b22faf88fcf232f5f0e62f6e0fd9e22a8a5d0d5016888cdfe1f6c1c4", + "sha256:f7ddb920106bbbbcaf2a274d56f46956bf56ecbde210d88061824a95bdd94e92" ], - "markers": "python_version >= '3.8'", - "version": "==7.6.1" + "markers": "python_version >= '3.9'", + "version": "==7.6.3" }, "coveralls": { "hashes": [ @@ -3362,7 +3379,6 @@ "sha256:7b2a0a2bcef94f295e3cf28dcc55ca40b71c77d1c2446b538e85f0f7bc21aa69" ], "index": "pypi", - "markers": "python_version < '3.13' and python_version >= '3.8'", "version": "==4.0.1" }, "decorator": { @@ -3387,7 +3403,6 @@ "sha256:96e4e16fabd3e0339a4b46e02a0a88c92c19800de38d00446571ea036614d332" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.2.4" }, "django-types": { @@ -3396,7 +3411,6 @@ "sha256:b3f529de17f6374d41ca67232aa01330c531bbbaa3ac4097896f31ac33c96c30" ], "index": "pypi", - "markers": "python_version >= '3.7' and python_version < '4.0'", "version": "==0.19.1" }, "docopt": { @@ -3435,17 +3449,15 @@ "sha256:8317aa5289cdfc45f9cae570feb07a6177316c82e34d14df3c2e1f22f26abef0" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.3.1" }, "faker": { "hashes": [ - "sha256:dbf81295c948270a9e96cd48a9a3ebec73acac9a153d0c854fbbd0294557609f", - "sha256:e0593931bd7be9a9ea984b5d8c302ef1cec19392585d1e90d444199271d0a94d" + "sha256:6fd328db7195e70cdee479ee687fef6623c9b57b8023c582adbe88a01dc54297", + "sha256:b6c2d61861dcf1084b8e10959418fe3380a1a3dcd2796a73d43f738a42aabb4c" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==30.1.0" + "version": "==30.4.0" }, "fastdiff": { "hashes": [ @@ -3460,7 +3472,6 @@ "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==7.1.1" }, "flake8-import-order": { @@ -3476,7 +3487,6 @@ "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.2.3" }, "freezegun": { @@ -3485,7 +3495,6 @@ "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.5.1" }, "future": { @@ -3518,7 +3527,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": { @@ -3535,7 +3543,6 @@ "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==5.13.2" }, "jedi": { @@ -3544,7 +3551,6 @@ "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==0.19.1" }, "jsonmatch": { @@ -3556,69 +3562,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:0778de17cff1acaeccc3ff30cd99a3fd5c50fc58ad3d6c0e0c4c58092b859396", + "sha256:0f84af7e813784feb4d5e4ff7db633aba6c8ca64a833f61d8e4eade234ef0c38", + "sha256:17b2aea42a7280db02ac644db1d634ad47dcc96faf38ab304fe26ba2680d359a", + "sha256:242d6860f1fd9191aef5fae22b51c5c19767f93fb9ead4d21924e0bcb17619d8", + "sha256:244dbe463d5fb6d7ce161301a03a6fe744dac9072328ba9fc82289238582697b", + "sha256:26627785a54a947f6d7336ce5963569b5d75614619e75193bdb4e06e21d447ad", + "sha256:2a4b34a8d14649315c4bc26bbfa352663eb51d146e35eef231dd739d54a5430a", + "sha256:2ae99f31f47d849758a687102afdd05bd3d3ff7dbab0a8f1587981b58a76152a", + "sha256:312387403cd40699ab91d50735ea7a507b788091c416dd007eac54434aee51da", + "sha256:3341c043c37d78cc5ae6e3e305e988532b072329639007fd408a476642a89fd6", + "sha256:33d1c36b90e570ba7785dacd1faaf091203d9942bc036118fab8110a401eb1a8", + "sha256:3e683ee4f5d0fa2dde4db77ed8dd8a876686e3fc417655c2ece9a90576905344", + "sha256:3ffb4a8e7d46ed96ae48805746755fadd0909fea2306f93d5d8233ba23dda12a", + "sha256:40621d60d0e58aa573b68ac5e2d6b20d44392878e0bfc159012a5787c4e35bc8", + "sha256:40f1e10d51c92859765522cbd79c5c8989f40f0419614bcdc5015e7b6bf97fc5", + "sha256:45d42d132cff577c92bfba536aefcfea7e26efb975bd455db4e6602f5c9f45e7", + "sha256:48488d999ed50ba8d38c581d67e496f955821dc183883550a6fbc7f1aefdc170", + "sha256:4935dd7883f1d50e2ffecca0aa33dc1946a94c8f3fdafb8df5c330e48f71b132", + "sha256:4c2d64fdba74ad16138300815cfdc6ab2f4647e23ced81f59e940d7d4a1469d9", + "sha256:4c8817557d0de9349109acb38b9dd570b03cc5014e8aabf1cbddc6e81005becd", + "sha256:4ffaaac913c3f7345579db4f33b0020db693f302ca5137f106060316761beea9", + "sha256:5a4cb365cb49b750bdb60b846b0c0bc49ed62e59a76635095a179d440540c346", + "sha256:62fada2c942702ef8952754abfc1a9f7658a4d5460fabe95ac7ec2cbe0d02abc", + "sha256:67c519635a4f64e495c50e3107d9b4075aec33634272b5db1cde839e07367589", + "sha256:6a54c43d3ec4cf2a39f4387ad044221c66a376e58c0d0e971d47c475ba79c6b5", + "sha256:7044312a928a66a4c2a22644147bc61a199c1709712069a344a3fb5cfcf16915", + "sha256:730d86af59e0e43ce277bb83970530dd223bf7f2a838e086b50affa6ec5f9295", + "sha256:800100d45176652ded796134277ecb13640c1a537cad3b8b53da45aa96330453", + "sha256:80fcbf3add8790caddfab6764bde258b5d09aefbe9169c183f88a7410f0f6dea", + "sha256:82b5dba6eb1bcc29cc305a18a3c5365d2af06ee71b123216416f7e20d2a84e5b", + "sha256:852dc840f6d7c985603e60b5deaae1d89c56cb038b577f6b5b8c808c97580f1d", + "sha256:8ad4ad1429cd4f315f32ef263c1342166695fad76c100c5d979c45d5570ed58b", + "sha256:8ae369e84466aa70f3154ee23c1451fda10a8ee1b63923ce76667e3077f2b0c4", + "sha256:93e8248d650e7e9d49e8251f883eed60ecbc0e8ffd6349e18550925e31bd029b", + "sha256:973a371a55ce9ed333a3a0f8e0bcfae9e0d637711534bcb11e130af2ab9334e7", + "sha256:9ba25a71ebf05b9bb0e2ae99f8bc08a07ee8e98c612175087112656ca0f5c8bf", + "sha256:a10860e00ded1dd0a65b83e717af28845bb7bd16d8ace40fe5531491de76b79f", + "sha256:a4792d3b3a6dfafefdf8e937f14906a51bd27025a36f4b188728a73382231d91", + "sha256:a7420ceda262dbb4b8d839a4ec63d61c261e4e77677ed7c66c99f4e7cb5030dd", + "sha256:ad91738f14eb8da0ff82f2acd0098b6257621410dcbd4df20aaa5b4233d75a50", + "sha256:b6a387d61fe41cdf7ea95b38e9af11cfb1a63499af2759444b99185c4ab33f5b", + "sha256:b954093679d5750495725ea6f88409946d69cfb25ea7b4c846eef5044194f583", + "sha256:bbde71a705f8e9e4c3e9e33db69341d040c827c7afa6789b14c6e16776074f5a", + "sha256:beeebf760a9c1f4c07ef6a53465e8cfa776ea6a2021eda0d0417ec41043fe984", + "sha256:c91b394f7601438ff79a4b93d16be92f216adb57d813a78be4446fe0f6bc2d8c", + "sha256:c97ff7fedf56d86bae92fa0a646ce1a0ec7509a7578e1ed238731ba13aabcd1c", + "sha256:cb53e2a99df28eee3b5f4fea166020d3ef9116fdc5764bc5117486e6d1211b25", + "sha256:cbf445eb5628981a80f54087f9acdbf84f9b7d862756110d172993b9a5ae81aa", + "sha256:d06b24c686a34c86c8c1fba923181eae6b10565e4d80bdd7bc1c8e2f11247aa4", + "sha256:d98e66a24497637dd31ccab090b34392dddb1f2f811c4b4cd80c230205c074a3", + "sha256:db15ce28e1e127a0013dfb8ac243a8e392db8c61eae113337536edb28bdc1f97", + "sha256:db842712984e91707437461930e6011e60b39136c7331e971952bb30465bc1a1", + "sha256:e24bfe89c6ac4c31792793ad9f861b8f6dc4546ac6dc8f1c9083c7c4f2b335cd", + "sha256:e81c52638315ff4ac1b533d427f50bc0afc746deb949210bc85f05d4f15fd772", + "sha256:e9393357f19954248b00bed7c56f29a25c930593a77630c719653d51e7669c2a", + "sha256:ee3941769bd2522fe39222206f6dd97ae83c442a94c90f2b7a25d847d40f4729", + "sha256:f31ae06f1328595d762c9a2bf29dafd8621c7d3adc130cbb46278079758779ca", + "sha256:f94190df587738280d544971500b9cafc9b950d32efcb1fba9ac10d84e6aa4e6", + "sha256:fa7d686ed9883f3d664d39d5a8e74d3c5f63e603c2e3ff0abcba23eac6542635", + "sha256:fb532dd9900381d2e8f48172ddc5a59db4c445a11b9fab40b3b786da40d3b56b", + "sha256:fe32482b37b4b00c7a52a07211b479653b7fe4f22b2e481b9a9b099d8a430f2f" ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" + "markers": "python_version >= '3.9'", + "version": "==3.0.1" }, "matplotlib-inline": { "hashes": [ @@ -3650,7 +3657,6 @@ "sha256:24f3b0aecb06656e983f58e07c732a90577b9d7af3e1066fc2b663bbf0370248" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.3.0" }, "openpyxl": { @@ -3659,7 +3665,6 @@ "sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.1.5" }, "outcome": { @@ -3684,7 +3689,6 @@ "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.9.0" }, "parso": { @@ -3753,7 +3757,6 @@ "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.20.3" }, "protolint-bin": { @@ -3821,7 +3824,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": { @@ -3830,7 +3832,6 @@ "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.32.3" }, "requests-mock": { @@ -3839,7 +3840,6 @@ "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==1.12.1" }, "selenium": { @@ -3848,16 +3848,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": [ @@ -3903,7 +3902,6 @@ "sha256:93622790a0a29e04f0346458face1e144dc4d32f493714c6c3dff82a4adb77e6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.0.0" }, "termcolor": { @@ -3952,7 +3950,6 @@ "sha256:d181af8a256e5a91ce8d5adb53496e880efd9144c7d54483e3653332b60296f0" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==5.28.0.20240924" }, "types-psycopg2": { @@ -3968,7 +3965,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version >= '3.8'", + "index": "pypi", "version": "==4.12.2" }, "uritemplate": { @@ -4059,7 +4056,6 @@ "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==5.0.3" }, "wcwidth": { @@ -4083,7 +4079,6 @@ "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.0.4" }, "wsproto": { @@ -4094,412 +4089,5 @@ "markers": "python_full_version >= '3.7.0'", "version": "==1.2.0" } - }, - "ldap-packages": { - "asgiref": { - "hashes": [ - "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", - "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590" - ], - "markers": "python_version >= '3.8'", - "version": "==3.8.1" - }, - "django": { - "hashes": [ - "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", - "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.25" - }, - "django-auth-ldap": { - "hashes": [ - "sha256:4b4b944f3c28bce362f33fb6e8db68429ed8fd8f12f0c0c4b1a4344a7ef225ce", - "sha256:604250938ddc9fda619f247c7a59b0b2f06e53a7d3f46a156f28aa30dd71a738" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.8.0" - }, - "pyasn1": { - "hashes": [ - "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", - "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034" - ], - "markers": "python_version >= '3.8'", - "version": "==0.6.1" - }, - "pyasn1-modules": { - "hashes": [ - "sha256:49bfa96b45a292b711e986f222502c1c9a5e1f4e568fc30e2574a6c7d07838fd", - "sha256:c28e2dbf9c06ad61c71a075c7e0f9fd0f1b0bb2d2ad4377f240d33ac2ab60a7c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.4.1" - }, - "python-ldap": { - "hashes": [ - "sha256:7edb0accec4e037797705f3a05cbf36a9fde50d08c8f67f2aef99a2628fab828" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.4.4" - }, - "sqlparse": { - "hashes": [ - "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", - "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.5.1" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - } - }, - "prod-packages": { - "asgiref": { - "hashes": [ - "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", - "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590" - ], - "markers": "python_version >= '3.8'", - "version": "==3.8.1" - }, - "async-timeout": { - "hashes": [ - "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", - "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" - ], - "markers": "python_full_version < '3.11.3'", - "version": "==4.0.3" - }, - "boto3": { - "hashes": [ - "sha256:291e7b97a34967ed93297e6171f1bebb8529e64633dd48426760e3fdef1cdea8", - "sha256:57e6ee8504e7929bc094bb2afc879943906064179a1e88c23b4812e2c6f61532" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.35.34" - }, - "botocore": { - "hashes": [ - "sha256:25b17a9ccba6ad32bb5bf7ba4f52656aa03c1cb29f6b4e438050ee4ad1967a3b", - "sha256:cab9ec4e0367b9f33f0bc02c5a29f587b0119ecffd6d125bacee085dcbc8817d" - ], - "markers": "python_version >= '3.8'", - "version": "==1.35.23" - }, - "django": { - "hashes": [ - "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", - "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.25" - }, - "django-redis": { - "hashes": [ - "sha256:6a02abaa34b0fea8bf9b707d2c363ab6adc7409950b2db93602e6cb292818c42", - "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b" - ], - "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==5.4.0" - }, - "django-storages": { - "hashes": [ - "sha256:69aca94d26e6714d14ad63f33d13619e697508ee33ede184e462ed766dc2a73f", - "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" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.2.1" - }, - "greenlet": { - "hashes": [ - "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", - "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", - "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", - "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", - "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", - "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", - "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", - "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", - "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", - "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", - "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", - "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", - "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", - "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", - "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", - "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", - "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", - "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", - "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", - "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", - "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", - "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", - "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", - "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", - "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", - "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", - "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", - "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", - "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", - "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", - "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", - "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", - "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", - "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", - "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", - "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", - "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", - "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", - "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", - "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", - "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", - "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", - "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", - "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", - "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", - "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", - "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", - "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", - "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", - "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", - "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", - "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", - "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", - "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", - "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", - "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", - "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", - "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", - "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", - "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", - "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", - "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", - "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", - "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", - "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", - "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", - "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", - "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", - "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", - "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", - "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", - "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", - "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" - ], - "markers": "python_version >= '3' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))", - "version": "==3.1.1" - }, - "gunicorn": { - "hashes": [ - "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", - "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==23.0.0" - }, - "jmespath": { - "hashes": [ - "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980", - "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe" - ], - "markers": "python_version >= '3.7'", - "version": "==1.0.1" - }, - "packaging": { - "hashes": [ - "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5", - "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2" - }, - "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'", - "version": "==2.9.0.post0" - }, - "redis": { - "hashes": [ - "sha256:f6c997521fedbae53387307c5d0bf784d9acc28d9f1d058abeac566ec4dbed72", - "sha256:f8ea06b7482a668c6475ae202ed8d9bcaa409f6e87fb77ed1043d912afd62e24" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==5.1.1" - }, - "s3transfer": { - "hashes": [ - "sha256:0711534e9356d3cc692fdde846b4a1e4b0cb6519971860796e6bc4c7aea00ef6", - "sha256:eca1c20de70a39daee580aef4986996620f365c4e0fda6a86100231d62f1bf69" - ], - "markers": "python_version >= '3.8'", - "version": "==0.10.2" - }, - "setuptools": { - "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" - ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "sqlparse": { - "hashes": [ - "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", - "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.5.1" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "urllib3": { - "hashes": [ - "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", - "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.3" - }, - "whitenoise": { - "hashes": [ - "sha256:58c7a6cd811e275a6c91af22e96e87da0b1109e9a53bb7464116ef4c963bf636", - "sha256:a1ae85e01fdc9815d12fa33f17765bc132ed2c54fa76daf9e39e879dd93566f6" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==6.7.0" - }, - "zope.event": { - "hashes": [ - "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", - "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd" - ], - "markers": "python_version >= '3.7'", - "version": "==5.0" - }, - "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" - ], - "markers": "python_version >= '3.8'", - "version": "==7.0.3" - } } } 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..6a632fbe0 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 # ------------------------------------------------------------------------------ @@ -861,85 +861,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/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..845f16ee5 --- /dev/null +++ b/backend/variants/migrations/0110_drop_variant_summary.py @@ -0,0 +1,103 @@ +# Generated by Django 4.2.16 on 2024-10-09 13:00 + +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) +""" + + +class Migration(migrations.Migration): + + dependencies = [ + ("variants", "0109_alter_clearexpiredexportedfilesbgjob_bg_job_and_more"), + ] + + run_before = run_before + + operations = [ + migrations.RunSQL( + """ + DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + """, + SQL_OUTER % SQL_INNER, + ) + ] 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..76294c0ac --- /dev/null +++ b/backend/variants/migrations/0111_create_variant_summary.py @@ -0,0 +1,80 @@ +# Generated by Django 4.2.16 on 2024-10-09 13:00 + +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) +""" + + +class Migration(migrations.Migration): + + dependencies = [ + ("variants", "0110_drop_variant_summary"), + ("projectroles", "0032_alter_appsetting_value"), + ] + + operations = [ + migrations.RunSQL( + SQL_OUTER % SQL_INNER, + """ + DROP MATERIALIZED VIEW IF EXISTS variants_smallvariantsummary; + """, + ) + ] 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..dba76f253 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": "the-name"}, + ), + 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": "the-name"}, + ), + 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": "the-name"}, + ), + 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": "the-name"}, + ), + 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": "the-name"}, + ), + 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" />