diff --git a/Dockerfile b/Dockerfile index bb1d9fa8..5f3270d4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,12 +11,8 @@ RUN pip3 install --upgrade pip RUN pip3 install -U pipenv -COPY Pipfile Pipfile.lock /app/ - COPY . /app/ -COPY entrypoint.sh /app/ - RUN pipenv install EXPOSE 8000 diff --git a/Pipfile b/Pipfile index f3fd0e29..752c3c3a 100644 --- a/Pipfile +++ b/Pipfile @@ -4,7 +4,7 @@ verify_ssl = true name = "pypi" [packages] -django = ">=4.2" +django = ">=2.2" django-treebeard = ">=4.5.1" ofxtools = ">=0.9.5" markdown = ">=3.4.1" @@ -26,12 +26,6 @@ behave = "*" twine = "*" jupyterlab = "*" pandas = "*" -#pipenv-setup = "*" -#pylint = "*" -#furo = "*" -#python-dotenv = "*" -#tabulate = "*" -#myst_parser = "*" [requires] python_version = "3.12" diff --git a/Pipfile.lock b/Pipfile.lock index f7ac7f83..80723104 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "448a581717791a32df9cbc7a1ffcd57d48070cbe10b5cd7289bb78b9489d1f78" + "sha256": "144d422614b7c1e67533f6fa7a01767a4f90bab17ecde1600f255c901d34664e" }, "pipfile-spec": 6, "requires": { @@ -26,12 +26,12 @@ }, "django": { "hashes": [ - "sha256:bd4505cae0b9bd642313e8fb71810893df5dc2ffcacaa67a33af2d5cd61888f2", - "sha256:f216510ace3de5de01329463a315a629f33480e893a9024fc93d8c32c22913da" + "sha256:021ffb7fdab3d2d388bc8c7c2434eb9c1f6f4d09e6119010bbb1694dda286bc2", + "sha256:71603f27dac22a6533fb38d83072eea9ddb4017fead6f67f2562a40402d61c3f" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==5.0.7" + "version": "==5.1.1" }, "django-treebeard": { "hashes": [ @@ -44,21 +44,21 @@ }, "faker": { "hashes": [ - "sha256:0f60978314973de02c00474c2ae899785a42b2cf4f41b7987e93c132a2b8a4a9", - "sha256:886ee28219be96949cd21ecc96c4c742ee1680e77f687b095202c8def1a08f06" + "sha256:4294d169255a045990720d6f3fa4134b764a4cdf46ef0d3c7553d2506f1adaa1", + "sha256:e59c01d1e8b8e20a83255ab8232c143cb2af3b4f5ab6a3f5ce495f385ad8ab4c" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==26.0.0" + "version": "==28.4.1" }, "markdown": { "hashes": [ - "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", - "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2", + "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==3.6" + "version": "==3.7" }, "ofxtools": { "hashes": [ @@ -173,21 +173,21 @@ }, "sqlparse": { "hashes": [ - "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93", - "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663" + "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", + "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "markers": "python_version >= '3.8'", - "version": "==0.5.0" + "version": "==0.5.1" } }, "develop": { "alabaster": { "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" + "sha256:c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e", + "sha256:fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b" ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" + "markers": "python_version >= '3.10'", + "version": "==1.0.0" }, "anyio": { "hashes": [ @@ -197,6 +197,14 @@ "markers": "python_version >= '3.8'", "version": "==4.4.0" }, + "appnope": { + "hashes": [ + "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", + "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c" + ], + "markers": "platform_system == 'Darwin'", + "version": "==0.1.4" + }, "argon2-cffi": { "hashes": [ "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08", @@ -257,19 +265,27 @@ }, "attrs": { "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" + "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", + "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2" ], "markers": "python_version >= '3.7'", - "version": "==23.2.0" + "version": "==24.2.0" }, "babel": { "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" + "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b", + "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316" ], "markers": "python_version >= '3.8'", - "version": "==2.15.0" + "version": "==2.16.0" + }, + "backports.tarfile": { + "hashes": [ + "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", + "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991" + ], + "markers": "python_version < '3.12'", + "version": "==1.2.0" }, "beautifulsoup4": { "hashes": [ @@ -298,69 +314,84 @@ }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "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" - ], - "markers": "platform_python_implementation != 'PyPy'", - "version": "==1.16.0" + "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": "python_version >= '3.8'", + "version": "==1.17.1" }, "charset-normalizer": { "hashes": [ @@ -466,71 +497,33 @@ "markers": "python_version >= '3.8'", "version": "==0.2.2" }, - "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" - ], - "markers": "python_version >= '3.7'", - "version": "==42.0.8" - }, "debugpy": { "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" + "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c", + "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226", + "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c", + "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3", + "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a", + "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a", + "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408", + "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44", + "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156", + "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a", + "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c", + "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7", + "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a", + "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf", + "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34", + "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0", + "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e", + "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb", + "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7", + "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b", + "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed", + "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406" + ], + "markers": "python_version >= '3.8'", + "version": "==1.8.5" }, "decorator": { "hashes": [ @@ -558,11 +551,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" }, "fastjsonschema": { "hashes": [ @@ -596,19 +589,19 @@ }, "httpx": { "hashes": [ - "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5", - "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5" + "sha256:7bb2708e112d8fdd7829cd4243970f0c223274051cb35ee80c03301ee29a3df0", + "sha256:f7c2be1d2f3c3c3160d441802406b206c2b76f5947b11115e6df10c6c65e66c2" ], "markers": "python_version >= '3.8'", - "version": "==0.27.0" + "version": "==0.27.2" }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "imagesize": { "hashes": [ @@ -620,11 +613,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" + "sha256:66f342cc6ac9818fc6ff340576acd24d65ba0b3efabb2b4ac08b598965a4a2f1", + "sha256:9a547d3bc3608b025f93d403fdd1aae741c24fbb8314df4b155675742ce303c5" ], "markers": "python_version >= '3.8'", - "version": "==8.0.0" + "version": "==8.4.0" }, "ipykernel": { "hashes": [ @@ -636,11 +629,11 @@ }, "ipython": { "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" + "sha256:0b99a2dc9f15fd68692e898e5568725c6d49c527d36a9fb5960ffbdeaa82ff7e", + "sha256:f68b3cb8bde357a5d7adc9598d57e22a45dfbea19eb6b98286fa3b288c9cd55c" ], "markers": "python_version >= '3.10'", - "version": "==8.26.0" + "version": "==8.27.0" }, "isoduration": { "hashes": [ @@ -659,19 +652,19 @@ }, "jaraco.context": { "hashes": [ - "sha256:3e16388f7da43d384a1a7cd3452e72e14732ac9fe459678773a3608a812bf266", - "sha256:c2f67165ce1f9be20f32f650f25d8edfc1646a8aeee48ae06fb35f90763576d2" + "sha256:9bae4ea555cf0b14938dc0aee7c9f32ed303aa20a3b73e7dc80111628792d1b3", + "sha256:f797fc481b490edb305122c9181830a3a5b76d84ef6d1aef2fb9b47ab956f9e4" ], "markers": "python_version >= '3.8'", - "version": "==5.3.0" + "version": "==6.0.1" }, "jaraco.functools": { "hashes": [ - "sha256:3b24ccb921d6b593bdceb56ce14799204f473976e2a9d4b15b04d0f2c2326664", - "sha256:d33fa765374c0611b52f8b3a795f8900869aa88c84769d4d1746cd68fb28c3e8" + "sha256:3460c74cd0d32bf82b9576bbb3527c4364d5b27a21f5158a62aed6c4b42e23f5", + "sha256:c9d16a3ed4ccb5a889ad8e0b7a343401ee5b2a71cee6ed192d3f68bc351e94e3" ], "markers": "python_version >= '3.8'", - "version": "==4.0.1" + "version": "==4.0.2" }, "jedi": { "hashes": [ @@ -681,14 +674,6 @@ "markers": "python_version >= '3.6'", "version": "==0.19.1" }, - "jeepney": { - "hashes": [ - "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806", - "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755" - ], - "markers": "sys_platform == 'linux'", - "version": "==0.8.0" - }, "jinja2": { "hashes": [ "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", @@ -765,11 +750,11 @@ }, "jupyter-server": { "hashes": [ - "sha256:12558d158ec7a0653bf96cc272bc7ad79e0127d503b982ed144399346694f726", - "sha256:16f7177c3a4ea8fe37784e2d31271981a812f0b2874af17339031dc3510cc2a5" + "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd", + "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b" ], "markers": "python_version >= '3.8'", - "version": "==2.14.1" + "version": "==2.14.2" }, "jupyter-server-terminals": { "hashes": [ @@ -781,12 +766,12 @@ }, "jupyterlab": { "hashes": [ - "sha256:0b59d11808e84bb84105c73364edfa867dd475492429ab34ea388a52f2e2e596", - "sha256:df6e46969ea51d66815167f23d92f105423b7f1f06fa604d4f44aeb018c82c7b" + "sha256:73b6e0775d41a9fee7ee756c80f58a6bed4040869ccc21411dc559818874d321", + "sha256:ae7f3a1b8cb88b4f55009ce79fa7c06f99d70cd63601ee4aa91815d054f46f75" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==4.2.3" + "version": "==4.2.5" }, "jupyterlab-pygments": { "hashes": [ @@ -798,19 +783,19 @@ }, "jupyterlab-server": { "hashes": [ - "sha256:15cbb349dc45e954e09bacf81b9f9bcb10815ff660fb2034ecd7417db3a7ea27", - "sha256:54aa2d64fd86383b5438d9f0c032f043c4d8c0264b8af9f60bd061157466ea43" + "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4", + "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4" ], "markers": "python_version >= '3.8'", - "version": "==2.27.2" + "version": "==2.27.3" }, "keyring": { "hashes": [ - "sha256:2458681cdefc0dbc0b7eb6cf75d0b98e59f9ad9b2d4edd319d18f68bdca95e50", - "sha256:daaffd42dbda25ddafb1ad5fec4024e5bbcfe424597ca1ca452b299861e49f1b" + "sha256:8d85a1ea5d6db8515b59e1c5d1d1678b03cf7fc8b8dcfb1651e8c4a524eb42ef", + "sha256:8d963da00ccdf06e356acd9bf3b743208878751032d8599c6cc89eb51310ffae" ], "markers": "python_version >= '3.8'", - "version": "==25.2.1" + "version": "==25.3.0" }, "markdown-it-py": { "hashes": [ @@ -912,11 +897,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" }, "nbclient": { "hashes": [ @@ -981,54 +966,62 @@ }, "numpy": { "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" - ], - "markers": "python_version >= '3.12'", - "version": "==2.0.0" + "sha256:046356b19d7ad1890c751b99acad5e82dc4a02232013bd9a9a712fddf8eb60f5", + "sha256:0b8cc2715a84b7c3b161f9ebbd942740aaed913584cae9cdc7f8ad5ad41943d0", + "sha256:0d07841fd284718feffe7dd17a63a2e6c78679b2d386d3e82f44f0108c905550", + "sha256:13cc11c00000848702322af4de0147ced365c81d66053a67c2e962a485b3717c", + "sha256:13ce49a34c44b6de5241f0b38b07e44c1b2dcacd9e36c30f9c2fcb1bb5135db7", + "sha256:24c2ad697bd8593887b019817ddd9974a7f429c14a5469d7fad413f28340a6d2", + "sha256:251105b7c42abe40e3a689881e1793370cc9724ad50d64b30b358bbb3a97553b", + "sha256:2ca4b53e1e0b279142113b8c5eb7d7a877e967c306edc34f3b58e9be12fda8df", + "sha256:3269c9eb8745e8d975980b3a7411a98976824e1fdef11f0aacf76147f662b15f", + "sha256:397bc5ce62d3fb73f304bec332171535c187e0643e176a6e9421a6e3eacef06d", + "sha256:3fc5eabfc720db95d68e6646e88f8b399bfedd235994016351b1d9e062c4b270", + "sha256:50a95ca3560a6058d6ea91d4629a83a897ee27c00630aed9d933dff191f170cd", + "sha256:52ac2e48f5ad847cd43c4755520a2317f3380213493b9d8a4c5e37f3b87df504", + "sha256:53e27293b3a2b661c03f79aa51c3987492bd4641ef933e366e0f9f6c9bf257ec", + "sha256:57eb525e7c2a8fdee02d731f647146ff54ea8c973364f3b850069ffb42799647", + "sha256:5889dd24f03ca5a5b1e8a90a33b5a0846d8977565e4ae003a63d22ecddf6782f", + "sha256:59ca673ad11d4b84ceb385290ed0ebe60266e356641428c845b39cd9df6713ab", + "sha256:6435c48250c12f001920f0751fe50c0348f5f240852cfddc5e2f97e007544cbe", + "sha256:6e5a9cb2be39350ae6c8f79410744e80154df658d5bea06e06e0ac5bb75480d5", + "sha256:7be6a07520b88214ea85d8ac8b7d6d8a1839b0b5cb87412ac9f49fa934eb15d5", + "sha256:7c803b7934a7f59563db459292e6aa078bb38b7ab1446ca38dd138646a38203e", + "sha256:7dd86dfaf7c900c0bbdcb8b16e2f6ddf1eb1fe39c6c8cca6e94844ed3152a8fd", + "sha256:8661c94e3aad18e1ea17a11f60f843a4933ccaf1a25a7c6a9182af70610b2313", + "sha256:8ae0fd135e0b157365ac7cc31fff27f07a5572bdfc38f9c2d43b2aff416cc8b0", + "sha256:910b47a6d0635ec1bd53b88f86120a52bf56dcc27b51f18c7b4a2e2224c29f0f", + "sha256:913cc1d311060b1d409e609947fa1b9753701dac96e6581b58afc36b7ee35af6", + "sha256:920b0911bb2e4414c50e55bd658baeb78281a47feeb064ab40c2b66ecba85553", + "sha256:950802d17a33c07cba7fd7c3dcfa7d64705509206be1606f196d179e539111ed", + "sha256:981707f6b31b59c0c24bcda52e5605f9701cb46da4b86c2e8023656ad3e833cb", + "sha256:98ce7fb5b8063cfdd86596b9c762bf2b5e35a2cdd7e967494ab78a1fa7f8b86e", + "sha256:99f4a9ee60eed1385a86e82288971a51e71df052ed0b2900ed30bc840c0f2e39", + "sha256:9a8e06c7a980869ea67bbf551283bbed2856915f0a792dc32dd0f9dd2fb56728", + "sha256:ae8ce252404cdd4de56dcfce8b11eac3c594a9c16c231d081fb705cf23bd4d9e", + "sha256:afd9c680df4de71cd58582b51e88a61feed4abcc7530bcd3d48483f20fc76f2a", + "sha256:b49742cdb85f1f81e4dc1b39dcf328244f4d8d1ded95dea725b316bd2cf18c95", + "sha256:b5613cfeb1adfe791e8e681128f5f49f22f3fcaa942255a6124d58ca59d9528f", + "sha256:bab7c09454460a487e631ffc0c42057e3d8f2a9ddccd1e60c7bb8ed774992480", + "sha256:c8a0e34993b510fc19b9a2ce7f31cb8e94ecf6e924a40c0c9dd4f62d0aac47d9", + "sha256:caf5d284ddea7462c32b8d4a6b8af030b6c9fd5332afb70e7414d7fdded4bfd0", + "sha256:cea427d1350f3fd0d2818ce7350095c1a2ee33e30961d2f0fef48576ddbbe90f", + "sha256:d0cf7d55b1051387807405b3898efafa862997b4cba8aa5dbe657be794afeafd", + "sha256:d10c39947a2d351d6d466b4ae83dad4c37cd6c3cdd6d5d0fa797da56f710a6ae", + "sha256:d2b9cd92c8f8e7b313b80e93cedc12c0112088541dcedd9197b5dee3738c1201", + "sha256:d4c57b68c8ef5e1ebf47238e99bf27657511ec3f071c465f6b1bccbef12d4136", + "sha256:d51fc141ddbe3f919e91a096ec739f49d686df8af254b2053ba21a910ae518bf", + "sha256:e097507396c0be4e547ff15b13dc3866f45f3680f789c1a1301b07dadd3fbc78", + "sha256:e30356d530528a42eeba51420ae8bf6c6c09559051887196599d96ee5f536468", + "sha256:e8d5f8a8e3bc87334f025194c6193e408903d21ebaeb10952264943a985066ca", + "sha256:e8dfa9e94fc127c40979c3eacbae1e61fda4fe71d84869cc129e2721973231ef", + "sha256:f212d4f46b67ff604d11fff7cc62d36b3e8714edf68e44e9760e19be38c03eb0", + "sha256:f7506387e191fe8cdb267f912469a3cccc538ab108471291636a96a54e599556", + "sha256:fac6e277a41163d27dfab5f4ec1f7a83fac94e170665a4a50191b545721c6521", + "sha256:fcd8f556cdc8cfe35e70efb92463082b7f43dd7e547eb071ffc36abc0ca4699b" + ], + "markers": "python_version == '3.11'", + "version": "==2.1.1" }, "overrides": { "hashes": [ @@ -1099,11 +1092,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, 3.2, 3.3'", - "version": "==0.6.2" + "version": "==0.6.3" }, "parso": { "hashes": [ @@ -1131,11 +1124,11 @@ }, "platformdirs": { "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" + "sha256:9e5e27a08aa095dd127b9f2e764d74254f482fef22b0970773bfba79d091ab8c", + "sha256:eb1c8582560b34ed4ba105009a4badf7f6f85768b30126f351328507b2beb617" ], "markers": "python_version >= '3.8'", - "version": "==4.2.2" + "version": "==4.3.2" }, "prometheus-client": { "hashes": [ @@ -1186,10 +1179,10 @@ }, "pure-eval": { "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", + "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42" ], - "version": "==0.2.2" + "version": "==0.2.3" }, "pycparser": { "hashes": [ @@ -1232,154 +1225,177 @@ }, "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" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.1" + "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.8'", + "version": "==6.0.2" }, "pyzmq": { "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" + "sha256:007137c9ac9ad5ea21e6ad97d3489af654381324d5d3ba614c323f60dab8fae6", + "sha256:034da5fc55d9f8da09015d368f519478a52675e558c989bfcb5cf6d4e16a7d2a", + "sha256:05590cdbc6b902101d0e65d6a4780af14dc22914cc6ab995d99b85af45362cc9", + "sha256:070672c258581c8e4f640b5159297580a9974b026043bd4ab0470be9ed324f1f", + "sha256:0aca98bc423eb7d153214b2df397c6421ba6373d3397b26c057af3c904452e37", + "sha256:0bed0e799e6120b9c32756203fb9dfe8ca2fb8467fed830c34c877e25638c3fc", + "sha256:0d987a3ae5a71c6226b203cfd298720e0086c7fe7c74f35fa8edddfbd6597eed", + "sha256:0eaa83fc4c1e271c24eaf8fb083cbccef8fde77ec8cd45f3c35a9a123e6da097", + "sha256:160c7e0a5eb178011e72892f99f918c04a131f36056d10d9c1afb223fc952c2d", + "sha256:17bf5a931c7f6618023cdacc7081f3f266aecb68ca692adac015c383a134ca52", + "sha256:17c412bad2eb9468e876f556eb4ee910e62d721d2c7a53c7fa31e643d35352e6", + "sha256:18c8dc3b7468d8b4bdf60ce9d7141897da103c7a4690157b32b60acb45e333e6", + "sha256:1a534f43bc738181aa7cbbaf48e3eca62c76453a40a746ab95d4b27b1111a7d2", + "sha256:1c17211bc037c7d88e85ed8b7d8f7e52db6dc8eca5590d162717c654550f7282", + "sha256:1f3496d76b89d9429a656293744ceca4d2ac2a10ae59b84c1da9b5165f429ad3", + "sha256:1fcc03fa4997c447dce58264e93b5aa2d57714fbe0f06c07b7785ae131512732", + "sha256:226af7dcb51fdb0109f0016449b357e182ea0ceb6b47dfb5999d569e5db161d5", + "sha256:23f4aad749d13698f3f7b64aad34f5fc02d6f20f05999eebc96b89b01262fb18", + "sha256:25bf2374a2a8433633c65ccb9553350d5e17e60c8eb4de4d92cc6bd60f01d306", + "sha256:28ad5233e9c3b52d76196c696e362508959741e1a005fb8fa03b51aea156088f", + "sha256:28c812d9757fe8acecc910c9ac9dafd2ce968c00f9e619db09e9f8f54c3a68a3", + "sha256:29c6a4635eef69d68a00321e12a7d2559fe2dfccfa8efae3ffb8e91cd0b36a8b", + "sha256:29c7947c594e105cb9e6c466bace8532dc1ca02d498684128b339799f5248277", + "sha256:2a50625acdc7801bc6f74698c5c583a491c61d73c6b7ea4dee3901bb99adb27a", + "sha256:2ae90ff9dad33a1cfe947d2c40cb9cb5e600d759ac4f0fd22616ce6540f72797", + "sha256:2c4a71d5d6e7b28a47a394c0471b7e77a0661e2d651e7ae91e0cab0a587859ca", + "sha256:2ea4ad4e6a12e454de05f2949d4beddb52460f3de7c8b9d5c46fbb7d7222e02c", + "sha256:2eb7735ee73ca1b0d71e0e67c3739c689067f055c764f73aac4cc8ecf958ee3f", + "sha256:31507f7b47cc1ead1f6e86927f8ebb196a0bab043f6345ce070f412a59bf87b5", + "sha256:35cffef589bcdc587d06f9149f8d5e9e8859920a071df5a2671de2213bef592a", + "sha256:367b4f689786fca726ef7a6c5ba606958b145b9340a5e4808132cc65759abd44", + "sha256:39887ac397ff35b7b775db7201095fc6310a35fdbae85bac4523f7eb3b840e20", + "sha256:3a495b30fc91db2db25120df5847d9833af237546fd59170701acd816ccc01c4", + "sha256:3b55a4229ce5da9497dd0452b914556ae58e96a4381bb6f59f1305dfd7e53fc8", + "sha256:402b190912935d3db15b03e8f7485812db350d271b284ded2b80d2e5704be780", + "sha256:43a47408ac52647dfabbc66a25b05b6a61700b5165807e3fbd40063fcaf46386", + "sha256:4661c88db4a9e0f958c8abc2b97472e23061f0bc737f6f6179d7a27024e1faa5", + "sha256:46a446c212e58456b23af260f3d9fb785054f3e3653dbf7279d8f2b5546b21c2", + "sha256:470d4a4f6d48fb34e92d768b4e8a5cc3780db0d69107abf1cd7ff734b9766eb0", + "sha256:49d34ab71db5a9c292a7644ce74190b1dd5a3475612eefb1f8be1d6961441971", + "sha256:4d29ab8592b6ad12ebbf92ac2ed2bedcfd1cec192d8e559e2e099f648570e19b", + "sha256:4d80b1dd99c1942f74ed608ddb38b181b87476c6a966a88a950c7dee118fdf50", + "sha256:4da04c48873a6abdd71811c5e163bd656ee1b957971db7f35140a2d573f6949c", + "sha256:4f78c88905461a9203eac9faac157a2a0dbba84a0fd09fd29315db27be40af9f", + "sha256:4ff9dc6bc1664bb9eec25cd17506ef6672d506115095411e237d571e92a58231", + "sha256:5506f06d7dc6ecf1efacb4a013b1f05071bb24b76350832c96449f4a2d95091c", + "sha256:55cf66647e49d4621a7e20c8d13511ef1fe1efbbccf670811864452487007e08", + "sha256:5a509df7d0a83a4b178d0f937ef14286659225ef4e8812e05580776c70e155d5", + "sha256:5c2b3bfd4b9689919db068ac6c9911f3fcb231c39f7dd30e3138be94896d18e6", + "sha256:6835dd60355593de10350394242b5757fbbd88b25287314316f266e24c61d073", + "sha256:689c5d781014956a4a6de61d74ba97b23547e431e9e7d64f27d4922ba96e9d6e", + "sha256:6a96179a24b14fa6428cbfc08641c779a53f8fcec43644030328f44034c7f1f4", + "sha256:6ace4f71f1900a548f48407fc9be59c6ba9d9aaf658c2eea6cf2779e72f9f317", + "sha256:6b274e0762c33c7471f1a7471d1a2085b1a35eba5cdc48d2ae319f28b6fc4de3", + "sha256:706e794564bec25819d21a41c31d4df2d48e1cc4b061e8d345d7fb4dd3e94072", + "sha256:70fc7fcf0410d16ebdda9b26cbd8bf8d803d220a7f3522e060a69a9c87bf7bad", + "sha256:7133d0a1677aec369d67dd78520d3fa96dd7f3dcec99d66c1762870e5ea1a50a", + "sha256:7445be39143a8aa4faec43b076e06944b8f9d0701b669df4af200531b21e40bb", + "sha256:76589c020680778f06b7e0b193f4b6dd66d470234a16e1df90329f5e14a171cd", + "sha256:76589f2cd6b77b5bdea4fca5992dc1c23389d68b18ccc26a53680ba2dc80ff2f", + "sha256:77eb0968da535cba0470a5165468b2cac7772cfb569977cff92e240f57e31bef", + "sha256:794a4562dcb374f7dbbfb3f51d28fb40123b5a2abadee7b4091f93054909add5", + "sha256:7ad1bc8d1b7a18497dda9600b12dc193c577beb391beae5cd2349184db40f187", + "sha256:7f98f6dfa8b8ccaf39163ce872bddacca38f6a67289116c8937a02e30bbe9711", + "sha256:8423c1877d72c041f2c263b1ec6e34360448decfb323fa8b94e85883043ef988", + "sha256:8685fa9c25ff00f550c1fec650430c4b71e4e48e8d852f7ddcf2e48308038640", + "sha256:878206a45202247781472a2d99df12a176fef806ca175799e1c6ad263510d57c", + "sha256:89289a5ee32ef6c439086184529ae060c741334b8970a6855ec0b6ad3ff28764", + "sha256:8ab5cad923cc95c87bffee098a27856c859bd5d0af31bd346035aa816b081fe1", + "sha256:8b435f2753621cd36e7c1762156815e21c985c72b19135dac43a7f4f31d28dd1", + "sha256:8be4700cd8bb02cc454f630dcdf7cfa99de96788b80c51b60fe2fe1dac480289", + "sha256:8c997098cc65e3208eca09303630e84d42718620e83b733d0fd69543a9cab9cb", + "sha256:8ea039387c10202ce304af74def5021e9adc6297067f3441d348d2b633e8166a", + "sha256:8f7e66c7113c684c2b3f1c83cdd3376103ee0ce4c49ff80a648643e57fb22218", + "sha256:90412f2db8c02a3864cbfc67db0e3dcdbda336acf1c469526d3e869394fe001c", + "sha256:92a78853d7280bffb93df0a4a6a2498cba10ee793cc8076ef797ef2f74d107cf", + "sha256:989d842dc06dc59feea09e58c74ca3e1678c812a4a8a2a419046d711031f69c7", + "sha256:9cb3a6460cdea8fe8194a76de8895707e61ded10ad0be97188cc8463ffa7e3a8", + "sha256:9dd8cd1aeb00775f527ec60022004d030ddc51d783d056e3e23e74e623e33726", + "sha256:9ed69074a610fad1c2fda66180e7b2edd4d31c53f2d1872bc2d1211563904cd9", + "sha256:9edda2df81daa129b25a39b86cb57dfdfe16f7ec15b42b19bfac503360d27a93", + "sha256:a2224fa4a4c2ee872886ed00a571f5e967c85e078e8e8c2530a2fb01b3309b88", + "sha256:a4f96f0d88accc3dbe4a9025f785ba830f968e21e3e2c6321ccdfc9aef755115", + "sha256:aedd5dd8692635813368e558a05266b995d3d020b23e49581ddd5bbe197a8ab6", + "sha256:aee22939bb6075e7afededabad1a56a905da0b3c4e3e0c45e75810ebe3a52672", + "sha256:b1d464cb8d72bfc1a3adc53305a63a8e0cac6bc8c5a07e8ca190ab8d3faa43c2", + "sha256:b8f86dd868d41bea9a5f873ee13bf5551c94cf6bc51baebc6f85075971fe6eea", + "sha256:bc6bee759a6bddea5db78d7dcd609397449cb2d2d6587f48f3ca613b19410cfc", + "sha256:bea2acdd8ea4275e1278350ced63da0b166421928276c7c8e3f9729d7402a57b", + "sha256:bfa832bfa540e5b5c27dcf5de5d82ebc431b82c453a43d141afb1e5d2de025fa", + "sha256:c0e6091b157d48cbe37bd67233318dbb53e1e6327d6fc3bb284afd585d141003", + "sha256:c3789bd5768ab5618ebf09cef6ec2b35fed88709b104351748a63045f0ff9797", + "sha256:c530e1eecd036ecc83c3407f77bb86feb79916d4a33d11394b8234f3bd35b940", + "sha256:c811cfcd6a9bf680236c40c6f617187515269ab2912f3d7e8c0174898e2519db", + "sha256:c92d73464b886931308ccc45b2744e5968cbaade0b1d6aeb40d8ab537765f5bc", + "sha256:cccba051221b916a4f5e538997c45d7d136a5646442b1231b916d0164067ea27", + "sha256:cdeabcff45d1c219636ee2e54d852262e5c2e085d6cb476d938aee8d921356b3", + "sha256:ced65e5a985398827cc9276b93ef6dfabe0273c23de8c7931339d7e141c2818e", + "sha256:d049df610ac811dcffdc147153b414147428567fbbc8be43bb8885f04db39d98", + "sha256:dacd995031a01d16eec825bf30802fceb2c3791ef24bcce48fa98ce40918c27b", + "sha256:ddf33d97d2f52d89f6e6e7ae66ee35a4d9ca6f36eda89c24591b0c40205a3629", + "sha256:ded0fc7d90fe93ae0b18059930086c51e640cdd3baebdc783a695c77f123dcd9", + "sha256:e3e0210287329272539eea617830a6a28161fbbd8a3271bf4150ae3e58c5d0e6", + "sha256:e6fa2e3e683f34aea77de8112f6483803c96a44fd726d7358b9888ae5bb394ec", + "sha256:ea0eb6af8a17fa272f7b98d7bebfab7836a0d62738e16ba380f440fceca2d951", + "sha256:ea7f69de383cb47522c9c208aec6dd17697db7875a4674c4af3f8cfdac0bdeae", + "sha256:eac5174677da084abf378739dbf4ad245661635f1600edd1221f150b165343f4", + "sha256:fc4f7a173a5609631bb0c42c23d12c49df3966f89f496a51d3eb0ec81f4519d6", + "sha256:fdb5b3e311d4d4b0eb8b3e8b4d1b0a512713ad7e6a68791d0923d1aec433d919" ], "markers": "python_version >= '3.7'", - "version": "==26.0.3" + "version": "==26.2.0" }, "readme-renderer": { "hashes": [ @@ -1439,124 +1455,120 @@ }, "rich": { "hashes": [ - "sha256:4edbae314f59eb482f54e9e30bf00d33350aaa94f4bfcd4e9e3110e64d0d7222", - "sha256:9be308cb1fe2f1f57d67ce99e95af38a1e2bc71ad9813b0e247cf7ffbcc3a432" + "sha256:2e85306a063b9492dffc86278197a60cbece75bcb766022f3436f567cae11bdc", + "sha256:a5ac1f1cd448ade0d59cc3356f7db7a7ccda2c8cbae9c7a90c28ff463d3e91f4" ], "markers": "python_full_version >= '3.7.0'", - "version": "==13.7.1" + "version": "==13.8.0" }, "rpds-py": { "hashes": [ - "sha256:0121803b0f424ee2109d6e1f27db45b166ebaa4b32ff47d6aa225642636cd834", - "sha256:06925c50f86da0596b9c3c64c3837b2481337b83ef3519e5db2701df695453a4", - "sha256:071d4adc734de562bd11d43bd134330fb6249769b2f66b9310dab7460f4bf714", - "sha256:1540d807364c84516417115c38f0119dfec5ea5c0dd9a25332dea60b1d26fc4d", - "sha256:15e65395a59d2e0e96caf8ee5389ffb4604e980479c32742936ddd7ade914b22", - "sha256:19d02c45f2507b489fd4df7b827940f1420480b3e2e471e952af4d44a1ea8e34", - "sha256:1c26da90b8d06227d7769f34915913911222d24ce08c0ab2d60b354e2d9c7aff", - "sha256:1d16089dfa58719c98a1c06f2daceba6d8e3fb9b5d7931af4a990a3c486241cb", - "sha256:1dd46f309e953927dd018567d6a9e2fb84783963650171f6c5fe7e5c41fd5666", - "sha256:2575efaa5d949c9f4e2cdbe7d805d02122c16065bfb8d95c129372d65a291a0b", - "sha256:3208f9aea18991ac7f2b39721e947bbd752a1abbe79ad90d9b6a84a74d44409b", - "sha256:329c719d31362355a96b435f4653e3b4b061fcc9eba9f91dd40804ca637d914e", - "sha256:3384d278df99ec2c6acf701d067147320b864ef6727405d6470838476e44d9e8", - "sha256:34a01a4490e170376cd79258b7f755fa13b1a6c3667e872c8e35051ae857a92b", - "sha256:354f3a91718489912f2e0fc331c24eaaf6a4565c080e00fbedb6015857c00582", - "sha256:37f46bb11858717e0efa7893c0f7055c43b44c103e40e69442db5061cb26ed34", - "sha256:3b4cf5a9497874822341c2ebe0d5850fed392034caadc0bad134ab6822c0925b", - "sha256:3f148c3f47f7f29a79c38cc5d020edcb5ca780020fab94dbc21f9af95c463581", - "sha256:443cec402ddd650bb2b885113e1dcedb22b1175c6be223b14246a714b61cd521", - "sha256:462b0c18fbb48fdbf980914a02ee38c423a25fcc4cf40f66bacc95a2d2d73bc8", - "sha256:474bc83233abdcf2124ed3f66230a1c8435896046caa4b0b5ab6013c640803cc", - "sha256:4d438e4c020d8c39961deaf58f6913b1bf8832d9b6f62ec35bd93e97807e9cbc", - "sha256:4fdc9afadbeb393b4bbbad75481e0ea78e4469f2e1d713a90811700830b553a9", - "sha256:5039e3cef7b3e7a060de468a4a60a60a1f31786da94c6cb054e7a3c75906111c", - "sha256:5095a7c838a8647c32aa37c3a460d2c48debff7fc26e1136aee60100a8cd8f68", - "sha256:52e466bea6f8f3a44b1234570244b1cff45150f59a4acae3fcc5fd700c2993ca", - "sha256:535d4b52524a961d220875688159277f0e9eeeda0ac45e766092bfb54437543f", - "sha256:57dbc9167d48e355e2569346b5aa4077f29bf86389c924df25c0a8b9124461fb", - "sha256:5a4b07cdf3f84310c08c1de2c12ddadbb7a77568bcb16e95489f9c81074322ed", - "sha256:5c872814b77a4e84afa293a1bee08c14daed1068b2bb1cc312edbf020bbbca2b", - "sha256:5f83689a38e76969327e9b682be5521d87a0c9e5a2e187d2bc6be4765f0d4600", - "sha256:688aa6b8aa724db1596514751ffb767766e02e5c4a87486ab36b8e1ebc1aedac", - "sha256:6b130bd4163c93798a6b9bb96be64a7c43e1cec81126ffa7ffaa106e1fc5cef5", - "sha256:6b31f059878eb1f5da8b2fd82480cc18bed8dcd7fb8fe68370e2e6285fa86da6", - "sha256:6d45080095e585f8c5097897313def60caa2046da202cdb17a01f147fb263b81", - "sha256:6f2f78ef14077e08856e788fa482107aa602636c16c25bdf59c22ea525a785e9", - "sha256:6fe87efd7f47266dfc42fe76dae89060038f1d9cb911f89ae7e5084148d1cc08", - "sha256:75969cf900d7be665ccb1622a9aba225cf386bbc9c3bcfeeab9f62b5048f4a07", - "sha256:75a6076289b2df6c8ecb9d13ff79ae0cad1d5fb40af377a5021016d58cd691ec", - "sha256:78d57546bad81e0da13263e4c9ce30e96dcbe720dbff5ada08d2600a3502e526", - "sha256:79e205c70afddd41f6ee79a8656aec738492a550247a7af697d5bd1aee14f766", - "sha256:7c98298a15d6b90c8f6e3caa6457f4f022423caa5fa1a1ca7a5e9e512bdb77a4", - "sha256:7ec72df7354e6b7f6eb2a17fa6901350018c3a9ad78e48d7b2b54d0412539a67", - "sha256:81ea573aa46d3b6b3d890cd3c0ad82105985e6058a4baed03cf92518081eec8c", - "sha256:8344127403dea42f5970adccf6c5957a71a47f522171fafaf4c6ddb41b61703a", - "sha256:8445f23f13339da640d1be8e44e5baf4af97e396882ebbf1692aecd67f67c479", - "sha256:850720e1b383df199b8433a20e02b25b72f0fded28bc03c5bd79e2ce7ef050be", - "sha256:88cb4bac7185a9f0168d38c01d7a00addece9822a52870eee26b8d5b61409213", - "sha256:8a790d235b9d39c70a466200d506bb33a98e2ee374a9b4eec7a8ac64c2c261fa", - "sha256:8b1a94b8afc154fbe36978a511a1f155f9bd97664e4f1f7a374d72e180ceb0ae", - "sha256:8d6ad132b1bc13d05ffe5b85e7a01a3998bf3a6302ba594b28d61b8c2cf13aaf", - "sha256:8eb488ef928cdbc05a27245e52de73c0d7c72a34240ef4d9893fdf65a8c1a955", - "sha256:90bf55d9d139e5d127193170f38c584ed3c79e16638890d2e36f23aa1630b952", - "sha256:9133d75dc119a61d1a0ded38fb9ba40a00ef41697cc07adb6ae098c875195a3f", - "sha256:93a91c2640645303e874eada51f4f33351b84b351a689d470f8108d0e0694210", - "sha256:959179efb3e4a27610e8d54d667c02a9feaa86bbabaf63efa7faa4dfa780d4f1", - "sha256:9625367c8955e4319049113ea4f8fee0c6c1145192d57946c6ffcd8fe8bf48dd", - "sha256:9da6f400eeb8c36f72ef6646ea530d6d175a4f77ff2ed8dfd6352842274c1d8b", - "sha256:9e65489222b410f79711dc3d2d5003d2757e30874096b2008d50329ea4d0f88c", - "sha256:a3e2fd14c5d49ee1da322672375963f19f32b3d5953f0615b175ff7b9d38daed", - "sha256:a5a7c1062ef8aea3eda149f08120f10795835fc1c8bc6ad948fb9652a113ca55", - "sha256:a5da93debdfe27b2bfc69eefb592e1831d957b9535e0943a0ee8b97996de21b5", - "sha256:a6e605bb9edcf010f54f8b6a590dd23a4b40a8cb141255eec2a03db249bc915b", - "sha256:a707b158b4410aefb6b054715545bbb21aaa5d5d0080217290131c49c2124a6e", - "sha256:a8b6683a37338818646af718c9ca2a07f89787551057fae57c4ec0446dc6224b", - "sha256:aa5476c3e3a402c37779e95f7b4048db2cb5b0ed0b9d006983965e93f40fe05a", - "sha256:ab1932ca6cb8c7499a4d87cb21ccc0d3326f172cfb6a64021a889b591bb3045c", - "sha256:ae8b6068ee374fdfab63689be0963333aa83b0815ead5d8648389a8ded593378", - "sha256:b0906357f90784a66e89ae3eadc2654f36c580a7d65cf63e6a616e4aec3a81be", - "sha256:b0da31853ab6e58a11db3205729133ce0df26e6804e93079dee095be3d681dc1", - "sha256:b1c30841f5040de47a0046c243fc1b44ddc87d1b12435a43b8edff7e7cb1e0d0", - "sha256:b228e693a2559888790936e20f5f88b6e9f8162c681830eda303bad7517b4d5a", - "sha256:b7cc6cb44f8636fbf4a934ca72f3e786ba3c9f9ba4f4d74611e7da80684e48d2", - "sha256:ba0ed0dc6763d8bd6e5de5cf0d746d28e706a10b615ea382ac0ab17bb7388633", - "sha256:bc9128e74fe94650367fe23f37074f121b9f796cabbd2f928f13e9661837296d", - "sha256:bcf426a8c38eb57f7bf28932e68425ba86def6e756a5b8cb4731d8e62e4e0223", - "sha256:bec35eb20792ea64c3c57891bc3ca0bedb2884fbac2c8249d9b731447ecde4fa", - "sha256:c3444fe52b82f122d8a99bf66777aed6b858d392b12f4c317da19f8234db4533", - "sha256:c5c9581019c96f865483d031691a5ff1cc455feb4d84fc6920a5ffc48a794d8a", - "sha256:c6feacd1d178c30e5bc37184526e56740342fd2aa6371a28367bad7908d454fc", - "sha256:c8f77e661ffd96ff104bebf7d0f3255b02aa5d5b28326f5408d6284c4a8b3248", - "sha256:cb0f6eb3a320f24b94d177e62f4074ff438f2ad9d27e75a46221904ef21a7b05", - "sha256:ce84a7efa5af9f54c0aa7692c45861c1667080814286cacb9958c07fc50294fb", - "sha256:cf902878b4af334a09de7a45badbff0389e7cf8dc2e4dcf5f07125d0b7c2656d", - "sha256:dab8d921b55a28287733263c0e4c7db11b3ee22aee158a4de09f13c93283c62d", - "sha256:dc9ac4659456bde7c567107556ab065801622396b435a3ff213daef27b495388", - "sha256:dd36b712d35e757e28bf2f40a71e8f8a2d43c8b026d881aa0c617b450d6865c9", - "sha256:e19509145275d46bc4d1e16af0b57a12d227c8253655a46bbd5ec317e941279d", - "sha256:e21cc693045fda7f745c790cb687958161ce172ffe3c5719ca1764e752237d16", - "sha256:e54548e0be3ac117595408fd4ca0ac9278fde89829b0b518be92863b17ff67a2", - "sha256:e5b9fc03bf76a94065299d4a2ecd8dfbae4ae8e2e8098bbfa6ab6413ca267709", - "sha256:e8481b946792415adc07410420d6fc65a352b45d347b78fec45d8f8f0d7496f0", - "sha256:ebcbf356bf5c51afc3290e491d3722b26aaf5b6af3c1c7f6a1b757828a46e336", - "sha256:ef9101f3f7b59043a34f1dccbb385ca760467590951952d6701df0da9893ca0c", - "sha256:f2afd2164a1e85226fcb6a1da77a5c8896c18bfe08e82e8ceced5181c42d2179", - "sha256:f629ecc2db6a4736b5ba95a8347b0089240d69ad14ac364f557d52ad68cf94b0", - "sha256:f68eea5df6347d3f1378ce992d86b2af16ad7ff4dcb4a19ccdc23dea901b87fb", - "sha256:f757f359f30ec7dcebca662a6bd46d1098f8b9fb1fcd661a9e13f2e8ce343ba1", - "sha256:fb37bd599f031f1a6fb9e58ec62864ccf3ad549cf14bac527dbfa97123edcca4" - ], - "markers": "python_version >= '3.8'", - "version": "==0.19.0" - }, - "secretstorage": { - "hashes": [ - "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77", - "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99" - ], - "markers": "sys_platform == 'linux'", - "version": "==3.3.3" + "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c", + "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585", + "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5", + "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6", + "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef", + "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2", + "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29", + "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318", + "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b", + "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399", + "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739", + "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee", + "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174", + "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a", + "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344", + "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2", + "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03", + "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5", + "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22", + "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e", + "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96", + "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91", + "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752", + "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075", + "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253", + "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee", + "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad", + "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5", + "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce", + "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7", + "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b", + "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8", + "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57", + "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3", + "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec", + "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209", + "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921", + "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045", + "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074", + "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580", + "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7", + "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5", + "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3", + "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0", + "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24", + "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139", + "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db", + "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc", + "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789", + "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f", + "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2", + "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c", + "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232", + "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6", + "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c", + "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29", + "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489", + "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94", + "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751", + "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2", + "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda", + "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9", + "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51", + "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c", + "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8", + "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989", + "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511", + "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1", + "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2", + "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150", + "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c", + "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965", + "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f", + "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58", + "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b", + "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f", + "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d", + "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821", + "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de", + "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121", + "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855", + "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272", + "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60", + "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02", + "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1", + "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140", + "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879", + "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940", + "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364", + "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4", + "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e", + "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420", + "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5", + "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24", + "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c", + "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf", + "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f", + "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e", + "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab", + "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08", + "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92", + "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a", + "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8" + ], + "markers": "python_version >= '3.8'", + "version": "==0.20.0" }, "send2trash": { "hashes": [ @@ -1568,11 +1580,11 @@ }, "setuptools": { "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" + "sha256:5f4c08aa4d3ebcb57a50c33b1b07e94315d7fc7230f7115e47fc99776c8ce308", + "sha256:95b40ed940a1c67eb70fc099094bd6e99c6ee7c23aa2306f4d2697ba7916f9c6" ], "markers": "python_version >= '3.8'", - "version": "==70.3.0" + "version": "==74.1.2" }, "six": { "hashes": [ @@ -1599,44 +1611,44 @@ }, "soupsieve": { "hashes": [ - "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690", - "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7" + "sha256:e2e68417777af359ec65daac1057404a3c8a5455bb8abc36f1a9866ab1a51abb", + "sha256:e72c4ff06e4fb6e4b5a9f0f55fe6e81514581fca1515028625d0f299c602ccc9" ], "markers": "python_version >= '3.8'", - "version": "==2.5" + "version": "==2.6" }, "sphinx": { "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" + "sha256:0cce1ddcc4fd3532cf1dd283bc7d886758362c5c1de6598696579ce96d8ffa5b", + "sha256:56173572ae6c1b9a38911786e206a110c9749116745873feae4f9ce88e59391d" ], "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==7.3.7" + "markers": "python_version >= '3.10'", + "version": "==8.0.2" }, "sphinxcontrib-applehelp": { "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" + "sha256:2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1", + "sha256:4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5" ], "markers": "python_version >= '3.9'", - "version": "==1.0.8" + "version": "==2.0.0" }, "sphinxcontrib-devhelp": { "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" + "sha256:411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad", + "sha256:aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2" ], "markers": "python_version >= '3.9'", - "version": "==1.0.6" + "version": "==2.0.0" }, "sphinxcontrib-htmlhelp": { "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" + "sha256:166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8", + "sha256:c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9" ], "markers": "python_version >= '3.9'", - "version": "==2.0.5" + "version": "==2.1.0" }, "sphinxcontrib-jsmath": { "hashes": [ @@ -1648,19 +1660,19 @@ }, "sphinxcontrib-qthelp": { "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" + "sha256:4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab", + "sha256:b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb" ], "markers": "python_version >= '3.9'", - "version": "==1.0.7" + "version": "==2.0.0" }, "sphinxcontrib-serializinghtml": { "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" + "sha256:6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331", + "sha256:e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d" ], "markers": "python_version >= '3.9'", - "version": "==1.1.10" + "version": "==2.0.0" }, "stack-data": { "hashes": [ @@ -1721,11 +1733,19 @@ }, "types-python-dateutil": { "hashes": [ - "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202", - "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b" + "sha256:27c8cc2d058ccb14946eebcaaa503088f4f6dbc4fb6093d3d456a49aef2753f6", + "sha256:9706c3b68284c25adffc47319ecc7947e5bb86b3773f843c73906fd598bc176e" ], "markers": "python_version >= '3.8'", - "version": "==2.9.0.20240316" + "version": "==2.9.0.20240906" + }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "markers": "python_version < '3.12'", + "version": "==4.12.2" }, "tzdata": { "hashes": [ @@ -1759,10 +1779,10 @@ }, "webcolors": { "hashes": [ - "sha256:1d160d1de46b3e81e58d0a280d0c78b467dc80f47294b91b1ad8029d2cedb55b", - "sha256:8cf5bc7e28defd1d48b9e83d5fc30741328305a8195c29a8e668fa45586568a1" + "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d", + "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a" ], - "version": "==24.6.0" + "version": "==24.8.0" }, "webencodings": { "hashes": [ @@ -1781,11 +1801,11 @@ }, "zipp": { "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" + "sha256:9960cd8967c8f85a56f920d5d507274e74f9ff813a0ab8889a5b5be2daf44064", + "sha256:c22b14cc4763c5a5b04134207736c107db42e9d3ef2d9779d465f5f1bcba572b" ], "markers": "python_version >= '3.8'", - "version": "==3.19.2" + "version": "==3.20.1" } }, "graphql": { @@ -1806,69 +1826,84 @@ }, "certifi": { "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" + "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", + "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9" ], "markers": "python_version >= '3.6'", - "version": "==2024.7.4" + "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": [ @@ -1968,68 +2003,63 @@ }, "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" ], "markers": "python_version >= '3.7'", - "version": "==42.0.8" + "version": "==43.0.1" }, "django": { "hashes": [ - "sha256:bd4505cae0b9bd642313e8fb71810893df5dc2ffcacaa67a33af2d5cd61888f2", - "sha256:f216510ace3de5de01329463a315a629f33480e893a9024fc93d8c32c22913da" + "sha256:021ffb7fdab3d2d388bc8c7c2434eb9c1f6f4d09e6119010bbb1694dda286bc2", + "sha256:71603f27dac22a6533fb38d83072eea9ddb4017fead6f67f2562a40402d61c3f" ], "index": "pypi", "markers": "python_version >= '3.10'", - "version": "==5.0.7" + "version": "==5.1.1" }, "django-filter": { "hashes": [ - "sha256:48e5fc1da3ccd6ca0d5f9bb550973518ce977a4edde9d2a8a154a7f4f0b9f96e", - "sha256:df2ee9857e18d38bed203c8745f62a803fa0f31688c9fe6f8e868120b1848e48" + "sha256:c4852822928ce17fb699bcfccd644b3574f1a2d80aeb2b4ff4f16b02dd49dc64", + "sha256:d8ccaf6732afd21ca0542f6733b11591030fa98669f8d15599b358e24a2cd9c3" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==24.3" }, "django-oauth-toolkit": { "hashes": [ - "sha256:4931d6bf64b6aee32a42f989f218769d1876f3daa53c6bf883d8ab793fb302ee", - "sha256:8975eaf697413a8d54208ee068bc5ad6d1ed76f1df84e4882fbb25e7e6966e1b" + "sha256:3ef00b062a284f2031b0732b32dc899e3bbf0eac221bbb1cffcb50b8932e55ed", + "sha256:7200e4a9fb229b145a6d808cbf0423b6d69a87f68557437733eec3c0cf71db02" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==2.4.0" + "version": "==3.0.1" }, "graphene": { "hashes": [ @@ -2044,15 +2074,16 @@ "sha256:059ccf25d9a5159f28d7ebf1a648c993ab34deb064e80b70ca096aa22a609556", "sha256:0fd95c8c1cbe77ae2a5940045ce276803c3acbf200a156731e0c730f2776ae2c" ], + "index": "pypi", "version": "==3.2.2" }, "graphql-core": { "hashes": [ - "sha256:06d2aad0ac723e35b1cb47885d3e5c45e956a53bc1b209a9fc5369007fe46676", - "sha256:5766780452bd5ec8ba133f8bf287dc92713e3868ddd83aee4faab9fc3e303dc3" + "sha256:1604f2042edc5f3114f49cac9d77e25863be51b23a54a61a23245cf32f6476f0", + "sha256:acbe2e800980d0e39b4685dd058c2f4042660b89ebca38af83020fd872ff1264" ], "markers": "python_version >= '3.6' and python_version < '4'", - "version": "==3.2.3" + "version": "==3.2.4" }, "graphql-relay": { "hashes": [ @@ -2064,11 +2095,11 @@ }, "idna": { "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + "sha256:050b4e5baadcd44d760cedbd2b8e639f2ff89bbc7a5730fcc662954303377aac", + "sha256:d838c2c0ed6fced7693d5e8ab8e734d5f8fda53a039c0164afb0b82e771e3603" ], - "markers": "python_version >= '3.5'", - "version": "==3.7" + "markers": "python_version >= '3.6'", + "version": "==3.8" }, "jwcrypto": { "hashes": [ @@ -2100,13 +2131,6 @@ "markers": "python_version >= '3.8'", "version": "==2.22" }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, "requests": { "hashes": [ "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", @@ -2125,11 +2149,11 @@ }, "sqlparse": { "hashes": [ - "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93", - "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663" + "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4", + "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e" ], "markers": "python_version >= '3.8'", - "version": "==0.5.0" + "version": "==0.5.1" }, "text-unidecode": { "hashes": [ diff --git a/dev_env/settings.py b/dev_env/settings.py index d4bf8f5a..6ae47ee9 100644 --- a/dev_env/settings.py +++ b/dev_env/settings.py @@ -118,6 +118,10 @@ # ], } + OAUTH2_PROVIDER = { + 'OAUTH2_BACKEND_CLASS': 'oauth2_provider.oauth2_backends.JSONOAuthLibCore', + } + EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/django_ledger/__init__.py b/django_ledger/__init__.py index d249f592..a9e80dda 100644 --- a/django_ledger/__init__.py +++ b/django_ledger/__init__.py @@ -9,7 +9,7 @@ default_app_config = 'django_ledger.apps.DjangoLedgerConfig' """Django Ledger""" -__version__ = '0.6.3' +__version__ = '0.6.4' __license__ = 'GPLv3 License' __author__ = 'Miguel Sanda' diff --git a/django_ledger/admin/coa.py b/django_ledger/admin/coa.py index 03cb5255..50d2108b 100644 --- a/django_ledger/admin/coa.py +++ b/django_ledger/admin/coa.py @@ -108,7 +108,6 @@ class ChartOfAccountsModelAdmin(ModelAdmin): list_display_links = ['name'] fields = [ 'name', - 'locked', 'description', ] inlines = [ @@ -132,4 +131,4 @@ def get_queryset(self, request): def account_model_count(self, obj): return obj.accountmodel__count - account_model_count.short_description = 'Accounts' \ No newline at end of file + account_model_count.short_description = 'Accounts' diff --git a/django_ledger/contrib/django_ledger_graphene/README.md b/django_ledger/contrib/django_ledger_graphene/README.md index 9e8f3c1f..488ce9a0 100644 --- a/django_ledger/contrib/django_ledger_graphene/README.md +++ b/django_ledger/contrib/django_ledger_graphene/README.md @@ -2,146 +2,59 @@ # Django ledger Graphql Api ## Usage and installation +Install Required Packages - - - - +First, install the necessary packages: ``` pip install graphene-django ``` ``` -pip install django-graphql-auth +pip install django-oauth-toolkit +``` +Enable Graphql by navigating to ./django_ledger/settings.py +``` + DJANGO_LEDGER_GRAPHQL_SUPPORT_ENABLED = True ``` Makemigrations ``` python manage.py makemigrations python manage.py migrate -``` -Runserver +``` +Start the Django development server: ``` python manage.py runserver -``` -make sure you are loged in the main application go to the admin -site http://127.0.0.1:8000/admin/django_ledger/entitymodel/ choose your -entity and get your slug name from the entity choosen or - -Open new tab and navigate to -``` -http://127.0.0.1:8000/graphql/ -``` -paste this to the console and run the query - ``` -{ - allEntityList{ - slug - name - } -``` -this will return the current user logged in slug and name, use the slug for other queries (Slugname:String!) -## sample graphql Query -paste this at the graphql console and run the query +on the admin site ensure to add an Application with the fields ``` -{ - allEntityList{ - edges{ - node{ - slug - name - } - } -} -``` -this will return the current user logged in slug and name, use the slug for other queries (Slugname:String!) -## sample graphql Query -paste this at the graphql console and run the query -``` -allCustomers(slugName:"jusper-onderi-ondieki-db23x1y8"){ - edges { - node { - customerName - city - state - active - - } - } -} +client type: confidential +Authorization grant type: Resource owner password-based ``` -# Query results -``` -"allCustomers": { - "edges": [ - { - "node": { - "customerName": "booka", - "city": "kenya", - "state": "huj", - "active": true - } - }, - { - "node": { - "customerName": "stats", - "city": "kenya", - "state": "huj", - "active": true - } - }, - { - "node": { - "customerName": "Brooke Weaver", - "city": "South Michelleborough", - "state": "WA", - "active": true - } - }, - { - "node": { - "customerName": "Tamara Wilson", - "city": "Castilloport", - "state": "WV", - "active": true - } - }, +Use Postman or Thunder Client to make a POST request to obtain an access token. Send a request to the following URL: - } - ] - } - } -} +``` +http://127.0.0.1:8000/api/v1/o/token/ ``` -## Using graphql-auth -Register user +Include the following JSON body in your request: ``` -mutation { - register( - email: "new_user@email.com", - username: "new_user", - password1: "dave123456", - password2: "dave123456", - ) { - success, - errors, - token, - - } +{ + "username": "eric", + "password": "eric", + "client_id": "cXFFgnvWhWiZDofGkwiwUBdfuxfNnLsmBtAVsVXv", + "client_secret": "dave101", + "grant_type": "password" } ``` -Returns a token and a succes message +If the request is successful, you will receive a response like this: ``` { - "data": { - "register": { - "success": true, - "errors": null, - "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6Im5ld191c2VyIiwiZXhwIjoxNjQ5NzY2Nzc4LCJvcmlnSWF0IjoxNjQ5NzY2NDc4fQ.cHaPq8CjQy60ifUawR4Pnyyu_E_SCU2J6CapBK0P8P4" - } - } + "access_token": "YPMh29n648qpahgtOjrDHMDy5bt81e", + "expires_in": 36000, + "token_type": "Bearer", + "scope": "read write", + "refresh_token": "huBiNKw9IhtuYPKVNR9i4WnQesMqEl" } ``` -for more detail usage visit the documentation -https://django-graphql-auth.readthedocs.io/en/latest/quickstart/ \ No newline at end of file +Now you can use the access token to authenticate your GraphQL requests. + diff --git a/django_ledger/forms/account.py b/django_ledger/forms/account.py index 05333d71..35e5e71e 100644 --- a/django_ledger/forms/account.py +++ b/django_ledger/forms/account.py @@ -19,16 +19,20 @@ class AccountModelCreateForm(ModelForm): """ - Create Form: - This Form is used for creation of a new account that does not exist in the default Chart of Accounts. It has some external as well as some internal field. - The entity slug and the user model are the field which are internal and are predetermined in the lass itself + AccountModelCreateForm + ====================== - Remaining fields which needs to be defined by user are : + A form for creating and managing account models within the system. + + Attributes + ---------- + ENTITY : Model + The entity model being used in the form. + COA_MODEL : Model + The Chart of Account Model being used in the form. + USER_MODEL : Model + The user model being used in the form. - code: The code will be used to uniquely identify the particular account - name: The name of the account. The name of the account should be resemblance of the nature of the transactions that will be in the account - role: The role needs to be selected rom list of the options available. Choices are given under ACCOUNT ROLES. Refer the account model documentation for more info - balance_type: Need to be selected from drop down as "Debit" or Credit" """ def __init__(self, entity_model, coa_model, user_model, *args, **kwargs): @@ -84,9 +88,16 @@ class Meta: class AccountModelUpdateForm(MoveNodeForm): """ - Update Account Form: - This form is for updating the account. This works for both the parent or the child Account . - We can update the Parent , or The Code or even the Name of the Account. + AccountModelUpdateForm + + A form for updating account model, inheriting from MoveNodeForm. + + Attributes + ---------- + _position : ChoiceField + A choice field for selecting the position. + _ref_node_id : ChoiceField + An optional choice field for selecting the relative node. """ _position = ChoiceField(required=True, diff --git a/django_ledger/io/roles.py b/django_ledger/io/roles.py index 43a7ad82..86909d35 100644 --- a/django_ledger/io/roles.py +++ b/django_ledger/io/roles.py @@ -660,3 +660,9 @@ def validate_roles(roles: Union[str, List[str]], raise_exception: bool = True) - if raise_exception: raise InvalidRoleError('{rls}) is invalid. Choices are {ch}'.format(ch=', '.join(VALID_ROLES), rls=r)) return set(roles) + +VALID_PARENTS = { + ASSET_PPE_BUILDINGS_ACCUM_DEPRECIATION: [ASSET_PPE_BUILDINGS], + ASSET_PPE_EQUIPMENT_ACCUM_DEPRECIATION: [ASSET_PPE_EQUIPMENT], + ASSET_PPE_PLANT_ACCUM_DEPRECIATION: [ASSET_PPE_PLANT], +} \ No newline at end of file diff --git a/django_ledger/models/accounts.py b/django_ledger/models/accounts.py index fa0b865d..3d681fa3 100644 --- a/django_ledger/models/accounts.py +++ b/django_ledger/models/accounts.py @@ -6,24 +6,52 @@ * Miguel Sanda * Pranav P Tulshyan -The AccountModel groups and sorts transactions involving the company's assets, liabilities and equities. -Per accounting principles, an Account must be either a DEBIT-type balance account or a CREDIT-type balance account, -depending on its purpose. -The AccountModel plays a major role when creating Journal Entries in a double entry accounting systems where -a DEBIT to a DEBIT-type AccountModel will increase its balance, and a CREDIT to a DEBIT-type AccountModel will -reduce its balance. Conversely, a CREDIT to a CREDIT-type AccountModel will increase its balance, and a -DEBIT to a CREDIT-type AccountModel will reduce its balance. +AccountModel +------------ -It is entirely up to the user to adopt the chart of accounts that best suits the EntityModel. -The user may choose to use the default Chart of Accounts provided by Django Ledger when creating a new EntityModel. +The AccountModel is a fundamental component of the Django Ledger system, responsible for categorizing and organizing +financial transactions related to an entity's assets, liabilities, and equity. -In Django Ledger, all account models must be assigned a role from -:func:`ACCOUNT_ROLES `. Roles are a way to group accounts to a common namespace, -regardless of its user-defined fields. Roles are an integral part to Django Ledger since they are critical when -requesting and producing financial statements and financial ratio calculations. +Account Types +------------- -AccountModels may also contain parent/child relationships as implemented by the Django Treebeard functionality. +In accordance with accounting principles, each AccountModel must be classified as either: + +1. **DEBIT-type balance account** +2. **CREDIT-type balance account** + +The account type determines how transactions affect the account's balance. + +Double Entry Accounting +----------------------- + +The AccountModel is crucial in implementing double entry accounting systems: + +* For DEBIT-type accounts: + - A DEBIT increases the balance + - A CREDIT decreases the balance + +* For CREDIT-type accounts: + - A CREDIT increases the balance + - A DEBIT decreases the balance + +Chart of Accounts +----------------- + +Users have the flexibility to adopt a chart of accounts that best suits their EntityModel. Django Ledger provides a +default Chart of Accounts when creating a new EntityModel, which can be customized as needed. + +Account Roles +------------- + +All AccountModels must be assigned a role from the `ACCOUNT_ROLES` function in `django_ledger.io.roles`. +Roles serve several purposes: + +1. Group accounts into common namespaces +2. Provide consistency across user-defined fields +3. Enable accurate generation of financial statements +4. Facilitate financial ratio calculations """ from itertools import groupby from random import randint @@ -43,7 +71,7 @@ GROUP_ASSETS, GROUP_LIABILITIES, GROUP_CAPITAL, GROUP_INCOME, GROUP_EXPENSES, GROUP_COGS, ROOT_GROUP, BS_BUCKETS, ROOT_ASSETS, ROOT_LIABILITIES, - ROOT_CAPITAL, ROOT_INCOME, ROOT_EXPENSES, ROOT_COA) + ROOT_CAPITAL, ROOT_INCOME, ROOT_EXPENSES, ROOT_COA, VALID_PARENTS) from django_ledger.models.mixins import CreateUpdateMixIn from django_ledger.models.utils import lazy_loader from django_ledger.settings import DJANGO_LEDGER_ACCOUNT_CODE_GENERATE, DJANGO_LEDGER_ACCOUNT_CODE_USE_PREFIX @@ -61,68 +89,71 @@ class AccountModelValidationError(ValidationError): class AccountModelQuerySet(MP_NodeQuerySet): """ - A custom defined QuerySet, which inherits from the Materialized Path Tree implementation - of Django Treebeard for tree-like model implementation. + Custom QuerySet for AccountModel inheriting from MP_NodeQuerySet. """ def active(self): """ - Active accounts which can be used to create new transactions that show on drop-down menus and forms. + Filters the queryset to include only active items. Returns - _______ + ------- AccountModelQuerySet - A filtered AccountModelQuerySet of active accounts. + A filtered queryset containing only the items marked as active. """ return self.filter(active=True) def inactive(self): """ - Inactive accounts cannot be used to create new transactions and don't show on drop-down menus and forms. + Filters and returns queryset entries where the active field is set to False. Returns - _______ + ------- AccountModelQuerySet - A filtered AccountModelQuerySet of inactive accounts. + A queryset containing entries with active=False. """ return self.filter(active=False) def locked(self): """ - Filter locked elements. - - This method filters the elements based on the `locked` attribute and returns a filtered queryset. + Filters the queryset to include only locked AccountModels. - Returns: - A filtered queryset containing the locked elements. + Returns + ------- + AccountModelQuerySet + A queryset containing only the objects with locked set to True. """ return self.filter(locked=True) def unlocked(self): """ - Returns a filtered version of an object, excluding any locked items. + Returns a filtered list of items where the 'locked' attribute is set to False. - Returns: - A filtered version of the object, excluding any locked items. + Returns + ------- + AccountModelQuerySet + A queryset of items with 'locked' attribute set to False """ return self.filter(locked=False) def with_roles(self, roles: Union[List, str]): """ - This method is used to make query of accounts with a certain role. For instance, the fixed assets like - Buildings have all been assigned the role of "asset_ppe_build" role is basically an aggregation of the - accounts under a similar category. So, to query the list of all accounts under the role "asset_ppe_build", - we can use this function. + Filter the accounts based on the specified roles. This method helps to retrieve accounts associated + with a particular role or a list of roles. + + For example, to get all accounts categorized under the role "asset_ppe_build" (which might include + fixed assets like Buildings), you can utilize this method. Parameters - __________ - roles: list or str - Function accepts a single str instance of a role or a list of roles. For a list of roles , refer io.roles.py + ---------- + roles : Union[List[str], str] + The role or a list of roles to filter the accounts by. If a single string is provided, it is converted + into a list containing that role. Returns - _______ + ------- AccountModelQuerySet - Returns a QuerySet filtered by user-provided list of Roles. + A QuerySet of accounts filtered by the provided roles. """ if isinstance(roles, str): roles = [roles] @@ -131,27 +162,58 @@ def with_roles(self, roles: Union[List, str]): def expenses(self): """ - Return the expenses filtered by the roles specified in GROUP_EXPENSES. + Retrieve a queryset containing expenses filtered by specified roles. - Returns: - QuerySet: A queryset containing the expenses filtered by the GROUP_EXPENSES roles.. + This method filters the expenses based on roles defined in the + `GROUP_EXPENSES` constant. It ensures that only the relevant expenses + associated with the specified roles are included in the queryset. + + Returns + ------- + AccountModelQuerySet + A queryset consisting of expenses filtered according to the roles in `GROUP_EXPENSES`. """ return self.filter(role__in=GROUP_EXPENSES) def is_coa_root(self): """ - Check if the account model instance is the Chart of Account Root. + Retrieves the Chart of Accounts (CoA) root node queryset. + + A Chart of Accounts Root is a foundational element indicating the primary node in the + account hierarchy. This method filters the queryset to include only the Chart of Accounts (CoA) + root node. - Returns: - bool: True if the Account is the CoA Root, False otherwise. + Returns + ------- + AccountModelQuerySet """ return self.filter(role__in=ROOT_GROUP) def not_coa_root(self): + """ + Exclude AccountModels with ROOT_GROUP role from the QuerySet. + Returns + ------- + AccountModelQuerySet + A QuerySet excluding users with role in ROOT_GROUP. + """ return self.exclude(role__in=ROOT_GROUP) def for_entity(self, entity_slug, user_model): + """ + Parameters + ---------- + entity_slug : str + The slug identifier for the entity. + user_model : UserModel + The user model instance to use for filtering. + + Returns + ------- + AccountModelQuerySet + A Django QuerySet filtered by the specified entity and user permissions, ordered by 'code'. + """ if isinstance(self, lazy_loader.get_entity_model()): return self.filter( Q(coa_model__entity=entity_slug) & @@ -169,6 +231,16 @@ def for_entity(self, entity_slug, user_model): ).order_by('code') def gb_bs_role(self): + """ + Groups accounts by Balance Sheet Bucket and then further groups them by role. + + Returns + ------- + List[Tuple] + A list where each element is a tuple. The first element of the tuple is the BS bucket, + and the second element is a list of tuples where each sub-tuple contains a role display + and a list of accounts that fall into that role within the BS bucket. + """ accounts_gb = list((r, list(gb)) for r, gb in groupby(self, key=lambda acc: acc.get_bs_bucket())) return [ (bsr, [ @@ -177,9 +249,26 @@ def gb_bs_role(self): ] def is_role_default(self): + """ + Filter the queryset to include only entries where `role_default` + is set to True, excluding entries marked as 'coa_root'. + + Returns + ------- + AccountModelQuerySet + Filtered queryset with `role_default` set to True and excluding 'coa_root' entries. + """ return self.not_coa_root().filter(role_default=True) def can_transact(self): + """ + Filter the queryset to include only accounts that can accept new transactions. + + Returns + ------- + QuerySet + A QuerySet containing the filtered results. + """ return self.filter( Q(locked=False) & Q(active=True) ) @@ -193,14 +282,34 @@ class AccountModelManager(MP_NodeManager): def get_queryset(self) -> AccountModelQuerySet: """ - Sets the custom queryset as the default. + Retrieve and return athe default AccountModel QuerySet. + + The query set is ordered by the 'path' field and uses 'select_related' to reduce the number of database queries + by retrieving the related 'coa_model'. + + Returns + ------- + AccountModelQuerySet + An instance of AccountModelQuerySet ordered by 'path' and prefetching related 'coa_model'. """ return AccountModelQuerySet( self.model, using=self._db ).order_by('path').select_related('coa_model') - def for_user(self, user_model): + def for_user(self, user_model) -> AccountModelQuerySet: + """ + Parameters + ---------- + user_model : UserModel + The user model instance to use for filtering. + + Returns + ------- + AccountModelQuerySet + The filtered queryset based on the user's permissions. Superusers get the complete queryset whereas other + users get a filtered queryset based on their role as admin or manager in the entity. + """ qs = self.get_queryset() if user_model.is_superuser: return qs @@ -210,32 +319,33 @@ def for_user(self, user_model): ) # todo: search for uses and pass EntityModel whenever possible. - def for_entity(self, - user_model, - entity_slug, - coa_slug: Optional[str] = None, - select_coa_model: bool = True) -> AccountModelQuerySet: + def for_entity( + self, + user_model, + entity_slug, + coa_slug: Optional[str] = None, + select_coa_model: bool = True + ) -> AccountModelQuerySet: """ - Ensures that only accounts associated with the given EntityModel are returned. + Retrieves accounts associated with the specified EntityModel. Parameters ---------- - entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. - coa_slug: str - Explicitly specify which chart of accounts to use. If None, will pull default Chart of Accounts. - Discussed in detail in the CoA Model CoA slug, basically helps in identifying the complete Chart of - Accounts for a particular EntityModel. - user_model: + user_model: User The Django User Model making the request to check for permissions. - select_coa_model: bool - Pre fetches the CoA Model information in the QuerySet. Defaults to True. + entity_slug: Union[EntityModel, str] + The EntityModel instance or its slug to filter accounts by. If a slug is provided and `coa_slug` is None, + an additional + database query will be executed to determine the default Chart of Accounts. + coa_slug: Optional[str], default=None + The slug of the specific Chart of Accounts to use. If None, the default Chart of Accounts is selected. + select_coa_model: bool, default=True + If True, prefetches the CoA Model information in the QuerySet. Returns ------- AccountModelQuerySet - A QuerySet of all requested EntityModel Chart of Accounts. + A QuerySet containing accounts associated with the specified EntityModel and Chart of Accounts. """ qs = self.for_user(user_model) if select_coa_model: @@ -256,26 +366,28 @@ def for_entity(self, def for_entity_available(self, user_model, entity_slug, coa_slug: Optional[str] = None) -> AccountModelQuerySet: """ - Convenience method to pull only available and unlocked AccountModels for a specific EntityModel. + Retrieve available and unlocked AccountModels for a specific EntityModel. + + This method filters AccountModels associated with the specified EntityModel + that are active, not locked, and have an active Chart of Accounts. Parameters ---------- - entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. + user_model: User + The Django User Model instance making the request, used to validate permissions. - coa_slug: str - Explicitly specify which chart of accounts to use. If None, will pull default Chart of Accounts. - Discussed in detail in the CoA Model CoA slug, basically helps in identifying the complete Chart of - Accounts for a particular EntityModel. + entity_slug: EntityModel or str + The EntityModel instance or its slug to pull accounts from. If entity_slug is passed + and coa_slug is None, an additional database query will be performed to determine + the default Chart of Accounts. - user_model: - The Django User Model making the request to check for permissions. + coa_slug: str, optional + The specific Chart of Accounts to use. If None, the default Chart of Accounts will be pulled. Returns ------- AccountModelQuerySet - A QuerySet of all requested EntityModel Chart of Accounts. + A QuerySet containing available and unlocked AccountModels for the specified EntityModel and Chart of Accounts. """ qs = self.for_entity( user_model=user_model, @@ -289,24 +401,27 @@ def for_entity_available(self, user_model, entity_slug, coa_slug: Optional[str] def with_roles(self, roles: Union[list, str], entity_slug, user_model) -> AccountModelQuerySet: """ - This method is used to make query of accounts with a certain role. For instance, the fixed assets like - Buildings have all been assigned the role of "asset_ppe_build" role is basically an aggregation of the - accounts under a similar category. So, to query the list of all accounts under the role "asset_ppe_build", - we can use this function. + Retrieve accounts based on specific roles. + + This method filters accounts associated with a given role or a list of roles. For example, if you need to + find all accounts under the "asset_ppe_build" role, which includes all buildings fixed assets, this method + can be used. Parameters ---------- entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. - user_model - The Django User Model making the request to check for permissions. + The EntityModel instance or its slug to fetch accounts from. If only the slug is provided and coa_slug is + not specified, an additional database query will be performed to determine the default chart of accounts. + user_model: User + The Django User model instance making the request to ensure appropriate permissions are checked. roles: list or str - Function accepts a single str instance of a role or a list of roles. For a list of roles , refer io.roles.py + Accepts either a single role as a string or a list of roles. Refer to io.roles.py for a comprehensive + list of roles. + Returns ------- AccountModelQuerySet - Returns a QuerySet filtered by user-provided list of Roles. + A QuerySet of accounts filtered by the specified roles. """ roles = validate_roles(roles) if isinstance(roles, str): @@ -319,27 +434,26 @@ def with_roles_available(self, roles: Union[list, str], user_model, coa_slug: Optional[str]) -> AccountModelQuerySet: """ - Convenience method to pull only available and unlocked AccountModels for a specific EntityModel and for a - specific list of roles. + Retrieve available and unlocked AccountModels for a specified EntityModel and list of roles. Parameters ---------- - entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. - coa_slug: str - Explicitly specify which chart of accounts to use. If None, will pull default Chart of Accounts. - Discussed in detail in the CoA Model CoA slug, basically helps in identifying the complete Chart of - Accounts for a particular EntityModel. - user_model: - The Django User Model making the request to check for permissions. - roles: list or str - Function accepts a single str instance of a role or a list of roles. For a list of roles , refer io.roles.py + roles : Union[list, str] + A single role as a string or a list of roles. + entity_slug : Union[str, 'EntityModel'] + The EntityModel object or its slug. If a slug is provided and `coa_slug` is None, an additional + database query will be executed to fetch the default Chart of Accounts. + user_model : 'UserModel' + The Django UserModel instance making the request, used to check permissions. + coa_slug : Optional[str], default None + The specific Chart of Accounts slug. If None, the default Chart of Accounts will be used. + This parameter assists in identifying the complete Chart of Accounts for the EntityModel. Returns ------- AccountModelQuerySet - A QuerySet of all requested EntityModel Chart of Accounts. + A QuerySet containing available and unlocked AccountModel instances for the specified + EntityModel and roles. """ if isinstance(roles, str): @@ -350,53 +464,53 @@ def with_roles_available(self, roles: Union[list, str], def coa_roots(self, user_model, entity_slug, coa_slug) -> AccountModelQuerySet: """ - Fetches the Code of Account Root Accounts. + Retrieves the root accounts of a specified Code of Accounts (CoA). Parameters ---------- - entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. - coa_slug: str - Explicitly specify which chart of accounts to use. If None, will pull default Chart of Accounts. - Discussed in detail in the CoA Model CoA slug, basically helps in identifying the complete Chart of - Accounts for a particular EntityModel. - user_model: - The Django User Model making the request to check for permissions. + user_model: object + The Django User model instance requesting the data, used for permission checking. + entity_slug: Union[EntityModel, str] + The entity or its slug from which to fetch accounts. If a slug is provided and `coa_slug` is None, + an additional database query is performed to determine the default Code of Accounts. + coa_slug: Optional[str] + The specific chart of accounts to retrieve. If None, the default chart of accounts for the entity + will be used. This is crucial for identifying the complete set of accounts for a given entity. Returns ------- - + AccountModelQuerySet + A queryset of root accounts for the specified Code of Accounts. """ qs = self.for_entity(user_model=user_model, entity_slug=entity_slug, coa_slug=coa_slug) return qs.is_coa_root() def for_invoice(self, user_model, entity_slug: str, coa_slug: Optional[str] = None) -> AccountModelQuerySet: """ - Convenience method to pull only available and unlocked AccountModels for a specific EntityModel relevant only - for creating and management of Invoices. See :func:`GROUP_INVOICE `. + Retrieves available and unlocked AccountModels for a specific EntityModel, specifically for the creation + and management of Invoices. - Roles in GROUP_INVOICE: ASSET_CA_CASH, ASSET_CA_RECEIVABLES, LIABILITY_CL_DEFERRED_REVENUE. + This method ensures that only relevant accounts are pulled, as defined under the roles in `GROUP_INVOICE`. + These roles include: ASSET_CA_CASH, ASSET_CA_RECEIVABLES, and LIABILITY_CL_DEFERRED_REVENUE. Parameters - __________ - - entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. + ---------- + user_model: User + The Django User Model instance requesting access. It is used to check the necessary permissions. - coa_slug: str - Explicitly specify which chart of accounts to use. If None, will pull default Chart of Accounts. - Discussed in detail in the CoA Model CoA slug, basically helps in identifying the complete Chart of - Accounts for a particular EntityModel. + entity_slug: Union[EntityModel, str] + Specifies the EntityModel or its slug to pull accounts from. If a slug is provided and `coa_slug` is `None`, + the method will perform an additional database query to determine the default chart of accounts. - user_model: - The Django User Model making the request to check for permissions. + coa_slug: Optional[str], default=None + Explicitly specifies which chart of accounts to use. If `None`, the method will default to using + the EntityModel's default chart of accounts. Returns - _______ + ------- AccountModelQuerySet - A QuerySet of all requested EntityModel Chart of Accounts. + A QuerySet containing the AccountModels relevant for the specified EntityModel and the roles defined + in `GROUP_INVOICE`. """ qs = self.for_entity_available( user_model=user_model, @@ -406,30 +520,26 @@ def for_invoice(self, user_model, entity_slug: str, coa_slug: Optional[str] = No def for_bill(self, user_model, entity_slug, coa_slug: Optional[str] = None) -> AccountModelQuerySet: """ - Convenience method to pull only available and unlocked AccountModels for a specific EntityModel relevant only - for creating and management of Bills. See :func:`GROUP_BILL `. - - Roles in GROUP_BILL: ASSET_CA_CASH, ASSET_CA_PREPAID, LIABILITY_CL_ACC_PAYABLE. + Retrieves only available and unlocked AccountModels for a specific EntityModel, + specifically for the creation and management of Bills. Roles within the 'GROUP_BILL' + context include: ASSET_CA_CASH, ASSET_CA_PREPAID, and LIABILITY_CL_ACC_PAYABLE. Parameters - __________ - - entity_slug: EntityModel or str - The EntityModel or EntityModel slug to pull accounts from. If slug is passed and coa_slug is None will - result in an additional Database query to determine the default code of accounts. + ---------- + user_model : Django User Model + The Django User Model that is making the request, used to check for permissions. - coa_slug: str - Explicitly specify which chart of accounts to use. If None, will pull default Chart of Accounts. - Discussed in detail in the CoA Model CoA slug, basically helps in identifying the complete Chart of - Accounts for a particular EntityModel. + entity_slug : Union[EntityModel, str] + The EntityModel or EntityModel slug from which to pull accounts. If given a slug and coa_slug + is None, an additional database query will be made to determine the default chart of accounts. - user_model: - The Django User Model making the request to check for permissions. + coa_slug : Optional[str] + The specific chart of accounts to use. If None, it will default to the EntityModel's default chart of accounts. Returns - _______ + ------- AccountModelQuerySet - A QuerySet of all requested EntityModel Chart of Accounts. + A QuerySet of the requested EntityModel's chart of accounts. """ qs = self.for_entity_available( user_model=user_model, @@ -444,42 +554,33 @@ def account_code_validator(value: str): class AccountModelAbstract(MP_Node, CreateUpdateMixIn): - """ AccountModelAbstract - + """ Abstract class representing an Account Model. Attributes ---------- BALANCE_TYPE : list - List of choices for the balance type of the account. - + List of choices for the balance type of the account. Options include 'Credit' and 'Debit'. uuid : UUIDField - UUID field representing the primary key of the account. - + Unique identifier for each account instance. code : CharField - CharField representing the account code. - + Code representing the account, constrained by length and specific validation rules. name : CharField - CharField representing the account name. - + Name of the account, constrained by length. role : CharField - CharField representing the account role. - + Role associated with the account, with specific predefined choices. role_default : BooleanField - BooleanField representing whether the account is a default account for the role. - + Flag indicating if this account is the default for its role. balance_type : CharField - CharField representing the balance type of the account. Must be 'debit' or 'credit'. - + Type of balance the account holds, must be either 'debit' or 'credit'. locked : BooleanField - BooleanField representing whether the account is locked. - + Indicates whether the account is locked. active : BooleanField - BooleanField representing whether the account is active. - + Indicates whether the account is active. coa_model : ForeignKey - ForeignKey representing the associated ChartOfAccountModel. + Reference to the associated ChartOfAccountModel. """ + BALANCE_TYPE = [ (CREDIT, _('Credit')), (DEBIT, _('Debit')) @@ -537,30 +638,33 @@ def create_account(cls, active: bool = False, **kwargs): """ - Convenience Method to Create a new Account Model. This is the preferred method to create new Accounts in order - to properly handle parent/child relationships between models. + Create a new AccountModel instance, managing parent/child relationships properly. + + This convenience method ensures correct creation of new accounts, handling the intricate logic needed for + maintaining hierarchical relationships between accounts. Parameters ---------- - name: str - The name of the new Entity. - role: str - Account role. - balance_type: str - Account Balance Type. Must be 'debit' or 'credit'. - is_role_default: bool - If True, assigns account as default for role. Only once default account per role is permitted. - locked: bool - Marks account as Locked. Defaults to False. - active: bool - Marks account as Active. Defaults to True. - + name : str + Name of the new account entity. + role : str + Role assigned to the account. + balance_type : str + Type of balance associated with the account. Must be either 'debit' or 'credit'. + is_role_default : bool, optional + Indicates if the account should be the default for its role. Only one default account per role is allowed. + Defaults to False. + locked : bool, optional + Flags the account as locked. Defaults to False. + active : bool, optional + Flags the account as active. Defaults to True. + **kwargs : dict, optional + Additional attributes for account creation. Returns ------- AccountModel - The newly created AccountModel instance. - + The newly created `AccountModel` instance. """ account_model = cls( name=name, @@ -578,25 +682,35 @@ def create_account(cls, @property def role_bs(self) -> str: """ - The principal role of the account on the balance sheet. - Options are: - * asset - * liability - * equity + Returns the principal role of the account on the balance sheet. + + The principal role can be one of the following: + - 'asset' + - 'liability' + - 'equity' Returns ------- str - A String representing the principal role of the account on the balance sheet. + A string representing the principal role of the account on the balance sheet. """ return BS_ROLES.get(self.role) def is_root_account(self): + """ + Checks if the current user's role belongs to the ROOT_GROUP. + + Returns + ------- + bool + True if the role is in the ROOT_GROUP, False otherwise + """ return self.role in ROOT_GROUP def is_debit(self) -> bool: """ - Checks if the account has a DEBIT balance. + Checks if the account has a DEBIT balance type. + Returns ------- bool @@ -606,7 +720,8 @@ def is_debit(self) -> bool: def is_credit(self): """ - Checks if the account has a CREDIT balance. + Checks if the Account Model has a CREDIT balance type. + Returns ------- bool @@ -615,43 +730,156 @@ def is_credit(self): return self.balance_type == CREDIT def is_coa_root(self): + """ + Check if the current Account Model role is 'ROOT_COA'. + + Returns + ------- + bool + True if the role is 'ROOT_COA', False otherwise. + """ return self.role == ROOT_COA def is_asset(self) -> bool: + """ + Determines if the current Account Model role of the instance is considered an asset. + + Returns + ------- + bool + True if the role is part of the GROUP_ASSETS, False otherwise. + """ return self.role in GROUP_ASSETS def is_liability(self) -> bool: + """ + Determines if the current Account Model role is considered a liability. + + Returns + ------- + bool + True if the role is part of GROUP_LIABILITIES, otherwise False. + """ return self.role in GROUP_LIABILITIES def is_capital(self) -> bool: + """ + Checks if the current Account Model role is in the capital group. + + Returns + ------- + bool + True if the role is in GROUP_CAPITAL, otherwise False. + """ return self.role in GROUP_CAPITAL def is_income(self) -> bool: + """ + Determines whether the current Account Model role belongs to the income group. + + Parameters + ---------- + self : object + The instance of the class containing attribute 'role'. + + Returns + ------- + bool + True if the role is in the GROUP_INCOME list, False otherwise. + """ return self.role in GROUP_INCOME def is_cogs(self) -> bool: + """ + Determines if the role of the object is part of the GROUP_COGS. + + Returns + ------- + bool + True if the object's role is part of the GROUP_COGS, False otherwise. + """ return self.role in GROUP_COGS def is_expense(self) -> bool: + """ + Checks if the current Account Model `role` is categorized under `GROUP_EXPENSES`. + + Parameters + ---------- + None + + Returns + ------- + bool + True if `role` is in `GROUP_EXPENSES`, otherwise False. + """ return self.role in GROUP_EXPENSES def is_active(self) -> bool: + """ + Determines if the current instance is active. + + Returns + ------- + bool + True if the instance is active, otherwise False + """ return self.active is True def is_locked(self) -> bool: + """ + Determines if the current object is locked. + + Returns + ------- + bool + True if the object is locked, False otherwise. + + """ return self.locked is True def can_activate(self): + """ + Determines if the object can be activated. + + Returns + ------- + bool + True if the object is inactive, otherwise False. + """ return all([ self.active is False ]) def can_deactivate(self): + """ + Determine if the object can be deactivated. + + Checks if the `active` attribute is set to `True`. + + Returns + ------- + bool + True if the object is currently active and can be deactivated, otherwise False. + """ return all([ self.active is True ]) def activate(self, commit: bool = True, raise_exception: bool = True, **kwargs): + """ + Checks if the Account Model instance can be activated, then Activates the AccountModel instance. + Raises exception if AccountModel cannot be activated. + + Parameters + ---------- + commit : bool, optional + If True, commit the changes to the database by calling the save method. + raise_exception : bool, optional + If True, raises an AccountModelValidationError if the account cannot be activated. + kwargs : dict + Additional parameters that can be passed for further customization. + """ if not self.can_activate(): if raise_exception: raise AccountModelValidationError( @@ -666,6 +894,19 @@ def activate(self, commit: bool = True, raise_exception: bool = True, **kwargs): ]) def deactivate(self, commit: bool = True, raise_exception: bool = True, **kwargs): + """ + Checks if the Account Model instance can be de-activated, then De-activates the AccountModel instance. + Raises exception if AccountModel cannot be de-activated. + + Parameters + ---------- + commit : bool, optional + If True, commit the changes to the database by calling the save method. + raise_exception : bool, optional + If True, raises an AccountModelValidationError if the account cannot be activated. + kwargs : dict + Additional parameters that can be passed for further customization. + """ if not self.can_deactivate(): if raise_exception: raise AccountModelValidationError( @@ -674,12 +915,26 @@ def deactivate(self, commit: bool = True, raise_exception: bool = True, **kwargs return self.active = False if commit: - self.save(update_fields=[ - 'active', - 'updated' - ]) + self.save( + update_fields=[ + 'active', + 'updated' + ]) def can_transact(self) -> bool: + """ + Determines if a transaction can be performed based on multiple conditions. + + Returns + ------- + bool + True if all conditions are met, enabling a transaction; False otherwise. + + Conditions: + 1. The chart of accounts (coa_model) must be active. + 2. The entity must not be locked. + 3. The entity itself must be active. + """ return all([ self.coa_model.is_active(), not self.is_locked(), @@ -687,7 +942,25 @@ def can_transact(self) -> bool: ]) def get_code_prefix(self) -> str: + """ + Returns the code prefix based on the account type. + This method determines the account type by calling the respective + account type methods and returns the corresponding code prefix based on Accounting best practices.. + + Returns + ------- + str + The code prefix for the account type. The possible values are: + '1' for assets, '2' for liabilities, '3' for capital, + '4' for income, '5' for cost of goods sold (COGS), + '6' for expenses. + + Raises + ------ + AccountModelValidationError + If the account role does not match any of the predefined categories. + """ if self.is_asset(): return '1' elif self.is_liability(): @@ -703,6 +976,19 @@ def get_code_prefix(self) -> str: raise AccountModelValidationError(f'Invalid role match for role {self.role}...') def get_root_role(self) -> str: + """ + Returns the root role corresponding to the account type. + + Returns + ------- + str + The root role corresponding to the account type. + + Raises + ------ + AccountModelValidationError + If no valid role match is found for the account's role. + """ if self.is_asset(): return ROOT_ASSETS elif self.is_liability(): @@ -720,10 +1006,23 @@ def get_root_role(self) -> str: raise AccountModelValidationError(f'Invalid role match for role {self.role}...') def get_account_move_choice_queryset(self): + """ + Retrieves a filtered queryset of account models that the current Account Model instance + can be a child of. + + The queryset is filtered based on the specified role and its hierarchical parent roles. + Account models with a UUID matching the current instance's UUID are excluded from the results. + + Returns + ------- + QuerySet + A filtered set of account models suitable for moving the current instance under. + """ return self.coa_model.accountmodel_set.filter( role__in=[ self.role, - self.get_root_role() + self.get_root_role(), + *VALID_PARENTS.get(self.role, []) ], ).exclude(uuid__exact=self.uuid) @@ -731,12 +1030,41 @@ def get_bs_bucket(self) -> str: return BS_BUCKETS[self.get_code_prefix()] def is_indented(self): + """ + Check if the current depth level is greater than 2. + + Returns + ------- + bool + True if the depth is greater than 2, False otherwise. + """ return self.depth > 2 def get_html_pixel_indent(self): + """ + Calculates the pixel indentation for HTML elements based on the depth attribute for UI purposes + + Returns + ------- + str + The calculated pixel indentation as a string with 'px' suffix. + """ return f'{(self.depth - 2) * 40}px' def generate_random_code(self): + """ + Generates a random code for the account adding a prefix 1-6 depending on account role. + + Raises + ------ + AccountModelValidationError + If the account role is not assigned before code generation. + + Returns + ------- + str + A randomly generated code prefixed with a role-based prefix. + """ if not self.role: raise AccountModelValidationError('Must assign account role before generate random code') @@ -755,7 +1083,6 @@ def get_absolute_url(self): ) def clean(self): - if not self.code and DJANGO_LEDGER_ACCOUNT_CODE_GENERATE: self.code = self.generate_random_code() diff --git a/django_ledger/models/entity.py b/django_ledger/models/entity.py index d4691904..32c3b092 100644 --- a/django_ledger/models/entity.py +++ b/django_ledger/models/entity.py @@ -1292,12 +1292,19 @@ def get_coa_accounts(self, """ if not coa_model: - account_model_qs = self.default_coa.accountmodel_set.all().select_related( - 'coa_model', 'coa_model__entity').not_coa_root() - else: + coa_model = self.default_coa + elif isinstance(coa_model, UUID): + coa_model = self.chartofaccountmodel_set.get(uuid__exact=coa_model) + elif isinstance(coa_model, str): + coa_model = self.chartofaccountmodel_set.get(slug__exact=coa_model) + elif isinstance(coa_model, ChartOfAccountModel): self.validate_chart_of_accounts_for_entity(coa_model=coa_model) - account_model_qs = coa_model.accountmodel_set.select_related( - 'coa_model', 'coa_model__entity').not_coa_root() + else: + raise EntityModelValidationError( + f'CoA Model {coa_model} must be an instance of ChartOfAccountModel, UUID, str or None.' + ) + + account_model_qs = coa_model.accountmodel_set.select_related('coa_model', 'coa_model__entity').not_coa_root() if active: account_model_qs = account_model_qs.active() diff --git a/django_ledger/report/cash_flow_statement.py b/django_ledger/report/cash_flow_statement.py index 90c47ede..702f63f1 100644 --- a/django_ledger/report/cash_flow_statement.py +++ b/django_ledger/report/cash_flow_statement.py @@ -1,7 +1,7 @@ from datetime import datetime, date from typing import Optional, Dict, Union -from django_ledger.io.io_digest import IODigestContextManager +from django_ledger.io.io_context import IODigestContextManager from django_ledger.report.core import BaseReportSupport, PDFReportValidationError from django_ledger.settings import DJANGO_LEDGER_CURRENCY_SYMBOL from django_ledger.templatetags.django_ledger import currency_format diff --git a/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark.png b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark.png new file mode 100644 index 00000000..c4a6bdda Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark.png differ diff --git a/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@0.5x.png b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@0.5x.png new file mode 100644 index 00000000..8792daad Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@2x.png b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@2x.png new file mode 100644 index 00000000..5542b30b Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@3x.png b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@3x.png new file mode 100644 index 00000000..5780cb9a Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/django_ledger_logo_dark@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-full-vert.png b/django_ledger/static/django_ledger/logo_2/djl-full-vert.png new file mode 100644 index 00000000..c4a6bdda Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-full-vert.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-full-vert@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-full-vert@0.5x.png new file mode 100644 index 00000000..8792daad Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-full-vert@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-full-vert@2x.png b/django_ledger/static/django_ledger/logo_2/djl-full-vert@2x.png new file mode 100644 index 00000000..5542b30b Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-full-vert@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-full-vert@3x.png b/django_ledger/static/django_ledger/logo_2/djl-full-vert@3x.png new file mode 100644 index 00000000..5780cb9a Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-full-vert@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz.png new file mode 100644 index 00000000..ba208102 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@0.5x.png new file mode 100644 index 00000000..4d63152d Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@2x.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@2x.png new file mode 100644 index 00000000..9ddae1d3 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@3x.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@3x.png new file mode 100644 index 00000000..48fd2a25 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-horiz@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert.png new file mode 100644 index 00000000..c4a6bdda Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@0.5x.png new file mode 100644 index 00000000..8792daad Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@2x.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@2x.png new file mode 100644 index 00000000..5542b30b Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@3x.png b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@3x.png new file mode 100644 index 00000000..5780cb9a Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo-full-vert@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo.png b/django_ledger/static/django_ledger/logo_2/djl-logo.png new file mode 100644 index 00000000..0e8026d5 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-logo@0.5x.png new file mode 100644 index 00000000..74d592d2 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo@2x.png b/django_ledger/static/django_ledger/logo_2/djl-logo@2x.png new file mode 100644 index 00000000..4ab7a6c5 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-logo@3x.png b/django_ledger/static/django_ledger/logo_2/djl-logo@3x.png new file mode 100644 index 00000000..f2c5965a Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-logo@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz.png new file mode 100644 index 00000000..20fd717d Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@0.5x.png new file mode 100644 index 00000000..c7655922 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@2x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@2x.png new file mode 100644 index 00000000..7439acfc Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@3x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@3x.png new file mode 100644 index 00000000..9f44ec9c Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-horiz@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert.png new file mode 100644 index 00000000..c452a1e3 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@0.5x.png new file mode 100644 index 00000000..b0cd5079 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@2x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@2x.png new file mode 100644 index 00000000..527ea637 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@3x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@3x.png new file mode 100644 index 00000000..3fcb676d Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-full-vert@3x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-horiz.png b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz.png new file mode 100644 index 00000000..5915cdf8 Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@0.5x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@0.5x.png new file mode 100644 index 00000000..bc17c22f Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@0.5x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@2x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@2x.png new file mode 100644 index 00000000..87031abd Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@2x.png differ diff --git a/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@3x.png b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@3x.png new file mode 100644 index 00000000..4737200e Binary files /dev/null and b/django_ledger/static/django_ledger/logo_2/djl-txt-horiz@3x.png differ diff --git a/docker-compose.yml b/docker-compose.yml index 5718425c..e3029855 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3' services: web: build: diff --git a/notebooks/DjangoCon2024.ipynb b/notebooks/DjangoCon2024.ipynb new file mode 100644 index 00000000..1cafd83e --- /dev/null +++ b/notebooks/DjangoCon2024.ipynb @@ -0,0 +1,1081 @@ +{ + "cells": [ + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "import os\n", + "from datetime import date, datetime\n", + "from zoneinfo import ZoneInfo\n", + "from typing import List, Dict, Tuple, Optional, Union\n", + "from decimal import Decimal\n", + "\n", + "import django\n", + "# for easier visualization it is recommended to use pandas to render data...\n", + "# if pandas is not installed, you may install it with this command: pip install -U pandas\n", + "# pandas is not a dependency of django_ledger...\n", + "import pandas as pd\n", + "\n", + "# Set your django settings module if needed...\n", + "os.environ['DJANGO_SETTINGS_MODULE'] = 'dev_env.settings'\n", + "\n", + "# if using jupyter notebook need to set DJANGO_ALLOW_ASYNC_UNSAFE as \"true\"\n", + "os.environ['DJANGO_ALLOW_ASYNC_UNSAFE'] = 'true'\n", + "\n", + "# change your working directory as needed...\n", + "os.chdir('../')\n", + "\n", + "django.setup()\n", + "\n", + "from django_ledger.models.entity import EntityModel\n", + "from django.contrib.auth import get_user_model\n", + "from django_ledger.io import roles" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Get Your Entity Administrator UserModel" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "# change this to your preferred django username...\n", + "MY_USERNAME = 'ceo_user'\n", + "MY_PASSWORD = 'NeverUseMe|VeryInsecure!'\n", + "UserModel = get_user_model()\n", + "\n", + "try:\n", + " user_model = UserModel.objects.get(username__exact=MY_USERNAME)\n", + "except:\n", + " user_model = UserModel(username=MY_USERNAME)\n", + " user_model.set_password(MY_PASSWORD)\n", + " user_model.save()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "# Get or Create an Entity Model" + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "from django_ledger.models.entity import EntityModel\n", + "\n", + "ENTITY_NAME = 'One Big Company, LLC'\n", + "\n", + "entity_model = EntityModel.create_entity(\n", + " name=ENTITY_NAME,\n", + " admin=user_model,\n", + " use_accrual_method=True,\n", + " fy_start_month=1\n", + ")\n", + "\n", + "entity_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chart of Accounts" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a Default Chart of Accounts\n", + "- Newly created EntityModel do not have a default Code of Accounts yet." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "entity_model.has_default_coa()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "default_coa_model = entity_model.create_chart_of_accounts(\n", + " assign_as_default=True,\n", + " commit=True,\n", + " coa_name='My QuickStart CoA'\n", + ")\n", + "\n", + "default_coa_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "default_coa_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "entity_model.default_coa == default_coa_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Populate Entity with Random Data (Optional)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Define a Start Date for Transactions" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "START_DTTM = datetime(year=2022, month=10, day=1, tzinfo=ZoneInfo('UTC'))" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "- This action will populate the EntityModel with random data.\n", + "- It will populate a Code of Accounts using a default pre-defined list.\n", + "- This approach is for illustration, educational and testing purposes, not encouraged for new production entities." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "entity_model.populate_random_data(start_date=START_DTTM)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### EntityModel has now a Default Chart of Accounts" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "entity_model.has_default_coa()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "default_coa_model = entity_model.get_default_coa()\n", + "default_coa_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Chart of Accounts (CoA)\n", + "- A Chart of Accounts is a user-defined list of accounts. \n", + "- Each Entity Model must have at least one default Chart of Accounts." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Django Ledger support multiple chart of accounts." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "another_coa_model = entity_model.create_chart_of_accounts(\n", + " assign_as_default=False,\n", + " commit=True,\n", + " coa_name='My Empty Chart of Accounts'\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "another_coa_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Accounts" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "## Default CoA Accounts" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "default_coa_accounts_qs = entity_model.get_default_coa_accounts()\n", + "pd.DataFrame(default_coa_accounts_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get CoA Accounts by CoA Model" + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "coa_accounts_by_coa_model_qs = entity_model.get_coa_accounts(coa_model=default_coa_model)\n", + "pd.DataFrame(coa_accounts_by_coa_model_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "No Accounts yet on this CoA..." + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "coa_accounts_by_coa_model_qs = entity_model.get_coa_accounts(coa_model=another_coa_model)\n", + "pd.DataFrame(coa_accounts_by_coa_model_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get CoA Accounts by CoA Model UUID\n", + "- May pass UUID instance instead of ChartOF AccountsModel..." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "coa_accounts_by_coa_uuid_qs = entity_model.get_coa_accounts(coa_model=default_coa_model.uuid)\n", + "pd.DataFrame(coa_accounts_by_coa_uuid_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get CoA Accounts by CoA Model Slug\n", + "- If string is passed, will lookup by slug..." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "coa_accounts_by_coa_slug_qs = entity_model.get_coa_accounts(coa_model=default_coa_model.slug)\n", + "pd.DataFrame(coa_accounts_by_coa_slug_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get Accounts With Codes and CoA Model\n", + "- Assumes default CoA if no coa_model is passed..." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "coa_accounts_by_codes_qs = entity_model.get_accounts_with_codes(code_list=['1010', '1050'])\n", + "pd.DataFrame(coa_accounts_by_codes_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Empty ChartOfAccountModel..." + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "coa_accounts_by_codes_qs = entity_model.get_accounts_with_codes(\n", + " code_list=['1010', '1050'], \n", + " coa_model=another_coa_model\n", + ")\n", + "pd.DataFrame(coa_accounts_by_codes_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "### Get All Accounts at Once" + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "coa_qs, coa_map = entity_model.get_all_coa_accounts()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "A dictionary, CoA Model -> Account List." + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "coa_map" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "pd.DataFrame(coa_map[default_coa_model])" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "pd.DataFrame(coa_map[another_coa_model])" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create Account Model\n", + "- Creating AccountModel into empty \"another_coa_model\"..." + ] + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "account_model = entity_model.create_account(\n", + " coa_model=another_coa_model,\n", + " code='1220',\n", + " role=roles.ASSET_CA_INVENTORY,\n", + " name='A new account created from the EntityModel API!',\n", + " balance_type=roles.DEBIT,\n", + " active=True\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "account_model" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "tags": [] + }, + "source": [ + "another_coa_accounts_qs = entity_model.get_coa_accounts(coa_model=another_coa_model)\n", + "pd.DataFrame(another_coa_accounts_qs)" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Basic Django Ledger Usage\n", + "- The LedgerModel name is whatever your heart desires.\n", + "- Examples:\n", + " - A month.\n", + " - A customer.\n", + " - A vendor.\n", + " - A project.\n", + "- The more ledgers are created, the more segregation and control over transactions is possible." + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "ledger_model = entity_model.create_ledger(\n", + " name='My October 2023 Ledger', \n", + " posted=True\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create a Library" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "from django_ledger.io.io_library import IOLibrary\n", + "\n", + "library = IOLibrary(name='djangocon-2024-library')" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create and Register a BluePrint" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "from django_ledger.io.io_library import IOBluePrint\n", + "\n", + "@library.register\n", + "def sale_blueprint(\n", + " sale_amount: Union[int, float, Decimal],\n", + " contribution_margin_percent: float,\n", + " description: Optional[str] = None\n", + ") -> IOBluePrint:\n", + " blueprint = IOBluePrint()\n", + " cogs_amount = (1 - contribution_margin_percent) * sale_amount\n", + " blueprint.debit(account_code='1010', amount=sale_amount, description=description)\n", + " blueprint.credit(account_code='4010', amount=sale_amount, description=description)\n", + " blueprint.credit(account_code='1200', amount=cogs_amount, description=description)\n", + " blueprint.debit(account_code='5010', amount=cogs_amount, description=description)\n", + " return blueprint" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Get a Cursor" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "cursor = library.get_cursor(\n", + " entity_model=entity_model, \n", + " user_model=user_model\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "## Dispatch Instructions" + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "# Option 1 - Use A Ledger Model\n", + "cursor.dispatch('sale_blueprint',\n", + " ledger_model=ledger_model,\n", + " sale_amount=34.45,\n", + " contribution_margin_percent=0.13,\n", + " description='Order ID: 123')\n", + "\n", + "# Option 2- Create a New Ledger Model\n", + "cursor.dispatch('sale_blueprint',\n", + " ledger_model='ledger-order-id-123',\n", + " sale_amount=90.43,\n", + " contribution_margin_percent=0.17,\n", + " description='Order ID: 123')" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Commit Your Instructions\n", + "Not recommended to post both ledger and journal entries. Posted transactions will immediately hit the books.\n", + "**result** contains resulting ledger models, journal entries and transactions fro the committed " + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "stub = cursor.commit(\n", + " post_new_ledgers=True,\n", + " post_journal_entries=True,\n", + " je_timestamp=datetime(2023,12,2,12,10)\n", + " # je_timestamp='2023-12-02 12:10'\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": "### Get Financial Statement Report Data for Ledger Model" + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Balance Sheet" + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "bs_data = ledger_model.digest_balance_sheet(\n", + " to_date=date(2023, 12, 31),\n", + " entity_slug=entity_model\n", + ")\n", + "\n", + "bs_data.get_balance_sheet_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Income Statement" + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "is_data = ledger_model.digest_income_statement(\n", + " from_date=date(2023, 1, 1),\n", + " to_date=date(2023, 12, 31),\n", + " entity_slug=entity_model\n", + ")\n", + "\n", + "is_data.get_income_statement_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "Cash Flow Statement" + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "cfs_data = ledger_model.digest_cash_flow_statement(\n", + " from_date=date(2023, 1, 1),\n", + " to_date=date(2023, 12, 31),\n", + " entity_slug=entity_model\n", + ")\n", + "\n", + "cfs_data.get_cash_flow_statement_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "All Statements in a Single Call" + ] + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "fin_digest = ledger_model.digest_financial_statements(\n", + " from_date=date(2023, 1, 1),\n", + " to_date=date(2023, 12, 31),\n", + " entity_slug=entity_model\n", + ")\n", + "\n", + "statement_data = fin_digest.get_financial_statements_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "statement_data['balance_sheet']" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "statement_data['income_statement']" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": { + "collapsed": false + }, + "source": [ + "statement_data['cash_flow_statement']" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Financial Statement PDF Reports" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Set Up\n", + "- Must enable PDF support by installing dependencies via *pipenv*.\n", + " - pipenv install --categories pdf" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Balance Sheet" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "bs_report = entity_model.get_balance_sheet_statement(\n", + " to_date=date(2022, 12, 31),\n", + " save_pdf=True,\n", + " filepath='./'\n", + ")\n", + "bs_data = bs_report.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "bs_data", + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Balance Sheet Statement Raw Data" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "bs_report.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Income Statement" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "ic_report = entity_model.get_income_statement(\n", + " from_date=date(2022, 1, 1),\n", + " to_date=date(2022, 12, 31),\n", + " save_pdf=True,\n", + " filepath='./'\n", + ")\n", + "\n", + "ic_data = ic_report.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Income Statement Raw Data" + ] + }, + { + "cell_type": "code", + "metadata": { + "scrolled": true + }, + "source": "ic_data", + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cash Flow Statement" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "cf_report = entity_model.get_cash_flow_statement(\n", + " from_date=date(2022, 1, 1),\n", + " to_date=date(2022, 12, 31),\n", + " save_pdf=True,\n", + " filepath='./'\n", + ")\n", + "\n", + "cf_data = cf_report.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cash Flow Statement Raw Data" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": "cf_data", + "outputs": [], + "execution_count": null + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## All Financial Statements Data in a single Call" + ] + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "reports = entity_model.get_financial_statements(\n", + " user_model=user_model,\n", + " from_date=date(2022, 1, 1),\n", + " to_date=date(2022, 12, 31),\n", + " save_pdf=True,\n", + " filepath='./'\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "bs_data = reports.balance_sheet_statement.get_report_data()\n", + "ic_data = reports.income_statement.get_report_data()\n", + "cf_data = reports.cash_flow_statement.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "reports.income_statement.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "cell_type": "code", + "metadata": {}, + "source": [ + "reports.cash_flow_statement.get_report_data()" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "# How To Extend the Ledger Model" + }, + { + "metadata": {}, + "cell_type": "code", + "source": [ + "from django.db import models\n", + "from django_ledger.models import LedgerModel\n", + "\n", + "class EmployeeModel(LedgerModel):\n", + " \n", + " dob = models.DateField()\n", + " salary = models.DecimalField()\n", + " first_name = models.CharField(max_length=50)\n", + " last_name = models.CharField(max_length=50)\n", + " \n", + " def process_payroll(self, month):\n", + " raise NotImplementedError()\n", + " \n", + " def send_payroll_report(self, month):\n", + " raise NotImplementedError()" + ], + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "", + "outputs": [], + "execution_count": null + }, + { + "metadata": {}, + "cell_type": "code", + "source": "", + "outputs": [], + "execution_count": null + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/notebooks/QuickStart Notebook.ipynb b/notebooks/QuickStart Notebook.ipynb index f3772203..9d37e281 100644 --- a/notebooks/QuickStart Notebook.ipynb +++ b/notebooks/QuickStart Notebook.ipynb @@ -2,15 +2,13 @@ "cells": [ { "cell_type": "code", - "execution_count": null, "metadata": { + "tags": [], "ExecuteTime": { - "end_time": "2023-12-14T18:23:59.183451Z", - "start_time": "2023-12-14T18:23:58.858369Z" - }, - "tags": [] + "end_time": "2024-08-21T22:34:43.080716Z", + "start_time": "2024-08-21T22:34:41.531456Z" + } }, - "outputs": [], "source": [ "import os\n", "from datetime import date, datetime\n", @@ -44,7 +42,9 @@ "from django.contrib.auth import get_user_model\n", "from django_ledger.io import roles, DEBIT, CREDIT\n", "from django_ledger.io.io_library import IOBluePrint, IOLibrary" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "markdown", @@ -55,15 +55,13 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": { + "tags": [], "ExecuteTime": { - "end_time": "2023-12-14T18:23:59.340490Z", - "start_time": "2023-12-14T18:23:59.296066Z" - }, - "tags": [] + "end_time": "2024-08-21T22:34:46.102478Z", + "start_time": "2024-08-21T22:34:46.095075Z" + } }, - "outputs": [], "source": [ "# change this to your preferred django username...\n", "MY_USERNAME = 'ceo_user'\n", @@ -76,7 +74,9 @@ " user_model = UserModel(username=MY_USERNAME)\n", " user_model.set_password(MY_PASSWORD)\n", " user_model.save()" - ] + ], + "outputs": [], + "execution_count": 2 }, { "cell_type": "markdown", @@ -87,15 +87,13 @@ }, { "cell_type": "code", - "execution_count": null, "metadata": { + "tags": [], "ExecuteTime": { - "end_time": "2023-12-14T18:23:59.691324Z", - "start_time": "2023-12-14T18:23:59.653972Z" - }, - "tags": [] + "end_time": "2024-08-21T22:34:50.254830Z", + "start_time": "2024-08-21T22:34:50.244243Z" + } }, - "outputs": [], "source": [ "ENTITY_NAME = 'One Big Company, LLC'\n", "\n", @@ -107,7 +105,20 @@ ")\n", "\n", "entity_model" - ] + ], + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "execution_count": 3 }, { "cell_type": "markdown", diff --git a/pyproject.toml b/pyproject.toml index 79f36367..e02047fa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "django-ledger" -version = "0.6.3" +version = "0.6.4" readme = "README.md" requires-python = ">=3.10" description = "Double entry accounting system built on the Django Web Framework."