Merge branch 'develop'

- improve selenium web_login, disable web tour, enable dark mode
- update poetry odoo 18
- upgrade postgresql to 18 with database fix
- improve erplibre test async
- improve code generator extract model and new project code error
This commit is contained in:
Mathieu Benoit 2025-11-25 22:18:34 -05:00
commit ce6e7d4cc6
22 changed files with 1233 additions and 674 deletions

View file

@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
**Migration notes**
Recreating the virtual environment, use installation guide from tool `make`.
## Added
- Support Odoo migration database and module with TODO
@ -16,10 +20,18 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
- Separate ERPLibre python installation from Odoo python with .venv.erplibre and .venv.odoo18
- Implement auto-installation with TODO.py
- TODO show documentation, download database, help with code formatting
- Performance script to mesure request per second
- Support Mainframe architecture 390x
- Deployment with Cloudflare and Nginx
- Support Apache configuration like Nginx
- Support RobotLibre code generator
- Support ERPLibre DevOps, automation procedure about DevOps
- ERPLibre Home Mobile Application, use TODO to compile, deploy it and personalize it
## Changed
- Docker support postgresql 18
- Format script search diff file into each repository
## [1.6.0] - 2025-04-25

View file

@ -1,5 +1,6 @@
SHELL := /bin/bash
LOG_FILE := ./.venv.$(cat ".erplibre-version" | xargs)/make_test.log
ODOO_VERSION := $(shell cat .odoo-version | xargs)
#############
# General #
#############

View file

