From 820567b48a29b07a5c7f06a4796f58db831dd3a6 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sat, 26 Apr 2025 17:25:47 -0400 Subject: [PATCH 1/2] [UPD] poetry odoo 16.0 --- .../poetry.odoo16.0_python3.10.14.lock | 142 +++++++++--------- .../pyproject.odoo16.0_python3.10.14.toml | 18 +-- 2 files changed, 80 insertions(+), 80 deletions(-) diff --git a/requirement/poetry.odoo16.0_python3.10.14.lock b/requirement/poetry.odoo16.0_python3.10.14.lock index d537aeb..40698a6 100644 --- a/requirement/poetry.odoo16.0_python3.10.14.lock +++ b/requirement/poetry.odoo16.0_python3.10.14.lock @@ -513,13 +513,13 @@ typecheck = ["mypy"] [[package]] name = "beautifulsoup4" -version = "4.13.3" +version = "4.13.4" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" files = [ - {file = "beautifulsoup4-4.13.3-py3-none-any.whl", hash = "sha256:99045d7d3f08f91f0d656bc9b7efbae189426cd913d830294a15eefa0ea4df16"}, - {file = "beautifulsoup4-4.13.3.tar.gz", hash = "sha256:1bd32405dacc920b42b83ba01644747ed77456a65760e285fbc47633ceddaf8b"}, + {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, + {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, ] [package.dependencies] @@ -1000,12 +1000,12 @@ files = [ [[package]] name = "chromedriver-binary" -version = "137.0.7123.0.0" +version = "137.0.7145.0.0" description = "Installer for chromedriver." optional = false python-versions = "*" files = [ - {file = "chromedriver_binary-137.0.7123.0.0.tar.gz", hash = "sha256:fe2992e81362074b881e77824da2e832027d4db7dcf6dbe092b8f11a21f90a0d"}, + {file = "chromedriver_binary-137.0.7145.0.0.tar.gz", hash = "sha256:ca78f2cf9e69fec720ff083d7f52480a22dd9c0a6f12f49735dca54b4ca67991"}, ] [[package]] @@ -1585,12 +1585,12 @@ files = [ [[package]] name = "dlib" -version = "19.24.6" +version = "19.24.8" description = "A toolkit for making real world machine learning and data analysis applications" optional = false python-versions = "*" files = [ - {file = "dlib-19.24.6.tar.gz", hash = "sha256:77e3c28ac2c66141514b07cbb74b7c7f80381c019ce5fec99007980bc6490d7d"}, + {file = "dlib-19.24.8.tar.gz", hash = "sha256:9135900983e279b5e5d0b1bb31b684a3054ea4f3ea1b1c69e8a675659271003d"}, ] [[package]] @@ -1820,53 +1820,53 @@ readthedocs = ["sphinx-rtd-theme"] [[package]] name = "ezdxf" -version = "1.4.0" +version = "1.4.1" description = "A Python package to create/manipulate DXF drawings." optional = false python-versions = ">=3.9" files = [ - {file = "ezdxf-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:53b92e052d318975bb99508d377bbec7cbd50b99692be3a33169e32671c551a7"}, - {file = "ezdxf-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52beac83e2ea1dc67c49428ffe7c9585df8ea285e86f5424377560fc4e992394"}, - {file = "ezdxf-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2ed21e4abc80010a415d38f2874c21ef6df5fc1d7921f7b184002f63b72a95f"}, - {file = "ezdxf-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:716cb815b5686583e4ff323da719513923b60544fd09e5802fdc5a660daa70e3"}, - {file = "ezdxf-1.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58efdf0157a04ac0896de76d28461603062e5939a614e99958055dd3713d5dbc"}, - {file = "ezdxf-1.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b0f5955221991f811323de25f6d81c6d768f9da8907057904ca873921baad3b8"}, - {file = "ezdxf-1.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2f774deed80c8404c647af63aefd514fa51bafa8e75cf154cb24e9733db506bc"}, - {file = "ezdxf-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:27f01bbf41b9cd623923f5800154a5d0a4d4e11aac8fd2f291eaf6944a6ca99a"}, - {file = "ezdxf-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:25d1d8ee0069b6bdd405d767e5422094d2b0f3ad5d3111445d109e6e9f32268e"}, - {file = "ezdxf-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4fb8c464fa67e61f03b4c9f05adadd547b638f231f5da2d896942b1bbcdccb0"}, - {file = "ezdxf-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e1ce8fc612455b78d2b7f93b05c9d278651a5c744abb387827c4244d7597377"}, - {file = "ezdxf-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7653be6635cc1790bb6c96783ccca73c55dc278360566f23e317d05b515a1f5c"}, - {file = "ezdxf-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58357569d03a8389076cedd51067630a16036ac7ef75b16c672af18ce746faa6"}, - {file = "ezdxf-1.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fa59fd90162f97812e4f37e00a35ccb78fcd91fd29977d55ed18b0356fa31500"}, - {file = "ezdxf-1.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5503d06e8a42e5720627f5f45d331d89a22b502afbd5bd08f26023160103ee96"}, - {file = "ezdxf-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:12c7a4e6c1ee0db9c88c12daa6357f2d2f9b2623812301032035735bef0138ff"}, - {file = "ezdxf-1.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:46357e1f0aebe57c3d09ec099aaad6cc74bd532bbc57b5b4e35598c87d81b26a"}, - {file = "ezdxf-1.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:32f23a5dfbaa0267c7d3edb069476299f27baf6a58f03763d70e6a69c2e2de3b"}, - {file = "ezdxf-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad8ef33693c744080a10517da1a774c0171cc78bd429a1310a463aa3ef81d0f7"}, - {file = "ezdxf-1.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f117529f9fdc10a9fbff4cf70c24efdfea2b89ae3cc638bd69da3498c0c61ca"}, - {file = "ezdxf-1.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce92a3ffc5a912b24a9b5ebe0ba50dcade72e40587e3a49472e0dccbaffe1769"}, - {file = "ezdxf-1.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ff3cdd8219ad004d79a1f6bd0991b420577642cfe4f61ccaf9b5b31d1da1bc0a"}, - {file = "ezdxf-1.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ae3f481b282c0d3d009f96a0f79fbecfd62a848dffccfe637314f628f86f6e5"}, - {file = "ezdxf-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe4b9ee1188320ef1a3927e90125fc642f783e878ab0cf58a5d71b0405e91055"}, - {file = "ezdxf-1.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43f9daa9eaf45980f113b18f130d8c0cc3c4e2b5aaf567c03ba3b010930529f7"}, - {file = "ezdxf-1.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:51169e62ad82a2e430b4086d32022baf260421db6e789ed08fc51f717f2a68b6"}, - {file = "ezdxf-1.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:671ef0daa2e526658f1dde3f2dd972c1713385e9479469b02792762b0b15939d"}, - {file = "ezdxf-1.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aafb5ee413b7b9fa7f203dfb9510c50d9f60697a5c805ab5aaed0e3e74a4a1bd"}, - {file = "ezdxf-1.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad5050137143c0cbe768828a260445f2b26b28717886ac56fee284c3f699f66"}, - {file = "ezdxf-1.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:52320ef19e62c1b6cabbfe3353f64608058bb01019da42c33140c9a0da2ed86c"}, - {file = "ezdxf-1.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6a1d4cfb200ced63196ce931a11e1d5a662336bd0bc0f60af833e6e50818fc06"}, - {file = "ezdxf-1.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:dd6204512339c7dedbb4a0b5614b4120c7ca678e52422f81cc5cefdeb4436e8e"}, - {file = "ezdxf-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:071f945bd763308157af5d3a84ae64400b0ec31b89527a52c5286793715b6fba"}, - {file = "ezdxf-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0dd691bfab75e76e7d3db6c295050aae3befe679d9ec3ec580eab8250a8bae27"}, - {file = "ezdxf-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bcdb1023c411715b3ca30d89eec4e3dd9e99cf85586a34a5134a88f2994ea8cc"}, - {file = "ezdxf-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b1e0df2e6d47b21e1fb5f06ba035f191e75c7c6e39e836bdaf1c73acf549daa"}, - {file = "ezdxf-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:121fd49e158fe47ec8af01133aae5f179c92034d41878ffcffda5da10c669f17"}, - {file = "ezdxf-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:908e24973fcfd03808b47410b965440e79b90b3925d80e02163c3cc1fe7775ca"}, - {file = "ezdxf-1.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:28980c443b50421543c5a85b083b8545187956a0de8a981d900c28f6b6b21782"}, - {file = "ezdxf-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:1fb2bc3cb1740eda3f558ef303d61b248f81b2e9ee10dac84e4e6924588af9c2"}, - {file = "ezdxf-1.4.0-py3-none-any.whl", hash = "sha256:aec637894fdf0d028bd52aa2bbbfa13d09b126dd22c943abcf942fbe372f07a5"}, - {file = "ezdxf-1.4.0.tar.gz", hash = "sha256:00793d635226288a8e5d8aa578cc863bdfe5bd15d4cf3d9d7db7f32aa948c640"}, + {file = "ezdxf-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5167f620ec6f261f0216c11cbab4625ef0bf46167d6e1fdce5799dc7ea06c5dc"}, + {file = "ezdxf-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fbcce92871ecc50eda683fc4845af4c8b98f0c69842b816c0477d2cc08a8f396"}, + {file = "ezdxf-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:20cc506f7adff134aeb063aa8f2a37c7e8041f216baaab191af03212ba2ffd29"}, + {file = "ezdxf-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d5b3219d7e5f6d921080f4abf5abc99798a2ff4ff84e1a944009de744c373ad"}, + {file = "ezdxf-1.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed9f7398c9253edf60599f815ab711b302cb747937e0713265d5bd41389f58b9"}, + {file = "ezdxf-1.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:04f3ba53d756d9b6d551a11fb118c6183c060dd186bdf1e1045b0916a8283010"}, + {file = "ezdxf-1.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:60b909553f241226480e1909280af8c29342ff8d6384bfff0cc48919712d7019"}, + {file = "ezdxf-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:660fe5bb6ef0f0d2927029620e29eae1ec47cb843d73a2291817dae7716d6009"}, + {file = "ezdxf-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:62485e3488b9093e70a373f981184c4024975b87546c2567d6b0035c4f4df0e3"}, + {file = "ezdxf-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e59c556c480ba2c9886f95ec3eac2006dc905b42871b402773f7220636936079"}, + {file = "ezdxf-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d36dd147c765937d0ab0fffdf6e1ef8008c2e9667bc92d08f938f0945176b5e"}, + {file = "ezdxf-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b63357ad8b65574938d10ce571c1373cc6c8771c6aad40155f0c55607102237"}, + {file = "ezdxf-1.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2abaecb2228b5b1a798149bcaefa45a5911ece631aa2717ff6dea1ab5713a6a"}, + {file = "ezdxf-1.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6dd079a89299bd6be8ee63561121d3b02b7bad2b7f591469497455b3fddfd321"}, + {file = "ezdxf-1.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5ed11a1b1f2c953dcfc500b4fee6570f3fcdb8fed1589bce5fcb81d58e1f32b0"}, + {file = "ezdxf-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0a8aba1eb1d2f81158e744c492cf2338fba6491cb6a7b409b232b6456e7919"}, + {file = "ezdxf-1.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c592ee1970d11ebef66c800860f6a0f8fd560a0fde5c3c51556d06c8d422cc71"}, + {file = "ezdxf-1.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dae904a0238e3ea74ae53c7036b6bebaf36c82b143a0e4e23c743ecf5a33d9fd"}, + {file = "ezdxf-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:44c695a6bf2eabcb88814bf108670067e496c569b10cabdb3c110c6aab7d5bea"}, + {file = "ezdxf-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf7d0393eb1b680e088a8c56557a7019a77e7d3d0bca1bab7c036cad531a8d09"}, + {file = "ezdxf-1.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a821fdd5b24d0d820d2ee2644b1927ea777c7209573407c3e55bb6fdb3d04c05"}, + {file = "ezdxf-1.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a98a50e111163cf5799b09cdbc7bf302c323636afb454179dc4be4aa3edee3d"}, + {file = "ezdxf-1.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1754cc1f11538ccc4c8b912947b6170b7a34532137d99c176457d207bc9d18b3"}, + {file = "ezdxf-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:eecb3775ce8963dde38f0e223c7af86197d9762cd2f73f38a735688c871510b4"}, + {file = "ezdxf-1.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:69d66bbd976d5ebfd949d12cc44a778ec6db8ae2d223458b192d930d04a87265"}, + {file = "ezdxf-1.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8c385633d2b2d841fe1f181954f594a8f35909c0ef56dda267ef11c3df77573a"}, + {file = "ezdxf-1.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e4ebf64dd97a54c5ade7d27f550612ad7dcf4d8b498e26b594d9e9c054e989ef"}, + {file = "ezdxf-1.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d258dbf8fa10d8b30c8c80e76dc56e3533ca1c80098657317946a4bb2f0c59e1"}, + {file = "ezdxf-1.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6589905ae064c03de3c373c70fd2140d7337843147ad910c7bf2d0b9975396fa"}, + {file = "ezdxf-1.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fb788d9f8b6a872463e52efcf8ee582019d6bef4b1a5e12acd24eeb6dcab768"}, + {file = "ezdxf-1.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d9330a42634165b24fcbb9f613421018837236449ba2dc159cedacee65943d03"}, + {file = "ezdxf-1.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:84a278d1bc65de09047d7104c55b0c468494a44f774bc2f0e6f15b27e73704a9"}, + {file = "ezdxf-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fad74d71d82b2480bf81204497dafd142f5dd8bafcd57f48bf1c8ef8197102e7"}, + {file = "ezdxf-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5e30f5bfc89848dfb8b4d8865347b77dcd6127e2efeb48d985592a6ed0563f47"}, + {file = "ezdxf-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e63725f30cf734190bf5c567198e024d503fc28a942df616e39dc51a6590117"}, + {file = "ezdxf-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00495568d5d775e77e97b1793ff6ffd944deeadee47477cd9fcd191b5f3181c4"}, + {file = "ezdxf-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1b56c98b038dec287f80924483ca61caa45b1335ec05b4dce8bf825db09e303a"}, + {file = "ezdxf-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1254c1a7002dcf3dab08b359d04f73f6e062afb7cdc704a46cdacacdc2cfb31e"}, + {file = "ezdxf-1.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cb0123a9f00dc6e4b73004333ba34f9dfaece3d9fcf87c82369e3dd980218afc"}, + {file = "ezdxf-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:233c05c3084451ef33bff6e8e414de9da7858ceb19d4b68d134060a7a511d00d"}, + {file = "ezdxf-1.4.1-py3-none-any.whl", hash = "sha256:fc3cf018ea0236c33cb3964743b04df54e35e0ff269518860a1f07a5b18b9cd0"}, + {file = "ezdxf-1.4.1.tar.gz", hash = "sha256:4806e4328214f7413a952b7e5066588a83e3c0d600dda8c5f86eed38cfcd706b"}, ] [package.dependencies] @@ -4160,13 +4160,13 @@ full = ["XLMMacroDeobfuscator"] [[package]] name = "openai" -version = "1.73.0" +version = "1.76.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.73.0-py3-none-any.whl", hash = "sha256:f52d1f673fb4ce6069a40d544a80fcb062eba1b3f489004fac4f9923a074c425"}, - {file = "openai-1.73.0.tar.gz", hash = "sha256:b58ea39ba589de07db85c9905557ac12d2fc77600dcd2b92a08b99c9a3dce9e0"}, + {file = "openai-1.76.0-py3-none-any.whl", hash = "sha256:a712b50e78cf78e6d7b2a8f69c4978243517c2c36999756673e07a14ce37dc0a"}, + {file = "openai-1.76.0.tar.gz", hash = "sha256:fd2bfaf4608f48102d6b74f9e11c5ecaa058b60dad9c36e409c12477dfd91fb2"}, ] [package.dependencies] @@ -4224,13 +4224,13 @@ et-xmlfile = "*" [[package]] name = "openupgradelib" -version = "3.9.4" +version = "3.10.0" description = "A library with support functions to be called from Odoo migration scripts." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" files = [ - {file = "openupgradelib-3.9.4-py2.py3-none-any.whl", hash = "sha256:d07354ede92674f7e611c3ad4a069a996d0664197b473f488fdd3883da3c0112"}, - {file = "openupgradelib-3.9.4.tar.gz", hash = "sha256:642ba0beb215ad497da660e0157f27d3a801c1e8a049d9399778607efbabc5a7"}, + {file = "openupgradelib-3.10.0-py2.py3-none-any.whl", hash = "sha256:682319d3d5f196b2caf1e40a0cc6f0bc0ee85147d570e570570855982e937e37"}, + {file = "openupgradelib-3.10.0.tar.gz", hash = "sha256:c7c72c34df60ec1da3a491a80c8e12581b5b86c57b576c411e42b2bc54f26708"}, ] [package.dependencies] @@ -4574,13 +4574,13 @@ pycryptodome = "*" [[package]] name = "phonenumbers" -version = "9.0.3" +version = "9.0.4" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." optional = false python-versions = "*" files = [ - {file = "phonenumbers-9.0.3-py2.py3-none-any.whl", hash = "sha256:0509d9b70ef66c04a1538f0b31c3e0c0b023127dad0eb1199adef0bc1841ff34"}, - {file = "phonenumbers-9.0.3.tar.gz", hash = "sha256:c5084e6c6a77e0e8d725086c7f69002ef8e39529155b8cd31cbf8c987f344a33"}, + {file = "phonenumbers-9.0.4-py2.py3-none-any.whl", hash = "sha256:ac8aa9d4679da5078547aeb159d78c2b60f8d0fb4eafdc7cf464069039b30ccd"}, + {file = "phonenumbers-9.0.4.tar.gz", hash = "sha256:b1530fc2a7b67e4c37c63e8e736c7e6efe2fed283c1bbb5c08c4511ec0c160ed"}, ] [[package]] @@ -7519,13 +7519,13 @@ devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3) [[package]] name = "unidecode" -version = "1.3.8" +version = "1.4.0" description = "ASCII transliterations of Unicode text" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "Unidecode-1.3.8-py3-none-any.whl", hash = "sha256:d130a61ce6696f8148a3bd8fe779c99adeb4b870584eeb9526584e9aa091fd39"}, - {file = "Unidecode-1.3.8.tar.gz", hash = "sha256:cfdb349d46ed3873ece4586b96aa75258726e2fa8ec21d6f00a591d98806c2f4"}, + {file = "Unidecode-1.4.0-py3-none-any.whl", hash = "sha256:c3c7606c27503ad8d501270406e345ddb480a7b5f38827eafe4fa82a137f0021"}, + {file = "Unidecode-1.4.0.tar.gz", hash = "sha256:ce35985008338b676573023acc382d62c264f307c8f7963733405add37ea2b23"}, ] [[package]] @@ -7654,13 +7654,13 @@ python-dateutil = ">=2.4.0" [[package]] name = "vonage" -version = "4.4.0" +version = "4.4.1" description = "Python Server SDK for using Vonage APIs" optional = false python-versions = ">=3.9" files = [ - {file = "vonage-4.4.0-py3-none-any.whl", hash = "sha256:c0d28ae85cd0936df58101486bebfefdf1c8b410f48b9f6291b55f1e0779057b"}, - {file = "vonage-4.4.0.tar.gz", hash = "sha256:692e9ce24f389e7c42a90c17516c38fea7f16ab4c90cbae9c06b067318703f44"}, + {file = "vonage-4.4.1-py3-none-any.whl", hash = "sha256:810ba1ec5e9feed7f15487d2f49692cbfae23d050eb6db5bcd59ba3c208e9d52"}, + {file = "vonage-4.4.1.tar.gz", hash = "sha256:ecba85759c36ced5633a8341e148a34a05b8c01d3f185e8ce8e89c5f8c651542"}, ] [package.dependencies] @@ -7680,7 +7680,7 @@ vonage-utils = ">=1.1.4" vonage-verify = ">=2.1.0" vonage-verify-legacy = ">=1.0.1" vonage-video = ">=1.2.0" -vonage-voice = ">=1.3.0" +vonage-voice = ">=1.4.0" [[package]] name = "vonage-account" @@ -7973,13 +7973,13 @@ vonage-utils = ">=1.1.4" [[package]] name = "vonage-voice" -version = "1.3.0" +version = "1.4.0" description = "Vonage voice package" optional = false python-versions = ">=3.9" files = [ - {file = "vonage_voice-1.3.0-py3-none-any.whl", hash = "sha256:6a52b3e0c841cd5ed5826f3e90400a52bde649f3fe520085b6c0cae5dc5228a7"}, - {file = "vonage_voice-1.3.0.tar.gz", hash = "sha256:fa36504b33019e57dec891e42ead18e5d87801703c84e5ba85c66e60b4376a34"}, + {file = "vonage_voice-1.4.0-py3-none-any.whl", hash = "sha256:e04ce62e314d2ab3ae7c31f1a39d4012f0fe1c212bb1a58b07c9d436267cdb29"}, + {file = "vonage_voice-1.4.0.tar.gz", hash = "sha256:558569514e5e8a7390693bb3d354391a9b022bdaefc6d205f4d1a2860f8a0907"}, ] [package.dependencies] @@ -8486,4 +8486,4 @@ bindings = ["ghostscript"] [metadata] lock-version = "2.0" python-versions = "^3.10.14" -content-hash = "350819d1b0358148243e33c0d3a0731e258153a097d85e45725435d0ee03f38b" +content-hash = "195677d77ee4de85f4b523f8413b0242719aed0ae89bd71bd9f0ca1f655563fd" diff --git a/requirement/pyproject.odoo16.0_python3.10.14.toml b/requirement/pyproject.odoo16.0_python3.10.14.toml index e513b8c..6070d32 100644 --- a/requirement/pyproject.odoo16.0_python3.10.14.toml +++ b/requirement/pyproject.odoo16.0_python3.10.14.toml @@ -30,7 +30,7 @@ azure-identity = "1.13.0" azure-storage-blob = "12.16.0" babel = "2.9.1" base64io = "^1.0.3" -beautifulsoup4 = "^4.13.3" +beautifulsoup4 = "^4.13.4" bokeh = "3.1.1" boto3 = "1.26.7" bs4 = "^0.0.2" @@ -38,7 +38,7 @@ cachetools = "^5.5.2" cairosvg = "^2.7.1" cerberus = "^1.3.7" chardet = "4.0.0" -chromedriver-binary = "^137.0.7123.0.0" +chromedriver-binary = "^137.0.7145.0.0" click = "^8.1.8" clicksend-client = "^5.0.78" cloudflare = "^4.1.0" @@ -49,7 +49,7 @@ cryptography = "3.4.8" cybersource-rest-client-python = "0.0.56" cython = "^3.0.12" decorator = "4.4.2" -dlib = "^19.24.6" +dlib = "^19.24.8" docutils = "0.16" dotty-dict = "^1.3.1" dropbox = "^12.0.2" @@ -57,7 +57,7 @@ ebaysdk = "2.1.5" email-validator = "^2.2.0" endesive = "^2.18.5" extract-msg = "^0.54.1" -ezdxf = "^1.4.0" +ezdxf = "^1.4.1" face-recognition = "^1.3.0" factur-x = "^3.6" filetype = "^1.2.0" @@ -104,10 +104,10 @@ odoo-test-helper = "^2.1.1" odoorpc = "^0.10.1" ofxparse = "0.21" ofxtools = "^0.9.5" -openai = "^1.73.0" +openai = "^1.76.0" opencv-python = "^4.11.0.86" openpyxl = "^3.1.5" -openupgradelib = "^3.9.4" +openupgradelib = "^3.10.0" pandas = ">=0.25.3" paramiko = "^3.5.1" passlib = "1.7.4" @@ -115,7 +115,7 @@ pathspec = "^0.12.1" pay-ccavenue = "^1.0.0" pdf2image = "^1.17.0" pdfminer = "^20191125" -phonenumbers = "^9.0.3" +phonenumbers = "^9.0.4" pillow = "9.0.1" plotly = "5.13.1" polib = "1.1.0" @@ -189,14 +189,14 @@ todoist-python = "^8.1.4" toml = "^0.10.2" tweepy = "^4.15.0" twilio = "^9.5.2" -unidecode = "^1.3.8" +unidecode = "^1.4.0" unidiff = "^0.7.5" urllib3 = "1.26.5" uvloop = "^0.21.0" validate-email = "^1.3" virtualenv = "20.30.0" vobject = "0.9.6.1" -vonage = "^4.4.0" +vonage = "^4.4.1" vonage-verify-v2 = "1.1.4" werkzeug = "2.0.2" wheel = "^0.45.1" From 7dc8da3f021b393e3eef41edadaa5e334ac42bed Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Sat, 26 Apr 2025 17:12:38 -0400 Subject: [PATCH 2/2] [IMP] bot assistant TODO --- .gitignore | 3 +- Makefile | 8 + conf/pycharm_default_configuration.csv | 1 + script/todo/README.md | 2 + script/todo/logo_ascii.txt | 9 + script/todo/todo.json | 23 ++ script/todo/todo.py | 335 +++++++++++++++++++++++++ script/todo/todo_example.json | 35 +++ 8 files changed, 415 insertions(+), 1 deletion(-) create mode 100644 script/todo/README.md create mode 100644 script/todo/logo_ascii.txt create mode 100644 script/todo/todo.json create mode 100755 script/todo/todo.py create mode 100644 script/todo/todo_example.json diff --git a/.gitignore b/.gitignore index 7ba1b39..6a8ae99 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ pyproject.toml .python-version requirements.txt requirement/ignore_requirements.txt -screenshots \ No newline at end of file +screenshots +script/todo/todo_override.json diff --git a/Makefile b/Makefile index 41dbc27..a498c59 100644 --- a/Makefile +++ b/Makefile @@ -725,6 +725,14 @@ open_test_coverage: # TODO load specific test file : ./run.sh -d test_file --log-level=test --test-enable --stop-after-init --test-file ./.venv/test.py +######## +# TODO # +######## + +.PHONY: todo +todo: + ./script/todo/todo.py + ######### # tag # ######### diff --git a/conf/pycharm_default_configuration.csv b/conf/pycharm_default_configuration.csv index 79675da..8e4f437 100644 --- a/conf/pycharm_default_configuration.csv +++ b/conf/pycharm_default_configuration.csv @@ -28,4 +28,5 @@ create demo internal,./script/code_generator/new_project.py,-m demo_internal -d run_robotlibre,./odoo/odoo-bin,--limit-time-real 999999 -c config.conf -d robotlibre,robotlibre, run_robotlibre_update,./odoo/odoo-bin,--limit-time-real 999999 --no-http --stop-after-init --dev cg -d robotlibre -i erplibre_devops -u erplibre_devops,robotlibre, run_robotlibre_generate,./script/code_generator/new_project.py,-f -d ./addons/ERPLibre_erplibre_addons -m erplibre_devops,robotlibre, +run_todo,./script/todo/todo.py,,TODO, diff --git a/script/todo/README.md b/script/todo/README.md new file mode 100644 index 0000000..5fdc582 --- /dev/null +++ b/script/todo/README.md @@ -0,0 +1,2 @@ +TODO is an assistant robot to use ERPLibre +Execute it with `./script/todo/todo.py` or `make todo`. diff --git a/script/todo/logo_ascii.txt b/script/todo/logo_ascii.txt new file mode 100644 index 0000000..63213ca --- /dev/null +++ b/script/todo/logo_ascii.txt @@ -0,0 +1,9 @@ + __ + _(\ |@@| +(__/\__ \--/ __ + \___|----| | __ + \ }{ /\ )_ / _\ + /\__/\ \__O (__ + (--/\--) \__/ + _)( )(_ + `---''---` \ No newline at end of file diff --git a/script/todo/todo.json b/script/todo/todo.json new file mode 100644 index 0000000..eefdefa --- /dev/null +++ b/script/todo/todo.json @@ -0,0 +1,23 @@ +{ + "kdbx": { + "path": "", + "password": "" + }, + "kdbx_config": { + "openai": { + "kdbx_key": "OpenAI api" + } + }, + "instance": [ + { + "prompt_description": "Test - Instance de base minimale", + "makefile_cmd": "db_restore_erplibre_base_db_test", + "database": "test" + } + ], + "function": [ + { + "prompt_description": "Ouvrir ERPLibre avec TODO \uD83E\uDD16" + } + ] +} diff --git a/script/todo/todo.py b/script/todo/todo.py new file mode 100755 index 0000000..f028aa0 --- /dev/null +++ b/script/todo/todo.py @@ -0,0 +1,335 @@ +#!/usr/bin/env python + +import getpass +import json +import logging +import os +import subprocess +import tkinter as tk +from tkinter import filedialog + +import click +import openai +from pykeepass import PyKeePass + +# TODO implement urwid to improve text user interface +# import urwid +_logger = logging.getLogger(__name__) + +CONFIG_FILE = "./script/todo/todo.json" +CONFIG_OVERRIDE_FILE = "./script/todo/todo_override.json" +LOGO_ASCII_FILE = "./script/todo/logo_ascii.txt" + + +class TODO: + def __init__(self): + self.kdbx = None + + def run(self): + with open(LOGO_ASCII_FILE) as my_file: + print(my_file.read()) + print("Ouverture de TODO en cours ...") + print("🤖 => Entre tes directives par son chiffre et fait Entrée!") + help_info = """Commande : +[1] Question +[2] Execute +[3] Fork - Ouvre TODO 🤖 dans une nouvelle tabulation +[0] Quitter +""" + # [3] install + while True: + status = click.prompt(help_info) + print() + if status == "0": + break + elif status == "1": + self.execute_prompt_ia() + elif status == "2": + self.prompt_execute() + elif status == "3": + cmd = f"gnome-terminal --tab -- bash -c 'source ./.venv/bin/activate;make todo'" + self.executer_commande_live(cmd) + # elif status == "3" or status == "install": + # print("install") + else: + print("Commande non trouvée 🤖!") + + print(status) + # manipuler() + + def get_kdbx(self): + if self.kdbx: + return self.kdbx + # Open file + chemin_fichier_kdbx = self.get_config(["kdbx", "path"]) + if not chemin_fichier_kdbx: + root = tk.Tk() + root.withdraw() # Hide the main window + chemin_fichier_kdbx = filedialog.askopenfilename( + title="Select a File", + filetypes=(("KeepassX files", "*.kdbx"),), + ) + if not chemin_fichier_kdbx: + _logger.error(f"KDBX is not configured, please fill {CONFIG_FILE}") + return + + mot_de_passe_kdbx = self.get_config(["kdbx", "password"]) + if not mot_de_passe_kdbx: + mot_de_passe_kdbx = getpass.getpass( + prompt="Entrez votre mot de passe : " + ) + + kp = PyKeePass(chemin_fichier_kdbx, password=mot_de_passe_kdbx) + + if kp: + self.kdbx = kp + return kp + + def get_config(self, lst_params): + # Open file + config_file = CONFIG_FILE + if os.path.exists(CONFIG_OVERRIDE_FILE): + config_file = CONFIG_OVERRIDE_FILE + + with open(config_file) as cfg: + dct_data = json.load(cfg) + for param in lst_params: + try: + dct_data = dct_data[param] + except KeyError: + _logger.error( + f"KeyError on file {config_file} with keys {lst_params}" + ) + return + return dct_data + + def execute_prompt_ia(self): + while True: + help_info = """Commande : +[0] Retour +Écrit moi ta question """ + status = click.prompt(help_info) + print() + if status == "0": + return + kp = self.get_kdbx() + if not kp: + return + nom_configuration = self.get_config( + ["kdbx_config", "openai", "kdbx_key"] + ) + entry = kp.find_entries_by_title(nom_configuration, first=True) + + client = openai.OpenAI(api_key=entry.password) + prompt_update = status + completion = client.chat.completions.create( + model="gpt-4o", + messages=[{"role": "user", "content": prompt_update}], + ) + + print(completion.choices[0].message.content) + print() + + def prompt_execute(self): + help_info = """Commande : +[1] Gérer une instance +[2] Fonction - Démonstration des fonctions développées +[0] Retour +""" + while True: + status = click.prompt(help_info) + print() + if status == "0": + return + elif status == "1": + status = self.prompt_execute_instance() + if status is not False: + return + elif status == "2": + status = self.prompt_execute_fonction() + if status is not False: + return + else: + print("Commande non trouvée 🤖!") + + def prompt_execute_instance(self): + lst_instance = self.get_config(["instance"]) + help_info = "Commande :\n" + help_end = "[0] Retour\n" + for i, dct_instance in enumerate(lst_instance): + help_info += ( + f"[{i + 1}] " + dct_instance["prompt_description"] + "\n" + ) + help_info += help_end + + while True: + status = click.prompt(help_info) + print() + if status == "0": + return False + else: + cmd_no_found = True + try: + int_cmd = int(status) + if 0 < int_cmd <= len(lst_instance): + cmd_no_found = False + status = click.confirm( + "Voulez-vous une nouvelle instance?" + ) + if status: + dct_instance = lst_instance[int_cmd - 1] + makefile_cmd = dct_instance.get("makefile_cmd") + db_name = dct_instance.get("database") + self.executer_commande_live(f"make {makefile_cmd}") + kdbx_key = dct_instance.get("kdbx_key") + self.prompt_execute_selenium_and_run_db( + db_name, kdbx_key=kdbx_key + ) + except ValueError: + pass + if cmd_no_found: + print("Commande non trouvée 🤖!") + + def prompt_execute_fonction(self): + lst_instance = self.get_config(["function"]) + help_info = "Commande :\n" + help_end = "[0] Retour\n" + for i, dct_instance in enumerate(lst_instance): + help_info += ( + f"[{i + 1}] " + dct_instance["prompt_description"] + "\n" + ) + help_info += help_end + + while True: + status = click.prompt(help_info) + print() + if status == "0": + return False + else: + cmd_no_found = True + try: + int_cmd = int(status) + if 0 < int_cmd <= len(lst_instance): + cmd_no_found = False + dct_instance = lst_instance[int_cmd - 1] + command = dct_instance.get("command") + kdbx_key = dct_instance.get("kdbx_key") + self.prompt_execute_selenium( + command=command, kdbx_key=kdbx_key + ) + except ValueError: + pass + if cmd_no_found: + print("Commande non trouvée 🤖!") + + def kdbx_get_extra_command_user(self, kdbx_key): + lst_value = [] + if kdbx_key: + kp = self.get_kdbx() + if not kp: + return "" + if type(kdbx_key) is not list: + lst_kdbx_key = [kdbx_key] + else: + lst_kdbx_key = kdbx_key + for key in lst_kdbx_key: + entry = kp.find_entries_by_title(key, first=True) + try: + odoo_user = entry.username + except AttributeError: + _logger.error(f"Cannot find username from keys {key}") + try: + odoo_password = entry.password + except AttributeError: + _logger.error(f"Cannot find password from keys {key}") + lst_value.append( + f" --default_email_auth {odoo_user} --default_password_auth '{odoo_password}'" + ) + if len(lst_value) == 0: + return "" + elif len(lst_value) == 1: + return lst_value[0] + return lst_value + + def prompt_execute_selenium_and_run_db(self, bd, kdbx_key=None): + if kdbx_key: + extra_cmd_web_login = self.kdbx_get_extra_command_user(kdbx_key) + else: + extra_cmd_web_login = "" + + cmd = f'parallel ::: "./run.sh -d {bd}" "sleep 3;./script/selenium/web_login.py{extra_cmd_web_login}"' + self.executer_commande_live(cmd) + + def prompt_execute_selenium(self, command=None, kdbx_key=None): + if kdbx_key: + extra_cmd_web_login = self.kdbx_get_extra_command_user(kdbx_key) + else: + extra_cmd_web_login = "" + + lst_cmd = [] + if not command: + cmd = "./script/selenium/web_login.py" + else: + cmd = command + + if type(extra_cmd_web_login) is list: + for item in extra_cmd_web_login: + lst_cmd.append(cmd + item) + else: + lst_cmd.append(cmd + extra_cmd_web_login) + + if len(lst_cmd) == 1: + self.executer_commande_live(lst_cmd[0]) + elif len(lst_cmd) > 1: + new_cmd = "parallel ::: " + for i, cmd in enumerate(lst_cmd): + new_cmd += f' "sleep {1 * i};{cmd}"' + self.executer_commande_live(new_cmd) + + def executer_commande_live(self, commande): + """ + Exécute une commande et affiche la sortie en direct. + + Args: + commande (str): La commande à exécuter (sous forme de chaîne de caractères). + """ + try: + process = subprocess.Popen( + commande, + shell=True, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + text=True, + bufsize=1, # Désactive la mise en tampon pour la sortie en direct + universal_newlines=True, # Pour traiter les sauts de lignes correctement + ) + + while True: + ligne = process.stdout.readline() + if not ligne: + break + print(ligne, end="") + + process.wait() # Attendre la fin du process + + if process.returncode != 0: + print( + f"La commande a retourné un code d'erreur : {process.returncode}" + ) + + except FileNotFoundError: + if "password" in commande: + print( + f"Erreur : La commande '{commande.split(' ')[0]}'[...] n'a pas été trouvée." + ) + else: + print( + f"Erreur : La commande '{commande}' n'a pas été trouvée." + ) + except Exception as e: + print(f"Une erreur s'est produite : {e}") + + +if __name__ == "__main__": + todo = TODO() + todo.run() diff --git a/script/todo/todo_example.json b/script/todo/todo_example.json new file mode 100644 index 0000000..fec4d1f --- /dev/null +++ b/script/todo/todo_example.json @@ -0,0 +1,35 @@ +{ + "kdbx": { + "path": "", + "password": "" + }, + "kdbx_config": { + "openai": { + "kdbx_key": "OpenAI api" + } + }, + "instance": [ + { + "prompt_description": "Test - Instance de base minimale", + "makefile_cmd": "db_restore_erplibre_base_db_test", + "database": "test", + "kdbx_key": "default_user_odoo" + } + ], + "function": [ + { + "prompt_description": "Ouvrir ERPLibre avec TODO \uD83E\uDD16" + }, + { + "prompt_description": "Ouvrir ERPLibre avec tous les utilisateurs", + "kdbx_key": [ + "user 01prod", + "user 02 prod" + ] + }, + { + "prompt_description": "Rapport", + "command": "./script/selenium/selenium_test.py --test --scenario=rapport" + } + ] +}