From dce3f98bbc86cefcd0875c09d2ff1dd19f7a9f0c Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 4 Nov 2025 05:02:05 -0500 Subject: [PATCH 01/16] [FIX] docker downgrade postgresql 18 to 17 - some database importation not working like discuss_channel --- docker-compose.yml | 6 +++--- docker/docker-compose_odoo_18.0.yml | 6 +++--- docker/docker-compose_odoo_18.0_selenium.yml | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) 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: From f1f4769a21d55e73029dd5339b7166d44bcf3e72 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 4 Nov 2025 22:09:07 -0500 Subject: [PATCH 02/16] [FIX] script format support space into files --- script/maintenance/format_file_to_commit.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/script/maintenance/format_file_to_commit.py b/script/maintenance/format_file_to_commit.py index 0900f38..05d900c 100755 --- a/script/maintenance/format_file_to_commit.py +++ b/script/maintenance/format_file_to_commit.py @@ -31,6 +31,14 @@ def get_modified_files(): continue 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 = ( @@ -41,6 +49,9 @@ def get_modified_files(): status, file_path = ( line.strip().replace(" ", " ").split(" ") ) + if has_space: + file_path = file_path_space + except Exception as e: print(f"'{line}'") raise e From 25a1c789d2b1ff0f04f86ee01b12a42b9944d3f8 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Tue, 4 Nov 2025 23:24:43 -0500 Subject: [PATCH 03/16] [IMP] make robot libre --- Makefile | 1 + conf/make.robotlibre.Makefile | 109 ++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 conf/make.robotlibre.Makefile 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..81f7829 --- /dev/null +++ b/conf/make.robotlibre.Makefile @@ -0,0 +1,109 @@ +######### +# 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 + ./.venv/bin/python3 ./odoo/odoo-bin db --backup --database robotlibre --restore_image robotlibre_last + +.PHONY: robot_libre_fast +robot_libre_fast: + echo "FAST! RobotLibre" + ./.venv/bin/python3 ./odoo/odoo-bin 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" + ./.venv/bin/python3 ./odoo/odoo-bin 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 + ./.venv/bin/python3 ./odoo/odoo-bin 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 + ./.venv/bin/python3 ./odoo/odoo-bin 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 + ./.venv/bin/python3 ./odoo/odoo-bin 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: + ./.venv/bin/python ./script/selenium/web_login.py + +.PHONY: robot_libre_open_record +robot_libre_open_record: + ./.venv/bin/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) From 1747aa720b771e9f1937b75b7af88defc2759423 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 5 Nov 2025 02:15:54 -0500 Subject: [PATCH 04/16] [UPD] make robotlibre: ignore optimization --- conf/make.robotlibre.Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/conf/make.robotlibre.Makefile b/conf/make.robotlibre.Makefile index 81f7829..7caa887 100644 --- a/conf/make.robotlibre.Makefile +++ b/conf/make.robotlibre.Makefile @@ -13,12 +13,12 @@ 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" + #./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 + #./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 + #./script/generate_config.sh + #./script/git/git_change_remote_https_to_git.py .PHONY: robot_libre_pre robot_libre_pre: From cee492a2a791c0bd5439e6a492cc32d5634b7d9f Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 5 Nov 2025 02:17:46 -0500 Subject: [PATCH 05/16] [UPD] generate_config: adapt config for odoo 18 --- script/generate_config.sh | 45 +++++++-------------------------------- 1 file changed, 8 insertions(+), 37 deletions(-) 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}" From 795247aa14629059cd0ede2cd7787ed94e4c16c2 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 5 Nov 2025 02:29:32 -0500 Subject: [PATCH 06/16] [UPD] poetry update with erplibre code generator --- .../poetry.odoo18.0_python3.12.10.lock | 202 +++++++++++++++++- .../pyproject.odoo18.0_python3.12.10.toml | 10 +- 2 files changed, 199 insertions(+), 13 deletions(-) diff --git a/requirement/poetry.odoo18.0_python3.12.10.lock b/requirement/poetry.odoo18.0_python3.12.10.lock index 1388025..3b1a67a 100644 --- a/requirement/poetry.odoo18.0_python3.12.10.lock +++ b/requirement/poetry.odoo18.0_python3.12.10.lock @@ -503,18 +503,18 @@ xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.40.64" +version = "1.40.66" description = "The AWS SDK for Python" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "boto3-1.40.64-py3-none-any.whl", hash = "sha256:35ca3dd80dd90d5f4e8ed032440f28790696fdf50f48c0d16a09a75675f9112f"}, - {file = "boto3-1.40.64.tar.gz", hash = "sha256:b92d6961c352f2bb8710c9892557d4b0e11258b70967d4e740e1c97375bcd779"}, + {file = "boto3-1.40.66-py3-none-any.whl", hash = "sha256:ee4fe21c5301cc0e11cc11a53e71e5ddd82d5fae42b10fa8e5403f3aa06434e3"}, + {file = "boto3-1.40.66.tar.gz", hash = "sha256:f2038d9bac5154da7390c29bfd013546ac96609e7ce5a7f3cb6f99412be3f4c0"}, ] [package.dependencies] -botocore = ">=1.40.64,<1.41.0" +botocore = ">=1.40.66,<1.41.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.14.0,<0.15.0" @@ -523,14 +523,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.40.64" +version = "1.40.66" 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.66-py3-none-any.whl", hash = "sha256:98d5766e17e72110b1d08ab510a8475a6597c59d9560235e2d28ae1a4b043b92"}, + {file = "botocore-1.40.66.tar.gz", hash = "sha256:e49a55ad54426c4ea853a59ff9d8243023a90c935782d4c287e9b3424883c3fa"}, ] [package.dependencies] @@ -3696,6 +3696,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 +3957,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] @@ -4214,6 +4239,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 +4427,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 +4716,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" @@ -5653,6 +5729,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 +6645,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 +6850,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 +7531,4 @@ bindings = ["ghostscript"] [metadata] lock-version = "2.1" python-versions = ">=3.12.10,<3.13" -content-hash = "0e97844a7cf0de05cca9a8c0a75bd07adea905a048463f4a11440b44085c0094" +content-hash = "aab8a78ac1cadf7f73e78cc68d253ae4c5889ab24629cf469875daa74dddf346" diff --git a/requirement/pyproject.odoo18.0_python3.12.10.toml b/requirement/pyproject.odoo18.0_python3.12.10.toml index ee45259..1253ebe 100644 --- a/requirement/pyproject.odoo18.0_python3.12.10.toml +++ b/requirement/pyproject.odoo18.0_python3.12.10.toml @@ -27,13 +27,14 @@ bandit = "^1.8.6" base64io = "^1.0.3" beautifulsoup4 = "4.13.5" bokeh = "3.6.3" -boto3 = "^1.40.64" +boto3 = "^1.40.66" 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" @@ -81,7 +82,7 @@ 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" openwebui-client = ">=0.3.0" @@ -91,8 +92,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" @@ -125,6 +128,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 +152,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" From 093bbed5ce0198ec25de933c6f9bde12bf64c6db Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 5 Nov 2025 03:41:27 -0500 Subject: [PATCH 07/16] [FIX] git clean repo manifest adapt for multi odoo --- script/git/clean_repo_manifest.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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_* From 63d84a25aaaad41062e57ad4db20a54bbcff027c Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 5 Nov 2025 04:41:51 -0500 Subject: [PATCH 08/16] [FIX] manifest: odoo 12 devops --- manifest/git_manifest_odoo12.0.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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" /> Date: Thu, 6 Nov 2025 01:11:28 -0500 Subject: [PATCH 09/16] [FIX] pymssql compilation error --- .../poetry.odoo18.0_python3.12.10.lock | 230 ++++++------------ .../pyproject.odoo18.0_python3.12.10.toml | 14 +- .../requirements.odoo18.0_python3.12.10.txt | 4 + script/install/install_arch_linux.sh | 17 +- script/install/install_debian_dependency.sh | 2 +- 5 files changed, 98 insertions(+), 169 deletions(-) diff --git a/requirement/poetry.odoo18.0_python3.12.10.lock b/requirement/poetry.odoo18.0_python3.12.10.lock index 3b1a67a..57fbbd7 100644 --- a/requirement/poetry.odoo18.0_python3.12.10.lock +++ b/requirement/poetry.odoo18.0_python3.12.10.lock @@ -503,18 +503,18 @@ xyzservices = ">=2021.09.1" [[package]] name = "boto3" -version = "1.40.66" +version = "1.40.67" description = "The AWS SDK for Python" optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "boto3-1.40.66-py3-none-any.whl", hash = "sha256:ee4fe21c5301cc0e11cc11a53e71e5ddd82d5fae42b10fa8e5403f3aa06434e3"}, - {file = "boto3-1.40.66.tar.gz", hash = "sha256:f2038d9bac5154da7390c29bfd013546ac96609e7ce5a7f3cb6f99412be3f4c0"}, + {file = "boto3-1.40.67-py3-none-any.whl", hash = "sha256:3d06e9b3c7abedb8253c7d75b9ab27005480ca1e6e448d1f3c3cc3e209673ca0"}, + {file = "boto3-1.40.67.tar.gz", hash = "sha256:3e4317139ace6d44658b8e1f2b5b6612f05b45720721841c90cdee45b02aa514"}, ] [package.dependencies] -botocore = ">=1.40.66,<1.41.0" +botocore = ">=1.40.67,<1.41.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.14.0,<0.15.0" @@ -523,14 +523,14 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.40.66" +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.66-py3-none-any.whl", hash = "sha256:98d5766e17e72110b1d08ab510a8475a6597c59d9560235e2d28ae1a4b043b92"}, - {file = "botocore-1.40.66.tar.gz", hash = "sha256:e49a55ad54426c4ea853a59ff9d8243023a90c935782d4c287e9b3424883c3fa"}, + {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 +1241,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 +2437,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" @@ -4000,14 +3965,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] @@ -5257,62 +5222,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" @@ -5545,20 +5467,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" @@ -6146,19 +6068,19 @@ renderpm = ["rl-renderPM (>=4.0.3,<4.1)"] [[package]] name = "requests" -version = "2.32.5" +version = "2.31.0" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.9" +python-versions = ">=3.7" groups = ["main"] files = [ - {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, - {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset_normalizer = ">=2,<4" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -7531,4 +7453,4 @@ bindings = ["ghostscript"] [metadata] lock-version = "2.1" python-versions = ">=3.12.10,<3.13" -content-hash = "aab8a78ac1cadf7f73e78cc68d253ae4c5889ab24629cf469875daa74dddf346" +content-hash = "aec211167b1cdaab821ed620bdef6b9d2c0dbd66c9c17ca74850c44797f8a899" diff --git a/requirement/pyproject.odoo18.0_python3.12.10.toml b/requirement/pyproject.odoo18.0_python3.12.10.toml index 1253ebe..6fdcb5c 100644 --- a/requirement/pyproject.odoo18.0_python3.12.10.toml +++ b/requirement/pyproject.odoo18.0_python3.12.10.toml @@ -27,7 +27,7 @@ bandit = "^1.8.6" base64io = "^1.0.3" beautifulsoup4 = "4.13.5" bokeh = "3.6.3" -boto3 = "^1.40.66" +boto3 = "^1.40.67" cachetools = "^6.2.1" cairosvg = "^2.8.2" caldav = "1.3.9" @@ -37,7 +37,7 @@ 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" @@ -60,7 +60,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" @@ -84,7 +84,7 @@ odoorpc = "^0.10.1" ofxparse = "0.21" 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" @@ -113,7 +113,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" @@ -143,7 +142,7 @@ qrcode = "7.4.2" radon = "^6.0.1" redis = "^7.0.1" reportlab = "4.1.0" -requests = ">=2.31.0" +requests = "2.31.0" requests-toolbelt = "^1.0.0" rjsmin = "1.2.0" roulier = "^1.1.1" @@ -177,6 +176,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..6c0c987 100644 --- a/requirement/requirements.odoo18.0_python3.12.10.txt +++ b/requirement/requirements.odoo18.0_python3.12.10.txt @@ -64,3 +64,7 @@ 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 + 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." From 8ab3883b225a511384aed3de8245f47b6eee3927 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 6 Nov 2025 03:40:46 -0500 Subject: [PATCH 10/16] [IMP] script format: support format detected all repo --- script/maintenance/format_file_to_commit.py | 118 ++++++++++++-------- 1 file changed, 73 insertions(+), 45 deletions(-) diff --git a/script/maintenance/format_file_to_commit.py b/script/maintenance/format_file_to_commit.py index 05d900c..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,62 +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: - 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(" ") - ) + 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(" ") - ) - if has_space: - file_path = file_path_space - - 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: From 963d691c86d0e1262f8ff49e13973a95498f5d02 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 6 Nov 2025 03:41:16 -0500 Subject: [PATCH 11/16] [UPD] make robotlibre update --- conf/make.robotlibre.Makefile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/make.robotlibre.Makefile b/conf/make.robotlibre.Makefile index 7caa887..de6ee80 100644 --- a/conf/make.robotlibre.Makefile +++ b/conf/make.robotlibre.Makefile @@ -30,18 +30,18 @@ robot_libre: ./script/make.sh robot_libre_pre echo "Install devops" ./script/addons/install_addons_dev.sh robotlibre erplibre_devops - ./.venv/bin/python3 ./odoo/odoo-bin db --backup --database robotlibre --restore_image robotlibre_last + ./odoo_bin.sh db --backup --database robotlibre --restore_image robotlibre_last .PHONY: robot_libre_fast robot_libre_fast: echo "FAST! RobotLibre" - ./.venv/bin/python3 ./odoo/odoo-bin db --drop --database _cache_robotlibre_last + ./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" - ./.venv/bin/python3 ./odoo/odoo-bin db --drop --database _cache_robotlibre_last + ./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 @@ -50,20 +50,20 @@ 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 - ./.venv/bin/python3 ./odoo/odoo-bin db --backup --database robotlibre --restore_image robotlibre_last + ./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 - ./.venv/bin/python3 ./odoo/odoo-bin db --backup --database robotlibre --restore_image robotlibre_last + ./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 - ./.venv/bin/python3 ./odoo/odoo-bin db --backup --database robotlibre --restore_image robotlibre_last + ./odoo_bin.sh db --backup --database robotlibre --restore_image robotlibre_last .PHONY: robot_libre_me_auto robot_libre_me_auto: From 48a1f1c84e6345fff22faaba335b8312af19e574 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 6 Nov 2025 03:41:37 -0500 Subject: [PATCH 12/16] [UPD] requirement last version astor --- .../poetry.odoo18.0_python3.12.10.lock | 24 +++++++++++-------- .../pyproject.odoo18.0_python3.12.10.toml | 6 +++-- .../requirements.odoo18.0_python3.12.10.txt | 2 ++ 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/requirement/poetry.odoo18.0_python3.12.10.lock b/requirement/poetry.odoo18.0_python3.12.10.lock index 57fbbd7..a0350dc 100644 --- a/requirement/poetry.odoo18.0_python3.12.10.lock +++ b/requirement/poetry.odoo18.0_python3.12.10.lock @@ -236,10 +236,14 @@ description = "Read/rewrite/write Python ASTs" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" groups = ["main"] -files = [ - {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, - {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, -] +files = [] +develop = false + +[package.source] +type = "git" +url = "https://github.com/berkerpeksag/astor.git" +reference = "HEAD" +resolved_reference = "df09001112f079db54e7c5358fa143e1e63e74c4" [[package]] name = "astroid" @@ -6068,19 +6072,19 @@ renderpm = ["rl-renderPM (>=4.0.3,<4.1)"] [[package]] name = "requests" -version = "2.31.0" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.7" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" @@ -7453,4 +7457,4 @@ bindings = ["ghostscript"] [metadata] lock-version = "2.1" python-versions = ">=3.12.10,<3.13" -content-hash = "aec211167b1cdaab821ed620bdef6b9d2c0dbd66c9c17ca74850c44797f8a899" +content-hash = "ba7450664480f89108a65126adf1fb86de79d27e7597433ee1ccc72f50fb2f1c" diff --git a/requirement/pyproject.odoo18.0_python3.12.10.toml b/requirement/pyproject.odoo18.0_python3.12.10.toml index 6fdcb5c..33be676 100644 --- a/requirement/pyproject.odoo18.0_python3.12.10.toml +++ b/requirement/pyproject.odoo18.0_python3.12.10.toml @@ -20,7 +20,6 @@ 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" @@ -142,7 +141,7 @@ qrcode = "7.4.2" radon = "^6.0.1" redis = "^7.0.1" reportlab = "4.1.0" -requests = "2.31.0" +requests = ">=2.31.0" requests-toolbelt = "^1.0.0" rjsmin = "1.2.0" roulier = "^1.1.1" @@ -168,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" diff --git a/requirement/requirements.odoo18.0_python3.12.10.txt b/requirement/requirements.odoo18.0_python3.12.10.txt index 6c0c987..5cb971d 100644 --- a/requirement/requirements.odoo18.0_python3.12.10.txt +++ b/requirement/requirements.odoo18.0_python3.12.10.txt @@ -68,3 +68,5 @@ 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 From c19ca7a554deebe4b33ac344e68c6d814a2b3dfa Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 6 Nov 2025 05:39:41 -0500 Subject: [PATCH 13/16] [FIX] selenium video: firefox windows size --- script/selenium/selenium_lib.py | 14 +++++++++++--- script/selenium/selenium_video.py | 3 +++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/script/selenium/selenium_lib.py b/script/selenium/selenium_lib.py index c3d7dea..2cf9a9d 100644 --- a/script/selenium/selenium_lib.py +++ b/script/selenium/selenium_lib.py @@ -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) From 5277fc1a816cf37ff1b9bffa6ab69f47486bcce5 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Thu, 6 Nov 2025 05:40:05 -0500 Subject: [PATCH 14/16] [IMP] selenium devops: generate code example 01 --- conf/make.robotlibre.Makefile | 16 +- script/selenium/scenario/selenium_devops.py | 199 ++++++++++++++++++++ script/selenium/selenium_devops.py | 133 ------------- 3 files changed, 213 insertions(+), 135 deletions(-) create mode 100755 script/selenium/scenario/selenium_devops.py delete mode 100755 script/selenium/selenium_devops.py diff --git a/conf/make.robotlibre.Makefile b/conf/make.robotlibre.Makefile index de6ee80..1d39ca9 100644 --- a/conf/make.robotlibre.Makefile +++ b/conf/make.robotlibre.Makefile @@ -90,11 +90,11 @@ robot_libre_run: .PHONY: robot_libre_open robot_libre_open: - ./.venv/bin/python ./script/selenium/web_login.py + source .venv.erplibre/bin/activate;python ./script/selenium/web_login.py .PHONY: robot_libre_open_record robot_libre_open_record: - ./.venv/bin/python ./script/selenium/web_login.py --record_mode + source .venv.erplibre/bin/activate;python ./script/selenium/web_login.py --record_mode .PHONY: robot_libre_format robot_libre_format: @@ -107,3 +107,15 @@ robot_libre_generate: .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/script/selenium/scenario/selenium_devops.py b/script/selenium/scenario/selenium_devops.py new file mode 100755 index 0000000..d275101 --- /dev/null +++ b/script/selenium/scenario/selenium_devops.py @@ -0,0 +1,199 @@ +#!/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 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()) From f4dec8a73a792c86f2bf1ad2c9644fffa93e4fb1 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 7 Nov 2025 01:06:00 -0500 Subject: [PATCH 15/16] [FIX] script pycharm_configuration: support odoo workspace different version --- conf/pycharm_default_configuration.csv | 1 + script/ide/pycharm_configuration.py | 11 +++++++++++ 2 files changed, 12 insertions(+) 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/script/ide/pycharm_configuration.py b/script/ide/pycharm_configuration.py index 6b52c5b..cbd7822 100755 --- a/script/ide/pycharm_configuration.py +++ b/script/ide/pycharm_configuration.py @@ -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("./") From c1b9a5fee47b9614cdb40289d865dafacbd5563e Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Fri, 7 Nov 2025 02:39:44 -0500 Subject: [PATCH 16/16] [UPD] format and update license --- docker/repo_manifest_gen_org_prefix_path.py | 35 ++++---- docker/wait-for-psql.py | 31 ++++--- script/addons/check_addons_exist.py | 2 +- .../create_from_existing_module.py | 2 +- script/code_generator/new_project.py | 18 +--- script/code_generator/search_class_model.py | 2 +- ...orm_xml_data_website_page_to_controller.py | 2 +- .../test_code_generator_update_module.py | 2 +- .../test_transform_python_to_code_writer.py | 2 +- .../transform_python_to_code_writer.py | 2 +- .../transform_xml_to_code_writer.py | 2 +- script/database/compare_backup.py | 2 +- .../database/compare_database_application.py | 2 +- script/database/db_drop_all.py | 2 +- script/database/db_restore.py | 2 +- script/database/download_remote.py | 83 ++++++++++++------- script/database/fix_mariadb_sql_example_1.py | 12 +-- script/database/image_db.py | 15 +--- script/deployment/cloudflare_dns.py | 2 +- script/deployment/get_public_ip.py | 2 +- script/deployment/update_dns_cloudflare.py | 2 +- script/docker/docker_update_version.py | 3 +- script/git/fork_project.py | 2 +- script/git/fork_project_ERPLibre.py | 2 +- script/git/git_change_remote.py | 2 +- script/git/git_change_remote_https_to_git.py | 2 +- script/git/git_diff_repo_manifest.py | 2 +- script/git/git_merge_repo_manifest.py | 22 +++-- script/git/git_repo_manifest.py | 2 +- script/git/git_repo_update_group.py | 2 +- .../git/git_show_code_diff_repo_manifest.py | 2 +- script/git/git_tool.py | 2 +- script/git/git_update_repo.py | 2 +- script/git/pull_request_ERPLibre.py | 2 +- .../git/remote_code_generation_git_compare.py | 2 +- script/git/repo_remove_auto_install.py | 2 +- ...evert_git_diff_date_from_code_generator.py | 2 +- script/git/tag_push_all.py | 2 +- script/ide/pycharm_configuration.py | 2 +- script/lib_asyncio.py | 2 +- script/poetry/poetry_update.py | 2 +- script/restful/restful_example.py | 2 +- script/selenium/scenario/selenium_devops.py | 2 +- script/selenium/selenium_lib.py | 2 +- script/selenium/web_login.py | 2 +- script/statistic/show_evolution_module.py | 2 +- script/systemd/install_daemon.py | 7 +- script/test/run_parallel_test.py | 2 +- script/version/get_version.py | 2 +- script/version/update_env_version.py | 2 +- 50 files changed, 169 insertions(+), 139 deletions(-) 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/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/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 cbd7822..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 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/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 index d275101..d241d84 100755 --- a/script/selenium/scenario/selenium_devops.py +++ b/script/selenium/scenario/selenium_devops.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/selenium/selenium_lib.py b/script/selenium/selenium_lib.py index 2cf9a9d..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 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