@ -98,29 +98,29 @@ addons_install_all_code_generator_template:
./script/addons/install_addons_dev.sh template demo_portal,auto_backup,demo_internal_inherit
./script/addons/install_addons_dev.sh template code_generator_template_demo_portal,code_generator_template_demo_sysadmin_cron,code_generator_template_demo_internal_inherit
#./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_portal -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_portal
#./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_portal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_portal
#./script/addons/install_addons_dev.sh template demo_portal
#./script/addons/install_addons_dev.sh template code_generator_template_demo_portal
#./script/code_generator/search_class_model.py --quiet -d addons/OCA_server-tools/auto_backup -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_sysadmin_cron
#./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/OCA_server-tools/auto_backup -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_sysadmin_cron
#./script/addons/install_addons_dev.sh template auto_backup
#./script/addons/install_addons_dev.sh template code_generator_template_demo_sysadmin_cron
#./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_internal -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal
#./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_internal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal
#./script/addons/install_addons_dev.sh template demo_internal
#./script/addons/install_addons_dev.sh template code_generator_template_demo_internal
#./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_internal_inherit -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal_inherit
#./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_internal_inherit -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal_inherit
#./script/addons/install_addons_dev.sh template demo_internal_inherit
#./script/addons/install_addons_dev.sh template code_generator_template_demo_internal_inherit
# TODO not working, need to add in test parallel
#./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_website_snippet -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_website_snippet
#./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_website_snippet -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_website_snippet
#./script/addons/install_addons_dev.sh template demo_website_snippet
#./script/addons/install_addons_dev.sh template code_generator_template_demo_website_snippet
# TODO not working, need to add in test parallel
#./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_website_multiple_snippet -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_website_multiple_snippet
#./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_website_multiple_snippet -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_website_multiple_snippet
#./script/addons/install_addons_dev.sh template demo_website_multiple_snippet
#./script/addons/install_addons_dev.sh template code_generator_template_demo_website_multiple_snippet
@ -146,26 +146,26 @@ addons_install_all_generated_demo:
addons_install_code_generator_template_code_generator:
./script/database/db_restore.py --database template
./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator/code_generator -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_code_generator --with_inherit
./script/maintenance/black.sh ./addons/TechnoLibre_odoo-code-generator-template/code_generator_template_code_generator
./script/maintenance/black.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_code_generator
./script/addons/install_addons_dev.sh template code_generator
./script/addons/install_addons_dev.sh template code_generator_template_code_generator
./script/git/remote_code_generation_git_compare.py --quiet --git_gui --clear --replace_directory --directory1 ./addons/TechnoLibre_odoo-code-generator-template/code_generator_code_generator --directory2 ./addons/TechnoLibre_odoo-code-generator/code_generator_code_generator
./script/git/remote_code_generation_git_compare.py --quiet --git_gui --clear --replace_directory --directory1 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_code_generator --directory2 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/code_generator_code_generator
.PHONY: addons_install_code_generator_code_generator
addons_install_code_generator_code_generator:
./script/database/db_restore.py --database code_generator
./script/addons/install_addons_dev.sh code_generator code_generator_code_generator
./script/git/remote_code_generation_git_compare.py --quiet --git_gui --clear --replace_directory --directory1 ./addons/TechnoLibre_odoo-code-generator/code_generator --directory2 ./addons/TechnoLibre_odoo-code-generator-template/code_generator
./script/git/remote_code_generation_git_compare.py --quiet --git_gui --clear --replace_directory --directory1 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/code_generator --directory2 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator
.PHONY: meld_code_generator_template_code_generator
meld_code_generator_template_code_generator:
./script/make.sh clean
meld ./addons/TechnoLibre_odoo-code-generator/code_generator_code_generator ./addons/TechnoLibre_odoo-code-generator-template/code_generator_code_generator
meld ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/code_generator_code_generator ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_code_generator
.PHONY: meld_code_generator_code_generator
meld_code_generator_code_generator:
./script/make.sh clean
meld ./addons/TechnoLibre_odoo-code-generator-template/code_generator ./addons/TechnoLibre_odoo-code-generator/code_generator
meld ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/code_generator
########################
# Extra migrator sql #
@ -179,7 +179,7 @@ addons_install_code_generator_mariadb_sql_example_1:
./script/database/db_restore.py --database template
./script/addons/install_addons_dev.sh template code_generator_portal,demo_mariadb_sql_example_1
./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_mariadb_sql_example_1 -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_mariadb_sql_example_1
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_mariadb_sql_example_1 -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_mariadb_sql_example_1
./script/addons/install_addons_dev.sh template code_generator_template_demo_mariadb_sql_example_1
./script/database/db_restore.py --database code_generator
@ -199,33 +199,33 @@ test_coverage_code_generator_hello_world:
.PHONY: test_code_generator_generation
test_code_generator_generation:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./addons/OCA_server-tools/auto_backup
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/OCA_server-tools/auto_backup
# Multiple
./script/database/db_restore.py --database test_code_generator
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo,code_generator_demo_export_helpdesk,code_generator_demo_export_website,code_generator_demo_internal,code_generator_demo_portal,code_generator_demo_theme_website,code_generator_demo_website_leaflet,code_generator_demo_website_snippet ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo,demo_helpdesk_data,demo_website_data,demo_internal,demo_portal,theme_website_demo_code_generator,demo_website_leaflet,demo_website_snippet
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo,code_generator_demo_export_helpdesk,code_generator_demo_export_website,code_generator_demo_internal,code_generator_demo_portal,code_generator_demo_theme_website,code_generator_demo_website_leaflet,code_generator_demo_website_snippet ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo,demo_helpdesk_data,demo_website_data,demo_internal,demo_portal,theme_website_demo_code_generator,demo_website_leaflet,demo_website_snippet
# inherit
# TODO should be in multiple list, need to support it
./script/database/db_restore.py --database test_code_generator
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_internal_inherit ./addons/TechnoLibre_odoo-code-generator-template demo_internal_inherit
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_internal_inherit ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_internal_inherit
# auto_backup
./script/database/db_restore.py --database test_code_generator
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_auto_backup ./addons/OCA_server-tools/auto_backup auto_backup
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_auto_backup ./odoo$(ODOO_VERSION)/addons/OCA_server-tools/auto_backup auto_backup
# Single
#./script/database/db_restore.py --database test_code_generator
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_export_helpdesk ./addons/TechnoLibre_odoo-code-generator-template demo_helpdesk_data
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_export_website ./addons/TechnoLibre_odoo-code-generator-template demo_website_data
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_internal ./addons/TechnoLibre_odoo-code-generator-template demo_internal
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_portal ./addons/TechnoLibre_odoo-code-generator-template demo_portal
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_theme_website ./addons/TechnoLibre_odoo-code-generator-template theme_website_demo_code_generator
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_website_leaflet ./addons/TechnoLibre_odoo-code-generator-template demo_website_leaflet
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_website_snippet ./addons/TechnoLibre_odoo-code-generator-template demo_website_snippet
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_export_helpdesk ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_helpdesk_data
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_export_website ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_website_data
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_internal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_internal
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_portal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_portal
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_theme_website ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template theme_website_demo_code_generator
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_website_leaflet ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_website_leaflet
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_website_snippet ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_website_snippet
#./script/database/db_restore.py --database test_code_generator
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_internal_inherit ./addons/TechnoLibre_odoo-code-generator-template demo_internal_inherit
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_internal_inherit ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_internal_inherit
#./script/database/db_restore.py --database test_code_generator
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_auto_backup ./addons/OCA_server-tools/auto_backup auto_backup
#./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_auto_backup ./odoo$(ODOO_VERSION)/addons/OCA_server-tools/auto_backup auto_backup
.PHONY: test_code_generator_generation_template
test_code_generator_generation_template:
@ -235,56 +235,65 @@ test_code_generator_generation_template:
.PHONY: test_code_generator_code_template_demo_portal
test_code_generator_code_template_demo_portal:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/db_restore.py --database test_template
./script/addons/install_addons_dev.sh test_template demo_portal
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_portal
./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_portal -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_portal --with_inherit
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_portal ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo_portal
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_portal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_portal --with_inherit
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_portal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_portal
.PHONY: test_code_generator_code_template_demo_internal
test_code_generator_code_template_demo_internal:
#./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/db_restore.py --database test_template
./script/addons/install_addons_dev.sh test_template demo_internal
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_internal
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_internal -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_internal ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_internal
.PHONY: test_code_generator_code_template_demo_internal_inherit
test_code_generator_code_template_demo_internal_inherit:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/db_restore.py --database test_template
./script/addons/install_addons_dev.sh test_template demo_internal_inherit
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_internal_inherit
./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_internal_inherit -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal_inherit --with_inherit
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_internal_inherit ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo_internal_inherit
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_internal_inherit -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_internal_inherit --with_inherit
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_internal_inherit ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_internal_inherit
.PHONY: test_code_generator_code_template_demo_sysadmin_cron
test_code_generator_code_template_demo_sysadmin_cron:
./script/code_generator/check_git_change_code_generator.sh ./addons/OCA_server-tools/auto_backup
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/OCA_server-tools/auto_backup
./script/database/db_restore.py --database test_template
./script/addons/install_addons_dev.sh test_template auto_backup
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_sysadmin_cron
./script/code_generator/search_class_model.py --quiet -d addons/OCA_server-tools/auto_backup -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_sysadmin_cron --with_inherit
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_sysadmin_cron ./addons/TechnoLibre_odoo-code-generator-template code_generator_auto_backup
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/OCA_server-tools/auto_backup -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_sysadmin_cron --with_inherit
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_sysadmin_cron ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_auto_backup
.PHONY: test_code_generator_migrator_demo_mariadb_sql_example_1
test_code_generator_migrator_demo_mariadb_sql_example_1:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/restore_mariadb_sql_example_1.sh
./script/database/db_restore.py --database test_code_generator
./script/addons/install_addons_dev.sh test_code_generator code_generator_portal
#./script/addons/install_addons_dev.sh test_code_generator code_generator_migrator_demo_mariadb_sql_example_1
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_migrator_demo_mariadb_sql_example_1 ./addons/TechnoLibre_odoo-code-generator-template demo_mariadb_sql_example_1
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_migrator_demo_mariadb_sql_example_1 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_mariadb_sql_example_1
.PHONY: test_code_generator_template_demo_mariadb_sql_example_1
test_code_generator_template_demo_mariadb_sql_example_1:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/db_restore.py --database test_template
./script/addons/install_addons_dev.sh test_template code_generator_portal,demo_mariadb_sql_example_1
./script/code_generator/search_class_model.py --quiet -d addons/TechnoLibre_odoo-code-generator-template/demo_mariadb_sql_example_1 -t addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_mariadb_sql_example_1 --with_inherit
./script/code_generator/search_class_model.py --quiet -d ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/demo_mariadb_sql_example_1 -t ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/code_generator_template_demo_mariadb_sql_example_1 --with_inherit
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_mariadb_sql_example_1
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_mariadb_sql_example_1 ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo_mariadb_sql_example_1
./script/code_generator/install_and_test_code_generator.sh test_template code_generator_template_demo_mariadb_sql_example_1 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template code_generator_demo_mariadb_sql_example_1
.PHONY: test_code_generator_demo_mariadb_sql_example_1
test_code_generator_demo_mariadb_sql_example_1:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/db_restore.py --database test_code_generator
./script/addons/install_addons_dev.sh test_code_generator code_generator_portal
#./script/addons/install_addons_dev.sh test_code_generator code_generator_demo_mariadb_sql_example_1
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_mariadb_sql_example_1 ./addons/TechnoLibre_odoo-code-generator-template demo_mariadb_sql_example_1
./script/code_generator/install_and_test_code_generator.sh test_code_generator code_generator_demo_mariadb_sql_example_1 ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template demo_mariadb_sql_example_1
.PHONY: test_addons_code_generator
test_addons_code_generator:
@ -318,9 +327,9 @@ test_addons_code_generator_template_code_generator:
./test.sh --dev cg -d test_addons_code_generator_template_code_generator --db-filter test_addons_code_generator_template_code_generator -i code_generator
./test.sh --dev cg -d test_addons_code_generator_template_code_generator --db-filter test_addons_code_generator_template_code_generator -i code_generator_template_code_generator
./.venv.erplibre/bin/coverage combine -a
./.venv.erplibre/bin/coverage report -m --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage html --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage json --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage report -m --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage html --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage json --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
# run: make open_test_coverage
# generate config repo code_generator

