From 406c2ab151a215ff5a29e5c9fb7b8ef4c8345f80 Mon Sep 17 00:00:00 2001 From: "mark.j0hnst0n" Date: Thu, 19 Sep 2024 16:45:01 +0100 Subject: [PATCH 01/19] pipfile updated --- Pipfile | 7 +- Pipfile.lock | 1304 +++++++++++++++++++++++++++----------------------- 2 files changed, 706 insertions(+), 605 deletions(-) diff --git a/Pipfile b/Pipfile index 25f9a840f4..116739631e 100644 --- a/Pipfile +++ b/Pipfile @@ -52,18 +52,18 @@ markdown = "~=3.4.1" mohawk = ">=1.1.0" munch = "~=2.5.0" requests = {extras = ["security"], version = "~=2.21"} -sentry-sdk = "~=1.17.0" +sentry-sdk = ">=2.8.0" whitenoise = "~=5.3.0" crispy-forms-gds = "~=0.2.4" notifications-python-client = "~=6.4.1" python-magic = "~=0.4.27" -Authlib = "==0.15.5" +Authlib = "==1.3.1" regex = "==2022.3.2" deepmerge = "*" phonenumbers = "~=8.12.57" setuptools = "~=70.0.0" rules="~=3.3.0" -djangorestframework = "~=3.14.0" +djangorestframework = ">=3.15.2" django-chunk-upload-handlers = "~=0.0.13" django-compressor = "~=2.4.1" django-csp = "~=3.7" @@ -82,6 +82,7 @@ django-extra-views = "~=0.14.0" django = "~=4.2.15" django-log-formatter-asim = "~=0.0.5" dbt-copilot-python = "~=0.2.1" +cryptography = ">=43.0.1" [requires] python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock index cfcb0f7719..0631368902 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5666ca1558804e42b4bcdd067f4dae341f9d0ed631836587ffa44e28dc781b7a" + "sha256": "a14e6d004e06185c2082c3867c7667fcdd687e260668488ef8b00246006ed28e" }, "pipfile-spec": 6, "requires": { @@ -42,11 +42,12 @@ }, "authlib": { "hashes": [ - "sha256:b83cf6360c8e92b0e9df0d1f32d675790bcc4e3c03977499b1eed24dcdef4252", - "sha256:ecf4a7a9f2508c0bb07e93a752dd3c495cfaffc20e864ef0ffc95e3f40d2abaf" + "sha256:7ae843f03c06c5c0debd63c9db91f9fda64fa62a42a77419fa15fbb7e7a58917", + "sha256:d35800b973099bbadc49b42b256ecb80041ad56b7fe1216a362c7943c088f377" ], "index": "pypi", - "version": "==0.15.5" + "markers": "python_version >= '3.8'", + "version": "==1.3.1" }, "backoff": { "hashes": [ @@ -109,69 +110,84 @@ }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.8.30" }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" + "version": "==1.17.1" }, "cfgv": { "hashes": [ @@ -319,41 +335,37 @@ }, "cryptography": { "hashes": [ - "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", - "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", - "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", - "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", - "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", - "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", - "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", - "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", - "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", - "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", - "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", - "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", - "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", - "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", - "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", - "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", - "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", - "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", - "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", - "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", - "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", - "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", - "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", - "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", - "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", - "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", - "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", - "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", - "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", - "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", - "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", - "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" + "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", + "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", + "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", + "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", + "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", + "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", + "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", + "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", + "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", + "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", + "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", + "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", + "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2", + "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", + "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", + "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365", + "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96", + "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", + "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", + "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d", + "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", + "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", + "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", + "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172", + "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034", + "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", + "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.1" }, "dateparser": { "hashes": [ @@ -366,20 +378,21 @@ }, "dbt-copilot-python": { "hashes": [ - "sha256:8330011cec44c2e6e30f48b3bdb346269a1704eb35ca19f9666509d8b9d39844", - "sha256:97fa5429ff296e09821b17395f6f6431091a4fa45f21177b19b4a478df49827f" + "sha256:529f6638bbdae96687b8c197eb450357dfbb9d7def6ac8bf23e0846d8b0fea73", + "sha256:7485ffced952e40bab79801b0b8f5eecfbd602f84a9086238c69e4aacdee23bf" ], "index": "pypi", "markers": "python_version >= '3.9' and python_version < '4.0'", - "version": "==0.2.1" + "version": "==0.2.2" }, "deepmerge": { "hashes": [ - "sha256:53a489dc9449636e480a784359ae2aab3191748c920649551c8e378622f0eca4", - "sha256:7219dad9763f15be9dcd4bcb53e00f48e4eed6f5ed8f15824223eb934bb35977" + "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", + "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00" ], "index": "pypi", - "version": "==1.1.1" + "markers": "python_version >= '3.8'", + "version": "==2.0" }, "deprecated": { "hashes": [ @@ -398,12 +411,12 @@ }, "django": { "hashes": [ - "sha256:61ee4a130efb8c451ef3467c67ca99fdce400fedd768634efc86a68c18d80d30", - "sha256:c77f926b81129493961e19c0e02188f8d07c112a1162df69bfab178ae447f94a" + "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898", + "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.2.15" + "version": "==4.2.16" }, "django-allow-cidr": { "hashes": [ @@ -513,12 +526,12 @@ }, "django-log-formatter-asim": { "hashes": [ - "sha256:77501044786d8f5f249ed90f8eca0b7c79e57003519373dc2c69006e546daf3b", - "sha256:cfa38573db9c973d672b3d517a27994e8b1d794bbdebb8b5ddabe63be02c8af5" + "sha256:00923cb95b599082d94895af1333d1bb8fce05a3d742dd571d32b7e0e480ead3", + "sha256:ba35df7a8c5f5bad2e006b55dea8e339ef82f7476a93e6cae4d2bbea12938c2b" ], "index": "pypi", "markers": "python_version >= '3.9' and python_version < '4'", - "version": "==0.0.5" + "version": "==0.0.6" }, "django-log-formatter-ecs": { "hashes": [ @@ -549,12 +562,12 @@ }, "djangorestframework": { "hashes": [ - "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8", - "sha256:eb63f58c9f218e1a7d064d17a70751f528ed4e1d35547fdade9aaf4cd103fd08" + "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20", + "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad" ], "index": "pypi", - "markers": "python_version >= '3.6'", - "version": "==3.14.0" + "markers": "python_version >= '3.8'", + "version": "==3.15.2" }, "docopt": { "hashes": [ @@ -592,71 +605,71 @@ }, "filelock": { "hashes": [ - "sha256:0151273e5b5d6cf753a61ec83b3a9b7d8821c39ae9af9d7ecf2f9e2f17404103", - "sha256:e1199bf5194a2277273dacd50269f0d87d0682088a3c561c15674ea9005d8635" + "sha256:2082e5703d51fbf98ea75855d9d5527e33d8ff23099bec374a134febee6946b0", + "sha256:c249fbfcd5db47e5e2d6d62198e565475ee65e4831e2561c8e313fa7eb961435" ], "markers": "python_version >= '3.8'", - "version": "==3.15.3" + "version": "==3.16.1" }, "googleapis-common-protos": { "hashes": [ - "sha256:0e1c2cdfcbc354b76e4a211a35ea35d6926a835cba1377073c4861db904a1877", - "sha256:c6442f7a0a6b2a80369457d79e6672bb7dcbaab88e0848302497e3ec80780a6a" + "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63", + "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0" ], "markers": "python_version >= '3.7'", - "version": "==1.63.1" + "version": "==1.65.0" }, "grpcio": { "hashes": [ - "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040", - "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122", - "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9", - "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f", - "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd", - "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d", - "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33", - "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762", - "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294", - "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650", - "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b", - "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad", - "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1", - "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff", - "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59", - "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4", - "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027", - "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502", - "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae", - "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61", - "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb", - "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa", - "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5", - "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1", - "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9", - "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90", - "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b", - "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179", - "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e", - "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a", - "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489", - "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d", - "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a", - "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2", - "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd", - "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb", - "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61", - "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca", - "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6", - "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602", - "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367", - "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62", - "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d", - "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd", - "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22", - "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309" + "sha256:0e6c9b42ded5d02b6b1fea3a25f036a2236eeb75d0579bfd43c0018c88bf0a3e", + "sha256:161d5c535c2bdf61b95080e7f0f017a1dfcb812bf54093e71e5562b16225b4ce", + "sha256:17663598aadbedc3cacd7bbde432f541c8e07d2496564e22b214b22c7523dac8", + "sha256:1c17ebcec157cfb8dd445890a03e20caf6209a5bd4ac5b040ae9dbc59eef091d", + "sha256:292a846b92cdcd40ecca46e694997dd6b9be6c4c01a94a0dfb3fcb75d20da858", + "sha256:2ca2559692d8e7e245d456877a85ee41525f3ed425aa97eb7a70fc9a79df91a0", + "sha256:307b1d538140f19ccbd3aed7a93d8f71103c5d525f3c96f8616111614b14bf2a", + "sha256:30a1c2cf9390c894c90bbc70147f2372130ad189cffef161f0432d0157973f45", + "sha256:31a049daa428f928f21090403e5d18ea02670e3d5d172581670be006100db9ef", + "sha256:35334f9c9745add3e357e3372756fd32d925bd52c41da97f4dfdafbde0bf0ee2", + "sha256:3750c5a00bd644c75f4507f77a804d0189d97a107eb1481945a0cf3af3e7a5ac", + "sha256:3885f037eb11f1cacc41f207b705f38a44b69478086f40608959bf5ad85826dd", + "sha256:4573608e23f7e091acfbe3e84ac2045680b69751d8d67685ffa193a4429fedb1", + "sha256:4825a3aa5648010842e1c9d35a082187746aa0cdbf1b7a2a930595a94fb10fce", + "sha256:4877ba180591acdf127afe21ec1c7ff8a5ecf0fe2600f0d3c50e8c4a1cbc6492", + "sha256:48b0d92d45ce3be2084b92fb5bae2f64c208fea8ceed7fccf6a7b524d3c4942e", + "sha256:4d813316d1a752be6f5c4360c49f55b06d4fe212d7df03253dfdae90c8a402bb", + "sha256:5dd67ed9da78e5121efc5c510f0122a972216808d6de70953a740560c572eb44", + "sha256:6f914386e52cbdeb5d2a7ce3bf1fdfacbe9d818dd81b6099a05b741aaf3848bb", + "sha256:7101db1bd4cd9b880294dec41a93fcdce465bdbb602cd8dc5bd2d6362b618759", + "sha256:7e06aa1f764ec8265b19d8f00140b8c4b6ca179a6dc67aa9413867c47e1fb04e", + "sha256:84ca1be089fb4446490dd1135828bd42a7c7f8421e74fa581611f7afdf7ab761", + "sha256:8a1e224ce6f740dbb6b24c58f885422deebd7eb724aff0671a847f8951857c26", + "sha256:97ae7edd3f3f91480e48ede5d3e7d431ad6005bfdbd65c1b56913799ec79e791", + "sha256:9c9bebc6627873ec27a70fc800f6083a13c70b23a5564788754b9ee52c5aef6c", + "sha256:a013c5fbb12bfb5f927444b477a26f1080755a931d5d362e6a9a720ca7dbae60", + "sha256:a66fe4dc35d2330c185cfbb42959f57ad36f257e0cc4557d11d9f0a3f14311df", + "sha256:a92c4f58c01c77205df6ff999faa008540475c39b835277fb8883b11cada127a", + "sha256:aa8ba945c96e73de29d25331b26f3e416e0c0f621e984a3ebdb2d0d0b596a3b3", + "sha256:b0aa03d240b5539648d996cc60438f128c7f46050989e35b25f5c18286c86734", + "sha256:b1b24c23d51a1e8790b25514157d43f0a4dce1ac12b3f0b8e9f66a5e2c4c132f", + "sha256:b7ffb8ea674d68de4cac6f57d2498fef477cef582f1fa849e9f844863af50083", + "sha256:b9feb4e5ec8dc2d15709f4d5fc367794d69277f5d680baf1910fc9915c633524", + "sha256:bff2096bdba686019fb32d2dde45b95981f0d1490e054400f70fc9a8af34b49d", + "sha256:c30aeceeaff11cd5ddbc348f37c58bcb96da8d5aa93fed78ab329de5f37a0d7a", + "sha256:c9f80f9fad93a8cf71c7f161778ba47fd730d13a343a46258065c4deb4b550c0", + "sha256:cfd349de4158d797db2bd82d2020554a121674e98fbe6b15328456b3bf2495bb", + "sha256:d0cd7050397b3609ea51727b1811e663ffda8bda39c6a5bb69525ef12414b503", + "sha256:d639c939ad7c440c7b2819a28d559179a4508783f7e5b991166f8d7a34b52815", + "sha256:e3ba04659e4fce609de2658fe4dbf7d6ed21987a94460f5f92df7579fd5d0e22", + "sha256:ecfe735e7a59e5a98208447293ff8580e9db1e890e232b8b292dc8bd15afc0d2", + "sha256:ef82d361ed5849d34cf09105d00b94b6728d289d6b9235513cb2fcc79f7c432c", + "sha256:f03a5884c56256e08fd9e262e11b5cfacf1af96e2ce78dc095d2c41ccae2c80d", + "sha256:f1fe60d0772831d96d263b53d83fb9a3d050a94b0e94b6d004a5ad111faa5b5b", + "sha256:f517fd7259fe823ef3bd21e508b653d5492e706e9f0ef82c16ce3347a8a5620c", + "sha256:fdb14bad0835914f325349ed34a51940bc2ad965142eb3090081593c6e347be9" ], "markers": "python_version >= '3.8'", - "version": "==1.64.1" + "version": "==1.66.1" }, "gunicorn": { "hashes": [ @@ -677,19 +690,19 @@ }, "identify": { "hashes": [ - "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa", - "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d" + "sha256:53863bcac7caf8d2ed85bd20312ea5dcfc22226800f6d6881f232d861db5a8f0", + "sha256:91478c5fb7c3aac5ff7bf9b4344f803843dc586832d5f110d672b19aa1984c98" ], "markers": "python_version >= '3.8'", - "version": "==2.5.36" + "version": "==2.6.1" }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.10" }, "importlib-metadata": { "hashes": [ @@ -709,11 +722,11 @@ }, "kombu": { "hashes": [ - "sha256:011c4cd9a355c14a1de8d35d257314a1d2456d52b7140388561acac3cf1a97bf", - "sha256:5634c511926309c7f9789f1433e9ed402616b56836ef9878f01bd59267b4c7a9" + "sha256:14212f5ccf022fc0a70453bb025a1dcc32782a588c49ea866884047d66e14763", + "sha256:eef572dd2fd9fc614b37580e3caeafdd5af46c1eff31e7fba89138cdb406f2cf" ], "markers": "python_version >= '3.8'", - "version": "==5.3.7" + "version": "==5.4.2" }, "kubi-ecs-logger": { "hashes": [ @@ -838,11 +851,11 @@ }, "opentelemetry-propagator-aws-xray": { "hashes": [ - "sha256:49267a1d72b3f04880ac75e24f9ef38fe323e2f3156c4531e0e00c71c0829c0f", - "sha256:6e8be667bbcf17c3d81d70b2a7cdec0b11257ff64d3829ffe75b810ba1b49f86" + "sha256:1c99181ee228e99bddb638a0c911a297fa21f1c3a0af951f841e79919b5f1934", + "sha256:6b2cee5479d2ef0172307b66ed2ed151f598a0fd29b3c01133ac87ca06326260" ], - "markers": "python_version >= '3.6'", - "version": "==1.0.1" + "markers": "python_version >= '3.8'", + "version": "==1.0.2" }, "opentelemetry-proto": { "hashes": [ @@ -862,11 +875,11 @@ }, "opentelemetry-sdk-extension-aws": { "hashes": [ - "sha256:dd7cf6fc0e7c8070dbe179348f2f194ca4555601b60efb7264d82fc8df53f4ba", - "sha256:f964b0598793ded268d3329c33829fad33f63a8d9299fe51bf3a743e81fd7c67" + "sha256:4c6e4b9fec01a4a9cfeac5272ce5aae6bc80e080a6bae1e52098746f53a7b32d", + "sha256:9faa9bdf480d1c5c53151dabee75735c94dbde09e4762c68ff5c7bd4aa3408f3" ], - "markers": "python_version >= '3.6'", - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.0.2" }, "opentelemetry-semantic-conventions": { "hashes": [ @@ -902,19 +915,19 @@ }, "platformdirs": { "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" + "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", + "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb" ], "markers": "python_version >= '3.8'", - "version": "==4.2.2" + "version": "==4.3.6" }, "pre-commit": { "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" + "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af", + "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f" ], "markers": "python_version >= '3.9'", - "version": "==3.7.1" + "version": "==3.8.0" }, "prompt-toolkit": { "hashes": [ @@ -926,20 +939,20 @@ }, "protobuf": { "hashes": [ - "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", - "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", - "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", - "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", - "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", - "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", - "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", - "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", - "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", - "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", - "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" + "sha256:0aebecb809cae990f8129ada5ca273d9d670b76d9bfc9b1809f0a9c02b7dbf41", + "sha256:4be0571adcbe712b282a330c6e89eae24281344429ae95c6d85e79e84780f5ea", + "sha256:5e61fd921603f58d2f5acb2806a929b4675f8874ff5f330b7d6f7e2e784bbcd8", + "sha256:7a183f592dc80aa7c8da7ad9e55091c4ffc9497b3054452d629bb85fa27c2a45", + "sha256:7f8249476b4a9473645db7f8ab42b02fe1488cbe5fb72fddd445e0665afd8584", + "sha256:919ad92d9b0310070f8356c24b855c98df2b8bd207ebc1c0c6fcc9ab1e007f3d", + "sha256:98d8d8aa50de6a2747efd9cceba361c9034050ecce3e09136f90de37ddba66e1", + "sha256:abe32aad8561aa7cc94fc7ba4fdef646e576983edb94a73381b03c53728a626f", + "sha256:b0234dd5a03049e4ddd94b93400b67803c823cfc405689688f59b34e0742381a", + "sha256:b2fde3d805354df675ea4c7c6338c1aecd254dfc9925e88c6d31a2bcb97eb173", + "sha256:fe14e16c22be926d3abfcb500e60cab068baf10b542b8c858fa27e098123e331" ], "markers": "python_version >= '3.8'", - "version": "==4.25.3" + "version": "==4.25.5" }, "pycparser": { "hashes": [ @@ -951,18 +964,18 @@ }, "pyjwt": { "hashes": [ - "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de", - "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320" + "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", + "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" ], - "markers": "python_version >= '3.7'", - "version": "==2.8.0" + "markers": "python_version >= '3.8'", + "version": "==2.9.0" }, "python-dateutil": { "hashes": [ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "python-magic": { @@ -976,67 +989,69 @@ }, "pytz": { "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" + "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a", + "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725" ], - "version": "==2024.1" + "version": "==2024.2" }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "rcssmin": { "hashes": [ @@ -1046,11 +1061,11 @@ }, "redis": { "hashes": [ - "sha256:38473cd7c6389ad3e44a91f4c3eaf6bcb8a9f746007f29bf4fb20824ff0b2197", - "sha256:c0d6d990850c627bbf7be01c5c4cbaadf67b48593e913bb71c9819c30df37eee" + "sha256:0c5b10d387568dfe0698c6fad6615750c24170e548ca2deac10c649d463e9870", + "sha256:56134ee08ea909106090934adc36f65c9bcbbaecea5b21ba704ba6fb561f8eb4" ], "markers": "python_version >= '3.7'", - "version": "==5.0.6" + "version": "==5.0.8" }, "regex": { "hashes": [ @@ -1180,11 +1195,12 @@ }, "sentry-sdk": { "hashes": [ - "sha256:3c4e898f7a3edf5a2042cd0dcab6ee124e2112189228c272c08ad15d3850c201", - "sha256:ad40860325c94d1a656da70fba5a7c4dbb2f6809d3cc2d00f74ca0b608330f14" + "sha256:1e0e2eaf6dad918c7d1e0edac868a7bf20017b177f242cefe2a6bcd47955961d", + "sha256:b8bc3dc51d06590df1291b7519b85c75e2ced4f28d9ea655b6d54033503b5bf4" ], "index": "pypi", - "version": "==1.17.0" + "markers": "python_version >= '3.6'", + "version": "==2.14.0" }, "setuptools": { "hashes": [ @@ -1200,16 +1216,16 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "soupsieve": { "hashes": [ - "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", - "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" + "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", + "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" ], "markers": "python_version >= '3.8'", - "version": "==2.5" + "version": "==2.6" }, "sqlparse": { "hashes": [ @@ -1224,7 +1240,7 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version < '3.11'", + "markers": "python_version < '3.10'", "version": "==4.12.2" }, "tzdata": { @@ -1245,11 +1261,11 @@ }, "urllib3": { "hashes": [ - "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", - "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429" + "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", + "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32" ], - "markers": "python_version >= '3.6'", - "version": "==1.26.19" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.20" }, "vine": { "hashes": [ @@ -1261,11 +1277,11 @@ }, "virtualenv": { "hashes": [ - "sha256:82bf0f4eebbb78d36ddaee0283d43fe5736b53880b8a8cdcd37390a07ac3741c", - "sha256:a624db5e94f01ad993d476b9ee5346fdf7b9de43ccaee0e0197012dc838a0e9b" + "sha256:4f3ac17b81fba3ce3bd6f4ead2749a72da5929c01774948e243db9ba41df4ff6", + "sha256:ce489cac131aa58f4b25e321d6d186171f78e6cb13fafbf32a840cee67733ff4" ], "markers": "python_version >= '3.7'", - "version": "==20.26.2" + "version": "==20.26.5" }, "wcwidth": { "hashes": [ @@ -1368,11 +1384,11 @@ }, "zipp": { "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" + "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350", + "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29" ], "markers": "python_version >= '3.8'", - "version": "==3.19.2" + "version": "==3.20.2" } }, "develop": { @@ -1418,11 +1434,11 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "backcall": { "hashes": [ @@ -1584,69 +1600,84 @@ }, "certifi": { "hashes": [ - "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", - "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.6.2" + "version": "==2024.8.30" }, "cffi": { "hashes": [ - "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc", - "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a", - "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417", - "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab", - "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520", - "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36", - "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743", - "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8", - "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed", - "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684", - "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56", - "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324", - "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d", - "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235", - "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e", - "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088", - "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000", - "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7", - "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e", - "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673", - "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c", - "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe", - "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2", - "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098", - "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8", - "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a", - "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0", - "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b", - "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896", - "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e", - "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9", - "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2", - "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b", - "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6", - "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404", - "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f", - "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0", - "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4", - "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc", - "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936", - "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba", - "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872", - "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb", - "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614", - "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1", - "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d", - "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969", - "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b", - "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4", - "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627", - "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956", - "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357" + "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8", + "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2", + "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1", + "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15", + "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36", + "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", + "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8", + "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36", + "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17", + "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf", + "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc", + "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3", + "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed", + "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702", + "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1", + "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8", + "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903", + "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6", + "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d", + "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b", + "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e", + "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be", + "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c", + "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683", + "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9", + "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c", + "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8", + "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1", + "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4", + "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655", + "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67", + "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595", + "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0", + "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65", + "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41", + "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6", + "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401", + "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6", + "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3", + "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16", + "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93", + "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e", + "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4", + "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964", + "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c", + "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576", + "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0", + "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3", + "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662", + "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3", + "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff", + "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5", + "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd", + "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f", + "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5", + "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14", + "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d", + "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9", + "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7", + "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382", + "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a", + "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e", + "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a", + "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4", + "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99", + "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87", + "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b" ], "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" + "version": "==1.17.1" }, "charset-normalizer": { "hashes": [ @@ -1757,106 +1788,122 @@ "toml" ], "hashes": [ - "sha256:015eddc5ccd5364dcb902eaecf9515636806fa1e0d5bef5769d06d0f31b54523", - "sha256:04aefca5190d1dc7a53a4c1a5a7f8568811306d7a8ee231c42fb69215571944f", - "sha256:05ac5f60faa0c704c0f7e6a5cbfd6f02101ed05e0aee4d2822637a9e672c998d", - "sha256:0bbddc54bbacfc09b3edaec644d4ac90c08ee8ed4844b0f86227dcda2d428fcb", - "sha256:1d2a830ade66d3563bb61d1e3c77c8def97b30ed91e166c67d0632c018f380f0", - "sha256:239a4e75e09c2b12ea478d28815acf83334d32e722e7433471fbf641c606344c", - "sha256:244f509f126dc71369393ce5fea17c0592c40ee44e607b6d855e9c4ac57aac98", - "sha256:25a5caf742c6195e08002d3b6c2dd6947e50efc5fc2c2205f61ecb47592d2d83", - "sha256:296a7d9bbc598e8744c00f7a6cecf1da9b30ae9ad51c566291ff1314e6cbbed8", - "sha256:2e079c9ec772fedbade9d7ebc36202a1d9ef7291bc9b3a024ca395c4d52853d7", - "sha256:33ca90a0eb29225f195e30684ba4a6db05dbef03c2ccd50b9077714c48153cac", - "sha256:33fc65740267222fc02975c061eb7167185fef4cc8f2770267ee8bf7d6a42f84", - "sha256:341dd8f61c26337c37988345ca5c8ccabeff33093a26953a1ac72e7d0103c4fb", - "sha256:34d6d21d8795a97b14d503dcaf74226ae51eb1f2bd41015d3ef332a24d0a17b3", - "sha256:3538d8fb1ee9bdd2e2692b3b18c22bb1c19ffbefd06880f5ac496e42d7bb3884", - "sha256:38a3b98dae8a7c9057bd91fbf3415c05e700a5114c5f1b5b0ea5f8f429ba6614", - "sha256:3d5a67f0da401e105753d474369ab034c7bae51a4c31c77d94030d59e41df5bd", - "sha256:50084d3516aa263791198913a17354bd1dc627d3c1639209640b9cac3fef5807", - "sha256:55f689f846661e3f26efa535071775d0483388a1ccfab899df72924805e9e7cd", - "sha256:5bc5a8c87714b0c67cfeb4c7caa82b2d71e8864d1a46aa990b5588fa953673b8", - "sha256:62bda40da1e68898186f274f832ef3e759ce929da9a9fd9fcf265956de269dbc", - "sha256:705f3d7c2b098c40f5b81790a5fedb274113373d4d1a69e65f8b68b0cc26f6db", - "sha256:75e3f4e86804023e991096b29e147e635f5e2568f77883a1e6eed74512659ab0", - "sha256:7b2a19e13dfb5c8e145c7a6ea959485ee8e2204699903c88c7d25283584bfc08", - "sha256:7cec2af81f9e7569280822be68bd57e51b86d42e59ea30d10ebdbb22d2cb7232", - "sha256:8383a6c8cefba1b7cecc0149415046b6fc38836295bc4c84e820872eb5478b3d", - "sha256:8c836309931839cca658a78a888dab9676b5c988d0dd34ca247f5f3e679f4e7a", - "sha256:8e317953bb4c074c06c798a11dbdd2cf9979dbcaa8ccc0fa4701d80042d4ebf1", - "sha256:923b7b1c717bd0f0f92d862d1ff51d9b2b55dbbd133e05680204465f454bb286", - "sha256:990fb20b32990b2ce2c5f974c3e738c9358b2735bc05075d50a6f36721b8f303", - "sha256:9aad68c3f2566dfae84bf46295a79e79d904e1c21ccfc66de88cd446f8686341", - "sha256:a5812840d1d00eafae6585aba38021f90a705a25b8216ec7f66aebe5b619fb84", - "sha256:a6519d917abb15e12380406d721e37613e2a67d166f9fb7e5a8ce0375744cd45", - "sha256:ab0b028165eea880af12f66086694768f2c3139b2c31ad5e032c8edbafca6ffc", - "sha256:aea7da970f1feccf48be7335f8b2ca64baf9b589d79e05b9397a06696ce1a1ec", - "sha256:b1196e13c45e327d6cd0b6e471530a1882f1017eb83c6229fc613cd1a11b53cd", - "sha256:b368e1aee1b9b75757942d44d7598dcd22a9dbb126affcbba82d15917f0cc155", - "sha256:bde997cac85fcac227b27d4fb2c7608a2c5f6558469b0eb704c5726ae49e1c52", - "sha256:c4c2872b3c91f9baa836147ca33650dc5c172e9273c808c3c3199c75490e709d", - "sha256:c59d2ad092dc0551d9f79d9d44d005c945ba95832a6798f98f9216ede3d5f485", - "sha256:d1da0a2e3b37b745a2b2a678a4c796462cf753aebf94edcc87dcc6b8641eae31", - "sha256:d8b7339180d00de83e930358223c617cc343dd08e1aa5ec7b06c3a121aec4e1d", - "sha256:dd4b3355b01273a56b20c219e74e7549e14370b31a4ffe42706a8cda91f19f6d", - "sha256:e08c470c2eb01977d221fd87495b44867a56d4d594f43739a8028f8646a51e0d", - "sha256:f5102a92855d518b0996eb197772f5ac2a527c0ec617124ad5242a3af5e25f85", - "sha256:f542287b1489c7a860d43a7d8883e27ca62ab84ca53c965d11dac1d3a1fab7ce", - "sha256:f78300789a708ac1f17e134593f577407d52d0417305435b134805c4fb135adb", - "sha256:f81bc26d609bf0fbc622c7122ba6307993c83c795d2d6f6f6fd8c000a770d974", - "sha256:f836c174c3a7f639bded48ec913f348c4761cbf49de4a20a956d3431a7c9cb24", - "sha256:fa21a04112c59ad54f69d80e376f7f9d0f5f9123ab87ecd18fbb9ec3a2beed56", - "sha256:fcf7d1d6f5da887ca04302db8e0e0cf56ce9a5e05f202720e49b3e8157ddb9a9", - "sha256:fd27d8b49e574e50caa65196d908f80e4dff64d7e592d0c59788b45aad7e8b35" + "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", + "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", + "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", + "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", + "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", + "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", + "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", + "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", + "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", + "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", + "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", + "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", + "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", + "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", + "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", + "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", + "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", + "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", + "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", + "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", + "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", + "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", + "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", + "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", + "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", + "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", + "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", + "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", + "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", + "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", + "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", + "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", + "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", + "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", + "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", + "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", + "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", + "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", + "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", + "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", + "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", + "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", + "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", + "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", + "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", + "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", + "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", + "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", + "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", + "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", + "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", + "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", + "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", + "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", + "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", + "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", + "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", + "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", + "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", + "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", + "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", + "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", + "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", + "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", + "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", + "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", + "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", + "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", + "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", + "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", + "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", + "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc" ], "markers": "python_version >= '3.8'", - "version": "==7.5.3" + "version": "==7.6.1" }, "cryptography": { "hashes": [ - "sha256:013629ae70b40af70c9a7a5db40abe5d9054e6f4380e50ce769947b73bf3caad", - "sha256:2346b911eb349ab547076f47f2e035fc8ff2c02380a7cbbf8d87114fa0f1c583", - "sha256:2f66d9cd9147ee495a8374a45ca445819f8929a3efcd2e3df6428e46c3cbb10b", - "sha256:2f88d197e66c65be5e42cd72e5c18afbfae3f741742070e3019ac8f4ac57262c", - "sha256:31f721658a29331f895a5a54e7e82075554ccfb8b163a18719d342f5ffe5ecb1", - "sha256:343728aac38decfdeecf55ecab3264b015be68fc2816ca800db649607aeee648", - "sha256:5226d5d21ab681f432a9c1cf8b658c0cb02533eece706b155e5fbd8a0cdd3949", - "sha256:57080dee41209e556a9a4ce60d229244f7a66ef52750f813bfbe18959770cfba", - "sha256:5a94eccb2a81a309806027e1670a358b99b8fe8bfe9f8d329f27d72c094dde8c", - "sha256:6b7c4f03ce01afd3b76cf69a5455caa9cfa3de8c8f493e0d3ab7d20611c8dae9", - "sha256:7016f837e15b0a1c119d27ecd89b3515f01f90a8615ed5e9427e30d9cdbfed3d", - "sha256:81884c4d096c272f00aeb1f11cf62ccd39763581645b0812e99a91505fa48e0c", - "sha256:81d8a521705787afe7a18d5bfb47ea9d9cc068206270aad0b96a725022e18d2e", - "sha256:8d09d05439ce7baa8e9e95b07ec5b6c886f548deb7e0f69ef25f64b3bce842f2", - "sha256:961e61cefdcb06e0c6d7e3a1b22ebe8b996eb2bf50614e89384be54c48c6b63d", - "sha256:9c0c1716c8447ee7dbf08d6db2e5c41c688544c61074b54fc4564196f55c25a7", - "sha256:a0608251135d0e03111152e41f0cc2392d1e74e35703960d4190b2e0f4ca9c70", - "sha256:a0c5b2b0585b6af82d7e385f55a8bc568abff8923af147ee3c07bd8b42cda8b2", - "sha256:ad803773e9df0b92e0a817d22fd8a3675493f690b96130a5e24f1b8fabbea9c7", - "sha256:b297f90c5723d04bcc8265fc2a0f86d4ea2e0f7ab4b6994459548d3a6b992a14", - "sha256:ba4f0a211697362e89ad822e667d8d340b4d8d55fae72cdd619389fb5912eefe", - "sha256:c4783183f7cb757b73b2ae9aed6599b96338eb957233c58ca8f49a49cc32fd5e", - "sha256:c9bb2ae11bfbab395bdd072985abde58ea9860ed84e59dbc0463a5d0159f5b71", - "sha256:cafb92b2bc622cd1aa6a1dce4b93307792633f4c5fe1f46c6b97cf67073ec961", - "sha256:d45b940883a03e19e944456a558b67a41160e367a719833c53de6911cabba2b7", - "sha256:dc0fdf6787f37b1c6b08e6dfc892d9d068b5bdb671198c72072828b80bd5fe4c", - "sha256:dea567d1b0e8bc5764b9443858b673b734100c2871dc93163f58c46a97a83d28", - "sha256:dec9b018df185f08483f294cae6ccac29e7a6e0678996587363dc352dc65c842", - "sha256:e3ec3672626e1b9e55afd0df6d774ff0e953452886e06e0f1eb7eb0c832e8902", - "sha256:e599b53fd95357d92304510fb7bda8523ed1f79ca98dce2f43c115950aa78801", - "sha256:fa76fbb7596cc5839320000cdd5d0955313696d9511debab7ee7278fc8b5c84a", - "sha256:fff12c88a672ab9c9c1cf7b0c80e3ad9e2ebd9d828d955c126be4fd3e5578c9e" + "sha256:014f58110f53237ace6a408b5beb6c427b64e084eb451ef25a28308270086494", + "sha256:1bbcce1a551e262dfbafb6e6252f1ae36a248e615ca44ba302df077a846a8806", + "sha256:203e92a75716d8cfb491dc47c79e17d0d9207ccffcbcb35f598fbe463ae3444d", + "sha256:27e613d7077ac613e399270253259d9d53872aaf657471473ebfc9a52935c062", + "sha256:2bd51274dcd59f09dd952afb696bf9c61a7a49dfc764c04dd33ef7a6b502a1e2", + "sha256:38926c50cff6f533f8a2dae3d7f19541432610d114a70808f0926d5aaa7121e4", + "sha256:511f4273808ab590912a93ddb4e3914dfd8a388fed883361b02dea3791f292e1", + "sha256:58d4e9129985185a06d849aa6df265bdd5a74ca6e1b736a77959b498e0505b85", + "sha256:5b43d1ea6b378b54a1dc99dd8a2b5be47658fe9a7ce0a58ff0b55f4b43ef2b84", + "sha256:61ec41068b7b74268fa86e3e9e12b9f0c21fcf65434571dbb13d954bceb08042", + "sha256:666ae11966643886c2987b3b721899d250855718d6d9ce41b521252a17985f4d", + "sha256:68aaecc4178e90719e95298515979814bda0cbada1256a4485414860bd7ab962", + "sha256:7c05650fe8023c5ed0d46793d4b7d7e6cd9c04e68eabe5b0aeea836e37bdcec2", + "sha256:80eda8b3e173f0f247f711eef62be51b599b5d425c429b5d4ca6a05e9e856baa", + "sha256:8385d98f6a3bf8bb2d65a73e17ed87a3ba84f6991c155691c51112075f9ffc5d", + "sha256:88cce104c36870d70c49c7c8fd22885875d950d9ee6ab54df2745f83ba0dc365", + "sha256:9d3cdb25fa98afdd3d0892d132b8d7139e2c087da1712041f6b762e4f807cc96", + "sha256:a575913fb06e05e6b4b814d7f7468c2c660e8bb16d8d5a1faf9b33ccc569dd47", + "sha256:ac119bb76b9faa00f48128b7f5679e1d8d437365c5d26f1c2c3f0da4ce1b553d", + "sha256:c1332724be35d23a854994ff0b66530119500b6053d0bd3363265f7e5e77288d", + "sha256:d03a475165f3134f773d1388aeb19c2d25ba88b6a9733c5c590b9ff7bbfa2e0c", + "sha256:d75601ad10b059ec832e78823b348bfa1a59f6b8d545db3a24fd44362a1564cb", + "sha256:de41fd81a41e53267cb020bb3a7212861da53a7d39f863585d13ea11049cf277", + "sha256:e710bf40870f4db63c3d7d929aa9e09e4e7ee219e703f949ec4073b4294f6172", + "sha256:ea25acb556320250756e53f9e20a4177515f012c9eaea17eb7587a8c4d8ae034", + "sha256:f98bf604c82c416bc829e490c700ca1553eafdf2912a91e23a79d97d9801372a", + "sha256:fba1007b3ef89946dbbb515aeeb41e30203b004f0b4b00e5e16078b518563289" ], + "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.1" }, "decorator": { "hashes": [ "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" ], - "markers": "python_version > '3.6' and python_version < '3.11'", + "markers": "python_version >= '3.5'", "version": "==5.1.1" }, "dill": { @@ -1869,12 +1916,12 @@ }, "django": { "hashes": [ - "sha256:61ee4a130efb8c451ef3467c67ca99fdce400fedd768634efc86a68c18d80d30", - "sha256:c77f926b81129493961e19c0e02188f8d07c112a1162df69bfab178ae447f94a" + "sha256:1ddc333a16fc139fd253035a1606bb24261951bbc3a6ca256717fa06cc41a898", + "sha256:6f1616c2786c408ce86ab7e10f792b8f15742f7b7b7460243929cb371e7f1dad" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.2.15" + "version": "==4.2.16" }, "django-debug-toolbar": { "hashes": [ @@ -1918,11 +1965,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", + "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" ], "markers": "python_version < '3.11'", - "version": "==1.2.1" + "version": "==1.2.2" }, "execnet": { "hashes": [ @@ -1934,11 +1981,11 @@ }, "executing": { "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + "sha256:8d63781349375b5ebccc3142f4b30350c0cd9c79f921cde38be2be4637e98eaf", + "sha256:8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab" ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" + "markers": "python_version >= '3.8'", + "version": "==2.1.0" }, "faker": { "hashes": [ @@ -1999,7 +2046,7 @@ "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d", "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb" ], - "markers": "python_version >= '3.6.0'", + "markers": "python_full_version >= '3.6.0'", "version": "==4.1.0" }, "hpack": { @@ -2015,16 +2062,16 @@ "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15", "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914" ], - "markers": "python_version >= '3.6.0'", + "markers": "python_full_version >= '3.6.0'", "version": "==6.0.1" }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", + "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.10" }, "ipdb": { "hashes": [ @@ -2235,11 +2282,11 @@ }, "more-itertools": { "hashes": [ - "sha256:e5d93ef411224fbcef366a6e8ddc4c5781bc6359d43412a65dd5964e46111463", - "sha256:ea6a02e24a9161e51faad17a8782b92a0df82c12c1c8886fec7f0c3fa1a1b320" + "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", + "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6" ], "markers": "python_version >= '3.8'", - "version": "==10.3.0" + "version": "==10.5.0" }, "moto": { "extras": [ @@ -2285,11 +2332,11 @@ }, "parse-type": { "hashes": [ - "sha256:06d39a8b70fde873eb2a131141a0e79bb34a432941fb3d66fad247abafc9766c", - "sha256:79b1f2497060d0928bc46016793f1fca1057c4aacdf15ef876aa48d75a73a355" + "sha256:8d94a52e0197fbad63fee8f70df16e6ed689e5e4f105b705c9afa7a30397a5aa", + "sha256:8e99d2f52fab2f0f1f3d68ba9d026060140bf0e53680aada0111fb27b2f0e93a" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1'", - "version": "==0.6.2" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.6.3" }, "parso": { "hashes": [ @@ -2309,11 +2356,11 @@ }, "pbr": { "hashes": [ - "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda", - "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9" + "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24", + "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a" ], "markers": "python_version >= '2.6'", - "version": "==6.0.0" + "version": "==6.1.0" }, "pep8-naming": { "hashes": [ @@ -2339,11 +2386,11 @@ }, "platformdirs": { "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" + "sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907", + "sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb" ], "markers": "python_version >= '3.8'", - "version": "==4.2.2" + "version": "==4.3.6" }, "pluggy": { "hashes": [ @@ -2367,7 +2414,7 @@ "sha256:cc8f09e79bdd32247edddf05b666940e88ad96338a84f5717b1e8c0678337821" ], "index": "pypi", - "markers": "python_full_version >= '3.7.2' and python_version < '4.0'", + "markers": "python_version < '4.0' and python_full_version >= '3.7.2'", "version": "==1.10.2" }, "ptyprocess": { @@ -2379,10 +2426,10 @@ }, "pure-eval": { "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", + "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42" ], - "version": "==0.2.2" + "version": "==0.2.3" }, "py": { "hashes": [ @@ -2401,11 +2448,11 @@ }, "pyasn1": { "hashes": [ - "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", - "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" + "sha256:0d632f46f2ba09143da3a8afe9e33fb6f92fa2320ab7e886e2d0f7672af84629", + "sha256:6f580d2bdd84365380830acf45550f2511469f673cb4a5ae3857a3170128b034" ], "markers": "python_version >= '3.8'", - "version": "==0.6.0" + "version": "==0.6.1" }, "pycodestyle": { "hashes": [ @@ -2489,19 +2536,19 @@ }, "pyopenssl": { "hashes": [ - "sha256:17ed5be5936449c5418d1cd269a1a9e9081bc54c17aed272b45856a3d3dc86ad", - "sha256:cabed4bfaa5df9f1a16c0ef64a0cb65318b5cd077a7eda7d6970131ca2f41a6f" + "sha256:4247f0dbe3748d560dcbb2ff3ea01af0f9a1a001ef5f7c4c647956ed8cbf0e95", + "sha256:967d5719b12b243588573f39b0c677637145c7a1ffedcd495a487e58177fbb8d" ], "markers": "python_version >= '3.7'", - "version": "==24.1.0" + "version": "==24.2.1" }, "pyparsing": { "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" + "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", + "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032" ], "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" + "version": "==3.1.4" }, "pysocks": { "hashes": [ @@ -2618,7 +2665,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "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": { @@ -2641,60 +2688,62 @@ }, "pyyaml": { "hashes": [ - "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5", - "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc", - "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df", - "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741", - "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206", - "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27", - "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595", - "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62", - "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98", - "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696", - "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290", - "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9", - "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d", - "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6", - "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867", - "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47", - "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486", - "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6", - "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3", - "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007", - "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938", - "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0", - "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c", - "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735", - "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d", - "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28", - "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4", - "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba", - "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8", - "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef", - "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5", - "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd", - "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3", - "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0", - "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515", - "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c", - "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c", - "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924", - "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34", - "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43", - "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859", - "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673", - "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54", - "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a", - "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b", - "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab", - "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa", - "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c", - "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585", - "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d", - "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f" + "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", + "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", + "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", + "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", + "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", + "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", + "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", + "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", + "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", + "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", + "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", + "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", + "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", + "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", + "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", + "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", + "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", + "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", + "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", + "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", + "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", + "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", + "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", + "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", + "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", + "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", + "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", + "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", + "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", + "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", + "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", + "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", + "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", + "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", + "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", + "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", + "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", + "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", + "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", + "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", + "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", + "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", + "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", + "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", + "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", + "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", + "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", + "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", + "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", + "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", + "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba", + "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12", + "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4" ], - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "markers": "python_version >= '3.8'", + "version": "==6.0.2" }, "requests": { "extras": [ @@ -2735,11 +2784,11 @@ }, "rich": { "hashes": [ - "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", - "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" + "sha256:1760a3c0848469b97b558fc61c85233e3dafb69c7a071b4d60c38099d3cd4c06", + "sha256:8260cda28e3db6bf04d2d1ef4dbc03ba80a824c88b0e7668a0f23126a424844a" ], "markers": "python_full_version >= '3.7.0'", - "version": "==13.7.1" + "version": "==13.8.1" }, "s3transfer": { "hashes": [ @@ -2793,19 +2842,19 @@ }, "setuptools": { "hashes": [ - "sha256:d0b9a8433464d5800cbe05094acf5c6d52a91bfac9b52bcfc4d41382be5d5d31", - "sha256:e197a19aa8ec9722928f2206f8de752def0e4c9fc6953527360d1c36d94ddb2f" + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" ], "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==65.5.1" + "markers": "python_version >= '3.8'", + "version": "==70.0.0" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "smmap": { @@ -2840,11 +2889,11 @@ }, "sqlparse": { "hashes": [ - "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93", - "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663" + "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", + "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "markers": "python_version >= '3.8'", - "version": "==0.5.0" + "version": "==0.5.1" }, "stack-data": { "hashes": [ @@ -2855,11 +2904,11 @@ }, "stevedore": { "hashes": [ - "sha256:1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9", - "sha256:46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d" + "sha256:1efd34ca08f474dad08d9b19e934a22c68bb6fe416926479ba29e5013bcc8f78", + "sha256:9a64265f4060312828151c204efbe9b7a9852a0d9228756344dbc7e4023e375a" ], "markers": "python_version >= '3.8'", - "version": "==5.2.0" + "version": "==5.3.0" }, "text-unidecode": { "hashes": [ @@ -2873,7 +2922,7 @@ "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" }, "tomli": { @@ -2886,11 +2935,11 @@ }, "tomlkit": { "hashes": [ - "sha256:af914f5a9c59ed9d0762c7b64d3b5d5df007448eb9cd2edc8a46b1eafead172f", - "sha256:eef34fba39834d4d6b73c9ba7f3e4d1c417a4e56f89a7e96e090dd0d24b8fb3c" + "sha256:7a974427f6e119197f670fbbbeae7bef749a6c14e793db934baefc1b5f03efde", + "sha256:fff5fe59a87295b278abd31bec92c15d9bc4a06885ab12bcea52c71119392e79" ], - "markers": "python_version >= '3.7'", - "version": "==0.12.5" + "markers": "python_version >= '3.8'", + "version": "==0.13.2" }, "traitlets": { "hashes": [ @@ -2902,11 +2951,11 @@ }, "trio": { "hashes": [ - "sha256:9f5314f014ea3af489e77b001861c535005c3858d38ec46b6b071ebfa339d7fb", - "sha256:e42617ba091e7b2e50c899052e83a3c403101841de925187f61e7b7eaebdf3fb" + "sha256:0346c3852c15e5c7d40ea15972c4805689ef2cb8b5206f794c9c19450119f3a4", + "sha256:c5237e8133eb0a1d72f09a971a55c28ebe69e351c783fc64bc37db8db8bbe1d0" ], "markers": "python_version >= '3.8'", - "version": "==0.25.1" + "version": "==0.26.2" }, "trio-websocket": { "hashes": [ @@ -2921,16 +2970,16 @@ "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" ], - "markers": "python_version < '3.11'", + "markers": "python_version < '3.10'", "version": "==4.12.2" }, "urllib3": { "hashes": [ - "sha256:37a0344459b199fce0e80b0d3569837ec6b6937435c5244e7fd73fa6006830f3", - "sha256:3e3d753a8618b86d7de333b4223005f68720bcd6a7d2bcb9fbd2229ec7c1e429" + "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e", + "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32" ], - "markers": "python_version >= '3.6'", - "version": "==1.26.19" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", + "version": "==1.26.20" }, "wcwidth": { "hashes": [ @@ -2941,20 +2990,20 @@ }, "webdriver-manager": { "hashes": [ - "sha256:25ec177c6a2ce9c02fb8046f1b2732701a9418d6a977967bb065d840a3175d87", - "sha256:d7970052295bb9cda2c1a24cf0b872dd2c41ababcc78f7b6b8dc37a41e979a7e" + "sha256:75908d92ecc45ff2b9953614459c633db8f9aa1ff30181cefe8696e312908129", + "sha256:efedf428f92fd6d5c924a0d054e6d1322dd77aab790e834ee767af392b35590f" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==4.0.1" + "version": "==4.0.2" }, "werkzeug": { "hashes": [ - "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", - "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + "sha256:02c9eb92b7d6c06f31a782811505d2157837cea66aaede3e217c7c27c039476c", + "sha256:34f2371506b250df4d4f84bfe7b0921e4762525762bbd936614909fe25cd7306" ], "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "version": "==3.0.4" }, "wrapt": { "hashes": [ @@ -3050,55 +3099,106 @@ }, "zstandard": { "hashes": [ - "sha256:11f0d1aab9516a497137b41e3d3ed4bbf7b2ee2abc79e5c8b010ad286d7464bd", - "sha256:1958100b8a1cc3f27fa21071a55cb2ed32e9e5df4c3c6e661c193437f171cba2", - "sha256:1a90ba9a4c9c884bb876a14be2b1d216609385efb180393df40e5172e7ecf356", - "sha256:1d43501f5f31e22baf822720d82b5547f8a08f5386a883b32584a185675c8fbf", - "sha256:23d2b3c2b8e7e5a6cb7922f7c27d73a9a615f0a5ab5d0e03dd533c477de23004", - "sha256:2612e9bb4977381184bb2463150336d0f7e014d6bb5d4a370f9a372d21916f69", - "sha256:275df437ab03f8c033b8a2c181e51716c32d831082d93ce48002a5227ec93019", - "sha256:2ac9957bc6d2403c4772c890916bf181b2653640da98f32e04b96e4d6fb3252a", - "sha256:2b11ea433db22e720758cba584c9d661077121fcf60ab43351950ded20283440", - "sha256:2fdd53b806786bd6112d97c1f1e7841e5e4daa06810ab4b284026a1a0e484c0b", - "sha256:33591d59f4956c9812f8063eff2e2c0065bc02050837f152574069f5f9f17775", - "sha256:36a47636c3de227cd765e25a21dc5dace00539b82ddd99ee36abae38178eff9e", - "sha256:39b2853efc9403927f9065cc48c9980649462acbdf81cd4f0cb773af2fd734bc", - "sha256:3db41c5e49ef73641d5111554e1d1d3af106410a6c1fb52cf68912ba7a343a0d", - "sha256:445b47bc32de69d990ad0f34da0e20f535914623d1e506e74d6bc5c9dc40bb09", - "sha256:466e6ad8caefb589ed281c076deb6f0cd330e8bc13c5035854ffb9c2014b118c", - "sha256:48f260e4c7294ef275744210a4010f116048e0c95857befb7462e033f09442fe", - "sha256:4ac59d5d6910b220141c1737b79d4a5aa9e57466e7469a012ed42ce2d3995e88", - "sha256:53866a9d8ab363271c9e80c7c2e9441814961d47f88c9bc3b248142c32141d94", - "sha256:589402548251056878d2e7c8859286eb91bd841af117dbe4ab000e6450987e08", - "sha256:68953dc84b244b053c0d5f137a21ae8287ecf51b20872eccf8eaac0302d3e3b0", - "sha256:6c25b8eb733d4e741246151d895dd0308137532737f337411160ff69ca24f93a", - "sha256:7034d381789f45576ec3f1fa0e15d741828146439228dc3f7c59856c5bcd3292", - "sha256:73a1d6bd01961e9fd447162e137ed949c01bdb830dfca487c4a14e9742dccc93", - "sha256:8226a33c542bcb54cd6bd0a366067b610b41713b64c9abec1bc4533d69f51e70", - "sha256:888196c9c8893a1e8ff5e89b8f894e7f4f0e64a5af4d8f3c410f0319128bb2f8", - "sha256:88c5b4b47a8a138338a07fc94e2ba3b1535f69247670abfe422de4e0b344aae2", - "sha256:8a1b2effa96a5f019e72874969394edd393e2fbd6414a8208fea363a22803b45", - "sha256:93e1856c8313bc688d5df069e106a4bc962eef3d13372020cc6e3ebf5e045202", - "sha256:9501f36fac6b875c124243a379267d879262480bf85b1dbda61f5ad4d01b75a3", - "sha256:959665072bd60f45c5b6b5d711f15bdefc9849dd5da9fb6c873e35f5d34d8cfb", - "sha256:a1d67d0d53d2a138f9e29d8acdabe11310c185e36f0a848efa104d4e40b808e4", - "sha256:a493d470183ee620a3df1e6e55b3e4de8143c0ba1b16f3ded83208ea8ddfd91d", - "sha256:a7ccf5825fd71d4542c8ab28d4d482aace885f5ebe4b40faaa290eed8e095a4c", - "sha256:a88b7df61a292603e7cd662d92565d915796b094ffb3d206579aaebac6b85d5f", - "sha256:a97079b955b00b732c6f280d5023e0eefe359045e8b83b08cf0333af9ec78f26", - "sha256:d22fdef58976457c65e2796e6730a3ea4a254f3ba83777ecfc8592ff8d77d303", - "sha256:d75f693bb4e92c335e0645e8845e553cd09dc91616412d1d4650da835b5449df", - "sha256:d8593f8464fb64d58e8cb0b905b272d40184eac9a18d83cf8c10749c3eafcd7e", - "sha256:d8fff0f0c1d8bc5d866762ae95bd99d53282337af1be9dc0d88506b340e74b73", - "sha256:de20a212ef3d00d609d0b22eb7cc798d5a69035e81839f549b538eff4105d01c", - "sha256:e9e9d4e2e336c529d4c435baad846a181e39a982f823f7e4495ec0b0ec8538d2", - "sha256:f058a77ef0ece4e210bb0450e68408d4223f728b109764676e1a13537d056bb0", - "sha256:f1a4b358947a65b94e2501ce3e078bbc929b039ede4679ddb0460829b12f7375", - "sha256:f9b2cde1cd1b2a10246dbc143ba49d942d14fb3d2b4bccf4618d475c65464912", - "sha256:fe3390c538f12437b859d815040763abc728955a52ca6ff9c5d4ac707c4ad98e" + "sha256:034b88913ecc1b097f528e42b539453fa82c3557e414b3de9d5632c80439a473", + "sha256:0a7f0804bb3799414af278e9ad51be25edf67f78f916e08afdb983e74161b916", + "sha256:11e3bf3c924853a2d5835b24f03eeba7fc9b07d8ca499e247e06ff5676461a15", + "sha256:12a289832e520c6bd4dcaad68e944b86da3bad0d339ef7989fb7e88f92e96072", + "sha256:1516c8c37d3a053b01c1c15b182f3b5f5eef19ced9b930b684a73bad121addf4", + "sha256:157e89ceb4054029a289fb504c98c6a9fe8010f1680de0201b3eb5dc20aa6d9e", + "sha256:1bfe8de1da6d104f15a60d4a8a768288f66aa953bbe00d027398b93fb9680b26", + "sha256:1e172f57cd78c20f13a3415cc8dfe24bf388614324d25539146594c16d78fcc8", + "sha256:1fd7e0f1cfb70eb2f95a19b472ee7ad6d9a0a992ec0ae53286870c104ca939e5", + "sha256:203d236f4c94cd8379d1ea61db2fce20730b4c38d7f1c34506a31b34edc87bdd", + "sha256:27d3ef2252d2e62476389ca8f9b0cf2bbafb082a3b6bfe9d90cbcbb5529ecf7c", + "sha256:29a2bc7c1b09b0af938b7a8343174b987ae021705acabcbae560166567f5a8db", + "sha256:2ef230a8fd217a2015bc91b74f6b3b7d6522ba48be29ad4ea0ca3a3775bf7dd5", + "sha256:2ef3775758346d9ac6214123887d25c7061c92afe1f2b354f9388e9e4d48acfc", + "sha256:2f146f50723defec2975fb7e388ae3a024eb7151542d1599527ec2aa9cacb152", + "sha256:2fb4535137de7e244c230e24f9d1ec194f61721c86ebea04e1581d9d06ea1269", + "sha256:32ba3b5ccde2d581b1e6aa952c836a6291e8435d788f656fe5976445865ae045", + "sha256:34895a41273ad33347b2fc70e1bff4240556de3c46c6ea430a7ed91f9042aa4e", + "sha256:379b378ae694ba78cef921581ebd420c938936a153ded602c4fea612b7eaa90d", + "sha256:38302b78a850ff82656beaddeb0bb989a0322a8bbb1bf1ab10c17506681d772a", + "sha256:3aa014d55c3af933c1315eb4bb06dd0459661cc0b15cd61077afa6489bec63bb", + "sha256:4051e406288b8cdbb993798b9a45c59a4896b6ecee2f875424ec10276a895740", + "sha256:40b33d93c6eddf02d2c19f5773196068d875c41ca25730e8288e9b672897c105", + "sha256:43da0f0092281bf501f9c5f6f3b4c975a8a0ea82de49ba3f7100e64d422a1274", + "sha256:445e4cb5048b04e90ce96a79b4b63140e3f4ab5f662321975679b5f6360b90e2", + "sha256:48ef6a43b1846f6025dde6ed9fee0c24e1149c1c25f7fb0a0585572b2f3adc58", + "sha256:50a80baba0285386f97ea36239855f6020ce452456605f262b2d33ac35c7770b", + "sha256:519fbf169dfac1222a76ba8861ef4ac7f0530c35dd79ba5727014613f91613d4", + "sha256:53dd9d5e3d29f95acd5de6802e909ada8d8d8cfa37a3ac64836f3bc4bc5512db", + "sha256:53ea7cdc96c6eb56e76bb06894bcfb5dfa93b7adcf59d61c6b92674e24e2dd5e", + "sha256:576856e8594e6649aee06ddbfc738fec6a834f7c85bf7cadd1c53d4a58186ef9", + "sha256:59556bf80a7094d0cfb9f5e50bb2db27fefb75d5138bb16fb052b61b0e0eeeb0", + "sha256:5d41d5e025f1e0bccae4928981e71b2334c60f580bdc8345f824e7c0a4c2a813", + "sha256:61062387ad820c654b6a6b5f0b94484fa19515e0c5116faf29f41a6bc91ded6e", + "sha256:61f89436cbfede4bc4e91b4397eaa3e2108ebe96d05e93d6ccc95ab5714be512", + "sha256:62136da96a973bd2557f06ddd4e8e807f9e13cbb0bfb9cc06cfe6d98ea90dfe0", + "sha256:64585e1dba664dc67c7cdabd56c1e5685233fbb1fc1966cfba2a340ec0dfff7b", + "sha256:65308f4b4890aa12d9b6ad9f2844b7ee42c7f7a4fd3390425b242ffc57498f48", + "sha256:66b689c107857eceabf2cf3d3fc699c3c0fe8ccd18df2219d978c0283e4c508a", + "sha256:6a41c120c3dbc0d81a8e8adc73312d668cd34acd7725f036992b1b72d22c1772", + "sha256:6f77fa49079891a4aab203d0b1744acc85577ed16d767b52fc089d83faf8d8ed", + "sha256:72c68dda124a1a138340fb62fa21b9bf4848437d9ca60bd35db36f2d3345f373", + "sha256:752bf8a74412b9892f4e5b58f2f890a039f57037f52c89a740757ebd807f33ea", + "sha256:76e79bc28a65f467e0409098fa2c4376931fd3207fbeb6b956c7c476d53746dd", + "sha256:774d45b1fac1461f48698a9d4b5fa19a69d47ece02fa469825b442263f04021f", + "sha256:77da4c6bfa20dd5ea25cbf12c76f181a8e8cd7ea231c673828d0386b1740b8dc", + "sha256:77ea385f7dd5b5676d7fd943292ffa18fbf5c72ba98f7d09fc1fb9e819b34c23", + "sha256:80080816b4f52a9d886e67f1f96912891074903238fe54f2de8b786f86baded2", + "sha256:80a539906390591dd39ebb8d773771dc4db82ace6372c4d41e2d293f8e32b8db", + "sha256:82d17e94d735c99621bf8ebf9995f870a6b3e6d14543b99e201ae046dfe7de70", + "sha256:837bb6764be6919963ef41235fd56a6486b132ea64afe5fafb4cb279ac44f259", + "sha256:84433dddea68571a6d6bd4fbf8ff398236031149116a7fff6f777ff95cad3df9", + "sha256:8c24f21fa2af4bb9f2c492a86fe0c34e6d2c63812a839590edaf177b7398f700", + "sha256:8ed7d27cb56b3e058d3cf684d7200703bcae623e1dcc06ed1e18ecda39fee003", + "sha256:9206649ec587e6b02bd124fb7799b86cddec350f6f6c14bc82a2b70183e708ba", + "sha256:983b6efd649723474f29ed42e1467f90a35a74793437d0bc64a5bf482bedfa0a", + "sha256:98da17ce9cbf3bfe4617e836d561e433f871129e3a7ac16d6ef4c680f13a839c", + "sha256:9c236e635582742fee16603042553d276cca506e824fa2e6489db04039521e90", + "sha256:9da6bc32faac9a293ddfdcb9108d4b20416219461e4ec64dfea8383cac186690", + "sha256:a05e6d6218461eb1b4771d973728f0133b2a4613a6779995df557f70794fd60f", + "sha256:a0817825b900fcd43ac5d05b8b3079937073d2b1ff9cf89427590718b70dd840", + "sha256:a4ae99c57668ca1e78597d8b06d5af837f377f340f4cce993b551b2d7731778d", + "sha256:a8c86881813a78a6f4508ef9daf9d4995b8ac2d147dcb1a450448941398091c9", + "sha256:a8fffdbd9d1408006baaf02f1068d7dd1f016c6bcb7538682622c556e7b68e35", + "sha256:a9b07268d0c3ca5c170a385a0ab9fb7fdd9f5fd866be004c4ea39e44edce47dd", + "sha256:ab19a2d91963ed9e42b4e8d77cd847ae8381576585bad79dbd0a8837a9f6620a", + "sha256:ac184f87ff521f4840e6ea0b10c0ec90c6b1dcd0bad2f1e4a9a1b4fa177982ea", + "sha256:b0e166f698c5a3e914947388c162be2583e0c638a4703fc6a543e23a88dea3c1", + "sha256:b2170c7e0367dde86a2647ed5b6f57394ea7f53545746104c6b09fc1f4223573", + "sha256:b2d8c62d08e7255f68f7a740bae85b3c9b8e5466baa9cbf7f57f1cde0ac6bc09", + "sha256:b4567955a6bc1b20e9c31612e615af6b53733491aeaa19a6b3b37f3b65477094", + "sha256:b69bb4f51daf461b15e7b3db033160937d3ff88303a7bc808c67bbc1eaf98c78", + "sha256:b8c0bd73aeac689beacd4e7667d48c299f61b959475cdbb91e7d3d88d27c56b9", + "sha256:be9b5b8659dff1f913039c2feee1aca499cfbc19e98fa12bc85e037c17ec6ca5", + "sha256:bf0a05b6059c0528477fba9054d09179beb63744355cab9f38059548fedd46a9", + "sha256:c16842b846a8d2a145223f520b7e18b57c8f476924bda92aeee3a88d11cfc391", + "sha256:c363b53e257246a954ebc7c488304b5592b9c53fbe74d03bc1c64dda153fb847", + "sha256:c7c517d74bea1a6afd39aa612fa025e6b8011982a0897768a2f7c8ab4ebb78a2", + "sha256:d20fd853fbb5807c8e84c136c278827b6167ded66c72ec6f9a14b863d809211c", + "sha256:d2240ddc86b74966c34554c49d00eaafa8200a18d3a5b6ffbf7da63b11d74ee2", + "sha256:d477ed829077cd945b01fc3115edd132c47e6540ddcd96ca169facff28173057", + "sha256:d50d31bfedd53a928fed6707b15a8dbeef011bb6366297cc435accc888b27c20", + "sha256:dc1d33abb8a0d754ea4763bad944fd965d3d95b5baef6b121c0c9013eaf1907d", + "sha256:dc5d1a49d3f8262be192589a4b72f0d03b72dcf46c51ad5852a4fdc67be7b9e4", + "sha256:e2d1a054f8f0a191004675755448d12be47fa9bebbcffa3cdf01db19f2d30a54", + "sha256:e7792606d606c8df5277c32ccb58f29b9b8603bf83b48639b7aedf6df4fe8171", + "sha256:ed1708dbf4d2e3a1c5c69110ba2b4eb6678262028afd6c6fbcc5a8dac9cda68e", + "sha256:f2d4380bf5f62daabd7b751ea2339c1a21d1c9463f1feb7fc2bdcea2c29c3160", + "sha256:f3513916e8c645d0610815c257cbfd3242adfd5c4cfa78be514e5a3ebb42a41b", + "sha256:f8346bfa098532bc1fb6c7ef06783e969d87a99dd1d2a5a18a892c1d7a643c58", + "sha256:f83fa6cae3fff8e98691248c9320356971b59678a17f20656a9e59cd32cee6d8", + "sha256:fa6ce8b52c5987b3e34d5674b0ab529a4602b632ebab0a93b07bfb4dfc8f8a33", + "sha256:fb2b1ecfef1e67897d336de3a0e3f52478182d6a47eda86cbd42504c5cbd009a", + "sha256:fc9ca1c9718cb3b06634c7c8dec57d24e9438b2aa9a0f02b8bb36bf478538880", + "sha256:fd30d9c67d13d891f2360b2a120186729c111238ac63b43dbd37a5a40670b8ca", + "sha256:fd7699e8fd9969f455ef2926221e0233f81a2542921471382e77a9e2f2b57f4b", + "sha256:fe3b385d996ee0822fd46528d9f0443b880d4d05528fd26a9119a54ec3f91c69" ], "markers": "python_version >= '3.8'", - "version": "==0.22.0" + "version": "==0.23.0" } } } From 5933b4c2ad2400e6fe9ad2570d8de7a44df68175 Mon Sep 17 00:00:00 2001 From: "mark.j0hnst0n" Date: Thu, 19 Sep 2024 17:05:30 +0100 Subject: [PATCH 02/19] update package.json --- package-lock.json | 63 ++++++++++++++++++++++++----------------------- package.json | 5 +++- 2 files changed, 36 insertions(+), 32 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0929ce523c..f68136589f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@popperjs/core": "^2.4.4", "@tarekraafat/autocomplete.js": "^8.3.2", "accessible-autocomplete": "^2.0.3", + "braces": "^3.0.3", "concurrently": "^8.2.0", "dotenv": "^15.0.0", "eslint-plugin-jest": "^27.2.3", @@ -27,6 +28,7 @@ "lightpick": "^1.6.2", "lodash.debounce": "^4.0.8", "mark.js": "^8.11.1", + "micromatch": ">=4.0.8", "moment": "^2.29.4", "parcel": "^2.11.0", "sass": "^1.38.0", @@ -34,7 +36,8 @@ "tippy.js": "^6.3.7", "tokenfield": "^1.5.0", "tributejs": "^5.1.3", - "url-search-params-polyfill": "^8.1.0" + "url-search-params-polyfill": "^8.1.0", + "ws": ">=8.17.1" }, "devDependencies": { "@testing-library/dom": "^8.14.0", @@ -4918,11 +4921,11 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -6238,9 +6241,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -8668,11 +8671,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -10281,10 +10284,9 @@ } }, "node_modules/ws": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz", - "integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==", - "dev": true, + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "engines": { "node": ">=10.0.0" }, @@ -13637,11 +13639,11 @@ } }, "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-process-hrtime": { @@ -14568,9 +14570,9 @@ } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "requires": { "to-regex-range": "^5.0.1" } @@ -16310,11 +16312,11 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -17494,10 +17496,9 @@ } }, "ws": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.0.tgz", - "integrity": "sha512-H/Z3H55mrcrgjFwI+5jKavgXvwQLtfPCUEp6pi35VhoB0pfcHnSoyuTzkBEZpzq49g1193CUEwIvmsjcotenYw==", - "dev": true, + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "requires": {} }, "xml-name-validator": { diff --git a/package.json b/package.json index e4367a76a2..da6070875d 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,10 @@ "tippy.js": "^6.3.7", "tokenfield": "^1.5.0", "tributejs": "^5.1.3", - "url-search-params-polyfill": "^8.1.0" + "url-search-params-polyfill": "^8.1.0", + "braces": "^3.0.3", + "micromatch": ">=4.0.8", + "ws": ">=8.17.1" }, "alias": { "core": "./core/assets/javascripts" From 58f6832390722073a7a6518086b49d07c9250727 Mon Sep 17 00:00:00 2001 From: "mark.j0hnst0n" Date: Thu, 19 Sep 2024 17:08:20 +0100 Subject: [PATCH 03/19] update again --- package-lock.json | 4 ++-- package.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index f68136589f..9527a6d91c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,7 @@ "lightpick": "^1.6.2", "lodash.debounce": "^4.0.8", "mark.js": "^8.11.1", - "micromatch": ">=4.0.8", + "micromatch": "^4.0.8", "moment": "^2.29.4", "parcel": "^2.11.0", "sass": "^1.38.0", @@ -37,7 +37,7 @@ "tokenfield": "^1.5.0", "tributejs": "^5.1.3", "url-search-params-polyfill": "^8.1.0", - "ws": ">=8.17.1" + "ws": "^8.17.1" }, "devDependencies": { "@testing-library/dom": "^8.14.0", diff --git a/package.json b/package.json index da6070875d..c61f7f5bdd 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,8 @@ "tributejs": "^5.1.3", "url-search-params-polyfill": "^8.1.0", "braces": "^3.0.3", - "micromatch": ">=4.0.8", - "ws": ">=8.17.1" + "micromatch": "^4.0.8", + "ws": "^8.17.1" }, "alias": { "core": "./core/assets/javascripts" From a63c3622ac2869f912e934b4f3746f31823e43db Mon Sep 17 00:00:00 2001 From: "mark.j0hnst0n" Date: Thu, 19 Sep 2024 17:10:48 +0100 Subject: [PATCH 04/19] update pipfile again --- Pipfile | 6 +++--- Pipfile.lock | 10 +++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Pipfile b/Pipfile index 116739631e..90fb58277b 100644 --- a/Pipfile +++ b/Pipfile @@ -52,7 +52,7 @@ markdown = "~=3.4.1" mohawk = ">=1.1.0" munch = "~=2.5.0" requests = {extras = ["security"], version = "~=2.21"} -sentry-sdk = ">=2.8.0" +sentry-sdk = "~=2.8.0" whitenoise = "~=5.3.0" crispy-forms-gds = "~=0.2.4" notifications-python-client = "~=6.4.1" @@ -63,7 +63,7 @@ deepmerge = "*" phonenumbers = "~=8.12.57" setuptools = "~=70.0.0" rules="~=3.3.0" -djangorestframework = ">=3.15.2" +djangorestframework = "~=3.15.2" django-chunk-upload-handlers = "~=0.0.13" django-compressor = "~=2.4.1" django-csp = "~=3.7" @@ -82,7 +82,7 @@ django-extra-views = "~=0.14.0" django = "~=4.2.15" django-log-formatter-asim = "~=0.0.5" dbt-copilot-python = "~=0.2.1" -cryptography = ">=43.0.1" +cryptography = "~=43.0.1" [requires] python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock index 0631368902..b28e89d323 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a14e6d004e06185c2082c3867c7667fcdd687e260668488ef8b00246006ed28e" + "sha256": "98aacceb3a9f4ab907403528a88b284cda7704d9b47f1d0341db8fa7576f7784" }, "pipfile-spec": 6, "requires": { @@ -1195,12 +1195,12 @@ }, "sentry-sdk": { "hashes": [ - "sha256:1e0e2eaf6dad918c7d1e0edac868a7bf20017b177f242cefe2a6bcd47955961d", - "sha256:b8bc3dc51d06590df1291b7519b85c75e2ced4f28d9ea655b6d54033503b5bf4" + "sha256:6051562d2cfa8087bb8b4b8b79dc44690f8a054762a29c07e22588b1f619bfb5", + "sha256:aa4314f877d9cd9add5a0c9ba18e3f27f99f7de835ce36bd150e48a41c7c646f" ], "index": "pypi", "markers": "python_version >= '3.6'", - "version": "==2.14.0" + "version": "==2.8.0" }, "setuptools": { "hashes": [ @@ -1903,7 +1903,7 @@ "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" ], - "markers": "python_version >= '3.5'", + "markers": "python_version < '3.11' and python_version >= '3.7'", "version": "==5.1.1" }, "dill": { From 57b8d42980cab7f2d95d80d8b137bc637888ace5 Mon Sep 17 00:00:00 2001 From: Brendan Smith Date: Mon, 16 Sep 2024 16:08:34 +0100 Subject: [PATCH 05/19] Ensure exporter frontend acts upon ALL CLEs --- exporter/core/services.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/exporter/core/services.py b/exporter/core/services.py index 97a9d6223a..9abe7b9ed7 100644 --- a/exporter/core/services.py +++ b/exporter/core/services.py @@ -199,11 +199,13 @@ def put_organisation_user(request, user_pk, json): def get_control_list_entries(request, convert_to_options=False, converted_control_list_entries_cache=[]): # noqa + get_cles_url = "/exporter/static/control-list-entries/?include_non_selectable_for_assessment=True" + if convert_to_options: if converted_control_list_entries_cache: return converted_control_list_entries_cache else: - response = client.get(request, "/exporter/static/control-list-entries/") + response = client.get(request, get_cles_url) for control_list_entry in response.json(): converted_control_list_entries_cache.append( Option( @@ -214,7 +216,7 @@ def get_control_list_entries(request, convert_to_options=False, converted_contro ) return converted_control_list_entries_cache - response = client.get(request, "/exporter/static/control-list-entries/") + response = client.get(request, get_cles_url) return response.json() From fee6e47d41cfe51dcd2f234c285e23b879ed374d Mon Sep 17 00:00:00 2001 From: Brendan Smith Date: Tue, 17 Sep 2024 14:23:09 +0100 Subject: [PATCH 06/19] Remove legacy open general licences app --- caseworker/core/context_processors.py | 10 +- caseworker/open_general_licences/__init__.py | 0 caseworker/open_general_licences/constants.py | 3 - caseworker/open_general_licences/enums.py | 52 ------ caseworker/open_general_licences/forms.py | 119 ------------ caseworker/open_general_licences/services.py | 52 ------ caseworker/open_general_licences/urls.py | 13 -- caseworker/open_general_licences/views.py | 172 ------------------ .../open-general-licences/index.html | 88 --------- .../open-general-licence.html | 165 ----------------- caseworker/urls.py | 1 - 11 files changed, 1 insertion(+), 674 deletions(-) delete mode 100644 caseworker/open_general_licences/__init__.py delete mode 100644 caseworker/open_general_licences/constants.py delete mode 100644 caseworker/open_general_licences/enums.py delete mode 100644 caseworker/open_general_licences/forms.py delete mode 100644 caseworker/open_general_licences/services.py delete mode 100644 caseworker/open_general_licences/urls.py delete mode 100644 caseworker/open_general_licences/views.py delete mode 100644 caseworker/templates/open-general-licences/index.html delete mode 100644 caseworker/templates/open-general-licences/open-general-licence.html diff --git a/caseworker/core/context_processors.py b/caseworker/core/context_processors.py index 369d0d9894..23ff0527f0 100644 --- a/caseworker/core/context_processors.py +++ b/caseworker/core/context_processors.py @@ -9,7 +9,7 @@ get_new_mention_count, get_user_role_name, ) -from lite_content.lite_internal_frontend import strings, open_general_licences +from lite_content.lite_internal_frontend import strings from lite_content.lite_internal_frontend.flags import FlagsList from lite_content.lite_internal_frontend.organisations import OrganisationsPage from lite_content.lite_internal_frontend.queues import QueuesList @@ -76,14 +76,6 @@ def lite_menu(request): {"title": QueuesList.TITLE, "url": reverse_lazy("queues:manage"), "icon": "menu/queues"}, {"title": UsersPage.TITLE, "url": reverse_lazy("users:users"), "icon": "menu/users"}, {"title": FlagsList.TITLE, "url": reverse_lazy("flags:flags"), "icon": "menu/flags"}, - conditional( - Permission.MAINTAIN_OGL.value in permissions, - { - "title": open_general_licences.List.TITLE, - "url": reverse_lazy("open_general_licences:open_general_licences"), - "icon": "menu/open-general-licences", - }, - ), conditional( Permission.CONFIGURE_TEMPLATES.value in permissions, { diff --git a/caseworker/open_general_licences/__init__.py b/caseworker/open_general_licences/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/caseworker/open_general_licences/constants.py b/caseworker/open_general_licences/constants.py deleted file mode 100644 index 907e966a38..0000000000 --- a/caseworker/open_general_licences/constants.py +++ /dev/null @@ -1,3 +0,0 @@ -DETAILS = "details" -CONTROL_LIST_ENTRIES = "control-list-entries" -COUNTRIES = "countries" diff --git a/caseworker/open_general_licences/enums.py b/caseworker/open_general_licences/enums.py deleted file mode 100644 index d496c50445..0000000000 --- a/caseworker/open_general_licences/enums.py +++ /dev/null @@ -1,52 +0,0 @@ -from lite_content.lite_internal_frontend.open_general_licences import ( - OGEL_DESCRIPTION, - OGTCL_DESCRIPTION, - OGTL_DESCRIPTION, -) -from lite_forms.components import Option - - -class OpenGeneralExportLicences: - class OpenGeneralLicence: - def __init__(self, id, name, description, acronym): - self.id = id - self.name = name - self.description = description - self.acronym = acronym - - open_general_export_licence = OpenGeneralLicence( - "00000000-0000-0000-0000-000000000002", - "Open General Export Licence", - OGEL_DESCRIPTION, - "OGEL", - ) - open_general_trade_control_licence = OpenGeneralLicence( - "00000000-0000-0000-0000-000000000013", - "Open General Trade Control Licence", - OGTCL_DESCRIPTION, - "OGTCL", - ) - open_general_transhipment_licence = OpenGeneralLicence( - "00000000-0000-0000-0000-000000000014", - "Open General Transhipment Licence", - OGTL_DESCRIPTION, - "OGTL", - ) - - @classmethod - def all(cls): - return [ - cls.open_general_export_licence, - cls.open_general_trade_control_licence, - cls.open_general_transhipment_licence, - ] - - @classmethod - def as_options(cls): - return [ - Option(key=ogl.id, value=f"{ogl.name} ({ogl.acronym})", description=ogl.description) for ogl in cls.all() - ] - - @classmethod - def get_by_id(cls, id): - return next(ogl for ogl in cls.all() if ogl.id == id) diff --git a/caseworker/open_general_licences/forms.py b/caseworker/open_general_licences/forms.py deleted file mode 100644 index fa1f9e356a..0000000000 --- a/caseworker/open_general_licences/forms.py +++ /dev/null @@ -1,119 +0,0 @@ -from caseworker.core.services import get_control_list_entries, get_countries -from lite_content.lite_internal_frontend import generic -from lite_forms.components import ( - Form, - TreeView, - FormGroup, - TextArea, - RadioButtons, - Option, - TextInput, - Checkboxes, - Filter, -) -from lite_forms.helpers import convert_dictionary_to_tree -from caseworker.core.helpers import group_control_list_entries_by_category -from caseworker.open_general_licences.enums import OpenGeneralExportLicences - - -def open_general_licence_forms(request, licence, strings): - control_list_entries = get_control_list_entries(request) - control_list_entries_tree = convert_dictionary_to_tree( - group_control_list_entries_by_category(control_list_entries), - key="rating", - value="rating", - exclude="is_decontrolled", - ) - countries = get_countries(request, True) - - return FormGroup( - [ - Form( - title=strings.SelectType.TITLE, - description=strings.SelectType.DESCRIPTION, - caption=strings.Steps.STEP_1, - questions=[ - RadioButtons( - short_title="Type", - name="case_type", - options=OpenGeneralExportLicences.as_options(), - ), - ], - default_button_name=generic.CONTINUE, - ), - Form( - title=strings.Details.TITLE.format(licence.name.lower()), - description=strings.Details.DESCRIPTION, - caption=strings.Steps.STEP_2, - questions=[ - TextArea( - title=strings.Details.Name.TITLE.format(licence.name.lower()), - short_title=strings.Details.Name.SHORT_TITLE, - description=strings.Details.Name.DESCRIPTION, - name="name", - rows=3, - classes=["govuk-!-width-three-quarters"], - data_attributes={"licence-name": licence.name}, - ), - TextArea( - title=strings.Details.Description.TITLE, - short_title=strings.Details.Description.SHORT_TITLE, - description=strings.Details.Description.DESCRIPTION, - name="description", - classes=["govuk-!-width-three-quarters"], - extras={"max_length": 2000}, - ), - TextInput( - title=strings.Details.Link.TITLE.format(licence.name.lower()), - short_title=strings.Details.Link.SHORT_TITLE, - description=strings.Details.Link.DESCRIPTION, - name="url", - classes=["govuk-!-width-three-quarters"], - ), - RadioButtons( - title=strings.Details.RequiresRegistration.TITLE.format(licence.name.lower()), - short_title=strings.Details.RequiresRegistration.SHORT_TITLE, - description=strings.Details.RequiresRegistration.DESCRIPTION.format(licence.name.lower()), - name="registration_required", - options=[ - Option(True, strings.Details.RequiresRegistration.YES), - Option(False, strings.Details.RequiresRegistration.NO), - ], - classes=["govuk-radios--inline"], - ), - ], - javascript_imports={"/javascripts/new-open-general-licence.js"}, - default_button_name=generic.CONTINUE, - ), - Form( - title=strings.ControlListEntries.TITLE, - description=strings.ControlListEntries.DESCRIPTION, - caption=strings.Steps.STEP_3, - questions=[ - TreeView( - name="control_list_entries[]", - short_title=strings.ControlListEntries.TITLE, - data=control_list_entries_tree, - ) - ], - default_button_name=generic.CONTINUE, - ), - Form( - title=strings.Countries.TITLE, - description=strings.Countries.DESCRIPTION, - caption=strings.Steps.STEP_4, - questions=[ - Filter(), - Checkboxes( - name="countries[]", - short_title=strings.Countries.SHORT_TITLE, - options=countries, - classes=["govuk-checkboxes--small"], - show_select_links=True, - filterable=True, - ), - ], - default_button_name=generic.CONTINUE, - ), - ] - ) diff --git a/caseworker/open_general_licences/services.py b/caseworker/open_general_licences/services.py deleted file mode 100644 index 61b1388dc7..0000000000 --- a/caseworker/open_general_licences/services.py +++ /dev/null @@ -1,52 +0,0 @@ -from http import HTTPStatus - -from core import client -from core.helpers import convert_parameters_to_query_params -from lite_content.lite_internal_frontend import open_general_licences - - -def get_open_general_licences( - request, page=1, name=None, case_type=None, control_list_entry=None, country=None, status="active" -): - querystring = convert_parameters_to_query_params( - { - "page": page, - "name": name, - "case_type": case_type, - "control_list_entry": control_list_entry, - "country": country, - "status": status, - } - ) - return client.get(request, f"/open-general-licences/{querystring}").json() - - -def post_open_general_licences(request, json): - response = client.post(request, "/open-general-licences/", json) - return response.json(), response.status_code - - -def get_open_general_licence(request, pk): - return client.get(request, f"/open-general-licences/{pk}").json() - - -def patch_open_general_licence(request, pk, json): - response = client.patch(request, f"/open-general-licences/{pk}", json) - return response.json(), response.status_code - - -def set_open_general_licence_status(request, pk, json): - if "status" not in json: - return {"errors": {"response": [open_general_licences.Edit.SELECT_OPTION]}}, HTTPStatus.BAD_REQUEST - - response = client.patch(request, f"/open-general-licences/{pk}", json) - return response.json(), response.status_code - - -def get_ogl_activity(request, pk, activity_filters=None): - url = f"/open-general-licences/{pk}/activity/" - if activity_filters: - params = convert_parameters_to_query_params(activity_filters) - url = url + params - data = client.get(request, url) - return data.json() diff --git a/caseworker/open_general_licences/urls.py b/caseworker/open_general_licences/urls.py deleted file mode 100644 index 5690c6a2a1..0000000000 --- a/caseworker/open_general_licences/urls.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.urls import path - -from caseworker.open_general_licences import views - -app_name = "open_general_licences" - -urlpatterns = [ - path("", views.ListView.as_view(), name="open_general_licences"), - path("/", views.DetailView.as_view(), name="open_general_licence"), - path("/edit-/", views.UpdateView.as_view(), name="edit"), - path("//", views.ChangeStatusView.as_view(), name="change_status"), - path("create/", views.CreateView.as_view(), name="create"), -] diff --git a/caseworker/open_general_licences/views.py b/caseworker/open_general_licences/views.py deleted file mode 100644 index 8924794796..0000000000 --- a/caseworker/open_general_licences/views.py +++ /dev/null @@ -1,172 +0,0 @@ -import copy - -from django.http import Http404 -from django.shortcuts import render -from django.urls import reverse -from django.views.generic import TemplateView - -from core.builtins.custom_tags import friendly_boolean -from caseworker.core.helpers import generate_activity_filters -from caseworker.core.services import get_countries, get_control_list_entries -from lite_content.lite_internal_frontend import open_general_licences as open_general_licences_strings, generic -from lite_forms.components import FiltersBar, Select, TextInput, AutocompleteInput, BackLink, HiddenField -from lite_forms.generators import confirm_form -from lite_forms.views import SummaryListFormView, SingleFormView -from caseworker.open_general_licences import constants -from caseworker.open_general_licences.enums import OpenGeneralExportLicences -from caseworker.open_general_licences.forms import open_general_licence_forms -from caseworker.open_general_licences.services import ( - get_open_general_licences, - post_open_general_licences, - get_open_general_licence, - patch_open_general_licence, - set_open_general_licence_status, - get_ogl_activity, -) - -from core.auth.views import LoginRequiredMixin - - -class ListView(LoginRequiredMixin, TemplateView): - def get(self, request, *args, **kwargs): - open_general_licences = get_open_general_licences(request, **request.GET) - control_list_entries = get_control_list_entries(request, True) - countries = get_countries(request, True) - - filters = FiltersBar( - [ - HiddenField("status", request.GET.get("status", "active")), - TextInput(name="name", title="name"), - Select(name="case_type", title="type", options=OpenGeneralExportLicences.as_options()), - AutocompleteInput(name="control_list_entry", title="control list entry", options=control_list_entries), - AutocompleteInput(name="country", title="country", options=countries), - ] - ) - - context = { - "filters": filters, - "tab": request.GET.get("status", "active"), - "open_general_licences": open_general_licences, - } - return render(request, "open-general-licences/index.html", context) - - -class DetailView(LoginRequiredMixin, TemplateView): - def get(self, request, *args, **kwargs): - activity_and_filters = get_ogl_activity(request, kwargs["pk"], activity_filters=request.GET) - context = { - "open_general_licence": get_open_general_licence(request, kwargs["pk"]), - "activity": activity_and_filters["activity"], - "filters": generate_activity_filters(activity_and_filters["filters"], open_general_licences_strings.Detail), - "DETAILS": constants.DETAILS, - "CONTROL_LIST_ENTRIES": constants.CONTROL_LIST_ENTRIES, - "COUNTRIES": constants.COUNTRIES, - } - return render(request, "open-general-licences/open-general-licence.html", context) - - -class CreateView(LoginRequiredMixin, SummaryListFormView): - def init(self, request, **kwargs): - licence = OpenGeneralExportLicences.get_by_id( - request.POST.get("case_type", OpenGeneralExportLicences.open_general_export_licence.id) - ) - self.forms = open_general_licence_forms( - request, - licence, - open_general_licences_strings.Create, - ) - self.action = post_open_general_licences - self.summary_list_title = open_general_licences_strings.Create.SUMMARY_TITLE + licence.name - self.summary_list_button = open_general_licences_strings.Create.SUBMIT_BUTTON - self.summary_list_notice_title = None - self.summary_list_notice_text = None - self.hide_titles = True - self.hide_components = ["case_type"] - self.success_message = open_general_licences_strings.Create.SUCCESS_MESSAGE - self.success_url = reverse("open_general_licences:open_general_licences") - - def prettify_data(self, data): - countries, _ = get_countries(self.request) - countries = [ - country["name"] for country in countries["countries"] if country["id"] in data.get("countries", []) - ] - - data["registration_required"] = friendly_boolean(data["registration_required"]) - data["control_list_entries[]"] = ", ".join(data.get("control_list_entries", [])) - data["countries[]"] = ", ".join(countries) - return data - - -class UpdateView(LoginRequiredMixin, SingleFormView): - def init(self, request, **kwargs): - self.object_pk = kwargs["pk"] - self.object = get_open_general_licence(request, self.object_pk) - self.data = self.object - self.action = patch_open_general_licence - self.success_message = open_general_licences_strings.Edit.SUCCESS_MESSAGE - self.success_url = reverse("open_general_licences:open_general_licence", kwargs={"pk": self.object_pk}) - - def get_form(self): - forms = open_general_licence_forms( - self.request, - OpenGeneralExportLicences.get_by_id(self.object["case_type"]["id"]), - open_general_licences_strings.Edit, - ).forms - - if self.kwargs["edit"] == constants.DETAILS: - form = forms[1] - elif self.kwargs["edit"] == constants.CONTROL_LIST_ENTRIES: - form = forms[2] - elif self.kwargs["edit"] == constants.COUNTRIES: - form = forms[3] - else: - raise Http404 - - form = copy.deepcopy(form) - form.caption = self.object["case_type"]["reference"]["value"] + " (" + self.object["name"] + ")" - form.buttons[0].value = generic.SAVE_AND_RETURN - form.back_link = BackLink( - url=reverse("open_general_licences:open_general_licence", kwargs={"pk": self.kwargs["pk"]}) - ) - return form - - -class ChangeStatusView(LoginRequiredMixin, SingleFormView): - def init(self, request, **kwargs): - self.object_pk = kwargs["pk"] - self.object = get_open_general_licence(request, self.object_pk) - self.action = set_open_general_licence_status - self.success_url = reverse("open_general_licences:open_general_licence", kwargs={"pk": self.object_pk}) - self.strings = ( - open_general_licences_strings.Reactivate - if self.kwargs["status"] == "reactivate" - else open_general_licences_strings.Deactivate - ) - if request.POST.get("response") == "yes": - self.success_message = self.strings.SUCCESS_MESSAGE - - def get_form(self): - return confirm_form( - title=self.strings.TITLE.format(self.object["name"]), - description=self.strings.DESCRIPTION, - back_link_text=self.strings.BACK_LINK.format(self.object["name"]), - back_url=self.success_url, - yes_label=self.strings.YES, - no_label=self.strings.NO, - side_by_side=True, - submit_button_text=self.strings.SUBMIT_BUTTON, - confirmation_name="response", - ) - - def on_submission(self, request, **kwargs): - if kwargs["status"] == "reactivate": - if request.POST.get("response") == "yes": - return {"status": "active"} - elif request.POST.get("response") == "no": - return {"status": "deactivated"} - elif kwargs["status"] == "deactivate": - if request.POST.get("response") == "yes": - return {"status": "deactivated"} - elif request.POST.get("response") == "no": - return {"status": "active"} - return {} diff --git a/caseworker/templates/open-general-licences/index.html b/caseworker/templates/open-general-licences/index.html deleted file mode 100644 index da64e9edfc..0000000000 --- a/caseworker/templates/open-general-licences/index.html +++ /dev/null @@ -1,88 +0,0 @@ -{% extends 'layouts/base.html' %} - -{% load humanize %} - -{% block back_link %}{% endblock %} - -{% block body %} -
-
-

- {% block title %} - {% lcs 'open_general_licences.List.TITLE' %} - {% endblock %} -

-
-
- {% govuk_link_button id='new-ogl' text='open_general_licences.List.ADD_AN_OGL_BUTTON' url='open_general_licences:create' %} -
-
- - - - {% include "filters.html" %} - - {% if open_general_licences.results %} - - - - - - - - - - - - - {% for open_general_licence in open_general_licences.results %} - - - - - - - - - - {% endfor %} - -
{% lcs 'open_general_licences.List.Table.NAME' %}{% lcs 'open_general_licences.List.Table.TYPE' %}{% lcs 'open_general_licences.List.Table.APPLIES_TO' %}{% lcs 'open_general_licences.List.Table.MORE_INFORMATION' %}{% lcs 'open_general_licences.List.Table.REGISTRATION_REQUIRED' %}
- {% with request.GET|get:'name' as name %} - {{ open_general_licence.name|highlight_text:name }} - {% endwith %} - - {{ open_general_licence.case_type.reference.value }} - - - {{ open_general_licence.control_list_entries|length }} - {{ open_general_licence.control_list_entries|lcsp:'open_general_licences.List.Table.CONTROL_LIST_ENTRIES' }} - - - - {{ open_general_licence.countries|length }} - {{ open_general_licence.countries|lcsp:'open_general_licences.List.Table.COUNTRIES' }} - - - {% lcs 'open_general_licences.List.Table.READ_ON_GOVUK_LINK' as govuk_link %} - {{ open_general_licence.url|linkify:govuk_link }} - - {{ open_general_licence.registration_required|friendly_boolean }} - - {% lcs 'generic.VIEW' %} -
- - {% pagination %} - {% else %} - {% include "includes/notice.html" with text='open_general_licences.List.NO_CONTENT' %} - {% endif %} -{% endblock %} diff --git a/caseworker/templates/open-general-licences/open-general-licence.html b/caseworker/templates/open-general-licences/open-general-licence.html deleted file mode 100644 index f0d41102e3..0000000000 --- a/caseworker/templates/open-general-licences/open-general-licence.html +++ /dev/null @@ -1,165 +0,0 @@ -{% extends 'layouts/base.html' %} - -{% load humanize %} - -{% block back_link %} - - {% lcs 'open_general_licences.Detail.BACK_LINK' %} - -{% endblock %} - -{% block body %} -
-
-

- {% block title %} - {{ open_general_licence.name }} - {% endblock %} -

-
-
- -
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.NAME' %} -
-
- {{ open_general_licence.name }} -
-
- - {% lcs 'generic.CHANGE' %} {% lcs 'open_general_licences.Detail.SummaryList.NAME' %} - -
-
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.TYPE' %} -
-
- {{ open_general_licence.case_type.reference.value }} -
-
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.DESCRIPTION' %} -
-
- {{ open_general_licence.description }} -
-
- - {% lcs 'generic.CHANGE' %} {% lcs 'open_general_licences.Detail.SummaryList.DESCRIPTION' %} - -
-
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.LINK' %} -
-
- {{ open_general_licence.url|linkify }} -
-
- - {% lcs 'generic.CHANGE' %} {% lcs 'open_general_licences.Detail.SummaryList.LINK' %} - -
-
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.REGISTRATION_REQUIRED' %} -
-
- {{ open_general_licence.registration_required|friendly_boolean }} -
-
- - {% lcs 'generic.CHANGE' %} {% lcs 'open_general_licences.Detail.SummaryList.REGISTRATION_REQUIRED' %} - -
-
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.STATUS' %} -
-
- {{ open_general_licence.status.value }} -
-
- {% if open_general_licence.status.key == 'active' %} - - {% lcs 'open_general_licences.Detail.SummaryList.DEACTIVATE_LINK' %} - - {% else %} - - {% lcs 'open_general_licences.Detail.SummaryList.REACTIVATE_LINK' %} - - {% endif %} -
-
-
-
- {{ open_general_licence.control_list_entries|lcsp:'open_general_licences.Detail.SummaryList.CONTROL_LIST_ENTRIES' }} -
-
-
    - {% for control_list_entry in open_general_licence.control_list_entries %} -
  • - - {{ control_list_entry.rating }} - -
  • - {% endfor %} -
-
-
- - {% lcs 'generic.CHANGE' %} {{ open_general_licence.control_list_entries|lcsp:'open_general_licences.Detail.SummaryList.CONTROL_LIST_ENTRIES' }} - -
-
-
-
- {{ open_general_licence.countries|lcsp:'open_general_licences.Detail.SummaryList.COUNTRIES' }} -
-
-
    - {% for country in open_general_licence.countries %} -
  • {{ country.name }}
  • - {% endfor %} -
-
-
- - {% lcs 'generic.CHANGE' %} {{ open_general_licence.countries|lcsp:'open_general_licences.Detail.SummaryList.COUNTRIES' }} - -
-
-
-
- {% lcs 'open_general_licences.Detail.SummaryList.CREATED_AT' %} -
-
- {{ open_general_licence.created_at|str_date }} -
-
- {% if open_general_licence.created_at != open_general_licence.updated_at %} -
-
- {% lcs 'open_general_licences.Detail.SummaryList.UPDATED_AT' %} -
-
- {{ open_general_licence.updated_at|str_date }} -
-
- {% endif %} -
- -

{% lcs 'open_general_licences.Detail.ACTIVITY' %}

- - {% include "filters.html" %} - - {% include 'includes/audit-trail.html' %} -{% endblock %} diff --git a/caseworker/urls.py b/caseworker/urls.py index 4c3cd10e84..8c9268b0ea 100644 --- a/caseworker/urls.py +++ b/caseworker/urls.py @@ -15,7 +15,6 @@ path("queues//cases//", include("caseworker.cases.urls")), path("flags/", include("caseworker.flags.urls")), path("document-templates/", include("caseworker.letter_templates.urls")), - path("open-general-licences/", include("caseworker.open_general_licences.urls")), path("organisations/", include("caseworker.organisations.urls")), path("queues/", include("caseworker.queues.urls")), path("team/picklists/", include("caseworker.picklists.urls")), From d02bf1f4368f5a8d7283fe54e3c5282645af17e5 Mon Sep 17 00:00:00 2001 From: Brendan Smith Date: Tue, 17 Sep 2024 14:35:24 +0100 Subject: [PATCH 07/19] Remove legacy flag/flagging rule views --- caseworker/core/context_processors.py | 4 - caseworker/flags/forms.py | 337 +----------------- caseworker/flags/services.py | 38 -- caseworker/flags/urls.py | 7 - caseworker/flags/views.py | 262 +------------- .../templates/flags/flagging-rules-list.html | 109 ------ 6 files changed, 6 insertions(+), 751 deletions(-) delete mode 100644 caseworker/templates/flags/flagging-rules-list.html diff --git a/caseworker/core/context_processors.py b/caseworker/core/context_processors.py index 23ff0527f0..6ea9d07ec5 100644 --- a/caseworker/core/context_processors.py +++ b/caseworker/core/context_processors.py @@ -84,10 +84,6 @@ def lite_menu(request): "icon": "menu/letter-templates", }, ), - conditional( - Permission.MANAGE_FLAGGING_RULES.value in permissions, - {"title": "Flagging rules", "url": reverse_lazy("flags:flagging_rules"), "icon": "menu/flags"}, - ), conditional( Permission.MANAGE_TEAM_ROUTING_RULES.value in permissions or Permission.MANAGE_ALL_ROUTING_RULES.value in permissions, diff --git a/caseworker/flags/forms.py b/caseworker/flags/forms.py index 8bb1e7a26e..c30f1cf9d5 100644 --- a/caseworker/flags/forms.py +++ b/caseworker/flags/forms.py @@ -1,32 +1,14 @@ -from django.urls import reverse_lazy - -from caseworker.cases.services import get_case_types -from caseworker.core.services import get_countries, get_control_list_entries -from caseworker.flags.services import get_goods_flags, get_destination_flags, get_cases_flags -from caseworker.flags.enums import FlagPermissions - from lite_content.lite_internal_frontend import strings -from lite_content.lite_internal_frontend.flags import CreateFlagForm, EditFlagForm, SetFlagsForm -from lite_content.lite_internal_frontend.strings import FlaggingRules +from lite_content.lite_internal_frontend.flags import SetFlagsForm from lite_forms.components import ( - TextInput, - Select, Option, - BackLink, Form, - FormGroup, - RadioButtons, - NumberInput, DetailComponent, TextArea, Checkboxes, HelpSection, Filter, - TokenBar, - Heading, ) -from lite_forms.generators import confirm_form -from lite_forms.styles import HeadingStyle level_options = [ Option("Case", "Case"), @@ -43,323 +25,6 @@ ] -def add_flag_form(): - return Form( - title=CreateFlagForm.TITLE, - description=CreateFlagForm.DESCRIPTION, - questions=[ - TextInput(title=CreateFlagForm.Name.TITLE, description=CreateFlagForm.Name.DESCRIPTION, name="name"), - Select( - title=CreateFlagForm.Level.TITLE, - description=CreateFlagForm.Level.DESCRIPTION, - name="level", - options=level_options, - ), - RadioButtons( - title=CreateFlagForm.Colour.TITLE, - description=CreateFlagForm.Colour.DESCRIPTION, - name="colour", - classes=["app-radios--flag-colours"], - options=[ - Option("default", "Default"), - Option("red", "Red", classes=["app-radios__item--red"]), - Option("yellow", "Yellow", classes=["app-radios__item--yellow"]), - Option("green", "Green", classes=["app-radios__item--green"]), - Option("blue", "Blue", classes=["app-radios__item--blue"]), - Option("purple", "Purple", classes=["app-radios__item--purple"]), - Option("orange", "Orange", classes=["app-radios__item--orange"]), - Option("brown", "Brown", classes=["app-radios__item--brown"]), - Option("turquoise", "Turquoise", classes=["app-radios__item--turquoise"]), - Option("pink", "Pink", classes=["app-radios__item--pink"]), - ], - ), - TextInput( - name="label", - title=CreateFlagForm.Label.TITLE, - description=CreateFlagForm.Label.DESCRIPTION, - ), - NumberInput( - name="priority", title=CreateFlagForm.Priority.TITLE, description=CreateFlagForm.Priority.DESCRIPTION - ), - RadioButtons( - name="blocks_finalising", - title=CreateFlagForm.BlocksFinalising.TITLE, - options=[ - Option( - key=True, - value=CreateFlagForm.BlocksFinalising.YES, - components=[ - RadioButtons( - name="removable_by", - title="Who can remove this flag?", - options=[ - Option(FlagPermissions.DEFAULT, FlagPermissions.DEFAULT), - Option( - FlagPermissions.AUTHORISED_COUNTERSIGNER, - FlagPermissions.AUTHORISED_COUNTERSIGNER, - ), - Option( - FlagPermissions.HEAD_OF_LICENSING_UNIT_COUNTERSIGNER, - FlagPermissions.HEAD_OF_LICENSING_UNIT_COUNTERSIGNER, - ), - ], - ) - ], - ), - Option(key=False, value=CreateFlagForm.BlocksFinalising.NO), - ], - classes=["govuk-radios--inline"], - ), - ], - default_button_name=CreateFlagForm.SUBMIT_BUTTON, - back_link=BackLink(CreateFlagForm.BACK_LINK, reverse_lazy("flags:flags")), - javascript_imports={"/javascripts/add-edit-flags.js"}, - ) - - -def edit_flag_form(): - return Form( - title=EditFlagForm.TITLE, - questions=[ - TextInput(title=EditFlagForm.Name.TITLE, description=EditFlagForm.Name.DESCRIPTION, name="name"), - RadioButtons( - title=EditFlagForm.Colour.TITLE, - description=EditFlagForm.Colour.DESCRIPTION, - name="colour", - classes=["app-radios--flag-colours"], - options=[ - Option("default", "Default"), - Option("red", "Red", classes=["app-radios__item--red"]), - Option("yellow", "Yellow", classes=["app-radios__item--yellow"]), - Option("green", "Green", classes=["app-radios__item--green"]), - Option("blue", "Blue", classes=["app-radios__item--blue"]), - Option("purple", "Purple", classes=["app-radios__item--purple"]), - Option("orange", "Orange", classes=["app-radios__item--orange"]), - Option("brown", "Brown", classes=["app-radios__item--brown"]), - Option("turquoise", "Turquoise", classes=["app-radios__item--turquoise"]), - Option("pink", "Pink", classes=["app-radios__item--pink"]), - ], - ), - TextInput(name="label", title=EditFlagForm.Label.TITLE, description=EditFlagForm.Label.DESCRIPTION), - NumberInput( - name="priority", title=EditFlagForm.Priority.TITLE, description=EditFlagForm.Priority.DESCRIPTION - ), - RadioButtons( - name="blocks_finalising", - title=EditFlagForm.BlocksFinalising.TITLE, - options=[ - Option( - key=True, - value=EditFlagForm.BlocksFinalising.YES, - components=[ - RadioButtons( - name="removable_by", - title="Who can remove this flag?", - options=[ - Option(FlagPermissions.DEFAULT, FlagPermissions.DEFAULT), - Option( - FlagPermissions.AUTHORISED_COUNTERSIGNER, - FlagPermissions.AUTHORISED_COUNTERSIGNER, - ), - Option( - FlagPermissions.HEAD_OF_LICENSING_UNIT_COUNTERSIGNER, - FlagPermissions.HEAD_OF_LICENSING_UNIT_COUNTERSIGNER, - ), - ], - ) - ], - ), - Option(False, EditFlagForm.BlocksFinalising.NO), - ], - ), - ], - back_link=BackLink(EditFlagForm.BACK_LINK, reverse_lazy("flags:flags")), - default_button_name=EditFlagForm.SUBMIT_BUTTON, - javascript_imports={"/javascripts/add-edit-flags.js"}, - ) - - -def select_flagging_rule_type(): - return Form( - title=strings.FlaggingRules.Create.Type.TITLE, - questions=[ - RadioButtons( - name="level", - options=_levels, - ) - ], - back_link=BackLink(strings.FlaggingRules.Create.BACKLINK, reverse_lazy("flags:flagging_rules")), - default_button_name=strings.FlaggingRules.Create.Type.SAVE, - ) - - -def get_clc_entry_groups_and_nodes(entries): - groups = [] - nodes = [] - - for item in entries: - if not item["parent_id"] and not item.get("children"): - nodes.append({"rating": item["rating"], "text": item["text"]}) - groups.append({"rating": item["rating"], "text": item["text"]}) - - if item["parent_id"] and item.get("children"): - nodes.append({"rating": item["rating"], "text": item["text"]}) - - if item.get("children"): - groups.append({"rating": item["rating"], "text": item["text"]}) - children, child_nodes = get_clc_entry_groups_and_nodes(item["children"]) - if children: - groups.extend(children) - if child_nodes: - nodes.extend(child_nodes) - elif item["parent_id"]: - nodes.append({"rating": item["rating"], "text": item["text"]}) - - return groups, nodes - - -def select_condition_and_flag(request, type: str): - flags = [] - is_for_verified_goods_only = None - - if type == "Good": - flags = get_goods_flags(request=request) - is_for_verified_goods_only = RadioButtons( - name="is_for_verified_goods_only", - options=[ - Option(key=True, value=FlaggingRules.Create.Condition_and_flag.YES_OPTION), - Option(key=False, value=FlaggingRules.Create.Condition_and_flag.NO_OPTION), - ], - title=FlaggingRules.Create.Condition_and_flag.GOODS_QUESTION, - ) - entries = get_control_list_entries(request) - clc_groups, clc_nodes = get_clc_entry_groups_and_nodes(entries) - - # if the child node has children of its own then that needs to selectable as - # both individual entry as well as group entry because of this duplicates are - # possible in the combined list hence remove them. We need groups at the top - # because autocomplete only shows first 10 entries which makes it difficult to - # select certain groups otherwise. eg ML10b1 comes before ML1 - combined_entries = list(clc_groups) - rating_seen = set([item["rating"] for item in combined_entries]) - for item in clc_nodes: - if item["rating"] not in rating_seen: - rating_seen.add(item["rating"]) - combined_entries.append(item) - - clc_nodes_options = [ - Option( - key=item["rating"], - value=item["rating"], - description=item["text"], - ) - for item in clc_nodes - ] - - clc_groups_options = [ - Option( - key=item["rating"], - value=item["rating"], - description=item["text"], - ) - for item in clc_groups - ] - - clc_combined_options = [ - Option( - key=item["rating"], - value=item["rating"], - description=item["text"], - ) - for item in combined_entries - ] - - return Form( - title="Set flagging rules", - questions=[ - Heading("Add a condition", HeadingStyle.S), - TokenBar( - title="Select individual control list entries", - name="matching_values", - description="Type to get suggestions. For example, ML1a.", - options=clc_nodes_options, - ), - TokenBar( - title="Select a control list entry group", - name="matching_groups", - description="Type to get suggestions. For example, ML8.\nThis will add every control list entry under ML8.", - options=clc_groups_options, - ), - TokenBar( - title="Excluded control list entries", - name="excluded_values", - description="Type to get suggestions. For example, ML1a, ML8.\nThis will exclude ML1a and every control list entry under ML8.", - options=clc_combined_options, - ), - Heading("Set an action", HeadingStyle.S), - Select(title=strings.FlaggingRules.Create.Condition_and_flag.FLAG, name="flag", options=flags), - is_for_verified_goods_only, - ], - default_button_name="Create flagging rule", - ) - elif type == "Destination": - flags = get_destination_flags(request=request) - - return Form( - title="Set flagging rules", - questions=[ - Heading("Add a condition", HeadingStyle.S), - TokenBar( - title="Select destinations", - name="matching_values", - description="Type to get suggestions. For example, Australia", - options=get_countries(request, convert_to_options=True), - ), - Heading("Add an action", HeadingStyle.S), - Select(title=strings.FlaggingRules.Create.Condition_and_flag.FLAG, name="flag", options=flags), - ], - default_button_name="Create flagging rule", - ) - elif type == "Case": - case_type_options = [Option(option["key"], option["value"]) for option in get_case_types(request)] - flags = get_cases_flags(request=request) - - return Form( - title="Set flagging rules", - questions=[ - Heading("Add a condition", HeadingStyle.S), - TokenBar( - title="Select application type", - name="matching_values", - description="Type to get suggestions.\nFor example, Standard Individual Export Licence", - options=case_type_options, - ), - Heading("Add an action", HeadingStyle.S), - Select(title=strings.FlaggingRules.Create.Condition_and_flag.FLAG, name="flag", options=flags), - ], - default_button_name="Create flagging rule", - ) - - -def create_flagging_rules_formGroup(request=None, type=None): - return FormGroup( - [select_flagging_rule_type(), select_condition_and_flag(request=request, type=type)], - ) - - -def deactivate_or_activate_flagging_rule_form(title, description, confirm_text, status): - return confirm_form( - title=title, - description=description, - back_link_text=strings.FlaggingRules.Status.BACK, - back_url=reverse_lazy("flags:flagging_rules"), - yes_label=confirm_text, - no_label=strings.FlaggingRules.Status.CANCEL, - hidden_field=status, - confirmation_name="confirm", - ) - - def set_flags_form(flags, level, show_case_header=False, show_sidebar=False): form = Form( title=getattr(SetFlagsForm, level).TITLE, diff --git a/caseworker/flags/services.py b/caseworker/flags/services.py index 9f6346e186..3c29e47462 100644 --- a/caseworker/flags/services.py +++ b/caseworker/flags/services.py @@ -65,41 +65,3 @@ def _get_team_flags(level, request, convert_to_options=False, include_deactivate get_goods_flags = functools.partial(_get_team_flags, "Good", convert_to_options=True) get_organisation_flags = functools.partial(_get_team_flags, "Organisation", convert_to_options=True) get_destination_flags = functools.partial(_get_team_flags, "Destination", convert_to_options=True) - - -def post_flags(request, json): - data = client.post(request, "/flags/", json) - return data.json(), data.status_code - - -def get_flag(request, pk): - data = client.get(request, f"/flags/{pk}") - return data.json() - - -def update_flag(request, pk, json): - data = client.patch(request, f"/flags/{pk}/", json) - return data.json(), data.status_code - - -def get_flagging_rules(request, params): - data = client.get(request, f"/flags/rules/?{params}") - return data.json(), data.status_code - - -def post_flagging_rules(request, json): - data = client.post(request, "/flags/rules/", json) - return data.json(), data.status_code - - -def get_flagging_rule(request, pk): - data = client.get(request, f"/flags/rules/{pk}") - return data.json(), data.status_code - - -def put_flagging_rule(request, pk, json): - data = json - if json.get("form_name"): - data["status"] = json.get("form_name") - data = client.put(request, f"/flags/rules/{pk}", json) - return data.json(), data.status_code diff --git a/caseworker/flags/urls.py b/caseworker/flags/urls.py index 324c47524d..46bf8019a6 100644 --- a/caseworker/flags/urls.py +++ b/caseworker/flags/urls.py @@ -6,11 +6,4 @@ urlpatterns = [ path("", views.FlagsList.as_view(), name="flags"), - path("/edit/", views.EditFlag.as_view(), name="edit"), - path("/edit//", views.ChangeFlagStatus.as_view(), name="change_status"), - path("add/", views.AddFlag.as_view(), name="add"), - path("rules/", views.ManageFlagRules.as_view(), name="flagging_rules"), - path("rules/create/", views.CreateFlagRules.as_view(), name="create_flagging_rules"), - path("rules//edit/", views.EditFlaggingRules.as_view(), name="edit_flagging_rule"), - path("rules///", views.ChangeFlaggingRuleStatus.as_view(), name="change_flagging_rule_status"), ] diff --git a/caseworker/flags/views.py b/caseworker/flags/views.py index af812c4c93..63f6429cc3 100644 --- a/caseworker/flags/views.py +++ b/caseworker/flags/views.py @@ -1,49 +1,31 @@ import functools from django.conf import settings -from django.http import Http404, HttpResponseForbidden -from django.shortcuts import redirect from django.shortcuts import render from django.urls import reverse -from django.urls import reverse_lazy -from django.utils.functional import cached_property from django.views.generic import TemplateView from caseworker.cases.helpers.advice import get_param_goods, get_param_destinations from caseworker.cases.services import put_flag_assignments, get_case from caseworker.core.constants import Permission -from caseworker.core.helpers import get_params_if_exist, is_user_config_admin -from core.helpers import convert_dict_to_query_params -from caseworker.core.views import handler403 -from caseworker.core.services import get_countries, get_user_permissions +from caseworker.core.services import get_user_permissions from caseworker.flags.enums import FlagLevel, FlagStatus from caseworker.flags.forms import ( - add_flag_form, - edit_flag_form, - create_flagging_rules_formGroup, - select_condition_and_flag, - _levels, - deactivate_or_activate_flagging_rule_form, level_options, set_flags_form, ) from caseworker.flags.helpers import get_matching_flags from caseworker.flags.services import ( - get_flagging_rules, - put_flagging_rule, - get_flagging_rule, - post_flagging_rules, get_cases_flags, get_organisation_flags, get_goods_flags, get_destination_flags, ) -from caseworker.flags.services import get_flags, post_flags, get_flag, update_flag -from lite_content.lite_internal_frontend import strings, flags -from lite_content.lite_internal_frontend.flags import UpdateFlag, SetFlagsForm +from caseworker.flags.services import get_flags +from lite_content.lite_internal_frontend import flags +from lite_content.lite_internal_frontend.flags import SetFlagsForm from lite_forms.components import Option, FiltersBar, Select, Checkboxes, TextInput, BackLink -from lite_forms.generators import form_page -from lite_forms.views import MultiFormView, SingleFormView +from lite_forms.views import SingleFormView from caseworker.organisations.services import get_organisation from caseworker.teams.services import get_teams from caseworker.users.services import get_gov_user @@ -82,240 +64,6 @@ def get(self, request, **kwargs): return render(request, "flags/index.html", context) -class AddFlag(LoginRequiredMixin, SingleFormView): - def dispatch(self, request, *args, **kwargs): - if not is_user_config_admin(request): - return handler403(request, HttpResponseForbidden) - - return super().dispatch(request, *args, **kwargs) - - def init(self, request, **kwargs): - self.form = add_flag_form() - self.action = post_flags - self.data = {"colour": "default", "priority": 0} - self.success_message = flags.FlagsList.SUCCESS_MESSAGE - self.success_url = reverse("flags:flags") - - -class EditFlag(LoginRequiredMixin, SingleFormView): - def dispatch(self, request, *args, **kwargs): - if not is_user_config_admin(request): - return handler403(request, HttpResponseForbidden) - - return super().dispatch(request, *args, **kwargs) - - def init(self, request, **kwargs): - self.object_pk = str(kwargs["pk"]) - flag = get_flag(request, self.object_pk) - self.form = edit_flag_form() - self.data = flag - self.action = update_flag - self.success_url = reverse("flags:flags") - - -class ChangeFlagStatus(LoginRequiredMixin, TemplateView): - def dispatch(self, request, *args, **kwargs): - if not is_user_config_admin(request): - return handler403(request, HttpResponseForbidden) - - return super().dispatch(request, *args, **kwargs) - - def get(self, request, **kwargs): - status = kwargs["status"] - description = "" - - if status != "deactivate" and status != "reactivate": - raise Http404 - - if status == "deactivate": - description = UpdateFlag.Status.DEACTIVATE_WARNING - - if status == "reactivate": - description = UpdateFlag.Status.REACTIVATE_WARNING - - context = { - "title": "Are you sure you want to {} this flag?".format(status), - "description": description, - "user_id": str(kwargs["pk"]), - "status": status, - } - return render(request, "flags/change-status.html", context) - - def post(self, request, **kwargs): - status = kwargs["status"] - - if status != "deactivate" and status != "reactivate": - raise Http404 - - update_flag(request, str(kwargs["pk"]), json={"status": request.POST["status"]}) - - return redirect(reverse_lazy("flags:flags")) - - -class ManageFlagRules(LoginRequiredMixin, TemplateView): - def get(self, request, **kwargs): - if Permission.MANAGE_FLAGGING_RULES.value not in get_user_permissions(request): - return redirect(reverse_lazy("cases:cases")) - - params = {"page": int(request.GET.get("page", 1))} - params = get_params_if_exist(request, ["only_my_team", "level", "include_deactivated"], params) - - data, _ = get_flagging_rules(request, convert_dict_to_query_params(params)) - - filters = FiltersBar( - [ - Select(name="level", title=strings.FlaggingRules.List.Filter.Type, options=_levels), - Checkboxes( - name="only_my_team", - options=[Option("true", strings.FlaggingRules.List.Filter.MY_TEAM_ONLY)], - classes=["govuk-checkboxes--small", "govuk-!-margin-top-6"], - ), - Checkboxes( - name="include_deactivated", - options=[Option("true", strings.FlaggingRules.List.Filter.INCLUDE_DEACTIVATED)], - classes=["govuk-checkboxes--small", "govuk-!-margin-top-6"], - ), - ] - ) - - user_data = get_gov_user(request)[0]["user"] - - countries, _ = get_countries(request) - countries_map = {country["id"]: country["name"] for country in countries["countries"]} - for rule in data["results"]: - if rule["level"] == "Destination": - rule["matching_values"] = [countries_map[id] for id in rule["matching_values"]] - - context = { - "data": data, - "team": user_data["team"]["id"], - "filters": filters, - "can_change_config": user_data["email"] in settings.CONFIG_ADMIN_USERS_LIST, - } - return render(request, "flags/flagging-rules-list.html", context) - - -class CreateFlagRules(LoginRequiredMixin, MultiFormView): - def dispatch(self, request, *args, **kwargs): - if not is_user_config_admin(request): - return handler403(request, HttpResponseForbidden) - - return super().dispatch(request, *args, **kwargs) - - def init(self, request, **kwargs): - if Permission.MANAGE_FLAGGING_RULES.value not in get_user_permissions(request): - return redirect(reverse_lazy("cases:cases")) - - type = request.POST.get("level", None) - self.forms = create_flagging_rules_formGroup(request=self.request, type=type) - self.action = post_flagging_rules - self.success_url = reverse_lazy("flags:flagging_rules") - - -class EditFlaggingRules(LoginRequiredMixin, SingleFormView): - def dispatch(self, request, *args, **kwargs): - if not is_user_config_admin(request): - return handler403(request, HttpResponseForbidden) - - return super().dispatch(request, *args, **kwargs) - - def init(self, request, **kwargs): - if Permission.MANAGE_FLAGGING_RULES.value not in get_user_permissions(request): - return redirect(reverse_lazy("cases:cases")) - - self.object_pk = kwargs["pk"] - self.data = get_flagging_rule(request, self.object_pk)[0]["flag"] - self.form = select_condition_and_flag(request, type=self.data["level"]) - self.form.buttons[0].value = "Edit flagging rule" - self.action = put_flagging_rule - self.success_url = reverse_lazy("flags:flagging_rules") - - @cached_property - def get_countries(self): - countries, _ = get_countries(self.request) - return countries["countries"] - - def get_data(self): - if self.data["level"] == "Destination": - countries_map = {country["id"]: country["name"] for country in self.get_countries} - self.data["matching_values"] = [countries_map[id] for id in self.data["matching_values"]] - - return self.data - - def on_submission(self, request, **kwargs): - copied_request = request.POST.copy() - - if "status" not in copied_request: - copied_request["status"] = self.data["status"] - # if the Tokenfields are empty then it is not being included in the request data - if "matching_values[]" not in copied_request: - copied_request.setlist("matching_values[]", []) - if self.data["level"] == "Good" and "matching_groups[]" not in copied_request: - copied_request.setlist("matching_groups[]", []) - if self.data["level"] == "Good" and "excluded_values[]" not in copied_request: - copied_request.setlist("excluded_values[]", []) - - if self.data["level"] == "Destination": - reverse_countries_map = {country["name"]: country["id"] for country in self.get_countries} - country_ids = [ - reverse_countries_map[name] if name in reverse_countries_map else name - for name in copied_request.getlist("matching_values[]") - ] - copied_request.setlist("matching_values[]", country_ids) - - return copied_request - - -class ChangeFlaggingRuleStatus(LoginRequiredMixin, SingleFormView): - success_url = reverse_lazy("flags:flagging_rules") - - def dispatch(self, request, *args, **kwargs): - if not is_user_config_admin(request): - return handler403(request, HttpResponseForbidden) - - return super().dispatch(request, *args, **kwargs) - - def init(self, request, **kwargs): - if Permission.MANAGE_FLAGGING_RULES.value not in get_user_permissions(request): - return redirect(reverse_lazy("cases:cases")) - - status = kwargs["status"] - self.object_pk = kwargs["pk"] - - if status != "Deactivated" and status != "Active": - raise Http404 - - if status == "Deactivated": - title = strings.FlaggingRules.Status.DEACTIVATE_HEADING - description = strings.FlaggingRules.Status.DEACTIVATE_WARNING - confirm_text = strings.FlaggingRules.Status.DEACTIVATE_CONFIRM - - if status == "Active": - title = strings.FlaggingRules.Status.REACTIVATE_HEADING - description = strings.FlaggingRules.Status.REACTIVATE_WARNING - confirm_text = strings.FlaggingRules.Status.REACTIVATE_CONFIRM - - self.form = deactivate_or_activate_flagging_rule_form( - title=title, description=description, confirm_text=confirm_text, status=status - ) - self.action = put_flagging_rule - - def post(self, request, **kwargs): - self.init(request, **kwargs) - if not request.POST.get("confirm"): - return form_page( - request, - self.get_form(), - data=self.get_data(), - errors={"confirm": [strings.FlaggingRules.Status.NO_SELECTION_ERROR]}, - extra_data=self.context, - ) - elif request.POST.get("confirm") == "no": - return redirect(self.success_url) - - return super(ChangeFlaggingRuleStatus, self).post(request, **kwargs) - - def perform_action(case, level, request, pk, json): selected_goods_ids = request.GET.getlist("goods", request.GET.getlist("goods_types")) goods = case.data.get("goods", case.data.get("goods_types")) diff --git a/caseworker/templates/flags/flagging-rules-list.html b/caseworker/templates/flags/flagging-rules-list.html deleted file mode 100644 index 8debde42b5..0000000000 --- a/caseworker/templates/flags/flagging-rules-list.html +++ /dev/null @@ -1,109 +0,0 @@ -{% extends 'layouts/base.html' %} - -{% block back_link %}{% endblock %} - -{% block body %} -
-
-

- {% block title %} - {% lcs 'FlaggingRules.TITLE' %} - {% endblock %} -

-

- {% lcs 'FlaggingRules.DESCRIPTION' %} -

-
- {% if can_change_config %} - - {% endif %} -
- - {% include "filters.html" %} - - - - - - - - - - - {% if can_change_config %} - - {% endif %} - - - - {% for flagging_rule in data.results %} - - - - - - - - {% if can_change_config %} - - {% endif %} - - {% endfor %} - -
{% lcs 'FlaggingRules.List.TEAM' %}{% lcs 'FlaggingRules.List.PARAMETER' %}{% lcs 'FlaggingRules.List.CONDITION' %}Applies to verified goods{% lcs 'FlaggingRules.List.FLAG' %}{% lcs 'FlaggingRules.List.STATUS' %}{% lcs 'FlaggingRules.List.ACTIONS' %}
- {{ flagging_rule.team.name }} - - {% if flagging_rule.level == "Good" %} - Products - {% elif flagging_rule.level == "Destination" %} - Destinations - {% elif flagging_rule.level == "Case" %} - Application types - {% endif %} - - {{ flagging_rule.matching_values|join:", " }} - {% if flagging_rule.matching_groups %} - {% if flagging_rule.matching_values %} -
- {% endif %} - {{ flagging_rule.matching_groups|join:", " }} group - {% endif %} - {% if flagging_rule.excluded_values %} - {% if flagging_rule.matching_values %} -
- {% endif %} - Excludes: {{ flagging_rule.excluded_values|join:", " }} - {% endif %} -
- {% if flagging_rule.level == "Good" %} - {{ flagging_rule.is_for_verified_goods_only|friendly_boolean }} - {% else %} - N/A - {% endif %} - - {{ flagging_rule.flag_name }} - - {{ flagging_rule.status }} - - {% if flagging_rule.team.id == team %} - - {% endif %} -
- - {% pagination %} -{% endblock %} From d3ab62a20dc61d62cb7e87caa43365590aae338b Mon Sep 17 00:00:00 2001 From: Brendan Smith Date: Tue, 17 Sep 2024 15:34:07 +0100 Subject: [PATCH 08/19] Switch caseworker app to use new caseworker GET CLEs endpoint --- caseworker/bookmarks/views.py | 2 +- caseworker/core/services.py | 38 +++++--------------------------- caseworker/queues/views/cases.py | 2 +- caseworker/tau/views.py | 4 ++-- 4 files changed, 10 insertions(+), 36 deletions(-) diff --git a/caseworker/bookmarks/views.py b/caseworker/bookmarks/views.py index 28805911b6..5a5888fee4 100644 --- a/caseworker/bookmarks/views.py +++ b/caseworker/bookmarks/views.py @@ -24,7 +24,7 @@ class AddBookmark(LoginRequiredMixin, CaseDataMixin, FormView): @cached_property def all_cles(self): - return get_control_list_entries(self.request, include_parent=True) + return get_control_list_entries(self.request, include_non_selectable_for_assessment=True) @cached_property def all_regimes(self): diff --git a/caseworker/core/services.py b/caseworker/core/services.py index 0bf7f79c5a..8ff12d6b24 100644 --- a/caseworker/core/services.py +++ b/caseworker/core/services.py @@ -131,40 +131,14 @@ def get_user_role_name(request): return user["user"]["role"]["name"] -CLC_ENTRIES_CACHE = [] - - -# Control List Entries -def get_control_list_entries( # noqa - request, convert_to_options=False, include_parent=False, clc_entries_cache=CLC_ENTRIES_CACHE # noqa -): # noqa - """ - Preliminary caching mechanism, requires service restart to repopulate control list entries - """ - if convert_to_options: - if clc_entries_cache: - return clc_entries_cache - else: - data = client.get(request, "/static/control-list-entries/") - - for control_list_entry in data.json().get("control_list_entries"): - clc_entries_cache.append( - Option( - key=control_list_entry["rating"], - value=control_list_entry["rating"], - description=control_list_entry["text"], - ) - ) - - return clc_entries_cache - - if include_parent: - response = client.get(request, "/static/control-list-entries/?include_parent=True") - else: - response = client.get(request, "/static/control-list-entries/?group=True") +def get_control_list_entries(request, include_non_selectable_for_assessment=False): + url = "/caseworker/static/control-list-entries/" + if include_non_selectable_for_assessment: + url = f"{url}?include_non_selectable_for_assessment=True" + response = client.get(request, url) response.raise_for_status() - return response.json().get("control_list_entries") + return response.json() # Regime Entries diff --git a/caseworker/queues/views/cases.py b/caseworker/queues/views/cases.py index dfffeb6a16..ae31eb1ea9 100644 --- a/caseworker/queues/views/cases.py +++ b/caseworker/queues/views/cases.py @@ -60,7 +60,7 @@ def all_flags(self): @cached_property def all_cles(self): - return get_control_list_entries(self.request, include_parent=True) + return get_control_list_entries(self.request, include_non_selectable_for_assessment=True) @cached_property def all_regimes(self): diff --git a/caseworker/tau/views.py b/caseworker/tau/views.py index aefc964e06..ebb302b512 100644 --- a/caseworker/tau/views.py +++ b/caseworker/tau/views.py @@ -116,8 +116,8 @@ def goods(self): @cached_property def control_list_entries(self): - control_list_entries = get_control_list_entries(self.request, convert_to_options=True) - return [(item.value, item.key) for item in control_list_entries] + control_list_entries = get_control_list_entries(self.request, include_non_selectable_for_assessment=False) + return [(item["rating"], item["rating"]) for item in control_list_entries] @expect_status( HTTPStatus.OK, From 53691b933ed1ba24d280dca7b98a56d84f18aa7f Mon Sep 17 00:00:00 2001 From: Brendan Smith Date: Wed, 18 Sep 2024 14:34:48 +0100 Subject: [PATCH 09/19] Fix unit tests by mocking new CLE endpoints --- caseworker/templates/flags/index.html | 5 - unit_tests/caseworker/bookmarks/test_views.py | 4 +- .../caseworker/cases/test_permissions.py | 2 +- .../cases/views/test_case_bookmarks.py | 6 +- unit_tests/caseworker/conftest.py | 8 +- unit_tests/caseworker/flags/test_views.py | 92 ------------------- unit_tests/conftest.py | 32 +------ 7 files changed, 14 insertions(+), 135 deletions(-) diff --git a/caseworker/templates/flags/index.html b/caseworker/templates/flags/index.html index 8adaaa306c..2bd1e55a62 100644 --- a/caseworker/templates/flags/index.html +++ b/caseworker/templates/flags/index.html @@ -14,11 +14,6 @@

{% lcs 'flags.FlagsList.DESCRIPTION' %}

- {% if can_change_config %} -
- {% govuk_link_button id='add-a-flag' text='flags.FlagsList.CREATE_BUTTON' url='flags:add' %} -
- {% endif %} {% include "filters.html" %} diff --git a/unit_tests/caseworker/bookmarks/test_views.py b/unit_tests/caseworker/bookmarks/test_views.py index 528add2ec0..365a5f2f35 100644 --- a/unit_tests/caseworker/bookmarks/test_views.py +++ b/unit_tests/caseworker/bookmarks/test_views.py @@ -42,7 +42,7 @@ def test_add_bookmark_ok( mock_cases_with_filter_data, requests_mock, gov_uk_user_id, - mock_all_control_list_entries, + mock_control_list_entries, mock_regime_entries, ): mock_post = mock_post_bookmark(requests_mock) @@ -80,7 +80,7 @@ def test_add_bookmark_fail( requests_mock, gov_uk_user_id, return_code, - mock_all_control_list_entries, + mock_control_list_entries, mock_regime_entries, ): mock_post_bookmark(requests_mock, return_code) diff --git a/unit_tests/caseworker/cases/test_permissions.py b/unit_tests/caseworker/cases/test_permissions.py index 8ccab6972e..a2fb70ade7 100644 --- a/unit_tests/caseworker/cases/test_permissions.py +++ b/unit_tests/caseworker/cases/test_permissions.py @@ -121,7 +121,7 @@ def test_warning_renders_when_expected( data_queue, mock_gov_user, mock_denial_reasons, - mock_control_list_entries_get, + mock_control_list_entries, mock_regime_entries_get, mock_precedents_api, data_standard_case, diff --git a/unit_tests/caseworker/cases/views/test_case_bookmarks.py b/unit_tests/caseworker/cases/views/test_case_bookmarks.py index 4edb5f046f..eb977ad07f 100644 --- a/unit_tests/caseworker/cases/views/test_case_bookmarks.py +++ b/unit_tests/caseworker/cases/views/test_case_bookmarks.py @@ -16,7 +16,7 @@ def test_no_bookmarks_present( mock_queues_list, mock_countries, mock_no_bookmarks, - mock_all_control_list_entries, + mock_control_list_entries, mock_regime_entries, ): url = reverse("core:index") @@ -31,7 +31,7 @@ def test_failed_bookmarks_displays_no_bookmarks( mock_queues_list, mock_countries, mock_failed_bookmarks_call, - mock_all_control_list_entries, + mock_control_list_entries, mock_regime_entries, ): url = reverse("core:index") @@ -48,7 +48,7 @@ def test_bookmarks_present( mock_queues_list, mock_countries, gov_uk_user_id, - mock_all_control_list_entries, + mock_control_list_entries, mock_regime_entries, ): url = reverse("core:index") diff --git a/unit_tests/caseworker/conftest.py b/unit_tests/caseworker/conftest.py index fbce73bc96..1b8c4717fa 100644 --- a/unit_tests/caseworker/conftest.py +++ b/unit_tests/caseworker/conftest.py @@ -2848,10 +2848,10 @@ def mock_flags(requests_mock, flags): return requests_mock.get(url=url, json=flags) -@pytest.fixture() -def mock_all_control_list_entries(requests_mock, all_cles): - url = client._build_absolute_uri("/static/control-list-entries/") - return requests_mock.get(url=url, json={"control_list_entries": all_cles}) +@pytest.fixture +def mock_control_list_entries(requests_mock, data_control_list_entries): + url = client._build_absolute_uri("/caseworker/static/control-list-entries/") + return requests_mock.get(url=url, json=data_control_list_entries) @pytest.fixture() diff --git a/unit_tests/caseworker/flags/test_views.py b/unit_tests/caseworker/flags/test_views.py index afdd7377cb..20be938d67 100644 --- a/unit_tests/caseworker/flags/test_views.py +++ b/unit_tests/caseworker/flags/test_views.py @@ -36,98 +36,6 @@ def test_flags_can_be_created_and_modified(authorized_client, specify_config_use assert response.context["can_change_config"] == True -def test_flagging_rules_cannot_be_created_and_modified(authorized_client, reset_config_users_list): - - url = reverse("flags:flagging_rules") - response = authorized_client.get(url) - assert response.status_code == 200 - assert response.context["can_change_config"] == False - - -def test_flagging_rules_can_be_created_and_modified(authorized_client, specify_config_users_list): - - url = reverse("flags:flagging_rules") - response = authorized_client.get(url) - assert response.status_code == 200 - assert response.context["can_change_config"] == True - - -@pytest.mark.parametrize( - "url", - ( - (reverse("flags:add")), - (reverse("flags:edit", kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234"})), - (reverse("flags:change_status", kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234", "status": "Active"})), - ), -) -def test_flags_add_view_returns_unauthorized_user_not_on_config_admin_list( - authorized_client, reset_config_users_list, url -): - - response = authorized_client.get(url) - assert response.status_code == 403 - assert response.context["title"] == "Sorry, unauthorized" - assert response.context["description"] == "You don't have authorisation to view this page" - - -@pytest.mark.parametrize( - "url", - ( - (reverse("flags:add")), - (reverse("flags:edit", kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234"})), - (reverse("flags:change_status", kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234", "status": "deactivate"})), - ), -) -def test_flags_add_view_returns_ok_user_on_config_admin_list(authorized_client, specify_config_users_list, url): - - response = authorized_client.get(url) - assert response.status_code == 200 - - -@pytest.mark.parametrize( - "url", - ( - (reverse("flags:create_flagging_rules")), - (reverse("flags:edit_flagging_rule", kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234"})), - ( - reverse( - "flags:change_flagging_rule_status", - kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234", "status": "Active"}, - ) - ), - ), -) -def test_flagging_rules_add_view_returns_unauthorized_user_not_on_config_admin_list( - authorized_client, reset_config_users_list, url -): - - response = authorized_client.get(url) - assert response.status_code == 403 - assert response.context["title"] == "Sorry, unauthorized" - assert response.context["description"] == "You don't have authorisation to view this page" - - -@pytest.mark.parametrize( - "url", - ( - (reverse("flags:create_flagging_rules")), - (reverse("flags:edit_flagging_rule", kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234"})), - ( - reverse( - "flags:change_flagging_rule_status", - kwargs={"pk": "e9f8711e-b383-47e5-b160-153f27771234", "status": "Active"}, - ) - ), - ), -) -def test_flagging_rules_add_view_returns_ok_user_on_config_admin_list( - authorized_client, specify_config_users_list, url -): - - response = authorized_client.get(url) - assert response.status_code == 200 - - def test_assign_flags_view_destination(authorized_client, queue_pk, open_case_pk): url = reverse("cases:assign_flags", kwargs={"queue_pk": queue_pk, "pk": open_case_pk}) response = authorized_client.get(url) diff --git a/unit_tests/conftest.py b/unit_tests/conftest.py index f7e66f0ca0..9f0c31ad2f 100644 --- a/unit_tests/conftest.py +++ b/unit_tests/conftest.py @@ -21,7 +21,6 @@ from formtools.wizard.views import normalize_name -from caseworker.core.services import CLC_ENTRIES_CACHE from core import client from core.constants import OrganisationDocumentType @@ -86,22 +85,10 @@ def set_aws_s3_settings(settings, s3_settings, mocker): @pytest.fixture def data_control_list_entries(): # in reality there are around 3000 CLCs - return { - "control_list_entries": [ - {"rating": "ML1", "text": "Smooth-bore weapons with a calibre of less than 20mm, other firearms..."}, - {"rating": "ML1a", "text": "Rifles and combination guns, handguns, machine, sub-machine and volley guns"}, - ] - } - - -@pytest.fixture -def mock_control_list_entries(requests_mock, data_control_list_entries): - # We must clear app-level CLE cache used by core.services.get_control_list_entrie - # so that tests remain isolated from eachother - # TODO: Remove this when we have a better way of caching CLEs - CLC_ENTRIES_CACHE.clear() - url = client._build_absolute_uri("/static/control-list-entries/") - yield requests_mock.get(url=url, json=data_control_list_entries) + return [ + {"rating": "ML1", "text": "Smooth-bore weapons with a calibre of less than 20mm, other firearms..."}, + {"rating": "ML1a", "text": "Rifles and combination guns, handguns, machine, sub-machine and volley guns"}, + ] @pytest.fixture @@ -2530,17 +2517,6 @@ def data_ecju_queries(): } -@pytest.fixture -def mock_control_list_entries_get(requests_mock): - url = client._build_absolute_uri(f"/static/control-list-entries/") - return requests_mock.get( - url=url, - json={ - "control_list_entries": [{"rating": "ML1a", "text": "some text"}, {"rating": "ML22b", "text": "some text"}] - }, - ) - - class WizardStepPoster: def __init__(self, authorized_client, url): self.authorized_client = authorized_client From 04695448d438bd463e70302d88a45231eac28e93 Mon Sep 17 00:00:00 2001 From: Gurdeep Atwal Date: Mon, 23 Sep 2024 15:50:43 +0100 Subject: [PATCH 10/19] copy changes --- caseworker/organisations/forms.py | 4 +-- .../registration-details-individual.html | 4 +-- .../caseworker/organisations/test_views.py | 27 ++++++++++++++++++- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/caseworker/organisations/forms.py b/caseworker/organisations/forms.py index 9b98c2f8b8..015372cfe7 100644 --- a/caseworker/organisations/forms.py +++ b/caseworker/organisations/forms.py @@ -290,7 +290,7 @@ def edit_individual_form(organisation, can_edit_name, are_fields_optional): def review_organisation_form(request, pk): organisation = get_organisation(request, str(pk)) matching_organisation_details = get_organisation_matching_details(request, str(pk)) - + organisation_type = "Other" if organisation["type"]["value"] == "Individual" else organisation["type"]["value"] return Form( title=ReviewOrganisationPage.TITLE, questions=[ @@ -304,7 +304,7 @@ def review_organisation_form(request, pk): Summary( values={ ReviewOrganisationPage.Summary.NAME: organisation["name"], - ReviewOrganisationPage.Summary.TYPE: organisation["type"]["value"], + ReviewOrganisationPage.Summary.TYPE: organisation_type, ReviewOrganisationPage.Summary.EORI: organisation["eori_number"], ReviewOrganisationPage.Summary.SIC: organisation["sic_number"], ReviewOrganisationPage.Summary.VAT: organisation["vat_number"], diff --git a/exporter/templates/core/registration/includes/registration-details-individual.html b/exporter/templates/core/registration/includes/registration-details-individual.html index 8f703e3ac3..c483aaa2d2 100644 --- a/exporter/templates/core/registration/includes/registration-details-individual.html +++ b/exporter/templates/core/registration/includes/registration-details-individual.html @@ -1,12 +1,12 @@

- Register a private individual + Organisation details

- First and last name + Name
{{ registration_data.name}} diff --git a/unit_tests/caseworker/organisations/test_views.py b/unit_tests/caseworker/organisations/test_views.py index db48599024..5c556f3ce7 100644 --- a/unit_tests/caseworker/organisations/test_views.py +++ b/unit_tests/caseworker/organisations/test_views.py @@ -14,7 +14,7 @@ def organisation(): return { "form_pk": 1, "name": "regional site", - "type": "commercial", + "type": {"value": "commercial"}, "location": "united_kingdom", "eori_number": "123456789AA", "sic_number": "2345", @@ -136,3 +136,28 @@ def test_organisations_html_title_on_changed_tab(authorized_client, requests_moc actual_title = soup.title.string.strip() actual_title = actual_title.replace("\n", "").replace("\t", "") assert actual_title == expected_title + + +@pytest.mark.parametrize( + ("org_type", "expected_value"), + [ + ("Commercial Organisation", "Commercial Organisation"), + ("Individual", "Other"), + ], +) +def test_review_organisation(authorized_client, requests_mock, retrieved_organisation, org_type, expected_value): + organisation_id = UUID(retrieved_organisation["id"]) + retrieved_organisation["type"]["value"] = org_type + requests_mock.get(client._build_absolute_uri(f"/organisations/{organisation_id}"), json=retrieved_organisation) + requests_mock.get( + client._build_absolute_uri(f"/organisations/{organisation_id}/matching_details/"), + json={"matching_properties": []}, + ) + url = reverse("organisations:organisation_review", kwargs={"pk": organisation_id}) + response = authorized_client.get(url) + + assert response.status_code == 200 + soup = BeautifulSoup(response.content, "html.parser") + soup.find_all("govuk-summary-list__row") + org_details = soup.find_all(class_="govuk-summary-list__row") + assert org_details[1].span.text == expected_value From 3487ffe3aa288396eb63eda209a7ce3d81691eaf Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 20 Sep 2024 16:08:57 +0100 Subject: [PATCH 11/19] Make logout clear session for exporter mock sso --- core/mock_sso/views.py | 7 +++++-- exporter/mock_sso/views.py | 10 ++-------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/core/mock_sso/views.py b/core/mock_sso/views.py index d7bfcacc35..479d49d88b 100644 --- a/core/mock_sso/views.py +++ b/core/mock_sso/views.py @@ -147,7 +147,10 @@ def get(self, request, **kwargs): class Logout(RedirectView): - def get_redirect_url(self, *args, **kwargs): + def get_redirect_url(self): redirect_url = self.request.build_absolute_uri("/") - self.request.session.flush() return redirect_url + + def get(self, request, *args, **kwargs): + self.request.session.flush() + return super().get(request, *args, **kwargs) diff --git a/exporter/mock_sso/views.py b/exporter/mock_sso/views.py index 6d50ce7cc6..1da2706626 100644 --- a/exporter/mock_sso/views.py +++ b/exporter/mock_sso/views.py @@ -1,12 +1,6 @@ -from django.views.generic import RedirectView +from core.mock_sso.views import Logout as CoreLogout -class Logout(RedirectView): - """This logout view replicates how an openid logout endpoint would work. - - This purposefully doesn't need to provide any additional functionality - beyond just redirecting back to the provided value. - """ - +class Logout(CoreLogout): def get_redirect_url(self): return self.request.GET["post_logout_redirect_uri"] From 371f1194eaec1fc58203dffa7675ae67a3273113 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 20 Sep 2024 11:24:01 +0100 Subject: [PATCH 12/19] Rename good to good_on_application in licences template --- exporter/templates/licences/licences.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/exporter/templates/licences/licences.html b/exporter/templates/licences/licences.html index 03e6f23311..30b92a105f 100644 --- a/exporter/templates/licences/licences.html +++ b/exporter/templates/licences/licences.html @@ -56,12 +56,12 @@

{% block title %}{% lcs "licences.LicencesList.TITLE - {% for good in licence.goods|slice:":3" %} + {% for good_on_application in licence.goods|slice:":3" %}
- {% if good.good %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good.good.control_list_entries %}: {{ good.good.description }} + {% if good_on_application.good %} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.good.control_list_entries %}: {{ good_on_application.good.description }} {% else %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good.control_list_entries %}: {{ good.description }} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description }} {% endif %} {% if licence.goods|length > row_limit and forloop.counter == row_limit %}
@@ -71,12 +71,12 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% endif %}

{% endfor %} - {% for good in licence.goods %} + {% for good_on_application in licence.goods %}
- {% if good.good %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good.good.control_list_entries %}: {{ good.good.description|abbreviate_string:50 }} + {% if good_on_application.good %} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.good.control_list_entries %}: {{ good_on_application.good.description|abbreviate_string:50 }} {% else %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good.control_list_entries %}: {{ good.description|abbreviate_string:50 }} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description|abbreviate_string:50 }} {% endif %}
{% endfor %} From 5c8ad7444996db8f69f3916cf160b044c8e92767 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 20 Sep 2024 12:06:32 +0100 Subject: [PATCH 13/19] Remove checking for `good` when displaying CLEs This wasn't actually being passed through on the endpoint so this wasn't doing anything --- exporter/templates/licences/licences.html | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/exporter/templates/licences/licences.html b/exporter/templates/licences/licences.html index 30b92a105f..90cd46bb95 100644 --- a/exporter/templates/licences/licences.html +++ b/exporter/templates/licences/licences.html @@ -58,11 +58,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% for good_on_application in licence.goods|slice:":3" %}
- {% if good_on_application.good %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.good.control_list_entries %}: {{ good_on_application.good.description }} - {% else %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description }} - {% endif %} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description }} {% if licence.goods|length > row_limit and forloop.counter == row_limit %}
@@ -73,11 +69,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% endfor %} {% for good_on_application in licence.goods %}
- {% if good_on_application.good %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.good.control_list_entries %}: {{ good_on_application.good.description|abbreviate_string:50 }} - {% else %} - {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description|abbreviate_string:50 }} - {% endif %} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description|abbreviate_string:50 }}
{% endfor %} From 5ab8c8ea772ea4d182be61ca26b5d4399e86edb3 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 20 Sep 2024 12:07:51 +0100 Subject: [PATCH 14/19] Use the assessed control list entries to display on licences --- exporter/templates/licences/licences.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporter/templates/licences/licences.html b/exporter/templates/licences/licences.html index 90cd46bb95..80f7101595 100644 --- a/exporter/templates/licences/licences.html +++ b/exporter/templates/licences/licences.html @@ -58,7 +58,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% for good_on_application in licence.goods|slice:":3" %}
- {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description }} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.description }} {% if licence.goods|length > row_limit and forloop.counter == row_limit %}
@@ -69,7 +69,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% endfor %} {% for good_on_application in licence.goods %}
- {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.control_list_entries %}: {{ good_on_application.description|abbreviate_string:50 }} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.description|abbreviate_string:50 }}
{% endfor %} From e2938805234d61dbd69e6fe095ee8be7a343c4fd Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 20 Sep 2024 12:08:41 +0100 Subject: [PATCH 15/19] Use name instead of description for good on licences list --- exporter/templates/licences/licences.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exporter/templates/licences/licences.html b/exporter/templates/licences/licences.html index 80f7101595..7cda47e502 100644 --- a/exporter/templates/licences/licences.html +++ b/exporter/templates/licences/licences.html @@ -58,7 +58,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% for good_on_application in licence.goods|slice:":3" %}
- {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.description }} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.name }} {% if licence.goods|length > row_limit and forloop.counter == row_limit %}
@@ -69,7 +69,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% endfor %} {% for good_on_application in licence.goods %}
- {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.description|abbreviate_string:50 }} + {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.name }}
{% endfor %} From dc863139b9c3e692f552366211a84fc7b7a1e121 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Fri, 20 Sep 2024 16:50:40 +0100 Subject: [PATCH 16/19] Add tests to check licence details table --- exporter/templates/licences/licences.html | 88 ++++++++++++---------- unit_tests/conftest.py | 10 +++ unit_tests/exporter/licences/test_views.py | 57 +++++++++++++- 3 files changed, 113 insertions(+), 42 deletions(-) diff --git a/exporter/templates/licences/licences.html b/exporter/templates/licences/licences.html index 7cda47e502..7022a54573 100644 --- a/exporter/templates/licences/licences.html +++ b/exporter/templates/licences/licences.html @@ -34,7 +34,7 @@

