From 330d39373f84ba6d372191f08635886f2b7ede86 Mon Sep 17 00:00:00 2001 From: harold Date: Wed, 27 Aug 2025 23:27:31 +0500 Subject: [PATCH] init commit --- .gitignore | 1 + .idea/.gitignore | 8 + poetry.lock | 711 ++++++++++++++++++ pyproject.toml | 22 + src/__init__.py | 0 src/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 174 bytes src/__pycache__/main.cpython-311.pyc | Bin 0 -> 2629 bytes src/admin/__init__.py | 1 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 180 bytes src/admin/__pycache__/account.cpython-311.pyc | Bin 0 -> 1084 bytes .../__pycache__/multi_engine.cpython-311.pyc | Bin 0 -> 1802 bytes src/admin/__pycache__/payment.cpython-311.pyc | Bin 0 -> 3542 bytes src/admin/__pycache__/widget.cpython-311.pyc | Bin 0 -> 7798 bytes src/admin/account.py | 18 + src/admin/auth.py | 66 ++ src/admin/multi_engine.py | 41 + src/admin/payment.py | 60 ++ src/admin/widget.py | 118 +++ src/database/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 183 bytes .../__pycache__/engines.cpython-311.pyc | Bin 0 -> 766 bytes .../__pycache__/payments.cpython-311.pyc | Bin 0 -> 10216 bytes .../__pycache__/streamers.cpython-311.pyc | Bin 0 -> 2333 bytes .../__pycache__/widgets.cpython-311.pyc | Bin 0 -> 17546 bytes src/database/engines.py | 20 + src/database/payments.py | 114 +++ src/database/streamers.py | 42 ++ src/database/widgets.py | 192 +++++ src/main.py | 38 + 29 files changed, 1452 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 poetry.lock create mode 100644 pyproject.toml create mode 100644 src/__init__.py create mode 100644 src/__pycache__/__init__.cpython-311.pyc create mode 100644 src/__pycache__/main.cpython-311.pyc create mode 100644 src/admin/__init__.py create mode 100644 src/admin/__pycache__/__init__.cpython-311.pyc create mode 100644 src/admin/__pycache__/account.cpython-311.pyc create mode 100644 src/admin/__pycache__/multi_engine.cpython-311.pyc create mode 100644 src/admin/__pycache__/payment.cpython-311.pyc create mode 100644 src/admin/__pycache__/widget.cpython-311.pyc create mode 100644 src/admin/account.py create mode 100644 src/admin/auth.py create mode 100644 src/admin/multi_engine.py create mode 100644 src/admin/payment.py create mode 100644 src/admin/widget.py create mode 100644 src/database/__init__.py create mode 100644 src/database/__pycache__/__init__.cpython-311.pyc create mode 100644 src/database/__pycache__/engines.cpython-311.pyc create mode 100644 src/database/__pycache__/payments.cpython-311.pyc create mode 100644 src/database/__pycache__/streamers.cpython-311.pyc create mode 100644 src/database/__pycache__/widgets.cpython-311.pyc create mode 100644 src/database/engines.py create mode 100644 src/database/payments.py create mode 100644 src/database/streamers.py create mode 100644 src/database/widgets.py create mode 100644 src/main.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2eea525 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..36df6b3 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,711 @@ +# This file is automatically @generated by Poetry 2.1.4 and should not be changed by hand. + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.10.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1"}, + {file = "anyio-4.10.0.tar.gz", hash = "sha256:3f3fae35c96039744587aa5b8371e7e8e603c0702999535961dd336026973ba6"}, +] + +[package.dependencies] +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "asyncpg" +version = "0.30.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "asyncpg-0.30.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bfb4dd5ae0699bad2b233672c8fc5ccbd9ad24b89afded02341786887e37927e"}, + {file = "asyncpg-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc1f62c792752a49f88b7e6f774c26077091b44caceb1983509edc18a2222ec0"}, + {file = "asyncpg-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3152fef2e265c9c24eec4ee3d22b4f4d2703d30614b0b6753e9ed4115c8a146f"}, + {file = "asyncpg-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7255812ac85099a0e1ffb81b10dc477b9973345793776b128a23e60148dd1af"}, + {file = "asyncpg-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:578445f09f45d1ad7abddbff2a3c7f7c291738fdae0abffbeb737d3fc3ab8b75"}, + {file = "asyncpg-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c42f6bb65a277ce4d93f3fba46b91a265631c8df7250592dd4f11f8b0152150f"}, + {file = "asyncpg-0.30.0-cp310-cp310-win32.whl", hash = "sha256:aa403147d3e07a267ada2ae34dfc9324e67ccc4cdca35261c8c22792ba2b10cf"}, + {file = "asyncpg-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:fb622c94db4e13137c4c7f98834185049cc50ee01d8f657ef898b6407c7b9c50"}, + {file = "asyncpg-0.30.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5e0511ad3dec5f6b4f7a9e063591d407eee66b88c14e2ea636f187da1dcfff6a"}, + {file = "asyncpg-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:915aeb9f79316b43c3207363af12d0e6fd10776641a7de8a01212afd95bdf0ed"}, + {file = "asyncpg-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c198a00cce9506fcd0bf219a799f38ac7a237745e1d27f0e1f66d3707c84a5a"}, + {file = "asyncpg-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3326e6d7381799e9735ca2ec9fd7be4d5fef5dcbc3cb555d8a463d8460607956"}, + {file = "asyncpg-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:51da377487e249e35bd0859661f6ee2b81db11ad1f4fc036194bc9cb2ead5056"}, + {file = "asyncpg-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc6d84136f9c4d24d358f3b02be4b6ba358abd09f80737d1ac7c444f36108454"}, + {file = "asyncpg-0.30.0-cp311-cp311-win32.whl", hash = "sha256:574156480df14f64c2d76450a3f3aaaf26105869cad3865041156b38459e935d"}, + {file = "asyncpg-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:3356637f0bd830407b5597317b3cb3571387ae52ddc3bca6233682be88bbbc1f"}, + {file = "asyncpg-0.30.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c902a60b52e506d38d7e80e0dd5399f657220f24635fee368117b8b5fce1142e"}, + {file = "asyncpg-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aca1548e43bbb9f0f627a04666fedaca23db0a31a84136ad1f868cb15deb6e3a"}, + {file = "asyncpg-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c2a2ef565400234a633da0eafdce27e843836256d40705d83ab7ec42074efb3"}, + {file = "asyncpg-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1292b84ee06ac8a2ad8e51c7475aa309245874b61333d97411aab835c4a2f737"}, + {file = "asyncpg-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0f5712350388d0cd0615caec629ad53c81e506b1abaaf8d14c93f54b35e3595a"}, + {file = "asyncpg-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:db9891e2d76e6f425746c5d2da01921e9a16b5a71a1c905b13f30e12a257c4af"}, + {file = "asyncpg-0.30.0-cp312-cp312-win32.whl", hash = "sha256:68d71a1be3d83d0570049cd1654a9bdfe506e794ecc98ad0873304a9f35e411e"}, + {file = "asyncpg-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:9a0292c6af5c500523949155ec17b7fe01a00ace33b68a476d6b5059f9630305"}, + {file = "asyncpg-0.30.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:05b185ebb8083c8568ea8a40e896d5f7af4b8554b64d7719c0eaa1eb5a5c3a70"}, + {file = "asyncpg-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c47806b1a8cbb0a0db896f4cd34d89942effe353a5035c62734ab13b9f938da3"}, + {file = "asyncpg-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b6fde867a74e8c76c71e2f64f80c64c0f3163e687f1763cfaf21633ec24ec33"}, + {file = "asyncpg-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46973045b567972128a27d40001124fbc821c87a6cade040cfcd4fa8a30bcdc4"}, + {file = "asyncpg-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9110df111cabc2ed81aad2f35394a00cadf4f2e0635603db6ebbd0fc896f46a4"}, + {file = "asyncpg-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:04ff0785ae7eed6cc138e73fc67b8e51d54ee7a3ce9b63666ce55a0bf095f7ba"}, + {file = "asyncpg-0.30.0-cp313-cp313-win32.whl", hash = "sha256:ae374585f51c2b444510cdf3595b97ece4f233fde739aa14b50e0d64e8a7a590"}, + {file = "asyncpg-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:f59b430b8e27557c3fb9869222559f7417ced18688375825f8f12302c34e915e"}, + {file = "asyncpg-0.30.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:29ff1fc8b5bf724273782ff8b4f57b0f8220a1b2324184846b39d1ab4122031d"}, + {file = "asyncpg-0.30.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:64e899bce0600871b55368b8483e5e3e7f1860c9482e7f12e0a771e747988168"}, + {file = "asyncpg-0.30.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b290f4726a887f75dcd1b3006f484252db37602313f806e9ffc4e5996cfe5cb"}, + {file = "asyncpg-0.30.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f86b0e2cd3f1249d6fe6fd6cfe0cd4538ba994e2d8249c0491925629b9104d0f"}, + {file = "asyncpg-0.30.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:393af4e3214c8fa4c7b86da6364384c0d1b3298d45803375572f415b6f673f38"}, + {file = "asyncpg-0.30.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fd4406d09208d5b4a14db9a9dbb311b6d7aeeab57bded7ed2f8ea41aeef39b34"}, + {file = "asyncpg-0.30.0-cp38-cp38-win32.whl", hash = "sha256:0b448f0150e1c3b96cb0438a0d0aa4871f1472e58de14a3ec320dbb2798fb0d4"}, + {file = "asyncpg-0.30.0-cp38-cp38-win_amd64.whl", hash = "sha256:f23b836dd90bea21104f69547923a02b167d999ce053f3d502081acea2fba15b"}, + {file = "asyncpg-0.30.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f4e83f067b35ab5e6371f8a4c93296e0439857b4569850b178a01385e82e9ad"}, + {file = "asyncpg-0.30.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5df69d55add4efcd25ea2a3b02025b669a285b767bfbf06e356d68dbce4234ff"}, + {file = "asyncpg-0.30.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3479a0d9a852c7c84e822c073622baca862d1217b10a02dd57ee4a7a081f708"}, + {file = "asyncpg-0.30.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26683d3b9a62836fad771a18ecf4659a30f348a561279d6227dab96182f46144"}, + {file = "asyncpg-0.30.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1b982daf2441a0ed314bd10817f1606f1c28b1136abd9e4f11335358c2c631cb"}, + {file = "asyncpg-0.30.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1c06a3a50d014b303e5f6fc1e5f95eb28d2cee89cf58384b700da621e5d5e547"}, + {file = "asyncpg-0.30.0-cp39-cp39-win32.whl", hash = "sha256:1b11a555a198b08f5c4baa8f8231c74a366d190755aa4f99aacec5970afe929a"}, + {file = "asyncpg-0.30.0-cp39-cp39-win_amd64.whl", hash = "sha256:8b684a3c858a83cd876f05958823b68e8d14ec01bb0c0d14a6704c5bf9711773"}, + {file = "asyncpg-0.30.0.tar.gz", hash = "sha256:c551e9928ab6707602f44811817f82ba3c446e018bfe1d3abecc8ba5f3eac851"}, +] + +[package.extras] +docs = ["Sphinx (>=8.1.3,<8.2.0)", "sphinx-rtd-theme (>=1.2.2)"] +gssauth = ["gssapi ; platform_system != \"Windows\"", "sspilib ; platform_system == \"Windows\""] +test = ["distro (>=1.9.0,<1.10.0)", "flake8 (>=6.1,<7.0)", "flake8-pyi (>=24.1.0,<24.2.0)", "gssapi ; platform_system == \"Linux\"", "k5test ; platform_system == \"Linux\"", "mypy (>=1.8.0,<1.9.0)", "sspilib ; platform_system == \"Windows\"", "uvloop (>=0.15.3) ; platform_system != \"Windows\" and python_version < \"3.14.0\""] + +[[package]] +name = "click" +version = "8.2.1" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.10" +groups = ["main"] +files = [ + {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, + {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "fastapi" +version = "0.116.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi-0.116.1-py3-none-any.whl", hash = "sha256:c46ac7c312df840f0c9e220f7964bada936781bc4e2e6eb71f1c4d7553786565"}, + {file = "fastapi-0.116.1.tar.gz", hash = "sha256:ed52cbf946abfd70c5a0dccb24673f0670deeb517a88b3544d03c2a6bf283143"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.40.0,<0.48.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=3.1.5)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.18)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] +standard = ["email-validator (>=2.0.0)", "fastapi-cli[standard] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] +standard-no-fastapi-cloud-cli = ["email-validator (>=2.0.0)", "fastapi-cli[standard-no-fastapi-cloud-cli] (>=0.0.8)", "httpx (>=0.23.0)", "jinja2 (>=3.1.5)", "python-multipart (>=0.0.18)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "greenlet" +version = "3.2.4" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.9" +groups = ["main"] +markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")" +files = [ + {file = "greenlet-3.2.4-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8c68325b0d0acf8d91dde4e6f930967dd52a5302cd4062932a6b2e7c2969f47c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:94385f101946790ae13da500603491f04a76b6e4c059dab271b3ce2e283b2590"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f10fd42b5ee276335863712fa3da6608e93f70629c631bf77145021600abc23c"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c8c9e331e58180d0d83c5b7999255721b725913ff6bc6cf39fa2a45841a4fd4b"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58b97143c9cc7b86fc458f215bd0932f1757ce649e05b640fea2e79b54cedb31"}, + {file = "greenlet-3.2.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c2ca18a03a8cfb5b25bc1cbe20f3d9a4c80d8c3b13ba3df49ac3961af0b1018d"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fe0a28a7b952a21e2c062cd5756d34354117796c6d9215a87f55e38d15402c5"}, + {file = "greenlet-3.2.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8854167e06950ca75b898b104b63cc646573aa5fef1353d4508ecdd1ee76254f"}, + {file = "greenlet-3.2.4-cp310-cp310-win_amd64.whl", hash = "sha256:73f49b5368b5359d04e18d15828eecc1806033db5233397748f4ca813ff1056c"}, + {file = "greenlet-3.2.4-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:96378df1de302bc38e99c3a9aa311967b7dc80ced1dcc6f171e99842987882a2"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1ee8fae0519a337f2329cb78bd7a8e128ec0f881073d43f023c7b8d4831d5246"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94abf90142c2a18151632371140b3dba4dee031633fe614cb592dbb6c9e17bc3"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:4d1378601b85e2e5171b99be8d2dc85f594c79967599328f95c1dc1a40f1c633"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0db5594dce18db94f7d1650d7489909b57afde4c580806b8d9203b6e79cdc079"}, + {file = "greenlet-3.2.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2523e5246274f54fdadbce8494458a2ebdcdbc7b802318466ac5606d3cded1f8"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:1987de92fec508535687fb807a5cea1560f6196285a4cde35c100b8cd632cc52"}, + {file = "greenlet-3.2.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:55e9c5affaa6775e2c6b67659f3a71684de4c549b3dd9afca3bc773533d284fa"}, + {file = "greenlet-3.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:9c40adce87eaa9ddb593ccb0fa6a07caf34015a29bf8d344811665b573138db9"}, + {file = "greenlet-3.2.4-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3b67ca49f54cede0186854a008109d6ee71f66bd57bb36abd6d0a0267b540cdd"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddf9164e7a5b08e9d22511526865780a576f19ddd00d62f8a665949327fde8bb"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f28588772bb5fb869a8eb331374ec06f24a83a9c25bfa1f38b6993afe9c1e968"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:5c9320971821a7cb77cfab8d956fa8e39cd07ca44b6070db358ceb7f8797c8c9"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c60a6d84229b271d44b70fb6e5fa23781abb5d742af7b808ae3f6efd7c9c60f6"}, + {file = "greenlet-3.2.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b3812d8d0c9579967815af437d96623f45c0f2ae5f04e366de62a12d83a8fb0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:abbf57b5a870d30c4675928c37278493044d7c14378350b3aa5d484fa65575f0"}, + {file = "greenlet-3.2.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:20fb936b4652b6e307b8f347665e2c615540d4b42b3b4c8a321d8286da7e520f"}, + {file = "greenlet-3.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:a7d4e128405eea3814a12cc2605e0e6aedb4035bf32697f72deca74de4105e02"}, + {file = "greenlet-3.2.4-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:1a921e542453fe531144e91e1feedf12e07351b1cf6c9e8a3325ea600a715a31"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cd3c8e693bff0fff6ba55f140bf390fa92c994083f838fece0f63be121334945"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:710638eb93b1fa52823aa91bf75326f9ecdfd5e0466f00789246a5280f4ba0fc"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:c5111ccdc9c88f423426df3fd1811bfc40ed66264d35aa373420a34377efc98a"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76383238584e9711e20ebe14db6c88ddcedc1829a9ad31a584389463b5aa504"}, + {file = "greenlet-3.2.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23768528f2911bcd7e475210822ffb5254ed10d71f4028387e5a99b4c6699671"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:00fadb3fedccc447f517ee0d3fd8fe49eae949e1cd0f6a611818f4f6fb7dc83b"}, + {file = "greenlet-3.2.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d25c5091190f2dc0eaa3f950252122edbbadbb682aa7b1ef2f8af0f8c0afefae"}, + {file = "greenlet-3.2.4-cp313-cp313-win_amd64.whl", hash = "sha256:554b03b6e73aaabec3745364d6239e9e012d64c68ccd0b8430c64ccc14939a8b"}, + {file = "greenlet-3.2.4-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:49a30d5fda2507ae77be16479bdb62a660fa51b1eb4928b524975b3bde77b3c0"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:299fd615cd8fc86267b47597123e3f43ad79c9d8a22bebdce535e53550763e2f"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c17b6b34111ea72fc5a4e4beec9711d2226285f0386ea83477cbb97c30a3f3a5"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b4a1870c51720687af7fa3e7cda6d08d801dae660f75a76f3845b642b4da6ee1"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:061dc4cf2c34852b052a8620d40f36324554bc192be474b9e9770e8c042fd735"}, + {file = "greenlet-3.2.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:44358b9bf66c8576a9f57a590d5f5d6e72fa4228b763d0e43fee6d3b06d3a337"}, + {file = "greenlet-3.2.4-cp314-cp314-win_amd64.whl", hash = "sha256:e37ab26028f12dbb0ff65f29a8d3d44a765c61e729647bf2ddfbbed621726f01"}, + {file = "greenlet-3.2.4-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:b6a7c19cf0d2742d0809a4c05975db036fdff50cd294a93632d6a310bf9ac02c"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:27890167f55d2387576d1f41d9487ef171849ea0359ce1510ca6e06c8bece11d"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18d9260df2b5fbf41ae5139e1be4e796d99655f023a636cd0e11e6406cca7d58"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:671df96c1f23c4a0d4077a325483c1503c96a1b7d9db26592ae770daa41233d4"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:16458c245a38991aa19676900d48bd1a6f2ce3e16595051a4db9d012154e8433"}, + {file = "greenlet-3.2.4-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9913f1a30e4526f432991f89ae263459b1c64d1608c0d22a5c79c287b3c70df"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b90654e092f928f110e0007f572007c9727b5265f7632c2fa7415b4689351594"}, + {file = "greenlet-3.2.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81701fd84f26330f0d5f4944d4e92e61afe6319dcd9775e39396e39d7c3e5f98"}, + {file = "greenlet-3.2.4-cp39-cp39-win32.whl", hash = "sha256:65458b409c1ed459ea899e939f0e1cdb14f58dbc803f2f93c5eab5694d32671b"}, + {file = "greenlet-3.2.4-cp39-cp39-win_amd64.whl", hash = "sha256:d2e685ade4dafd447ede19c31277a224a239a0a1a4eca4e6390efedf20260cfb"}, + {file = "greenlet-3.2.4.tar.gz", hash = "sha256:0dca0d95ff849f9a364385f36ab49f50065d76964944638be9691e1832e9f86d"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil", "setuptools"] + +[[package]] +name = "h11" +version = "0.16.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86"}, + {file = "h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1"}, +] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "pydantic" +version = "2.11.7" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.33.2" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.33.2" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8"}, + {file = "pydantic_core-2.33.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2"}, + {file = "pydantic_core-2.33.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a"}, + {file = "pydantic_core-2.33.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win32.whl", hash = "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22"}, + {file = "pydantic_core-2.33.2-cp310-cp310-win_amd64.whl", hash = "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7"}, + {file = "pydantic_core-2.33.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef"}, + {file = "pydantic_core-2.33.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30"}, + {file = "pydantic_core-2.33.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win32.whl", hash = "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab"}, + {file = "pydantic_core-2.33.2-cp311-cp311-win_arm64.whl", hash = "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc"}, + {file = "pydantic_core-2.33.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6"}, + {file = "pydantic_core-2.33.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win32.whl", hash = "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_amd64.whl", hash = "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2"}, + {file = "pydantic_core-2.33.2-cp312-cp312-win_arm64.whl", hash = "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f"}, + {file = "pydantic_core-2.33.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d"}, + {file = "pydantic_core-2.33.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e"}, + {file = "pydantic_core-2.33.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win32.whl", hash = "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_amd64.whl", hash = "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9"}, + {file = "pydantic_core-2.33.2-cp313-cp313-win_arm64.whl", hash = "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5"}, + {file = "pydantic_core-2.33.2-cp313-cp313t-win_amd64.whl", hash = "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d"}, + {file = "pydantic_core-2.33.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3"}, + {file = "pydantic_core-2.33.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win32.whl", hash = "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9"}, + {file = "pydantic_core-2.33.2-cp39-cp39-win_amd64.whl", hash = "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c"}, + {file = "pydantic_core-2.33.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb"}, + {file = "pydantic_core-2.33.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039"}, + {file = "pydantic_core-2.33.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27"}, + {file = "pydantic_core-2.33.2.tar.gz", hash = "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "python-dotenv" +version = "1.1.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.1.1-py3-none-any.whl", hash = "sha256:31f23644fe2602f88ff55e1f5c79ba497e01224ee7737937930c448e4d0e24dc"}, + {file = "python_dotenv-1.1.1.tar.gz", hash = "sha256:a8a6399716257f45be6a007360200409fce5cda2661e3dec71d23dc15f6189ab"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-multipart" +version = "0.0.20" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "python_multipart-0.0.20-py3-none-any.whl", hash = "sha256:8a62d3a8335e06589fe01f2a3e178cdcc632f3fbe0d492ad9ee0ec35aab1f104"}, + {file = "python_multipart-0.0.20.tar.gz", hash = "sha256:8dd0cab45b8e23064ae09147625994d090fa46f5b0d1e13af944c331a7fa9d13"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "sqladmin" +version = "0.21.0" +description = "SQLAlchemy admin for FastAPI and Starlette" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "sqladmin-0.21.0-py3-none-any.whl", hash = "sha256:2b1802c49bdd3128c6452625705693cf32d5d33e7db30e63f409bd20a9c05b53"}, + {file = "sqladmin-0.21.0.tar.gz", hash = "sha256:cb455b79eb79ef7d904680dd83817bf7750675147400b5b7cc401d04bda7ef2c"}, +] + +[package.dependencies] +jinja2 = "*" +python-multipart = "*" +sqlalchemy = ">=1.4" +starlette = "*" +wtforms = ">=3.1,<3.2" + +[package.extras] +full = ["itsdangerous"] + +[[package]] +name = "sqlalchemy" +version = "2.0.43" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "SQLAlchemy-2.0.43-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:21ba7a08a4253c5825d1db389d4299f64a100ef9800e4624c8bf70d8f136e6ed"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11b9503fa6f8721bef9b8567730f664c5a5153d25e247aadc69247c4bc605227"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07097c0a1886c150ef2adba2ff7437e84d40c0f7dcb44a2c2b9c905ccfc6361c"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:cdeff998cb294896a34e5b2f00e383e7c5c4ef3b4bfa375d9104723f15186443"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:bcf0724a62a5670e5718957e05c56ec2d6850267ea859f8ad2481838f889b42c"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-win32.whl", hash = "sha256:c697575d0e2b0a5f0433f679bda22f63873821d991e95a90e9e52aae517b2e32"}, + {file = "SQLAlchemy-2.0.43-cp37-cp37m-win_amd64.whl", hash = "sha256:d34c0f6dbefd2e816e8f341d0df7d4763d382e3f452423e752ffd1e213da2512"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70322986c0c699dca241418fcf18e637a4369e0ec50540a2b907b184c8bca069"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:87accdbba88f33efa7b592dc2e8b2a9c2cdbca73db2f9d5c510790428c09c154"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c00e7845d2f692ebfc7d5e4ec1a3fd87698e4337d09e58d6749a16aedfdf8612"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:022e436a1cb39b13756cf93b48ecce7aa95382b9cfacceb80a7d263129dfd019"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c5e73ba0d76eefc82ec0219d2301cb33bfe5205ed7a2602523111e2e56ccbd20"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c2e02f06c68092b875d5cbe4824238ab93a7fa35d9c38052c033f7ca45daa18"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-win32.whl", hash = "sha256:e7a903b5b45b0d9fa03ac6a331e1c1d6b7e0ab41c63b6217b3d10357b83c8b00"}, + {file = "sqlalchemy-2.0.43-cp310-cp310-win_amd64.whl", hash = "sha256:4bf0edb24c128b7be0c61cd17eef432e4bef507013292415f3fb7023f02b7d4b"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:52d9b73b8fb3e9da34c2b31e6d99d60f5f99fd8c1225c9dad24aeb74a91e1d29"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f42f23e152e4545157fa367b2435a1ace7571cab016ca26038867eb7df2c3631"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fb1a8c5438e0c5ea51afe9c6564f951525795cf432bed0c028c1cb081276685"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db691fa174e8f7036afefe3061bc40ac2b770718be2862bfb03aabae09051aca"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2b3b4927d0bc03d02ad883f402d5de201dbc8894ac87d2e981e7d87430e60d"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d3d9b904ad4a6b175a2de0738248822f5ac410f52c2fd389ada0b5262d6a1e3"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-win32.whl", hash = "sha256:5cda6b51faff2639296e276591808c1726c4a77929cfaa0f514f30a5f6156921"}, + {file = "sqlalchemy-2.0.43-cp311-cp311-win_amd64.whl", hash = "sha256:c5d1730b25d9a07727d20ad74bc1039bbbb0a6ca24e6769861c1aa5bf2c4c4a8"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:20d81fc2736509d7a2bd33292e489b056cbae543661bb7de7ce9f1c0cd6e7f24"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:25b9fc27650ff5a2c9d490c13c14906b918b0de1f8fcbb4c992712d8caf40e83"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6772e3ca8a43a65a37c88e2f3e2adfd511b0b1da37ef11ed78dea16aeae85bd9"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a113da919c25f7f641ffbd07fbc9077abd4b3b75097c888ab818f962707eb48"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4286a1139f14b7d70141c67a8ae1582fc2b69105f1b09d9573494eb4bb4b2687"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:529064085be2f4d8a6e5fab12d36ad44f1909a18848fcfbdb59cc6d4bbe48efe"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-win32.whl", hash = "sha256:b535d35dea8bbb8195e7e2b40059e2253acb2b7579b73c1b432a35363694641d"}, + {file = "sqlalchemy-2.0.43-cp312-cp312-win_amd64.whl", hash = "sha256:1c6d85327ca688dbae7e2b06d7d84cfe4f3fffa5b5f9e21bb6ce9d0e1a0e0e0a"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e7c08f57f75a2bb62d7ee80a89686a5e5669f199235c6d1dac75cd59374091c3"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:14111d22c29efad445cd5021a70a8b42f7d9152d8ba7f73304c4d82460946aaa"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21b27b56eb2f82653168cefe6cb8e970cdaf4f3a6cb2c5e3c3c1cf3158968ff9"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c5a9da957c56e43d72126a3f5845603da00e0293720b03bde0aacffcf2dc04f"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d79f9fdc9584ec83d1b3c75e9f4595c49017f5594fee1a2217117647225d738"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9df7126fd9db49e3a5a3999442cc67e9ee8971f3cb9644250107d7296cb2a164"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-win32.whl", hash = "sha256:7f1ac7828857fcedb0361b48b9ac4821469f7694089d15550bbcf9ab22564a1d"}, + {file = "sqlalchemy-2.0.43-cp313-cp313-win_amd64.whl", hash = "sha256:971ba928fcde01869361f504fcff3b7143b47d30de188b11c6357c0505824197"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e6aeb2e0932f32950cf56a8b4813cb15ff792fc0c9b3752eaf067cfe298496a"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:61f964a05356f4bca4112e6334ed7c208174511bd56e6b8fc86dad4d024d4185"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46293c39252f93ea0910aababa8752ad628bcce3a10d3f260648dd472256983f"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:136063a68644eca9339d02e6693932116f6a8591ac013b0014479a1de664e40a"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:6e2bf13d9256398d037fef09fd8bf9b0bf77876e22647d10761d35593b9ac547"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:44337823462291f17f994d64282a71c51d738fc9ef561bf265f1d0fd9116a782"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-win32.whl", hash = "sha256:13194276e69bb2af56198fef7909d48fd34820de01d9c92711a5fa45497cc7ed"}, + {file = "sqlalchemy-2.0.43-cp38-cp38-win_amd64.whl", hash = "sha256:334f41fa28de9f9be4b78445e68530da3c5fa054c907176460c81494f4ae1f5e"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ceb5c832cc30663aeaf5e39657712f4c4241ad1f638d487ef7216258f6d41fe7"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11f43c39b4b2ec755573952bbcc58d976779d482f6f832d7f33a8d869ae891bf"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:413391b2239db55be14fa4223034d7e13325a1812c8396ecd4f2c08696d5ccad"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c379e37b08c6c527181a397212346be39319fb64323741d23e46abd97a400d34"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:03d73ab2a37d9e40dec4984d1813d7878e01dbdc742448d44a7341b7a9f408c7"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8cee08f15d9e238ede42e9bbc1d6e7158d0ca4f176e4eab21f88ac819ae3bd7b"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-win32.whl", hash = "sha256:b3edaec7e8b6dc5cd94523c6df4f294014df67097c8217a89929c99975811414"}, + {file = "sqlalchemy-2.0.43-cp39-cp39-win_amd64.whl", hash = "sha256:227119ce0a89e762ecd882dc661e0aa677a690c914e358f0dd8932a2e8b2765b"}, + {file = "sqlalchemy-2.0.43-py3-none-any.whl", hash = "sha256:1681c21dd2ccee222c2fe0bef671d1aef7c504087c9c4e800371cfcc8ac966fc"}, + {file = "sqlalchemy-2.0.43.tar.gz", hash = "sha256:788bfcef6787a7764169cfe9859fe425bf44559619e1d9f56f5bddf2ebf6f417"}, +] + +[package.dependencies] +greenlet = {version = ">=1", markers = "python_version < \"3.14\" and (platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\")"} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (>=1)"] +aioodbc = ["aioodbc", "greenlet (>=1)"] +aiosqlite = ["aiosqlite", "greenlet (>=1)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (>=1)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (>=1)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5,!=1.1.10)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (>=1)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "starlette" +version = "0.47.3" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "starlette-0.47.3-py3-none-any.whl", hash = "sha256:89c0778ca62a76b826101e7c709e70680a1699ca7da6b44d38eb0a7e61fe4b51"}, + {file = "starlette-0.47.3.tar.gz", hash = "sha256:6bc94f839cc176c4858894f1f8908f0ab79dfec1a6b8402f6da9be26ebea52e9"}, +] + +[package.dependencies] +anyio = ">=3.6.2,<5" +typing-extensions = {version = ">=4.10.0", markers = "python_version < \"3.13\""} + +[package.extras] +full = ["httpx (>=0.27.0,<0.29.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.18)", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.1" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.1-py3-none-any.whl", hash = "sha256:389055682238f53b04f7badcb49b989835495a96700ced5dab2d8feae4b26f51"}, + {file = "typing_inspection-0.4.1.tar.gz", hash = "sha256:6ae134cc0203c33377d43188d4064e9b357dba58cff3185f22924610e70a9d28"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + +[[package]] +name = "uvicorn" +version = "0.35.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "uvicorn-0.35.0-py3-none-any.whl", hash = "sha256:197535216b25ff9b785e29a0b79199f55222193d47f820816e7da751e9bc8d4a"}, + {file = "uvicorn-0.35.0.tar.gz", hash = "sha256:bc662f087f7cf2ce11a1d7fd70b90c9f98ef2e2831556dd078d131b96cc94a01"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.6.3)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "wtforms" +version = "3.1.2" +description = "Form validation and rendering for Python web development." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wtforms-3.1.2-py3-none-any.whl", hash = "sha256:bf831c042829c8cdbad74c27575098d541d039b1faa74c771545ecac916f2c07"}, + {file = "wtforms-3.1.2.tar.gz", hash = "sha256:f8d76180d7239c94c6322f7990ae1216dae3659b7aa1cee94b6318bdffb474b9"}, +] + +[package.dependencies] +markupsafe = "*" + +[package.extras] +email = ["email-validator"] + +[metadata] +lock-version = "2.1" +python-versions = ">=3.11" +content-hash = "21a35caa29ba269d21d8b22f161f5828f99ab497c5d687f013eda16461478541" diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b399a8c --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,22 @@ +[project] +name = "donat-admin" +version = "0.1.0" +description = "" +authors = [ + {name = "harold",email = "tihon414@gmail.com"} +] +readme = "README.md" +requires-python = ">=3.11" +dependencies = [ + "sqladmin (>=0.21.0,<0.22.0)", + "sqlalchemy (>=2.0.43,<3.0.0)", + "fastapi (>=0.116.1,<0.117.0)", + "uvicorn (>=0.35.0,<0.36.0)", + "python-dotenv (>=1.1.1,<2.0.0)", + "asyncpg (>=0.30.0,<0.31.0)" +] + + +[build-system] +requires = ["poetry-core>=2.0.0,<3.0.0"] +build-backend = "poetry.core.masonry.api" diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/__pycache__/__init__.cpython-311.pyc b/src/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fca1853c633aa6f99e99dd6277b4fb1a049b5fd4 GIT binary patch literal 174 zcmZ3^%ge<81Sjp+XMpI(AOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFGu~1{M=Oi zjKre+oD_YR{N&Qy)Vz{n{gnK?#FEtbg2bG({Gwb4S2r;wH#1MaxF}gaK0Y%qvm`!V oub}c5hfQvNN@-52T@fqLM39}u{6OLZGb1D82L>2X#0(Sz0JkHq)$ literal 0 HcmV?d00001 diff --git a/src/__pycache__/main.cpython-311.pyc b/src/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2625347c300744232beaec1c513a94d73f8d36b GIT binary patch literal 2629 zcmd5-&1>UE6o0ZKf6I;?$BsX;&KH~YLgTjd*cQ@;g+kK?vTR_Wgjs9ih}B5$NNz|! zXj%&0|De~NQc4T`S0vEE=oBbD^yacX?Wr^Ra5f1A9eU_6{`tM%`^}rtd$Q*zMJWIu zpX~p3`lbx_{oeSykI4(tUzL$fFw*s`9Z zd6cIGRG>vvq$O0M3Q}kpm4kRjuh2!bNUNwyYp6z-&=ReqI$cJ~w1FD5iJEi;tIQ4G`YOGL?n#gWB3<&M{t}-XP>*wI(j(blbC)R|;h%7zHL~{OdhEUW zP2@|7EBPlJ68x*On^@UNtZXM%wh}8>5-XdDm5s#8<;2Q*V&zg|Wi7F?npnA*SeZ|( zEF@MI6Dv!Jl}ch|`LDD4i1=ESgLzZw{a z#IiKg*vHQZ>u3D@9>IDL@JsJu9UDUuc?bBMl4!NxeykbK%#)KN%|2BbKHDeusi}s_ z`mI>Vt{mEoU`m+vzDcPTY#K!RioX=cJ~njCh&F7-Xyz zPPyq;1IZz=ZOs^k`&S-mx=q-T$)aNxLn4aqn<`=0=9P$uJ=4H8x!$$-7&Cs1Fj@$r zp?>AS^J6NC{!xF!&z|sh;jzZjynTMo z`c%iFX-xd%`&Ek#cLIM0haF`6W&po&&C`i)Ytb$&b8As_3YO(O%L&K}5cdo#3Mg^# z7q7FO1qEk{h?NCY1S|@u3aANK5>OYgETAEvDPToFi-TVmDOGIar`RGpVGS(S7V(aV z%fUnWIjpM3pK0XmXL!MBc=^uY)TCr^ikYdagFSON5ig!KP=l5nkFkDYG8($C1vv(M zrvb&9u`@n@nR}a>>O?2+vOdoyE)eSve&Nj0k|a%`7^l*A;h`72hV$H;E^K+Q<-pdQ+IHcA2M?ThvTgpl{{zTu BM{xiE literal 0 HcmV?d00001 diff --git a/src/admin/__init__.py b/src/admin/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/admin/__init__.py @@ -0,0 +1 @@ + diff --git a/src/admin/__pycache__/__init__.cpython-311.pyc b/src/admin/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..008b771d8257e2d36345316840d438b2f1a3278a GIT binary patch literal 180 zcmZ3^%ge<81fRUtXD|Zk#~=<2fCNC`GaHbY&XB?o%%I8Wx00cV2_y)T`Q@&kk)NBY zpOILUpOd2RlAm0fo0?Zrte=vfmspY-UyzuSmS2<$;p!%)MqT10io=POE-WS!;TY#en;5UZ@NAOQFbvEIeq`+H;8uh2H0&xk);r1 zsZ_IcqF4q|A&X{ZiEicS$g|{ju^-?<;-BKtKX7q?o4R%Ce|AmP8Ux*lE#T89eyTN2 z3~Pd9;C5L#+An*Nc&^V4u#&mHNNkNa@Vp3^OXdKCf^xA{7%1oJx2melJDlPUB{uFn zUa3yXoNfEqqqZ&cw(SKZWHBDK?e!3|RKw$@$V}QesmDTDNK|bWa?GUeI)N{94#aH+ zd^0Udb%``s0L_*L^{~tMNF1i%1T6G?o4KMRr~8bcm^&@J2DuY?K5UbIk@8F<;GRui zI4mSkcIqMIWZ#w01`b)r76I>kLPv4aj+e|<;8C-MdBBKS51i1WFnW^&K18+Kn8h(u zb{@xlGzE9e6yfw$)Y_Xo3&9c+1JMA|J^6aYa(C&VFx9R1Cd%D=y+Q@hSh;)WV6yb~ z>bs4dm%Gh9@7wDBjR(=hLoldZ-0^l-_nt8z%QRH6eT_uwrggGp~y ziZdi>%7Bh@*VED88s0s0DH`5~nSx>-qQA-Oh4;&e N{AaBE^$&}ruHVnKEeHSr literal 0 HcmV?d00001 diff --git a/src/admin/__pycache__/multi_engine.cpython-311.pyc b/src/admin/__pycache__/multi_engine.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6f100965ae14b435dcf47bd3212db93f25c94e9 GIT binary patch literal 1802 zcmdUu&u<$=6vyBC_xks5JN^-;MWQuOn@c4Q2&pCF0trE>h%^$4rrwFY>dtPMU903$ zuH|Nl13q%02o;Hcgo8myM01M7iQA%b>WO)?c9bAEa$q(4+3$PvcHWy`-xdm4P|qiO zKg@ni0{n)?<}uge#eo6v6O2CK28VqLSL+0<-l zwl%jjJDOe1o@QTjTXUe9VF@*wshQQxu>{Mjx4;s1{2Sx@)HAhy&(#|}YS!sP7-oJ) zb7;sa_0QbNvCn+p_FPUMF)@tG5}i!Exf}S$%$?dUlciI7#@Q7|@v&`9*=4{mE%OKK zko(kUGO^33Bh&Y(L){6J>2;@UJh0tI-pR?49n362AMdeX=2^1zH@B=E27*z}g#WI` zxvi@k#$@_lRG7@Kg^$^WMVUK_>WPxSXFE)$B9~0=dM*uQ>H!t1Vwu$@JD^i0vwNP! z1P#>GWlH@NFd?(i_sA2L%zy0J6L!dgz;>rH^8t0IbNsKM{g-BSQ*4w`4_(~&K6D+m zf@-Og4{g`-_lGxS)Bn_=&Sb{;*@%4>jPxGZo`|bGk#%28Mivd|Lp8HewEn(Gs4k)I z2#6F0HLeA1HbK93qb>D5%_5hxa$DEQ%OW!iehytoK=zvA=?-B5H^_ zqJd~4T8K7c3(-Mz5j{j-L00Zr+;$J6)3%4FO_~$WJ+Y^A!M=kRDh6J@Kc0D|2RVa9y}Q~pnxg2t^?{nel9w|}YM zUP0voD!)SaXXu8pZZ36^DJ=$JQmHTtX5pzD=1}LsEG>#*0d*0~;?pN#33WO0S5Q~M ztS$D#8tQta8>pL6Obc~8@^7K;fZ15MVHb4|%*tXE_EB$x*<3sc2dH@N4i8>nxB z*;*FES5Uu(wRz#|sNVpytZKf4dKBp~>NmmMUVeU_X)OomneOs9yo+8y#KGwO0evI( NCnCHKaZ4S^zW`Pl@1g(z literal 0 HcmV?d00001 diff --git a/src/admin/__pycache__/payment.cpython-311.pyc b/src/admin/__pycache__/payment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf456dbc54f2fe662b9b53e611002ed0c0898462 GIT binary patch literal 3542 zcmc&$%Wo4$7~i$mYbSPIb{>%C)c_3^IHoB=KvTpcB9uo+OH`^=+hy(9#0&c{J8MPp zDF^-l4oGn5A*UA9O6AZ4haP(5xQ9JNdqV1|x6p9n)bE>JW5?@CprUrX`}55Ao7aB7 z`DW(Fo}O+F(#Ex4DpOq?_XidlNenZ)e?jIUM>xXkoWV;xkNKD$GvZR*5G27!NC`uf zL?bCBjg*w)xfr*|k@!812r93}e@^@$aNJMu21)8-ya;>}cp<`fGd=};7x0M)pJseF z@M+-12%lkm2KXM}lM%j$@x8$J0iTNSy`=vJmml~Or<>>fu4@)i^{+H_JumvnWo5%q zO~)4&R7Llb=M`Ns%c|eEqM3KB)zzDtQz5pp?hmyYuBlGNB7W|MW2=gx+Vp~D7#gLT zWtKz7u)l_zc5Ns=G~ zNSS|Xvlf$jNJ8o*B7Anz&xD_Nju@KxIvtki)WUfiC+DXcmiq9jQlOTuktxU+mZ@$O zN}8@eiTT}S_)145vf`{P<@@}UESvDvvg~)uvSE>$j`@r%->oTn$fU~9V$HHQd;u+f zn%S#*%?3vcTG=wg@hzLEwyY69O+#m5K~xN@W;%8s&M{rK^qOJHx<(y;I4n?AvC9>u z1YPMRjKKYOfB1a!tJ8VUSBL$EJH0;6x-5CaltCrP<2`)mIA}r~?d;g*mF@Ha$mK@8+<~o| z-l3DvW`3J}KI2{f#?5{U?8G5&V)kj$J9fbxUvP!d?a^6R7zrMGqA?7t*97=i)jKaL z6YBk!iwYK$=yzeLu+?N|aGnVOKY>PCA8K7f6~!d9qTErJ^1XIHRvkddBIFPT5rzA8DfQVw_sMsM?>>w&O z?d6UMY=wz`VZ*!vmBg z*nT$JCQxv+x5(7jkY_5O>ium7TFMZ4Z-X^&4*tZWOFlhu9Q%Q}=hN78) zIBgqU5i27U;HBpPB9e@uBnMHFNtEO;Na7aGdxa%;S@o80Gs`g)Wp48d{({{N``qLE zI2bVPUIh4ezF&(=>CoT%I^3C>-uAnjHz_~e%+q?V)yJ?0mEifNula&coU)Q=ETlR8#ia0#W!0?>`U1#g`J1E zAF}Xe3x>_PZBKrknh!2;XYA8ZnTMC&1B4m!{5Ch??tNZxHTPYf9Wlulcep6rKee^U z>@Sgg)vPfn@@ICqDBSPb8f5mDNWN;;$ci{Z6oL`JjtyXhH#M>;Y!HP2bj7fXHs literal 0 HcmV?d00001 diff --git a/src/admin/__pycache__/widget.cpython-311.pyc b/src/admin/__pycache__/widget.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc11e973086dcc0808910a0b8168e928c4fc024c GIT binary patch literal 7798 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 bool: + form = await request.form() + username, password = form['username'], form['password'] + async with db_helper.get_async_session_not_closed() as session: + user_model = await auth_crud.get_user_by_login( + login=username, + session=session, + ) + + if not check_password( + plain_password=password, + hashed_password=user_model.hashed_password, # type:ignore + ): + raise NotAuthenticated() + + if user_model.role != 'Админ': + raise PermissionDenied() + + jwt_token = create_access_token( + user=user_model + ) + + request.session.update({'token': jwt_token.access_token}) + + return True + + async def logout(self, request: Request) -> bool: + request.session.clear() + return True + + async def authenticate(self, request: Request) -> bool | RedirectResponse: + token = request.session.get('token') + + if not token: + request.session.clear() + return RedirectResponse( + url=str(request.url) + "login", + ) + try: + parse_jwt_token(token=token) + + except JWTError: + request.session.clear() + return RedirectResponse( + url=str(request.url) + "login", + ) + + return True + + +authentication_backend = AdminAuth(secret_key=settings.JWT.SECRET) \ No newline at end of file diff --git a/src/admin/multi_engine.py b/src/admin/multi_engine.py new file mode 100644 index 0000000..b075f8c --- /dev/null +++ b/src/admin/multi_engine.py @@ -0,0 +1,41 @@ +from sqlalchemy.ext.asyncio import async_sessionmaker + +from src.database.engines import accounts_engine, payments_engine, widgets_engine +from src.database.payments import PaymentsBase, Deal, Balance, Payment, TinkoffWithdrawMethod, TinkoffWithdraw, \ + StreamersCommission +from src.database.streamers import Account, AccountsBase +from src.database.widgets import WidgetsBase, File, Widget, Donat, Target, DonatePage, Moderation, Filter, FilterWord, \ + VoiceSetting, Language, VoiceLanguage, StreamerWidgetPage, StreamerOnline + +AdminSessionMaker = async_sessionmaker() + +AdminSessionMaker.configure( + binds={ + # Модели для accounts_engine (если есть) + Account: accounts_engine, + + # Модели для widgets_engine + File: widgets_engine, + Widget: widgets_engine, + Donat: widgets_engine, + Target: widgets_engine, + DonatePage: widgets_engine, + Moderation: widgets_engine, + Filter: widgets_engine, + FilterWord: widgets_engine, + VoiceSetting: widgets_engine, + Language: widgets_engine, + VoiceLanguage: widgets_engine, + StreamerWidgetPage: widgets_engine, + StreamerOnline: widgets_engine, + + # Payment + + Deal: payments_engine, + Balance: payments_engine, + Payment: payments_engine, + TinkoffWithdrawMethod: payments_engine, + TinkoffWithdraw: payments_engine, + StreamersCommission: payments_engine, + } +) diff --git a/src/admin/payment.py b/src/admin/payment.py new file mode 100644 index 0000000..eefa571 --- /dev/null +++ b/src/admin/payment.py @@ -0,0 +1,60 @@ +from sqladmin import ModelView + +from src.database.payments import Payment, Deal, Balance, TinkoffWithdraw, TinkoffWithdrawMethod, StreamersCommission + + +class PaymentAdmin(ModelView, model=Payment): + category = "Payments DB" + name = "Payment" + name_plural = "Payments" + icon = "fa-solid fa-money-bill" + column_list = [Payment.order_id, Payment.streamer_id, Payment.amount, Payment.created_at] + column_searchable_list = [Payment.order_id, Payment.streamer_id] + column_default_sort = ("created_at", True) + + +class DealAdmin(ModelView, model=Deal): + category = "Payments DB" + name = "Deal" + name_plural = "Deals" + icon = "fa-solid fa-handshake" + column_list = [Deal.deal_id, Deal.streamer_id, Deal.amount, Deal.open_status] + column_searchable_list = [Deal.deal_id, Deal.streamer_id] + + +class BalanceAdmin(ModelView, model=Balance): + category = "Payments DB" + name = "Balance Op" + name_plural = "Balance Ops" + icon = "fa-solid fa-scale-balanced" + column_list = [Balance.id, Balance.streamer_id, Balance.operation_type, Balance.balance_diff, Balance.created_at] + column_default_sort = ("created_at", True) + + +class TinkoffWithdrawAdmin(ModelView, model=TinkoffWithdraw): + category = "Payments DB" + name = "Tinkoff Withdraw" + name_plural = "Tinkoff Withdraws" + icon = "fa-solid fa-credit-card" + column_list = [TinkoffWithdraw.order_id, TinkoffWithdraw.streamer_id, TinkoffWithdraw.status, + TinkoffWithdraw.amount] + column_searchable_list = [TinkoffWithdraw.order_id, TinkoffWithdraw.streamer_id] + column_default_sort = ("created_at", True) + + +class TinkoffWithdrawMethodAdmin(ModelView, model=TinkoffWithdrawMethod): + category = "Payments DB" + name = "Withdraw Method" + name_plural = "Withdraw Methods" + icon = "fa-solid fa-wallet" + column_list = [TinkoffWithdrawMethod.id, TinkoffWithdrawMethod.streamer_id, TinkoffWithdrawMethod.type, + TinkoffWithdrawMethod.is_main] + + +class StreamersCommissionAdmin(ModelView, model=StreamersCommission): + category = "Payments DB" + name = "Commission" + name_plural = "Commissions" + icon = "fa-solid fa-percent" + column_list = [StreamersCommission.streamer_id, StreamersCommission.withdraw_comission_sbp, + StreamersCommission.withdraw_comission_card] \ No newline at end of file diff --git a/src/admin/widget.py b/src/admin/widget.py new file mode 100644 index 0000000..00a80bd --- /dev/null +++ b/src/admin/widget.py @@ -0,0 +1,118 @@ +from sqladmin import ModelView + +from src.database.engines import widgets_engine +from src.database.widgets import Widget, File, Donat, Target, DonatePage, Moderation, Filter, FilterWord, VoiceSetting, \ + Language, VoiceLanguage, StreamerWidgetPage, StreamerOnline + + +class FileAdmin(ModelView, model=File): + engine = widgets_engine + category = "Widgets DB" + name = "File" + name_plural = "Files" + icon = "fa-solid fa-file-zipper" + column_list = [File.id, File.file_name, File.file_type, File.streamer_id, File.created_at] + column_searchable_list = [File.file_name] + +class WidgetAdmin(ModelView, model=Widget): + engine = widgets_engine + category = "Widgets DB" + name = "Widget" + name_plural = "Widgets" + icon = "fa-solid fa-puzzle-piece" + column_list = [Widget.id, Widget.name, Widget.streamer_id, Widget.is_active, Widget.min_amount] + column_searchable_list = [Widget.name] + +class DonatAdmin(ModelView, model=Donat): + engine = widgets_engine + category = "Widgets DB" + name = "Donat" + name_plural = "Donats" + icon = "fa-solid fa-gift" + column_list = [Donat.id, Donat.donat_user, Donat.amount, Donat.streamer_id, Donat.status, Donat.created_at] + column_searchable_list = [Donat.donat_user, Donat.text] + column_default_sort = ("created_at", True) + +class TargetAdmin(ModelView, model=Target): + engine = widgets_engine + category = "Widgets DB" + name = "Target" + name_plural = "Targets" + icon = "fa-solid fa-bullseye" + column_list = [Target.id, Target.text, Target.amount, Target.collected, Target.streamer_id] + +class DonatePageAdmin(ModelView, model=DonatePage): + engine = widgets_engine + category = "Widgets DB" + name = "Donate Page" + name_plural = "Donate Pages" + icon = "fa-solid fa-palette" + column_list = [DonatePage.id, DonatePage.streamer_login, DonatePage.streamer_id] + column_searchable_list = [DonatePage.streamer_login] + +class ModerationAdmin(ModelView, model=Moderation): + engine = widgets_engine + category = "Widgets DB" + name = "Moderation" + name_plural = "Moderation" + icon = "fa-solid fa-user-shield" + column_list = [c.name for c in Moderation.__table__.c] + +class FilterAdmin(ModelView, model=Filter): + engine = widgets_engine + category = "Widgets DB" + name = "Filter" + name_plural = "Filters" + icon = "fa-solid fa-filter" + column_list = [c.name for c in Filter.__table__.c] + +class FilterWordAdmin(ModelView, model=FilterWord): + engine = widgets_engine + category = "Widgets DB" + name = "Filter Word" + name_plural = "Filter Words" + icon = "fa-solid fa-comment-slash" + column_list = [FilterWord.id, FilterWord.word, FilterWord.donat_filter_id] + column_searchable_list = [FilterWord.word] + +class VoiceSettingAdmin(ModelView, model=VoiceSetting): + engine = widgets_engine + category = "Widgets DB" + name = "Voice Setting" + name_plural = "Voice Settings" + icon = "fa-solid fa-microphone-lines" + column_list = [VoiceSetting.id, VoiceSetting.streamer_id, VoiceSetting.enable, VoiceSetting.min_price] + +class LanguageAdmin(ModelView, model=Language): + engine = widgets_engine + category = "Widgets DB" + name = "Language" + name_plural = "Languages" + icon = "fa-solid fa-language" + column_list = [Language.id, Language.ru_name, Language.en_name, Language.iso_code] + column_searchable_list = [Language.ru_name, Language.en_name, Language.iso_code] + +class VoiceLanguageAdmin(ModelView, model=VoiceLanguage): + engine = widgets_engine + category = "Widgets DB" + name = "Voice Language" + name_plural = "Voice Languages" + icon = "fa-solid fa-link" + column_list = [c.name for c in VoiceLanguage.__table__.c] + +class StreamerWidgetPageAdmin(ModelView, model=StreamerWidgetPage): + engine = widgets_engine + category = "Widgets DB" + name = "Streamer Widget Page" + name_plural = "Streamer Widget Pages" + icon = "fa-solid fa-desktop" + column_list = [c.name for c in StreamerWidgetPage.__table__.c] + +class StreamerOnlineAdmin(ModelView, model=StreamerOnline): + engine = widgets_engine + category = "Widgets DB" + name = "Streamer Online" + name_plural = "Streamers Online" + icon = "fa-solid fa-signal" + column_list = [StreamerOnline.streamer_id, StreamerOnline.created_at] + column_default_sort = ("created_at", True) \ No newline at end of file diff --git a/src/database/__init__.py b/src/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/database/__pycache__/__init__.cpython-311.pyc b/src/database/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1019b07fd2d83803549bf6351935b6dd17076576 GIT binary patch literal 183 zcmZ3^%ge<81Xt|WXMpI(AOZ#$p^VRLK*n^26oz01O-8?!3`I;p{%4TnFE9O!{M=Oi zjKre+oD_YR{N&Qy)Vz{n{gnK?#FEtbg2bG({Gwb4S2r;wH#1MaxF}gaC9xziDX}XlMW?zn;KClZM1Mk%tfR!uWL-d)N zUCi-?9AC=uYK|{+ULnOCx|E@%9J-vLJO>o8sRD8de=5eYu>u;wy? zBI2O17q|`yPTK)VwHLc@p6wsLI&zwioa2{I)9UMk=9B$-tnKdYJwKic>XlTYVX98c zGV!kIt?WOi+ZxQ)i=z6VaD1}zjJO}+)h>>^!3ewz8P1C#%fM8RzdB4Vr*Q}zR?&M d4Ux5;=tW$KcF44`p#WJ=`^st_E-Eyew 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 literal 0 HcmV?d00001 diff --git a/src/database/__pycache__/streamers.cpython-311.pyc b/src/database/__pycache__/streamers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c14d4bb3ac4de7279451b16950f163e28678365 GIT binary patch literal 2333 zcmbtVO>7fK6rNr0uGjww2@VdSxS}m}TgNTf6ewyE6lg<~s1oUAFRP7b+!*%9%&vi0 zJ@~-Eha8L)i5xklw21^qj$C`QB_FIkRqClXqvXV?Z+2}GCxru@-Tmgxyf^Q?dGp@v zZ?RYyLHpyz^R;UNLVvTtpox8Aj{@-oVT3syDXiyp&fpc^2q*zVPy|C%M2^h|bjb)R zK|@w#Bcy~l#G@Y&79JrilHhg#p&j`Ari4A71iT;#AK^tXcN=Bof0*cUMsS4{^3ZVw zhhb=CVd=*0mAR##T%lAoix+QA@|Ud8=482x!V-%hVjARy4h2QNtf*HEfj4oK1^4tU1~$Sj*WC zC18r$)0K4^0gWESfUpw)^|wz~kn8hwWFRrLy&%l8wl~Qi-rmn}hDv}(M8N!RU>kz4 zGYAAyL?V%3%3lXaWGq~Ro=KAs=CQad9XY2ktcVP)2p(D??#kO>eFr|jDbZu{p+oZg zZup3NjLG9j4R$kRC3!)!Y#ffdG*&X=&rks3_7h}u|JWe7d9-n+9C`lZF8cVvt zeyY2&*3bEs4Ch8Fv}|Z}UA;@zUA~NOW_VYsn&o>{;>u=K*R@rhxT0?TQZ_RjJq5a5 zxuV(j1B+sqn1G38S0sj3)@xs#zff4cuzDq5%#s4Rl+9lu`RtWa{_8BheEFMv>C(ju zm-FAAzj~Dwc!u}2#ce|G6RKiT(yF@SO4@y>5DLD@PT3$e%Oq~N2&Li>tZGgs;4Pz5 zo+p-Btw2G6gx@m>SE9tJQnUCr<3W_s>`vNaW%LC7ita$~H;4|m3|nDm304K0=p~!U zr|Br58&p*&RaLDe`VpM&Ph@~=vum}Ex{0xkT1!rORhpTgQJAHylqtJ*+?c9D(d)#& zKxl|Dk_=?V4U|pCO{l77nwA5Xn`PRnN}0EwPi_Fr(@8cw&48r=J;Q)q+*AT^1E%$W zo@JEG!odPZKW5xd8L;cbzdzW9=-2?*$bJr6J-BONE8`#4m;OqgYZ@88_~y49Xo>`W~7g2HL(H3HaYP`}x@*}S;1*h7LS zc>p}1!YF(7*-}>?ZG^V+Ejitm(;YeOX*=6=HXlB&ZPq|lmZ{1zRavQit0^@fb|yaW zjATAUU3WCq9N#?kcye>H7ZRCffPDtTnnmU)0Pul|bK>OISPwz>PVmo?9b+a+zl6>W z+xK)$FRl?|-A^1ZNe=QOe!!oGpAu!i4KMlpT=f1vURn&N${YEb{}240PQwaT6!xD0 zy#U8?U6iPMPfrjz9=7m75J%i~u7&2__4Xu=3qd4~L38Fco83QP$tezEb{rb|Yc{+8 JA1p7D{{q1C86^M! literal 0 HcmV?d00001 diff --git a/src/database/__pycache__/widgets.cpython-311.pyc b/src/database/__pycache__/widgets.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6868a0e6f7bae0dcc2bb907335a6a30ac21133f4 GIT binary patch literal 17546 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 str: + return self.login \ No newline at end of file diff --git a/src/database/widgets.py b/src/database/widgets.py new file mode 100644 index 0000000..48c8f25 --- /dev/null +++ b/src/database/widgets.py @@ -0,0 +1,192 @@ +import datetime +from uuid import UUID as PyUUID + +from fastapi import FastAPI +from sqlalchemy import ( + String, + Text, + text, + Boolean, + Float, + ForeignKey, + TIMESTAMP, + Integer, + func, +) +from sqlalchemy.dialects.postgresql import UUID as PG_UUID +from sqlalchemy.ext.asyncio import create_async_engine +from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship + + +class WidgetsBase(DeclarativeBase): + pass + + +class File(WidgetsBase): + __tablename__ = "files" + id: Mapped[PyUUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, + server_default=text("uuid_generate_v4()")) + file_type: Mapped[str] = mapped_column(String(30)) + file_name: Mapped[str] = mapped_column(String(50)) + extension: Mapped[str] = mapped_column(String(10)) + streamer_id: Mapped[int] = mapped_column() + entity: Mapped[str] = mapped_column(String(50), server_default=text("'widget'")) + created_at: Mapped[datetime.datetime | None] = mapped_column(TIMESTAMP, server_default=func.now()) + size: Mapped[float] = mapped_column(Float, server_default=text("0")) + + def __str__(self): return self.file_name + + +class Widget(WidgetsBase): + __tablename__ = "widgets" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_id: Mapped[int] = mapped_column() + template_id: Mapped[int | None] = mapped_column() + group_id: Mapped[int] = mapped_column(server_default=text("1")) + is_active: Mapped[bool] = mapped_column(server_default=text("true")) + name: Mapped[str] = mapped_column(String(50)) + image_id: Mapped[PyUUID | None] = mapped_column("image", ForeignKey("files.id", ondelete="CASCADE")) + audio_id: Mapped[PyUUID | None] = mapped_column("audio", ForeignKey("files.id", ondelete="CASCADE")) + duration: Mapped[int] = mapped_column() + min_amount: Mapped[int] = mapped_column() + max_amount: Mapped[int] = mapped_column() + # volume_percent: Mapped[int] = mapped_column(server_default=text("75")) + created_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP, server_default=func.now()) + updated_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP, server_default=func.now(), onupdate=func.now()) + + def __str__(self): return self.name + + +class Donat(WidgetsBase): + __tablename__ = "donats" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_id: Mapped[int] = mapped_column() + widget_id: Mapped[int] = mapped_column(ForeignKey("widgets.id")) + order_id: Mapped[PyUUID] = mapped_column(PG_UUID(as_uuid=True)) + target_id: Mapped[int | None] = mapped_column() + paid_time: Mapped[datetime.datetime | None] = mapped_column(TIMESTAMP) + is_test: Mapped[bool | None] = mapped_column(server_default=text("false")) + # media_url: Mapped[str | None] = mapped_column(String(255)) + status: Mapped[str] = mapped_column(String(50), server_default=text("'pending'")) + text: Mapped[str] = mapped_column(Text) + amount: Mapped[int] = mapped_column() + donat_user: Mapped[str] = mapped_column(Text) + accepted_time: Mapped[datetime.datetime | None] = mapped_column(TIMESTAMP) + rejected_time: Mapped[datetime.datetime | None] = mapped_column(TIMESTAMP) + show_name: Mapped[bool] = mapped_column(default=True) + show_text: Mapped[bool] = mapped_column(default=True) + play_content: Mapped[bool] = mapped_column(default=True) + showed_time: Mapped[datetime.datetime | None] = mapped_column(TIMESTAMP) + created_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=func.now()) + updated_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=func.now(), + onupdate=func.now()) + + def __str__(self): return f"Donat from {self.donat_user} for {self.amount}" + + +class Target(WidgetsBase): + __tablename__ = "targets" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_id: Mapped[int] = mapped_column() + text: Mapped[str] = mapped_column(Text) + amount: Mapped[int] = mapped_column() + collected: Mapped[int | None] = mapped_column(default=0) + created_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=func.now()) + updated_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=func.now(), + onupdate=func.now()) + + def __str__(self): return self.text + + +class DonatePage(WidgetsBase): + __tablename__ = "donate_pages" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_login: Mapped[str] = mapped_column(String) + streamer_id: Mapped[int] = mapped_column() + description: Mapped[str | None] = mapped_column(Text, server_default=text("''")) + text_after_donat: Mapped[str | None] = mapped_column(Text, server_default=text("''")) + avatar_id: Mapped[PyUUID | None] = mapped_column("avatar", ForeignKey("files.id", ondelete="CASCADE")) + background_img_id: Mapped[PyUUID | None] = mapped_column("background_img", + ForeignKey("files.id", ondelete="CASCADE")) + head_img_id: Mapped[PyUUID | None] = mapped_column("head_img", ForeignKey("files.id", ondelete="CASCADE")) + profile_avatar: Mapped[bool] = mapped_column(server_default=text("true")) + page_background: Mapped[str | None] = mapped_column(Text, server_default=text("'#13161E'")) + + def __str__(self): return self.streamer_login + + +class Moderation(WidgetsBase): + __tablename__ = "moderation" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_id: Mapped[int] = mapped_column() + enable: Mapped[bool | None] = mapped_column(server_default=text("false")) + duration: Mapped[int] = mapped_column(server_default=text("40")) + + def __str__(self): return f"Moderation for {self.streamer_id}" + + +class Filter(WidgetsBase): + __tablename__ = "filters" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_id: Mapped[int] = mapped_column() + enable_links: Mapped[bool | None] = mapped_column(server_default=text("false")) + + def __str__(self): return f"Filter for {self.streamer_id}" + + +class FilterWord(WidgetsBase): + __tablename__ = "filters_words" + id: Mapped[int] = mapped_column(primary_key=True) + donat_filter_id: Mapped[int] = mapped_column(ForeignKey("filters.id")) + word: Mapped[str] = mapped_column(Text) + + def __str__(self): return self.word + + +class VoiceSetting(WidgetsBase): + __tablename__ = "voice_settings" + id: Mapped[int] = mapped_column(primary_key=True) + streamer_id: Mapped[int] = mapped_column() + enable: Mapped[bool | None] = mapped_column(server_default=text("false")) + voice_speed: Mapped[str] = mapped_column(String, server_default=text("'medium'")) + scenery: Mapped[str | None] = mapped_column(Text, server_default=text("'after_donat'")) + voice_sound_percent: Mapped[int] = mapped_column() + min_price: Mapped[int] = mapped_column() + + def __str__(self): return f"Voice settings for {self.streamer_id}" + + +class Language(WidgetsBase): + __tablename__ = "languages" + id: Mapped[int] = mapped_column(primary_key=True) + iso_code: Mapped[str | None] = mapped_column(Text, server_default=text("''")) + ru_name: Mapped[str | None] = mapped_column(Text, server_default=text("''")) + en_name: Mapped[str | None] = mapped_column(Text, server_default=text("''")) + + def __str__(self): return self.ru_name or self.en_name or self.iso_code + + +class VoiceLanguage(WidgetsBase): + __tablename__ = "voices_languages" + id: Mapped[int] = mapped_column(primary_key=True) + voice_setting_id: Mapped[int] = mapped_column(ForeignKey("voice_settings.id")) + language_id: Mapped[int] = mapped_column(ForeignKey("languages.id")) + + +class StreamerWidgetPage(WidgetsBase): + __tablename__ = "streamers_widgets_pages" + id: Mapped[PyUUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, + server_default=text("uuid_generate_v4()")) + streamer_id: Mapped[int] = mapped_column() + + def __str__(self): return f"Widget page for {self.streamer_id}" + + +class StreamerOnline(WidgetsBase): + __tablename__ = "streamers_online" + id: Mapped[PyUUID] = mapped_column(PG_UUID(as_uuid=True), primary_key=True, + server_default=text("uuid_generate_v4()")) + streamer_id: Mapped[int] = mapped_column() + created_at: Mapped[datetime.datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=func.now()) + + def __str__(self): return f"Online status for {self.streamer_id}" diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..4240979 --- /dev/null +++ b/src/main.py @@ -0,0 +1,38 @@ +from fastapi import FastAPI +from sqladmin import Admin + +from src.admin.account import AccountAdmin +from src.admin.multi_engine import AdminSessionMaker +from src.admin.payment import DealAdmin, BalanceAdmin, PaymentAdmin, TinkoffWithdrawMethodAdmin, TinkoffWithdrawAdmin, \ + StreamersCommissionAdmin +from src.admin.widget import StreamerOnlineAdmin, StreamerWidgetPageAdmin, VoiceLanguageAdmin, LanguageAdmin, \ + VoiceSettingAdmin, FilterWordAdmin, FilterAdmin, ModerationAdmin, DonatePageAdmin, TargetAdmin, DonatAdmin, \ + WidgetAdmin, FileAdmin +from src.database.engines import payments_engine + +app = FastAPI() +admin = Admin( + app=app, + session_maker=AdminSessionMaker, +) +admin.add_view(AccountAdmin) + +admin.add_view(FileAdmin) +admin.add_view(WidgetAdmin) +admin.add_view(DonatAdmin) +admin.add_view(TargetAdmin) +admin.add_view(DonatePageAdmin) +admin.add_view(ModerationAdmin) +admin.add_view(FilterAdmin) +admin.add_view(FilterWordAdmin) +admin.add_view(VoiceSettingAdmin) +admin.add_view(LanguageAdmin) +admin.add_view(VoiceLanguageAdmin) +admin.add_view(StreamerWidgetPageAdmin) +admin.add_view(StreamerOnlineAdmin) +admin.add_view(DealAdmin) +admin.add_view(BalanceAdmin) +admin.add_view(PaymentAdmin) +admin.add_view(TinkoffWithdrawMethodAdmin) +admin.add_view(TinkoffWithdrawAdmin) +admin.add_view(StreamersCommissionAdmin) \ No newline at end of file