View file

@ -98,11 +98,11 @@ robot_libre_open_record:
.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"
parallel ::: "./script/maintenance/format.sh ./odoo$(ODOO_VERSION)/addons/ERPLibre_erplibre_addons/erplibre_devops" "./script/maintenance/format.sh ./odoo$(ODOO_VERSION)/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
./script/code_generator/new_project.py -f -d ./odoo$(ODOO_VERSION)/addons/ERPLibre_erplibre_addons -m erplibre_devops
.PHONY: run_db
run_db:

View file

@ -53,9 +53,9 @@ test_full_fast_coverage:
# TODO This test is broken in parallel
#./script/make.sh test_coverage_code_generator_hello_world
./.venv.erplibre/bin/coverage combine -a
./.venv.erplibre/bin/coverage report -m --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage html --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage json --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage report -m --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage html --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage json --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
# run: make open_test_coverage
@ -67,9 +67,9 @@ test_cg_demo:
./.venv.erplibre/bin/coverage erase
./script/addons/coverage_install_addons_dev.sh test code_generator_demo
./.venv.erplibre/bin/coverage combine -a
./.venv.erplibre/bin/coverage report -m --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage html --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage json --include="addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage report -m --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage html --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
./.venv.erplibre/bin/coverage json --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
.PHONY: test_base
test_base:
@ -87,12 +87,12 @@ test_extra:
.PHONY: test_format
test_format:
./script/maintenance/black.sh --check ./addons/TechnoLibre_odoo-code-generator/
./script/maintenance/black.sh --check ./addons/TechnoLibre_odoo-code-generator-template/
./script/maintenance/black.sh --check ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/
./script/maintenance/black.sh --check ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template/
.PHONY: test_installation_demo
test_installation_demo:
./script/code_generator/check_git_change_code_generator.sh ./addons/TechnoLibre_odoo-code-generator-template
./script/code_generator/check_git_change_code_generator.sh ./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator-template
./script/database/db_restore.py --database test_demo
./script/addons/install_addons.sh test_demo demo_helpdesk_data,demo_internal,demo_internal_inherit,demo_mariadb_sql_example_1,demo_portal,demo_website_data,demo_website_leaflet,demo_website_snippet
./script/addons/install_addons_theme.sh test_demo theme_website_demo_code_generator

View file

@ -32,14 +32,14 @@ services:
restart: always
db:
image: postgis/postgis:17-3.6-alpine
image: postgis/postgis:18-3.6-alpine
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: odoo
POSTGRES_DB: postgres
PGDATA: /var/lib/postgresql/data/pgdata
PGDATA: /var/lib/postgresql/pgdata
volumes:
- erplibre-db-data:/var/lib/postgresql/data/pgdata
- erplibre-db-data:/var/lib/postgresql/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) :

View file

@ -33,14 +33,14 @@ services:
restart: always
db:
image: postgis/postgis:17-3.6-alpine
image: postgis/postgis:18-3.6-alpine
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: odoo
POSTGRES_DB: postgres
PGDATA: /var/lib/postgresql/data/pgdata
PGDATA: /var/lib/postgresql/pgdata
volumes:
- erplibre-db-data:/var/lib/postgresql/data/pgdata
- erplibre-db-data:/var/lib/postgresql/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) :

View file

@ -34,14 +34,14 @@ services:
restart: always
db:
image: postgis/postgis:17-3.6-alpine
image: postgis/postgis:18-3.6-alpine
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: odoo
POSTGRES_DB: postgres
PGDATA: /var/lib/postgresql/data/pgdata
PGDATA: /var/lib/postgresql/pgdata
volumes:
- erplibre-db-data:/var/lib/postgresql/data/pgdata
- erplibre-db-data:/var/lib/postgresql/pgdata
restart: always
chrome:

File diff suppressed because it is too large Load diff

View file

@ -20,14 +20,15 @@ authors = [ "Mathieu Benoit <mathben@technolibre.ca>",]
[tool.poetry.dependencies]
python = ">=3.12.10,<3.13"
asn1crypto = "1.5.1"
astor = "^0.8.1"
avalara = "^25.9.0"
babel = "2.10.3"
bandit = "^1.8.6"
base64io = "^1.0.3"
beautifulsoup4 = "4.13.5"
bokeh = "3.6.3"
boto3 = "^1.40.67"
cachetools = "^6.2.1"
boto3 = "^1.40.74"
cachetools = "^6.2.2"
cairosvg = "^2.8.2"
caldav = "1.3.9"
cbor2 = "5.6.2"
@ -36,7 +37,7 @@ code-writer = "^1.2.0"
colorama = "^0.4.6"
cryptography = "46.0.3"
cssselect = "^1.3.0"
cython = "^3.2.0"
cython = "^3.2.1"
decorator = "5.1.1"
docutils = "0.20.1"
dropbox = "^12.0.2"
@ -76,12 +77,15 @@ meteostat = "1.6.8"
mock = "^5.2.0"
mpld3 = "0.5.10"
msgraphfs = "^0.4"
mysqlclient = "^2.2.7"
nextcloud-api-wrapper = "^0.2.3"
num2words = "0.5.13"
numpy = ">=1.15"
numpy-financial = "<=1.0.0"
numpy-stl = "^3.2.0"
odoorpc = "^0.10.1"
ofxparse = "0.21"
openai = "^2.7.1"
openai = "^2.8.0"
openpyxl = "3.1.2"
openupgradelib = "^3.12.0"
openwebui-client = ">=0.3.0"
@ -92,11 +96,11 @@ pathspec = "^0.12.1"
pdf2image = "^1.17.0"
pdfminer = "^20191125"
pexpect = "^4.9.0"
phonenumbers = "^9.0.17"
phonenumbers = "^9.0.18"
pillow = "10.2.0"
plotly = "^6.4.0"
polib = "1.1.1"
pre-commit = "^4.3.0"
pre-commit = "^4.4.0"
premailer = "^3.10.0"
prometheus-client = "^0.23.1"
psutil = "5.9.8"
@ -141,7 +145,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"
@ -149,10 +153,11 @@ schwifty = "2024.4.0"
sentry-sdk = ">=2.0.0,<=2.22.0"
setuptools = "80.9.0"
shapely = "^2.1.2"
sqlalchemy = "^2.0.44"
statsd = "^4.0.1"
tldextract = "^5.3.0"
tweepy = "^4.16.0"
twilio = "^9.8.5"
twilio = "^9.8.6"
unidecode = "^1.4.0"
urllib3 = "2.0.7"
uvloop = "^0.22.1"
@ -167,9 +172,6 @@ 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"

View file

@ -67,6 +67,3 @@ 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

View file

@ -32,7 +32,7 @@ with open(filename_odoo_version, "r") as f:
odoo_version = f.readline()
CODE_GENERATOR_DIRECTORY = (
f"./odoo{ODOO_VERSION}/addons/TechnoLibre_odoo-code-generator-template/"
f"./odoo{odoo_version}/addons/TechnoLibre_odoo-code-generator-template/"
)
CODE_GENERATOR_DEMO_NAME = "code_generator_demo"
KEY_REPLACE_CODE_GENERATOR_DEMO = 'MODULE_NAME = "%s"'
@ -143,7 +143,7 @@ class ProjectManagement:
# Replace addons/ by odoo12.0/addons/
module_directory = module_directory.replace(
"addons/", f"odoo{ODOO_VERSION}/addons/"
"addons/", f"odoo{odoo_version}/addons/"
)
self.module_directory = module_directory

View file

@ -10,11 +10,34 @@ import os
import sys
from pathlib import Path
import astor
logging.basicConfig(level=logging.DEBUG)
_logger = logging.getLogger(__name__)
ARGS_TYPE_PARAM = {
"Char": ["string", "size"],
"Text": ["string"],
"Integer": ["string"],
"Float": ["string"],
"Boolean": ["string"],
"Date": ["string"],
"Datetime": ["string"],
"Binary": ["string"],
"Html": ["string"],
"Json": ["string"],
"Many2one": ["comodel_name", "string"],
"One2many": ["comodel_name", "inverse_name", "string"],
"Many2many": ["comodel_name", "relation", "column1", "column2", "string"],
"Monetary": ["string", "currency_field"],
"Selection": ["selection", "string"],
"Reference": ["string"],
"Image": ["string"],
"Properties": ["string"],
"PropertiesDefinition": ["string"],
"Serialized": ["string"],
"Many2oneReference": ["string"],
"Id": [],
}
def get_config():
"""Parse command line arguments, extracting the config file name,
@ -57,6 +80,16 @@ def get_config():
action="store_true",
help="Return result in json",
)
parser.add_argument(
"--format_json",
action="store_true",
help="If --json is enabled, will format json for human reader.",
)
parser.add_argument(
"--show_error_json",
action="store_true",
help="Will show error when --json is enabled.",
)
parser.add_argument(
"--extract_field",
action="store_true",
@ -124,7 +157,7 @@ def search_and_replace(
def extract_lambda(node):
result = astor.to_source(node).strip().replace("\n", "")
result = ast.unparse(node)
if result[0] == "(" and result[-1] == ")":
result = result[1:-1]
return result
@ -133,14 +166,10 @@ def extract_lambda(node):
def fill_search_field(ast_obj, var_name="", py_filename=""):
ast_obj_type = type(ast_obj)
result = None
if ast_obj_type is ast.Str:
result = ast_obj.s
if ast_obj_type is ast.Constant:
result = ast_obj.value
elif ast_obj_type is ast.Lambda:
result = extract_lambda(ast_obj)
elif ast_obj_type is ast.NameConstant:
result = ast_obj.value
elif ast_obj_type is ast.Num:
result = ast_obj.n
elif ast_obj_type is ast.UnaryOp:
if type(ast_obj.op) is ast.USub:
# value is negative
@ -224,7 +253,7 @@ def main():
and type(node.targets[0]) is ast.Name
# and node.targets[0].id in ("_name",)
# and node.targets[0].id in ("_name", "_inherit")
and type(node.value) is ast.Str
and type(node.value) is ast.Constant
):
model_name = ""
is_inherit = False
@ -232,15 +261,15 @@ def main():
lst_search_target
and node.targets[0].id in lst_search_target
):
if node.value.s in lst_model_name:
if node.value.value in lst_model_name:
is_duplicated = True
_logger.warning(
"Duplicated model name"
f" {node.value.s} from file {py_file}"
f" {node.value.value} from file {py_file}"
)
else:
model_name = node.value.s
lst_model_name.append(node.value.s)
model_name = node.value.value
lst_model_name.append(node.value.value)
if (
lst_search_inherit_target
@ -248,14 +277,16 @@ def main():
in lst_search_inherit_target
):
is_inherit = True
if node.value.s in lst_model_inherit_name:
if node.value.value in lst_model_inherit_name:
_logger.warning(
"Duplicated model inherit name"
f" {node.value.s} from file {py_file}"
f" {node.value.value} from file {py_file}"
)
else:
model_name = node.value.s
lst_model_inherit_name.append(node.value.s)
model_name = node.value.value
lst_model_inherit_name.append(
node.value.value
)
dct_fields = {}
if model_name:
dct_model[model_name] = {
@ -264,10 +295,9 @@ def main():
"is_inherit": is_inherit,
}
# Detect fields
# TODO do it!
if model_name and (
type(node.value) is ast.Str
and node.value.s == model_name
type(node.value) is ast.Constant
and node.value.value == model_name
or type(node.value) is ast.List
and model_name
in [a.s for a in node.value.elts]
@ -289,6 +319,29 @@ def main():
"sequence": sequence,
}
dct_fields[var_name] = d
lst_args = [
a.value for a in node.value.args
]
if lst_args:
lst_default_arg_position = (
ARGS_TYPE_PARAM.get(
node.value.func.attr, []
)
)
for (
index_arg_position,
default_arg_position,
) in enumerate(
lst_default_arg_position
):
if index_arg_position < len(
lst_args
):
d[default_arg_position] = (
lst_args[
index_arg_position
]
)
for keyword in node.value.keywords:
value = fill_search_field(
keyword.value, var_name
@ -305,14 +358,15 @@ def main():
lst_model_inherit_name.remove(ignored_inherit)
models_inherit_name = "; ".join(lst_model_inherit_name)
if not config.json:
if not models_name:
_logger.warning(f"Missing models class in {config.directory}")
elif not config.quiet:
if not config.quiet:
# _logger.info(models_name)
print(models_name)
print(models_inherit_name)
else:
output = json.dumps(dct_model)
if config.format_json:
output = json.dumps(dct_model, indent=4, sort_keys=True)
else:
output = json.dumps(dct_model)
print(output)
if config.template_dir:

View file

@ -0,0 +1,89 @@
#!/usr/bin/env python3
# © 2021-2025 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
import argparse
import sys
import zipfile
def process_zip(
path_backup_zip, path_output_zip, word_to_delete, file_to_modify
):
# Ouvrir le zip d'entrée en lecture
try:
with zipfile.ZipFile(path_backup_zip, "r") as zin, zipfile.ZipFile(
path_output_zip, "w"
) as zout:
# Parcourir tous les fichiers du zip
for item in zin.infolist():
data = zin.read(item.filename)
if item.filename == file_to_modify:
try:
# On suppose un fichier texte en UTF-8
text = data.decode("utf-8")
except UnicodeDecodeError:
print(
f"Erreur : impossible de décoder {file_to_modify} en UTF-8",
file=sys.stderr,
)
sys.exit(1)
# Filtrer les lignes qui NE contiennent PAS le mot à supprimer
lines = text.splitlines(
keepends=True
) # garder les fins de lignes
filtered_lines = [
line for line in lines if word_to_delete not in line
]
new_text = "".join(filtered_lines)
new_data = new_text.encode("utf-8")
# Écrire la version modifiée dans le nouveau zip
zout.writestr(item, new_data)
else:
# Pour les autres fichiers, on recopie tel quel
zout.writestr(item, data)
except FileNotFoundError:
print(
f"Erreur : fichier zip source introuvable : {path_backup_zip}",
file=sys.stderr,
)
sys.exit(1)
def main():
parser = argparse.ArgumentParser(
description="Modifier un fichier dans un zip en supprimant les lignes contenant un mot donné."
)
parser.add_argument(
"--path_backup_zip", help="Chemin vers le zip original"
)
parser.add_argument(
"--path_output_zip", help="Chemin vers le nouveau zip à créer"
)
parser.add_argument(
"--word_to_delete",
help="Mot clé à supprimer (lignes contenant ce mot seront retirées)",
)
parser.add_argument(
"--file_to_modify",
default="dump.sql",
help="Nom du fichier à modifier à l'intérieur du zip (chemin interne)",
)
args = parser.parse_args()
process_zip(
args.path_backup_zip,
args.path_output_zip,
args.word_to_delete,
args.file_to_modify,
)
if __name__ == "__main__":
main()

View file

@ -5,7 +5,10 @@
import asyncio
from collections import deque
import uvloop
try:
import uvloop
except ImportError:
uvloop = None
async def run_in_serial(task_list):
@ -95,40 +98,54 @@ def print_summary_task(task_list, lst_task_name=None):
def execute(config, lst_task, use_uvloop=False):
error_detected = False
return_value = None
if not config.no_parallel and asyncio.get_event_loop().is_closed():
asyncio.set_event_loop(asyncio.new_event_loop())
# --- Mode 1 : pas de parallélisme → déjà OK avec asyncio.run ---
if config.no_parallel:
return_value = asyncio.run(run_in_serial(lst_task))
elif config.max_process:
# run_in_serial doit être une coroutine (async def)
try:
if use_uvloop and uvloop is not None:
# À faire AVANT la création de la loop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
return_value = asyncio.run(run_in_serial(lst_task))
except Exception as e:
error_detected = True
print(e)
return return_value, error_detected
# --- Mode 2 : AsyncioPool (on suppose qu'il gère sa loop lui-même) ---
if config.max_process:
pool = AsyncioPool(config.max_process)
for task in lst_task:
pool.add_coro(task)
try:
# API existante, on ne touche pas
return_value = pool.run_until_complete()
finally:
pool.close()
else:
# Use maximal resource
if use_uvloop:
uvloop.install()
loop = asyncio.get_event_loop()
# Can fix when cannot attach child to loop
# if sys.platform != "win32":
# policy = asyncio.get_event_loop_policy()
# watcher = asyncio.SafeChildWatcher()
# watcher.attach_loop(loop)
# policy.set_child_watcher(watcher)
if config.debug:
loop.set_debug(True)
try:
commands = asyncio.gather(*lst_task)
return_value = loop.run_until_complete(commands)
except RuntimeError as e:
except Exception as e:
error_detected = True
print(e)
finally:
loop.close()
pool.close()
return return_value, error_detected
# --- Mode 3 : utilisation maximale des ressources avec asyncio.gather ---
async def _run_max_resources(tasks, debug: bool):
if debug:
loop = asyncio.get_running_loop()
loop.set_debug(True)
# tasks doit être une liste de coroutines
results = await asyncio.gather(*tasks)
return results
try:
if use_uvloop and uvloop is not None:
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())
return_value = asyncio.run(_run_max_resources(lst_task, config.debug))
except RuntimeError as e:
# par ex. si tu appelles ça depuis un environnement où il y a
# déjà une loop (Jupyter, certains frameworks)
error_detected = True
print(e)
return return_value, error_detected

View file

@ -44,6 +44,27 @@ def get_modified_files():
check=True,
)
lines_project = result.stdout.strip().split("\n\n")
if os.path.isfile(".odoo-version"):
with open(".odoo-version") as txt:
odoo_version = txt.read()
path_addons = os.path.join(
f"odoo{odoo_version}", "addons", "addons"
)
if os.path.exists(os.path.join(path_addons, ".git")):
# Detected hidden private repository
result = subprocess.run(
["git", "status", "--porcelain"],
cwd=path_addons,
capture_output=True,
text=True,
check=True,
)
output = result.stdout.strip()
if output:
lines_addons_project = f"project {path_addons}/\n" + output
lines_project.append(lines_addons_project)
for str_project_line in lines_project:
line_repo = str_project_line.split("\n")
projet_name = line_repo[0]

View file

@ -3,7 +3,7 @@
Run this script when doing database migration. Example :
```bash
cat ./script/migration/fix_migration_odoo140_to_odoo150.py | ./odoo15.0/odoo/odoo-bin shell -d DATABASE
source ./.venv.odoo15.0_python3.8.20/bin/activate && cat ./script/migration/fix_migration_odoo140_to_odoo150.py | ./odoo15.0/odoo/odoo-bin shell -d DATABASE
```
Check [uninstall_module_list_odoo140_to_odoo150.txt](uninstall_module_list_odoo140_to_odoo150.txt)

View file

@ -0,0 +1,27 @@
#!/usr/bin/env python3
# © 2021-2025 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
# This script fix the module mail when migrating postgresql 17 to postgresql 18
print("Running a script in the Odoo shell!")
# This fix
# odoo.sql_db: bad query: b'ALTER TABLE "discuss_channel_member" ADD FOREIGN KEY ("channel_id") REFERENCES "discuss_channel"("id") ON DELETE cascade'
# ERROR: insert or update on table "discuss_channel_member" violates foreign key constraint "discuss_channel_member_channel_id_fkey"
# DÉTAIL : Key (channel_id)=(3) is not present in table "discuss_channel".
env.cr.execute("""
ALTER TABLE discuss_channel
DROP CONSTRAINT discuss_channel_channel_type_not_null;
""")
env.cr.commit()
#env.cr.execute("SELECT to_regclass('public.discuss_channel');")
#print("table:", env.cr.fetchone())
#print(
# "model discuss.channel:",
# env["ir.model"].search([("model", "=", "discuss.channel")]),
#)
print("End fix migration with update mail postgresql 17 to postgresql 18.")

View file

@ -1231,6 +1231,32 @@ class SeleniumLib(object):
print(f"Bouton du statusbar avec le label '{status_label}' cliqué.")
return status_button
def odoo_profile_click(self, enable_dark_mode=False, enable_tour=False):
def toggle_data_menu(key, enable):
profile_button = self.click_with_mouse_move(
By.XPATH,
"//div[contains(@class, 'o_user_menu')]/button[contains(@class, 'py-1')]",
)
element = self.get_element(
By.XPATH,
f"//div[contains(@class, 'o_popover')]//span[@data-menu=\"{key}\"]//input",
)
if element.is_selected() != enable:
self.click_with_mouse_move(
By.XPATH,
f"//div[contains(@class, 'o_popover')]//span[@data-menu=\"{key}\"]//input",
)
else:
# close it
self.click_with_mouse_move(
By.XPATH,
"//div[contains(@class, 'o_user_menu')]/button[contains(@class, 'py-1')]",
)
toggle_data_menu("web_tour.tour_enabled", enable_tour)
toggle_data_menu("color_scheme.switch", enable_dark_mode)
def odoo_web_form_click_statusbar_button_status_floating(
self, status_label, timeout=10
):

View file

@ -163,6 +163,13 @@ def run(
# Fermez le navigateur
# selenium_tool.driver.quit()
# Force use dark mode if enable
selenium_tool.odoo_profile_click(
enable_dark_mode=not config.no_dark_mode, enable_tour=False
)
print("End web_login.py")
def compute_args(args):
pass

View file

@ -0,0 +1,173 @@
{
"lst_test": [
{
"run_command": true,
"test_name": "helloworld_test",
"sequence": 10,
"script": "./test/code_generator/hello_world.sh",
"restore_db_image_name": "odoo18.0_base",
"note": "Test helloword_test Will cause conflict with the other because write in code_generator_demo/hooks.py"
},
{
"run_test_exec": true,
"test_name": "code_generator_theme_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "theme_website_demo_code_generator",
"tested_module": "code_generator_demo_theme_website",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "code_generator_demo_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "code_generator_demo",
"tested_module": "code_generator_demo",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_data_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_helpdesk_data",
"tested_module": "code_generator_demo_export_helpdesk",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_data_part_2_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_website_data",
"tested_module": "code_generator_demo_export_website",
"restore_db_image_name": "odoo18.0_base",
"note": "Merge to code_generator_data_test when fix double export data."
},
{
"run_test_exec": true,
"test_name": "code_generator_inherit_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_internal_inherit",
"tested_module": "code_generator_demo_internal_inherit",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_template_demo_internal",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "code_generator_demo_internal",
"tested_module": "code_generator_template_demo_internal",
"search_class_module": "demo_internal",
"init_module_name": "demo_internal",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_template_demo_portal",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "code_generator_demo_portal",
"tested_module": "code_generator_template_demo_portal",
"search_class_module": "demo_portal",
"init_module_name": "demo_portal",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "mariadb_test_template",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "code_generator_demo_mariadb_sql_example_1",
"tested_module": "code_generator_template_demo_mariadb_sql_example_1",
"search_class_module": "demo_mariadb_sql_example_1",
"init_module_name": "code_generator_portal,demo_mariadb_sql_example_1",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "mariadb_test_migrator",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_mariadb_sql_example_1",
"tested_module": "code_generator_migrator_demo_mariadb_sql_example_1",
"script_after_init_check": "./script/database/restore_mariadb_sql_example_1.sh",
"init_module_name": "code_generator_portal",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "mariadb_test_code_generator",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_mariadb_sql_example_1",
"tested_module": "code_generator_demo_mariadb_sql_example_1",
"init_module_name": "code_generator_portal",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_template_demo_internal_inherit",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "code_generator_demo_internal_inherit",
"tested_module": "code_generator_template_demo_internal_inherit",
"search_class_module": "demo_internal_inherit",
"init_module_name": "demo_internal_inherit",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "code_generator_template_demo_sysadmin_cron",
"path_module_check": "./odoo18.0/addons/OCA_server-tools",
"generated_module": "code_generator_auto_backup",
"generated_path": "./odoo18.0/addons/OCA_server-tools/",
"tested_module": "code_generator_template_demo_sysadmin_cron",
"search_class_module": "auto_backup",
"init_module_name": "auto_backup",
"install_path": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "code_generator_export_website_attachments_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_website_attachments_data",
"tested_module": "code_generator_demo_export_website_attachments",
"restore_db_image_name": "test_website_attachments"
},
{
"run_test_exec": true,
"disable": true,
"test_name": "code_generator_demo_generic_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_internal,demo_portal",
"tested_module": "code_generator_demo_internal,code_generator_demo_portal",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_website_snippet_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"generated_module": "demo_website_leaflet,demo_website_snippet,demo_website_multiple_snippet",
"tested_module": "code_generator_demo_website_leaflet,code_generator_demo_website_snippet,code_generator_demo_website_multiple_snippet",
"file_to_restore": "demo_portal/i18n/demo_portal.pot,demo_portal/i18n/fr_CA.po",
"file_to_restore_origin": true,
"restore_db_image_name": "odoo18.0_base",
"note": "Because code_generator_demo_website_multiple_snippet depend on code_generator_demo_portal, it will execute it and this delete file demo_portal/i18n/demo_portal.pot and demo_portal/i18n/fr_CA.po"
},
{
"run_test_exec": true,
"test_name": "demo_test",
"path_module_check": "./odoo18.0/addons/TechnoLibre_odoo-code-generator-template",
"init_module_name": "demo_helpdesk_data,demo_internal,demo_internal_inherit,demo_mariadb_sql_example_1,demo_portal,demo_website_data,demo_website_leaflet,demo_website_snippet",
"restore_db_image_name": "odoo18.0_base"
},
{
"run_test_exec": true,
"test_name": "code_generator_auto_backup_test",
"path_module_check": "./odoo18.0/addons/OCA_server-tools/auto_backup",
"generated_module": "auto_backup",
"tested_module": "code_generator_auto_backup",
"restore_db_image_name": "odoo18.0_base"
}
]
}

View file

@ -790,7 +790,7 @@ async def test_exec(
return test_result, test_status, test_name, total_time
def check_git_change():
async def check_git_change():
"""
return True if success
"""
@ -810,10 +810,8 @@ def check_git_change():
test_name="Init check_git_change OCA_server-tools",
),
]
commands = asyncio.gather(*task_list)
tpl_result = loop.run_until_complete(commands)
tpl_result = await asyncio.gather(*task_list)
status = any([a[1] for a in tpl_result])
loop.close()
return not status
@ -962,7 +960,7 @@ def main():
config = get_config()
start_time = time.time()
if not config.ignore_init_check_git:
success = check_git_change()
success = asyncio.run(check_git_change())
else:
success = True
status = False