{% block title %}{% lcs "licences.LicencesList.TITLE {% include 'filters.html' %} {% if data.results %} - +
@@ -47,64 +47,70 @@

{% block title %}{% lcs "licences.LicencesList.TITLE

{% for licence in data.results %} - +
{% lcs "licences.LicencesList.Table.REFERENCE_COLUMN" %}
- {{ licence.reference_code|highlight_text:reference }} -

{{ licence.application.name|highlight_text:reference }}

+ {{ licence.reference_code|highlight_text:reference }} +

{{ licence.application.name|highlight_text:reference }}

- {% for good_on_application in licence.goods|slice:":3" %} -
- {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.name }} - {% if licence.goods|length > row_limit and forloop.counter == row_limit %} -
- - ({{ row_limit }} of {{ licence.goods|length }}) - - {% endif %} -
- {% endfor %} - {% for good_on_application in licence.goods %} -
- {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.name }} -
- {% endfor %} +
+ {% for good_on_application in licence.goods|slice:":3" %} +
+ {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.name }} + {% if licence.goods|length > row_limit and forloop.counter == row_limit %} +
+ + ({{ row_limit }} of {{ licence.goods|length }}) + + {% endif %} +
+ {% endfor %} + {% for good_on_application in licence.goods %} +
+ {{ forloop.counter }}. {% include 'includes/control-list-entries.html' with control_list_entries=good_on_application.assessed_control_list_entries %}: {{ good_on_application.name }} +
+ {% endfor %} +
- {% for destination in licence.application.destinations|slice:":3" %} -
- {% if destination.name %}{{ destination.name }} - {% endif %}{{ destination.country.name }} - {% if licence.application.destinations|length > row_limit and forloop.counter == row_limit %} -
- - ({{ row_limit }} of {{ licence.application.destinations|length }}) - - {% endif %} -
- {% endfor %} - {% for destination in licence.application.destinations %} -
- {% if destination.name %}{{ destination.name }} - {% endif %}{{ destination.country.name }} -
- {% endfor %} +
+ {% for destination in licence.application.destinations|slice:":3" %} +
+ {% if destination.name %}{{ destination.name }} - {% endif %}{{ destination.country.name }} + {% if licence.application.destinations|length > row_limit and forloop.counter == row_limit %} +
+ + ({{ row_limit }} of {{ licence.application.destinations|length }}) + + {% endif %} +
+ {% endfor %} + {% for destination in licence.application.destinations %} +
+ {% if destination.name %}{{ destination.name }} - {% endif %}{{ destination.country.name }} +
+ {% endfor %} +
- {{ licence.status.value }} + {{ licence.status.value }} - {% for document in licence.application.documents %} - {% lcs "licences.LicencesList.DOWNLOAD_HIDDEN_TEXT" %} - {{ document.advice_type.value }}.pdf - {% endfor %} +
+ {% for document in licence.application.documents %} + {% lcs "licences.LicencesList.DOWNLOAD_HIDDEN_TEXT" %} + {{ document.advice_type.value }}.pdf + {% endfor %} +
diff --git a/unit_tests/conftest.py b/unit_tests/conftest.py index 9f0c31ad2f..bc9278b5dd 100644 --- a/unit_tests/conftest.py +++ b/unit_tests/conftest.py @@ -7,6 +7,8 @@ import requests +from bs4 import BeautifulSoup + from datetime import timedelta from urllib.parse import urljoin, urlparse @@ -2616,3 +2618,11 @@ def _render_form(form, request=None): return rendered return _render_form + + +@pytest.fixture() +def beautiful_soup(): + def _beautiful_soup(html): + return BeautifulSoup(html, "html.parser") + + return _beautiful_soup diff --git a/unit_tests/exporter/licences/test_views.py b/unit_tests/exporter/licences/test_views.py index 686a905534..a939e76c3a 100644 --- a/unit_tests/exporter/licences/test_views.py +++ b/unit_tests/exporter/licences/test_views.py @@ -103,6 +103,7 @@ def data_list_licences(): "good_on_application_id": "3bcfd636-da6b-4458-a812-f78af77cc8ba", "usage": 0.0, "description": "Example product", + "name": "Example product name", "units": {"key": "MTR", "value": "Metre(s)"}, "applied_for_quantity": 1.0, "applied_for_value": 1.0, @@ -110,7 +111,14 @@ def data_list_licences(): "licenced_value": 1.0, "applied_for_value_per_item": 1.0, "licenced_value_per_item": 1.0, - "control_list_entries": [], + "control_list_entries": [ + {"rating": "N1"}, + {"rating": "N2"}, + ], + "assessed_control_list_entries": [ + {"rating": "R1a"}, + {"rating": "MJ1"}, + ], "advice": {"type": {"key": "approve", "value": "Approve"}, "text": "", "proviso": None}, } ], @@ -163,6 +171,53 @@ def test_open_and_standard_licences(client, data_list_licences, list_open_standa assert [item.name for item in response.context_data["filters"].filters] == expected_filters +def test_standard_licences_details( + client, data_list_licences, list_open_standard_licences_url, mock_list_licences, beautiful_soup +): + response = client.get(list_open_standard_licences_url) + assert response.status_code == 200 + + soup = beautiful_soup(response.content) + + licence_details_table = soup.find(id="licence-details-table") + assert licence_details_table + licence_rows = licence_details_table.select(".licence-details-table__licence_row") + assert len(licence_rows) == len(data_list_licences["results"]) + for licence_row, licence_data in zip(licence_rows, data_list_licences["results"]): + assert licence_row.attrs["id"] == f"licence-{licence_data['id']}" + assert ( + licence_row.select_one(".licence-details-table__licence_reference_code").text + == licence_data["reference_code"] + ) + assert ( + licence_row.select_one(".licence-details-table__licence_application_name").text + == licence_data["application"]["name"] + ) + + goods = licence_row.select(".licence-details-table__goods .app-expanded-row__item") + for line_number, (good, good_data) in enumerate(zip(goods, licence_data["goods"]), start=1): + assert good.select_one(".licence-details-table__good_line_number").text == f"{line_number}." + assert [cle.text.replace(",", "").strip() for cle in good.select(".lite-inline-list li")] == [ + cle["rating"] for cle in good_data["assessed_control_list_entries"] + ] + assert good.select_one(".licence-details-table__good_name").text == good_data["name"] + + destinations = licence_row.select(".licence-details-table__destinations .app-expanded-row__item") + for destination, destination_data in zip(destinations, licence_data["application"]["destinations"]): + assert destination.text.strip() == f"{destination_data['name']} - {destination_data['country']['name']}" + + assert licence_row.select_one(".licence-details-table__licence-status").text == "Issued" + + documents = licence_row.select(".licence-details-table__application-documents") + for document, document_data in zip(documents, licence_data["application"]["documents"]): + document_link = document.select_one("#document-download") + assert document_link.text == f"{document_data['advice_type']['value']}.pdf" + assert document_link.attrs["href"] == reverse( + "applications:download_generated_document", + kwargs={"document_pk": document_data["id"], "case_pk": licence_data["application"]["id"]}, + ) + + def test_open_and_standard_licences_paging(client, list_open_standard_licences_url, mock_list_licences): session = client.session session["organisation_name"] = "test company" From 5f319e2a97286b052affb307c3c877afebd92f85 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Mon, 23 Sep 2024 14:33:18 +0100 Subject: [PATCH 17/19] Update e2e test to validate correct good details on licence --- tests_common/api_client/sub_helpers/goods.py | 14 +++++++++ ui_tests/exporter/features/licences.feature | 1 + ui_tests/exporter/step_defs/test_licences.py | 32 ++++++++++++++++---- 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/tests_common/api_client/sub_helpers/goods.py b/tests_common/api_client/sub_helpers/goods.py index e6fa3b738c..81fad5353a 100644 --- a/tests_common/api_client/sub_helpers/goods.py +++ b/tests_common/api_client/sub_helpers/goods.py @@ -1,3 +1,5 @@ +import random + from faker import Faker fake = Faker() @@ -89,6 +91,15 @@ def add_hmrc_goods_type(self, hmrc_draft_id): ) def update_good_clc(self, *, good_id, good_on_application_id, case_id, **kwargs): + report_summary_subject = kwargs.get("report_summary_subject") + if not report_summary_subject: + response = self.api_client.make_request( + method="GET", + url=f"/static/report_summary/subjects/", + headers=self.api_client.gov_headers, + ) + report_summary_ids = [subject["id"] for subject in response.json()["report_summary_subjects"]] + report_summary_subject = random.choice(report_summary_ids) self.api_client.make_request( method="PUT", url=f"/assessments/make-assessments/{case_id}/", @@ -98,7 +109,10 @@ def update_good_clc(self, *, good_id, good_on_application_id, case_id, **kwargs) "control_list_entries": kwargs.get("control_list_entries", []), "is_good_controlled": kwargs.get("is_good_controlled", True), "report_summary": kwargs.get("report_summary", ""), + "report_summary_prefix": kwargs.get("report_summary_prefix", ""), + "report_summary_subject": report_summary_subject, "comment": kwargs.get("comment", ""), + "regime_entries": kwargs.get("regime_entries", []), "id": good_on_application_id, } ], diff --git a/ui_tests/exporter/features/licences.feature b/ui_tests/exporter/features/licences.feature index 89909aa061..1fdb9d4daa 100644 --- a/ui_tests/exporter/features/licences.feature +++ b/ui_tests/exporter/features/licences.feature @@ -6,6 +6,7 @@ Feature: I want to be able to view licences as an exporter user Given I signin and go to exporter homepage and choose Test Org And I put the test user in the admin team And I create a standard application via api + And I assess the goods with "ML5a,ML5b" And I remove the flags to finalise the licence And I put the test user in the "Licensing Unit" team And I create "approve" final advice diff --git a/ui_tests/exporter/step_defs/test_licences.py b/ui_tests/exporter/step_defs/test_licences.py index 077e945a5d..8fe0ce6945 100644 --- a/ui_tests/exporter/step_defs/test_licences.py +++ b/ui_tests/exporter/step_defs/test_licences.py @@ -1,7 +1,13 @@ from time import sleep from django.contrib.humanize.templatetags.humanize import intcomma -from pytest_bdd import scenarios, given, when, then +from pytest_bdd import ( + given, + parsers, + scenarios, + then, + when, +) from ui_tests.exporter.pages.shared import Shared from ui_tests.exporter.pages.licence_page import LicencePage @@ -38,12 +44,12 @@ def is_email_sent_to_hmrc(context, driver, api_client): @then("I see my standard licence") -def standard_licence_row(context, driver): +def standard_licence_row(context, driver, assessed_control_list_entries): Shared(driver).filter_by_reference_number(context.reference_code) row = LicencesPage(driver).licence_row_properties(context.licence) assert context.reference_code in row - assert ", ".join(x["rating"] for x in context.goods[0]["good"]["control_list_entries"]) in row - assert context.goods[0]["good"]["description"] in row + assert ", ".join(assessed_control_list_entries) in row + assert context.goods[0]["good"]["name"] in row assert context.end_user["country"]["name"] in row assert context.end_user["name"] in row assert "Issued" in row @@ -100,12 +106,12 @@ def licence_details(driver, context): @then("I see my standard application licence details") -def standard_licence_details(driver, context): +def standard_licence_details(driver, context, assessed_control_list_entries): page = LicencePage(driver) assert context.end_user["country"]["name"] in page.get_destination() assert context.end_user["name"] in page.get_end_user() good_row = page.get_good_row() - assert ", ".join(x["rating"] for x in context.goods[0]["good"]["control_list_entries"]) in good_row + assert ", ".join(assessed_control_list_entries) in good_row formatted_licenced_quantity = intcomma(context.goods[0]["quantity"]).split(".")[0] formatted_licenced_value = intcomma(float(context.goods[0]["value"]) * context.goods[0]["quantity"]).split(".")[0] assert formatted_licenced_quantity in good_row @@ -133,3 +139,17 @@ def exhibition_licence_details(driver, context): @given("an Exhibition Clearance is created") # noqa def an_exhibition_clearance_is_created(driver, apply_for_exhibition_clearance): # noqa pass + + +@given(parsers.parse('I assess the goods with "{cle_entries}"'), target_fixture="assessed_control_list_entries") +def assess_goods(api_test_client, cle_entries): + cle_entries = [cle.strip() for cle in cle_entries.split(",")] + api_test_client.goods.update_good_clc( + good_id=api_test_client.context["good_id"], + good_on_application_id=api_test_client.context["good_on_application_id"], + case_id=api_test_client.context["case_id"], + control_list_entries=cle_entries, + is_good_controlled=True, + report_summary="ARS", + ) + return cle_entries From d7d635d0eecfebab302af33d297a598a35c0adfd Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Mon, 23 Sep 2024 14:37:22 +0100 Subject: [PATCH 18/19] Remove legacy and skipped e2e tests --- ui_tests/exporter/features/licences.feature | 53 ------------ ui_tests/exporter/step_defs/test_licences.py | 84 -------------------- 2 files changed, 137 deletions(-) diff --git a/ui_tests/exporter/features/licences.feature b/ui_tests/exporter/features/licences.feature index 1fdb9d4daa..bcbb7c5210 100644 --- a/ui_tests/exporter/features/licences.feature +++ b/ui_tests/exporter/features/licences.feature @@ -17,56 +17,3 @@ Feature: I want to be able to view licences as an exporter user When I view my licence Then I see all the typical licence details And I see my standard application licence details - - @skip @current - Scenario: When a new licence is issued, an email is sent to notify LITE-HMRC - Given I signin and go to exporter homepage and choose Test Org - And Only my email is to be processed by LITE-HMRC - And I put the test user in the admin team - And I create a standard application via api - And I remove the flags to finalise the licence - And I create "approve" final advice - And I create a licence for my application with "approve" decision document and good decisions - When I go to the licences page - Then I see my standard licence - When I view my licence - Then I see all the typical licence details - And I see my standard application licence details - And an email is sent to HMRC - - @skip @legacy - Scenario: View my open application licences - Given I go to exporter homepage and choose Test Org - And I create an open application via api - And I remove the flags to finalise the licence - And I create "approve" final advice for open application - And I create a licence for my open application with "approve" decision document - When I go to the licences page - Then I see my open licence - When I view my licence - Then I see all the typical licence details - And I see my open application licence details - - @skip @legacy - Scenario: View my mod application licences - Given I go to exporter homepage and choose Test Org - And an Exhibition Clearance is created - And I create "approve" final advice - And I create a licence for my application with "approve" decision document - When I go to the licences page - And I click on the clearances tab - Then I see my exhibition licence - When I view my licence - Then I see all the typical licence details - And I see my exhibition application licence details - - @skip @legacy - Scenario: View my nlr documents - Given I go to exporter homepage and choose Test Org - And I create a standard application via api - And I remove the flags to finalise the licence - And I create "no_licence_required" final advice - And I finalise my NLR decision - When I go to the licences page - And I click on the NLR tab - Then I see my nlr document diff --git a/ui_tests/exporter/step_defs/test_licences.py b/ui_tests/exporter/step_defs/test_licences.py index 8fe0ce6945..d52b6f2509 100644 --- a/ui_tests/exporter/step_defs/test_licences.py +++ b/ui_tests/exporter/step_defs/test_licences.py @@ -1,5 +1,3 @@ -from time import sleep - from django.contrib.humanize.templatetags.humanize import intcomma from pytest_bdd import ( given, @@ -21,28 +19,6 @@ def licences_page(driver, exporter_url): driver.get(exporter_url.rstrip("/") + "/licences/") -@then("an email is sent to HMRC") -def is_email_sent_to_hmrc(context, driver, api_client): - - # Force the task manager on LITE-HMRC to send any queued - # emails. This is required so our test doesn't have to - # wait 10mins until the task manager runs the task. - url = f"/licences/hmrc-integration/force-mail-push/" - response = api_client.make_request(method="GET", url=url, headers=api_client.exporter_headers) - assert response.status_code == 200 - - sleep(5) - - # Check email is sent by probing the lite-api endpoint (which in turn cascades to LITE-HMRC) - url = f"/licences/hmrc-integration/{context.licence}/" - response = api_client.make_request(method="GET", url=url, headers=api_client.exporter_headers) - assert response.status_code == 200 - - # Check mail status - hmrc_mail_status = response.json()["hmrc_mail_status"] - assert hmrc_mail_status == "reply_pending", f"HMRC mail status is {hmrc_mail_status}" - - @then("I see my standard licence") def standard_licence_row(context, driver, assessed_control_list_entries): Shared(driver).filter_by_reference_number(context.reference_code) @@ -55,44 +31,6 @@ def standard_licence_row(context, driver, assessed_control_list_entries): assert "Issued" in row -@then("I see my open licence") -def open_licence_row(context, driver): - Shared(driver).filter_by_reference_number(context.reference_code) - row = LicencesPage(driver).licence_row_properties(context.licence) - assert context.reference_code in row - assert ", ".join(x["rating"] for x in context.goods_type["control_list_entries"]) in row - assert context.goods_type["description"] in row - assert context.country["name"] in row - assert "Issued" in row - - -@when("I click on the clearances tab") -def clearances_tab(driver): - LicencesPage(driver).click_clearances_tab() - - -@when("I click on the NLR tab") -def nlrs_tab(driver): - LicencesPage(driver).click_nlr_tab() - - -@then("I see my nlr document") -def nlr_document_visible(context, driver): - Shared(driver).filter_by_reference_number(context.reference_code) - row = LicencesPage(driver).licence_row_properties(context.generated_document) - assert context.reference_code in row - - -@then("I see my exhibition licence") -def exhibition_licence_row(context, driver): - Shared(driver).filter_by_reference_number(context.reference_code) - row = LicencesPage(driver).licence_row_properties(context.licence) - assert context.reference_code in row - assert ", ".join(x["rating"] for x in context.goods[0]["good"]["control_list_entries"]) in row - assert context.goods[0]["good"]["description"] in row - assert "Issued" in row - - @when("I view my licence") def view_licence(driver, context): LicencesPage(driver).click_licence(context.licence) @@ -119,28 +57,6 @@ def standard_licence_details(driver, context, assessed_control_list_entries): assert "0" in page.get_usage() -@then("I see my open application licence details") -def open_licence_details(driver, context): - page = LicencePage(driver) - assert context.country["name"] in page.get_destination() - good_row = page.get_good_row() - assert ", ".join(x["rating"] for x in context.goods_type["control_list_entries"]) in good_row - assert "0" in page.get_usage() - - -@then("I see my exhibition application licence details") -def exhibition_licence_details(driver, context): - assert ( - ", ".join(x["rating"] for x in context.goods[0]["good"]["control_list_entries"]) - in LicencePage(driver).get_good_row() - ) - - -@given("an Exhibition Clearance is created") # noqa -def an_exhibition_clearance_is_created(driver, apply_for_exhibition_clearance): # noqa - pass - - @given(parsers.parse('I assess the goods with "{cle_entries}"'), target_fixture="assessed_control_list_entries") def assess_goods(api_test_client, cle_entries): cle_entries = [cle.strip() for cle in cle_entries.split(",")] From c7f47af155094fb9e2f6f5e6d3561f5cc26adb27 Mon Sep 17 00:00:00 2001 From: Kevin Carrogan Date: Mon, 23 Sep 2024 14:41:53 +0100 Subject: [PATCH 19/19] Move BDD e2e fixtures to more relevant file --- ui_tests/exporter/conftest.py | 20 --------- ui_tests/exporter/step_defs/test_licences.py | 43 +++++++++++++------- 2 files changed, 29 insertions(+), 34 deletions(-) diff --git a/ui_tests/exporter/conftest.py b/ui_tests/exporter/conftest.py index 8ff6ae0cc9..ad435c4cc6 100644 --- a/ui_tests/exporter/conftest.py +++ b/ui_tests/exporter/conftest.py @@ -733,11 +733,6 @@ def final_advice(context, decision, api_test_client): # noqa context.final_advice = advice -@given(parsers.parse("I countersign the advice")) # noqa -def countersign_advice(context, decision, api_test_client): # noqa - api_test_client.cases.countersign_advice(context.case_id, context.final_advice) - - @given("I remove the flags to finalise the licence") # noqa def i_remove_all_flags(context, api_test_client): # noqa api_test_client.flags.assign_case_flags(context.case_id, []) @@ -746,16 +741,6 @@ def i_remove_all_flags(context, api_test_client): # noqa api_test_client.gov_users.put_test_user_in_team("Admin") -@given("I put the test user in the admin team") -def put_test_user_in_admin_team(api_test_client): # noqa - api_test_client.gov_users.put_test_user_in_team("Admin") - - -@given(parsers.parse('I put the test user in the "{team_name}" team')) -def put_test_user_in_specified_team(api_test_client, team_name): # noqa - api_test_client.gov_users.put_test_user_in_team(team_name) - - @given(parsers.parse('I create a licence for my application with "{decision}" decision document')) # noqa def create_licence(context, decision, api_test_client): # noqa document_template = api_test_client.document_templates.add_template( @@ -839,11 +824,6 @@ def change_ref_num(driver, context): # noqa enter_export_licence(driver, "yes", "12345678", context) -@when("I go to the licences page") -def licences_page(driver, exporter_url): # noqa - driver.get(exporter_url.rstrip("/") + "/licences/") - - @given(parsers.parse('I create "{decision}" final advice for open application')) # noqa def final_advice_open(context, decision, api_test_client): # noqa api_test_client.cases.create_final_advice( diff --git a/ui_tests/exporter/step_defs/test_licences.py b/ui_tests/exporter/step_defs/test_licences.py index d52b6f2509..a13487eadb 100644 --- a/ui_tests/exporter/step_defs/test_licences.py +++ b/ui_tests/exporter/step_defs/test_licences.py @@ -14,6 +14,35 @@ scenarios("../features/licences.feature", strict_gherkin=False) +@given("I put the test user in the admin team") +def put_test_user_in_admin_team(api_test_client): + api_test_client.gov_users.put_test_user_in_team("Admin") + + +@given(parsers.parse('I assess the goods with "{cle_entries}"'), target_fixture="assessed_control_list_entries") +def assess_goods(api_test_client, cle_entries): + cle_entries = [cle.strip() for cle in cle_entries.split(",")] + api_test_client.goods.update_good_clc( + good_id=api_test_client.context["good_id"], + good_on_application_id=api_test_client.context["good_on_application_id"], + case_id=api_test_client.context["case_id"], + control_list_entries=cle_entries, + is_good_controlled=True, + report_summary="ARS", + ) + return cle_entries + + +@given(parsers.parse('I put the test user in the "{team_name}" team')) +def put_test_user_in_specified_team(api_test_client, team_name): + api_test_client.gov_users.put_test_user_in_team(team_name) + + +@given("I countersign the advice") +def countersign_advice(context, decision, api_test_client): # noqa + api_test_client.cases.countersign_advice(context.case_id, context.final_advice) + + @when("I go to the licences page") def licences_page(driver, exporter_url): driver.get(exporter_url.rstrip("/") + "/licences/") @@ -55,17 +84,3 @@ def standard_licence_details(driver, context, assessed_control_list_entries): assert formatted_licenced_quantity in good_row assert formatted_licenced_value in good_row assert "0" in page.get_usage() - - -@given(parsers.parse('I assess the goods with "{cle_entries}"'), target_fixture="assessed_control_list_entries") -def assess_goods(api_test_client, cle_entries): - cle_entries = [cle.strip() for cle in cle_entries.split(",")] - api_test_client.goods.update_good_clc( - good_id=api_test_client.context["good_id"], - good_on_application_id=api_test_client.context["good_on_application_id"], - case_id=api_test_client.context["case_id"], - control_list_entries=cle_entries, - is_good_controlled=True, - report_summary="ARS", - ) - return cle_entries