From c9eeaa2dddc3266ce11b7ba629037eb00928d1f9 Mon Sep 17 00:00:00 2001 From: Oliver Stolpe Date: Wed, 3 Apr 2024 16:38:08 +0200 Subject: [PATCH] fix: xlsx file export issues (#1504) --- Pipfile | 1 + Pipfile.lock | 619 ++++++++++----------- utils/kickoff_orphaned_annotation_query.py | 2 +- utils/projectwide_query.py | 294 ++++++++++ variants/file_export.py | 4 +- variants/serializers/__init__.py | 2 +- variants/utils.py | 20 +- variants/views/api/__init__.py | 6 + 8 files changed, 610 insertions(+), 338 deletions(-) create mode 100644 utils/projectwide_query.py diff --git a/Pipfile b/Pipfile index 5b8e4a4c0..477d5e210 100644 --- a/Pipfile +++ b/Pipfile @@ -56,6 +56,7 @@ s3fs = "*" toml = "*" black = "*" drf-spectacular = {extras = ["sidecar"], version = "*"} +rich = "*" [dev-packages] # packages for testing diff --git a/Pipfile.lock b/Pipfile.lock index 2683ad9df..a051eb961 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0f57262f5d5253a53bfaae7e41e2be99552b0f9fb7c1deff7b0042dfb517d339" + "sha256": "0ba2c1456b9116c276a3fd7d6b349d7879c3020feba7eb241aeb0840ab798d1b" }, "pipfile-spec": 6, "requires": { @@ -18,11 +18,11 @@ "default": { "aiobotocore": { "hashes": [ - "sha256:bc841cef234afcb781f2d600680c9e49d01b9a2e8169790a32579bb0df51777f", - "sha256:e121503dca049cf361dea19730e335aff2e7508f7f8b24db2e6a43a6fb70299e" + "sha256:41160f33cdada96815be7d180d1a2405fbf03f0364bac88c03d6ff1ad2cd83d7", + "sha256:eb595362cfa6cd70e2940766e3945b114e2522168b67096b0dbc3067f7fd60ad" ], "markers": "python_version >= '3.8'", - "version": "==2.12.0" + "version": "==2.12.2" }, "aiohttp": { "hashes": [ @@ -136,7 +136,6 @@ "sha256:a739e2924bf7940daee3a17ccec99fd7175363a160d6e8c3329e61d6534a165e" ], "index": "pypi", - "markers": "python_version < '4.0' and python_full_version >= '3.6.1'", "version": "==2.6" }, "altamisa": { @@ -210,7 +209,7 @@ "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version < '3.11.3'", "version": "==4.0.3" }, "attrs": { @@ -219,7 +218,6 @@ "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==23.2.0" }, "awesome-slugify": { @@ -242,7 +240,6 @@ "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], "index": "pypi", - "markers": "python_full_version >= '3.6.0'", "version": "==4.12.3" }, "billiard": { @@ -278,7 +275,6 @@ "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.3.0" }, "botocore": { @@ -295,7 +291,6 @@ "sha256:a934090d95abaa9e911dac357e3a8699e0b4b14f8529bcc7d2b1ad9d51672b9f" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==23.2.3" }, "celery": { @@ -478,11 +473,11 @@ }, "click-didyoumean": { "hashes": [ - "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667", - "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035" + "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463", + "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c" ], - "markers": "python_full_version >= '3.6.2' and python_full_version < '4.0.0'", - "version": "==0.3.0" + "markers": "python_full_version >= '3.6.2'", + "version": "==0.3.1" }, "click-plugins": { "hashes": [ @@ -567,7 +562,6 @@ "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.25" }, "django-autocomplete-light": { @@ -582,7 +576,6 @@ "sha256:ea2e5a770d01c62ecf66d0dd6e8df284e26321245b8abcc6d82d8740765b42d5" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==5.3.3" }, "django-crispy-forms": { @@ -612,7 +605,6 @@ "sha256:e09b7dcb8417b743234dfc57c95a7c1d1d87a88844abd13b4c5387f807b31bf6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.3.0" }, "django-dirtyfields": { @@ -644,7 +636,6 @@ "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.3" }, "django-iconify": { @@ -694,12 +685,11 @@ }, "django-pydantic-field": { "hashes": [ - "sha256:1db00a937b3c5f70ae2698a68c96aefa82ac7318dbfbbb5fb78699edbf4f9941", - "sha256:dde9df9ad22b00fb246b3010b271f4db34ab4369f6a17e26d00eab0de04150ed" + "sha256:0c40b2017c237916320be3e7154e49dc1e9d3f251d7748a5081757cf860fb74e", + "sha256:4c9f700dfcc3f868c3fb9b49572c6a2cd438c08be125a9030b8074583eab0323" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==0.3.3" + "version": "==0.3.7" }, "django-rest-knox": { "hashes": [ @@ -721,7 +711,6 @@ "sha256:55b6c73c4c0384d33c2a8cb2fae369475baa551aee924af20f05a07027201762" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==0.13.4" }, "django-su": { @@ -774,26 +763,26 @@ "sidecar" ], "hashes": [ - "sha256:0a4cada4b7136a0bf17233476c066c511a048bc6a485ae2140326ac7ba4003b2", - "sha256:452e0cff3c12ee057b897508a077562967b9e62717992eeec10e62dbbc7b5a33" + "sha256:a199492f2163c4101055075ebdbb037d59c6e0030692fc83a1a8c0fc65929981", + "sha256:b1c04bf8b2fbbeaf6f59414b4ea448c8787aba4d32f76055c3b13335cf7ec37b" ], - "markers": "python_version >= '3.6'", - "version": "==0.27.1" + "index": "pypi", + "version": "==0.27.2" }, "drf-spectacular-sidecar": { "hashes": [ - "sha256:db95a38971c9be09986356f82041fac60183d28ebdf60c0c51eb8c1f86da3937", - "sha256:dc819ef7a35448c18b2bf4273b38fe1468e14daea5fc8675afb5d0f9e6d9a0ba" + "sha256:68532dd094714f79c1775c00848f22c10f004826abc856442ff30c3bc9c40bb4", + "sha256:8359befe69a8953fea86be01c1ff37038854a62546225551de16c47c07dccd4e" ], - "version": "==2024.2.1" + "version": "==2024.4.1" }, "elementpath": { "hashes": [ - "sha256:8d25db9150f5a6aa978c9f58e607fcd5ab6e6e3017140563439a9884ab1eb304", - "sha256:ecc885f2bb5bd5322fd68ace071f134a8fabf05f0019d77c638b906b844f6593" + "sha256:cda092281afe508ece1bf65373905b30196c9426f3730cfea46059e103a131bd", + "sha256:dfc4b8ca3d87966dcb0df40b5b6d04a98f053683271930fad9e7fa000924dfb2" ], "markers": "python_version >= '3.8'", - "version": "==4.3.0" + "version": "==4.4.0" }, "exceptiongroup": { "hashes": [ @@ -888,11 +877,11 @@ }, "fsspec": { "hashes": [ - "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8", - "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84" + "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", + "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9" ], "markers": "python_version >= '3.8'", - "version": "==2024.2.0" + "version": "==2024.3.1" }, "greenlet": { "hashes": [ @@ -1008,6 +997,7 @@ "hashes": [ "sha256:32c28f9a4b1526c9e1b4cb23c65a85428fde5ba117eac7fc8394ec5d0a9b411f" ], + "index": "pypi", "version": "==0.4" }, "jinja2": { @@ -1040,7 +1030,6 @@ "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.21.1" }, "jsonschema-specifications": { @@ -1053,11 +1042,11 @@ }, "kombu": { "hashes": [ - "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488", - "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93" + "sha256:49f1e62b12369045de2662f62cc584e7df83481a513db83b01f87b5b9785e378", + "sha256:f3da5b570a147a5da8280180aa80b03807283d63ea5081fcdb510d18242431d9" ], "markers": "python_version >= '3.8'", - "version": "==5.3.5" + "version": "==5.3.6" }, "lxml": { "hashes": [ @@ -1156,7 +1145,6 @@ "sha256:fdb325b7fba1e2c40b9b1db407f85642e32404131c08480dd652110fc908561b" ], "index": "pypi", - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "version": "==4.9.4" }, "markdown": { @@ -1167,6 +1155,14 @@ "markers": "python_version >= '3.7'", "version": "==3.4.1" }, + "markdown-it-py": { + "hashes": [ + "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", + "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.0" + }, "markupsafe": { "hashes": [ "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", @@ -1233,6 +1229,14 @@ "markers": "python_version >= '3.7'", "version": "==2.1.5" }, + "mdurl": { + "hashes": [ + "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", + "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1.2" + }, "mistune": { "hashes": [ "sha256:0246113cb2492db875c6be56974a7c893333bf26cd92891c85f63151cee09d34", @@ -1384,7 +1388,6 @@ "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==1.26.4" }, "packaging": { @@ -1428,7 +1431,6 @@ "sha256:f9d3558d263073ed95e46f4650becff0c5e1ffe0fc3a015de3c79283dfbdb3df" ], "index": "pypi", - "markers": "python_version >= '3.9'", "version": "==2.2.1" }, "pathspec": { @@ -1449,77 +1451,78 @@ }, "pillow": { "hashes": [ - "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", - "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", - "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", - "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", - "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", - "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", - "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", - "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", - "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", - "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", - "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", - "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", - "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", - "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", - "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", - "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", - "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", - "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", - "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", - "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", - "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", - "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", - "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", - "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", - "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", - "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", - "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", - "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", - "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", - "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", - "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", - "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", - "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", - "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", - "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", - "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", - "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", - "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", - "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", - "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", - "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", - "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", - "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", - "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", - "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", - "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", - "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", - "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", - "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", - "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", - "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", - "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", - "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", - "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", - "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", - "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", - "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", - "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", - "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", - "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", - "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", - "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", - "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", - "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", - "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", - "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", - "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", - "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" + "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c", + "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2", + "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb", + "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d", + "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa", + "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3", + "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1", + "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a", + "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd", + "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8", + "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999", + "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599", + "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936", + "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375", + "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d", + "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b", + "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60", + "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572", + "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3", + "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced", + "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f", + "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b", + "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19", + "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f", + "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d", + "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383", + "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795", + "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355", + "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57", + "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09", + "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b", + "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462", + "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf", + "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f", + "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a", + "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad", + "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9", + "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d", + "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45", + "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994", + "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d", + "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338", + "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463", + "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451", + "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591", + "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c", + "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd", + "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32", + "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9", + "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf", + "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5", + "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828", + "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3", + "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5", + "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2", + "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b", + "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2", + "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475", + "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3", + "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb", + "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef", + "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015", + "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002", + "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170", + "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84", + "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57", + "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f", + "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27", + "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" ], "markers": "python_version >= '3.8'", - "version": "==10.2.0" + "version": "==10.3.0" }, "platformdirs": { "hashes": [ @@ -1535,7 +1538,6 @@ "sha256:9665594d137fb08a1117518c25551e0ede1687197cf353a4fdc78d27e1073568" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.10.0" }, "prompt-toolkit": { @@ -1572,7 +1574,6 @@ "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.20.3" }, "psutil": { @@ -1595,7 +1596,6 @@ "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8" ], "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": "==5.9.8" }, "psycopg2": { @@ -1697,10 +1697,11 @@ }, "pycparser": { "hashes": [ - "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" ], - "version": "==2.21" + "markers": "python_version >= '3.8'", + "version": "==2.22" }, "pycryptodome": { "hashes": [ @@ -1746,7 +1747,6 @@ "sha256:cc46fce86607580867bdc3361ad462bab9c222ef042d3da86f2fb333e1d916c5" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==2.6.4" }, "pydantic-core": { @@ -1844,11 +1844,11 @@ }, "pyopenssl": { "hashes": [ - "sha256:6aa33039a93fffa4563e655b61d11364d01264be8ccb49906101e02a334530bf", - "sha256:ba07553fb6fd6a7a2259adb9b84e12302a9a8a75c44046e8bb5d3e5ee887e3c3" + "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", + "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f" ], "markers": "python_version >= '3.7'", - "version": "==24.0.0" + "version": "==24.1.0" }, "pysam": { "hashes": [ @@ -1881,7 +1881,6 @@ "sha256:f73d7923c89618fb7024875ed8eddc5fb0c911f430e3495de482fcee48143e45" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==0.22.0" }, "pysaml2": { @@ -1898,7 +1897,6 @@ "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": { @@ -1907,7 +1905,6 @@ "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==1.0.1" }, "pytz": { @@ -1972,25 +1969,23 @@ "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==6.0.1" }, "redis": { "hashes": [ - "sha256:3f82cc80d350e93042c8e6e7a5d0596e4dd68715babffba79492733e1f367037", - "sha256:4caa8e1fcb6f3c0ef28dba99535101d80934b7d4cd541bbb47f4a3826ee472d1" + "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580", + "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==5.0.2" + "version": "==5.0.3" }, "referencing": { "hashes": [ - "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5", - "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7" + "sha256:5773bd84ef41799a5a8ca72dc34590c041eb01bf9aa02632b4a973fb0181a844", + "sha256:d53ae300ceddd3169f1ffa9caf2cb7b769e92657e4fafb23d34b93679116dfd4" ], "markers": "python_version >= '3.8'", - "version": "==0.33.0" + "version": "==0.34.0" }, "regex": { "hashes": [ @@ -2097,8 +2092,7 @@ "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.31.0" + "version": "==2.31" }, "requests-http-signature": { "hashes": [ @@ -2108,6 +2102,14 @@ "index": "pypi", "version": "==0.2.0" }, + "rich": { + "hashes": [ + "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", + "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" + ], + "index": "pypi", + "version": "==13.7.1" + }, "rpds-py": { "hashes": [ "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f", @@ -2222,20 +2224,19 @@ }, "s3fs": { "hashes": [ - "sha256:c140de37175c157cb662aa6ad7423365df732ac5f10ef5bf7b76078c6333a942", - "sha256:f8064f522ad088b56b043047c825734847c0269df19f2613c956d4c20de15b62" + "sha256:1b8bc8dbd65e7b60f5487378f6eeffe1de59aa72caa9efca6dad6ab877405487", + "sha256:f4566a5446c473740d272ec08e0b4aae8db1aa05f662c42ff0aa2c89bb5060ea" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==2024.2.0" + "version": "==2024.3.1" }, "sentry-sdk": { "hashes": [ - "sha256:eb65289da013ca92fad2694851ad2f086aa3825e808dc285bd7dcaf63602bb18", - "sha256:f7125a9235795811962d52ff796dc032cd1d0dd98b59beaced8380371cd9c13c" + "sha256:24e6a53eeabffd2f95d952aa35ca52f0f4201d17f820ac9d3ff7244c665aaf68", + "sha256:5f75eb91d8ab6037c754a87b8501cc581b2827e923682f593bed3539ce5b3999" ], "index": "pypi", - "version": "==1.44.0" + "version": "==1.44.1" }, "setuptools": { "hashes": [ @@ -2347,7 +2348,6 @@ "sha256:ff836cd4041e16003549449cc0a5e372f6b6f871eb89007ab0ee18fb2800fded" ], "index": "pypi", - "markers": "python_version >= '2.5' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==3.19.2" }, "six": { @@ -2461,56 +2461,55 @@ }, "sqlalchemy": { "hashes": [ - "sha256:0525c4905b4b52d8ccc3c203c9d7ab2a80329ffa077d4bacf31aefda7604dc65", - "sha256:0535d5b57d014d06ceeaeffd816bb3a6e2dddeb670222570b8c4953e2d2ea678", - "sha256:0892e7ac8bc76da499ad3ee8de8da4d7905a3110b952e2a35a940dab1ffa550e", - "sha256:0d661cff58c91726c601cc0ee626bf167b20cc4d7941c93c5f3ac28dc34ddbea", - "sha256:1980e6eb6c9be49ea8f89889989127daafc43f0b1b6843d71efab1514973cca0", - "sha256:1a09d5bd1a40d76ad90e5570530e082ddc000e1d92de495746f6257dc08f166b", - "sha256:245c67c88e63f1523e9216cad6ba3107dea2d3ee19adc359597a628afcabfbcb", - "sha256:2ad16880ccd971ac8e570550fbdef1385e094b022d6fc85ef3ce7df400dddad3", - "sha256:2be4e6294c53f2ec8ea36486b56390e3bcaa052bf3a9a47005687ccf376745d1", - "sha256:2c55040d8ea65414de7c47f1a23823cd9f3fad0dc93e6b6b728fee81230f817b", - "sha256:352df882088a55293f621328ec33b6ffca936ad7f23013b22520542e1ab6ad1b", - "sha256:3823dda635988e6744d4417e13f2e2b5fe76c4bf29dd67e95f98717e1b094cad", - "sha256:38ef80328e3fee2be0a1abe3fe9445d3a2e52a1282ba342d0dab6edf1fef4707", - "sha256:39b02b645632c5fe46b8dd30755682f629ffbb62ff317ecc14c998c21b2896ff", - "sha256:3b0cd89a7bd03f57ae58263d0f828a072d1b440c8c2949f38f3b446148321171", - "sha256:3ec7a0ed9b32afdf337172678a4a0e6419775ba4e649b66f49415615fa47efbd", - "sha256:3f0ef620ecbab46e81035cf3dedfb412a7da35340500ba470f9ce43a1e6c423b", - "sha256:50e074aea505f4427151c286955ea025f51752fa42f9939749336672e0674c81", - "sha256:55e699466106d09f028ab78d3c2e1f621b5ef2c8694598242259e4515715da7c", - "sha256:5e180fff133d21a800c4f050733d59340f40d42364fcb9d14f6a67764bdc48d2", - "sha256:6cacc0b2dd7d22a918a9642fc89840a5d3cee18a0e1fe41080b1141b23b10916", - "sha256:7af40425ac535cbda129d9915edcaa002afe35d84609fd3b9d6a8c46732e02ee", - "sha256:7d8139ca0b9f93890ab899da678816518af74312bb8cd71fb721436a93a93298", - "sha256:7deeae5071930abb3669b5185abb6c33ddfd2398f87660fafdb9e6a5fb0f3f2f", - "sha256:86a22143a4001f53bf58027b044da1fb10d67b62a785fc1390b5c7f089d9838c", - "sha256:8ca484ca11c65e05639ffe80f20d45e6be81fbec7683d6c9a15cd421e6e8b340", - "sha256:8d1d7d63e5d2f4e92a39ae1e897a5d551720179bb8d1254883e7113d3826d43c", - "sha256:8e702e7489f39375601c7ea5a0bef207256828a2bc5986c65cb15cd0cf097a87", - "sha256:a055ba17f4675aadcda3005df2e28a86feb731fdcc865e1f6b4f209ed1225cba", - "sha256:a33cb3f095e7d776ec76e79d92d83117438b6153510770fcd57b9c96f9ef623d", - "sha256:a61184c7289146c8cff06b6b41807c6994c6d437278e72cf00ff7fe1c7a263d1", - "sha256:af55cc207865d641a57f7044e98b08b09220da3d1b13a46f26487cc2f898a072", - "sha256:b00cf0471888823b7a9f722c6c41eb6985cf34f077edcf62695ac4bed6ec01ee", - "sha256:b03850c290c765b87102959ea53299dc9addf76ca08a06ea98383348ae205c99", - "sha256:b97fd5bb6b7c1a64b7ac0632f7ce389b8ab362e7bd5f60654c2a418496be5d7f", - "sha256:c37bc677690fd33932182b85d37433845de612962ed080c3e4d92f758d1bd894", - "sha256:cecb66492440ae8592797dd705a0cbaa6abe0555f4fa6c5f40b078bd2740fc6b", - "sha256:d0a83afab5e062abffcdcbcc74f9d3ba37b2385294dd0927ad65fc6ebe04e054", - "sha256:d3cf56cc36d42908495760b223ca9c2c0f9f0002b4eddc994b24db5fcb86a9e4", - "sha256:e646b19f47d655261b22df9976e572f588185279970efba3d45c377127d35349", - "sha256:e7908c2025eb18394e32d65dd02d2e37e17d733cdbe7d78231c2b6d7eb20cdb9", - "sha256:e8f2df79a46e130235bc5e1bbef4de0583fb19d481eaa0bffa76e8347ea45ec6", - "sha256:eaeeb2464019765bc4340214fca1143081d49972864773f3f1e95dba5c7edc7d", - "sha256:eb18549b770351b54e1ab5da37d22bc530b8bfe2ee31e22b9ebe650640d2ef12", - "sha256:f2e5b6f5cf7c18df66d082604a1d9c7a2d18f7d1dbe9514a2afaccbb51cc4fc3", - "sha256:f8cafa6f885a0ff5e39efa9325195217bb47d5929ab0051636610d24aef45ade" - ], - "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.51" + "sha256:1296f2cdd6db09b98ceb3c93025f0da4835303b8ac46c15c2136e27ee4d18d94", + "sha256:1e135fff2e84103bc15c07edd8569612ce317d64bdb391f49ce57124a73f45c5", + "sha256:1f8e1c6a6b7f8e9407ad9afc0ea41c1f65225ce505b79bc0342159de9c890782", + "sha256:24bb0f81fbbb13d737b7f76d1821ec0b117ce8cbb8ee5e8641ad2de41aa916d3", + "sha256:29d4247313abb2015f8979137fe65f4eaceead5247d39603cc4b4a610936cd2b", + "sha256:2c286fab42e49db23c46ab02479f328b8bdb837d3e281cae546cc4085c83b680", + "sha256:2f251af4c75a675ea42766880ff430ac33291c8d0057acca79710f9e5a77383d", + "sha256:346ed50cb2c30f5d7a03d888e25744154ceac6f0e6e1ab3bc7b5b77138d37710", + "sha256:3491c85df263a5c2157c594f54a1a9c72265b75d3777e61ee13c556d9e43ffc9", + "sha256:427988398d2902de042093d17f2b9619a5ebc605bf6372f7d70e29bde6736842", + "sha256:427c282dd0deba1f07bcbf499cbcc9fe9a626743f5d4989bfdfd3ed3513003dd", + "sha256:49e3772eb3380ac88d35495843daf3c03f094b713e66c7d017e322144a5c6b7c", + "sha256:4dae6001457d4497736e3bc422165f107ecdd70b0d651fab7f731276e8b9e12d", + "sha256:5b5de6af8852500d01398f5047d62ca3431d1e29a331d0b56c3e14cb03f8094c", + "sha256:5bbce5dd7c7735e01d24f5a60177f3e589078f83c8a29e124a6521b76d825b85", + "sha256:5bed4f8c3b69779de9d99eb03fd9ab67a850d74ab0243d1be9d4080e77b6af12", + "sha256:618827c1a1c243d2540314c6e100aee7af09a709bd005bae971686fab6723554", + "sha256:6ab773f9ad848118df7a9bbabca53e3f1002387cdbb6ee81693db808b82aaab0", + "sha256:6e41cb5cda641f3754568d2ed8962f772a7f2b59403b95c60c89f3e0bd25f15e", + "sha256:7027be7930a90d18a386b25ee8af30514c61f3852c7268899f23fdfbd3107181", + "sha256:763bd97c4ebc74136ecf3526b34808c58945023a59927b416acebcd68d1fc126", + "sha256:7d0dbc56cb6af5088f3658982d3d8c1d6a82691f31f7b0da682c7b98fa914e91", + "sha256:80e63bbdc5217dad3485059bdf6f65a7d43f33c8bde619df5c220edf03d87296", + "sha256:80e7f697bccc56ac6eac9e2df5c98b47de57e7006d2e46e1a3c17c546254f6ef", + "sha256:84e10772cfc333eb08d0b7ef808cd76e4a9a30a725fb62a0495877a57ee41d81", + "sha256:853fcfd1f54224ea7aabcf34b227d2b64a08cbac116ecf376907968b29b8e763", + "sha256:99224d621affbb3c1a4f72b631f8393045f4ce647dd3262f12fe3576918f8bf3", + "sha256:a251146b921725547ea1735b060a11e1be705017b568c9f8067ca61e6ef85f20", + "sha256:a551d5f3dc63f096ed41775ceec72fdf91462bb95abdc179010dc95a93957800", + "sha256:a5d2e08d79f5bf250afb4a61426b41026e448da446b55e4770c2afdc1e200fce", + "sha256:a752bff4796bf22803d052d4841ebc3c55c26fb65551f2c96e90ac7c62be763a", + "sha256:afb1672b57f58c0318ad2cff80b384e816735ffc7e848d8aa51e0b0fc2f4b7bb", + "sha256:bcdfb4b47fe04967669874fb1ce782a006756fdbebe7263f6a000e1db969120e", + "sha256:bdb7b4d889631a3b2a81a3347c4c3f031812eb4adeaa3ee4e6b0d028ad1852b5", + "sha256:c124912fd4e1bb9d1e7dc193ed482a9f812769cb1e69363ab68e01801e859821", + "sha256:c294ae4e6bbd060dd79e2bd5bba8b6274d08ffd65b58d106394cb6abbf35cf45", + "sha256:ca5ce82b11731492204cff8845c5e8ca1a4bd1ade85e3b8fcf86e7601bfc6a39", + "sha256:cb8f9e4c4718f111d7b530c4e6fb4d28f9f110eb82e7961412955b3875b66de0", + "sha256:d2de46f5d5396d5331127cfa71f837cca945f9a2b04f7cb5a01949cf676db7d1", + "sha256:d913f8953e098ca931ad7f58797f91deed26b435ec3756478b75c608aa80d139", + "sha256:de9acf369aaadb71a725b7e83a5ef40ca3de1cf4cdc93fa847df6b12d3cd924b", + "sha256:e93983cc0d2edae253b3f2141b0a3fb07e41c76cd79c2ad743fc27eb79c3f6db", + "sha256:f12aaf94f4d9679ca475975578739e12cc5b461172e04d66f7a3c39dd14ffc64", + "sha256:f68016f9a5713684c1507cc37133c28035f29925c75c0df2f9d0f7571e23720a", + "sha256:f7ea11727feb2861deaa293c7971a4df57ef1c90e42cb53f0da40c3468388000", + "sha256:f98dbb8fcc6d1c03ae8ec735d3c62110949a3b8bc6e215053aa27096857afb45" + ], + "index": "pypi", + "version": "==1.4.52" }, "sqlparse": { "hashes": [ @@ -2518,7 +2517,6 @@ "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==0.4.4" }, "toml": { @@ -2527,7 +2525,6 @@ "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], "index": "pypi", - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, "tomli": { @@ -2544,7 +2541,6 @@ "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==4.66.2" }, "typing-extensions": { @@ -2552,7 +2548,7 @@ "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475", "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.11'", "version": "==4.10.0" }, "tzdata": { @@ -2572,12 +2568,11 @@ }, "universal-pathlib": { "hashes": [ - "sha256:bb14881f1c6c025c654a658c253b4cf89e8238dff6d3c847aa5723899227f85e", - "sha256:fda2f484d875c26079771f94acfef58647eed80efce75f0bf8824373b432e802" + "sha256:6bc215548792ad5db3553708b1c19bafd9e2fa1667dc925ed404c95e52ae2f13", + "sha256:9bc176112d593348bb29806a47e409eda78dff8d95391d66dd6f85e443aaa75d" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==0.2.1" + "version": "==0.2.2" }, "uritemplate": { "hashes": [ @@ -2707,7 +2702,6 @@ "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.16.0" }, "xlsxwriter": { @@ -2716,7 +2710,6 @@ "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.2.0" }, "xmlschema": { @@ -2838,37 +2831,35 @@ "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==23.2.0" }, "black": { "hashes": [ - "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8", - "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8", - "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd", - "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9", - "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31", - "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92", - "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f", - "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29", - "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4", - "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693", - "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218", - "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a", - "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23", - "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0", - "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982", - "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894", - "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540", - "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430", - "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b", - "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2", - "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6", - "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d" + "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f", + "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93", + "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11", + "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0", + "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9", + "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5", + "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213", + "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d", + "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7", + "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837", + "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f", + "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395", + "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995", + "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", + "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597", + "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959", + "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5", + "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb", + "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4", + "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7", + "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd", + "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==24.2.0" + "version": "==24.3.0" }, "certifi": { "hashes": [ @@ -3044,7 +3035,6 @@ "sha256:f42015f31d386b351d4226389b387ae173207058832fbf5c8ec4b40e27b16026" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==3.3.1" }, "decorator": { @@ -3069,7 +3059,6 @@ "sha256:72e1ca5dcaaf4ad73c9c796ad6e0dc165db39f706c3ad822074d961f72eed743" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==2.2.3" }, "docopt": { @@ -3108,16 +3097,15 @@ "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==3.3.0" }, "faker": { "hashes": [ - "sha256:117ce1a2805c1bc5ca753b3dc6f9d567732893b2294b827d3164261ee8f20267", - "sha256:458d93580de34403a8dec1e8d5e6be2fee96c4deca63b95d71df7a6a80a690de" + "sha256:998c29ee7d64429bd59204abffa9ba11f784fb26c7b9df4def78d1a70feb36a7", + "sha256:a5ddccbe97ab691fad6bd8036c31f5697cfaa550e62e000078d1935fa8a7ec2e" ], "markers": "python_version >= '3.8'", - "version": "==23.3.0" + "version": "==24.4.0" }, "fastdiff": { "hashes": [ @@ -3132,7 +3120,6 @@ "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5" ], "index": "pypi", - "markers": "python_full_version >= '3.8.1'", "version": "==6.1.0" }, "flake8-import-order": { @@ -3148,7 +3135,6 @@ "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==1.2.3" }, "freezegun": { @@ -3157,7 +3143,6 @@ "sha256:55e0fc3c84ebf0a96a5aa23ff8b53d70246479e9a68863f1fcac5a3e52f19dd6" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.4.0" }, "future": { @@ -3190,16 +3175,15 @@ "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": { "hashes": [ - "sha256:39c6f9efc079fb19bfb0f17eee903978fe9a290b1b82d68196c641cecb76ea22", - "sha256:869335e8cded62ffb6fac8928e5287a05433d6462e3ebaac25f4216474dd6bc4" + "sha256:07232af52a5ba146dc3372c7bf52a0f890a23edf38d77caef8d53f9cdc2584c1", + "sha256:7468edaf4f6de3e1b912e57f66c241e6fd3c7099f2ec2136e239e142e800274d" ], "markers": "python_version < '3.11' and python_version >= '3.7'", - "version": "==8.22.1" + "version": "==8.23.0" }, "isort": { "hashes": [ @@ -3207,7 +3191,6 @@ "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6" ], "index": "pypi", - "markers": "python_full_version >= '3.8.0'", "version": "==5.13.2" }, "jedi": { @@ -3216,7 +3199,6 @@ "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==0.19.1" }, "jsonmatch": { @@ -3322,7 +3304,6 @@ "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.1.2" }, "outcome": { @@ -3347,7 +3328,6 @@ "sha256:7fc905272cefa4f364c1a3429cbbe9c0f98b793988efb5bf90aac80f08db09b1" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==0.9.0" }, "parso": { @@ -3438,12 +3418,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709", - "sha256:cbf2f1da5e6083ac2fbfd4da39a25f34312230110440f424a14c7558bb85d82e" + "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" + "version": "==2.9.0.post0" }, "requests": { "hashes": [ @@ -3451,25 +3430,23 @@ "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==2.31.0" + "version": "==2.31" }, "requests-mock": { "hashes": [ - "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4", - "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15" + "sha256:b1e37054004cdd5e56c84454cc7df12b25f90f382159087f4b6915aaeef39563", + "sha256:e9e12e333b525156e82a3c852f22016b9158220d2f47454de9cae8a77d371401" ], "index": "pypi", - "version": "==1.11.0" + "version": "==1.12.1" }, "selenium": { "hashes": [ - "sha256:a11f67afa8bfac6b77e148c987b33f6b14eb1cae4d352722a75de1f26e3f0ae2", - "sha256:b24a3cdd2d47c29832e81345bfcde0c12bb608738013e53c781b211b418df241" + "sha256:5b4f49240d61e687a73f7968ae2517d403882aae3550eae2a229c745e619f1d9", + "sha256:d9dfd6d0b021d71d0a48b865fe7746490ba82b81e9c87b212360006629eb1853" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.18.1" + "version": "==4.19.0" }, "setuptools": { "hashes": [ @@ -3523,7 +3500,6 @@ "sha256:93622790a0a29e04f0346458face1e144dc4d32f493714c6c3dff82a4adb77e6" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==3.0.0" }, "termcolor": { @@ -3544,19 +3520,19 @@ }, "traitlets": { "hashes": [ - "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", - "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" + "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", + "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" ], "markers": "python_version >= '3.8'", - "version": "==5.14.1" + "version": "==5.14.2" }, "trio": { "hashes": [ - "sha256:c3bd3a4e3e3025cd9a2241eae75637c43fe0b9e88b4c97b9161a55b9e54cd72c", - "sha256:ffa09a74a6bf81b84f8613909fb0beaee84757450183a7a2e0b47b455c0cac5d" + "sha256:9b41f5993ad2c0e5f62d0acca320ec657fdb6b2a2c22b8c7aed6caf154475c4e", + "sha256:e6458efe29cc543e557a91e614e2b51710eba2961669329ce9c862d50c6e8e81" ], "markers": "python_version >= '3.8'", - "version": "==0.24.0" + "version": "==0.25.0" }, "trio-websocket": { "hashes": [ @@ -3653,7 +3629,6 @@ "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==4.0.0" }, "wcwidth": { @@ -3665,12 +3640,11 @@ }, "werkzeug": { "hashes": [ - "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc", - "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10" + "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795", + "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.0.1" + "version": "==3.0.2" }, "wsproto": { "hashes": [ @@ -3684,61 +3658,64 @@ "ldap-packages": { "asgiref": { "hashes": [ - "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", - "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed" + "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", + "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590" ], - "markers": "python_version >= '3.7'", - "version": "==3.7.2" + "markers": "python_version >= '3.8'", + "version": "==3.8.1" }, "django": { "hashes": [ - "sha256:5dd5b787c3ba39637610fe700f54bf158e33560ea0dba600c19921e7ff926ec5", - "sha256:aaee9fb0fb4ebd4311520887ad2e33313d368846607f82a9a0ed461cd4c35b18" + "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", + "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.24" + "version": "==3.2.25" }, "django-auth-ldap": { "hashes": [ - "sha256:4e82ded9292dc6ac7a75784d81b95174b72ca5e650a76e11317e3b68008e56d8", - "sha256:9ae2bf87f9b6367b6cfd94a0451896cbc728e5400ed81cbfbd58ce743c0909a2" + "sha256:8dea65376b8b2fa1beee52348760e3082e642939a5038cbe881a5e6381b65b8a", + "sha256:de02c36e9f9025be9242cd40b5617403a886c72e3c5e0dd489b9b3db996dc875" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==4.6.0" + "version": "==4.7.0" }, "pyasn1": { "hashes": [ - "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58", - "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c" + "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==0.5.1" + "markers": "python_version >= '3.8'", + "version": "==0.6.0" }, "pyasn1-modules": { "hashes": [ - "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c", - "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d" + "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==0.3.0" + "markers": "python_version >= '3.8'", + "version": "==0.4.0" }, "python-ldap": { "hashes": [ "sha256:7edb0accec4e037797705f3a05cbf36a9fde50d08c8f67f2aef99a2628fab828" ], "index": "pypi", - "markers": "python_version >= '3.6'", "version": "==3.4.4" }, + "pytz": { + "hashes": [ + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + ], + "version": "==2024.1" + }, "sqlparse": { "hashes": [ "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3", "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==0.4.4" }, "typing-extensions": { @@ -3753,28 +3730,27 @@ "prod-packages": { "asgiref": { "hashes": [ - "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", - "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed" + "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47", + "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590" ], - "markers": "python_version >= '3.7'", - "version": "==3.7.2" + "markers": "python_version >= '3.8'", + "version": "==3.8.1" }, "async-timeout": { "hashes": [ "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f", "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version < '3.11.3'", "version": "==4.0.3" }, "boto3": { "hashes": [ - "sha256:340c73f57fcca6f503403e2e13a0a4ad44bec218feee2e0896be612324394afd", - "sha256:cd30261a782824ce543a628ae524480abb4ca6ab4e4a2631477e48baed43b5f2" + "sha256:530a4cea3d40a6bd2f15a368ea395beef1ea6dff4491823bc48bd20c7d4da655", + "sha256:8c598382e8fb61cfa8f75056197e9b509eb52039ebc291af3b1096241ba2542c" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==1.34.53" + "version": "==1.34.76" }, "botocore": { "hashes": [ @@ -3786,19 +3762,18 @@ }, "django": { "hashes": [ - "sha256:5dd5b787c3ba39637610fe700f54bf158e33560ea0dba600c19921e7ff926ec5", - "sha256:aaee9fb0fb4ebd4311520887ad2e33313d368846607f82a9a0ed461cd4c35b18" + "sha256:7ca38a78654aee72378594d63e51636c04b8e28574f5505dff630895b5472777", + "sha256:a52ea7fcf280b16f7b739cec38fa6d3f8953a5456986944c3ca97e79882b4e38" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.2.24" + "version": "==3.2.25" }, "django-redis": { "hashes": [ "sha256:6a02abaa34b0fea8bf9b707d2c363ab6adc7409950b2db93602e6cb292818c42", "sha256:ebc88df7da810732e2af9987f7f426c96204bf89319df4c6da6ca9a2942edd5b" ], - "markers": "python_version >= '3.6'", + "index": "pypi", "version": "==5.4.0" }, "django-storages": { @@ -3807,7 +3782,6 @@ "sha256:51b36af28cc5813b98d5f3dfe7459af638d84428c8df4a03990c7d74d1bea4e5" ], "index": "pypi", - "markers": "python_version >= '3.7'", "version": "==1.14.2" }, "gevent": { @@ -3855,7 +3829,6 @@ "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==24.2.1" }, "greenlet": { @@ -3928,7 +3901,6 @@ "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==21.2.0" }, "jmespath": { @@ -3949,29 +3921,34 @@ }, "python-dateutil": { "hashes": [ - "sha256:78e73e19c63f5b20ffa567001531680d939dc042bf7850431877645523c66709", - "sha256:cbf2f1da5e6083ac2fbfd4da39a25f34312230110440f424a14c7558bb85d82e" + "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" + "version": "==2.9.0.post0" + }, + "pytz": { + "hashes": [ + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + ], + "version": "==2024.1" }, "redis": { "hashes": [ - "sha256:3f82cc80d350e93042c8e6e7a5d0596e4dd68715babffba79492733e1f367037", - "sha256:4caa8e1fcb6f3c0ef28dba99535101d80934b7d4cd541bbb47f4a3826ee472d1" + "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580", + "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==5.0.2" + "version": "==5.0.3" }, "s3transfer": { "hashes": [ - "sha256:3cdb40f5cfa6966e812209d0994f2a4709b561c88e90cf00c2696d2df4e56b2e", - "sha256:d0c8bbf672d5eebbe4e57945e23b972d963f07d82f661cabf678a5c88831595b" + "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19", + "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d" ], "markers": "python_version >= '3.8'", - "version": "==0.10.0" + "version": "==0.10.1" }, "setuptools": { "hashes": [ @@ -3995,7 +3972,6 @@ "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c" ], "index": "pypi", - "markers": "python_version >= '3.5'", "version": "==0.4.4" }, "typing-extensions": { @@ -4020,7 +3996,6 @@ "sha256:b1f9db9bf67dc183484d760b99f4080185633136a273a03f6436034a41064146" ], "index": "pypi", - "markers": "python_version >= '3.8'", "version": "==6.6.0" }, "zope.event": { diff --git a/utils/kickoff_orphaned_annotation_query.py b/utils/kickoff_orphaned_annotation_query.py index 453a84af0..cb3655ab2 100644 --- a/utils/kickoff_orphaned_annotation_query.py +++ b/utils/kickoff_orphaned_annotation_query.py @@ -16,7 +16,7 @@ #: Endpoint to smallvariant list-create query ENDPOINT_SM_LISTCREATE_QUERY = "/variants/api/query/list-create/{case_uuid}" #: Endpoint to smallvariant retrieve query -ENDPOINT_SM_RETRIEVE_QUERY = "/svs/api/query/retrieve-update-destroy/{query_uuid}/" +ENDPOINT_SM_RETRIEVE_QUERY = "/variants/api/query/retrieve-update-destroy/{query_uuid}/" #: Endpoint to structuralvariant query settings ENDPOINT_SV_SETTINGS = "/svs/ajax/query-case/query-settings-shortcut/{case_uuid}/?quick_preset=whole_genome&genotype_criteria=default&inheritance=any&frequency=any&impact=any&sv_type=any" #: Endpoint to structuralvariant list-create query diff --git a/utils/projectwide_query.py b/utils/projectwide_query.py new file mode 100644 index 000000000..890f2f63d --- /dev/null +++ b/utils/projectwide_query.py @@ -0,0 +1,294 @@ +import json +import os +import sys +import time + +import click +import requests +from rich.console import Console +import toml + +#: Paths to search the global configuration in. +GLOBAL_CONFIG_PATHS = ("~/.varfishrc.toml",) + +#: Endpoint to generate export tsv file +ENDPOINT_DOWNLOAD_GENERATE_TSV = "/variants/api/query-case/download/generate/tsv/{query_uuid}" +#: Endpoint to generate export vcf file +ENDPOINT_DOWNLOAD_GENERATE_VCF = "/variants/api/query-case/download/generate/vcf/{query_uuid}" +#: Endpoint to generate export xlsx file +ENDPOINT_DOWNLOAD_GENERATE_XLSX = "/variants/api/query-case/download/generate/xlsx/{query_uuid}" +#: Endpoint to download file +ENDPOINT_DOWNLOAD_SERVE = "/variants/api/query-case/download/serve/{sodar_uuid}" +#: Endpoint to check download status +ENDPOINT_DOWNLOAD_STATUS = "/variants/api/query-case/download/status/{sodar_uuid}" +#: Endpoint to case list +ENDPOINT_CASE_LIST = "/cases/api/case/list/{project_uuid}" +#: Endpoint to smallvariant query settings +ENDPOINT_SM_SETTINGS = "/variants/api/query-case/query-settings-shortcut/{case_uuid}" +#: Endpoint to smallvariant list-create query +ENDPOINT_SM_LISTCREATE_QUERY = "/variants/api/query/list-create/{case_uuid}" +#: Endpoint to smallvariant retrieve query +ENDPOINT_SM_RETRIEVE_QUERY = "/variants/api/query/retrieve-update-destroy/{query_uuid}/" +#: Endpoint to structuralvariant query settings +ENDPOINT_SV_SETTINGS = "/svs/ajax/query-case/query-settings-shortcut/{case_uuid}/?quick_preset=whole_genome&genotype_criteria=default&inheritance=any&frequency=any&impact=any&sv_type=any" +#: Endpoint to structuralvariant list-create query +ENDPOINT_SV_LISTCREATE_QUERY = "/svs/ajax/sv-query/list-create/{case_uuid}/" +#: Endpoint to structuralvariant retrieve query +ENDPOINT_SV_RETRIEVE_QUERY = "/svs/ajax/sv-query/retrieve-update-destroy/{query_uuid}/" + +#: Sleep time between starting queries +SLEEP_RUN = 2 +#: Sleep time between polling queries +SLEEP_POLL = 5 + +#: SQL database name for structural variants +SQL_SV_DB = "svs_structuralvariant" +#: SQL database name for small variants +SQL_SM_DB = "variants_smallvariant" +#: SQL query template to retrieve variants +SQL_QUERY_TEMPLATE = "select * from {db} left outer join variants_case on variants_case.id={db}.case_id where variants_case.sodar_uuid='{case_uuid}' and {db}.release='GRCh37' and chromosome='{chromosome}' and start={start};\n" + + +console = Console() + + +def connect_endpoint(config, endpoint, data=None): + token = config.get("global", {}).get("varfish_api_token") + base = config.get("global", {}).get("varfish_server_url").rstrip("/") + url = f"{base}{endpoint}" + headers = {"Authorization": f"Token {token}"} + if data: + response = requests.post(url, headers=headers, json=data) + else: + response = requests.get(url, headers=headers) + if response.status_code not in ( + 200, + 201, + ): + sys.stderr.write(f"Error: {url} responded with {response.status_code}\n") + return {} + return response + + +def read_toml(): + for config_path in GLOBAL_CONFIG_PATHS: + config_path = os.path.expanduser(os.path.expandvars(config_path)) + if os.path.exists(config_path): + with open(config_path, "rt") as tomlf: + return toml.load(tomlf) + else: + sys.stderr.write( + f"Could not find any of the global configuration files {GLOBAL_CONFIG_PATHS}" + ) + sys.exit() + + +def run_query( + config, + settings_endpoint, + query_endpoint, + case_uuid, + gene, + region, + quick_preset, + inheritance, + frequency, + impact, + verbose, +): + url = settings_endpoint.format(case_uuid=case_uuid) + url += f"?quick_preset={quick_preset}" + if inheritance: + url += f"&inheritance={inheritance}" + if frequency: + url += f"&frequency={frequency}" + if impact: + url += f"&impact={impact}" + if verbose: + console.log(url) + response = connect_endpoint(config, url) + if not response: + return "" + response_json = response.json() + if gene: + response_json["query_settings"]["gene_allowlist"] = [gene] + elif region: + response_json["query_settings"]["genomic_region"] = region + url = query_endpoint.format(case_uuid=case_uuid) + response = connect_endpoint(config, url, data=response_json) + if not response: + return "" + response_json = response.json() + if not response_json.get("sodar_uuid"): + console.log(f"[bold red]Error: got no query uuid for case {case_uuid}[/bold red]") + return "" + time.sleep(SLEEP_RUN) + return response_json["sodar_uuid"] + + +def poll_query(config, query_endpoint, query_uuid): + url = query_endpoint.format(query_uuid=query_uuid) + response = connect_endpoint(config, url) + if not response: + return {"query_state": "fetching_failed"} + return response.json() + + +def poll_queries(config, query_endpoint, query_uuids): + poll_running = [] + for query_uuid, data in query_uuids.items(): + if not data["running"]: + continue + query_data = poll_query(config, query_endpoint, query_uuid) + data["state"] = query_data["query_state"] + data["logs"] = query_data["logs"] + data["running"] = query_data["query_state"] == "running" + poll_running.append(data["running"]) + return any(poll_running) + + +def get_case_list(config, project_uuid): + url = ENDPOINT_CASE_LIST.format(project_uuid=project_uuid) + url_appendix = "" + case_query = {} + while True: + response = connect_endpoint(config, url + ("?" + (url_appendix if url_appendix else ""))) + response_json = response.json() + for case in response_json["results"]: + case_query[case["sodar_uuid"]] = {"name": case["name"], "query": None} + if not response_json["next"]: + break + url_appendix = response_json["next"].split("?")[1] + return case_query + + +def download_generate(config, query_uuid, export_format): + if export_format == "tsv": + url = ENDPOINT_DOWNLOAD_GENERATE_TSV.format(query_uuid=query_uuid) + elif export_format == "vcf": + url = ENDPOINT_DOWNLOAD_GENERATE_VCF.format(query_uuid=query_uuid) + elif export_format == "xlsx": + url = ENDPOINT_DOWNLOAD_GENERATE_XLSX.format(query_uuid=query_uuid) + response = connect_endpoint(config, url) + if not response: + return + return response.json()["export_job__sodar_uuid"] + + +def download_status(config, sodar_uuid): + url = ENDPOINT_DOWNLOAD_STATUS.format(sodar_uuid=sodar_uuid) + response = connect_endpoint(config, url) + if not response: + return {} + return response.json()["status"] + + +def download_serve(config, sodar_uuid, name): + url = ENDPOINT_DOWNLOAD_SERVE.format(sodar_uuid=sodar_uuid) + response = connect_endpoint(config, url) + if not response: + return + with open(name, "wb") as fh: + fh.write(response.content) + + +@click.command() +@click.argument("project-uuid") +@click.option( + "--export-format", + default="xlsx", + type=click.Choice(["tsv", "vcf", "xlsx"], case_sensitive=False), +) +@click.option("--gene", default=None, help="Gene to filter on") +@click.option("--region", default=None, help="Region to filter on") +@click.option("--quick-preset", default="default", help="Quick preset to use") +@click.option("--inheritance", default=None, help="Inheritance preset to use") +@click.option("--frequency", default=None, help="Frequency preset to use") +@click.option("--impact", default=None, help="Impact preset to use") +@click.option("--verbose", is_flag=False, help="Verbose output") +def main( + project_uuid, export_format, gene, region, quick_preset, inheritance, frequency, impact, verbose +): + config = read_toml() + query_results = {} + case_query = {} + + with console.status("[bold green]Starting ..."): + case_query = get_case_list(config, project_uuid) + console.log("Getting cases from project [bold green]done[/bold green]") + + tasks = [ + f"Starting query for [bold]{case_query[n]['name']}[/bold] ({n})" for n in case_query.keys() + ] + with console.status("[bold green]Starting queries ..."): + for case_uuid in case_query.keys(): + rich_query_start = tasks.pop(0) + query_uuid = run_query( + config, + ENDPOINT_SM_SETTINGS, + ENDPOINT_SM_LISTCREATE_QUERY, + case_uuid, + gene, + region, + quick_preset, + inheritance, + frequency, + impact, + verbose, + ) + if not query_uuid: + console.log(f"{rich_query_start} [bold red]failed[/bold red]") + continue + query_results[query_uuid] = { + "running": True, + "state": "initial", + "case_uuid": case_uuid, + "logs": [], + } + case_query[case_uuid]["query"] = query_uuid + console.log(f"{rich_query_start} [bold green]done[/bold green]") + + with console.status("[bold green]Waiting for queries to finish ..."): + while True: + polls_running = poll_queries(config, ENDPOINT_SM_RETRIEVE_QUERY, query_results) + if not polls_running: + break + time.sleep(SLEEP_POLL) + + if verbose: + with open("query_logs.json", "w") as fh: + json.dump(query_results, fh, indent=1) + + download_uuids = {} + tasks = [ + f"Starting generation of export file for [bold]{case_query[query_results[n]['case_uuid']]['name']}[/bold] ({n})" + for n in query_results.keys() + ] + with console.status("[bold green]Starting generation of export files ..."): + for query_uuid, data in query_results.items(): + if data["state"] == "done": + download_uuid = download_generate(config, query_uuid, export_format) + if not download_uuid: + console.log(f"{tasks.pop(0)} [bold red]failed[/bold red]") + continue + download_uuids[download_uuid] = case_query[data["case_uuid"]]["name"] + console.log(f"{tasks.pop(0)} [bold green]done[/bold green]") + else: + console.log(f"{tasks.pop(0)} [bold red]failed[/bold red]") + + downloads_running = [True] * len(download_uuids) + tasks = [f"Downloading file for [bold]{n}[/bold]" for n in download_uuids.values()] + with console.status("[bold green]Waiting for downloads to finish ..."): + while any(downloads_running): + for i, download_uuid in enumerate(download_uuids): + downloads_running[i] = download_status(config, download_uuid) == "running" + time.sleep(SLEEP_POLL) + + for download_uuid, name in download_uuids.items(): + download_serve(config, download_uuid, f"{name}.{export_format}") + console.log(f"{tasks.pop(0)} [bold green]done[/bold green]") + console.log(":heavy_check_mark: [bold green]All done[/bold green]") + + +if __name__ == "__main__": + main() diff --git a/variants/file_export.py b/variants/file_export.py index 8b9d43838..f015d5233 100644 --- a/variants/file_export.py +++ b/variants/file_export.py @@ -653,8 +653,6 @@ def _write_comment_sheet(self): row = [ comment.chromosome, comment.start, - comment.end, - comment.bin, comment.reference, comment.alternative, comment.date_created, @@ -663,7 +661,7 @@ def _write_comment_sheet(self): ] if self.project_or_cohort: row.insert(0, case.name) - self.variant_sheet.write_row(offset, 0, row) + self.comment_sheet.write_row(offset, 0, row) offset += 1 def _write_metadata_sheet(self): diff --git a/variants/serializers/__init__.py b/variants/serializers/__init__.py index bdae1c874..aef648d12 100644 --- a/variants/serializers/__init__.py +++ b/variants/serializers/__init__.py @@ -81,7 +81,7 @@ def _check_gene_list_found(gene_list, label): # Validate HPO term list. if "prio_hpo_terms" in query_settings: missing = [] - for term in query_settings["prio_hpo_terms"]: + for term in query_settings["prio_hpo_terms"] or []: if term.startswith("HP"): if not HpoName.objects.filter(hpo_id=term).exists(): missing.append(term) diff --git a/variants/utils.py b/variants/utils.py index 0e3a10d72..11b158b18 100644 --- a/variants/utils.py +++ b/variants/utils.py @@ -285,17 +285,15 @@ def _perform_create(obj): for result_row in result_rows: duplicates.append( { - { - "case_uuid": str(case.sodar_uuid), - "case_name": case.name, - "project": case.project.full_title, - "chromosome": result_row.chromosome, - "start": result_row.start, - "end": result_row.end, - "json": json.dumps( - model_to_dict(result_row, exclude=("id",)), cls=UUIDEncoder - ), - } + "case_uuid": str(case.sodar_uuid), + "case_name": case.name, + "project": case.project.full_title, + "chromosome": result_row.chromosome, + "start": result_row.start, + "end": result_row.end, + "json": json.dumps( + model_to_dict(result_row, exclude=("id",)), cls=UUIDEncoder + ), } ) diff --git a/variants/views/api/__init__.py b/variants/views/api/__init__.py index 29681e9a0..52452dbee 100644 --- a/variants/views/api/__init__.py +++ b/variants/views/api/__init__.py @@ -845,11 +845,17 @@ def get(self, request, *args, **kwargs): if self.request.get_full_path() == reverse( "variants:ajax-query-case-download-generate-tsv", kwargs={"smallvariantquery": query.sodar_uuid}, + ) or self.request.get_full_path() == reverse( + "variants:api-query-case-download-generate-tsv", + kwargs={"smallvariantquery": query.sodar_uuid}, ): file_type = "tsv" elif self.request.get_full_path() == reverse( "variants:ajax-query-case-download-generate-vcf", kwargs={"smallvariantquery": query.sodar_uuid}, + ) or self.request.get_full_path() == reverse( + "variants:api-query-case-download-generate-vcf", + kwargs={"smallvariantquery": query.sodar_uuid}, ): file_type = "vcf" else: