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:
commit
ce6e7d4cc6
22 changed files with 1233 additions and 674 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
|
@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
**Migration notes**
|
||||||
|
|
||||||
|
Recreating the virtual environment, use installation guide from tool `make`.
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|
||||||
- Support Odoo migration database and module with TODO
|
- 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
|
- Separate ERPLibre python installation from Odoo python with .venv.erplibre and .venv.odoo18
|
||||||
- Implement auto-installation with TODO.py
|
- Implement auto-installation with TODO.py
|
||||||
- TODO show documentation, download database, help with code formatting
|
- 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
|
## Changed
|
||||||
|
|
||||||
- Docker support postgresql 18
|
- Docker support postgresql 18
|
||||||
|
- Format script search diff file into each repository
|
||||||
|
|
||||||
## [1.6.0] - 2025-04-25
|
## [1.6.0] - 2025-04-25
|
||||||
|
|
||||||
|
|
|
||||||
1
Makefile
1
Makefile
|
|
@ -1,5 +1,6 @@
|
||||||
SHELL := /bin/bash
|
SHELL := /bin/bash
|
||||||
LOG_FILE := ./.venv.$(cat ".erplibre-version" | xargs)/make_test.log
|
LOG_FILE := ./.venv.$(cat ".erplibre-version" | xargs)/make_test.log
|
||||||
|
ODOO_VERSION := $(shell cat .odoo-version | xargs)
|
||||||
#############
|
#############
|
||||||
# General #
|
# General #
|
||||||
#############
|
#############
|
||||||
|
|
|
||||||
|
|
@ -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 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/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 demo_portal
|
||||||
#./script/addons/install_addons_dev.sh template code_generator_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 auto_backup
|
||||||
#./script/addons/install_addons_dev.sh template code_generator_template_demo_sysadmin_cron
|
#./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 demo_internal
|
||||||
#./script/addons/install_addons_dev.sh template code_generator_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 demo_internal_inherit
|
||||||
#./script/addons/install_addons_dev.sh template code_generator_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
|
# 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 demo_website_snippet
|
||||||
#./script/addons/install_addons_dev.sh template code_generator_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
|
# 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 demo_website_multiple_snippet
|
||||||
#./script/addons/install_addons_dev.sh template code_generator_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:
|
addons_install_code_generator_template_code_generator:
|
||||||
./script/database/db_restore.py --database template
|
./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/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
|
||||||
./script/addons/install_addons_dev.sh template code_generator_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
|
.PHONY: addons_install_code_generator_code_generator
|
||||||
addons_install_code_generator_code_generator:
|
addons_install_code_generator_code_generator:
|
||||||
./script/database/db_restore.py --database code_generator
|
./script/database/db_restore.py --database code_generator
|
||||||
./script/addons/install_addons_dev.sh code_generator code_generator_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
|
.PHONY: meld_code_generator_template_code_generator
|
||||||
meld_code_generator_template_code_generator:
|
meld_code_generator_template_code_generator:
|
||||||
./script/make.sh clean
|
./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
|
.PHONY: meld_code_generator_code_generator
|
||||||
meld_code_generator_code_generator:
|
meld_code_generator_code_generator:
|
||||||
./script/make.sh clean
|
./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 #
|
# Extra migrator sql #
|
||||||
|
|
@ -179,7 +179,7 @@ addons_install_code_generator_mariadb_sql_example_1:
|
||||||
|
|
||||||
./script/database/db_restore.py --database template
|
./script/database/db_restore.py --database template
|
||||||
./script/addons/install_addons_dev.sh template code_generator_portal,demo_mariadb_sql_example_1
|
./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/addons/install_addons_dev.sh template code_generator_template_demo_mariadb_sql_example_1
|
||||||
|
|
||||||
./script/database/db_restore.py --database code_generator
|
./script/database/db_restore.py --database code_generator
|
||||||
|
|
@ -199,33 +199,33 @@ test_coverage_code_generator_hello_world:
|
||||||
|
|
||||||
.PHONY: test_code_generator_generation
|
.PHONY: test_code_generator_generation
|
||||||
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 ./odoo$(ODOO_VERSION)/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/OCA_server-tools/auto_backup
|
||||||
# Multiple
|
# Multiple
|
||||||
./script/database/db_restore.py --database test_code_generator
|
./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
|
# inherit
|
||||||
# TODO should be in multiple list, need to support it
|
# TODO should be in multiple list, need to support it
|
||||||
./script/database/db_restore.py --database test_code_generator
|
./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
|
# auto_backup
|
||||||
./script/database/db_restore.py --database test_code_generator
|
./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
|
# Single
|
||||||
#./script/database/db_restore.py --database test_code_generator
|
#./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 ./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 ./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_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 ./addons/TechnoLibre_odoo-code-generator-template demo_website_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 ./addons/TechnoLibre_odoo-code-generator-template demo_internal
|
#./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 ./addons/TechnoLibre_odoo-code-generator-template demo_portal
|
#./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 ./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_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 ./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_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 ./addons/TechnoLibre_odoo-code-generator-template demo_website_snippet
|
#./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/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/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
|
.PHONY: test_code_generator_generation_template
|
||||||
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
|
.PHONY: test_code_generator_code_template_demo_portal
|
||||||
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/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 demo_portal
|
||||||
#./script/addons/install_addons_dev.sh test_template code_generator_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/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 ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo_portal
|
./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
|
.PHONY: test_code_generator_code_template_demo_internal_inherit
|
||||||
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/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 demo_internal_inherit
|
||||||
#./script/addons/install_addons_dev.sh test_template code_generator_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/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 ./addons/TechnoLibre_odoo-code-generator-template code_generator_demo_internal_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
|
.PHONY: test_code_generator_code_template_demo_sysadmin_cron
|
||||||
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/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 auto_backup
|
||||||
#./script/addons/install_addons_dev.sh test_template code_generator_template_demo_sysadmin_cron
|
#./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/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 ./addons/TechnoLibre_odoo-code-generator-template code_generator_auto_backup
|
./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
|
.PHONY: test_code_generator_migrator_demo_mariadb_sql_example_1
|
||||||
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/restore_mariadb_sql_example_1.sh
|
||||||
./script/database/db_restore.py --database test_code_generator
|
./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_portal
|
||||||
#./script/addons/install_addons_dev.sh test_code_generator code_generator_migrator_demo_mariadb_sql_example_1
|
#./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
|
.PHONY: test_code_generator_template_demo_mariadb_sql_example_1
|
||||||
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/database/db_restore.py --database test_template
|
||||||
./script/addons/install_addons_dev.sh test_template code_generator_portal,demo_mariadb_sql_example_1
|
./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/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
|
.PHONY: test_code_generator_demo_mariadb_sql_example_1
|
||||||
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/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_portal
|
||||||
#./script/addons/install_addons_dev.sh test_code_generator code_generator_demo_mariadb_sql_example_1
|
#./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
|
.PHONY: test_addons_code_generator
|
||||||
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
|
||||||
./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
|
./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 combine -a
|
||||||
./.venv.erplibre/bin/coverage report -m --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="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="addons/TechnoLibre_odoo-code-generator/*"
|
./.venv.erplibre/bin/coverage json --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
|
||||||
# run: make open_test_coverage
|
# run: make open_test_coverage
|
||||||
|
|
||||||
# generate config repo code_generator
|
# generate config repo code_generator
|
||||||
|
|
|
||||||
|
|
@ -98,11 +98,11 @@ robot_libre_open_record:
|
||||||
|
|
||||||
.PHONY: robot_libre_format
|
.PHONY: robot_libre_format
|
||||||
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
|
.PHONY: robot_libre_generate
|
||||||
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
|
.PHONY: run_db
|
||||||
run_db:
|
run_db:
|
||||||
|
|
|
||||||
|
|
@ -53,9 +53,9 @@ test_full_fast_coverage:
|
||||||
# TODO This test is broken in parallel
|
# TODO This test is broken in parallel
|
||||||
#./script/make.sh test_coverage_code_generator_hello_world
|
#./script/make.sh test_coverage_code_generator_hello_world
|
||||||
./.venv.erplibre/bin/coverage combine -a
|
./.venv.erplibre/bin/coverage combine -a
|
||||||
./.venv.erplibre/bin/coverage report -m --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="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="addons/TechnoLibre_odoo-code-generator/*"
|
./.venv.erplibre/bin/coverage json --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
|
||||||
# run: make open_test_coverage
|
# run: make open_test_coverage
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -67,9 +67,9 @@ test_cg_demo:
|
||||||
./.venv.erplibre/bin/coverage erase
|
./.venv.erplibre/bin/coverage erase
|
||||||
./script/addons/coverage_install_addons_dev.sh test code_generator_demo
|
./script/addons/coverage_install_addons_dev.sh test code_generator_demo
|
||||||
./.venv.erplibre/bin/coverage combine -a
|
./.venv.erplibre/bin/coverage combine -a
|
||||||
./.venv.erplibre/bin/coverage report -m --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="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="addons/TechnoLibre_odoo-code-generator/*"
|
./.venv.erplibre/bin/coverage json --include="./odoo$(ODOO_VERSION)/addons/TechnoLibre_odoo-code-generator/*"
|
||||||
|
|
||||||
.PHONY: test_base
|
.PHONY: test_base
|
||||||
test_base:
|
test_base:
|
||||||
|
|
@ -87,12 +87,12 @@ test_extra:
|
||||||
|
|
||||||
.PHONY: test_format
|
.PHONY: test_format
|
||||||
test_format:
|
test_format:
|
||||||
./script/maintenance/black.sh --check ./addons/TechnoLibre_odoo-code-generator/
|
./script/maintenance/black.sh --check ./odoo$(ODOO_VERSION)/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-template/
|
||||||
|
|
||||||
.PHONY: test_installation_demo
|
.PHONY: test_installation_demo
|
||||||
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/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.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
|
./script/addons/install_addons_theme.sh test_demo theme_website_demo_code_generator
|
||||||
|
|
|
||||||
|
|
@ -32,14 +32,14 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgis/postgis:17-3.6-alpine
|
image: postgis/postgis:18-3.6-alpine
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: mysecretpassword
|
POSTGRES_PASSWORD: mysecretpassword
|
||||||
POSTGRES_USER: odoo
|
POSTGRES_USER: odoo
|
||||||
POSTGRES_DB: postgres
|
POSTGRES_DB: postgres
|
||||||
PGDATA: /var/lib/postgresql/data/pgdata
|
PGDATA: /var/lib/postgresql/pgdata
|
||||||
volumes:
|
volumes:
|
||||||
- erplibre-db-data:/var/lib/postgresql/data/pgdata
|
- erplibre-db-data:/var/lib/postgresql/pgdata
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
# We configure volume without specific destination to let docker manage it. To configure it through docker use (read related documentation before continuing) :
|
# We configure volume without specific destination to let docker manage it. To configure it through docker use (read related documentation before continuing) :
|
||||||
|
|
|
||||||
|
|
@ -33,14 +33,14 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgis/postgis:17-3.6-alpine
|
image: postgis/postgis:18-3.6-alpine
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: mysecretpassword
|
POSTGRES_PASSWORD: mysecretpassword
|
||||||
POSTGRES_USER: odoo
|
POSTGRES_USER: odoo
|
||||||
POSTGRES_DB: postgres
|
POSTGRES_DB: postgres
|
||||||
PGDATA: /var/lib/postgresql/data/pgdata
|
PGDATA: /var/lib/postgresql/pgdata
|
||||||
volumes:
|
volumes:
|
||||||
- erplibre-db-data:/var/lib/postgresql/data/pgdata
|
- erplibre-db-data:/var/lib/postgresql/pgdata
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
# We configure volume without specific destination to let docker manage it. To configure it through docker use (read related documentation before continuing) :
|
# We configure volume without specific destination to let docker manage it. To configure it through docker use (read related documentation before continuing) :
|
||||||
|
|
|
||||||
|
|
@ -34,14 +34,14 @@ services:
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgis/postgis:17-3.6-alpine
|
image: postgis/postgis:18-3.6-alpine
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: mysecretpassword
|
POSTGRES_PASSWORD: mysecretpassword
|
||||||
POSTGRES_USER: odoo
|
POSTGRES_USER: odoo
|
||||||
POSTGRES_DB: postgres
|
POSTGRES_DB: postgres
|
||||||
PGDATA: /var/lib/postgresql/data/pgdata
|
PGDATA: /var/lib/postgresql/pgdata
|
||||||
volumes:
|
volumes:
|
||||||
- erplibre-db-data:/var/lib/postgresql/data/pgdata
|
- erplibre-db-data:/var/lib/postgresql/pgdata
|
||||||
restart: always
|
restart: always
|
||||||
|
|
||||||
chrome:
|
chrome:
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -20,14 +20,15 @@ authors = [ "Mathieu Benoit <mathben@technolibre.ca>",]
|
||||||
[tool.poetry.dependencies]
|
[tool.poetry.dependencies]
|
||||||
python = ">=3.12.10,<3.13"
|
python = ">=3.12.10,<3.13"
|
||||||
asn1crypto = "1.5.1"
|
asn1crypto = "1.5.1"
|
||||||
|
astor = "^0.8.1"
|
||||||
avalara = "^25.9.0"
|
avalara = "^25.9.0"
|
||||||
babel = "2.10.3"
|
babel = "2.10.3"
|
||||||
bandit = "^1.8.6"
|
bandit = "^1.8.6"
|
||||||
base64io = "^1.0.3"
|
base64io = "^1.0.3"
|
||||||
beautifulsoup4 = "4.13.5"
|
beautifulsoup4 = "4.13.5"
|
||||||
bokeh = "3.6.3"
|
bokeh = "3.6.3"
|
||||||
boto3 = "^1.40.67"
|
boto3 = "^1.40.74"
|
||||||
cachetools = "^6.2.1"
|
cachetools = "^6.2.2"
|
||||||
cairosvg = "^2.8.2"
|
cairosvg = "^2.8.2"
|
||||||
caldav = "1.3.9"
|
caldav = "1.3.9"
|
||||||
cbor2 = "5.6.2"
|
cbor2 = "5.6.2"
|
||||||
|
|
@ -36,7 +37,7 @@ code-writer = "^1.2.0"
|
||||||
colorama = "^0.4.6"
|
colorama = "^0.4.6"
|
||||||
cryptography = "46.0.3"
|
cryptography = "46.0.3"
|
||||||
cssselect = "^1.3.0"
|
cssselect = "^1.3.0"
|
||||||
cython = "^3.2.0"
|
cython = "^3.2.1"
|
||||||
decorator = "5.1.1"
|
decorator = "5.1.1"
|
||||||
docutils = "0.20.1"
|
docutils = "0.20.1"
|
||||||
dropbox = "^12.0.2"
|
dropbox = "^12.0.2"
|
||||||
|
|
@ -76,12 +77,15 @@ meteostat = "1.6.8"
|
||||||
mock = "^5.2.0"
|
mock = "^5.2.0"
|
||||||
mpld3 = "0.5.10"
|
mpld3 = "0.5.10"
|
||||||
msgraphfs = "^0.4"
|
msgraphfs = "^0.4"
|
||||||
|
mysqlclient = "^2.2.7"
|
||||||
nextcloud-api-wrapper = "^0.2.3"
|
nextcloud-api-wrapper = "^0.2.3"
|
||||||
num2words = "0.5.13"
|
num2words = "0.5.13"
|
||||||
|
numpy = ">=1.15"
|
||||||
|
numpy-financial = "<=1.0.0"
|
||||||
numpy-stl = "^3.2.0"
|
numpy-stl = "^3.2.0"
|
||||||
odoorpc = "^0.10.1"
|
odoorpc = "^0.10.1"
|
||||||
ofxparse = "0.21"
|
ofxparse = "0.21"
|
||||||
openai = "^2.7.1"
|
openai = "^2.8.0"
|
||||||
openpyxl = "3.1.2"
|
openpyxl = "3.1.2"
|
||||||
openupgradelib = "^3.12.0"
|
openupgradelib = "^3.12.0"
|
||||||
openwebui-client = ">=0.3.0"
|
openwebui-client = ">=0.3.0"
|
||||||
|
|
@ -92,11 +96,11 @@ pathspec = "^0.12.1"
|
||||||
pdf2image = "^1.17.0"
|
pdf2image = "^1.17.0"
|
||||||
pdfminer = "^20191125"
|
pdfminer = "^20191125"
|
||||||
pexpect = "^4.9.0"
|
pexpect = "^4.9.0"
|
||||||
phonenumbers = "^9.0.17"
|
phonenumbers = "^9.0.18"
|
||||||
pillow = "10.2.0"
|
pillow = "10.2.0"
|
||||||
plotly = "^6.4.0"
|
plotly = "^6.4.0"
|
||||||
polib = "1.1.1"
|
polib = "1.1.1"
|
||||||
pre-commit = "^4.3.0"
|
pre-commit = "^4.4.0"
|
||||||
premailer = "^3.10.0"
|
premailer = "^3.10.0"
|
||||||
prometheus-client = "^0.23.1"
|
prometheus-client = "^0.23.1"
|
||||||
psutil = "5.9.8"
|
psutil = "5.9.8"
|
||||||
|
|
@ -141,7 +145,7 @@ qrcode = "7.4.2"
|
||||||
radon = "^6.0.1"
|
radon = "^6.0.1"
|
||||||
redis = "^7.0.1"
|
redis = "^7.0.1"
|
||||||
reportlab = "4.1.0"
|
reportlab = "4.1.0"
|
||||||
requests = ">=2.31.0"
|
requests = "2.31.0"
|
||||||
requests-toolbelt = "^1.0.0"
|
requests-toolbelt = "^1.0.0"
|
||||||
rjsmin = "1.2.0"
|
rjsmin = "1.2.0"
|
||||||
roulier = "^1.1.1"
|
roulier = "^1.1.1"
|
||||||
|
|
@ -149,10 +153,11 @@ schwifty = "2024.4.0"
|
||||||
sentry-sdk = ">=2.0.0,<=2.22.0"
|
sentry-sdk = ">=2.0.0,<=2.22.0"
|
||||||
setuptools = "80.9.0"
|
setuptools = "80.9.0"
|
||||||
shapely = "^2.1.2"
|
shapely = "^2.1.2"
|
||||||
|
sqlalchemy = "^2.0.44"
|
||||||
statsd = "^4.0.1"
|
statsd = "^4.0.1"
|
||||||
tldextract = "^5.3.0"
|
tldextract = "^5.3.0"
|
||||||
tweepy = "^4.16.0"
|
tweepy = "^4.16.0"
|
||||||
twilio = "^9.8.5"
|
twilio = "^9.8.6"
|
||||||
unidecode = "^1.4.0"
|
unidecode = "^1.4.0"
|
||||||
urllib3 = "2.0.7"
|
urllib3 = "2.0.7"
|
||||||
uvloop = "^0.22.1"
|
uvloop = "^0.22.1"
|
||||||
|
|
@ -167,9 +172,6 @@ xlwt = "1.3.0"
|
||||||
xmltodict = "0.13.0"
|
xmltodict = "0.13.0"
|
||||||
zeep = "4.2.1"
|
zeep = "4.2.1"
|
||||||
|
|
||||||
[tool.poetry.dependencies.astor]
|
|
||||||
git = "https://github.com/berkerpeksag/astor.git"
|
|
||||||
|
|
||||||
[tool.poetry.dependencies.black]
|
[tool.poetry.dependencies.black]
|
||||||
git = "https://github.com/psf/black.git"
|
git = "https://github.com/psf/black.git"
|
||||||
rev = "24.8.0"
|
rev = "24.8.0"
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,3 @@ git+https://github.com/prauscher/pysaml2.git@replace-pyopenssl
|
||||||
|
|
||||||
# Fix compilation, until pymssql==2.3.9 is release
|
# Fix compilation, until pymssql==2.3.9 is release
|
||||||
git+https://github.com/pymssql/pymssql.git
|
git+https://github.com/pymssql/pymssql.git
|
||||||
|
|
||||||
# Force last version, because too old into pip
|
|
||||||
git+https://github.com/berkerpeksag/astor.git
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ with open(filename_odoo_version, "r") as f:
|
||||||
odoo_version = f.readline()
|
odoo_version = f.readline()
|
||||||
|
|
||||||
CODE_GENERATOR_DIRECTORY = (
|
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"
|
CODE_GENERATOR_DEMO_NAME = "code_generator_demo"
|
||||||
KEY_REPLACE_CODE_GENERATOR_DEMO = 'MODULE_NAME = "%s"'
|
KEY_REPLACE_CODE_GENERATOR_DEMO = 'MODULE_NAME = "%s"'
|
||||||
|
|
@ -143,7 +143,7 @@ class ProjectManagement:
|
||||||
|
|
||||||
# Replace addons/ by odoo12.0/addons/
|
# Replace addons/ by odoo12.0/addons/
|
||||||
module_directory = module_directory.replace(
|
module_directory = module_directory.replace(
|
||||||
"addons/", f"odoo{ODOO_VERSION}/addons/"
|
"addons/", f"odoo{odoo_version}/addons/"
|
||||||
)
|
)
|
||||||
|
|
||||||
self.module_directory = module_directory
|
self.module_directory = module_directory
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,34 @@ import os
|
||||||
import sys
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import astor
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
_logger = logging.getLogger(__name__)
|
_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():
|
def get_config():
|
||||||
"""Parse command line arguments, extracting the config file name,
|
"""Parse command line arguments, extracting the config file name,
|
||||||
|
|
@ -57,6 +80,16 @@ def get_config():
|
||||||
action="store_true",
|
action="store_true",
|
||||||
help="Return result in json",
|
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(
|
parser.add_argument(
|
||||||
"--extract_field",
|
"--extract_field",
|
||||||
action="store_true",
|
action="store_true",
|
||||||
|
|
@ -124,7 +157,7 @@ def search_and_replace(
|
||||||
|
|
||||||
|
|
||||||
def extract_lambda(node):
|
def extract_lambda(node):
|
||||||
result = astor.to_source(node).strip().replace("\n", "")
|
result = ast.unparse(node)
|
||||||
if result[0] == "(" and result[-1] == ")":
|
if result[0] == "(" and result[-1] == ")":
|
||||||
result = result[1:-1]
|
result = result[1:-1]
|
||||||
return result
|
return result
|
||||||
|
|
@ -133,14 +166,10 @@ def extract_lambda(node):
|
||||||
def fill_search_field(ast_obj, var_name="", py_filename=""):
|
def fill_search_field(ast_obj, var_name="", py_filename=""):
|
||||||
ast_obj_type = type(ast_obj)
|
ast_obj_type = type(ast_obj)
|
||||||
result = None
|
result = None
|
||||||
if ast_obj_type is ast.Str:
|
if ast_obj_type is ast.Constant:
|
||||||
result = ast_obj.s
|
result = ast_obj.value
|
||||||
elif ast_obj_type is ast.Lambda:
|
elif ast_obj_type is ast.Lambda:
|
||||||
result = extract_lambda(ast_obj)
|
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:
|
elif ast_obj_type is ast.UnaryOp:
|
||||||
if type(ast_obj.op) is ast.USub:
|
if type(ast_obj.op) is ast.USub:
|
||||||
# value is negative
|
# value is negative
|
||||||
|
|
@ -224,7 +253,7 @@ def main():
|
||||||
and type(node.targets[0]) is ast.Name
|
and type(node.targets[0]) is ast.Name
|
||||||
# and node.targets[0].id in ("_name",)
|
# and node.targets[0].id in ("_name",)
|
||||||
# and node.targets[0].id in ("_name", "_inherit")
|
# and node.targets[0].id in ("_name", "_inherit")
|
||||||
and type(node.value) is ast.Str
|
and type(node.value) is ast.Constant
|
||||||
):
|
):
|
||||||
model_name = ""
|
model_name = ""
|
||||||
is_inherit = False
|
is_inherit = False
|
||||||
|
|
@ -232,15 +261,15 @@ def main():
|
||||||
lst_search_target
|
lst_search_target
|
||||||
and node.targets[0].id in 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
|
is_duplicated = True
|
||||||
_logger.warning(
|
_logger.warning(
|
||||||
"Duplicated model name"
|
"Duplicated model name"
|
||||||
f" {node.value.s} from file {py_file}"
|
f" {node.value.value} from file {py_file}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
model_name = node.value.s
|
model_name = node.value.value
|
||||||
lst_model_name.append(node.value.s)
|
lst_model_name.append(node.value.value)
|
||||||
|
|
||||||
if (
|
if (
|
||||||
lst_search_inherit_target
|
lst_search_inherit_target
|
||||||
|
|
@ -248,14 +277,16 @@ def main():
|
||||||
in lst_search_inherit_target
|
in lst_search_inherit_target
|
||||||
):
|
):
|
||||||
is_inherit = True
|
is_inherit = True
|
||||||
if node.value.s in lst_model_inherit_name:
|
if node.value.value in lst_model_inherit_name:
|
||||||
_logger.warning(
|
_logger.warning(
|
||||||
"Duplicated model inherit name"
|
"Duplicated model inherit name"
|
||||||
f" {node.value.s} from file {py_file}"
|
f" {node.value.value} from file {py_file}"
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
model_name = node.value.s
|
model_name = node.value.value
|
||||||
lst_model_inherit_name.append(node.value.s)
|
lst_model_inherit_name.append(
|
||||||
|
node.value.value
|
||||||
|
)
|
||||||
dct_fields = {}
|
dct_fields = {}
|
||||||
if model_name:
|
if model_name:
|
||||||
dct_model[model_name] = {
|
dct_model[model_name] = {
|
||||||
|
|
@ -264,10 +295,9 @@ def main():
|
||||||
"is_inherit": is_inherit,
|
"is_inherit": is_inherit,
|
||||||
}
|
}
|
||||||
# Detect fields
|
# Detect fields
|
||||||
# TODO do it!
|
|
||||||
if model_name and (
|
if model_name and (
|
||||||
type(node.value) is ast.Str
|
type(node.value) is ast.Constant
|
||||||
and node.value.s == model_name
|
and node.value.value == model_name
|
||||||
or type(node.value) is ast.List
|
or type(node.value) is ast.List
|
||||||
and model_name
|
and model_name
|
||||||
in [a.s for a in node.value.elts]
|
in [a.s for a in node.value.elts]
|
||||||
|
|
@ -289,6 +319,29 @@ def main():
|
||||||
"sequence": sequence,
|
"sequence": sequence,
|
||||||
}
|
}
|
||||||
dct_fields[var_name] = d
|
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:
|
for keyword in node.value.keywords:
|
||||||
value = fill_search_field(
|
value = fill_search_field(
|
||||||
keyword.value, var_name
|
keyword.value, var_name
|
||||||
|
|
@ -305,14 +358,15 @@ def main():
|
||||||
lst_model_inherit_name.remove(ignored_inherit)
|
lst_model_inherit_name.remove(ignored_inherit)
|
||||||
models_inherit_name = "; ".join(lst_model_inherit_name)
|
models_inherit_name = "; ".join(lst_model_inherit_name)
|
||||||
if not config.json:
|
if not config.json:
|
||||||
if not models_name:
|
if not config.quiet:
|
||||||
_logger.warning(f"Missing models class in {config.directory}")
|
|
||||||
elif not config.quiet:
|
|
||||||
# _logger.info(models_name)
|
# _logger.info(models_name)
|
||||||
print(models_name)
|
print(models_name)
|
||||||
print(models_inherit_name)
|
print(models_inherit_name)
|
||||||
else:
|
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)
|
print(output)
|
||||||
|
|
||||||
if config.template_dir:
|
if config.template_dir:
|
||||||
|
|
|
||||||
89
script/database/migrate/process_backup_file.py
Normal file
89
script/database/migrate/process_backup_file.py
Normal 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()
|
||||||
|
|
@ -5,7 +5,10 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
from collections import deque
|
from collections import deque
|
||||||
|
|
||||||
import uvloop
|
try:
|
||||||
|
import uvloop
|
||||||
|
except ImportError:
|
||||||
|
uvloop = None
|
||||||
|
|
||||||
|
|
||||||
async def run_in_serial(task_list):
|
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):
|
def execute(config, lst_task, use_uvloop=False):
|
||||||
error_detected = False
|
error_detected = False
|
||||||
return_value = None
|
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:
|
if config.no_parallel:
|
||||||
return_value = asyncio.run(run_in_serial(lst_task))
|
# run_in_serial doit être une coroutine (async def)
|
||||||
elif config.max_process:
|
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)
|
pool = AsyncioPool(config.max_process)
|
||||||
for task in lst_task:
|
for task in lst_task:
|
||||||
pool.add_coro(task)
|
pool.add_coro(task)
|
||||||
try:
|
try:
|
||||||
|
# API existante, on ne touche pas
|
||||||
return_value = pool.run_until_complete()
|
return_value = pool.run_until_complete()
|
||||||
finally:
|
except Exception as e:
|
||||||
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:
|
|
||||||
error_detected = True
|
error_detected = True
|
||||||
print(e)
|
print(e)
|
||||||
finally:
|
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
|
return return_value, error_detected
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,27 @@ def get_modified_files():
|
||||||
check=True,
|
check=True,
|
||||||
)
|
)
|
||||||
lines_project = result.stdout.strip().split("\n\n")
|
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:
|
for str_project_line in lines_project:
|
||||||
line_repo = str_project_line.split("\n")
|
line_repo = str_project_line.split("\n")
|
||||||
projet_name = line_repo[0]
|
projet_name = line_repo[0]
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Run this script when doing database migration. Example :
|
Run this script when doing database migration. Example :
|
||||||
|
|
||||||
```bash
|
```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)
|
Check [uninstall_module_list_odoo140_to_odoo150.txt](uninstall_module_list_odoo140_to_odoo150.txt)
|
||||||
|
|
|
||||||
|
|
@ -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.")
|
||||||
|
|
@ -1231,6 +1231,32 @@ class SeleniumLib(object):
|
||||||
print(f"Bouton du statusbar avec le label '{status_label}' cliqué.")
|
print(f"Bouton du statusbar avec le label '{status_label}' cliqué.")
|
||||||
return status_button
|
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(
|
def odoo_web_form_click_statusbar_button_status_floating(
|
||||||
self, status_label, timeout=10
|
self, status_label, timeout=10
|
||||||
):
|
):
|
||||||
|
|
|
||||||
|
|
@ -163,6 +163,13 @@ def run(
|
||||||
# Fermez le navigateur
|
# Fermez le navigateur
|
||||||
# selenium_tool.driver.quit()
|
# 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):
|
def compute_args(args):
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
173
script/test/config_testcase.odoo18.0.json
Normal file
173
script/test/config_testcase.odoo18.0.json
Normal 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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -790,7 +790,7 @@ async def test_exec(
|
||||||
return test_result, test_status, test_name, total_time
|
return test_result, test_status, test_name, total_time
|
||||||
|
|
||||||
|
|
||||||
def check_git_change():
|
async def check_git_change():
|
||||||
"""
|
"""
|
||||||
return True if success
|
return True if success
|
||||||
"""
|
"""
|
||||||
|
|
@ -810,10 +810,8 @@ def check_git_change():
|
||||||
test_name="Init check_git_change OCA_server-tools",
|
test_name="Init check_git_change OCA_server-tools",
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
commands = asyncio.gather(*task_list)
|
tpl_result = await asyncio.gather(*task_list)
|
||||||
tpl_result = loop.run_until_complete(commands)
|
|
||||||
status = any([a[1] for a in tpl_result])
|
status = any([a[1] for a in tpl_result])
|
||||||
loop.close()
|
|
||||||
return not status
|
return not status
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -962,7 +960,7 @@ def main():
|
||||||
config = get_config()
|
config = get_config()
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
if not config.ignore_init_check_git:
|
if not config.ignore_init_check_git:
|
||||||
success = check_git_change()
|
success = asyncio.run(check_git_change())
|
||||||
else:
|
else:
|
||||||
success = True
|
success = True
|
||||||
status = False
|
status = False
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue