From 6231fee06bc29bfb86bed50699ef131abfc9cbc4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 17:09:50 +0000 Subject: [PATCH 1/8] Bump gitpython from 3.1.40 to 3.1.41 Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.40 to 3.1.41. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.40...3.1.41) --- updated-dependencies: - dependency-name: gitpython dependency-type: indirect ... Signed-off-by: dependabot[bot] --- Pipfile.lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Pipfile.lock b/Pipfile.lock index bfcf7485b0..d770f49e25 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1735,11 +1735,12 @@ }, "gitpython": { "hashes": [ - "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4", - "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a" + "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c", + "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==3.1.40" + "version": "==3.1.41" }, "idna": { "hashes": [ From 50420f92bdef781fb6e70997fd827f7cd23444d9 Mon Sep 17 00:00:00 2001 From: Gurdeep Atwal Date: Tue, 16 Jan 2024 14:55:19 +0000 Subject: [PATCH 2/8] add new property is_query_closed --- Pipfile | 1 + Pipfile.lock | 359 +++++++++++----------- api/cases/models.py | 6 + api/cases/serializers.py | 3 + api/cases/tests/test_case_ecju_queries.py | 4 + api/cases/tests/test_case_search.py | 1 + 6 files changed, 199 insertions(+), 175 deletions(-) diff --git a/Pipfile b/Pipfile index ba912079a4..20e0abba98 100644 --- a/Pipfile +++ b/Pipfile @@ -71,6 +71,7 @@ redis = "~=4.4.4" psycopg2-binary = "~=2.9.3" django-test-migrations = "~=1.2.0" django-silk = "~=5.0.3" +django-queryable-properties = "~=1.9.1" django = "~=3.2.23" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index bfcf7485b0..d2c78d0556 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "526d26de3ce5e9d634792a3a8ae78a9aa396fbabf0986b3e1c48bbc9a8cc0832" + "sha256": "7cdb730062d63ff8d4f696dcb957ede19f04045023a27dcd633e67bc67e77195" }, "pipfile-spec": 6, "requires": { @@ -124,20 +124,20 @@ }, "celery": { "hashes": [ - "sha256:30b75ac60fb081c2d9f8881382c148ed7c9052031a75a1e8743ff4b4b071f184", - "sha256:6b65d8dd5db499dd6190c45aa6398e171b99592f2af62c312f7391587feb5458" + "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9", + "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.3.5" + "version": "==5.3.6" }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "cffi": { "hashes": [ @@ -326,33 +326,33 @@ }, "cryptography": { "hashes": [ - "sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596", - "sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c", - "sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660", - "sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4", - "sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead", - "sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed", - "sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3", - "sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7", - "sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09", - "sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c", - "sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43", - "sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65", - "sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6", - "sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da", - "sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c", - "sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b", - "sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8", - "sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c", - "sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d", - "sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9", - "sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86", - "sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36", - "sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae" + "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", + "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", + "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", + "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", + "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", + "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", + "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", + "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", + "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", + "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", + "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", + "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", + "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", + "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", + "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", + "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", + "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", + "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", + "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", + "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", + "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", + "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", + "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==41.0.6" + "version": "==41.0.7" }, "cssselect2": { "hashes": [ @@ -527,6 +527,14 @@ "markers": "python_version >= '3.7'", "version": "==6.4.0" }, + "django-queryable-properties": { + "hashes": [ + "sha256:46417da16e49640d0f1ae910eca3bb0424904f27aae2c6ac4644560fba1a9fd2", + "sha256:594df5024e534f7cd92e41e2461faebf9588a5729e3ff782e8219c9df4604d79" + ], + "index": "pypi", + "version": "==1.9.1" + }, "django-silk": { "hashes": [ "sha256:8cbfbc647d182527726d8d52d3fcfa193f4d250f21406c3fb1062efa6fb95c63", @@ -719,66 +727,67 @@ }, "greenlet": { "hashes": [ - "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174", - "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd", - "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa", - "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a", - "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec", - "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565", - "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d", - "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c", - "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234", - "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d", - "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546", - "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2", - "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74", - "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de", - "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd", - "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9", - "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3", - "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846", - "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2", - "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353", - "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8", - "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166", - "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206", - "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b", - "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d", - "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe", - "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997", - "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445", - "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0", - "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96", - "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884", - "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6", - "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1", - "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619", - "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94", - "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4", - "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1", - "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63", - "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd", - "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a", - "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376", - "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57", - "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16", - "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e", - "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc", - "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a", - "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c", - "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5", - "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a", - "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72", - "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9", - "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9", - "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e", - "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8", - "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65", - "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064", - "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36" + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "markers": "python_version < '3.11' and platform_python_implementation == 'CPython'", - "version": "==3.0.1" + "version": "==3.0.3" }, "gunicorn": { "hashes": [ @@ -799,19 +808,19 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "importlib-metadata": { "hashes": [ - "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", - "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743" + "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e", + "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc" ], "markers": "python_version < '3.10'", - "version": "==6.8.0" + "version": "==7.0.1" }, "ipython": { "hashes": [ @@ -847,11 +856,11 @@ }, "kombu": { "hashes": [ - "sha256:1491df826cfc5178c80f3e89dd6dfba68e484ef334db81070eb5cb8094b31167", - "sha256:6cd5c5d5ef77538434b8f81f3e265c414269418645dbb47dbf130a8a05c3e357" + "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488", + "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93" ], "markers": "python_version >= '3.8'", - "version": "==5.3.3" + "version": "==5.3.5" }, "kubi-ecs-logger": { "hashes": [ @@ -944,19 +953,19 @@ }, "pexpect": { "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], "markers": "sys_platform != 'win32'", - "version": "==4.8.0" + "version": "==4.9.0" }, "phonenumbers": { "hashes": [ - "sha256:4ae2d2e253a4752a269ae1147822b9aa500f14b2506a91f884e68b136901f128", - "sha256:7a57cceb8145d3099a0cda7a1f2581b6829936069224790be5de0adf14b39f13" + "sha256:ad7bc7d7fd6599a124423ffb840409630777c72d0ee58ba8070cc8e7efcb4c38", + "sha256:e22f276b0c4a70bd5b3f6d668d19cab2578f660b8df44d6418f81d64320151b9" ], "index": "pypi", - "version": "==8.13.25" + "version": "==8.13.28" }, "pickleshare": { "hashes": [ @@ -1027,11 +1036,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0", - "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2" + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.41" + "version": "==3.0.43" }, "psycopg2-binary": { "hashes": [ @@ -1136,11 +1145,11 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "pyjwt": { "hashes": [ @@ -1242,11 +1251,11 @@ }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -1298,27 +1307,27 @@ }, "traitlets": { "hashes": [ - "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", - "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" + "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", + "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" ], "markers": "python_version >= '3.8'", - "version": "==5.13.0" + "version": "==5.14.1" }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "tzdata": { "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", + "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" ], "markers": "python_version >= '2'", - "version": "==2023.3" + "version": "==2023.4" }, "unittest-xml-reporting": { "hashes": [ @@ -1346,10 +1355,10 @@ }, "wcwidth": { "hashes": [ - "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97", - "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f" + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" ], - "version": "==0.2.10" + "version": "==0.2.13" }, "weasyprint": { "hashes": [ @@ -1508,11 +1517,11 @@ }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "charset-normalizer": { "hashes": [ @@ -1710,11 +1719,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", - "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.3" + "version": "==1.2.0" }, "freezegun": { "hashes": [ @@ -1735,19 +1744,19 @@ }, "gitpython": { "hashes": [ - "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4", - "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a" + "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c", + "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048" ], "markers": "python_version >= '3.7'", - "version": "==3.1.40" + "version": "==3.1.41" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "iniconfig": { "hashes": [ @@ -1935,10 +1944,10 @@ }, "parse": { "hashes": [ - "sha256:371ed3800dc63983832159cc9373156613947707bc448b5215473a219dbd4362", - "sha256:cc3a47236ff05da377617ddefa867b7ba983819c664e1afe46249e5b469be464" + "sha256:5e171b001452fa9f004c5a58a93525175468daf69b493e9fa915347ed7ff6968", + "sha256:bd28bae37714b45d5894d77160a16e2be36b64a3b618c81168b3684676aa498b" ], - "version": "==1.19.1" + "version": "==1.20.0" }, "parse-type": { "hashes": [ @@ -1958,11 +1967,11 @@ }, "pathspec": { "hashes": [ - "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.2" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "pbr": { "hashes": [ @@ -1981,11 +1990,11 @@ }, "pexpect": { "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], "markers": "sys_platform != 'win32'", - "version": "==4.8.0" + "version": "==4.9.0" }, "pickleshare": { "hashes": [ @@ -1996,11 +2005,11 @@ }, "platformdirs": { "hashes": [ - "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", - "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731" + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" ], - "markers": "python_version >= '3.7'", - "version": "==4.0.0" + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "pluggy": { "hashes": [ @@ -2012,11 +2021,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0", - "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2" + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.41" + "version": "==3.0.43" }, "prospector": { "hashes": [ @@ -2058,11 +2067,11 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "pylint": { "hashes": [ @@ -2109,21 +2118,21 @@ }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==7.4.3" + "version": "==7.4.4" }, "pytest-bdd": { "hashes": [ - "sha256:7e677f1d0ad8d9fc37254c98e36a5b2c1afde095d09ff790ae8b1fd75b41bb32", - "sha256:cb11e33b4419bd281cd6f74027c0b1eedeaf8f8d187edc897b4a61ae976ef9f1" + "sha256:652d9c5324076ed9348f1c69b6512c00c581708ff17f063771ea703b62d3b956", + "sha256:faf115b9de793dc2341e898347f936c3766179a54a018c132796302b120918e5" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==7.0.0" + "version": "==7.0.1" }, "pytest-circleci-parallelized": { "hashes": [ @@ -2247,11 +2256,11 @@ }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -2294,19 +2303,19 @@ }, "traitlets": { "hashes": [ - "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", - "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" + "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", + "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" ], "markers": "python_version >= '3.8'", - "version": "==5.13.0" + "version": "==5.14.1" }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "urllib3": { "hashes": [ @@ -2354,10 +2363,10 @@ }, "wcwidth": { "hashes": [ - "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97", - "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f" + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" ], - "version": "==0.2.10" + "version": "==0.2.13" }, "wrapt": { "hashes": [ diff --git a/api/cases/models.py b/api/cases/models.py index 22561adfb6..48e984b328 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -9,6 +9,8 @@ from django.utils import timezone from rest_framework.exceptions import ValidationError +from queryable_properties.properties import queryable_property + from api.audit_trail.enums import AuditType from api.cases.enums import ( AdviceType, @@ -612,6 +614,10 @@ class EcjuQuery(TimestampableModel): choices=ECJUQueryType.choices, max_length=50, default=ECJUQueryType.ECJU, null=False, blank=False ) + @queryable_property + def is_query_closed(self): + return self.responded_at is not None + notifications = GenericRelation(ExporterNotification, related_query_name="ecju_query") def save(self, *args, **kwargs): diff --git a/api/cases/serializers.py b/api/cases/serializers.py index b7d810dcf2..3a435313c3 100644 --- a/api/cases/serializers.py +++ b/api/cases/serializers.py @@ -229,6 +229,7 @@ class ECJUQuerySummarySerializer(serializers.Serializer): raised_by_user = serializers.SerializerMethodField() responded_by_user = serializers.SerializerMethodField() query_type = serializers.CharField() + is_query_closed = serializers.BooleanField() def _user_name(self, user): if not user: @@ -573,6 +574,7 @@ class Meta: "responded_at", "query_type", "documents", + "is_query_closed", ) def get_raised_by_user_name(self, instance): @@ -610,6 +612,7 @@ class Meta: "created_at", "responded_at", "documents", + "is_query_closed", ) def get_responded_by_user(self, instance): diff --git a/api/cases/tests/test_case_ecju_queries.py b/api/cases/tests/test_case_ecju_queries.py index efdc128add..54732f743b 100644 --- a/api/cases/tests/test_case_ecju_queries.py +++ b/api/cases/tests/test_case_ecju_queries.py @@ -118,6 +118,7 @@ def test_correct_ecju_query_details_are_returned_to_exporter_user(self): self.assertEqual(returned_ecju_query_1.get("question"), "ECJU Query 1") self.assertEqual(returned_ecju_query_1.get("response"), None) self.assertEqual(returned_ecju_query_1.get("team")["name"], self.ecju_query_1.team.name) + self.assertEqual(returned_ecju_query_1.get("is_query_closed"), self.ecju_query_1.is_query_closed) # We can't predict exactly when the query is created so we settle for the fact that its set self.assertIsNotNone(returned_ecju_query_1.get("created_at")) @@ -125,6 +126,7 @@ def test_correct_ecju_query_details_are_returned_to_exporter_user(self): self.assertEqual(returned_ecju_query_2.get("question"), "ECJU Query 2") self.assertEqual(returned_ecju_query_2.get("response"), "I have a response") self.assertEqual(returned_ecju_query_2.get("team")["name"], self.ecju_query_2.team.name) + self.assertEqual(returned_ecju_query_2.get("is_query_closed"), self.ecju_query_2.is_query_closed) # We can't predict exactly when the query is created so we settle for the fact that its set self.assertIsNotNone(returned_ecju_query_1.get("created_at")) @@ -166,6 +168,7 @@ def test_gov_user_can_get_an_individual_ecju_query(self): self.assertEqual(str(ecju_query.question), response_data["ecju_query"]["question"]) self.assertEqual(ecju_query.response, None) self.assertEqual(str(ecju_query.case.id), response_data["ecju_query"]["case"]) + self.assertEqual(ecju_query.is_query_closed, response_data["ecju_query"]["is_query_closed"]) def test_ecju_query_open_query_count(self): """ @@ -260,6 +263,7 @@ def test_gov_user_can_create_ecju_queries(self, query_type, mock_notify): self.assertEqual(status.HTTP_201_CREATED, response.status_code) self.assertEqual(response_data["ecju_query_id"], str(ecju_query.id)) self.assertEqual("Test ECJU Query question?", ecju_query.question) + self.assertEqual(False, ecju_query.is_query_closed) mock_notify.assert_called_with(case.id) diff --git a/api/cases/tests/test_case_search.py b/api/cases/tests/test_case_search.py index a2914cee32..5a967a7fa5 100644 --- a/api/cases/tests/test_case_search.py +++ b/api/cases/tests/test_case_search.py @@ -1118,6 +1118,7 @@ def test_api_success(self): "raised_by_user": f"{self.ecju_query.raised_by_user.first_name} {self.ecju_query.raised_by_user.last_name}", "responded_by_user": f"{self.ecju_query.responded_by_user.first_name} {self.ecju_query.responded_by_user.last_name}", "query_type": self.ecju_query.query_type, + "is_query_closed": self.ecju_query.is_query_closed, } ], ) From 41acc15947479120809c3cf3a5847d55475cd3b6 Mon Sep 17 00:00:00 2001 From: Gurdeep Atwal Date: Tue, 16 Jan 2024 14:55:19 +0000 Subject: [PATCH 3/8] add new property is_query_closed --- Pipfile | 2 + Pipfile.lock | 359 +++++++++++----------- api/cases/models.py | 18 ++ api/cases/serializers.py | 3 + api/cases/tests/test_case_ecju_queries.py | 47 +-- api/cases/tests/test_case_search.py | 1 + api/cases/views/views.py | 6 +- 7 files changed, 225 insertions(+), 211 deletions(-) diff --git a/Pipfile b/Pipfile index ba912079a4..0487e64350 100644 --- a/Pipfile +++ b/Pipfile @@ -71,8 +71,10 @@ redis = "~=4.4.4" psycopg2-binary = "~=2.9.3" django-test-migrations = "~=1.2.0" django-silk = "~=5.0.3" +django-queryable-properties = "~=1.9.1" django = "~=3.2.23" + [requires] python_version = "3.8" python_full_version = "3.8.18" diff --git a/Pipfile.lock b/Pipfile.lock index bfcf7485b0..d2c78d0556 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "526d26de3ce5e9d634792a3a8ae78a9aa396fbabf0986b3e1c48bbc9a8cc0832" + "sha256": "7cdb730062d63ff8d4f696dcb957ede19f04045023a27dcd633e67bc67e77195" }, "pipfile-spec": 6, "requires": { @@ -124,20 +124,20 @@ }, "celery": { "hashes": [ - "sha256:30b75ac60fb081c2d9f8881382c148ed7c9052031a75a1e8743ff4b4b071f184", - "sha256:6b65d8dd5db499dd6190c45aa6398e171b99592f2af62c312f7391587feb5458" + "sha256:870cc71d737c0200c397290d730344cc991d13a057534353d124c9380267aab9", + "sha256:9da4ea0118d232ce97dff5ed4974587fb1c0ff5c10042eb15278487cdd27d1af" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==5.3.5" + "version": "==5.3.6" }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "cffi": { "hashes": [ @@ -326,33 +326,33 @@ }, "cryptography": { "hashes": [ - "sha256:068bc551698c234742c40049e46840843f3d98ad7ce265fd2bd4ec0d11306596", - "sha256:0f27acb55a4e77b9be8d550d762b0513ef3fc658cd3eb15110ebbcbd626db12c", - "sha256:2132d5865eea673fe6712c2ed5fb4fa49dba10768bb4cc798345748380ee3660", - "sha256:3288acccef021e3c3c10d58933f44e8602cf04dba96d9796d70d537bb2f4bbc4", - "sha256:35f3f288e83c3f6f10752467c48919a7a94b7d88cc00b0668372a0d2ad4f8ead", - "sha256:398ae1fc711b5eb78e977daa3cbf47cec20f2c08c5da129b7a296055fbb22aed", - "sha256:422e3e31d63743855e43e5a6fcc8b4acab860f560f9321b0ee6269cc7ed70cc3", - "sha256:48783b7e2bef51224020efb61b42704207dde583d7e371ef8fc2a5fb6c0aabc7", - "sha256:4d03186af98b1c01a4eda396b137f29e4e3fb0173e30f885e27acec8823c1b09", - "sha256:5daeb18e7886a358064a68dbcaf441c036cbdb7da52ae744e7b9207b04d3908c", - "sha256:60e746b11b937911dc70d164060d28d273e31853bb359e2b2033c9e93e6f3c43", - "sha256:742ae5e9a2310e9dade7932f9576606836ed174da3c7d26bc3d3ab4bd49b9f65", - "sha256:7e00fb556bda398b99b0da289ce7053639d33b572847181d6483ad89835115f6", - "sha256:85abd057699b98fce40b41737afb234fef05c67e116f6f3650782c10862c43da", - "sha256:8efb2af8d4ba9dbc9c9dd8f04d19a7abb5b49eab1f3694e7b5a16a5fc2856f5c", - "sha256:ae236bb8760c1e55b7a39b6d4d32d2279bc6c7c8500b7d5a13b6fb9fc97be35b", - "sha256:afda76d84b053923c27ede5edc1ed7d53e3c9f475ebaf63c68e69f1403c405a8", - "sha256:b27a7fd4229abef715e064269d98a7e2909ebf92eb6912a9603c7e14c181928c", - "sha256:b648fe2a45e426aaee684ddca2632f62ec4613ef362f4d681a9a6283d10e079d", - "sha256:c5a550dc7a3b50b116323e3d376241829fd326ac47bc195e04eb33a8170902a9", - "sha256:da46e2b5df770070412c46f87bac0849b8d685c5f2679771de277a422c7d0b86", - "sha256:f39812f70fc5c71a15aa3c97b2bbe213c3f2a460b79bd21c40d033bb34a9bf36", - "sha256:ff369dd19e8fe0528b02e8df9f2aeb2479f89b1270d90f96a63500afe9af5cae" + "sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960", + "sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a", + "sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc", + "sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a", + "sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf", + "sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1", + "sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39", + "sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406", + "sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a", + "sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a", + "sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c", + "sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be", + "sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15", + "sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2", + "sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d", + "sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157", + "sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003", + "sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248", + "sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a", + "sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec", + "sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309", + "sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7", + "sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==41.0.6" + "version": "==41.0.7" }, "cssselect2": { "hashes": [ @@ -527,6 +527,14 @@ "markers": "python_version >= '3.7'", "version": "==6.4.0" }, + "django-queryable-properties": { + "hashes": [ + "sha256:46417da16e49640d0f1ae910eca3bb0424904f27aae2c6ac4644560fba1a9fd2", + "sha256:594df5024e534f7cd92e41e2461faebf9588a5729e3ff782e8219c9df4604d79" + ], + "index": "pypi", + "version": "==1.9.1" + }, "django-silk": { "hashes": [ "sha256:8cbfbc647d182527726d8d52d3fcfa193f4d250f21406c3fb1062efa6fb95c63", @@ -719,66 +727,67 @@ }, "greenlet": { "hashes": [ - "sha256:0a02d259510b3630f330c86557331a3b0e0c79dac3d166e449a39363beaae174", - "sha256:0b6f9f8ca7093fd4433472fd99b5650f8a26dcd8ba410e14094c1e44cd3ceddd", - "sha256:100f78a29707ca1525ea47388cec8a049405147719f47ebf3895e7509c6446aa", - "sha256:1757936efea16e3f03db20efd0cd50a1c86b06734f9f7338a90c4ba85ec2ad5a", - "sha256:19075157a10055759066854a973b3d1325d964d498a805bb68a1f9af4aaef8ec", - "sha256:19bbdf1cce0346ef7341705d71e2ecf6f41a35c311137f29b8a2dc2341374565", - "sha256:20107edf7c2c3644c67c12205dc60b1bb11d26b2610b276f97d666110d1b511d", - "sha256:22f79120a24aeeae2b4471c711dcf4f8c736a2bb2fabad2a67ac9a55ea72523c", - "sha256:2847e5d7beedb8d614186962c3d774d40d3374d580d2cbdab7f184580a39d234", - "sha256:28e89e232c7593d33cac35425b58950789962011cc274aa43ef8865f2e11f46d", - "sha256:329c5a2e5a0ee942f2992c5e3ff40be03e75f745f48847f118a3cfece7a28546", - "sha256:337322096d92808f76ad26061a8f5fccb22b0809bea39212cd6c406f6a7060d2", - "sha256:3fcc780ae8edbb1d050d920ab44790201f027d59fdbd21362340a85c79066a74", - "sha256:41bdeeb552d814bcd7fb52172b304898a35818107cc8778b5101423c9017b3de", - "sha256:4eddd98afc726f8aee1948858aed9e6feeb1758889dfd869072d4465973f6bfd", - "sha256:52e93b28db27ae7d208748f45d2db8a7b6a380e0d703f099c949d0f0d80b70e9", - "sha256:55d62807f1c5a1682075c62436702aaba941daa316e9161e4b6ccebbbf38bda3", - "sha256:5805e71e5b570d490938d55552f5a9e10f477c19400c38bf1d5190d760691846", - "sha256:599daf06ea59bfedbec564b1692b0166a0045f32b6f0933b0dd4df59a854caf2", - "sha256:60d5772e8195f4e9ebf74046a9121bbb90090f6550f81d8956a05387ba139353", - "sha256:696d8e7d82398e810f2b3622b24e87906763b6ebfd90e361e88eb85b0e554dc8", - "sha256:6e6061bf1e9565c29002e3c601cf68569c450be7fc3f7336671af7ddb4657166", - "sha256:80ac992f25d10aaebe1ee15df45ca0d7571d0f70b645c08ec68733fb7a020206", - "sha256:816bd9488a94cba78d93e1abb58000e8266fa9cc2aa9ccdd6eb0696acb24005b", - "sha256:85d2b77e7c9382f004b41d9c72c85537fac834fb141b0296942d52bf03fe4a3d", - "sha256:87c8ceb0cf8a5a51b8008b643844b7f4a8264a2c13fcbcd8a8316161725383fe", - "sha256:89ee2e967bd7ff85d84a2de09df10e021c9b38c7d91dead95b406ed6350c6997", - "sha256:8bef097455dea90ffe855286926ae02d8faa335ed8e4067326257cb571fc1445", - "sha256:8d11ebbd679e927593978aa44c10fc2092bc454b7d13fdc958d3e9d508aba7d0", - "sha256:91e6c7db42638dc45cf2e13c73be16bf83179f7859b07cfc139518941320be96", - "sha256:97e7ac860d64e2dcba5c5944cfc8fa9ea185cd84061c623536154d5a89237884", - "sha256:990066bff27c4fcf3b69382b86f4c99b3652bab2a7e685d968cd4d0cfc6f67c6", - "sha256:9fbc5b8f3dfe24784cee8ce0be3da2d8a79e46a276593db6868382d9c50d97b1", - "sha256:ac4a39d1abae48184d420aa8e5e63efd1b75c8444dd95daa3e03f6c6310e9619", - "sha256:b2c02d2ad98116e914d4f3155ffc905fd0c025d901ead3f6ed07385e19122c94", - "sha256:b2d3337dcfaa99698aa2377c81c9ca72fcd89c07e7eb62ece3f23a3fe89b2ce4", - "sha256:b489c36d1327868d207002391f662a1d163bdc8daf10ab2e5f6e41b9b96de3b1", - "sha256:b641161c302efbb860ae6b081f406839a8b7d5573f20a455539823802c655f63", - "sha256:b8ba29306c5de7717b5761b9ea74f9c72b9e2b834e24aa984da99cbfc70157fd", - "sha256:b9934adbd0f6e476f0ecff3c94626529f344f57b38c9a541f87098710b18af0a", - "sha256:ce85c43ae54845272f6f9cd8320d034d7a946e9773c693b27d620edec825e376", - "sha256:cf868e08690cb89360eebc73ba4be7fb461cfbc6168dd88e2fbbe6f31812cd57", - "sha256:d2905ce1df400360463c772b55d8e2518d0e488a87cdea13dd2c71dcb2a1fa16", - "sha256:d57e20ba591727da0c230ab2c3f200ac9d6d333860d85348816e1dca4cc4792e", - "sha256:d6a8c9d4f8692917a3dc7eb25a6fb337bff86909febe2f793ec1928cd97bedfc", - "sha256:d923ff276f1c1f9680d32832f8d6c040fe9306cbfb5d161b0911e9634be9ef0a", - "sha256:daa7197b43c707462f06d2c693ffdbb5991cbb8b80b5b984007de431493a319c", - "sha256:dbd4c177afb8a8d9ba348d925b0b67246147af806f0b104af4d24f144d461cd5", - "sha256:dc4d815b794fd8868c4d67602692c21bf5293a75e4b607bb92a11e821e2b859a", - "sha256:e9d21aaa84557d64209af04ff48e0ad5e28c5cca67ce43444e939579d085da72", - "sha256:ea6b8aa9e08eea388c5f7a276fabb1d4b6b9d6e4ceb12cc477c3d352001768a9", - "sha256:eabe7090db68c981fca689299c2d116400b553f4b713266b130cfc9e2aa9c5a9", - "sha256:f2f6d303f3dee132b322a14cd8765287b8f86cdc10d2cb6a6fae234ea488888e", - "sha256:f33f3258aae89da191c6ebaa3bc517c6c4cbc9b9f689e5d8452f7aedbb913fa8", - "sha256:f7bfb769f7efa0eefcd039dd19d843a4fbfbac52f1878b1da2ed5793ec9b1a65", - "sha256:f89e21afe925fcfa655965ca8ea10f24773a1791400989ff32f467badfe4a064", - "sha256:fa24255ae3c0ab67e613556375a4341af04a084bd58764731972bcbc8baeba36" + "sha256:01bc7ea167cf943b4c802068e178bbf70ae2e8c080467070d01bfa02f337ee67", + "sha256:0448abc479fab28b00cb472d278828b3ccca164531daab4e970a0458786055d6", + "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257", + "sha256:098d86f528c855ead3479afe84b49242e174ed262456c342d70fc7f972bc13c4", + "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676", + "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61", + "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc", + "sha256:1996cb9306c8595335bb157d133daf5cf9f693ef413e7673cb07e3e5871379ca", + "sha256:1a7191e42732df52cb5f39d3527217e7ab73cae2cb3694d241e18f53d84ea9a7", + "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728", + "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305", + "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6", + "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379", + "sha256:2dd6e660effd852586b6a8478a1d244b8dc90ab5b1321751d2ea15deb49ed414", + "sha256:3ddc0f794e6ad661e321caa8d2f0a55ce01213c74722587256fb6566049a8b04", + "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a", + "sha256:419b386f84949bf0e7c73e6032e3457b82a787c1ab4a0e43732898a761cc9dbf", + "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491", + "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559", + "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e", + "sha256:5b51e85cb5ceda94e79d019ed36b35386e8c37d22f07d6a751cb659b180d5274", + "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb", + "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b", + "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9", + "sha256:6b66c9c1e7ccabad3a7d037b2bcb740122a7b17a53734b7d72a344ce39882a1b", + "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be", + "sha256:7170375bcc99f1a2fbd9c306f5be8764eaf3ac6b5cb968862cad4c7057756506", + "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405", + "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113", + "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f", + "sha256:81bb9c6d52e8321f09c3d165b2a78c680506d9af285bfccbad9fb7ad5a5da3e5", + "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230", + "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d", + "sha256:99bf650dc5d69546e076f413a87481ee1d2d09aaaaaca058c9251b6d8c14783f", + "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a", + "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e", + "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61", + "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6", + "sha256:b542be2440edc2d48547b5923c408cbe0fc94afb9f18741faa6ae970dbcb9b6d", + "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71", + "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22", + "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2", + "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3", + "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067", + "sha256:c9db1c18f0eaad2f804728c67d6c610778456e3e1cc4ab4bbd5eeb8e6053c6fc", + "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881", + "sha256:d46677c85c5ba00a9cb6f7a00b2bfa6f812192d2c9f7d9c4f6a55b60216712f3", + "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e", + "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac", + "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53", + "sha256:daf3cb43b7cf2ba96d614252ce1684c1bccee6b2183a01328c98d36fcd7d5cb0", + "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b", + "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83", + "sha256:e1f145462f1fa6e4a4ae3c0f782e580ce44d57c8f2c7aae1b6fa88c0b2efdb41", + "sha256:e3391d1e16e2a5a1507d83e4a8b100f4ee626e8eca43cf2cadb543de69827c4c", + "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf", + "sha256:fd096eb7ffef17c456cfa587523c5f92321ae02427ff955bebe9e3c63bc9f0da", + "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33" ], "markers": "python_version < '3.11' and platform_python_implementation == 'CPython'", - "version": "==3.0.1" + "version": "==3.0.3" }, "gunicorn": { "hashes": [ @@ -799,19 +808,19 @@ }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "importlib-metadata": { "hashes": [ - "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb", - "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743" + "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e", + "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc" ], "markers": "python_version < '3.10'", - "version": "==6.8.0" + "version": "==7.0.1" }, "ipython": { "hashes": [ @@ -847,11 +856,11 @@ }, "kombu": { "hashes": [ - "sha256:1491df826cfc5178c80f3e89dd6dfba68e484ef334db81070eb5cb8094b31167", - "sha256:6cd5c5d5ef77538434b8f81f3e265c414269418645dbb47dbf130a8a05c3e357" + "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488", + "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93" ], "markers": "python_version >= '3.8'", - "version": "==5.3.3" + "version": "==5.3.5" }, "kubi-ecs-logger": { "hashes": [ @@ -944,19 +953,19 @@ }, "pexpect": { "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], "markers": "sys_platform != 'win32'", - "version": "==4.8.0" + "version": "==4.9.0" }, "phonenumbers": { "hashes": [ - "sha256:4ae2d2e253a4752a269ae1147822b9aa500f14b2506a91f884e68b136901f128", - "sha256:7a57cceb8145d3099a0cda7a1f2581b6829936069224790be5de0adf14b39f13" + "sha256:ad7bc7d7fd6599a124423ffb840409630777c72d0ee58ba8070cc8e7efcb4c38", + "sha256:e22f276b0c4a70bd5b3f6d668d19cab2578f660b8df44d6418f81d64320151b9" ], "index": "pypi", - "version": "==8.13.25" + "version": "==8.13.28" }, "pickleshare": { "hashes": [ @@ -1027,11 +1036,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0", - "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2" + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.41" + "version": "==3.0.43" }, "psycopg2-binary": { "hashes": [ @@ -1136,11 +1145,11 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "pyjwt": { "hashes": [ @@ -1242,11 +1251,11 @@ }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -1298,27 +1307,27 @@ }, "traitlets": { "hashes": [ - "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", - "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" + "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", + "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" ], "markers": "python_version >= '3.8'", - "version": "==5.13.0" + "version": "==5.14.1" }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "tzdata": { "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" + "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3", + "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9" ], "markers": "python_version >= '2'", - "version": "==2023.3" + "version": "==2023.4" }, "unittest-xml-reporting": { "hashes": [ @@ -1346,10 +1355,10 @@ }, "wcwidth": { "hashes": [ - "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97", - "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f" + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" ], - "version": "==0.2.10" + "version": "==0.2.13" }, "weasyprint": { "hashes": [ @@ -1508,11 +1517,11 @@ }, "certifi": { "hashes": [ - "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082", - "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9" + "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1", + "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474" ], "markers": "python_version >= '3.6'", - "version": "==2023.7.22" + "version": "==2023.11.17" }, "charset-normalizer": { "hashes": [ @@ -1710,11 +1719,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9", - "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3" + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" ], "markers": "python_version < '3.11'", - "version": "==1.1.3" + "version": "==1.2.0" }, "freezegun": { "hashes": [ @@ -1735,19 +1744,19 @@ }, "gitpython": { "hashes": [ - "sha256:22b126e9ffb671fdd0c129796343a02bf67bf2994b35449ffc9321aa755e18a4", - "sha256:cf14627d5a8049ffbf49915732e5eddbe8134c3bdb9d476e6182b676fc573f8a" + "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c", + "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048" ], "markers": "python_version >= '3.7'", - "version": "==3.1.40" + "version": "==3.1.41" }, "idna": { "hashes": [ - "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4", - "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" ], "markers": "python_version >= '3.5'", - "version": "==3.4" + "version": "==3.6" }, "iniconfig": { "hashes": [ @@ -1935,10 +1944,10 @@ }, "parse": { "hashes": [ - "sha256:371ed3800dc63983832159cc9373156613947707bc448b5215473a219dbd4362", - "sha256:cc3a47236ff05da377617ddefa867b7ba983819c664e1afe46249e5b469be464" + "sha256:5e171b001452fa9f004c5a58a93525175468daf69b493e9fa915347ed7ff6968", + "sha256:bd28bae37714b45d5894d77160a16e2be36b64a3b618c81168b3684676aa498b" ], - "version": "==1.19.1" + "version": "==1.20.0" }, "parse-type": { "hashes": [ @@ -1958,11 +1967,11 @@ }, "pathspec": { "hashes": [ - "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20", - "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" ], - "markers": "python_version >= '3.7'", - "version": "==0.11.2" + "markers": "python_version >= '3.8'", + "version": "==0.12.1" }, "pbr": { "hashes": [ @@ -1981,11 +1990,11 @@ }, "pexpect": { "hashes": [ - "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937", - "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c" + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" ], "markers": "sys_platform != 'win32'", - "version": "==4.8.0" + "version": "==4.9.0" }, "pickleshare": { "hashes": [ @@ -1996,11 +2005,11 @@ }, "platformdirs": { "hashes": [ - "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b", - "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731" + "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380", + "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420" ], - "markers": "python_version >= '3.7'", - "version": "==4.0.0" + "markers": "python_version >= '3.8'", + "version": "==4.1.0" }, "pluggy": { "hashes": [ @@ -2012,11 +2021,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:941367d97fc815548822aa26c2a269fdc4eb21e9ec05fc5d447cf09bad5d75f0", - "sha256:f36fe301fafb7470e86aaf90f036eef600a3210be4decf461a5b1ca8403d3cb2" + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" ], "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.41" + "version": "==3.0.43" }, "prospector": { "hashes": [ @@ -2058,11 +2067,11 @@ }, "pygments": { "hashes": [ - "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692", - "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29" + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" ], "markers": "python_version >= '3.7'", - "version": "==2.16.1" + "version": "==2.17.2" }, "pylint": { "hashes": [ @@ -2109,21 +2118,21 @@ }, "pytest": { "hashes": [ - "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac", - "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5" + "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", + "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==7.4.3" + "version": "==7.4.4" }, "pytest-bdd": { "hashes": [ - "sha256:7e677f1d0ad8d9fc37254c98e36a5b2c1afde095d09ff790ae8b1fd75b41bb32", - "sha256:cb11e33b4419bd281cd6f74027c0b1eedeaf8f8d187edc897b4a61ae976ef9f1" + "sha256:652d9c5324076ed9348f1c69b6512c00c581708ff17f063771ea703b62d3b956", + "sha256:faf115b9de793dc2341e898347f936c3766179a54a018c132796302b120918e5" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==7.0.0" + "version": "==7.0.1" }, "pytest-circleci-parallelized": { "hashes": [ @@ -2247,11 +2256,11 @@ }, "setuptools": { "hashes": [ - "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87", - "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a" + "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05", + "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78" ], "markers": "python_version >= '3.8'", - "version": "==68.2.2" + "version": "==69.0.3" }, "six": { "hashes": [ @@ -2294,19 +2303,19 @@ }, "traitlets": { "hashes": [ - "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5", - "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619" + "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74", + "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e" ], "markers": "python_version >= '3.8'", - "version": "==5.13.0" + "version": "==5.14.1" }, "typing-extensions": { "hashes": [ - "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0", - "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef" + "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783", + "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd" ], "markers": "python_version >= '3.8'", - "version": "==4.8.0" + "version": "==4.9.0" }, "urllib3": { "hashes": [ @@ -2354,10 +2363,10 @@ }, "wcwidth": { "hashes": [ - "sha256:390c7454101092a6a5e43baad8f83de615463af459201709556b6e4b1c861f97", - "sha256:aec5179002dd0f0d40c456026e74a729661c9d468e1ed64405e3a6c2176ca36f" + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" ], - "version": "==0.2.10" + "version": "==0.2.13" }, "wrapt": { "hashes": [ diff --git a/api/cases/models.py b/api/cases/models.py index 22561adfb6..c345e3904f 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -7,8 +7,15 @@ from django.contrib.contenttypes.fields import GenericRelation from django.db import models from django.utils import timezone + +from queryable_properties.managers import QueryablePropertiesManager + +from django.db.models import Model, Q + from rest_framework.exceptions import ValidationError +from queryable_properties.properties import queryable_property + from api.audit_trail.enums import AuditType from api.cases.enums import ( AdviceType, @@ -588,6 +595,9 @@ class EcjuQuery(TimestampableModel): Query from ECJU to exporters """ + # Allows the properies to be queryable, allowing filters + objects = QueryablePropertiesManager() + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) question = models.CharField(null=False, blank=False, max_length=5000) response = models.CharField(null=True, blank=False, max_length=2200) @@ -612,6 +622,14 @@ class EcjuQuery(TimestampableModel): choices=ECJUQueryType.choices, max_length=50, default=ECJUQueryType.ECJU, null=False, blank=False ) + @queryable_property + def is_query_closed(self): + return self.responded_at is not None + + @is_query_closed.filter(lookups=("exact",)) + def is_query_closed(self, lookup, value): + return Q(responded_at__isnull=not value) + notifications = GenericRelation(ExporterNotification, related_query_name="ecju_query") def save(self, *args, **kwargs): diff --git a/api/cases/serializers.py b/api/cases/serializers.py index b7d810dcf2..3a435313c3 100644 --- a/api/cases/serializers.py +++ b/api/cases/serializers.py @@ -229,6 +229,7 @@ class ECJUQuerySummarySerializer(serializers.Serializer): raised_by_user = serializers.SerializerMethodField() responded_by_user = serializers.SerializerMethodField() query_type = serializers.CharField() + is_query_closed = serializers.BooleanField() def _user_name(self, user): if not user: @@ -573,6 +574,7 @@ class Meta: "responded_at", "query_type", "documents", + "is_query_closed", ) def get_raised_by_user_name(self, instance): @@ -610,6 +612,7 @@ class Meta: "created_at", "responded_at", "documents", + "is_query_closed", ) def get_responded_by_user(self, instance): diff --git a/api/cases/tests/test_case_ecju_queries.py b/api/cases/tests/test_case_ecju_queries.py index efdc128add..669184fe0a 100644 --- a/api/cases/tests/test_case_ecju_queries.py +++ b/api/cases/tests/test_case_ecju_queries.py @@ -118,6 +118,7 @@ def test_correct_ecju_query_details_are_returned_to_exporter_user(self): self.assertEqual(returned_ecju_query_1.get("question"), "ECJU Query 1") self.assertEqual(returned_ecju_query_1.get("response"), None) self.assertEqual(returned_ecju_query_1.get("team")["name"], self.ecju_query_1.team.name) + self.assertEqual(returned_ecju_query_1.get("is_query_closed"), self.ecju_query_1.is_query_closed) # We can't predict exactly when the query is created so we settle for the fact that its set self.assertIsNotNone(returned_ecju_query_1.get("created_at")) @@ -125,6 +126,7 @@ def test_correct_ecju_query_details_are_returned_to_exporter_user(self): self.assertEqual(returned_ecju_query_2.get("question"), "ECJU Query 2") self.assertEqual(returned_ecju_query_2.get("response"), "I have a response") self.assertEqual(returned_ecju_query_2.get("team")["name"], self.ecju_query_2.team.name) + self.assertEqual(returned_ecju_query_2.get("is_query_closed"), self.ecju_query_2.is_query_closed) # We can't predict exactly when the query is created so we settle for the fact that its set self.assertIsNotNone(returned_ecju_query_1.get("created_at")) @@ -166,6 +168,7 @@ def test_gov_user_can_get_an_individual_ecju_query(self): self.assertEqual(str(ecju_query.question), response_data["ecju_query"]["question"]) self.assertEqual(ecju_query.response, None) self.assertEqual(str(ecju_query.case.id), response_data["ecju_query"]["case"]) + self.assertEqual(ecju_query.is_query_closed, response_data["ecju_query"]["is_query_closed"]) def test_ecju_query_open_query_count(self): """ @@ -178,15 +181,24 @@ def test_ecju_query_open_query_count(self): url = reverse("cases:case_ecju_query_open_count", kwargs={"pk": case.id}) - # Act response = self.client.get(url, **self.gov_headers) - # Assert response_data = response.json() self.assertEqual(status.HTTP_200_OK, response.status_code) self.assertEqual(1, response_data["count"]) + EcjuQueryFactory( + question="open", + case=case, + responded_by_user=self.exporter_user.baseuser_ptr, + response="I have a response only", + ) + + response = self.client.get(url, **self.gov_headers) + self.assertEqual(status.HTTP_200_OK, response.status_code) + self.assertEqual(1, response_data["count"]) + def test_ecju_query_open_query_count_responded_return_zero(self): """ Given an ECJU query @@ -194,44 +206,16 @@ def test_ecju_query_open_query_count_responded_return_zero(self): Then the request is successful we return 0 as open queries """ case = self.create_standard_application_case(self.organisation) - case_2 = self.create_standard_application_case(self.organisation) - - ecju_query = EcjuQueryFactory( - question="open", - case=case, - responded_by_user=self.exporter_user.baseuser_ptr, - responded_at=timezone.now(), - ) EcjuQueryFactory( question="open", case=case, responded_by_user=self.exporter_user.baseuser_ptr, - response="I have a response only", + responded_at=timezone.now(), ) url = reverse("cases:case_ecju_query_open_count", kwargs={"pk": case.id}) - # Act - response = self.client.get(url, **self.gov_headers) - response_2 = self.client.get( - reverse("cases:case_ecju_query_open_count", kwargs={"pk": case_2.id}), **self.gov_headers - ) - - # Assert - response_data = response.json() - - self.assertEqual(status.HTTP_200_OK, response.status_code) - self.assertEqual(0, response_data["count"]) - - response_data_2 = response.json() - - self.assertEqual(status.HTTP_200_OK, response.status_code) - self.assertEqual(0, response_data_2["count"]) - - ecju_query.response = "I have a response now" - ecju_query.save() - response = self.client.get(url, **self.gov_headers) response_data = response.json() @@ -260,6 +244,7 @@ def test_gov_user_can_create_ecju_queries(self, query_type, mock_notify): self.assertEqual(status.HTTP_201_CREATED, response.status_code) self.assertEqual(response_data["ecju_query_id"], str(ecju_query.id)) self.assertEqual("Test ECJU Query question?", ecju_query.question) + self.assertEqual(False, ecju_query.is_query_closed) mock_notify.assert_called_with(case.id) diff --git a/api/cases/tests/test_case_search.py b/api/cases/tests/test_case_search.py index a2914cee32..5a967a7fa5 100644 --- a/api/cases/tests/test_case_search.py +++ b/api/cases/tests/test_case_search.py @@ -1118,6 +1118,7 @@ def test_api_success(self): "raised_by_user": f"{self.ecju_query.raised_by_user.first_name} {self.ecju_query.raised_by_user.last_name}", "responded_by_user": f"{self.ecju_query.responded_by_user.first_name} {self.ecju_query.responded_by_user.last_name}", "query_type": self.ecju_query.query_type, + "is_query_closed": self.ecju_query.is_query_closed, } ], ) diff --git a/api/cases/views/views.py b/api/cases/views/views.py index ea7bba332a..3980dc4d20 100644 --- a/api/cases/views/views.py +++ b/api/cases/views/views.py @@ -588,11 +588,7 @@ class ECJUQueriesOpenCount(APIView): def get(self, request, pk): """Gets count of all open queries.""" - qs = EcjuQuery.objects.filter( - case__pk=pk, - responded_at__isnull=True, - response__isnull=True, - ) + qs = EcjuQuery.objects.filter(case__pk=pk, is_query_closed=False) return JsonResponse(data={"count": qs.count()}) From 4ea3776255abf5cea22ad5ef5082dcb64ea0c33f Mon Sep 17 00:00:00 2001 From: Arun Siluvery Date: Wed, 17 Jan 2024 15:29:35 +0000 Subject: [PATCH 4/8] Remove background_task and related env variables We migrated all tasks to use celery so remove background_task app and related env variables --- api/conf/settings.py | 8 -------- .../tests/test_api_to_hmrc_integration.py | 6 +++--- api/search/signals.py | 3 +-- api/search/tests/test_signals.py | 20 ++++++++++++------- ci.env | 1 - local.env | 1 - 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/api/conf/settings.py b/api/conf/settings.py index 4ad88673bd..5529c91a84 100644 --- a/api/conf/settings.py +++ b/api/conf/settings.py @@ -22,7 +22,6 @@ ALLOWED_HOSTS=(str, ""), DEBUG=(bool, False), LOG_LEVEL=(str, "INFO"), - BACKGROUND_TASK_ENABLED=(bool, False), SUPPRESS_TEST_OUTPUT=(bool, False), HAWK_AUTHENTICATION_ENABLED=(bool, True), LITE_HMRC_INTEGRATION_ENABLED=(bool, False), @@ -58,7 +57,6 @@ "api.applications", "api.audit_trail", "api.bookmarks", - "background_task", "api.cases", "api.cases.generated_documents", "api.compliance", @@ -232,12 +230,6 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField" -# Background tasks -BACKGROUND_TASK_ENABLED = env("BACKGROUND_TASK_ENABLED") -BACKGROUND_TASK_RUN_ASYNC = True -# Number of times a task is retried given a failure occurs with exponential back-off = ((current_attempt ** 4) + 5) -MAX_ATTEMPTS = 7 # e.g. 7th attempt occurs approx 40 minutes after 1st attempt (assuming instantaneous failures) - # AWS VCAP_SERVICES = env.json("VCAP_SERVICES", {}) diff --git a/api/licences/tests/test_api_to_hmrc_integration.py b/api/licences/tests/test_api_to_hmrc_integration.py index 35020eacdb..06edc1ce24 100644 --- a/api/licences/tests/test_api_to_hmrc_integration.py +++ b/api/licences/tests/test_api_to_hmrc_integration.py @@ -14,7 +14,7 @@ from api.cases.tests.factories import GoodCountryDecisionFactory from api.core.constants import GovPermissions from api.core.helpers import add_months -from api.conf.settings import MAX_ATTEMPTS, LITE_HMRC_REQUEST_TIMEOUT +from api.conf.settings import LITE_HMRC_REQUEST_TIMEOUT from api.licences.enums import LicenceStatus, HMRCIntegrationActionEnum, licence_status_to_hmrc_integration_action from api.licences.helpers import get_approved_goods_types, get_approved_countries from api.licences.libraries.hmrc_integration_operations import ( @@ -504,7 +504,7 @@ def test_send_licence_to_hmrc_integration_failure(self, send_licence): send_licence.assert_called_with(self.standard_licence, self.hmrc_integration_status) @mock.patch("api.licences.celery_tasks.send_licence") - def test_send_licence_to_hmrc_integration_with_background_task_success(self, send_licence): + def test_send_licence_to_hmrc_integration_task_success(self, send_licence): send_licence.return_value = None send_licence_details_to_lite_hmrc.delay(str(self.standard_licence.id), self.hmrc_integration_status) @@ -512,7 +512,7 @@ def test_send_licence_to_hmrc_integration_with_background_task_success(self, sen send_licence.assert_called_once() @mock.patch("api.licences.celery_tasks.send_licence") - def test_send_licence_to_hmrc_integration_with_background_task_failure(self, send_licence): + def test_send_licence_to_hmrc_integration_task_failure(self, send_licence): send_licence.side_effect = HMRCIntegrationException("Received an unexpected response") with self.assertRaises(HMRCIntegrationException) as error: diff --git a/api/search/signals.py b/api/search/signals.py index 8a309830dd..39c2a51bd4 100644 --- a/api/search/signals.py +++ b/api/search/signals.py @@ -1,4 +1,3 @@ -from background_task.models import Task from django.core.exceptions import ObjectDoesNotExist from django.conf import settings from django.db.models.signals import post_save @@ -11,7 +10,7 @@ @receiver(post_save) def update_search_documents(sender, **kwargs): - if not settings.LITE_API_ENABLE_ES or issubclass(sender, Task): + if not settings.LITE_API_ENABLE_ES: return app_label = sender._meta.app_label diff --git a/api/search/tests/test_signals.py b/api/search/tests/test_signals.py index 05f30b17b3..788716ae4f 100644 --- a/api/search/tests/test_signals.py +++ b/api/search/tests/test_signals.py @@ -9,13 +9,13 @@ class UpdateApplicationDocumentTest(DataTestClient): - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_standard_application(self, mock_registry): application = self.create_standard_application_case(self.organisation) mock_registry.update.assert_any_call(application.baseapplication) - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_case_assignment(self, mock_registry): assignment = self.create_case_assignment( @@ -23,14 +23,14 @@ def test_case_assignment(self, mock_registry): ) mock_registry.update.assert_any_call(assignment.case.baseapplication) - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_case(self, mock_registry): case = self.create_standard_application_case(self.organisation).get_case() mock_registry.update.assert_any_call(case.baseapplication) - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_good(self, mock_registry): application = self.create_standard_application_case(self.organisation) @@ -41,7 +41,7 @@ def test_good(self, mock_registry): mock_registry.update.assert_any_call(good_on_app) - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_party(self, mock_registry): application = self.create_standard_application_case(self.organisation) @@ -50,17 +50,23 @@ def test_party(self, mock_registry): mock_registry.update.assert_any_call(application.baseapplication) - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_organisation(self, mock_registry): application_organisation = self.create_standard_application_case(self.organisation) mock_registry.update.assert_any_call(application_organisation.baseapplication) - @override_settings(BACKGROUND_TASK_ENABLED=True, LITE_API_ENABLE_ES=True) + @override_settings(LITE_API_ENABLE_ES=True) @patch("api.search.celery_tasks.registry") def test_good_on_application_update_in_index(self, mock_registry): application = self.create_standard_application_case(self.organisation) for good_on_application in application.goods.all(): mock_registry.update.assert_any_call(good_on_application) + + @override_settings(LITE_API_ENABLE_ES=False) + @patch("api.search.celery_tasks.registry") + def test_standard_application_with_elasticsearch_disabled(self, mock_registry): + self.create_standard_application_case(self.organisation) + mock_registry.update.assert_not_called() diff --git a/ci.env b/ci.env index 881a8a2191..ebfe9a9bd6 100644 --- a/ci.env +++ b/ci.env @@ -21,7 +21,6 @@ AV_SERVICE_PASSWORD=AV_SERVICE_PASSWORD LITE_HMRC_INTEGRATION_ENABLED=False LITE_HMRC_INTEGRATION_URL=LITE_HMRC_INTEGRATION_URL PYTHONUNBUFFERED=1 -BACKGROUND_TASK_ENABLED=False UPLOAD_DOCUMENT_ENDPOINT_ENABLED=False DJANGO_SECRET_KEY=DJANGO_SECRET_KEY HAWK_AUTHENTICATION_ENABLED=False diff --git a/local.env b/local.env index db65a3294a..e62c95c42d 100644 --- a/local.env +++ b/local.env @@ -47,7 +47,6 @@ LITE_HMRC_INTEGRATION_ENABLED=<> LITE_HMRC_INTEGRATION_URL=<> PYTHONUNBUFFERED=1 -BACKGROUND_TASK_ENABLED=<> UPLOAD_DOCUMENT_ENDPOINT_ENABLED=<> DJANGO_SECRET_KEY=<> From 4fb3818c81b6252c8a80d009c5a009604b9573dc Mon Sep 17 00:00:00 2001 From: Gurdeep Atwal Date: Wed, 17 Jan 2024 16:42:33 +0000 Subject: [PATCH 5/8] fix tests --- api/cases/managers.py | 2 +- api/cases/models.py | 11 +++++------ api/cases/tests/test_case_ecju_queries.py | 6 +++--- api/cases/views/search/views.py | 2 +- .../commands/mark_queries_as_resolved.py | 14 ++++++++------ 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/api/cases/managers.py b/api/cases/managers.py index b880004d68..952c9ffc72 100644 --- a/api/cases/managers.py +++ b/api/cases/managers.py @@ -338,7 +338,7 @@ def search( # noqa CaseReviewDate = get_model("cases", "casereviewdate") case_qs = case_qs.exclude( - id__in=EcjuQuery.objects.filter(raised_by_user__team_id=user.team.id, responded_at__isnull=True) + id__in=EcjuQuery.objects.filter(raised_by_user__team_id=user.team.id, is_query_closed=False) .values("case_id") .distinct() ) diff --git a/api/cases/models.py b/api/cases/models.py index c345e3904f..b5bd0b4a8e 100644 --- a/api/cases/models.py +++ b/api/cases/models.py @@ -6,16 +6,14 @@ from django.conf import settings from django.contrib.contenttypes.fields import GenericRelation from django.db import models +from django.db.models import Q from django.utils import timezone -from queryable_properties.managers import QueryablePropertiesManager - -from django.db.models import Model, Q - from rest_framework.exceptions import ValidationError - +from queryable_properties.managers import QueryablePropertiesManager from queryable_properties.properties import queryable_property + from api.audit_trail.enums import AuditType from api.cases.enums import ( AdviceType, @@ -626,9 +624,10 @@ class EcjuQuery(TimestampableModel): def is_query_closed(self): return self.responded_at is not None + # This method allows the above propery to be used in filtering objects. Similar to db fields. @is_query_closed.filter(lookups=("exact",)) def is_query_closed(self, lookup, value): - return Q(responded_at__isnull=not value) + return ~Q(responded_at__isnull=value) notifications = GenericRelation(ExporterNotification, related_query_name="ecju_query") diff --git a/api/cases/tests/test_case_ecju_queries.py b/api/cases/tests/test_case_ecju_queries.py index 669184fe0a..6589a18f46 100644 --- a/api/cases/tests/test_case_ecju_queries.py +++ b/api/cases/tests/test_case_ecju_queries.py @@ -177,7 +177,7 @@ def test_ecju_query_open_query_count(self): Then the request is successful we return the number of open ECJUQueries """ case = self.create_standard_application_case(self.organisation) - EcjuQueryFactory(question="open", case=case, raised_by_user=self.gov_user, response=None) + EcjuQueryFactory(question="open query 1", case=case, raised_by_user=self.gov_user, response=None) url = reverse("cases:case_ecju_query_open_count", kwargs={"pk": case.id}) @@ -189,7 +189,7 @@ def test_ecju_query_open_query_count(self): self.assertEqual(1, response_data["count"]) EcjuQueryFactory( - question="open", + question="open query 2", case=case, responded_by_user=self.exporter_user.baseuser_ptr, response="I have a response only", @@ -208,7 +208,7 @@ def test_ecju_query_open_query_count_responded_return_zero(self): case = self.create_standard_application_case(self.organisation) EcjuQueryFactory( - question="open", + question="closed query", case=case, responded_by_user=self.exporter_user.baseuser_ptr, responded_at=timezone.now(), diff --git a/api/cases/views/search/views.py b/api/cases/views/search/views.py index 42c9d6e0e3..08731b6d52 100644 --- a/api/cases/views/search/views.py +++ b/api/cases/views/search/views.py @@ -47,7 +47,7 @@ def get(self, request, *args, **kwargs): ), has_open_queries=Exists( EcjuQuery.objects.filter( - case=OuterRef("pk"), raised_by_user__team_id=user.team.id, responded_at__isnull=True + case=OuterRef("pk"), raised_by_user__team_id=user.team.id, is_query_closed=False ) ), ) diff --git a/api/support/management/commands/mark_queries_as_resolved.py b/api/support/management/commands/mark_queries_as_resolved.py index ba1d21cfd6..c487e580e1 100644 --- a/api/support/management/commands/mark_queries_as_resolved.py +++ b/api/support/management/commands/mark_queries_as_resolved.py @@ -31,20 +31,20 @@ def add_arguments(self, parser): def handle(self, *args, **options): case_reference = options.pop("case_reference") dry_run = options["dry_run"] - logging.info(f"Given case reference is: {case_reference}") + logging.info("Given case reference is: %s", case_reference) try: case = Case.objects.get(reference_code=case_reference) except Case.DoesNotExist: - logging.error(f"Case ({case_reference}) not found, please provide valid case reference") + logging.error("Case (%s) not found, please provide valid case reference", case_reference) return - unresolved_queries = case.case_ecju_query.filter(response=None) + unresolved_queries = case.case_ecju_query.filter(is_query_closed=False) if unresolved_queries.count() == 0: - logging.info(f"No unresolved queries for Case {case_reference} found, returning.") + logging.info("No unresolved queries for Case %s found, returning.", case_reference) return - logging.info(f"Number of unresolved queries for Case {case_reference}: {unresolved_queries.count()}") + logging.info("Number of unresolved queries for Case %s: %s", case_reference, unresolved_queries.count()) for query in unresolved_queries: query.response = "Marked as resolved by LITE System" @@ -52,5 +52,7 @@ def handle(self, *args, **options): query.save() logging.info( - f"Number of unresolved queries after update for Case {case_reference}: {case.case_ecju_query.filter(response=None).count()}" + "Number of unresolved queries after update for Case %s: %s ", + case_reference, + case.case_ecju_query.filter(is_query_closed=False).count(), ) From b90c830d6f3718d924d6f64a95ff3fac695a10c4 Mon Sep 17 00:00:00 2001 From: Arun Siluvery Date: Thu, 18 Jan 2024 11:30:34 +0000 Subject: [PATCH 6/8] Remove background_tasks from requirements django-compat was removed earlier but it seems to have dependency with background_tasks so it is getting installed even if it missing from Pipfile. We have code that uses that package so adding it back in Pipfile. Remove the start of background_tasks management command from Procfile. --- Pipfile | 2 +- Pipfile.lock | 27 ++++++++++++++++++--------- Procfile | 1 - 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/Pipfile b/Pipfile index 20e0abba98..afe22f7842 100644 --- a/Pipfile +++ b/Pipfile @@ -28,7 +28,6 @@ faker = "~=4.18.0" boto3 = "~=1.26.17" django-activity-stream = "~=0.10.0" django-allow-cidr = "~=0.5.0" -django-background-tasks = "~=1.2.5" django-elasticsearch-dsl = "~=7.2.2" django-elasticsearch-dsl-drf = "~=0.22.5" django-environ = "~=0.9.0" @@ -73,6 +72,7 @@ django-test-migrations = "~=1.2.0" django-silk = "~=5.0.3" django-queryable-properties = "~=1.9.1" django = "~=3.2.23" +django-compat = "~=1.0.15" [requires] python_version = "3.8" diff --git a/Pipfile.lock b/Pipfile.lock index 3d85d911e3..14f4e9f18b 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "7cdb730062d63ff8d4f696dcb957ede19f04045023a27dcd633e67bc67e77195" + "sha256": "5fd366e1b95b1af08d326d56b68b7fecaf3e44cabf20424d4ee3ad56ccc51d56" }, "pipfile-spec": 6, "requires": { @@ -25,6 +25,14 @@ "markers": "python_version >= '3.6'", "version": "==5.2.0" }, + "appnope": { + "hashes": [ + "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24", + "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e" + ], + "markers": "sys_platform == 'darwin'", + "version": "==0.1.3" + }, "asgiref": { "hashes": [ "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e", @@ -420,17 +428,11 @@ "markers": "python_version >= '3.6'", "version": "==0.0.4" }, - "django-background-tasks": { - "hashes": [ - "sha256:e1b19e8d495a276c9d64c5a1ff8b41132f75d2f58e45be71b78650dad59af9de" - ], - "index": "pypi", - "version": "==1.2.5" - }, "django-compat": { "hashes": [ "sha256:3ac9a3bedc56b9365d9eb241bc5157d0c193769bf995f9a78dc1bc24e7c2331b" ], + "index": "pypi", "version": "==1.0.15" }, "django-elasticsearch-dsl": { @@ -1462,6 +1464,14 @@ } }, "develop": { + "appnope": { + "hashes": [ + "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24", + "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e" + ], + "markers": "sys_platform == 'darwin'", + "version": "==0.1.3" + }, "astroid": { "hashes": [ "sha256:71ea07f44df9568a75d0f354c49143a4575d90645e9fead6dfb52c26a85ed13a", @@ -1747,7 +1757,6 @@ "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c", "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048" ], - "index": "pypi", "markers": "python_version >= '3.7'", "version": "==3.1.41" }, diff --git a/Procfile b/Procfile index f25dbfd5bd..3519fbcf17 100644 --- a/Procfile +++ b/Procfile @@ -1,4 +1,3 @@ web: SWIG_LIB=/home/vcap/deps/0/apt/usr/share/swig4.0 CFLAGS=-I/home/vcap/deps/1/python/include/python3.8.18m pip3 install endesive==1.5.9 && python manage.py migrate && gunicorn --worker-class gevent -c api/conf/gconfig.py -b 0.0.0.0:$PORT api.conf.wsgi -worker: python manage.py process_tasks celeryworker: celery -A api.conf worker -l info celeryscheduler: celery -A api.conf beat From 689736e86ddacc24422c8efeded03260e816f550 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 19 Jan 2024 12:18:02 +0000 Subject: [PATCH 7/8] Update SIEL licence footer information about control list entries --- .../templates/letter_templates/siel.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/api/letter_templates/templates/letter_templates/siel.html b/api/letter_templates/templates/letter_templates/siel.html index 14e8a48304..eed1680964 100644 --- a/api/letter_templates/templates/letter_templates/siel.html +++ b/api/letter_templates/templates/letter_templates/siel.html @@ -606,19 +606,19 @@

Standard Individual Export Licence

the Customs and Excise Management Act 1979, or the legislation under which this licence was issued.
- Understanding the Control List Number (Rating Classification) + Understanding the control list entry
- Control List No.     Relevant Control List
- ML*                       UK Military List + The control list entry is part of the UK Strategic Export Control List.
- For further details on the Control List number (rating), read the UK Strategic Export Control Lists guidance on GOV.UK: + For further details on the control list entry and how you can use this information, read the guidance on GOV.UK:
- - - https://www.gov.uk/guidance/uk-strategic-export-control-lists-the-consolidated-list-of-strategic-military-and-dual-use-items - + From f44907e0a0fe51c662d56736af16aa0ada49fc86 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 19 Jan 2024 11:26:18 +0000 Subject: [PATCH 8/8] Remove sending back the exception data in the validation error --- api/documents/celery_tasks.py | 2 +- api/documents/libraries/process_document.py | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/api/documents/celery_tasks.py b/api/documents/celery_tasks.py index ba8aad3ba8..233b499b26 100644 --- a/api/documents/celery_tasks.py +++ b/api/documents/celery_tasks.py @@ -32,7 +32,7 @@ def scan_document_for_viruses(self, document_id): try: document.scan_for_viruses() - except Exception as exc: # noqa + except Exception: logger.exception("Document virus scan failed") raise diff --git a/api/documents/libraries/process_document.py b/api/documents/libraries/process_document.py index 995896a619..0b50b86eb6 100644 --- a/api/documents/libraries/process_document.py +++ b/api/documents/libraries/process_document.py @@ -4,11 +4,13 @@ from api.documents.celery_tasks import scan_document_for_viruses, delete_document_from_s3 +logger = logging.getLogger(__name__) + def process_document(document): try: document_id = str(document.id) scan_document_for_viruses.apply_async(args=(document_id,), link_error=delete_document_from_s3.si(document_id)) - except Exception as e: - logging.error(e) - raise serializers.ValidationError({"document": e}) + except Exception: + logger.exception("Error scanning document with id %s for viruses", document_id) + raise serializers.ValidationError({"document": "Error scanning document for viruses"})