diff --git a/Makefile b/Makefile index 57bf090..2429983 100644 --- a/Makefile +++ b/Makefile @@ -32,6 +32,7 @@ endif # Include all Makefile -include ./conf/make.code_generator.Makefile +-include ./conf/make.robotlibre.Makefile -include ./conf/make.erplibre.Makefile -include ./conf/make.database.Makefile -include ./conf/make.docker.Makefile diff --git a/conf/make.robotlibre.Makefile b/conf/make.robotlibre.Makefile new file mode 100644 index 0000000..1d39ca9 --- /dev/null +++ b/conf/make.robotlibre.Makefile @@ -0,0 +1,121 @@ +######### +# Robot # +######### +.PHONY: robot_libre_all +robot_libre_all: + echo "Install all for robot_libre" + ./script/make.sh robot_libre_init + ./script/make.sh robot_libre_pre + OPEN_DASHBOARD=TRUE ./run.sh --dev cg -d robotlibre -i erplibre_devops,erplibre_devops_me,erplibre_devops_extra + +.PHONY: robot_libre_init +robot_libre_init: + echo "Robot Libre init" + echo "Sorry for your lost data" + echo "Generate repository" + #./script/manifest/update_manifest_local_dev.sh "-g base,image_db,code_generator" + echo "Generate new fast configuration repo" + #./script/git/git_repo_update_group.py --group base,code_generator + echo "Generate configuration" + #./script/generate_config.sh + #./script/git/git_change_remote_https_to_git.py + +.PHONY: robot_libre_pre +robot_libre_pre: + echo "Create database robotlibre" + ./script/database/db_restore.py --database robotlibre + +.PHONY: robot_libre +robot_libre: + ./script/make.sh robot_libre_pre + echo "Install devops" + ./script/addons/install_addons_dev.sh robotlibre erplibre_devops + ./odoo_bin.sh db --backup --database robotlibre --restore_image robotlibre_last + +.PHONY: robot_libre_fast +robot_libre_fast: + echo "FAST! RobotLibre" + ./odoo_bin.sh db --drop --database _cache_robotlibre_last + ./script/database/db_restore.py --database robotlibre --image robotlibre_last + +.PHONY: robot_libre_fast_update +robot_libre_fast_update: + echo "FAST! RobotLibre with update" + ./odoo_bin.sh db --drop --database _cache_robotlibre_last + ./script/database/db_restore.py --database robotlibre --image robotlibre_last + ./script/addons/install_addons_dev.sh robotlibre erplibre_devops + +.PHONY: robot_libre_extra +robot_libre_extra: + ./script/make.sh robot_libre_pre + echo "Install erplibre_devops and erplibre_devops_extra" + ./script/addons/install_addons_dev.sh robotlibre erplibre_devops,erplibre_devops_extra + ./odoo_bin.sh db --backup --database robotlibre --restore_image robotlibre_last + +.PHONY: robot_libre_me +robot_libre_me: + ./script/make.sh robot_libre_pre + echo "Install erplibre_devops, erplibre_devops_me and erplibre_devops_extra" + OPEN_DASHBOARD=TRUE ./run.sh --dev cg -d robotlibre -i erplibre_devops,erplibre_devops_me,erplibre_devops_extra + ./odoo_bin.sh db --backup --database robotlibre --restore_image robotlibre_last + +.PHONY: robot_libre_me_only +robot_libre_me_only: + ./script/make.sh robot_libre + IS_ONLY_ME=TRUE ./run.sh --dev cg -d robotlibre -i erplibre_devops_me + ./odoo_bin.sh db --backup --database robotlibre --restore_image robotlibre_last + +.PHONY: robot_libre_me_auto +robot_libre_me_auto: + ./script/make.sh robot_libre + IS_ME_AUTO=TRUE ./run.sh --dev cg -d robotlibre -i erplibre_devops_me + +.PHONY: robot_libre_me_auto_force +robot_libre_me_auto_force: + ./script/make.sh robot_libre + IS_ME_AUTO_FORCE=TRUE ./run.sh --dev cg -d robotlibre -i erplibre_devops_me + +.PHONY: robot_libre_me_only_auto_force +robot_libre_me_only_auto_force: + ./script/make.sh robot_libre + IS_ONLY_ME=TRUE IS_ME_AUTO_FORCE=TRUE ./run.sh --dev cg -d robotlibre -i erplibre_devops_me + +.PHONY: robot_libre_update +robot_libre_update: + ./run.sh --limit-time-real 999999 --no-http --stop-after-init --dev cg -d robotlibre -i erplibre_devops -u erplibre_devops + +.PHONY: robot_libre_run +robot_libre_run: + ./run.sh -d robotlibre + +.PHONY: robot_libre_open +robot_libre_open: + source .venv.erplibre/bin/activate;python ./script/selenium/web_login.py + +.PHONY: robot_libre_open_record +robot_libre_open_record: + source .venv.erplibre/bin/activate;python ./script/selenium/web_login.py --record_mode + +.PHONY: robot_libre_format +robot_libre_format: + parallel ::: "./script/maintenance/format.sh ./addons/ERPLibre_erplibre_addons/erplibre_devops" "./script/maintenance/format.sh ./addons/ERPLibre_erplibre_addons/erplibre_devops_me" + +.PHONY: robot_libre_generate +robot_libre_generate: + ./script/code_generator/new_project.py -f -d ./addons/ERPLibre_erplibre_addons -m erplibre_devops + +.PHONY: run_db +run_db: + ./run.sh -d $(bd) + +.PHONY: robot_libre_selenium_generate_code_example_01 +robot_libre_selenium_generate_code_example_01: + source .venv.erplibre/bin/activate;python ./script/selenium/scenario/selenium_devops.py --open_me_devops --generate_code + +.PHONY: robot_libre_selenium_generate_code_example_01_record +robot_libre_selenium_generate_code_example_01_record: + source .venv.erplibre/bin/activate;python ./script/selenium/scenario/selenium_devops.py --open_me_devops --generate_code --not_private_mode --video_suffix not_private_mode --no_dark_mode --record_mode --window_size 1920,1080 + +.PHONY: robot_libre_selenium_generate_code_example_01_record_cell +robot_libre_selenium_generate_code_example_01_record_cell: + source .venv.erplibre/bin/activate;python ./script/selenium/scenario/selenium_devops.py --open_me_devops --generate_code --not_private_mode --video_suffix not_private_mode --no_dark_mode --record_mode --window_size 1080,1920 diff --git a/conf/pycharm_default_configuration.csv b/conf/pycharm_default_configuration.csv index 6fc7cb5..ca2ed80 100644 --- a/conf/pycharm_default_configuration.csv +++ b/conf/pycharm_default_configuration.csv @@ -1,6 +1,7 @@ name,script_path,parameters,folder,default run,./odoo/odoo-bin,--limit-time-real 999999 -c config.conf,run,True run_parallel_test,./script/test/run_parallel_test.py,,test, +robotlibre_devops_update,./odoo/odoo-bin,--limit-time-real 999999 --no-http -c config.conf --stop-after-init --dev cg -d robotlibre -u erplibre_devops,devops, cg_cg,./odoo/odoo-bin,--limit-time-real 999999 --no-http -c config.conf --stop-after-init --dev cg -d code_generator -i code_generator_code_generator,code_generator, cg_cg_template,./odoo/odoo-bin,--limit-time-real 999999 --no-http -c config.conf --stop-after-init --dev cg -d template -i code_generator_template_code_generator,code_generator_template, code_generator_auto_backup,./odoo/odoo-bin,--limit-time-real 999999 --no-http -c config.conf --stop-after-init --dev cg -d code_generator -i code_generator_auto_backup,code_generator, diff --git a/docker-compose.yml b/docker-compose.yml index ee1b756..21f6a40 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,14 +32,14 @@ services: restart: always db: - image: postgis/postgis:18-3.6-alpine + image: postgis/postgis:17-3.6-alpine environment: POSTGRES_PASSWORD: mysecretpassword POSTGRES_USER: odoo POSTGRES_DB: postgres - PGDATA: /var/lib/postgresql/pgdata + PGDATA: /var/lib/postgresql/data/pgdata volumes: - - erplibre-db-data:/var/lib/postgresql/pgdata + - erplibre-db-data:/var/lib/postgresql/data/pgdata restart: always # We configure volume without specific destination to let docker manage it. To configure it through docker use (read related documentation before continuing) : diff --git a/docker/docker-compose_odoo_18.0.yml b/docker/docker-compose_odoo_18.0.yml index df70d4e..c9d4575 100644 --- a/docker/docker-compose_odoo_18.0.yml +++ b/docker/docker-compose_odoo_18.0.yml @@ -33,14 +33,14 @@ services: restart: always db: - image: postgis/postgis:18-3.6-alpine + image: postgis/postgis:17-3.6-alpine environment: POSTGRES_PASSWORD: mysecretpassword POSTGRES_USER: odoo POSTGRES_DB: postgres - PGDATA: /var/lib/postgresql/pgdata + PGDATA: /var/lib/postgresql/data/pgdata volumes: - - erplibre-db-data:/var/lib/postgresql/pgdata + - erplibre-db-data:/var/lib/postgresql/data/pgdata restart: always # We configure volume without specific destination to let docker manage it. To configure it through docker use (read related documentation before continuing) : diff --git a/docker/docker-compose_odoo_18.0_selenium.yml b/docker/docker-compose_odoo_18.0_selenium.yml index 9e20c4d..a9240d3 100644 --- a/docker/docker-compose_odoo_18.0_selenium.yml +++ b/docker/docker-compose_odoo_18.0_selenium.yml @@ -34,14 +34,14 @@ services: restart: always db: - image: postgis/postgis:18-3.6-alpine + image: postgis/postgis:17-3.6-alpine environment: POSTGRES_PASSWORD: mysecretpassword POSTGRES_USER: odoo POSTGRES_DB: postgres - PGDATA: /var/lib/postgresql/pgdata + PGDATA: /var/lib/postgresql/data/pgdata volumes: - - erplibre-db-data:/var/lib/postgresql/pgdata + - erplibre-db-data:/var/lib/postgresql/data/pgdata restart: always chrome: diff --git a/docker/repo_manifest_gen_org_prefix_path.py b/docker/repo_manifest_gen_org_prefix_path.py index 03f53ec..a1269d3 100755 --- a/docker/repo_manifest_gen_org_prefix_path.py +++ b/docker/repo_manifest_gen_org_prefix_path.py @@ -1,29 +1,34 @@ #!/usr/bin/env python -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse - -from os import listdir -from os.path import isdir, join, abspath - import configparser +from os import listdir +from os.path import abspath, isdir, join -parser = argparse.ArgumentParser(prog='Configure base dir for all addons') +parser = argparse.ArgumentParser(prog="Configure base dir for all addons") parser.add_argument("addonsBaseDir", help="Path where addons are cloned.") -parser.add_argument("srcConfigPath", - help="Path where we retrieve source config file to adapt with new " - "addons path.") -parser.add_argument("dstConfigPath", help="Path to save adapted configuration.") +parser.add_argument( + "srcConfigPath", + help="Path where we retrieve source config file to adapt with new " + "addons path.", +) +parser.add_argument( + "dstConfigPath", help="Path to save adapted configuration." +) args = parser.parse_args() addonsBaseDir = args.addonsBaseDir srcConfigPath = args.srcConfigPath dstConfigPath = args.dstConfigPath -addonsDirs = [abspath(join(addonsBaseDir, f)) for f in listdir(addonsBaseDir) if - isdir(join(addonsBaseDir, f))] +addonsDirs = [ + abspath(join(addonsBaseDir, f)) + for f in listdir(addonsBaseDir) + if isdir(join(addonsBaseDir, f)) +] with open(".odoo-version", "r") as f: odoo_version = f.readline().strip() @@ -39,9 +44,9 @@ config.read(srcConfigPath) separator = "," -config.set('options', 'addons_path', separator.join(addonsDirs)) +config.set("options", "addons_path", separator.join(addonsDirs)) -print(config.get('options', 'addons_path')) +print(config.get("options", "addons_path")) -with open(dstConfigPath, 'w') as configfile: +with open(dstConfigPath, "w") as configfile: config.write(configfile) diff --git a/docker/wait-for-psql.py b/docker/wait-for-psql.py index a15b8f6..e423fec 100755 --- a/docker/wait-for-psql.py +++ b/docker/wait-for-psql.py @@ -1,20 +1,21 @@ #!/usr/bin/env python -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse -import psycopg2 import sys import time -if __name__ == '__main__': +import psycopg2 + +if __name__ == "__main__": arg_parser = argparse.ArgumentParser() - arg_parser.add_argument('--db_host', required=True) - arg_parser.add_argument('--db_port', required=True) - arg_parser.add_argument('--db_user', required=True) - arg_parser.add_argument('--db_password', required=True) - arg_parser.add_argument('--db_name', required=False, default="postgres") - arg_parser.add_argument('--timeout', type=int, default=10) + arg_parser.add_argument("--db_host", required=True) + arg_parser.add_argument("--db_port", required=True) + arg_parser.add_argument("--db_user", required=True) + arg_parser.add_argument("--db_password", required=True) + arg_parser.add_argument("--db_name", required=False, default="postgres") + arg_parser.add_argument("--timeout", type=int, default=10) args = arg_parser.parse_args() @@ -22,12 +23,16 @@ if __name__ == '__main__': print("Try connection to postgres...") connected = False - error = '' + error = "" while ((time.time() - start_time) < args.timeout) or connected is True: try: - conn = psycopg2.connect(user=args.db_user, host=args.db_host, - port=args.db_port, password=args.db_password, - dbname=args.db_name) + conn = psycopg2.connect( + user=args.db_user, + host=args.db_host, + port=args.db_port, + password=args.db_password, + dbname=args.db_name, + ) break except psycopg2.OperationalError as e: error = e diff --git a/manifest/git_manifest_odoo12.0.xml b/manifest/git_manifest_odoo12.0.xml index 1d9754b..4af28fa 100644 --- a/manifest/git_manifest_odoo12.0.xml +++ b/manifest/git_manifest_odoo12.0.xml @@ -325,7 +325,7 @@ name="erplibre_addons.git" path="odoo12.0/addons/ERPLibre_erplibre_addons" remote="ERPLibre" - revision="12.0_erplibre_devops" + revision="12.0" groups="addons,odoo12.0,base" /> =1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.40.64" +version = "1.40.67" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "botocore-1.40.64-py3-none-any.whl", hash = "sha256:6902b3dadfba1fbacc9648171bef3942530d8f823ff2bdb0e585a332323f89fc"}, - {file = "botocore-1.40.64.tar.gz", hash = "sha256:a13af4009f6912eafe32108f6fa584fb26e24375149836c2bcaaaaec9a7a9e58"}, + {file = "botocore-1.40.67-py3-none-any.whl", hash = "sha256:e49e61f6718e8bc8b34e9bb8a97f16c8dc560485faef4981b55d76f825c9d78a"}, + {file = "botocore-1.40.67.tar.gz", hash = "sha256:cc086f39c877aee0ea8dc88ef69062c9f395b9d30d49bfcfac7b8b7e61864b3a"}, ] [package.dependencies] @@ -1241,84 +1245,51 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.1.6" +version = "3.2.0" description = "The Cython compiler for writing C extensions in the Python language." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "cython-3.1.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4027b4d1bf7781fdfb2dbe1c1d81ccac9b910831511747e2c9fc8452fb3ea6b"}, - {file = "cython-3.1.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:141dea9df09f9c711af3b95510bd417c58b2abd33676eef1cb61f25581f7090a"}, - {file = "cython-3.1.6-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:486376a988268408b7e8ea7b4cccffb914aa497c498b41589fb4a862ba47e050"}, - {file = "cython-3.1.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bdc6e63a04ead11812752a5198b85b7fc079688c76712348d072403f18fdeb49"}, - {file = "cython-3.1.6-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47e79f0bfbf403a5d6008bc9e7214e81e647794ca95cae6716399ba21abcc706"}, - {file = "cython-3.1.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2379f729f1d5a445adb4621f279f7c23aeb6245f036f96cce14b5b2fd1f5ff0a"}, - {file = "cython-3.1.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1089e18d938b6e742f077e398d52e1701080213c4f203755afde6f1b33d9e051"}, - {file = "cython-3.1.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:73576246abbc62397db85cbdde74d2e5d73dabfdb7e593fdbb3671275ffb50ce"}, - {file = "cython-3.1.6-cp310-cp310-win32.whl", hash = "sha256:f48eae3275b3352ba7eb550fc5321b0fb1ba8d916fa9985fb2f02ce42ae69ddd"}, - {file = "cython-3.1.6-cp310-cp310-win_amd64.whl", hash = "sha256:4066908ee24a18572880966de1d0865d178f5ab9828a9249faa97e1ffdfbed9f"}, - {file = "cython-3.1.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5a1aedd8990f470d108b76ca768d9f1766d6610cf2546b73075dbe1e523daebe"}, - {file = "cython-3.1.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f75c33e83e224737b1a68b2868bc08bddaabc6f04aef74864ff6069fe2e68341"}, - {file = "cython-3.1.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:91b8fb3e961b3344bf257b851f2ce679727f44857fec94d643bcc458601dab54"}, - {file = "cython-3.1.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cfeb04d43464f5ff8398b499ba46c6eef22093da0e74b25f972576e768880e7"}, - {file = "cython-3.1.6-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f32366c198ac663a540ff4fa6ed55801d113183616c51100f4cc533568d2c4cf"}, - {file = "cython-3.1.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9856e8cd7f7a95a3f10a8f15fef4d17e5a4a57fb5185fe3482cec4adb0536635"}, - {file = "cython-3.1.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6966f4d4ee13eceade2d952dc63bdf313f413c0c3f165aef0d6f62e6f27dab02"}, - {file = "cython-3.1.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dffb14bc986626be50003f4edc614a2c0a56cbaaf87259f6c763a6d21da14921"}, - {file = "cython-3.1.6-cp311-cp311-win32.whl", hash = "sha256:cde4748d37483b6c91df9f4327768e2828b1e374cb61bcee06d618958de59b7b"}, - {file = "cython-3.1.6-cp311-cp311-win_amd64.whl", hash = "sha256:29d6141b0c9697dfcaf5940eceb06353bec76f51f0579658964c0d29418000df"}, - {file = "cython-3.1.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0d2c32e8f6c65854e8203b381ff7ab540820763756b7c326e2c8dc18c9bbb44e"}, - {file = "cython-3.1.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be24fcde7300a81712af279467ebc79baafc8483eb4dfa4daebf8ee90a826d39"}, - {file = "cython-3.1.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5012025af433bd7188fe1f7705df1c4a67e7add80c71658f6c6bc35ea876cc68"}, - {file = "cython-3.1.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b3520e2d4484f927c3ec00d32ffda75ec72cfd6a2ee07adac721cce339fa26f"}, - {file = "cython-3.1.6-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c8a01d241d775319bcd7adb4144b070e1c4b01cdf841a62032492f07fad9efdc"}, - {file = "cython-3.1.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:fd88799fa7bb177182423e0745c9197c50938c6839ebfbe6fd01539582ed488e"}, - {file = "cython-3.1.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f809bae2e00b79c01ff5daf9a260df7c1bc9fda087b9d625592fa28c1a2248a9"}, - {file = "cython-3.1.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f657e7a4b2242d159de603f280928d8e458dfba48144714774ad76c08f5a530"}, - {file = "cython-3.1.6-cp312-cp312-win32.whl", hash = "sha256:6502f3e58db0ab3e2c983bec2c8c9e45d602e2c7ff921a5a8515b0008d918102"}, - {file = "cython-3.1.6-cp312-cp312-win_amd64.whl", hash = "sha256:71d099d8d6094c5de63a32e67b29964565aed889a218e8d16a94083f4239b904"}, - {file = "cython-3.1.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:14f0d6b9f803eacf48e9e80ea12a03f54e5f5ac48914341b0a6b81554b3b3154"}, - {file = "cython-3.1.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ec79615d0e29fa29fd4283bc7a2ed9c3d00532086a0031532d64b724db8c3e8e"}, - {file = "cython-3.1.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:037d457738cf4fc12260946c6524b745f488cf413428099f2a064af7612d181f"}, - {file = "cython-3.1.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b036cb4ed7abcbc89cc04311832b22ad386c532fdd1fe690e1364aa992a54c7"}, - {file = "cython-3.1.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e0fb2694327834c5bda7c5a07605f76437354d0ff76bb8739e77b479d176cf52"}, - {file = "cython-3.1.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92eb7a39e60426165a5b2a219af181e5695c4dedd598e317a7a4d9086bd66b91"}, - {file = "cython-3.1.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:c475018b28f4e7111148bd02b600595090e0aac6cc49615c4586bb4e7f164a22"}, - {file = "cython-3.1.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b1b4bb661103cb95c6ca70daf5d39992b2d89fd260b02a54d92e365095ed37eb"}, - {file = "cython-3.1.6-cp313-cp313-win32.whl", hash = "sha256:69b1bea23b51628b8c9f14c3e0bb4c7dd5be63781bfbaa581b1c683b473c728a"}, - {file = "cython-3.1.6-cp313-cp313-win_amd64.whl", hash = "sha256:c844004712a9fe2a6f2ed4d6fe02aabb2e0e34f88c150724aad1afec7caff37a"}, - {file = "cython-3.1.6-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:8893619efa77fc83934c1255c619d522711a5cf5933cef0d5c2b9755e8e5fabc"}, - {file = "cython-3.1.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:bb49c74220af0b098f406701f0b87876b1c7614716d39786306986b9feea774b"}, - {file = "cython-3.1.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:defbf9571fca78e8a6e21b93d35c0a491d6af77a8e6180a0146da1b3c8eb8ce6"}, - {file = "cython-3.1.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cd7ea8c6ce0adf52d142bf37c4d54b8d0356818144a4584a24f2a0b9cdae6b8"}, - {file = "cython-3.1.6-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c47fcc47553214e0a139fd33199d825c5d13970cd6c1039d2594af855ffb338"}, - {file = "cython-3.1.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:92489385bca6d1935913540e35701a979618fdfeed4dbec6cad1be924fb487bf"}, - {file = "cython-3.1.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:926a3efd9b7012cdb3df0d1886e6f0e32e0b72a5d311ac2d3f48c0716fd91c6d"}, - {file = "cython-3.1.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e35118eedfa0138154a43fb6b14e83703dae93193ba9940c747c170ed845cca7"}, - {file = "cython-3.1.6-cp314-cp314-win32.whl", hash = "sha256:27f2b26442737d6e080900284883e078aae0276dfd7715a49b338f1a9481f7b9"}, - {file = "cython-3.1.6-cp314-cp314-win_amd64.whl", hash = "sha256:7f75ead2a7cad5ee719427b915711c70e40a114f045b2a9b5bd983484a0b83a7"}, - {file = "cython-3.1.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9fdc17c4b0b1b5fba32880b718b89062e001b65695939a3db27586f0b6d0199e"}, - {file = "cython-3.1.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8a1b288238f4e33dbb51cf7263582821cc57f98a78d1ede6e64fab424969503c"}, - {file = "cython-3.1.6-cp38-cp38-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a0e3a2b307c6e48e1a9ad12ca487906f8783b5473157bd4563b680e85949b3bf"}, - {file = "cython-3.1.6-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:81e6fe7eb6bb902fc86b97672f284a5c04c9c5f14e2466fb65e6ee68a27dbff7"}, - {file = "cython-3.1.6-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1059d0f5b5cf654c280721e6d07b8b2dfd104b3b8336449dc41e1abf6f09392"}, - {file = "cython-3.1.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:48e7dba361cc6ffaf90623e20a7a663bc19e9a24bcfdabbe87deef4d816abedb"}, - {file = "cython-3.1.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:162d4207e79894b2094c7152192a40aa0782c9d61b4c5e6fe087a1c4c1d5eb41"}, - {file = "cython-3.1.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f04b5b7e594ae7a43fe17812f8ab1a3b76b69e487c338b71f0def6edaa4c851d"}, - {file = "cython-3.1.6-cp38-cp38-win32.whl", hash = "sha256:206f44565f9fbb3806c0b7cd7184944ab1e9f53a367a657dd459140fa37ef858"}, - {file = "cython-3.1.6-cp38-cp38-win_amd64.whl", hash = "sha256:ca1ae069ed8ba89343e55513f541ac06674d5888e218ec3bb08810c2dfe53024"}, - {file = "cython-3.1.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f91791319fff49e41acee86f7933e3f2c186610898b899d3dbf209dfcffa1ccd"}, - {file = "cython-3.1.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2375531527162296fef6c2b4db6801a704a164235d6981098381a76defe1ed46"}, - {file = "cython-3.1.6-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5ca38c150c486025d937cdf5c82830eea1c69d9f1ab9b34e877365f96c73a63d"}, - {file = "cython-3.1.6-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f8dd368ec73dbed6f3022d03a37d1ed23285b1e41f736da6f34cb8fc14892bfb"}, - {file = "cython-3.1.6-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7735d1b301a99a85a20758cddd9d66a33b36c225efe9de0e17c0abd998f2f32"}, - {file = "cython-3.1.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6c19cbfb3adcbec754742e9fd096cdb8537e9f7dabcf376c78e02d145ec30c99"}, - {file = "cython-3.1.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:958cb56acced5faf22c9ec8eace122b9ee7e591b089ee1dcf0ed1b4511122653"}, - {file = "cython-3.1.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:07f8231e45cfedbfbd384c9bcab5c09ebead662ecf4fdf7983e3dc1625a09b13"}, - {file = "cython-3.1.6-cp39-cp39-win32.whl", hash = "sha256:0d28b3f7c580f0a59b4e46524094f7d0a231eb19f679a27bcfc3b13c0599fc88"}, - {file = "cython-3.1.6-cp39-cp39-win_amd64.whl", hash = "sha256:ea8e5e190b0aa628e0cfabd3200453fdbe8efc7ee5a7eef409c4e5a0975d9b57"}, - {file = "cython-3.1.6-py3-none-any.whl", hash = "sha256:91dcf7eb9b6a089ce4e9e1140e571d84c3bca834afb77ec269be7aa9d31a8157"}, - {file = "cython-3.1.6.tar.gz", hash = "sha256:ff4ccffcf98f30ab5723fc45a39c0548a3f6ab14f01d73930c5bfaea455ff01c"}, + {file = "cython-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee408125b2d218ec7d7a061e09d24715fcab9bf7ea1a4ac01907c3f8ec8730b3"}, + {file = "cython-3.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c93ce307b05fcd86a5bb0e4a7d7fab238e2f0e9936636097a60bc0e21f2def30"}, + {file = "cython-3.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:191cfc2fa84642ad41a52d5abaacfb330d9a6653a465e4bf0a5681f66197a967"}, + {file = "cython-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:a259053037ef82959b743b7fde238bd191ee43f88eb8e51101d5f3d8849f1e32"}, + {file = "cython-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e9e4b2248dc3a98b86aeba65e9862d2cc881d072c163c0fb31b511d4d72e93c8"}, + {file = "cython-3.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02fb4990a83d5d6f780dda18ed8baa8d587cb6523f57b4d72bc0b41ad3766c96"}, + {file = "cython-3.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a98925517819d62ea25d2cf40057df60a9bcf75fdd1d6ed3882e6ae0730d82f"}, + {file = "cython-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:4c959a5d4cd6331e8498822ba47200bd2ff4bf74517c0c91475d5bc21da3b4d5"}, + {file = "cython-3.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:511d823d9f8a1b850178ec355d6df0a1731b9c20b08ee6d1a780f68215e9013f"}, + {file = "cython-3.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbadeedcb2d135655bcce7380fb28c9e2a75b6810426c12b6e5a6fe6106fafb4"}, + {file = "cython-3.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92d2394a3e3fe704210b5324eb8118333b514af72c98b1e02a6503945825b231"}, + {file = "cython-3.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:73435e56654a34ece57d4c3304a4556a8402cc4ae2d0e30f71c237a985dc5246"}, + {file = "cython-3.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d900e58e826f9a5a27b0e2b50e33473e9986a5bae375c39b0f2e19f2c545fa23"}, + {file = "cython-3.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9d38cd3aab720d21fa6d6ee168228352f69aea0a95bd4fb84e8879c6ed38fbb"}, + {file = "cython-3.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92b31d0b7b0a49b3d2aa94faaf75d44a03174cff2616b341a8853c919e511d51"}, + {file = "cython-3.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:2847b74e76dbad612f6fc7182c12a5f78cffb0d05808fd2c4b638cf02d1aade6"}, + {file = "cython-3.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a0a8274959d538d12f865193dcd67bb5630906e020190c890d2b7c13d31713c6"}, + {file = "cython-3.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a1c800833c25195833805c7c3626a2c30b3baaaa9ba361a1af3bbc379662a8d"}, + {file = "cython-3.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df15af08c21c18a2e848df5954d6fd3310735089b60405132fa4111e2cf7482a"}, + {file = "cython-3.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:9d6876af2132757fff1b42a2f4eaa72482f991863160e3f0dc8f2c812b300ebf"}, + {file = "cython-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d41c8c3d4a98f151ec11b80e5aa865fce0cec2b5c7f49ed477e06d6aa03fe17c"}, + {file = "cython-3.2.0-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acc01538767f9bd467494860f0ec0644d6f6ba5bd768b7f14d7b404a459b19fa"}, + {file = "cython-3.2.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f237b1fa3d1c527a0f848d527b3013dd6f89ef2ab3907d79dd84415465fd755d"}, + {file = "cython-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:b8461df22d8ea1233eceeaf329d359c8870023f48515209eb0b79902583f7207"}, + {file = "cython-3.2.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:04821ce06598a3aa5c9e0270d98960cfe6556dedbd1418c65e4479162b8ae74a"}, + {file = "cython-3.2.0-cp39-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:54b5b1c72a63da822b3f4739a0e31546c0a19f8e834b174906bf817ed5f9d65f"}, + {file = "cython-3.2.0-cp39-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6155a6c360e32af1aaa16fa10b0119b49deeadff42a1958973324150870af1b5"}, + {file = "cython-3.2.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:861258ac3878b76c57b9b5a379787d772a0bc47fec9167b43986777de542c474"}, + {file = "cython-3.2.0-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:85dbf955e3193893d0288105afa0fa5f4e835ff587061681f240a4f0487c44fb"}, + {file = "cython-3.2.0-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3b3f13822526726bac43275c0e92916bbcc2c30e9f559edc4c1132670b70498d"}, + {file = "cython-3.2.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ab18d09673d219008be5b6174bcbb6dbfd50904e66371f104a8a4698b791472d"}, + {file = "cython-3.2.0-cp39-abi3-win32.whl", hash = "sha256:c9fd986413fc52929b916187630a9abab9f876299951488c4b905ad5346afee6"}, + {file = "cython-3.2.0-cp39-abi3-win_arm64.whl", hash = "sha256:ee2ea79ddeb721f912e7efea039b9db059c81767ff04fbf9a995f64e1187df99"}, + {file = "cython-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b6e5df85f6dca0ccad0d86f7517d70653d74fcd9e739fc5eb8fb23312f07b73d"}, + {file = "cython-3.2.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eba59b55e9d743b5b62a57cef942688c1f52e09632ea6f25b3bbe6c47ecc2db2"}, + {file = "cython-3.2.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fdc6f4a34af5122490b154eb2878b6377b36844e42476c42472dfe5afbac7533"}, + {file = "cython-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b54abd3dfd2bf43fdcba1a27fcfe1012a4b196ab77d7fd20fb97942d1ac0ed5"}, + {file = "cython-3.2.0-py3-none-any.whl", hash = "sha256:73f7f4c75acde5b5b4df05b11fdc2705ec637b99241d1bc2f4ebf345f7a2ea90"}, + {file = "cython-3.2.0.tar.gz", hash = "sha256:41fdce8237baee2d961c292ed0386903dfe126f131e450a62de0fd7a5280d4b2"}, ] [[package]] @@ -2470,22 +2441,20 @@ files = [ [[package]] name = "img2pdf" -version = "0.6.1" -description = "Convert images to PDF via direct JPEG inclusion." +version = "0.6.3" +description = "Lossless conversion of raster images to PDF." optional = false -python-versions = "*" +python-versions = ">=3.5" groups = ["main"] files = [ - {file = "img2pdf-0.6.1.tar.gz", hash = "sha256:306e279eb832bc159d7d6294b697a9fbd11b4be1f799b14b3b2174fb506af289"}, + {file = "img2pdf-0.6.3-py3-none-any.whl", hash = "sha256:44d12d235752edd17c43c04ff39952cdc5dd4c6aba90569c4902bd445085266b"}, + {file = "img2pdf-0.6.3.tar.gz", hash = "sha256:219518020f5bd242bdc46493941ea3f756f664c2e86f2454721e74353f58cd95"}, ] [package.dependencies] pikepdf = "*" Pillow = "*" -[package.extras] -gui = ["tkinter"] - [[package]] name = "iso3166" version = "2.1.1" @@ -3696,6 +3665,31 @@ files = [ {file = "mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558"}, ] +[[package]] +name = "narwhals" +version = "2.10.2" +description = "Extremely lightweight compatibility layer between dataframe libraries" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "narwhals-2.10.2-py3-none-any.whl", hash = "sha256:059cd5c6751161b97baedcaf17a514c972af6a70f36a89af17de1a0caf519c43"}, + {file = "narwhals-2.10.2.tar.gz", hash = "sha256:ff738a08bc993cbb792266bec15346c1d85cc68fdfe82a23283c3713f78bd354"}, +] + +[package.extras] +cudf = ["cudf (>=24.10.0)"] +dask = ["dask[dataframe] (>=2024.8)"] +duckdb = ["duckdb (>=1.1)"] +ibis = ["ibis-framework (>=6.0.0)", "packaging", "pyarrow-hotfix", "rich"] +modin = ["modin"] +pandas = ["pandas (>=1.1.3)"] +polars = ["polars (>=0.20.4)"] +pyarrow = ["pyarrow (>=13.0.0)"] +pyspark = ["pyspark (>=3.5.0)"] +pyspark-connect = ["pyspark[connect] (>=3.5.0)"] +sqlframe = ["sqlframe (>=3.22.0,!=3.39.3)"] + [[package]] name = "nextcloud-api-wrapper" version = "0.2.3" @@ -3932,14 +3926,14 @@ full = ["XLMMacroDeobfuscator"] [[package]] name = "openai" -version = "2.6.1" +version = "2.7.1" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "openai-2.6.1-py3-none-any.whl", hash = "sha256:904e4b5254a8416746a2f05649594fa41b19d799843cd134dac86167e094edef"}, - {file = "openai-2.6.1.tar.gz", hash = "sha256:27ae704d190615fca0c0fc2b796a38f8b5879645a3a52c9c453b23f97141bb49"}, + {file = "openai-2.7.1-py3-none-any.whl", hash = "sha256:2f2530354d94c59c614645a4662b9dab0a5b881c5cd767a8587398feac0c9021"}, + {file = "openai-2.7.1.tar.gz", hash = "sha256:df4d4a3622b2df3475ead8eb0fbb3c27fd1c070fa2e55d778ca4f40e0186c726"}, ] [package.dependencies] @@ -3975,14 +3969,14 @@ et-xmlfile = "*" [[package]] name = "openupgradelib" -version = "3.11.1" +version = "3.12.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" groups = ["main"] files = [ - {file = "openupgradelib-3.11.1-py2.py3-none-any.whl", hash = "sha256:e34c57c835e6434171ceebe00d4a6b3245351135c602b39b868d7f82912efc56"}, - {file = "openupgradelib-3.11.1.tar.gz", hash = "sha256:b37adbf37b94e649febb99eaa887ee218c3b372061087e35e3901af585d8cbed"}, + {file = "openupgradelib-3.12.0-py2.py3-none-any.whl", hash = "sha256:f8f624f4863b2257f760a9959ddd3cfee650b8f4a8740610506c4473ed36b679"}, + {file = "openupgradelib-3.12.0.tar.gz", hash = "sha256:3f3cd2475f7eb387fb0c364b7d2828b268dcf6e9c83aecccfbfe5c76cc69e4d7"}, ] [package.dependencies] @@ -4214,6 +4208,21 @@ files = [ [package.dependencies] pycryptodome = "*" +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + [[package]] name = "phonenumbers" version = "9.0.17" @@ -4387,6 +4396,30 @@ docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx- test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] type = ["mypy (>=1.18.2)"] +[[package]] +name = "plotly" +version = "6.4.0" +description = "An open-source interactive data visualization library for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "plotly-6.4.0-py3-none-any.whl", hash = "sha256:a1062eafbdc657976c2eedd276c90e184ccd6c21282a5e9ee8f20efca9c9a4c5"}, + {file = "plotly-6.4.0.tar.gz", hash = "sha256:68c6db2ed2180289ef978f087841148b7efda687552276da15a6e9b92107052a"}, +] + +[package.dependencies] +narwhals = ">=1.15.1" +packaging = "*" + +[package.extras] +dev = ["plotly[dev-optional]"] +dev-build = ["build", "jupyter", "plotly[dev-core]"] +dev-core = ["pytest", "requests", "ruff (==0.11.12)"] +dev-optional = ["anywidget", "colorcet", "fiona (<=1.9.6) ; python_version <= \"3.8\"", "geopandas", "inflect", "numpy", "orjson", "pandas", "pdfrw", "pillow", "plotly-geo", "plotly[dev-build]", "plotly[kaleido]", "polars[timezone]", "pyarrow", "pyshp", "pytz", "scikit-image", "scipy", "shapely", "statsmodels", "vaex ; python_version <= \"3.9\"", "xarray"] +express = ["numpy"] +kaleido = ["kaleido (>=1.1.0)"] + [[package]] name = "ply" version = "3.11" @@ -4652,6 +4685,18 @@ files = [ {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, ] +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + [[package]] name = "py3dns" version = "4.0.2" @@ -5181,62 +5226,19 @@ pylint = ">=1.7" [[package]] name = "pymssql" -version = "2.3.8" +version = "2.3.9.dev9" description = "DB-API interface to Microsoft SQL Server for Python. (new Cython-based version)" optional = false python-versions = ">=3.9" groups = ["main"] -files = [ - {file = "pymssql-2.3.8-cp310-cp310-macosx_13_0_x86_64.whl", hash = "sha256:529c972bfc907baff8f30d9d397471c2786a3293a849490f908c6c79b0687c73"}, - {file = "pymssql-2.3.8-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:f463a6e6098fea2a51c099a68f95477e182a218714636f2ccfcb513cef1d43a8"}, - {file = "pymssql-2.3.8-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6ac50be6b83f3324b08ea7025d885b4061db0ccd4e71b1ba420a5b5e26d0a4ab"}, - {file = "pymssql-2.3.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d0f3e2df22e5d73add12613c764bbb5fe7d26119c9cb2aa9de311f514a0060eb"}, - {file = "pymssql-2.3.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bdc738cfae0889940cffd51bb4e45589ddf42c6464ca570dd5982b2b1defc70b"}, - {file = "pymssql-2.3.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e3dff5e1523de22a8fa5c304c9c262e56ef28207c6e2551fe2aff8395f03b459"}, - {file = "pymssql-2.3.8-cp310-cp310-win32.whl", hash = "sha256:d3bd82ce1b42ae95e0da06b861a31b3c946bdac1ead0226f72a18f4f7eced136"}, - {file = "pymssql-2.3.8-cp310-cp310-win_amd64.whl", hash = "sha256:df127a9c5436561734873e5ce06c64abe1c21460e06cbdc02f3310c291bee323"}, - {file = "pymssql-2.3.8-cp311-cp311-macosx_13_0_x86_64.whl", hash = "sha256:47cecf5c518b8c20e7e3ac01040976f11520a2ba5726090698a96b3913832a51"}, - {file = "pymssql-2.3.8-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:41ea98df3e7f3ee1a9b6e41e612d0cd6c25474583929dcfea6d2cc322ff687b2"}, - {file = "pymssql-2.3.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a56c4e223c5ddda5e512e18c03fad494f296fc1a2aa03bec38ffd547b7d8c778"}, - {file = "pymssql-2.3.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:48d18f9e160b30c6d8c9b52172b0abc641504ec5156166c69b8e2caef2a130f8"}, - {file = "pymssql-2.3.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4a0848bcc42eab68cbc276f7bcb279eeda4ef1ca214e8aa28836af9f6a9dd100"}, - {file = "pymssql-2.3.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:17dd3cdf9f7cd404ccb768d39208b4ac4a80af648c2914ae41d7b4613d9103b5"}, - {file = "pymssql-2.3.8-cp311-cp311-win32.whl", hash = "sha256:a88707041e063702b6d643c52b4e86043c4830f714e871c7d2cefb10feb13120"}, - {file = "pymssql-2.3.8-cp311-cp311-win_amd64.whl", hash = "sha256:37539c9ee4984ecbdff871b171463f9a18236d697baf04b07b910e610e4b9416"}, - {file = "pymssql-2.3.8-cp312-cp312-macosx_13_0_x86_64.whl", hash = "sha256:97d30d1634a6f327cd4803129717640b4c41eb892a73cb009b26c8e25c70350b"}, - {file = "pymssql-2.3.8-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:661fea7c04a4f1d4392de36dbf15e8133057ba0afbb0ecc49d5a01d8c6e4f915"}, - {file = "pymssql-2.3.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:dca810c23dfa3e7becfcd70ae1ffe10971fba4a008df466e27e12e53398caa44"}, - {file = "pymssql-2.3.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c4ea3e64f46f84da7868f1a47e0fad74002955540907e75afa23fa6c6f561386"}, - {file = "pymssql-2.3.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f518f26dccb614ea6bfc6cab49e6b8eb8ff4409b0e669818742a56e172e57549"}, - {file = "pymssql-2.3.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dd53fc6f3d92aeadb9a7b7e301c7dce75d681552dc48d6e09da508a129d6a11a"}, - {file = "pymssql-2.3.8-cp312-cp312-win32.whl", hash = "sha256:bd311d4371c6ed0165d1dabd9136c89182d484a84b7bd445eb34c549349895a1"}, - {file = "pymssql-2.3.8-cp312-cp312-win_amd64.whl", hash = "sha256:8a1c490ba6dc2428d33b4d09274c8b7e4f6efdddb2ac3f1d52be600970e61492"}, - {file = "pymssql-2.3.8-cp313-cp313-macosx_13_0_x86_64.whl", hash = "sha256:0076d87b3356e54f0a5dfc3a06a29bc190f6a37ead55f0e715e294cb2855587e"}, - {file = "pymssql-2.3.8-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:d74430323c5de9a05d8d6635172329a5ae273ec76216ac4dac14fc8a5cf872d4"}, - {file = "pymssql-2.3.8-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:073a9d561bf12936e7893bb8263762c6fbc075d24c323d47c451c18f84be5c58"}, - {file = "pymssql-2.3.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:420d777fa02ea22d96f61b71d9105bbf897a97c3149463a7cdd43660713a353d"}, - {file = "pymssql-2.3.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6ad9ae915565539b5f31ae78be5e8c95d22bd28933ca062c13921f3be1215f2d"}, - {file = "pymssql-2.3.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:135026a2c3f23d56dbc0d3ad0ff4f738e3fd31dc580991cce88e40b544224317"}, - {file = "pymssql-2.3.8-cp313-cp313-win32.whl", hash = "sha256:f1bb87e4ce18177b8096dc3a68101cacd4601b1f0a67d98b5a072f7ba9a3b6b1"}, - {file = "pymssql-2.3.8-cp313-cp313-win_amd64.whl", hash = "sha256:54ae2ae15b36a8054777c287b22532bcac94f500ddb5a1e0d232abca047cba1e"}, - {file = "pymssql-2.3.8-cp314-cp314-macosx_13_0_x86_64.whl", hash = "sha256:7d344e8b4cedab51e9925e08ce6267880f6dac055bd3ad1592d067f9cc2c09bd"}, - {file = "pymssql-2.3.8-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:6312649353964b9b71204abd5b89135d105bc2ce04f2a9f465be6bc77ea53d1a"}, - {file = "pymssql-2.3.8-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:9f8222024df048a76f2eec0b4f246efaed7a9947a322c251151d683a4bfabe4c"}, - {file = "pymssql-2.3.8-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:af6d1d0beed286f73d7d9af0b3a8bdb46cd2a0ad12c92fd601d324ee85c45aa6"}, - {file = "pymssql-2.3.8-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9b18e79e1747f5a1b3b28214af235f8e16dff49c512a9be6a13995520dc22af1"}, - {file = "pymssql-2.3.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9d733862687dd1f9406137d43149ee597a1a50263128e7e3543cdecd0ad262d"}, - {file = "pymssql-2.3.8-cp314-cp314-win32.whl", hash = "sha256:61b5c1e13803bb15d31b1986cbf0c7fef7f16ddb55ef933d7d78f39adad6f149"}, - {file = "pymssql-2.3.8-cp314-cp314-win_amd64.whl", hash = "sha256:d6d303a443ba12d62992c1d2fb0dfec566e2d1462ace9f3382db695f7f0dfbf0"}, - {file = "pymssql-2.3.8-cp39-cp39-macosx_13_0_x86_64.whl", hash = "sha256:36cef59bd1fc38ab86ef8b5a4418dc5f58c12915e6ad7019d10365e33ceb05a0"}, - {file = "pymssql-2.3.8-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:6672cd9654319a7034401324e8807a987b68a9c7ab90b9b44a7ccfab99be6b19"}, - {file = "pymssql-2.3.8-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f618efd281ac92d817b4f1e1cb2dcea75155bfbb9fe2bafaad1a3e9779ff630a"}, - {file = "pymssql-2.3.8-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:46f91067d365574b4d10768fe38a54e9af959517f8da2ef823ac22cf9f74c9e7"}, - {file = "pymssql-2.3.8-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4ea9a632382684953f3d60b6308506809465efdb49c347b8990486be2c1a5eb1"}, - {file = "pymssql-2.3.8-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c416f30a9a54e1face069f1dfe0f8dcdd5c02b3767dfd9ce87dd2ac46a86e1d4"}, - {file = "pymssql-2.3.8-cp39-cp39-win32.whl", hash = "sha256:b095f3aa9db0fb104647b066d34827e5cc80d0a957b904ac129993f42d4199bb"}, - {file = "pymssql-2.3.8-cp39-cp39-win_amd64.whl", hash = "sha256:85c12f9402e68821a552a09959bdd5c95d136cba41b8f351696c55a47a4b6e94"}, - {file = "pymssql-2.3.8.tar.gz", hash = "sha256:dafa4887d697503ac890db316470be22d9b4023487e6425ba67aa0a6681babf5"}, -] +files = [] +develop = false + +[package.source] +type = "git" +url = "https://github.com/pymssql/pymssql.git" +reference = "HEAD" +resolved_reference = "da1ef7e5623ef262dd0e4fbc2119106ca8f7e41e" [[package]] name = "pymysql" @@ -5469,20 +5471,20 @@ certifi = "*" [[package]] name = "pyrdfa3" -version = "3.6.4" +version = "3.6.2" description = "pyRdfa distiller/parser library" optional = false -python-versions = ">=3.8" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "pyRdfa3-3.6.4-py3-none-any.whl", hash = "sha256:ed11affa5567ab7afdbc939a58f9286a274447f3ab2999c260c56b5c6e87fb2f"}, - {file = "pyrdfa3-3.6.4.tar.gz", hash = "sha256:64712d1a4bf21829652b39715bada6e7c03bcf19cb49f962c190a38f46172243"}, + {file = "pyRdfa3-3.6.2-py3-none-any.whl", hash = "sha256:290c2fa966ddd1b45ac94a727da144f5a233ed58c63c370e3d68e6d00b0dee5d"}, + {file = "pyRdfa3-3.6.2.tar.gz", hash = "sha256:73681dab957f60901696767388b956a5769c730bc451da6ffb2f0e36f18314c2"}, ] [package.dependencies] html5lib = ">=1.1" -rdflib = ">=7.0.0" -requests = ">=2.32.3" +rdflib = ">=6.1.1" +requests = ">=2.25.1" [[package]] name = "pysaml2" @@ -5653,6 +5655,24 @@ files = [ pyasn1 = ">=0.3.7" pyasn1_modules = ">=0.1.5" +[[package]] +name = "python-pptx" +version = "1.0.2" +description = "Create, read, and update PowerPoint 2007+ (.pptx) files." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "python_pptx-1.0.2-py3-none-any.whl", hash = "sha256:160838e0b8565a8b1f67947675886e9fea18aa5e795db7ae531606d68e785cba"}, + {file = "python_pptx-1.0.2.tar.gz", hash = "sha256:479a8af0eaf0f0d76b6f00b0887732874ad2e3188230315290cd1f9dd9cc7095"}, +] + +[package.dependencies] +lxml = ">=3.1.0" +Pillow = ">=3.3.2" +typing-extensions = ">=4.9.0" +XlsxWriter = ">=0.5.7" + [[package]] name = "python-resize-image" version = "1.1.20" @@ -6551,6 +6571,28 @@ webencodings = ">=0.4" doc = ["sphinx", "sphinx_rtd_theme"] test = ["pytest", "ruff"] +[[package]] +name = "tldextract" +version = "5.3.0" +description = "Accurately separates a URL's subdomain, domain, and public suffix, using the Public Suffix List (PSL). By default, this includes the public ICANN TLDs and their exceptions. You can optionally support the Public Suffix List's private domains as well." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "tldextract-5.3.0-py3-none-any.whl", hash = "sha256:f70f31d10b55c83993f55e91ecb7c5d84532a8972f22ec578ecfbe5ea2292db2"}, + {file = "tldextract-5.3.0.tar.gz", hash = "sha256:b3d2b70a1594a0ecfa6967d57251527d58e00bb5a91a74387baa0d87a0678609"}, +] + +[package.dependencies] +filelock = ">=3.0.8" +idna = "*" +requests = ">=2.1.0" +requests-file = ">=1.4" + +[package.extras] +release = ["build", "twine"] +testing = ["mypy", "pytest", "pytest-gitignore", "pytest-mock", "responses", "ruff", "syrupy", "tox", "tox-uv", "types-filelock", "types-requests"] + [[package]] name = "tomlkit" version = "0.13.3" @@ -6734,6 +6776,70 @@ secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17. socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] +[[package]] +name = "uvloop" +version = "0.22.1" +description = "Fast implementation of asyncio event loop on top of libuv" +optional = false +python-versions = ">=3.8.1" +groups = ["main"] +files = [ + {file = "uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c"}, + {file = "uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792"}, + {file = "uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86"}, + {file = "uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd"}, + {file = "uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2"}, + {file = "uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec"}, + {file = "uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9"}, + {file = "uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77"}, + {file = "uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21"}, + {file = "uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702"}, + {file = "uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733"}, + {file = "uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473"}, + {file = "uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42"}, + {file = "uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6"}, + {file = "uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370"}, + {file = "uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4"}, + {file = "uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2"}, + {file = "uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0"}, + {file = "uvloop-0.22.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:561577354eb94200d75aca23fbde86ee11be36b00e52a4eaf8f50fb0c86b7705"}, + {file = "uvloop-0.22.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1cdf5192ab3e674ca26da2eada35b288d2fa49fdd0f357a19f0e7c4e7d5077c8"}, + {file = "uvloop-0.22.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e2ea3d6190a2968f4a14a23019d3b16870dd2190cd69c8180f7c632d21de68d"}, + {file = "uvloop-0.22.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0530a5fbad9c9e4ee3f2b33b148c6a64d47bbad8000ea63704fa8260f4cf728e"}, + {file = "uvloop-0.22.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc5ef13bbc10b5335792360623cc378d52d7e62c2de64660616478c32cd0598e"}, + {file = "uvloop-0.22.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1f38ec5e3f18c8a10ded09742f7fb8de0108796eb673f30ce7762ce1b8550cad"}, + {file = "uvloop-0.22.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3879b88423ec7e97cd4eba2a443aa26ed4e59b45e6b76aabf13fe2f27023a142"}, + {file = "uvloop-0.22.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4baa86acedf1d62115c1dc6ad1e17134476688f08c6efd8a2ab076e815665c74"}, + {file = "uvloop-0.22.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:297c27d8003520596236bdb2335e6b3f649480bd09e00d1e3a99144b691d2a35"}, + {file = "uvloop-0.22.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1955d5a1dd43198244d47664a5858082a3239766a839b2102a269aaff7a4e25"}, + {file = "uvloop-0.22.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b31dc2fccbd42adc73bc4e7cdbae4fc5086cf378979e53ca5d0301838c5682c6"}, + {file = "uvloop-0.22.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:93f617675b2d03af4e72a5333ef89450dfaa5321303ede6e67ba9c9d26878079"}, + {file = "uvloop-0.22.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:37554f70528f60cad66945b885eb01f1bb514f132d92b6eeed1c90fd54ed6289"}, + {file = "uvloop-0.22.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b76324e2dc033a0b2f435f33eb88ff9913c156ef78e153fb210e03c13da746b3"}, + {file = "uvloop-0.22.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:badb4d8e58ee08dad957002027830d5c3b06aea446a6a3744483c2b3b745345c"}, + {file = "uvloop-0.22.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b91328c72635f6f9e0282e4a57da7470c7350ab1c9f48546c0f2866205349d21"}, + {file = "uvloop-0.22.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:daf620c2995d193449393d6c62131b3fbd40a63bf7b307a1527856ace637fe88"}, + {file = "uvloop-0.22.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6cde23eeda1a25c75b2e07d39970f3374105d5eafbaab2a4482be82f272d5a5e"}, + {file = "uvloop-0.22.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:80eee091fe128e425177fbd82f8635769e2f32ec9daf6468286ec57ec0313efa"}, + {file = "uvloop-0.22.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:017bd46f9e7b78e81606329d07141d3da446f8798c6baeec124260e22c262772"}, + {file = "uvloop-0.22.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3e5c6727a57cb6558592a95019e504f605d1c54eb86463ee9f7a2dbd411c820"}, + {file = "uvloop-0.22.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57df59d8b48feb0e613d9b1f5e57b7532e97cbaf0d61f7aa9aa32221e84bc4b6"}, + {file = "uvloop-0.22.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:55502bc2c653ed2e9692e8c55cb95b397d33f9f2911e929dc97c4d6b26d04242"}, + {file = "uvloop-0.22.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4a968a72422a097b09042d5fa2c5c590251ad484acf910a651b4b620acd7f193"}, + {file = "uvloop-0.22.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b45649628d816c030dba3c80f8e2689bab1c89518ed10d426036cdc47874dfc4"}, + {file = "uvloop-0.22.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea721dd3203b809039fcc2983f14608dae82b212288b346e0bfe46ec2fab0b7c"}, + {file = "uvloop-0.22.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ae676de143db2b2f60a9696d7eca5bb9d0dd6cc3ac3dad59a8ae7e95f9e1b54"}, + {file = "uvloop-0.22.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17d4e97258b0172dfa107b89aa1eeba3016f4b1974ce85ca3ef6a66b35cbf659"}, + {file = "uvloop-0.22.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:05e4b5f86e621cf3927631789999e697e58f0d2d32675b67d9ca9eb0bca55743"}, + {file = "uvloop-0.22.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:286322a90bea1f9422a470d5d2ad82d38080be0a29c4dd9b3e6384320a4d11e7"}, + {file = "uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f"}, +] + +[package.extras] +dev = ["Cython (>=3.0,<4.0)", "setuptools (>=60)"] +docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinx_rtd_theme (>=0.5.2,<0.6.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["aiohttp (>=3.10.5)", "flake8 (>=6.1,<7.0)", "mypy (>=0.800)", "psutil", "pyOpenSSL (>=25.3.0,<25.4.0)", "pycodestyle (>=2.11.0,<2.12.0)"] + [[package]] name = "validate-email" version = "1.3" @@ -7351,4 +7457,4 @@ bindings = ["ghostscript"] [metadata] lock-version = "2.1" python-versions = ">=3.12.10,<3.13" -content-hash = "0e97844a7cf0de05cca9a8c0a75bd07adea905a048463f4a11440b44085c0094" +content-hash = "ba7450664480f89108a65126adf1fb86de79d27e7597433ee1ccc72f50fb2f1c" diff --git a/requirement/pyproject.odoo18.0_python3.12.10.toml b/requirement/pyproject.odoo18.0_python3.12.10.toml index ee45259..33be676 100644 --- a/requirement/pyproject.odoo18.0_python3.12.10.toml +++ b/requirement/pyproject.odoo18.0_python3.12.10.toml @@ -20,23 +20,23 @@ authors = [ "Mathieu Benoit ",] [tool.poetry.dependencies] python = ">=3.12.10,<3.13" asn1crypto = "1.5.1" -astor = "^0.8.1" avalara = "^25.9.0" babel = "2.10.3" bandit = "^1.8.6" base64io = "^1.0.3" beautifulsoup4 = "4.13.5" bokeh = "3.6.3" -boto3 = "^1.40.64" +boto3 = "^1.40.67" cachetools = "^6.2.1" cairosvg = "^2.8.2" caldav = "1.3.9" cbor2 = "5.6.2" chardet = "5.2.0" code-writer = "^1.2.0" +colorama = "^0.4.6" cryptography = "46.0.3" cssselect = "^1.3.0" -cython = "^3.1.6" +cython = "^3.2.0" decorator = "5.1.1" docutils = "0.20.1" dropbox = "^12.0.2" @@ -59,7 +59,7 @@ greenlet = "3.0.3" httpagentparser = "^1.9.5" icalendar = "5.0.13" idna = "3.6" -img2pdf = "^0.6.1" +img2pdf = "^0.6.3" isort = "6.1.0" jinja2 = "3.1.2" js2py = "^0.74" @@ -81,9 +81,9 @@ num2words = "0.5.13" numpy-stl = "^3.2.0" odoorpc = "^0.10.1" ofxparse = "0.21" -openai = "^2.6.1" +openai = "^2.7.1" openpyxl = "3.1.2" -openupgradelib = "^3.11.1" +openupgradelib = "^3.12.0" openwebui-client = ">=0.3.0" pandas = ">=0.25.3" paramiko = "<4.0.0" @@ -91,8 +91,10 @@ passlib = "1.7.4" pathspec = "^0.12.1" pdf2image = "^1.17.0" pdfminer = "^20191125" +pexpect = "^4.9.0" phonenumbers = "^9.0.17" pillow = "10.2.0" +plotly = "^6.4.0" polib = "1.1.1" pre-commit = "^4.3.0" premailer = "^3.10.0" @@ -110,7 +112,6 @@ pyjsparser = "^2.7.1" pyjwt = "^2.10.1" pylint = "3.3.9" pylint-odoo = "^9.3.22" -pymssql = "^2.3.8" pymysql = "^1.1.2" pyncclient = "^0.7" pyopenssl = "25.3.0" @@ -125,6 +126,7 @@ python-dotenv = ">=1.0.0" python-jose = "^3.5.0" python-json-logger = "^4.0.0" python-ldap = "3.4.4" +python-pptx = "^1.0.2" python-resize-image = "^1.1.20" python-slugify = "^8.0.4" python-stdnum = "1.19" @@ -148,10 +150,12 @@ sentry-sdk = ">=2.0.0,<=2.22.0" setuptools = "80.9.0" shapely = "^2.1.2" statsd = "^4.0.1" +tldextract = "^5.3.0" tweepy = "^4.16.0" twilio = "^9.8.5" unidecode = "^1.4.0" urllib3 = "2.0.7" +uvloop = "^0.22.1" validate-email = "^1.3" vobject = "0.9.6.1" w3lib = "^2.3.1" @@ -163,6 +167,9 @@ xlwt = "1.3.0" xmltodict = "0.13.0" zeep = "4.2.1" +[tool.poetry.dependencies.astor] +git = "https://github.com/berkerpeksag/astor.git" + [tool.poetry.dependencies.black] git = "https://github.com/psf/black.git" rev = "24.8.0" @@ -171,6 +178,9 @@ rev = "24.8.0" extras = [ "s3",] version = "^2025.10.0" +[tool.poetry.dependencies.pymssql] +git = "https://github.com/pymssql/pymssql.git" + [tool.poetry.dependencies.pysaml2] git = "https://github.com/prauscher/pysaml2.git" rev = "replace-pyopenssl" diff --git a/requirement/requirements.odoo18.0_python3.12.10.txt b/requirement/requirements.odoo18.0_python3.12.10.txt index 84522ab..5cb971d 100644 --- a/requirement/requirements.odoo18.0_python3.12.10.txt +++ b/requirement/requirements.odoo18.0_python3.12.10.txt @@ -64,3 +64,9 @@ cryptography==46.0.3 pyopenssl==25.3.0 # This will ignore pyopenssl from pysaml2==7.5.4 git+https://github.com/prauscher/pysaml2.git@replace-pyopenssl + +# Fix compilation, until pymssql==2.3.9 is release +git+https://github.com/pymssql/pymssql.git + +# Force last version, because too old into pip +git+https://github.com/berkerpeksag/astor.git diff --git a/script/addons/check_addons_exist.py b/script/addons/check_addons_exist.py index 0e9299b..11ff625 100755 --- a/script/addons/check_addons_exist.py +++ b/script/addons/check_addons_exist.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/create_from_existing_module.py b/script/code_generator/create_from_existing_module.py index 708d3f2..bf451be 100755 --- a/script/code_generator/create_from_existing_module.py +++ b/script/code_generator/create_from_existing_module.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/new_project.py b/script/code_generator/new_project.py index 4a9227a..6c4a472 100755 --- a/script/code_generator/new_project.py +++ b/script/code_generator/new_project.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse @@ -14,7 +14,6 @@ import uuid from git import Repo from git.exc import InvalidGitRepositoryError, NoSuchPathError - logging.basicConfig( format=( "%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d]" @@ -383,10 +382,7 @@ class ProjectManagement: os.system(cmd) if not self.keep_bd_alive: - cmd = ( - "./odoo_bin.sh db --drop --database" - f" {bd_name_demo}" - ) + cmd = "./odoo_bin.sh db --drop --database" f" {bd_name_demo}" _logger.info(cmd) os.system(cmd) @@ -467,10 +463,7 @@ class ProjectManagement: os.system(cmd) if not self.keep_bd_alive: - cmd = ( - "./odoo_bin.sh db --drop --database" - f" {bd_name_template}" - ) + cmd = "./odoo_bin.sh db --drop --database" f" {bd_name_template}" _logger.info(cmd) os.system(cmd) @@ -538,10 +531,7 @@ class ProjectManagement: os.system(cmd) if not self.keep_bd_alive: - cmd = ( - "./odoo_bin.sh db --drop --database" - f" {bd_name_generator}" - ) + cmd = "./odoo_bin.sh db --drop --database" f" {bd_name_generator}" _logger.info(cmd) os.system(cmd) diff --git a/script/code_generator/search_class_model.py b/script/code_generator/search_class_model.py index 33fade2..fb6d9d3 100755 --- a/script/code_generator/search_class_model.py +++ b/script/code_generator/search_class_model.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/technical/transform_xml_data_website_page_to_controller.py b/script/code_generator/technical/transform_xml_data_website_page_to_controller.py index 6d2fc41..0b0054f 100644 --- a/script/code_generator/technical/transform_xml_data_website_page_to_controller.py +++ b/script/code_generator/technical/transform_xml_data_website_page_to_controller.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/test_code_generator_update_module.py b/script/code_generator/test_code_generator_update_module.py index 62cbf4c..91040a5 100755 --- a/script/code_generator/test_code_generator_update_module.py +++ b/script/code_generator/test_code_generator_update_module.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/test_transform_python_to_code_writer.py b/script/code_generator/test_transform_python_to_code_writer.py index c2e9472..2dff2a8 100644 --- a/script/code_generator/test_transform_python_to_code_writer.py +++ b/script/code_generator/test_transform_python_to_code_writer.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/transform_python_to_code_writer.py b/script/code_generator/transform_python_to_code_writer.py index e1a16f3..d60ac6a 100755 --- a/script/code_generator/transform_python_to_code_writer.py +++ b/script/code_generator/transform_python_to_code_writer.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/code_generator/transform_xml_to_code_writer.py b/script/code_generator/transform_xml_to_code_writer.py index b9689d4..b35f49d 100644 --- a/script/code_generator/transform_xml_to_code_writer.py +++ b/script/code_generator/transform_xml_to_code_writer.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/database/compare_backup.py b/script/database/compare_backup.py index ddbf58a..52114bf 100755 --- a/script/database/compare_backup.py +++ b/script/database/compare_backup.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/database/compare_database_application.py b/script/database/compare_database_application.py index 90cb5b6..15f1ac4 100755 --- a/script/database/compare_database_application.py +++ b/script/database/compare_database_application.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/database/db_drop_all.py b/script/database/db_drop_all.py index a72066c..ed0fd77 100755 --- a/script/database/db_drop_all.py +++ b/script/database/db_drop_all.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/database/db_restore.py b/script/database/db_restore.py index a1629e8..e6a0bd0 100755 --- a/script/database/db_restore.py +++ b/script/database/db_restore.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/database/download_remote.py b/script/database/download_remote.py index 5e6f239..12e12b5 100644 --- a/script/database/download_remote.py +++ b/script/database/download_remote.py @@ -1,40 +1,48 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) -print("This script only work with localhost:8069, not working with remote instance.") +print( + "This script only work with localhost:8069, not working with remote instance." +) -import requests -import sys import logging +import sys from pathlib import Path -ODOO_URL = '' # Your Odoo server URL -DATABASE_NAME = '' -MASTER_PASSWORD = '' +import requests + +ODOO_URL = "" # Your Odoo server URL +DATABASE_NAME = "" +MASTER_PASSWORD = "" # BACKUP_FORMAT = env('BACKUP_FORMAT', default='zip') # 'zip' or 'dump' -BACKUP_FORMAT = 'zip' # 'zip' or 'dump' -OUTPUT_FILE_NAME = f'{DATABASE_NAME}_backup.{BACKUP_FORMAT}' +BACKUP_FORMAT = "zip" # 'zip' or 'dump' +OUTPUT_FILE_NAME = f"{DATABASE_NAME}_backup.{BACKUP_FORMAT}" # --- Logger Setup --- logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) # TODO not working with remote, only localhost -logger.error("This script is not working with remote instance, only http://127.0.0.1:8069") +logger.error( + "This script is not working with remote instance, only http://127.0.0.1:8069" +) + # --- Function to download the database --- def download_odoo_db(): - logger.info(f"Attempting to download database '{DATABASE_NAME}' from URL '{ODOO_URL}'...") + logger.info( + f"Attempting to download database '{DATABASE_NAME}' from URL '{ODOO_URL}'..." + ) # URL for the backup endpoint - backup_url = f'{ODOO_URL}/web/database/backup' + backup_url = f"{ODOO_URL}/web/database/backup" # Form data for the POST request payload = { - 'master_pwd': MASTER_PASSWORD, - 'name': DATABASE_NAME, - 'backup_format': BACKUP_FORMAT, + "master_pwd": MASTER_PASSWORD, + "name": DATABASE_NAME, + "backup_format": BACKUP_FORMAT, } try: @@ -43,20 +51,28 @@ def download_odoo_db(): response.raise_for_status() # Raise an exception for bad status codes # --- VALIDATION --- - content_type = response.headers.get('Content-Type', '').split(';')[0] + content_type = response.headers.get("Content-Type", "").split(";")[0] # Check if the content type is valid - expected_types = ['application/zip', 'application/octet-stream'] + expected_types = ["application/zip", "application/octet-stream"] if content_type not in expected_types: - logger.error(f"ERROR: Expected one of {expected_types} but got {content_type}.") - logger.error("This usually indicates a server-side error or an incorrect master password.") + logger.error( + f"ERROR: Expected one of {expected_types} but got {content_type}." + ) + logger.error( + "This usually indicates a server-side error or an incorrect master password." + ) sys.exit(1) # Check if the content is an HTML page (to handle incorrect passwords) - first_chunk = next(response.iter_content(chunk_size=128), b'') - if first_chunk.startswith(b'<'): - logger.error("ERROR: It seems the server returned an HTML page instead of a database file.") - logger.error("This is often due to an incorrect master password or an invalid request.") + first_chunk = next(response.iter_content(chunk_size=128), b"") + if first_chunk.startswith(b"<"): + logger.error( + "ERROR: It seems the server returned an HTML page instead of a database file." + ) + logger.error( + "This is often due to an incorrect master password or an invalid request." + ) logger.error("Server Response (First 200 chars):") logger.error(response.text[:200]) sys.exit(1) @@ -65,26 +81,35 @@ def download_odoo_db(): logger.info(f"Download started, saving to '{OUTPUT_FILE_NAME}'...") output_path = Path(OUTPUT_FILE_NAME) - with open(output_path, 'wb') as f: + with open(output_path, "wb") as f: # Write the content from the first chunk to the file f.write(first_chunk) # Continue writing the rest of the stream in chunks for chunk in response.iter_content(chunk_size=8192): f.write(chunk) - logger.info(f"Download successful! File saved at: {output_path.resolve()}") + logger.info( + f"Download successful! File saved at: {output_path.resolve()}" + ) except requests.exceptions.RequestException as e: - logger.error(f"An error occurred while connecting to the Odoo server: {e}") + logger.error( + f"An error occurred while connecting to the Odoo server: {e}" + ) except Exception as e: logger.error(f"An unexpected error occurred: {e}") # --- Script execution --- -if __name__ == '__main__': +if __name__ == "__main__": # Add a simple check to ensure the user has configured the variables - if ODOO_URL == 'http://localhost:8069' and DATABASE_NAME == 'your_database_name': - logger.error("Please configure the ODOO_URL, DATABASE_NAME, and MASTER_PASSWORD variables at the start of the script.") + if ( + ODOO_URL == "http://localhost:8069" + and DATABASE_NAME == "your_database_name" + ): + logger.error( + "Please configure the ODOO_URL, DATABASE_NAME, and MASTER_PASSWORD variables at the start of the script." + ) sys.exit(1) download_odoo_db() diff --git a/script/database/fix_mariadb_sql_example_1.py b/script/database/fix_mariadb_sql_example_1.py index 5a69f1f..333baff 100755 --- a/script/database/fix_mariadb_sql_example_1.py +++ b/script/database/fix_mariadb_sql_example_1.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) from collections import defaultdict @@ -161,19 +161,19 @@ def delete_record(cr): cr.execute(query_search) query_search = """ - DELETE FROM `tbl_commande_membre_produit` + DELETE FROM `tbl_commande_membre_produit` WHERE NoFournisseurProduitCommande in (22659, 22724, 22662, 22663, 22732, 22670, 22705, 22737, 22741, 22679, 22680, 22682, 22655); """ cr.execute(query_search) query_search = """ - DELETE FROM `tbl_echange_service` + DELETE FROM `tbl_echange_service` WHERE NoMembreVendeur in (7703); """ cr.execute(query_search) query_search = """ - DELETE FROM `tbl_categorie_sous_categorie` + DELETE FROM `tbl_categorie_sous_categorie` WHERE NoCategorie in (999); """ cr.execute(query_search) @@ -210,7 +210,7 @@ def migrate_record(cr): i = 0 for sous_categorie_id in lst_sous_categorie: i += 1 - query_search = f"""UPDATE tbl_sous_categorie set NoSousCategorieId={i} + query_search = f"""UPDATE tbl_sous_categorie set NoSousCategorieId={i} WHERE NoCategorie={sous_categorie_id[1]} and NoSousCategorie='{sous_categorie_id[0]}' """ cr.execute(query_search) @@ -232,7 +232,7 @@ def migrate_record(cr): f"Get null from {categorie_sous_categorie_id[2]} and" f" {categorie_sous_categorie_id[1]}" ) - query_search = f"""UPDATE tbl_categorie_sous_categorie set NoSousCategorieId={id_sous_categorie} + query_search = f"""UPDATE tbl_categorie_sous_categorie set NoSousCategorieId={id_sous_categorie} WHERE NoCategorieSousCategorie={categorie_sous_categorie_id[0]} """ cr.execute(query_search) diff --git a/script/database/image_db.py b/script/database/image_db.py index f519a0e..a7ae69f 100755 --- a/script/database/image_db.py +++ b/script/database/image_db.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse @@ -301,18 +301,13 @@ def main(): all_temp_bd = [] # Step 0, drop and restore - cmd_drop_db = ( - f"./odoo_bin.sh db --drop --database {bd_temp_name}" - ) + cmd_drop_db = f"./odoo_bin.sh db --drop --database {bd_temp_name}" all_temp_bd.append(bd_temp_name) run_cmd(cmd_drop_db) if not base_image_name or base_image_name == image_name_to_generate: with_demo = dct_config_image.get("with_demo") # Create a new one - cmd = ( - f"./odoo_bin.sh db --create --database" - f" {bd_temp_name}" - ) + cmd = f"./odoo_bin.sh db --create --database" f" {bd_temp_name}" if with_demo: cmd += " --demo" else: @@ -352,9 +347,7 @@ def main(): # Step 6, clean if ask if not config.keep_database: for db_name in all_temp_bd: - cmd_drop_db = ( - f"./odoo_bin.sh db --drop --database {db_name}" - ) + cmd_drop_db = f"./odoo_bin.sh db --drop --database {db_name}" run_cmd(cmd_drop_db) diff --git a/script/deployment/cloudflare_dns.py b/script/deployment/cloudflare_dns.py index 45a5744..48cead1 100755 --- a/script/deployment/cloudflare_dns.py +++ b/script/deployment/cloudflare_dns.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/deployment/get_public_ip.py b/script/deployment/get_public_ip.py index e7f7405..d71307c 100755 --- a/script/deployment/get_public_ip.py +++ b/script/deployment/get_public_ip.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import requests diff --git a/script/deployment/update_dns_cloudflare.py b/script/deployment/update_dns_cloudflare.py index 98d1d27..8490ba7 100755 --- a/script/deployment/update_dns_cloudflare.py +++ b/script/deployment/update_dns_cloudflare.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/docker/docker_update_version.py b/script/docker/docker_update_version.py index 842cc84..ce18cd3 100755 --- a/script/docker/docker_update_version.py +++ b/script/docker/docker_update_version.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse @@ -7,7 +7,6 @@ import logging import os import sys - new_path = os.path.normpath( os.path.join(os.path.dirname(__file__), "..", "..") ) diff --git a/script/generate_config.sh b/script/generate_config.sh index 57a760c..576bbdc 100755 --- a/script/generate_config.sh +++ b/script/generate_config.sh @@ -31,7 +31,6 @@ if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then printf "${EL_HOME_ODOO_PROJECT}/addons/CybroOdoo_OpenHRMS," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/ERPLibre_erplibre_addons," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/MathBenTech_development," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/MathBenTech_odoo-business-spending-management-quebec-canada," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_account-analytic," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_account-budgeting," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_account-closing," >> "${EL_CONFIG_FILE}" @@ -43,10 +42,9 @@ if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_account-invoicing," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_account-payment," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_account-reconcile," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_agreement," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_apps-store," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_automation," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_bank-payment," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_bank-payment-alternative," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_bank-statement-import," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_brand," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_business-requirement," >> "${EL_CONFIG_FILE}" @@ -59,9 +57,9 @@ if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_connector-jira," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_connector-telephony," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_contract," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_cooperative," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_credit-control," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_crm," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_crowdfunding," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_currency," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_data-protection," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_ddmrp," >> "${EL_CONFIG_FILE}" @@ -70,31 +68,25 @@ if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_donation," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_e-commerce," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_edi," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_edi-framework," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_event," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_field-service," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_fleet," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_geospatial," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_helpdesk," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_hr," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_hr-expense," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_hr-holidays," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_interface-github," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_intrastat-extrastat," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_iot," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_knowledge," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_l10n-canada," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_mail," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_maintenance," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_management-system," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_manufacture," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_margin-analysis," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_mis-builder," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_mis-builder-contrib," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_multi-company," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_odoo-pim," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_operating-unit," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_partner-contact," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_pms," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_pos," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_product-attribute," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_product-configurator," >> "${EL_CONFIG_FILE}" @@ -103,65 +95,44 @@ if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_project," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_project-agile," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_project-reporting," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_purchase-reporting," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_purchase-workflow," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_queue," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_repair," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_report-print-send," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_reporting-engine," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_rest-framework," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_rma," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sale-blanket," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sale-channel," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sale-prebook," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sale-promotion," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sale-reporting," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sale-workflow," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_search-engine," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_server-auth," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_server-backend," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_server-brand," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_server-env," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_server-tools," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_server-ux," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_shift-planning," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_sign," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_social," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_spreadsheet," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-availability," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-barcode," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-orderpoint," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-reporting," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-request," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-tracking," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-transport," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-putaway," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-warehouse," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-logistics-workflow," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_stock-weighing," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_storage," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_survey," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_timesheet," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_vertical-abbey," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_vertical-association," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_vertical-hotel," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_vertical-isp," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_vertical-rental," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_vertical-travel," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_web," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_web-api," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_website," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_website-cms," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OCA_wms," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/OmniaGit_odooplm," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/TechnoLibre_odoo-code-generator," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/TechnoLibre_odoo-code-generator-template," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/bemade_bemade-addons," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/camptocamp_odoo-cloud-platform," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/cetmix_cetmix-tower," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/dhongu_deltatech," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/it-projects-llc_saas-addons," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/muk-it_muk_web," >> "${EL_CONFIG_FILE}" + printf "${EL_HOME_ODOO_PROJECT}/addons/muk-it_odoo-modules," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/novacode-nl_odoo-formio," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/odoomates_odooapps," >> "${EL_CONFIG_FILE}" printf "${EL_HOME_ODOO_PROJECT}/addons/openeducat_openeducat_erp," >> "${EL_CONFIG_FILE}" - printf "${EL_HOME_ODOO_PROJECT}/addons/tegin_medical-fhir," >> "${EL_CONFIG_FILE}" fi printf "\n" >> "${EL_CONFIG_FILE}" diff --git a/script/git/clean_repo_manifest.sh b/script/git/clean_repo_manifest.sh index 49cd1c4..b620f3b 100755 --- a/script/git/clean_repo_manifest.sh +++ b/script/git/clean_repo_manifest.sh @@ -1,6 +1,5 @@ #!/usr/bin/env bash -rm -fr ./.repo -rm -rf ./odoo ./addons*/* ./script/OCA* ./image_db ./doc/itpp* ./doc/odoo_* -rm -rf addons* -#mkdir -p addons/addons +# TODO create a script to find all repo to delete it +#rm -fr ./.repo +rm -rf ./odoo1* ./script/OCA* ./image_db ./doc/itpp* ./doc/odoo_* diff --git a/script/git/fork_project.py b/script/git/fork_project.py index 31a84cf..b9b6c5f 100755 --- a/script/git/fork_project.py +++ b/script/git/fork_project.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/fork_project_ERPLibre.py b/script/git/fork_project_ERPLibre.py index 16c4e9e..a91a034 100755 --- a/script/git/fork_project_ERPLibre.py +++ b/script/git/fork_project_ERPLibre.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_change_remote.py b/script/git/git_change_remote.py index 1fadcef..8158267 100755 --- a/script/git/git_change_remote.py +++ b/script/git/git_change_remote.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_change_remote_https_to_git.py b/script/git/git_change_remote_https_to_git.py index 6e39ff3..3cff9a8 100755 --- a/script/git/git_change_remote_https_to_git.py +++ b/script/git/git_change_remote_https_to_git.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_diff_repo_manifest.py b/script/git/git_diff_repo_manifest.py index af86aec..c112874 100755 --- a/script/git/git_diff_repo_manifest.py +++ b/script/git/git_diff_repo_manifest.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_merge_repo_manifest.py b/script/git/git_merge_repo_manifest.py index 3f4940e..3a7bb48 100755 --- a/script/git/git_merge_repo_manifest.py +++ b/script/git/git_merge_repo_manifest.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse @@ -24,7 +24,9 @@ DEFAULT_PATH_MANIFEST_ODOO_CONF = os.path.join("conf", "git_manifest_odoo.csv") DEFAULT_PATH_MANIFEST_PRIVATE_CONF = os.path.join( "private", "default_git_manifest.csv" ) -DEFAULT_PATH_INSTALLED_ODOO_VERSION = os.path.join(".repo", "installed_odoo_version.txt") +DEFAULT_PATH_INSTALLED_ODOO_VERSION = os.path.join( + ".repo", "installed_odoo_version.txt" +) def get_config(): @@ -44,7 +46,11 @@ def get_config(): "--input", help="First manifest to merge into input2. Second manifest, overwrite by input1.", ) - parser.add_argument("--output", default=".repo/local_manifests/erplibre_manifest.xml", help="Output of new manifest") + parser.add_argument( + "--output", + default=".repo/local_manifests/erplibre_manifest.xml", + help="Output of new manifest", + ) parser.add_argument( "--att_revision_only", action="store_true", @@ -89,11 +95,14 @@ def main(): if os.path.exists(DEFAULT_PATH_INSTALLED_ODOO_VERSION): with open(DEFAULT_PATH_INSTALLED_ODOO_VERSION, "r") as f: - lst_installed_odoo_version = [a.strip() for a in f.readlines()] + lst_installed_odoo_version = [ + a.strip() for a in f.readlines() + ] if lst_installed_odoo_version: for installed_odoo_version in lst_installed_odoo_version: path_manifest_odoo_version = os.path.join( - "manifest", f"git_manifest_{installed_odoo_version}.xml" + "manifest", + f"git_manifest_{installed_odoo_version}.xml", ) if os.path.exists(path_manifest_odoo_version): lst_input.append(path_manifest_odoo_version) @@ -102,7 +111,8 @@ def main(): f"ERROR: {path_manifest_odoo_version} does not exist" ) path_manifest_odoo_version = os.path.join( - "manifest", f"git_manifest_{installed_odoo_version}_dev.xml" + "manifest", + f"git_manifest_{installed_odoo_version}_dev.xml", ) if os.path.exists(path_manifest_odoo_version): lst_input.append(path_manifest_odoo_version) diff --git a/script/git/git_repo_manifest.py b/script/git/git_repo_manifest.py index 0a5a391..2a08ead 100755 --- a/script/git/git_repo_manifest.py +++ b/script/git/git_repo_manifest.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_repo_update_group.py b/script/git/git_repo_update_group.py index d7c2128..882af4b 100755 --- a/script/git/git_repo_update_group.py +++ b/script/git/git_repo_update_group.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_show_code_diff_repo_manifest.py b/script/git/git_show_code_diff_repo_manifest.py index dc0555c..dc18d84 100755 --- a/script/git/git_show_code_diff_repo_manifest.py +++ b/script/git/git_show_code_diff_repo_manifest.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/git_tool.py b/script/git/git_tool.py index ac8623a..47c1f14 100644 --- a/script/git/git_tool.py +++ b/script/git/git_tool.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import os diff --git a/script/git/git_update_repo.py b/script/git/git_update_repo.py index 5106640..aa94fab 100755 --- a/script/git/git_update_repo.py +++ b/script/git/git_update_repo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/pull_request_ERPLibre.py b/script/git/pull_request_ERPLibre.py index 1c98a74..aa11e39 100755 --- a/script/git/pull_request_ERPLibre.py +++ b/script/git/pull_request_ERPLibre.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/remote_code_generation_git_compare.py b/script/git/remote_code_generation_git_compare.py index c88e8d7..48e79be 100755 --- a/script/git/remote_code_generation_git_compare.py +++ b/script/git/remote_code_generation_git_compare.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/repo_remove_auto_install.py b/script/git/repo_remove_auto_install.py index af5ff44..9c5423e 100755 --- a/script/git/repo_remove_auto_install.py +++ b/script/git/repo_remove_auto_install.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/repo_revert_git_diff_date_from_code_generator.py b/script/git/repo_revert_git_diff_date_from_code_generator.py index 71ef527..b7fdd34 100755 --- a/script/git/repo_revert_git_diff_date_from_code_generator.py +++ b/script/git/repo_revert_git_diff_date_from_code_generator.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/git/tag_push_all.py b/script/git/tag_push_all.py index e73b58e..79732c7 100755 --- a/script/git/tag_push_all.py +++ b/script/git/tag_push_all.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/ide/pycharm_configuration.py b/script/ide/pycharm_configuration.py index 6b52c5b..1e025e8 100755 --- a/script/ide/pycharm_configuration.py +++ b/script/ide/pycharm_configuration.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse @@ -26,6 +26,7 @@ _logger = logging.getLogger(__name__) PROJECT_NAME = os.path.basename(os.getcwd()) IDEA_PATH = "./.idea" +DEFAULT_ODOO_BIN = "./odoo/odoo-bin" # Will be replaced dynamic IDEA_MISC = os.path.join(IDEA_PATH, "misc.xml") IDEA_WORKSPACE = os.path.join(IDEA_PATH, "workspace.xml") VCS_WORKSPACE = os.path.join(IDEA_PATH, "vcs.xml") @@ -35,6 +36,12 @@ PATH_DEFAULT_CONFIGURATION = "./conf/pycharm_default_configuration.csv" PATH_DEFAULT_CONFIGURATION_PRIVATE = ( "./private/pycharm_default_configuration.private.csv" ) +if os.path.isfile(".odoo-version"): + with open(".odoo-version") as txt: + odoo_version = txt.read() + DEFAULT_ODOO_BIN_UPDATE = f"./odoo{odoo_version}/odoo/odoo-bin" +else: + DEFAULT_ODOO_BIN_UPDATE = None def get_config(): @@ -342,6 +349,10 @@ def add_configuration(dct_xml, file_name, config): conf_default = bool(default_conf.get("default")) if conf_default: last_default = f"Python.{conf_name}" + if DEFAULT_ODOO_BIN_UPDATE: + conf_script_path = conf_script_path.replace( + DEFAULT_ODOO_BIN, DEFAULT_ODOO_BIN_UPDATE + ) conf_script_path_replace = ( conf_script_path if not conf_script_path.startswith("./") diff --git a/script/install/install_arch_linux.sh b/script/install/install_arch_linux.sh index 70129ad..a17e4d2 100755 --- a/script/install/install_arch_linux.sh +++ b/script/install/install_arch_linux.sh @@ -1,15 +1,15 @@ #!/usr/bin/env bash install_package() { - local package_name=$1 + local package_name=$1 - # Check package is already installed - if pacman -Qs "$package_name" > /dev/null; then - echo "$package_name is already installed." - else - echo "Installation of package $package_name..." - yes|yay -S "$package_name" - fi + # Check package is already installed + if pacman -Qs "$package_name" >/dev/null; then + echo "$package_name is already installed." + else + echo "Installation of package $package_name..." + yes | yay -S "$package_name" + fi } # Odoo installation @@ -18,6 +18,7 @@ install_package postgresql install_package mariadb install_package libev install_package wkhtmltopdf +install_package freetds echo "Need password to create symbolic link, create postgres user and install npm :" sudo ln -fs /usr/lib/libldap.so /usr/lib/libldap_r.so diff --git a/script/install/install_debian_dependency.sh b/script/install/install_debian_dependency.sh index f058c97..54615d6 100755 --- a/script/install/install_debian_dependency.sh +++ b/script/install/install_debian_dependency.sh @@ -82,7 +82,7 @@ if [[ $retVal -ne 0 ]]; then echo "apt-get debian tool installation error." exit 1 fi -sudo apt-get install libmariadbd-dev -y +sudo apt-get install libmariadbd-dev freetds-dev -y retVal=$? if [[ $retVal -ne 0 ]]; then echo "apt-get libmariadb installation error." diff --git a/script/lib_asyncio.py b/script/lib_asyncio.py index 1afe978..36843f2 100644 --- a/script/lib_asyncio.py +++ b/script/lib_asyncio.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import asyncio diff --git a/script/maintenance/format_file_to_commit.py b/script/maintenance/format_file_to_commit.py index 0900f38..de818c0 100755 --- a/script/maintenance/format_file_to_commit.py +++ b/script/maintenance/format_file_to_commit.py @@ -2,6 +2,7 @@ # © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) +import os import subprocess IGNORE_EXTENSION = [] @@ -15,51 +16,89 @@ def execute_shell(cmd): def get_modified_files(): lst_cmd_git_status = ["git", "status", "--porcelain"] - print(" ".join(lst_cmd_git_status)) + lst_cmd_git_status_repo = [ + ".venv.erplibre/bin/repo", + "forall", + "-p", + "-c", + "git status -s", + ] try: + print(" ".join(lst_cmd_git_status)) result = subprocess.run( lst_cmd_git_status, capture_output=True, text=True, check=True, ) - lines = result.stdout.strip().split("\n") + lines_local = result.stdout.strip().split("\n") + + lst_lines = [(".", lines_local)] + + print(" ".join(lst_cmd_git_status_repo)) + + result = subprocess.run( + lst_cmd_git_status_repo, + capture_output=True, + text=True, + check=True, + ) + lines_project = result.stdout.strip().split("\n\n") + for str_project_line in lines_project: + line_repo = str_project_line.split("\n") + projet_name = line_repo[0] + lines_local = line_repo[1:] + directory_project = projet_name[len("project ") :] + lst_lines.append((directory_project, lines_local)) modified_files = [] - for line in lines: - if not line: - continue + for directory, lines in lst_lines: + for line in lines: + if not line: + continue - try: - if "->" in line: - # Example : M file_01 -> file_02 - status, old_file_path, code, file_path = ( - line.strip().replace(" ", " ").split(" ") - ) + try: + has_space = False + file_path_space = "" + if '"' in line: + has_space = True + file_path_space = line[ + line.index('"') + 1 : line.rindex('"') + ] + line = line.replace(f'"{file_path_space}"', "replace") + if "->" in line: + # Example : M file_01 -> file_02 + status, old_file_path, code, file_path = ( + line.strip().replace(" ", " ").split(" ") + ) + else: + # Example : M file_01 + status, file_path = ( + line.strip().replace(" ", " ").split(" ") + ) + if has_space: + file_path = file_path_space + file_path = os.path.join(directory, file_path) + + except Exception as e: + print(f"'{line}'") + raise e + + if ( + status == "M" + or status == "A" + or status == "AM" + or status == "MM" + or status == "R" + or status == "RM" + or status == "??" + ): + modified_files.append((status, file_path)) + elif status == "D": + # Ignore to format removed file + pass else: - # Example : M file_01 - status, file_path = ( - line.strip().replace(" ", " ").split(" ") - ) - except Exception as e: - print(f"'{line}'") - raise e - - if ( - status == "M" - or status == "A" - or status == "AM" - or status == "MM" - or status == "R" - or status == "RM" - or status == "??" - ): - modified_files.append((status, file_path)) - elif status == "D": - # Ignore to format removed file - pass - else: - print(f"Not supported status '{status}'") + print(f"Not supported status '{status}'") return modified_files except subprocess.CalledProcessError as e: diff --git a/script/poetry/poetry_update.py b/script/poetry/poetry_update.py index c96d672..d25b67a 100755 --- a/script/poetry/poetry_update.py +++ b/script/poetry/poetry_update.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/restful/restful_example.py b/script/restful/restful_example.py index fa9cf4a..c9fc4d9 100755 --- a/script/restful/restful_example.py +++ b/script/restful/restful_example.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import json diff --git a/script/selenium/scenario/selenium_devops.py b/script/selenium/scenario/selenium_devops.py new file mode 100755 index 0000000..d241d84 --- /dev/null +++ b/script/selenium/scenario/selenium_devops.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python3 +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +import argparse +import os +import sys +import time + +from selenium.webdriver.common.by import By + +new_path = os.path.normpath( + os.path.join(os.path.dirname(__file__), "..", "..", "..") +) +sys.path.append(new_path) + + +from script.selenium import selenium_lib, web_login + + +def run(config, selenium_tool): + selenium_tool.inject_cursor() + if config.open_me_devops: + selenium_tool.odoo_website_menu_click("Erplibre DevOps") + if config.generate_code: + selenium_tool.click_with_mouse_move( + by=By.CSS_SELECTOR, value="button.oe_stat_button:nth-child(1)" + ) + selenium_tool.click_with_mouse_move( + by=By.NAME, value="state_goto_code_module" + ) + selenium_tool.input_text_with_mouse_move( + by=By.ID, + value="working_module_name_1", + text_value="test_coucou", + ) + selenium_tool.click_with_mouse_move( + by=By.NAME, value="action_code_module_autocomplete_module_path" + ) + time.sleep(1) + selenium_tool.click_with_mouse_move( + by=By.XPATH, value="//a[contains(text(), 'Ajouter une ligne')]" + ) + selenium_tool.click_with_mouse_move( + by=By.CLASS_NAME, value="o_create_button" + ) + selenium_tool.input_text_with_mouse_move( + by=By.XPATH, + value="//div[@name='name']/input", + text_value="x_coucou", + ) + selenium_tool.click_with_mouse_move( + by=By.XPATH, + value="//h4[contains(text(), 'Créer Model')]/../../main//a[contains(text(), 'Ajouter une ligne')]", + ) + selenium_tool.input_text_with_mouse_move( + by=By.XPATH, + value="//h4[contains(text(), 'Créer Field')]/../../main//div[@name='name']/input", + text_value="x_name", + ) + selenium_tool.click_with_mouse_move( + by=By.XPATH, + value="//h4[contains(text(), 'Créer Field')]/../../footer/button[contains(@class, 'o_form_button_save')]", + ) + selenium_tool.click_with_mouse_move( + by=By.XPATH, + value="//h4[contains(text(), 'Créer Model')]/../../footer/button[contains(@class, 'o_form_button_save')]", + ) + time.sleep(1) + selenium_tool.click_with_mouse_move( + by=By.XPATH, + value="//footer/div[@name='states_buttons']/button[@name='action_code_module_generate']", + ) + + # selenium_tool.click( + # "/html/body/header/nav/div/div[1]/div[2]/div/div/div/ul/li[2]/a", + # ) + # selenium_tool.click( + # "/html/body/div[1]/main/div[2]/div/div/table/tbody/tr[1]/td[2]", + # ) + # if config.open_me_devops_auto: + # selenium_tool.click( + # "/html/body/header/nav/div/div[1]/div[2]/div/div/div/ul/li[2]/a", + # ) + # selenium_tool.click( + # "/html/body/div[1]/main/div[2]/div/div/table/tbody/tr[1]/td[2]", + # ) + # + # # CG self + # # Bouton modifier + # # selenium_tool.click( + # # "/html/body/div[1]/main/div[1]/div[2]/div/div/div[1]/button[1]", + # # ) + # # Tab Code + # # selenium_tool.click( + # # "/html/body/div[1]/main/div[2]/div/div/div[7]/ul/li[2]/a", + # # ) + # # Bouton Plan + # selenium_tool.click( + # "/html/body/div[1]/main/div[2]/div/div/div[1]/div/button[1]", + # ) + # + # # Bouton autopoiesis + # selenium_tool.click( + # "/html/body/div[4]/div/div/main/div/div/div[5]/table[2]/tbody/tr[2]/td[1]/button", + # ) + # + # # Bouton devops regenerate + # selenium_tool.click( + # "/html/body/div[4]/div/div/main/div/div/div[6]/table[2]/tbody/tr[2]/td/button", + # ) + # + # if config.open_me_devops_auto_force: + # # Disable «Stop Execution if Env Not Clean + # # selenium_tool.click( + # # "/html/body/div[1]/main/div[2]/div/div/div[7]/div/div[2]/div[6]/table[2]/tbody/tr[3]/td[2]/div/label", + # # ) + # # Option Force Generate + # selenium_tool.click( + # "/html/body/div[4]/div/div/main/div/div/div[8]/table/tbody/tr[2]/td[1]/label", + # ) + # + # # Gen + # # selenium_tool.click( + # # "/html/body/div[1]/main/div[2]/div/div/div[7]/div/div[2]/div[2]/table[1]/tbody/tr/td[1]/button", + # # ) + # + # # Next state + # selenium_tool.click( + # "/html/body/div[4]/div/div/footer/div/footer/div/button[1]", + # ) + # + # # Check error + # # selenium_tool.click( + # # "/html/body/div[1]/main/div[2]/div/div/div[7]/ul/li[13]/a", + # # ) + # # selenium_tool.click("/html/body/div[1]/main/div[2]/div/div/div[6]/div/div[14]/div/div[2]/table/tbody/tr[1]", timeout=60*2) + + +def fill_parser(parser): + group_devops = parser.add_argument_group(title="DevOps") + group_devops.add_argument( + "--open_me_devops", + action="store_true", + help="Open application devops and show entry me.", + ) + group_devops.add_argument( + "--open_me_devops_auto", + action="store_true", + help="Open application devops and show entry me and run auto setup.", + ) + group_devops.add_argument( + "--open_me_devops_auto_force", + action="store_true", + help=( + "Open application devops and show entry me and run auto setup with" + " forcing argument." + ), + ) + group_devops.add_argument( + "--generate_code", + action="store_true", + help=("Open wizard to generate code"), + ) + + +def compute_args(args): + if args.open_me_devops_auto_force: + args.open_me_devops_auto = True + args.open_me_devops = True + elif args.open_me_devops_auto: + args.open_me_devops = True + + +def main(): + parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description="""Selenium script to open web browser to ERPLibre adapted for ORE.""", + ) + # Generate parser + selenium_lib.fill_parser(parser) + web_login.fill_parser(parser) + fill_parser(parser) + args = parser.parse_args() + web_login.compute_args(args) + compute_args(args) + # Instance selenium tool + selenium_tool = selenium_lib.SeleniumLib(args) + selenium_tool.configure() + selenium_tool.start_record() + # Execute + web_login.run(args, selenium_tool) + run(args, selenium_tool) + selenium_tool.stop_record() + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/script/selenium/selenium_devops.py b/script/selenium/selenium_devops.py deleted file mode 100755 index b336d52..0000000 --- a/script/selenium/selenium_devops.py +++ /dev/null @@ -1,133 +0,0 @@ -#!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) - -import argparse -import sys - -import selenium_lib -import web_login - - -def run(config, selenium_tool): - if config.open_me_devops: - selenium_tool.click( - "/html/body/header/nav/div/div[1]/div[2]/div/div/div/ul/li[2]/a", - ) - selenium_tool.click( - "/html/body/div[1]/main/div[2]/div/div/table/tbody/tr[1]/td[2]", - ) - if config.open_me_devops_auto: - selenium_tool.click( - "/html/body/header/nav/div/div[1]/div[2]/div/div/div/ul/li[2]/a", - ) - selenium_tool.click( - "/html/body/div[1]/main/div[2]/div/div/table/tbody/tr[1]/td[2]", - ) - - # CG self - # Bouton modifier - # selenium_tool.click( - # "/html/body/div[1]/main/div[1]/div[2]/div/div/div[1]/button[1]", - # ) - # Tab Code - # selenium_tool.click( - # "/html/body/div[1]/main/div[2]/div/div/div[7]/ul/li[2]/a", - # ) - # Bouton Plan - selenium_tool.click( - "/html/body/div[1]/main/div[2]/div/div/div[1]/div/button[1]", - ) - - # Bouton autopoiesis - selenium_tool.click( - "/html/body/div[4]/div/div/main/div/div/div[5]/table[2]/tbody/tr[2]/td[1]/button", - ) - - # Bouton devops regenerate - selenium_tool.click( - "/html/body/div[4]/div/div/main/div/div/div[6]/table[2]/tbody/tr[2]/td/button", - ) - - if config.open_me_devops_auto_force: - # Disable «Stop Execution if Env Not Clean - # selenium_tool.click( - # "/html/body/div[1]/main/div[2]/div/div/div[7]/div/div[2]/div[6]/table[2]/tbody/tr[3]/td[2]/div/label", - # ) - # Option Force Generate - selenium_tool.click( - "/html/body/div[4]/div/div/main/div/div/div[8]/table/tbody/tr[2]/td[1]/label", - ) - - # Gen - # selenium_tool.click( - # "/html/body/div[1]/main/div[2]/div/div/div[7]/div/div[2]/div[2]/table[1]/tbody/tr/td[1]/button", - # ) - - # Next state - selenium_tool.click( - "/html/body/div[4]/div/div/footer/div/footer/div/button[1]", - ) - - # Check error - # selenium_tool.click( - # "/html/body/div[1]/main/div[2]/div/div/div[7]/ul/li[13]/a", - # ) - # selenium_tool.click("/html/body/div[1]/main/div[2]/div/div/div[6]/div/div[14]/div/div[2]/table/tbody/tr[1]", timeout=60*2) - - -def fill_parser(parser): - group_devops = parser.add_argument_group(title="DevOps") - group_devops.add_argument( - "--open_me_devops", - action="store_true", - help="Open application devops and show entry me.", - ) - group_devops.add_argument( - "--open_me_devops_auto", - action="store_true", - help="Open application devops and show entry me and run auto setup.", - ) - group_devops.add_argument( - "--open_me_devops_auto_force", - action="store_true", - help=( - "Open application devops and show entry me and run auto setup with" - " forcing argument." - ), - ) - - -def compute_args(args): - if args.open_me_devops_auto_force: - args.open_me_devops_auto = True - args.open_me_devops = True - elif args.open_me_devops_auto: - args.open_me_devops = True - - -def main(): - parser = argparse.ArgumentParser( - formatter_class=argparse.RawDescriptionHelpFormatter, - description="""Selenium script to open web browser to ERPLibre adapted for ORE.""", - ) - # Generate parser - selenium_lib.fill_parser(parser) - web_login.fill_parser(parser) - fill_parser(parser) - args = parser.parse_args() - web_login.compute_args(args) - compute_args(args) - # Instance selenium tool - selenium_tool = selenium_lib.SeleniumLib(args) - selenium_tool.configure() - selenium_tool.start_record() - # Execute - web_login.run(args, selenium_tool) - run(args, selenium_tool) - selenium_tool.stop_record() - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/script/selenium/selenium_lib.py b/script/selenium/selenium_lib.py index c3d7dea..1314b19 100644 --- a/script/selenium/selenium_lib.py +++ b/script/selenium/selenium_lib.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import datetime @@ -35,6 +35,11 @@ from selenium.webdriver.remote.webelement import WebElement from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import Select, WebDriverWait +new_path = os.path.normpath( + os.path.join(os.path.dirname(__file__), "..", "..") +) +sys.path.append(new_path) + from script.config import config_file logging.basicConfig( @@ -253,9 +258,12 @@ class SeleniumLib(object): firefox_options.set_preference("pdfjs.disabled", True) if self.config.window_size: # chrome_options.add_argument("--window-size=1920,1080") - firefox_options.add_argument( - f"--window-size={self.config.window_size}" - ) + # firefox_options.add_argument( + # f"--window-size={self.config.window_size}" + # ) + width, height = self.config.window_size.split(",") + firefox_options.add_argument("--width=" + str(width)) + firefox_options.add_argument("--height=" + str(height)) if self.config.headless: firefox_options.add_argument("--headless") diff --git a/script/selenium/selenium_video.py b/script/selenium/selenium_video.py index 4dc5d9f..e504c7d 100644 --- a/script/selenium/selenium_video.py +++ b/script/selenium/selenium_video.py @@ -10,6 +10,9 @@ try: except ImportError: print("Please read installation script/selenium/install.md") raise +except ModuleNotFoundError: + print("Please read installation script/selenium/install.md") + raise Gst.init(None) diff --git a/script/selenium/web_login.py b/script/selenium/web_login.py index f979896..c8e361f 100755 --- a/script/selenium/web_login.py +++ b/script/selenium/web_login.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/statistic/show_evolution_module.py b/script/statistic/show_evolution_module.py index 50897fd..e0bf450 100755 --- a/script/statistic/show_evolution_module.py +++ b/script/statistic/show_evolution_module.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/systemd/install_daemon.py b/script/systemd/install_daemon.py index bfd6008..6ed8332 100755 --- a/script/systemd/install_daemon.py +++ b/script/systemd/install_daemon.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse @@ -97,7 +97,10 @@ def main(): # Default paths and fallback values (same logic as in the bash script) el_user = args.user el_home_erplibre = args.home_erplibre or os.getcwd() - el_config_name = args.config_name or f"erplibre_{el_user}_{os.path.basename(os.getcwd())}" + el_config_name = ( + args.config_name + or f"erplibre_{el_user}_{os.path.basename(os.getcwd())}" + ) exec_param = ( " " + f" {w_cmd("-d", args.database or "")} {w_cmd("-p", args.port or "")}".strip() diff --git a/script/test/run_parallel_test.py b/script/test/run_parallel_test.py index 2bd949c..837ab7b 100755 --- a/script/test/run_parallel_test.py +++ b/script/test/run_parallel_test.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/version/get_version.py b/script/version/get_version.py index e4bd7f0..ff503ea 100755 --- a/script/version/get_version.py +++ b/script/version/get_version.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) import argparse diff --git a/script/version/update_env_version.py b/script/version/update_env_version.py index 554d858..d63b9db 100755 --- a/script/version/update_env_version.py +++ b/script/version/update_env_version.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# © 2021-2024 TechnoLibre (http://www.technolibre.ca) +# © 2021-2025 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) # This script need only basic importation, it needs to be supported by python of your system