Merge pull request #11 from ERPLibre/release/1.1.0

Release/1.1.0
- Support docker, pyenv, poetry
- More repository of addons
- More documentation and automation
This commit is contained in:
Mathieu Benoit 2020-10-01 01:35:39 -04:00 committed by GitHub
commit ffad03eeb3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
73 changed files with 6913 additions and 362 deletions

2
.gitignore vendored
View file

@ -3,7 +3,7 @@
*.tmp
*.bak
.idea
venv
.venv
*.log
config.conf
*.DS_Store

1
.python-version Normal file
View file

@ -0,0 +1 @@
3.7.7

14
.travis.yml Normal file
View file

@ -0,0 +1,14 @@
language: minimal
services:
- docker
script:
- docker build -f docker/Dockerfile.base -t technolibre/erplibre-base:12.0 docker/
# - docker build -f docker/Dockerfile.dev -t technolibre/erplibre:12.0 docker/
- docker build -f docker/Dockerfile.pkg -t technolibre/erplibre:12.0-pkg docker/
after_success:
- docker login --username mikefaille --password "${DOCKER_TOKEN}"
- docker push technolibre/erplibre-core:12.0
- docker push technolibre/erplibre:12.0-pkg

View file

@ -5,19 +5,33 @@ The format is based on [Keep a Changelog](https://keepachangelog.com),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [1.1.0] - 2020-09-30
### Added
- Docker
- Pyenv to manage python version
- Poetry to manage python dependencies
- Script poetry_update to search all dependencies in addons
- Travis CI WIP
- TODO.md
- Guide to update all repositories with community
- Update manifest
- Add missing OCA repos
- Add medical, property management and more
- Add cloud/saas repo
### Changed
- Update to Odoo Community 12.0
- Update to Odoo Community 12.0 and all addons
- Rename venv to .venv
- More documentation on how to use ERPLibre
## [1.0.1] - 2020-07-14
### Added
- Improve documentation with development and production environment
- Improve documentation with git repo
- Improved documentation with development and production environment
- Improved documentation with git repo
- Move default.xml manifest to root, the default location
- Support default.stage.xml to update prod with dev
- Feature to show diff between manifest, between repo of different manifest
- Feature to show diff between manifests or between repo of different manifests
- Update manifest
- Muk theme in erplibre_base
- Add draft account invoice approbation in portal
@ -31,7 +45,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [1.0.0] - 2020-07-04
### Added
- Environment of development, discovery and production with documentation and script.
- git-repo of Google to support addons repository instead of using Git submodule.
- Google git-repo to support addons repository instead of using Git submodule.
### Removed
- Git submodule

View file

@ -12,7 +12,7 @@ Support Ubuntu 18.04 and OSX
./script/install_dev.sh
./script/install_locally_prod.sh
```
Update your configuration if you need to run somehere than 127.0.0.1, file config.conf
Update your configuration if you need to run somehere than 127.0.0.1, file `config.conf`
```
#xmlrpc_interface = 127.0.0.1
#netrpc_interface = 127.0.0.1

30
TODO.md Normal file
View file

@ -0,0 +1,30 @@
# TODO
## Simplify push tag
For RELEASE.md, replace next value by a script to select all remote by manifest file.
Actually, need to push manually all different remote.
> ./.venv/repo forall -pc "git push ERPLibre --tags"
## Funding
- Add funding for MathBenTech and TechnoLibre
## Improve repo init usage
- Support run repo init without human interaction. Do we need to create a temporary user name?
## Improve repo sync usage
- Test repo sync with argument -d
- Test repo sync with argument -t SMART_TAG, like tag ERPLibre/v1.0.0
## Git diff
### Between 2 commits
- Show all modified file, files list.
- Show if probably has conflict if cherry-pick in wrong order,
- Show modify same line in different commit
## Development
### Run with another address ip than local
- Remove xmlrpc_interface in config file when running dev installation
- Improve config builder with a Python script
### Variable in new instance
- Add technique to add variable when create a new instance from config files
- Documentation for adding mail server, a guide for every one

View file

@ -1,103 +1,146 @@
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="ERPLibre" fetch="https://github.com/ERPLibre/"/>
<remote name="MathBenTech" fetch="https://github.com/ERPLibre/"/>
<remote name="Numigi" fetch="https://github.com/ERPLibre/"/>
<remote name="OCA" fetch="https://github.com/ERPLibre/"/>
<remote name="SanteLibre" fetch="https://github.com/ERPLibre/"/>
<remote name="Smile-SA" fetch="https://github.com/ERPLibre/"/>
<remote name="muk-it" fetch="https://github.com/ERPLibre/"/>
<remote name="odoo" fetch="https://github.com/ERPLibre/"/>
<remote name="odooaktiv" fetch="https://github.com/ERPLibre/"/>
<remote name="openeducat" fetch="https://github.com/ERPLibre/"/>
<remote fetch="https://github.com/ERPLibre/" name="CybroOdoo"/>
<remote fetch="https://github.com/ERPLibre/" name="ERPLibre"/>
<remote fetch="https://github.com/ERPLibre/" name="MathBenTech"/>
<remote fetch="https://github.com/ERPLibre/" name="Numigi"/>
<remote fetch="https://github.com/ERPLibre/" name="OCA"/>
<remote fetch="https://github.com/ERPLibre/" name="Smile-SA"/>
<remote fetch="https://github.com/ERPLibre/" name="camptocamp"/>
<remote fetch="https://github.com/ERPLibre/" name="dhongu"/>
<remote fetch="https://github.com/ERPLibre/" name="it-projects-llc"/>
<remote fetch="https://github.com/ERPLibre/" name="itpp-labs"/>
<remote fetch="https://github.com/ERPLibre/" name="kinjal-sorathiya"/>
<remote fetch="https://github.com/ERPLibre/" name="muk-it"/>
<remote fetch="https://github.com/ERPLibre/" name="obayit"/>
<remote fetch="https://github.com/ERPLibre/" name="odoo"/>
<remote fetch="https://github.com/ERPLibre/" name="odooaktiv"/>
<remote fetch="https://github.com/ERPLibre/" name="odoomates"/>
<remote fetch="https://github.com/ERPLibre/" name="openeducat"/>
<remote fetch="https://github.com/ERPLibre/" name="pledra"/>
<remote fetch="https://github.com/ERPLibre/" name="tegin"/>
<default remote="ERPLibre" revision="12.0" sync-j="4" sync-c="true"/>
<default remote="ERPLibre" revision="12.0" sync-c="true" sync-j="4"/>
<project name="QuotationRevision.git" path="addons/odooaktiv_QuotationRevision" remote="odooaktiv" revision="701438f9c59bd657de516d9ef4de1ba6167bf30b" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-analytic.git" path="addons/OCA_account-analytic" remote="OCA" revision="7ce9fe25a7c977c5338001bc32d58b1cadffe51e" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-budgeting.git" path="addons/OCA_account-budgeting" remote="OCA" revision="e175ffa84fb61f70de67a2732292e43bd490cefd" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-closing.git" path="addons/OCA_account-closing" remote="OCA" revision="40d40c73574bf65c91c879e0607b4ac455df06b2" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-consolidation.git" path="addons/OCA_account-consolidation" remote="OCA" revision="741fc50366bd70fceb88a2a3fcb0449b2582ed31" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-financial-reporting.git" path="addons/OCA_account-financial-reporting" remote="OCA" revision="1e0f8301ca015b3c4c456401bc30c5f211ccae3f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-financial-tools.git" path="addons/OCA_account-financial-tools" remote="OCA" revision="9721abd4c9db653e1d009f8a023e9f750523989f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-fiscal-rule.git" path="addons/OCA_account-fiscal-rule" remote="OCA" revision="f396ba6a2e2acebaaff579f0e6991b669812d64d" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-invoice-reporting.git" path="addons/OCA_account-invoice-reporting" remote="OCA" revision="320dd9fce4d212b2dcf5dc4447494964ad1e246d" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-invoicing.git" path="addons/OCA_account-invoicing" remote="OCA" revision="12c270d5ddeb72e0dee250289d24e3a8af4b26b3" upstream="12.0_account_invoice_approbation" dest-branch="12.0_account_invoice_approbation" groups="addons"/>
<project name="account-payment.git" path="addons/OCA_account-payment" remote="OCA" revision="888debebd8e42c1ee5107577ca2f3bc5f38d72e1" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="account-reconcile.git" path="addons/OCA_account-reconcile" remote="OCA" revision="0390b112def3d362d95232d382317511616ee6dd" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="apps-store.git" path="addons/OCA_apps-store" remote="OCA" revision="022d24db4c6463f38b9f4452fe03c9fb8b3a44ce" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="bank-payment.git" path="addons/OCA_bank-payment" remote="OCA" revision="7e0e572fb4772c8ebacfe52d58c396bdbd9e01f9" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="bank-statement-import.git" path="addons/OCA_bank-statement-import" remote="OCA" revision="198306503b51371c8603fd8defef65fcd82bf954" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="brand.git" path="addons/OCA_brand" remote="OCA" revision="601a8c5c741b3035000f2337feab16325e6b9a49" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="business-requirement.git" path="addons/OCA_business-requirement" remote="OCA" revision="dd74e74583861b44c6120473ba0b56c90b887334" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="commission.git" path="addons/OCA_commission" remote="OCA" revision="e679120a6d8f910cba81d949ecddd7b89f48fc01" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="community-data-files.git" path="addons/OCA_community-data-files" remote="OCA" revision="2b17e5567d1bcb8ca377268615f209fdd57dc66e" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="connector-telephony.git" path="addons/OCA_connector-telephony" remote="OCA" revision="6d9df1037a97dbf791a7f0a717846a63144174bb" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="contract.git" path="addons/OCA_contract" remote="OCA" revision="3e531348cb51aeb2cc16c16ab8a2b693756ba47f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="credit-control.git" path="addons/OCA_credit-control" remote="OCA" revision="a97496a829cadc0d9be07d7825e93062417ab670" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="currency.git" path="addons/OCA_currency" remote="OCA" revision="5c0d54e37789ecc24bebbe53fa56a92a492575bb" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="data-protection.git" path="addons/OCA_data-protection" remote="OCA" revision="ce4f334a1077b5c15d457f22daaa48b9f639409e" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="development.git" path="addons/MathBenTech_development" remote="MathBenTech" revision="1f023cdf2a03b8b3fbb176b45657bae2db1c0e3d" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="donation.git" path="addons/OCA_donation" remote="OCA" revision="aa6478a72c9673ad6458de19aa2362397c613fae" upstream="12.0_module_donation_website" dest-branch="12.0_module_donation_website" groups="addons"/>
<project name="e-commerce.git" path="addons/OCA_e-commerce" remote="OCA" revision="d7c99e565f25b495b3c0d252f181d8df4490a757" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="edi.git" path="addons/OCA_edi" remote="OCA" revision="742b1316773f8a1b224e42c65c3c3a7685481a30" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="erplibre_addons.git" path="addons/ERPLibre_erplibre_addons" revision="d66e9b4c9c026c02446664537b9d9a7e63cce002" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="event.git" path="addons/OCA_event" remote="OCA" revision="e2bdf12c61e9967eeb9abc618c79ca43b464ea7f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="helpdesk.git" path="addons/OCA_helpdesk" remote="OCA" revision="74da6d49a9493be6ea39eb6da0654e81aca65619" upstream="12.0_dev" dest-branch="12.0_dev" groups="addons"/>
<project name="hr.git" path="addons/OCA_hr" remote="OCA" revision="4743acf7ab796ea3738743a44c62cd516126ec53" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="knowledge.git" path="addons/OCA_knowledge" remote="OCA" revision="9ae45f798bbefa854b03f612e22291ac1b95568d" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="l10n-canada.git" path="addons/OCA_l10n-canada" remote="OCA" revision="5680b485cdfa0b6f1c2f4e32356b5938a9752c00" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="maintenance.git" path="addons/OCA_maintenance" remote="OCA" revision="4e521ec35f6e8b66f86a62db644dadc9206b476e" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="management-system.git" path="addons/OCA_management-system" remote="OCA" revision="479afcc65ee29530e2bcaa7342f93b6783d14d97" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="manufacture.git" path="addons/OCA_manufacture" remote="OCA" revision="ce36844281754a75b527c4ace21837c8a16b75ab" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="margin-analysis.git" path="addons/OCA_margin-analysis" remote="OCA" revision="22907c7ee34dba85085d9459704e38592f00e0b2" upstream="12.0_sale_margin_editor" dest-branch="12.0_sale_margin_editor" groups="addons"/>
<project name="mis-builder.git" path="addons/OCA_mis-builder" remote="OCA" revision="5d7697296ad90794599373940e6fc6cead8ca1a2" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="muk_base.git" path="addons/muk-it_muk_base" remote="muk-it" revision="d888c9695292295a732fcdd4a7b9820978df5e7f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="muk_dms.git" path="addons/muk-it_muk_dms" remote="muk-it" revision="020e604d635a229c09a07e839d95f8e37706606a" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="muk_docs.git" path="addons/muk-it_muk_docs" remote="muk-it" revision="a8ea02b9f00ae9fe5d2ea25ac43d23532cc11d45" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="muk_misc.git" path="addons/muk-it_muk_misc" remote="muk-it" revision="37b9d6dc20fa686a323057b160015bfc2c2c8143" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="muk_quality.git" path="addons/muk-it_muk_quality" remote="muk-it" revision="1a4c6f25c5e4fe0029d406d6283555bd23a44d27" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="muk_web.git" path="addons/muk-it_muk_web" remote="muk-it" revision="431d86d6694e846b407c84f00a31a10f0cf5b83b" upstream="12.0_fix_web_conflict_menu" dest-branch="12.0_fix_web_conflict_menu" groups="addons"/>
<project name="muk_website.git" path="addons/muk-it_muk_website" remote="muk-it" revision="c1e6c1755d09562f66247832bd01a0d580c43e23" upstream="12.0_remove_autoinstall" dest-branch="12.0_remove_autoinstall" groups="addons"/>
<project name="multi-company.git" path="addons/OCA_multi-company" remote="OCA" revision="fdb4d255b6a3b51925f8a226bfebf2eccabd2786" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-base-addons.git" path="addons/Numigi_odoo-base-addons" remote="Numigi" revision="60bc1e5414ff3bf81a6d72831da2eaad94ccbcb2" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-business-spending-management-quebec-canada.git" path="addons/MathBenTech_odoo-business-spending-management-quebec-canada" remote="MathBenTech" revision="822d2e018554119fa63f79ac91625473ec54b9fe" upstream="12.0_sale_order_line_timesheet_attribution" dest-branch="12.0_sale_order_line_timesheet_attribution" groups="addons"/>
<project name="odoo-entertainment-addons.git" path="addons/Numigi_odoo-entertainment-addons" remote="Numigi" revision="82c33255261eff361a91da13b28e4e68a95b25dd" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-git-addons.git" path="addons/Numigi_odoo-git-addons" remote="Numigi" revision="96db417669a631877c1439f617ac8c0cc6edfff9" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-hr-addons.git" path="addons/Numigi_odoo-hr-addons" remote="Numigi" revision="0034395bcdb38c02749644607f43ccac760dfb49" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-partner-addons.git" path="addons/Numigi_odoo-partner-addons" remote="Numigi" revision="f0c54ffb3409cd8e748ae5db19077c7c966cd57f" upstream="12.0_partner_no_vat_improve_no_vat" dest-branch="12.0_partner_no_vat_improve_no_vat" groups="addons"/>
<project name="odoo-product-addons.git" path="addons/Numigi_odoo-product-addons" remote="Numigi" revision="36751bd3c6baced6a0b3f5ddb675d87cb04a745c" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-project-addons.git" path="addons/Numigi_odoo-project-addons" remote="Numigi" revision="4388a4ca61b87032e2c3783dc2740b299cd31b6f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-purchase-addons.git" path="addons/Numigi_odoo-purchase-addons" remote="Numigi" revision="5d226ca3887c77e31467a192a0fbe4066bf7842c" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-stock-addons.git" path="addons/Numigi_odoo-stock-addons" remote="Numigi" revision="3fe57c3cad122d5a448239b46fda8bf76ea32493" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-survey-addons.git" path="addons/Numigi_odoo-survey-addons" remote="Numigi" revision="9e897bae38ff0d6d3180296a552d994bb10c0eff" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-timesheet-addons.git" path="addons/Numigi_odoo-timesheet-addons" remote="Numigi" revision="d2bbb19dc8f917272694ff0a6231275083fb7e74" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo-web-addons.git" path="addons/Numigi_odoo-web-addons" remote="Numigi" revision="3a4aa46439a794429d5939cff561f42c4f312a99" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="odoo.git" path="odoo" remote="odoo" revision="0e0213c487041d9969444e312430c23e994ed778" upstream="ERPLibre/12.0" dest-branch="ERPLibre/12.0" clone-depth="10" groups="odoo"/>
<project name="odoo_addons.git" path="addons/Smile-SA_odoo_addons" remote="Smile-SA" revision="2be318c18ac5b0fe2129cc61d86419033ff07d5f" upstream="12.0_remote_autoinstall" dest-branch="12.0_remote_autoinstall" groups="addons"/>
<project name="openeducat_erp.git" path="addons/openeducat_openeducat_erp" remote="openeducat" revision="4a2a1d930d88a127959fd39af22f7d818e08663d" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="partner-contact.git" path="addons/OCA_partner-contact" remote="OCA" revision="a79e57685caad7d0dec9318378fdd46862e31be4" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="pos.git" path="addons/OCA_pos" remote="OCA" revision="6a922b3d87491d59128a097f286be1e3f3fc11df" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="product-attribute.git" path="addons/OCA_product-attribute" remote="OCA" revision="ea48097094462e67d7e1558b333da78c6038b89c" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="product-pack.git" path="addons/OCA_product-pack" remote="OCA" revision="b9eccbdb9ae0fdd3ed1138270c3eff3142a015c3" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="product-variant.git" path="addons/OCA_product-variant" remote="OCA" revision="fb4f4042b3ca0ee6cde6ab0625e2c914b96b174f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="project-reporting.git" path="addons/OCA_project-reporting" remote="OCA" revision="7f71f086dd732170e7605dfdf80e6cc4969a711e" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="project.git" path="addons/OCA_project" remote="OCA" revision="4390f1ffa9f00058b0d1aa7fae27fb74bbefb83b" upstream="12.0_fix_conflict_project_key" dest-branch="12.0_fix_conflict_project_key" groups="addons"/>
<project name="purchase-workflow.git" path="addons/OCA_purchase-workflow" remote="OCA" revision="d17436791bcfbe0985af137163564af3fe90bbe1" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="queue.git" path="addons/OCA_queue" remote="OCA" revision="0b71a3951b583f154f170adacf4920e6d7138329" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="reporting-engine.git" path="addons/OCA_reporting-engine" remote="OCA" revision="14fba657a0dbda1258edcf3c92886866e7cecf67" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="sale-workflow.git" path="addons/OCA_sale-workflow" remote="OCA" revision="4b200358312689d944aaaf012c5723bb2bc9cb77" upstream="12.0_modules_sale_order_line" dest-branch="12.0_modules_sale_order_line" groups="addons"/>
<project name="santelibre_addons.git" path="addons/SanteLibre_santelibre_addons" remote="SanteLibre" revision="ee94058aecee418b3652864f23b54a86ba0f92f4" upstream="master" dest-branch="master" groups="addons"/>
<project name="scrummer.git" path="addons/MathBenTech_scrummer" remote="MathBenTech" revision="38c04c8f7b7fe897d166ded74dda9d8d76f7f4c4" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="server-auth.git" path="addons/OCA_server-auth" remote="OCA" revision="f911c9f31a064cca3012431b70e60a7b89448138" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="server-brand.git" path="addons/OCA_server-brand" remote="OCA" revision="d8f27b04475d3cc74a7bebb1e086f647f5e01569" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="server-env.git" path="addons/OCA_server-env" remote="OCA" revision="19af535b3aedd5c1fdfbe911dacfc43ae31edb71" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="server-tools.git" path="addons/OCA_server-tools" remote="OCA" revision="d97aaa9fa2f01f64ebf7100668e0901fde35d42f" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="server-ux.git" path="addons/OCA_server-ux" remote="OCA" revision="655b3cc291a7e3718371a45ebe6f2e0952896adf" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="social.git" path="addons/OCA_social" remote="OCA" revision="7b0836bf7a5c40db332dd90d5ebef619234060ac" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="stock-logistics-warehouse.git" path="addons/OCA_stock-logistics-warehouse" remote="OCA" revision="a591de15150f7b16c1ef23d2fc30c814874dea27" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="timesheet.git" path="addons/OCA_timesheet" remote="OCA" revision="8625e65414801780c91e91bf93b2ed32567f8117" upstream="12.0_support_project_agile_timesheet" dest-branch="12.0_support_project_agile_timesheet" groups="addons"/>
<project name="web.git" path="addons/OCA_web" remote="OCA" revision="b65c492f4011fe4e9dac8c0a26eeef8c43cb1c39" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project name="website.git" path="addons/OCA_website" remote="OCA" revision="603a44d53a2e7a457560a0f99bdcc95780399ee5" upstream="12.0_dev" dest-branch="12.0_dev" groups="addons"/>
<project name="wms.git" path="addons/OCA_wms" remote="OCA" revision="e7a1541f8c513cf755bd82780c6c035d2fafc2ce" upstream="12.0" dest-branch="12.0" groups="addons"/>
<project dest-branch="12.0" groups="addons" name="OpenHRMS.git" path="addons/CybroOdoo_OpenHRMS" remote="CybroOdoo" revision="e7881872d147e91a59e9ee9fac9e89316e1cabb4" upstream="12.0"/>
<project dest-branch="master" groups="addons" name="Property-Management_odoo.git" path="addons/kinjal-sorathiya_Property-Management_odoo" remote="kinjal-sorathiya" revision="922f6878ac560829d2ebe951b93f858c1e7d256d" upstream="master"/>
<project dest-branch="12.0" groups="addons" name="QuotationRevision.git" path="addons/odooaktiv_QuotationRevision" remote="odooaktiv" revision="701438f9c59bd657de516d9ef4de1ba6167bf30b" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="access-addons.git" path="addons/itpp-labs_access-addons" remote="itpp-labs" revision="482ed9d81ab707020918b43b945a92e9a3849b35" upstream="12.0_dev"/>
<project dest-branch="12.0_dev" groups="addons" name="account-analytic.git" path="addons/OCA_account-analytic" remote="OCA" revision="127b15406fc619f8a01c1823bbf1aecc891ac4e7" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="account-budgeting.git" path="addons/OCA_account-budgeting" remote="OCA" revision="41723d9753c186c2f310f7960d27597700218453" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="account-closing.git" path="addons/OCA_account-closing" remote="OCA" revision="a7d2b14943027514a25666ee247d7ac18feae8d4" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="account-consolidation.git" path="addons/OCA_account-consolidation" remote="OCA" revision="aff1c46476a62ac6603bd64a0c22a020dd61c92e" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="account-financial-reporting.git" path="addons/OCA_account-financial-reporting" remote="OCA" revision="9a301da921491f7ff39d001884f4da20e2a14275" upstream="12.0_dev"/>
<project dest-branch="12.0_dev" groups="addons" name="account-financial-tools.git" path="addons/OCA_account-financial-tools" remote="OCA" revision="2a00520ba4e3f126799591d2279554556610471a" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="account-fiscal-rule.git" path="addons/OCA_account-fiscal-rule" remote="OCA" revision="220ecc1fd7a33f8718f9c629c93fcaf4c2be0e6f" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="account-invoice-reporting.git" path="addons/OCA_account-invoice-reporting" remote="OCA" revision="0eacde24ff15d63f6cfff4ea1113d36aa62e10c8" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="account-invoicing.git" path="addons/OCA_account-invoicing" remote="OCA" revision="d0841c7351ee4fe37f59187689520214b0ab0a51" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="account-payment.git" path="addons/OCA_account-payment" remote="OCA" revision="6c3c3d5ae95958b181544bb371291ef059082551" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="account-reconcile.git" path="addons/OCA_account-reconcile" remote="OCA" revision="661f3bb2f1df474aef1640f1511a4fb4a6e3151f" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="apps-store.git" path="addons/OCA_apps-store" remote="OCA" revision="9f02be326e234b1f981add21b13d6f87d1d9a52d" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="bank-payment.git" path="addons/OCA_bank-payment" remote="OCA" revision="6e3c6724866b3f191586a8e25578aafe76d3aa76" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="bank-statement-import.git" path="addons/OCA_bank-statement-import" remote="OCA" revision="b4695b27a555f758b00733f47048b612a2d397be" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="brand.git" path="addons/OCA_brand" remote="OCA" revision="790324790c909961d2f86954e24e01ce4bcdf045" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="business-requirement.git" path="addons/OCA_business-requirement" remote="OCA" revision="7be3c2b25b3b3f4ebd21e0d055c3bba63c45761a" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="commission.git" path="addons/OCA_commission" remote="OCA" revision="f47fb07531b767a5a15a4aa966c6a96e15a21b3f" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="community-data-files.git" path="addons/OCA_community-data-files" remote="OCA" revision="ff512e6dee776279de31636f890b19d50a434fb2" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="connector-ecommerce.git" path="addons/OCA_connector-ecommerce" remote="OCA" revision="41674c2f4681ea7b6713d8273b44c0c9b816116a" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="connector-interfaces.git" path="addons/OCA_connector-interfaces" remote="OCA" revision="43baddd62e856a17c8068890aa7ecdd1cc428ae9" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="connector-jira.git" path="addons/OCA_connector-jira" remote="OCA" revision="34d3137a7ddebe680c55c1668702d573c5f3387d" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="connector-telephony.git" path="addons/OCA_connector-telephony" remote="OCA" revision="b87711775dae08e43a0803772bdeb6afda408db4" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="connector.git" path="addons/OCA_connector" remote="OCA" revision="274c3f1c385fb822eacd73235ecf3522dc96fe27" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="contract.git" path="addons/OCA_contract" remote="OCA" revision="03c444e0b583b8950da11efa302991d148bf9ac0" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="credit-control.git" path="addons/OCA_credit-control" remote="OCA" revision="b37f66e87063b3b49117dbcab184ad3c28d050c7" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="crm.git" path="addons/OCA_crm" remote="OCA" revision="e0d66587f245c80a6dba3a5227481fe831b1891a" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="currency.git" path="addons/OCA_currency" remote="OCA" revision="b12e419825ec222a29c00fdb1b7740ad54397f51" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="data-protection.git" path="addons/OCA_data-protection" remote="OCA" revision="fa9fb5386989e987bd6c34f5e28c75974588e185" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="ddmrp.git" path="addons/OCA_ddmrp" remote="OCA" revision="f4f2f920c091caef4bf0b55c6e1a98ed333afa25" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="delivery-carrier.git" path="addons/OCA_delivery-carrier" remote="OCA" revision="92a8b4445400a2ee76ed4ea9c9fe83a57a2aaeab" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="deltatech.git" path="addons/dhongu_deltatech" remote="dhongu" revision="70ad7f4f9981896e04117156732ac0056764031c" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="development.git" path="addons/MathBenTech_development" remote="MathBenTech" revision="2609ef2966731594741d6a5804cccba1251002e1" upstream="12.0"/>
<project dest-branch="12.0_module_donation_website" groups="addons" name="donation.git" path="addons/OCA_donation" remote="OCA" revision="66a80b99c17baaa82df76d51bd3fd9bc3163034a" upstream="12.0_module_donation_website"/>
<project dest-branch="12.0" groups="addons" name="e-commerce.git" path="addons/OCA_e-commerce" remote="OCA" revision="004e2c69b4b0d6ff12ec863d41994b19fe12b70c" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="edi.git" path="addons/OCA_edi" remote="OCA" revision="020a96a4512b60ab74f1213526770595eb54e687" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="erplibre_addons.git" path="addons/ERPLibre_erplibre_addons" revision="cc41fef9d3eea7722b3f7245fc556c51f3e0b7c0" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="erplibre_theme_addons.git" path="addons/ERPLibre_erplibre_theme_addons" revision="8ccf9eecbf26841d728b57dbc12f2c3bdbfe48de" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="event.git" path="addons/OCA_event" remote="OCA" revision="caa5d06e1dd454800149785685c73a1c17af14d1" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="field-service.git" path="addons/OCA_field-service" remote="OCA" revision="fb3cd1ccdf7339ef6d8a55173594f9727c509693" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="fleet.git" path="addons/OCA_fleet" remote="OCA" revision="3b5a96ef9d0a7d769c78e1141a7048a5cdbe8552" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="geospatial.git" path="addons/OCA_geospatial" remote="OCA" revision="24e5832b6807f2757a9f12e26c3cff8c241b63bc" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="helpdesk.git" path="addons/OCA_helpdesk" remote="OCA" revision="3f03ee5595e6827961c7c46d245bfde2ef2d4eec" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="hr.git" path="addons/OCA_hr" remote="OCA" revision="8cd4ac8db3cdbe500e21300edabfb3f20e657960" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="interface-github.git" path="addons/OCA_interface-github" remote="OCA" revision="9a51c99b0e0adb2d3529feca5d68c76a982d9afc" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="knowledge.git" path="addons/OCA_knowledge" remote="OCA" revision="7448855b3efc403cba03a3225056fed0fbc1c952" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="l10n-canada.git" path="addons/OCA_l10n-canada" remote="OCA" revision="5680b485cdfa0b6f1c2f4e32356b5938a9752c00" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="maintenance.git" path="addons/OCA_maintenance" remote="OCA" revision="915ba2aa932dad664e4604acf723ac0fb38f3796" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="management-system.git" path="addons/OCA_management-system" remote="OCA" revision="fd422cef074d8aacc2e0cfd61893a949d4d86cd6" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="manufacture.git" path="addons/OCA_manufacture" remote="OCA" revision="560da9ba630974d819e1e505648c7b9731e461f1" upstream="12.0"/>
<project dest-branch="12.0_sale_margin_editor" groups="addons" name="margin-analysis.git" path="addons/OCA_margin-analysis" remote="OCA" revision="9abbd69de30b972edd26269c212d0380f1915da7" upstream="12.0_sale_margin_editor"/>
<project dest-branch="12.0" groups="addons" name="medical-fhir.git" path="addons/tegin_medical-fhir" remote="tegin" revision="19cba74b3b61ba684749da1f5d7cdb287bd45050" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="mis-builder.git" path="addons/OCA_mis-builder" remote="OCA" revision="178c50f03df1b684972706aa94db917e6114f6cb" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="muk_base.git" path="addons/muk-it_muk_base" remote="muk-it" revision="a97c3f5c4369596756e283f34ecebbd184d7c725" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="muk_dms.git" path="addons/muk-it_muk_dms" remote="muk-it" revision="346b2d742696343ee025083604ee6fcb2050a65b" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="muk_docs.git" path="addons/muk-it_muk_docs" remote="muk-it" revision="a8ea02b9f00ae9fe5d2ea25ac43d23532cc11d45" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="muk_misc.git" path="addons/muk-it_muk_misc" remote="muk-it" revision="37b9d6dc20fa686a323057b160015bfc2c2c8143" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="muk_quality.git" path="addons/muk-it_muk_quality" remote="muk-it" revision="1a4c6f25c5e4fe0029d406d6283555bd23a44d27" upstream="12.0"/>
<project dest-branch="12.0_fix_web_conflict_menu" groups="addons" name="muk_web.git" path="addons/muk-it_muk_web" remote="muk-it" revision="4fb8ce157ce0a144503440b0036bf05625b7c3e1" upstream="12.0_fix_web_conflict_menu"/>
<project dest-branch="12.0_remove_autoinstall" groups="addons" name="muk_website.git" path="addons/muk-it_muk_website" remote="muk-it" revision="c1e6c1755d09562f66247832bd01a0d580c43e23" upstream="12.0_remove_autoinstall"/>
<project dest-branch="12.0" groups="addons" name="multi-company.git" path="addons/OCA_multi-company" remote="OCA" revision="9d689c5ad230f8f2e6a550354a6b1577a8e5a3c9" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-base-addons.git" path="addons/Numigi_odoo-base-addons" remote="Numigi" revision="78c23a29283f35ef480186358dd6d848a38a2aff" upstream="12.0_dev"/>
<project dest-branch="12.0_sale_order_line_timesheet_attribution" groups="addons" name="odoo-business-spending-management-quebec-canada.git" path="addons/MathBenTech_odoo-business-spending-management-quebec-canada" remote="MathBenTech" revision="822d2e018554119fa63f79ac91625473ec54b9fe" upstream="12.0_sale_order_line_timesheet_attribution"/>
<project dest-branch="12.0" groups="addons" name="odoo-cloud-platform.git" path="addons/camptocamp_odoo-cloud-platform" remote="camptocamp" revision="234451065fa2804af832d713dcec9cf8842d8a49" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-entertainment-addons.git" path="addons/Numigi_odoo-entertainment-addons" remote="Numigi" revision="5abba3eabcb60c96d80240ab756736eb57ed345b" upstream="12.0_dev"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-git-addons.git" path="addons/Numigi_odoo-git-addons" remote="Numigi" revision="a394f422a5d3063dd2c339544ecca74bdbbe19ae" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="odoo-hr-addons.git" path="addons/Numigi_odoo-hr-addons" remote="Numigi" revision="2d3dd1769b47aac54585c56dcad652a4dbe5850f" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-partner-addons.git" path="addons/Numigi_odoo-partner-addons" remote="Numigi" revision="3320fbed43c324d07035f7f1d1bc77d779f8fe0e" upstream="12.0_dev"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-product-addons.git" path="addons/Numigi_odoo-product-addons" remote="Numigi" revision="e4daf4cb743dd73928571c0757083e8ee6fec6ef" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="odoo-product-configurator.git" path="addons/pledra_odoo-product-configurator" remote="pledra" revision="785923c83266097f53569769c26c8f2a859d1d6f" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-project-addons.git" path="addons/Numigi_odoo-project-addons" remote="Numigi" revision="3f844c31afd62a3f1a606f9d55038a881c10c927" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="odoo-purchase-addons.git" path="addons/Numigi_odoo-purchase-addons" remote="Numigi" revision="36d5b5b5a56ef0ddbb75bc83d5d13c38aceea3f2" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="odoo-saas-tools.git" path="addons/it-projects-llc_odoo-saas-tools" remote="it-projects-llc" revision="5f7cf7f7d347a244641feb5d38ac8acd180e4e2b" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-stock-addons.git" path="addons/Numigi_odoo-stock-addons" remote="Numigi" revision="0d4106c1800c2feff32e40206082bb4cb10547d1" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="odoo-survey-addons.git" path="addons/Numigi_odoo-survey-addons" remote="Numigi" revision="9e897bae38ff0d6d3180296a552d994bb10c0eff" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="odoo-timesheet-addons.git" path="addons/Numigi_odoo-timesheet-addons" remote="Numigi" revision="11f01fcca4714fd946949519fd3f3b56b136b813" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="odoo-web-addons.git" path="addons/Numigi_odoo-web-addons" remote="Numigi" revision="3a4aa46439a794429d5939cff561f42c4f312a99" upstream="12.0"/>
<project clone-depth="10" dest-branch="ERPLibre/12.0" groups="odoo" name="odoo.git" path="odoo" remote="odoo" revision="5dca43a46633785a27d52be3f01c2ebaf2389dd3" upstream="ERPLibre/12.0"/>
<project dest-branch="12.0_remote_autoinstall" groups="addons" name="odoo_addons.git" path="addons/Smile-SA_odoo_addons" remote="Smile-SA" revision="42cac5684e7bc60454a56eb44366c9b079dff197" upstream="12.0_remote_autoinstall"/>
<project dest-branch="12.0" groups="addons" name="odoo_dhtmlxgantt.git" path="addons/obayit_odoo_dhtmlxgantt" remote="obayit" revision="f54a35ba90be42967cdd423e830823981be75f67" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="odooapps.git" path="addons/odoomates_odooapps" remote="odoomates" revision="76ed3e44029407bf0733ca14c00d2a4b5dc0bfa8" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="openeducat_erp.git" path="addons/openeducat_openeducat_erp" remote="openeducat" revision="d9c26e6bf4bfa532162cbdd0d92a7e4d4915ffd0" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="operating-unit.git" path="addons/OCA_operating-unit" remote="OCA" revision="da9f3eb128e72bccb4355fe4dbb869d60aa663fc" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="partner-contact.git" path="addons/OCA_partner-contact" remote="OCA" revision="0f5346db7bdb4850ab1502a7af66ba46b55a4fae" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="pos-addons.git" path="addons/itpp-labs_pos-addons" remote="itpp-labs" revision="6c57f57e23e89724d121977a86e24e8d1af24a4c" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="pos.git" path="addons/OCA_pos" remote="OCA" revision="75703f87031440eea93b3bdd33ec8fc2e3b5c13a" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="product-attribute.git" path="addons/OCA_product-attribute" remote="OCA" revision="69d58f4c68c42c01908d277f65d667f6e3184cac" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="product-pack.git" path="addons/OCA_product-pack" remote="OCA" revision="b869a5d2efaa1b2bdf391e7bba52f3b44256bc98" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="product-variant.git" path="addons/OCA_product-variant" remote="OCA" revision="e586ebbb9a5a3191278ba0cca1b525649b60ece0" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="product_rating_app.git" path="addons/odooaktiv_product_rating_app" remote="odooaktiv" revision="5174b118c9a186bcef17a9296cc303111a06f427" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="project-reporting.git" path="addons/OCA_project-reporting" remote="OCA" revision="b5b0e8de37be84d2181f19f84f381ada3fd25812" upstream="12.0"/>
<project dest-branch="12.0_fix_conflict_project_key" groups="addons" name="project.git" path="addons/OCA_project" remote="OCA" revision="0b335b5b146e84eebeb898c3cee5b1ccc959ede7" upstream="12.0_fix_conflict_project_key"/>
<project dest-branch="12.0" groups="addons" name="purchase-workflow.git" path="addons/OCA_purchase-workflow" remote="OCA" revision="547072c977cf24f044615787ffcf7b56d838ec89" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="queue.git" path="addons/OCA_queue" remote="OCA" revision="d303bceac89152c6996b7f5bbeabb6a67192b93f" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="reporting-engine.git" path="addons/OCA_reporting-engine" remote="OCA" revision="733d57754c6e419bb16ee095824e787b218c1aa4" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="rma.git" path="addons/OCA_rma" remote="OCA" revision="fd48feb1dea66daae474b74a7e7656f74ba50313" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="sale-reporting.git" path="addons/OCA_sale-reporting" remote="OCA" revision="10224ef7b42ee3dec2849414e41557b0bc3c8f79" upstream="12.0"/>
<project dest-branch="12.0_modules_sale_order_line" groups="addons" name="sale-workflow.git" path="addons/OCA_sale-workflow" remote="OCA" revision="5d8d2575e6a2c8ad0e3315abd0585651f73b80fd" upstream="12.0_modules_sale_order_line"/>
<project dest-branch="12.0_dev" groups="addons" name="scrummer.git" path="addons/MathBenTech_scrummer" remote="MathBenTech" revision="38c04c8f7b7fe897d166ded74dda9d8d76f7f4c4" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="server-auth.git" path="addons/OCA_server-auth" remote="OCA" revision="2bfb2b2f64bda15fb5c7f8f4d528aa1aadc4998b" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="server-backend.git" path="addons/OCA_server-backend" remote="OCA" revision="77a1ee79912d381e06c8bd96f1034574b460881d" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="server-brand.git" path="addons/OCA_server-brand" remote="OCA" revision="786a26c58f789ed63e6380d5e550cf300a5ae1a4" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="server-env.git" path="addons/OCA_server-env" remote="OCA" revision="11d6745d4156636dd12d134a9b3f8053cb24717b" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="server-tools.git" path="addons/OCA_server-tools" remote="OCA" revision="cca5dffd0dec68e1aa4209a8747d4381a97efa89" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="server-ux.git" path="addons/OCA_server-ux" remote="OCA" revision="765439a6af66be5ee2427a2775812d44a345a235" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="social.git" path="addons/OCA_social" remote="OCA" revision="8bd98212b8d04aa3de82e9f51063b9d185ac0f1c" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="stock-logistics-warehouse.git" path="addons/OCA_stock-logistics-warehouse" remote="OCA" revision="1b99507da7815d1dd2e030a3a1d28285ea7ecf76" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="storage.git" path="addons/OCA_storage" remote="OCA" revision="77bac72af7f4aa1c6248378e9cbb5ebcdd52f994" upstream="12.0"/>
<project dest-branch="12.0_support_project_agile_timesheet" groups="addons" name="timesheet.git" path="addons/OCA_timesheet" remote="OCA" revision="a8630243c1c06c66579f5d6fff6ad71e249a0f80" upstream="12.0_support_project_agile_timesheet"/>
<project dest-branch="12.0" groups="addons" name="vertical-association.git" path="addons/OCA_vertical-association" remote="OCA" revision="467f3d5ed737fa65b4f7781013fa48e9c328cd61" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="vertical-hotel.git" path="addons/OCA_vertical-hotel" remote="OCA" revision="f958379e1492870431a92543089db214b62ab1f5" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="vertical-isp.git" path="addons/OCA_vertical-isp" remote="OCA" revision="28ad39aae5eb5cebaa46d79ce563ef760451962b" upstream="12.0"/>
<project dest-branch="12.0" groups="addons" name="vertical-travel.git" path="addons/OCA_vertical-travel" remote="OCA" revision="3572c0689eb67a757681070ac913c72cea50645f" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="web.git" path="addons/OCA_web" remote="OCA" revision="2c57ad38475f030dbd00c01d00c6a540d5ab4d7d" upstream="12.0_dev"/>
<project dest-branch="12.0_dev" groups="addons" name="website-addons.git" path="addons/itpp-labs_website-addons" remote="itpp-labs" revision="ed7d3b19435d7522afccf17edd9261ab215b4851" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="website-cms.git" path="addons/OCA_website-cms" remote="OCA" revision="e67368d15de06e795247bd54874181bfd7324a44" upstream="12.0"/>
<project dest-branch="12.0_dev" groups="addons" name="website.git" path="addons/OCA_website" remote="OCA" revision="900919e8fbe155ebf58273870f0fb596f317f6c4" upstream="12.0_dev"/>
<project dest-branch="12.0" groups="addons" name="wms.git" path="addons/OCA_wms" remote="OCA" revision="04600a6f653b7c7e8b597f452cceb4172013c73f" upstream="12.0"/>
</manifest>

View file

@ -1,6 +1,6 @@
# Thanks
## AGILE OPS
Thanks for contributing to GIT_REPO.
Thanks for contributing to GIT_REPO and docker.
- [Agile OPS](https://www.linkedin.com/in/michaelfaille/)
## MathBenTech
@ -8,9 +8,9 @@ Thanks for creating this project.
- [MathBen.Tech](https://mathben.tech)
## TechnoLibre
Thanks for making enterprise edition of ERPLibre.
Thanks for making this enterprise edition of ERPLibre.
- [TechnoLibre](https://technolibre.ca)
## Yenthe Van Ginneken
Thanks Yenthe Van Ginneken for your scripting guides and tutorial.
Thanks Yenthe Van Ginneken for your scripting guides and tutorials.
- [Yenthe666 InstallScript](https://github.com/Yenthe666/InstallScript)

View file

@ -1,7 +1,7 @@
# Development guide
Setup your environment to develop modules and debug the platform.
## Installation procedure locally
## Local installation procedure
### 1. Clone the project:
```bash
git clone https://github.com/ERPLibre/ERPLibre.git
@ -20,17 +20,10 @@ cd ERPLibre
```
## Develop in Odoo repository
You need to remove
> clone-depth="1"
You need to remove `clone-depth="10"` from `./manifest/default.dev.xml` in order to be able to commit and push.
Make a temporary commit and regenerate with `./script/install_locally_dev.sh`
from
> ./manifest/default.dev.xml
file to be able to commit and push.
Commit temporary and regenerate with
> ./script/install_locally_dev.sh
## Fork project to create a new project independent of ERPLibre (deprecated)
## Fork project to create a new project independent from ERPLibre (deprecated)
ERPLibre was created by this script. It's now deprecated.
Use this script when you need to fork directly from the original source.
Don't use this script if you want to update from ERPLibre and follow mainstream development.
@ -38,8 +31,8 @@ Don't use this script if you want to update from ERPLibre and follow mainstream
./script/fork_project.py --github_token GITHUB_KEY --organization NAME
```
# Fork all repo for you own organization
Go to your github account and generate a token to access fork option with your user. Create an organization (or you can choose your user name).
# Fork all repos for you own organization
Go to your github account and generate a token to access fork option with your user. Create an organization or use your personal account can choose your user name.
This command will fork all repos and ERPLibre to your own organization. It keeps track to ERPLibre.
```bash
@ -49,13 +42,13 @@ This command will fork all repos and ERPLibre to your own organization. It keeps
## Generate manifest from csv repo
Add repo in file [./source_repo_addons.csv](./source_repo_addons.csv)
Execute to generate manifest of Repo
Execute to generate Repo manifest
```bash
./script/fork_project_ERPLibre.py --skip_fork
```
## Move database prod to dev
When moving database prod to your dev environment, you want to remove email servers, and install user test in order to test the database.
When moving database prod to your dev environment, you want to remove email servers and install user test in order to test the database.
Run:
```bash
./run.sh --stop-after-init -i user_test,disable_mail_server --dev all -d DATABASE
@ -72,26 +65,32 @@ This will update all urls in git format:
./script/git_change_remote_https_to_git.py
```
## Diff repo with another project
## Showing repo differences between projects
Tools to display the differences between the repo and another project.
```bash
./script/git_change_remote.py --sync_to /path/to/project/erplibre --dry_sync
```
## Sync repo with another project
Tools to synchronise the repo with another project. This will show differences and try to checkout on the same commit in all repo.
Tools to synchronise the repo with another project. This will show differences and try to checkout on the same commit in all repos.
```bash
./script/git_change_remote.py --sync_to /path/to/project/erplibre
```
## Diff code between manifest
To show diff between commits in different manifest
## Compare two files manifests
To show differences between commits in different manifests
```bash
./script/git_diff_repo_manifest.py --input1 ./manifest/MANIFEST1.xml --input2 ./manifest/MANIFEST2.xml
```
## Differences between code and manifest
To show differences between actual code and manifest
```bash
./script/git_show_code_diff_repo_manifest.py --manifest ./manifest/MANIFEST1.xml
```
## Add repo
Access to a new repo, add your URL to file [source_repo_addons.csv](../source_repo_addons.csv)
To access a new repo, add your URL to file [source_repo_addons.csv](../source_repo_addons.csv)
Fork the repo to be able to push new code:
```bash
@ -103,9 +102,20 @@ To regenerate only manifest.xml.
./script/fork_project_ERPLibre.py --skip_fork
```
# Coding
## Create module scaffold (run in the venv)
Check if manifest contains "auto_install" and change the value to False.
```bash
source ./venv/bin/activate
./script/repo_remove_auto_install.py
```
# Coding
## Create module scaffold
```bash
source ./.venv/bin/activate
python odoo/odoo-bin scaffold MODULE_NAME addons/REPO_NAME/
```
# Pull request
## Show all pull requests from organization
```bash
/script/pull_request_ERPLibre.py --github_token ### --organization ERPLibre
```

View file

@ -20,13 +20,14 @@ cd ERPLibre
```
## Add repo
Access to a new repo, add your URL to file [source_repo_addons.csv](../source_repo_addons.csv)
To access a new repo, add your URL to file [source_repo_addons.csv](../source_repo_addons.csv)
Execute script:
```bash
./script/git_repo_manifest.py
git checkout -b new_branch
git checkout -b NEW_BRANCH
git commit -am "Add new repo"
./script/install_locally_dev.sh
./script/poetry_update.py
```
[Update your repo.](./GIT_REPO.md)

View file

@ -8,7 +8,7 @@ error.GitError: manifests rev-list (u'^2736dfd46e8a30cf59a9cd6e93d9e56e87021f2a'
Did you modify files in .repo?
Anyways, to reset files from your branch into .repo:
To reset files from your branch into .repo:
```bash
cd .repo/manifests
git branch -av

View file

@ -1,84 +1,84 @@
# git-repo
This is a guide to understand git-repo. Scripts in ERPLibre use git-repo automatically.
[git-repo of Google](https://code.google.com/archive/p/git-repo) is used to manage all git repository under licence [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.html).
[git-repo of Google](https://code.google.com/archive/p/git-repo) is used to manage all git repositories under licence [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.html).
## Setup repo
```bash
curl https://storage.googleapis.com/git-repo-downloads/repo > ./venv/repo
curl https://storage.googleapis.com/git-repo-downloads/repo > ./.venv/repo
```
## prod
```bash
./venv/repo init -u http://git.erplibre.ca/ERPLibre -b master
./venv/repo sync
./.venv/repo init -u http://git.erplibre.ca/ERPLibre -b master
./.venv/repo sync
```
## dev
```bash
./venv/repo init -u http://git.erplibre.ca/ERPLibre -b 12.0_repo -m ./manifest/default.dev.xml
./venv/repo sync
./.venv/repo init -u http://git.erplibre.ca/ERPLibre -b 12.0_repo -m ./manifest/default.dev.xml
./.venv/repo sync
```
## dev locally
## local dev
[Guide to setup locally git](https://railsware.com/blog/taming-the-git-daemon-to-quickly-share-git-repository/).
```bash
git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ./manifest/default.dev.xml
./venv/repo sync -m ./manifest/default.dev.xml
./.venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ./manifest/default.dev.xml
./.venv/repo sync -m ./manifest/default.dev.xml
```
# Create Manifest
A [Manifest](https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md), is a XML file managed by git-repo to generate repo.
## Make a new version of prod
Freezes all repo, from dev to prod.
It freezes all repo, from dev to prod.
This will add revision git hash in the Manifest.
```bash
./venv/repo manifest -r -o ./default.xml
./.venv/repo manifest -r -o ./default.xml
```
Do your commit.
Commit.
```bash
git commit -am "[#ticket] subject: short sentence"
```
### Mix prod and dev to do a stage
When dev contain specific revision with default revision, you want to replace default revision by prod revision and keep specific version, do:
### Mix prod and dev to create a stage version
When dev contains specific revision with default revision, you need to replace default revision with prod revision and keep specific version:
```bash
./script/git_merge_repo_manifest.py --input1 ./manifest/default.dev.xml --input2 ./default.xml --output ./manifest/default.staged.xml
git commit -am "Updated manifest/default.staged.xml"
git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ./manifest/default.staged.xml
./venv/repo sync -m ./manifest/default.staged.xml
./.venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ./manifest/default.staged.xml
./.venv/repo sync -m ./manifest/default.staged.xml
./venv/repo manifest -r -o ./default.xml
./.venv/repo manifest -r -o ./default.xml
```
## Create a dev version
```bash
./venv/repo manifest -o ./manifest/default.dev.xml
./.venv/repo manifest -o ./manifest/default.dev.xml
```
Do your commit.
Commit.
```bash
git commit -am "[#ticket] subject: short sentence"
```
## Useful command
### Search all repo with specific branch name
## Useful commands
### Search all repo with a specific branch name
```bash
./venv/repo forall -pc "git branch -a|grep BRANCH"
./.venv/repo forall -pc "git branch -a|grep BRANCH"
```
### Search missing branch in all repo
### Search missing branch in all repos
```bash
./venv/repo forall -pc 'git branch -a|(grep /BRANCH$||echo "no match")|grep "no match"'
./.venv/repo forall -pc 'git branch -a|(grep /BRANCH$||echo "no match")|grep "no match"'
```
### Search change file in all repo
### Search changed file in all repos
```bash
./venv/repo forall -pc "git status -s"
./.venv/repo forall -pc "git status -s"
```
### Clean all

View file

@ -1,3 +1,3 @@
# HOW TO
## Update changelog
Please, read documentation [keepachangelog.com](https://keepachangelog.com)
Please read the following documentation [keepachangelog.com](https://keepachangelog.com)

View file

@ -1,10 +1,10 @@
# ERPLibre
## Migration procedure production
## Migration procedure in production
TODO
## Migration procedure dev
## Migration procedure in dev
Example:

13
doc/POETRY.md Normal file
View file

@ -0,0 +1,13 @@
# Poetry
## Add automatically dependencies
Add your dependencies in file [requirements.txt](../requirements.txt) and run script
```bash
./script/poetry_update.py
```
This will search all `requirements.txt` files and update `pyproject.toml` and it will update poetry
## Add manually dependencies
The automatic script will erase this dependency, but you can add it for your local test.
```bash
poetry add PYTHON_MODULE
```

View file

@ -1,6 +1,6 @@
# ERPLibre production guide
## Installation procedure production
## Production installation procedure
### 1. Clone the project:
```bash
@ -12,15 +12,24 @@ cd ERPLibre
Modify the file env_var.sh for production installation.
### 3. Execute the script:
Support Ubuntu 18.04 server
#### Ubuntu 18.04 server
```bash
./script/install_dev.sh
./script/install_production.sh
```
A service is running by systemd, you can access with the DNS name, found it in env_var.sh
A service is running by systemd. You can access it with the DNS name found in env_var.sh
#### Ubuntu 20.04 server
Apply fix libpng12-0: https://www.linuxuprising.com/2018/05/fix-libpng12-0-missing-in-ubuntu-1804.html
```bash
./script/install_dev.sh
./script/install_production.sh
```
A service is running by systemd, you can access with the DNS name found in env_var.sh
### 4. SSL:
Generate a ssl certificat
Generate a ssl certificate
```bash
sudo certbot --nginx
```
@ -31,13 +40,13 @@ sudo systemctl -feu [EL_USER]
```
## Run by address ip
Comment following line in /[EL_USER]/erplibre/config.conf
Comment the following line in `/[EL_USER]/erplibre/config.conf`
```
#xmlrpc_interface = 127.0.0.1
#netrpc_interface = 127.0.0.1
#proxy_mode = True
```
Add your address ip in nginx config at server_name in /etc/nginx/sites-available/[EL_WEBSITE_NAME]
Add your address ip server_name in nginx config `/etc/nginx/sites-available/[EL_WEBSITE_NAME]`
Restart daemon:
```bash
@ -51,15 +60,28 @@ cd /[EL_USER]/erplibre
./run.sh -d [DATABASE] --no-database-list
```
## Move database prod to dev
When moving database prod to your dev environment, you want to remove email servers, and install user test to test the database.
## Move prod database to dev
When moving prod database to your dev environment, you want to remove email servers and install user test to test the database.
Run:
```bash
./run.sh --stop-after-init -i user_test,disable_mail_server --dev all -d DATABASE
```
## Update production
Simply update all feature.
Update all features.
```bash
./run.sh --limit-time-real 99999 --stop-after-init -u all -d DATABASE
```
# Postgresql
To show config file:
> psql -U postgres -c 'SHOW config_file'
Edit this file to accept interface from all networks:
> /var/lib/postgres/data/postgresql.conf
# Delete an instance in production
Caution, this delete user's home, it's irrevocable.
```bash
./script/delete_production.sh
```

View file

@ -1,35 +1,38 @@
# Release
A guide on how to do a release.
A guide on how to generate a release.
## Generate new prod
```bash
./venv/repo manifest -r -o ./default.xml
./.venv/repo manifest -r -o ./default.xml
```
Do your commit.
Commit.
```bash
git commit -am "[#ticket] subject: short sentence"
```
## Merge release
When ready to make a release, create a branch release/#.#.# and create a pull request to master.
Update file CHANGELOG.md and create a section with new version.
Merge it when maintener accept it.
Update ERPLIBRE_VERSION variable in [env_var.sh](../env_var.sh)
Add a tag on the commit on branch master with your release. When adding tag, be sure to update default.xml
## Merge release
When you are ready to generate a release, create a branch release/#.#.# and create a pull request to master.
Update file [CHANGELOG.md](../CHANGELOG.md) and create a section with new version.
Merge it when the maintainer accepts it.
Add a tag on the commit in branch master with your release. When adding tag, be sure to update default.xml
```bash
git tag v#.#.#
# Push your tags
git push --tags
# Add tags for all repo
./venv/repo forall -pc "git tag ERPLibre/v#.#.#"
./venv/repo forall -pc "git push ERPLibre --tags"
./.venv/repo forall -pc "git tag ERPLibre/v#.#.#"
./.venv/repo forall -pc "git push ERPLibre --tags"
# Get all difference between a tag and HEAD, to update the CHANGELOG.md
./venv/repo forall -pc "git diff ERPLibre/v#.#.#..HEAD"
./.venv/repo forall -pc "git diff ERPLibre/v#.#.#..HEAD"
```
# TIPS
## Compare diff repo with another ERPLibre project
To generate a list of differences between repo git commit, do
## Compare repo differences with another ERPLibre project
To generate a list of differences between repo git commit
```bash
./script/git_change_remote.py --sync_to /path/to/directory
```

View file

@ -24,7 +24,7 @@ Execute your own python script:
```
### Update all
Great idea to run it when updating Odoo, it updates database of each modules.
Great idea to run it when updating Odoo, it updates each module database.
```bash
./run.sh -d [DATABASE] -u all --log-level debug
```
@ -39,11 +39,11 @@ First execution, install you requirements, choose a new database.
```bash
./run.sh -d [DATABASE] -i [module to test] --test-enable --stop-after-init --log-level=test
```
Execute your test on specific module.
Execute your test on a specific module.
```bash
./run.sh -d [DATABASE] -u [module to test] --test-enable --stop-after-init --log-level=test
```
Execute your test on specific module with tags.
Execute your test on a specific module with tags.
```bash
./run.sh -d [DATABASE] -u [module to test] --test-enable --stop-after-init --log-level=test --test-tags [module_name][tags]
```

24
doc/UPDATE.md Normal file
View file

@ -0,0 +1,24 @@
# Update ERPLibre
## Update all repos from the origin source
The update is possible on branch 12.0, you need to verify this branch existence.
1. Make sure all git repos are conform, remove all argument depth from manifest and regenerate.
You can clean all and regenerate.
```bash
./script/clean_repo_manifest.sh
./script/install_locally_dev.sh
```
2. Update all remote with ssh/git
```bash
./script/git_change_remote_https_to_git.py
```
3. Run update script
```bash
./script/git_update_repo.py
```
4. Do a forced push on all needed repo and manage rebase conflicts.
5. Test a clone with dev, check file [DEVELOPMENT.md](./DEVELOPMENT.md)

50
docker-compose-dev.yml Normal file
View file

@ -0,0 +1,50 @@
version: "3.3"
services:
ERPLibre:
image: technolibre/erplibre-dev:12.0
# image: technolibre/erplibre-prod:pkg-12.0
# image: technolibre/erplibre-prod:deb-12.0
ports:
- 8069:8069
environment:
HOST: db
PASSWORD: mysecretpassword
USER: odoo
POSTGRES_DB: odoo
CURRENT_UID: ${CURRENT_UID}
depends_on:
- db
networks:
- front
command: odoo -c /ERPLibre/odoo/odoo.conf --without-demo=ALL -i base -d odoo
user: ${CURRENT_UID:?"Please run as follows 'CURRENT_UID=$(id -u):$(id -g) docker-compose up'"}
# user:
volumes:
- .:/ERPLibre
# See the volume section at the end of the file
- erplibre_data_dir:/var/lib/odoo
db:
image: postgres:12.3
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: odoo
POSTGRES_DB: odoo
networks:
- front
networks:
front:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.237.0/24
# We configure volume without specific destination to let docket manage it. To configure it through docker use (read related documentation before continuing) :
# - docker volume --help
# - docker-compose down --help
volumes:
erplibre_data_dir:

38
docker-compose.yml Normal file
View file

@ -0,0 +1,38 @@
version: "3.3"
services:
ERPLibre:
image: technolibre/erplibre:1.1.0
ports:
- 8069:8069
- 8071:8071
- 8072:8072
environment:
HOST: db
PASSWORD: mysecretpassword
USER: odoo
POSTGRES_DB: postgres
depends_on:
- db
command: odoo
volumes:
# See the volume section at the end of the file
- erplibre_data_dir:/home/odoo/.local/share/Odoo/
- erplibre_conf:/etc/odoo
db:
image: postgres:12.3
environment:
POSTGRES_PASSWORD: mysecretpassword
POSTGRES_USER: odoo
POSTGRES_DB: postgres
PGDATA: /var/lib/postgresql/data/pgdata
volumes:
- erplibre-db-data:/var/lib/postgresql/data/pgdata
# We configure volume without specific destination to let docket manage it. To configure it through docker use (read related documentation before continuing) :
# - docker volume --help
# - docker-compose down --help
volumes:
erplibre_data_dir:
erplibre_conf:
erplibre-db-data:

92
docker/Dockerfile Normal file
View file

@ -0,0 +1,92 @@
FROM debian:buster-slim
MAINTAINER Odoo S.A. <info@odoo.com>
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG C.UTF-8
# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
python3-num2words \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
xz-utils \
git \
iproute2 \
inetutils-ping \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.stretch_amd64.deb \
&& echo '7e35a63f9db14f93ec7feeb0fce76b30c08f2057 wkhtmltox.deb' | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb
# install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client \
&& rm -f /etc/apt/sources.list.d/pgdg.list \
&& rm -rf /var/lib/apt/lists/*
# Install Odoo
ENV ODOO_VERSION 12.0
ARG ODOO_RELEASE=20200417
ARG ODOO_SHA=ca4a7485b0b75850ffe1458a8f3266839400a501
RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
&& echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
&& apt-get update \
&& apt-get -y install --no-install-recommends ./odoo.deb \
&& rm -rf /var/lib/apt/lists/* odoo.deb
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
COPY ./odoo.conf /etc/odoo/
# Mount /var/lib/odoo to allow restoring filestore and /mnt/extra-addons for users addons
RUN chown odoo /etc/odoo/odoo.conf \
&& mkdir -p /mnt/extra-addons \
&& chown -R odoo /mnt/extra-addons
# VOLUME ["/var/lib/odoo", "/mnt/extra-addons"]
# Expose Odoo services
EXPOSE 8069 8071 8072
# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf
COPY wait-for-psql.py /usr/local/bin/wait-for-psql.py
RUN chmod +X /usr/local/bin/wait-for-psql.py
# Set default user when running the container
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

147
docker/Dockerfile.base Normal file
View file

@ -0,0 +1,147 @@
FROM debian:buster-slim
MAINTAINER TechnoLibre <docker@technolibre.ca>
SHELL ["/bin/bash", "-xo", "pipefail", "-c"]
# Generate locale C.UTF-8 for postgres and general locale data
ENV LANG C.UTF-8
ENV LANG="C.UTF-8" \
LC_ALL="C.UTF-8" \
PATH="/opt/pyenv/shims:/opt/pyenv/bin:$PATH" \
PYENV_ROOT="/opt/pyenv" \
PYENV_SHELL="bash"
ENV ODOO_PREFIX /ERPLibre
ENV ODOO_EXEC_BIN $ODOO_PREFIX/odoo/odoo-bin
# Install some deps, lessc and less-plugin-clean-css, and wkhtmltopdf
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
dirmngr \
fonts-noto-cjk \
gnupg \
libssl-dev \
node-less \
npm \
python3-num2words \
python3-pip \
python3-phonenumbers \
python3-pyldap \
python3-qrcode \
python3-renderpm \
python3-setuptools \
python3-slugify \
python3-vobject \
python3-watchdog \
python3-xlrd \
python3-xlwt \
python3-babel \
python3-psycopg2 \
xz-utils \
git \
wget \
libxslt-dev \
libzip-dev \
libldap2-dev \
libsasl2-dev \
node-less \
gdebi-core \
libffi-dev \
iproute2 \
libmariadbd-dev \
inetutils-ping \
build-essential \
libsqlite3-dev \
sqlite3 \
bzip2 \
libbz2-dev \
zlib1g-dev \
libssl-dev \
openssl \
libgdbm-dev \
libgdbm-compat-dev \
liblzma-dev \
libreadline-dev \
libncursesw5-dev \
libffi-dev \
uuid-dev \
&& curl -o wkhtmltox.deb -sSL https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox_0.12.5-1.stretch_amd64.deb \
&& echo '7e35a63f9db14f93ec7feeb0fce76b30c08f2057 wkhtmltox.deb' | sha1sum -c - \
&& apt-get install -y --no-install-recommends ./wkhtmltox.deb \
&& rm -rf /var/lib/apt/lists/* wkhtmltox.deb
# Install latest postgresql-client
RUN echo 'deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main' > /etc/apt/sources.list.d/pgdg.list \
&& GNUPGHOME="$(mktemp -d)" \
&& export GNUPGHOME \
&& repokey='B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8' \
&& gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "${repokey}" \
&& gpg --batch --armor --export "${repokey}" > /etc/apt/trusted.gpg.d/pgdg.gpg.asc \
&& gpgconf --kill all \
&& rm -rf "$GNUPGHOME" \
&& apt-get update \
&& apt-get install --no-install-recommends -y postgresql-client-12 libpq-dev \
&& rm -rf /var/lib/apt/lists/*
# Install python with pyenv
# Reference https://github.com/bopen/docker-ubuntu-pyenv
COPY pyenv-version.txt python-versions.txt /
RUN git clone -b `cat /pyenv-version.txt` --single-branch --depth 1 https://github.com/pyenv/pyenv.git $PYENV_ROOT \
&& for version in `cat /python-versions.txt`; do pyenv install $version; done \
&& pyenv global `cat /python-versions.txt` \
&& find $PYENV_ROOT/versions -type d '(' -name '__pycache__' -o -name 'test' -o -name 'tests' ')' -exec rm -rf '{}' + \
&& find $PYENV_ROOT/versions -type f '(' -name '*.pyo' -o -name '*.exe' ')' -exec rm -f '{}' + \
&& rm -rf /tmp/* \
&& python --version \
&& python3 --version
# Install git-repo
RUN cd ; mkdir -p .bin/ && \
git config --global color.ui false && \
git config --global user.email "foo@bar.io" && \
git config --global user.name "Foo Bar" && \
curl https://storage.googleapis.com/git-repo-downloads/repo > /usr/bin/repo && \
chmod +x /usr/bin/repo && sed -i '1 s/python$/python3/' /usr/bin/repo
RUN groupadd --gid 101 --force odoo && \
useradd --non-unique --create-home --uid 101 --gid 101 odoo
# TODO delete poetry installation
# Install Poetry
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
#curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
# Set the default config file
ENV ODOO_RC /etc/odoo/odoo.conf
COPY ./odoo.conf $ODOO_RC
RUN chown odoo $ODOO_RC
RUN mkdir $ODOO_PREFIX && \
chown odoo $ODOO_PREFIX && \
chmod 1777 $ODOO_PREFIX
# Mount /var/lib/odoo to allow restoring filestore
RUN chown odoo $ODOO_RC
# Expose Odoo services
EXPOSE 8069 8071 8072
#RUN mkdir -p /var/lib/odoo && \
# chown odoo /var/lib/odoo && \
# chmod 1777 /var/lib/odoo
# VOLUME /var/lib/odoo
# Set default user when running the container
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

37
docker/Dockerfile.dev Normal file
View file

@ -0,0 +1,37 @@
FROM technolibre/erplibre-base:12.0
USER root
RUN apt update && \
apt install -y -y --no-install-recommends \
build-essential \
wget \
python3-dev \
python3-venv \
python3-wheel \
libxslt-dev \
libzip-dev \
libldap2-dev \
libsasl2-dev \
python3-setuptools \
libpng16-16 \
gdebi \
&& rm -rf /var/lib/apt/lists/* \
&& npm install -g rtlcss
# RUN pip3 install -r https://raw.githubusercontent.com/odoo/odoo/12.0/requirements.txt --ignore-installed psycopg2 && pip3a cache purge
ENV ADDONS_BASE_DIR /ERPLibre
ENV ENV=dev
# Copy entrypoint script and Odoo configuration file
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
COPY repo_manifest_gen_org_prefix_path.py /usr/bin/
RUN chmod +x /usr/bin/repo_manifest_gen_org_prefix_path.py
USER odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

View file

@ -0,0 +1,50 @@
FROM technolibre/erplibre-base:1.1.0
ENV REPO_MANIFEST_URL http://git.erplibre.ca/ERPLibre
ARG WORKING_BRANCH
ENV BRANCH_ERPLIBRE $WORKING_BRANCH
RUN cat /etc/os-release
USER root
RUN mkdir ~/.ssh/ && \
echo "StrictHostKeyChecking no" >> ~/.ssh/config && \
apt update && \
apt install ssh-client git -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
RUN cd ; mkdir -p .bin/ && \
git config --global color.ui false && \
git config --global user.email "foo@bar.io" && \
git config --global user.name "Foo Bar" && \
git clone $REPO_MANIFEST_URL -b $BRANCH_ERPLIBRE $ODOO_PREFIX
RUN cd $ODOO_PREFIX && \
python -m venv .venv
RUN cd $ODOO_PREFIX && \
curl https://storage.googleapis.com/git-repo-downloads/repo > ./.venv/repo && \
chmod +x ./.venv/repo
RUN cd $ODOO_PREFIX && \
./script/update_manifest_dev.sh
RUN cd $ODOO_PREFIX && \
source /root/.poetry/env && \
poetry install
RUN cd $ODOO_PREFIX && \
head /etc/odoo/odoo.conf && \
./docker/repo_manifest_gen_org_prefix_path.py $ODOO_PREFIX/addons /etc/odoo/odoo.conf /etc/odoo/odoo.conf && \
head /etc/odoo/odoo.conf
#RUN mkdir '/home/odoo/.local'
#RUN chown -R odoo '/home/odoo/.local'
USER odoo
RUN mkdir -p '/home/odoo/.local/share/Odoo/'
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

View file

@ -0,0 +1,41 @@
FROM technolibre/erplibre-base:12.0
# TODO
# ENV REPO_MANIFEST_URL https://github.com/agileops/ERPLibre.git
# RUN cat /etc/os-release
# USER root
# # Install Odoo
# ENV ODOO_VERSION 12.0
# ARG ODOO_RELEASE=20200417
# ARG ODOO_SHA=ca4a7485b0b75850ffe1458a8f3266839400a501
# RUN curl -o odoo.deb -sSL http://nightly.odoo.com/${ODOO_VERSION}/nightly/deb/odoo_${ODOO_VERSION}.${ODOO_RELEASE}_all.deb \
# && echo "${ODOO_SHA} odoo.deb" | sha1sum -c - \
# && apt-get update \
# && apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confnew install --no-install-recommends ./odoo.deb \
# && rm -rf /var/lib/apt/lists/* odoo.deb
# RUN mkdir ~/.ssh/ && echo "StrictHostKeyChecking no" >> ~/.ssh/config && apt update && apt install ssh-client git -y --no-install-recommends && \
# rm -rf /var/lib/apt/lists/*
# RUN cd ; mkdir -p .bin/ && \
# git config --global color.ui false && \
# git config --global user.email "foo@bar.io" && \
# git config --global user.name "Foo Bar" && \
# mkdir -p $ODOO_PREFIX && cd $ODOO_PREFIX && \
# repo init -u $REPO_MANIFEST_URL -b 12.0_repo && \
# repo sync -j 4 -c
# ADD repo_manifest_gen_org_prefix_path.py /root/.bin/
# RUN chmod +x ~/.bin/repo_manifest_gen_org_prefix_path.py
# RUN head /etc/odoo/odoo.conf && /root/.bin/repo_manifest_gen_org_prefix_path.py $ODOO_PREFIX/addons /etc/odoo/odoo.conf /etc/odoo/odoo.conf && head /etc/odoo/odoo.conf
# user odoo
# ENTRYPOINT ["/entrypoint.sh"]
# CMD ["odoo"]

114
docker/README.md Normal file
View file

@ -0,0 +1,114 @@
# ERPLibre - Docker
Those images are prepared to permit better portability and reproducibility of ERPLibre release.
Due the the growing code of ERPLibre, it could also simplify development.
NOTE: Those Dockerfiles themselves are in heavy development for now. Incompatibilities between releases are normal until the interface is stabilized.
## Pre-requirements
- Basic knowledge with Docker, Linux and bash
- Latest Docker version
## Files representations
- Dockerfile.base: This Dockerfile represents the base Docker image layer reused by other child layers.
- Dockerfile.dev: This Dockerfile is specialized in development.
- Dockerfile.prod{pkg,src}: Dockerfile.prod.\* is a Docker image specialized for production systems. Dockerfile.prod.pkg reuses official Debian files from Odoo.com. Dockerfile.prod.src fetches the Odoo source code as the ERPLibre runtime.
## Getting started
Be sure to start daemon docker
```bash
systemctl start docker
```
### Building the docker images
```bash
cd docker
docker build -f Dockerfile.base -t technolibre/erplibre-base:12.0 .
docker build -f Dockerfile.prod.pkg -t technolibre/erplibre:12.0-pkg .
```
### Running ERPLibre using Docker-Compose
Go at the root of this git project.
```bash
cd ERPLibre
docker-compose -f docker-compose.yml up -d
```
### Diagnostic Docker-Compose
Show docker-compose information
```bash
docker-compose ps
docker-compose logs IMAGE_NAME
```
Show docker information
```bash
docker ps -a
docker volume ls
docker inspect DOCKER_NAME
```
Connect to a running docker
```bash
docker exec -ti DOCKER_NAME bash
docker exec -u root -ti DOCKER_NAME bash
```
Commands for debugging
```bash
docker run -p 8069:8069 --entrypoint bash -ti DOCKER_NAME
docker exec -ti DOCKER_NAME bash
docker exec -u root -ti DOCKER_NAME bash
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -e POSTGRES_USER=odoo -e POSTGRES_DB=postgres postgre
export
db_host = "host.docker.internal"
docker stats erplibre_ERPLibre_1
```
### Cleaning
Delete docker image
```bash
docker image prune
```
Delete volumes
```bash
docker-compose rm -v
```
Delete containers
```bash
docker rm $(docker ps -a | grep -v IMAGE | awk '{print $1}')
```
Delete volume
```bash
docker volume prune
```
# Change docker directory
You can change the docker directory by editing file `/etc/docker/daemon.json`
```json
{
"data-root": "/home/docker"
}
```
And restart docker service. You can delete or move all older locations of docker.
# Update docker
When building your docker with script
> ./script/docker_build.sh
You need to push your docker image and update your tag, like 1.0.1:
> docker push technolibre/erplibre:1.0.1

87
docker/entrypoint.sh Executable file
View file

@ -0,0 +1,87 @@
#!/bin/bash
set -e
if [[ "$ENV" == "dev" ]] && [ ! -z ${CURRENT_UID} ]
then
export HOME=$ODOO_PREFIX
cd $HOME
# As it's only possible to fetch git repos manifest from an git url, we create one using git-daemon.
git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
GIT_PID=$!
echo "my repo" $(git rev-parse --abbrev-ref HEAD)
repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m default.dev.xml
repo sync
# After sync, terminate the git checkout. We don't need graceful kill as we don't do commit on the git repo during the operation.
kill -9 $GIT_PID
ls $HOME/odoo/odoo-bin
# $? give the posix return value of the last command. 0 == success
# then IS_ODOO_FILE_EXIST : 0 == YES
IS_ODOO_FILE_EXIST=$?
if [ "$IS_ODOO_FILE_EXIST" -ne "0" ]; then
echo "The file $HOME/odoo/odoo-bin doesnt exist. Verify entrypoint.sh";
exit 1;
fi
# Add the odoo bins code on $PATH
echo PATH=$HOME/odoo/:$PATH
# Configure an alias to use "odoo-bin" as "odoo".
alias odoo=odoo-bin
repo_manifest_gen_org_prefix_path.py $ODOO_PREFIX/addons $ODOO_RC $ODOO_PREFIX/odoo/odoo.conf && head $ODOO_PREFIX/odoo/odoo.conf
export ODOO_RC=$ODOO_PREFIX/odoo/odoo.conf
elif [[ "$ENV" == "dev" ]] && [ -z ${CURRENT_UID} ]
then
echo 'Please run as follows : CURRENT_UID=$(id -u):$(id -g) docker-compose up'
exit 1
fi
# set the postgres database host, port, user and password according to the environment
# and pass them as arguments to the odoo process if not present in the config file
: ${HOST:=${DB_PORT_5432_TCP_ADDR:='db'}}
: ${PORT:=${DB_PORT_5432_TCP_PORT:=5432}}
: ${USER:=${DB_ENV_POSTGRES_USER:=${POSTGRES_USER:='odoo'}}}
: ${PASSWORD:=${DB_ENV_POSTGRES_PASSWORD:=${POSTGRES_PASSWORD:='odoo'}}}
DB_ARGS=()
function check_config() {
param="$1"
value="$2"
if grep -q -E "^\s*\b${param}\b\s*=" "$ODOO_RC" ; then
value=$(grep -E "^\s*\b${param}\b\s*=" "$ODOO_RC" |cut -d " " -f3|sed 's/["\n\r]//g')
fi;
DB_ARGS+=("--${param}")
DB_ARGS+=("${value}")
}
check_config "db_host" "$HOST"
check_config "db_port" "$PORT"
check_config "db_user" "$USER"
check_config "db_password" "$PASSWORD"
case "$1" in
-- | odoo)
shift
if [[ "$1" == "scaffold" ]] ; then
exec odoo "$@" || exec odoo-bin "$@"
else
cd $ODOO_PREFIX
./docker/wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec ./.venv/bin/python $ODOO_EXEC_BIN "$@" "${DB_ARGS[@]}" -c /etc/odoo/odoo.conf
fi
;;
-*)
cd $ODOO_PREFIX
./docker/wait-for-psql.py ${DB_ARGS[@]} --timeout=30
exec ./.venv/bin/python $ODOO_EXEC_BIN "$@" "${DB_ARGS[@]}" -c /etc/odoo/odoo.conf
;;
*)
exec "$@"
esac
exit 1

32
docker/main/Dockerfile Normal file
View file

@ -0,0 +1,32 @@
FROM technolibre/erplibre-base:12.0
ENV REPO_MANIFEST_URL https://github.com/agileops/ERPLibre.git
RUN cat /etc/os-release
ENV ADDONS_BASE_DIR /odoo
USER root
RUN mkdir ~/.ssh/ && echo "StrictHostKeyChecking no" >> ~/.ssh/config && apt update && apt install ssh-client git -y --no-install-recommends && \
rm -rf /var/lib/apt/lists/*
RUN cd ; mkdir -p .bin/ && \
git config --global color.ui false && \
git config --global user.email "foo@bar.io" && \
git config --global user.name "Foo Bar" && \
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo && \
chmod +x ~/.bin/repo && sed -i '1 s/python$/python3/' ~/.bin/repo && head ~/.bin/repo && \
export PATH="${HOME}/.bin:${PATH}" && \
mkdir -p $ADDONS_BASE_DIR && cd $ADDONS_BASE_DIR && \
repo init -u $REPO_MANIFEST_URL -b 12.0_repo && \
repo sync -j 4 -c
ADD repo_manifest_gen_org_prefix_path.py /root/.bin/ RUN chmod +x
~/.bin/repo_manifest_gen_org_prefix_path.py
RUN head /etc/odoo/odoo.conf && /root/.bin/repo_manifest_gen_org_prefix_path.py $ADDONS_BASE_DIR/addons /etc/odoo/odoo.conf /etc/odoo/odoo.conf && head /etc/odoo/odoo.conf
user odoo
ENTRYPOINT ["/entrypoint.sh"]
CMD ["odoo"]

523
docker/odoo.conf Normal file
View file

@ -0,0 +1,523 @@
[options]
#
# WARNING:
# If you use the Odoo Database utility to change the master password be aware
# that the formatting of this file WILL be LOST! A copy of this file named
# /etc/odoo/openerp-server.conf.template has been made in case this happens
# Note that the copy does not have any first boot changes
#-----------------------------------------------------------------------------
# Odoo Server Config File - TurnKey Linux
# ( /etc/odoo/openerp-server.conf )
#
# Great pain has been taken to organize this file, and include comments for
# each. As with all open source software this file is a work in progress. If
# you see something that is wrong or needs to be updated, submit and issue
# on TurnKey's GIT Hub issue tracker! Or better yet, fork the repo with this
# file and submit a pull request!
#
# Information about these settings where taken from openerp-server --help
# and from https://www.odoo.com/documentation/8.0/reference/cmdline.html
#
#-----------------------------------------------------------------------------
# Index:
# Database Settings
# Logs Settings
# Service Settings
# Email Settings
# Server Options
# Tuning Adjustments
# Testing and Demo Settings
#-----------------------------------------------------------------------------
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
# Database Settings
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
#-----------------------------------------------------------------------------
# Specify the database host (default localhost).
#-----------------------------------------------------------------------------
#db_host = localhost
#-----------------------------------------------------------------------------
# Specify the database port (default None).
#-----------------------------------------------------------------------------
#db_port = 5432
#-----------------------------------------------------------------------------
# Specify the database user name (default None).
#-----------------------------------------------------------------------------
#db_user = odoo
#-----------------------------------------------------------------------------
# Specify the database password for db_user (default None)
#-----------------------------------------------------------------------------
#db_password = 00aa9df39b0c99ac3d1d8412d2917175
#-----------------------------------------------------------------------------
# Specify the database name.
#-----------------------------------------------------------------------------
#db_name = False
#-----------------------------------------------------------------------------
# DataError: new encoding (UTF8) is incompatible with the encoding of the
# template database (SQL_ASCII) HINT: Use the same encoding as in the template
# database, or use template0 as template.
#-----------------------------------------------------------------------------
# db_template = template0
#-----------------------------------------------------------------------------
# Master Database password
# This is set at first boot, and can be set from within Odoo
#-----------------------------------------------------------------------------
#admin_passwd = 12357
#-----------------------------------------------------------------------------
# specify the the maximum number of physical connections to posgresql
#-----------------------------------------------------------------------------
#db_maxconn = 64
#-----------------------------------------------------------------------------
# Filter listed database REGEXP
#-----------------------------------------------------------------------------
#dbfilter = .*
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
# Logs Settings
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
#
#
# I found information from Odoo on logging was not very clear. So I complied
# this helpful list and info about Odoo logging.
#
# Information was gleaned from the following sites:
# (The URLs are broken up to fit them in the file)
# - http://www.mindissoftware.com
# /2014/09/07/Odoo-logging-configuration-usage-implementation/
# - https://www.odoo.com/
# /forum/help-1/question
# /what-is-the-full-list-of-command-line-options-for-odoo-59139
# - https://www.odoo.com/documentation/8.0/reference/cmdline.html
#
# Odoo uses the Python standard logging library. However, it uses a special
# configuration syntax to configure logging levels for its modules.
#
# It's helpful to know what each level type means, so below is quick list:
#
# Level meanings:
# debug: Debug message for debugging only.
# info: Information message to report important modular event.
# warning: Warning message to report minor issues.
# error: Error message to report failed operations.
# critical: A critical message -- so critical that the module cannot work
#
#
# log_level:
# any value in the list below. Odoo changed the log_level meaning
# here because these level values are mapped to a set of predefined
# 'module:log_level' pairs. These pairs are listed next to the log-level.
# You could get the same result by using the log_handler option
#
#
# LOG LEVEL / log_handler: module:log_level
# ----------------------------------------------------------------------------
# info / [':INFO']
# critical / ['openerp:CRITICAL', 'werkzeug:CRITICAL']
# error / ['openerp:ERROR', 'werkzeug:ERROR']
# warn / ['openerp:WARNING', 'werkzeug:WARNING']
# debug / ['openerp:DEBUG']
# debug_sql / ['openerp.sql_db:DEBUG']
# debug_rpc / ['openerp:DEBUG','openerp.http.rpc.request:DEBUG']
# debug_rpc_answer / ['openerp:DEBUG','openerp.http.rpc.request:DEBUG',
# 'openerp.http.rpc.response:DEBUG']
#
# End of Logging Info
# ----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# The log filename. If not set, use stdout.
#-----------------------------------------------------------------------------
; logfile = /var/log/odoo/openerp-server.log
#-----------------------------------------------------------------------------
# True/False. If True, create a daily log file and keep 30 files.
#-----------------------------------------------------------------------------
; logrotate = True
#-----------------------------------------------------------------------------
# Ture/False. If True, also write log to 'ir_logging' table in database
#-----------------------------------------------------------------------------
; log-db = True
#-----------------------------------------------------------------------------
# True/False logs to the system's event logger: syslog
#-----------------------------------------------------------------------------
; syslog = False
#-----------------------------------------------------------------------------
# Log level - One of the following:
# info, debug_rpc, warn, test, critical, debug_sql, error, debug,
# debug_rpc_answer
#-----------------------------------------------------------------------------
; log-level = warn
#-----------------------------------------------------------------------------
# log_handler - can be a list of 'module:log_level' pairs.
# The default value is ':INFO' -- it means the default logging level
# is 'INFO' for all modules.
#-----------------------------------------------------------------------------
# log_handler =
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
# Service Settings
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
#-----------------------------------------------------------------------------
# The IP address on which the server will bind.
# If empty, it will bind on all interfaces (default empty).
#-----------------------------------------------------------------------------
; interface = localhost
#-----------------------------------------------------------------------------
# The TCP port on which the server will listen (default 8069).
#-----------------------------------------------------------------------------
port = 8069
#-----------------------------------------------------------------------------
# Launch server over https instead of http (default False).
#-----------------------------------------------------------------------------
; secure = False
#-----------------------------------------------------------------------------
# Set to True if you are deploying your App behind a proxy
# e.g. Apache using mod_proxy. --proxy_mode added, using Werkzeug ProxyFix class
#-----------------------------------------------------------------------------
#proxy_mode = True
#-----------------------------------------------------------------------------
# Specify the addons_path folders ordered by priority
# addons_path=/first/path/,/second/path/
#-----------------------------------------------------------------------------
addons_path = /opt/openerp/odoo/addons,/home/myaddons
#-----------------------------------------------------------------------------
# The file where the server pid will be stored (default False).
# We are letting the init script create the pid
#-----------------------------------------------------------------------------
# pidfile = False
#-----------------------------------------------------------------------------
# specify reference timezone for the server (e.g. Europe/Brussels)
#-----------------------------------------------------------------------------
; timezone = False
#-----------------------------------------------------------------------------
# specify the certificate file for the SSL connection
#-----------------------------------------------------------------------------
; secure_cert_file = server.cert
#-----------------------------------------------------------------------------
# specify the private key file for the SSL connection
#-----------------------------------------------------------------------------
; secure_pkey_file = server.pkey
#-----------------------------------------------------------------------------
# XML-RPC Secure Configuration (disabled if ssl is unavailable):
# xmlrpcs - Set to False to disable the XML-RPC Secure protocol
# xmlrpcs_interface - Specify the TCP IP address for the XML-RPC Secure
# protocol. The empty string binds to all interfaces.
# xmlrpcs_port - Specify the TCP port for the XML-RPC Secure protocol
#-----------------------------------------------------------------------------
; xmlrpcs = True
#xmlrpcs_interface = 127.0.0.1
xmlrpcs_port = 8071
#-----------------------------------------------------------------------------
# XML-RPC Configuration:
# xmlrpc - Set to False to disable the XML-RPC protocol
# xmlrpc_interface - Specify the TCP IP address for the XML-RPC
# protocol. The empty string binds to all interfaces.
# xmlrpc_port - Specify the TCP port for the XML-RPC protocol
#-----------------------------------------------------------------------------
; xmlrpc = True
#xmlrpc_interface = 127.0.0.1
xmlrpc_port = 8069
#-----------------------------------------------------------------------------
# Long polling port:
# TCP port for long-polling connections in multiprocessing or gevent mode,
# defaults to 8072. Not used in default (threaded) mode.
#-----------------------------------------------------------------------------
longpolling_port = 8072
#-----------------------------------------------------------------------------
# Use this for big data importation, if it crashes you will be able to continue
# at the current state. Provide a filename to store intermediate importation
# states.
#-----------------------------------------------------------------------------
; import_partial =
#-----------------------------------------------------------------------------
# Use the unaccent function provided by the database when available
#-----------------------------------------------------------------------------
; unaccent = False
#-----------------------------------------------------------------------------
# specify modules to export. Use in combination with --i18n-export
#-----------------------------------------------------------------------------
; translate_modules = ['all']
#-----------------------------------------------------------------------------
# Comma-separated list of server-wide modules, default=web
#-----------------------------------------------------------------------------
; server_wide_modules = None
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
# Email Settings
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
#-----------------------------------------------------------------------------
# Specify the SMTP server for sending email (default localhost).
#-----------------------------------------------------------------------------
; smtp_server = localhost
#-----------------------------------------------------------------------------
# Specify the SMTP user for sending email (default False).
#-----------------------------------------------------------------------------
; smtp_user = False
#-----------------------------------------------------------------------------
# Specify the SMTP password for sending email (default False).
#-----------------------------------------------------------------------------
; smtp_password = False
#-----------------------------------------------------------------------------
# if True, SMTP connections will be encrypted with SSL (STARTTLS)
#-----------------------------------------------------------------------------
; smtp_ssl = False
#-----------------------------------------------------------------------------
# Specify the SMTP email address for sending email
#-----------------------------------------------------------------------------
; email_from = "TKL-Odoo-Server@example.com"
#-----------------------------------------------------------------------------
# Specify the SMTP port
#-----------------------------------------------------------------------------
; smtp_port = 25
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
# Tuning Options
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
#-----------------------------------------------------------------------------
# A word on tuning your Odoo Server
#-----------------------------------------------------------------------------
#
# A lot of time has gone in to testing this TKL appliance, and one thing we
# learned while testing was tuning. For all the why we chose these numbers you
# can take a look at he issues on GitHub (links at the botton of this article)
#
# Most of this text here was taken from the Memory Matrix Discussion
# https://github.com/DocCyblade/tkl-odoo/issues/49#issuecomment-148881166
#
# It is important to note that you can run Odoo in threaded mode by setting
# the workers option to 0 however there are some modules that won't work
# and you loose fine grain control of resource management.
#
#-----------------------------------------------------------------------------
#
# the --workers is how many new process will be started to perform work or
# (answer requests) The workers have limits upon them set by the limit_xxxxx
# options here in the config file.
#
# The "limit_memory_soft" limit is the amount of ram that when a process
# goes over this limit after it is done with the request it is terminated
# and the memory it was using is freed. This amount goes for each process
#
# The hard limit is the amount of ram that if the process goes over it,
# it WILL terminate right then. (I don't think this is really correct
# because of the PDF issue we had and set this to 1.3 GB and never
# saw a process take this much. but if its below 1.3GB PDF are not created)
#
# The one we need to pay attention to is the limit_memory_soft.
# As these workers will stay alive and hold on to memory until that limit
# is reached. So if you have 5 workers and the soft limit is 256MB you could
# end up with 5 workers each taking 256MB that's 1.25GB of RAM that could
# be taken up. If you only had 1GB of ram you may need to dial back your
# workers or your soft limit.
#
# It's a balancing act of sorts, I am also not sure if keeping the
# workers at say 350 or 400 if there is some caching effect. Not sure
# why it's holding on to the memory.
#
#-----------------------------------------------------------------------------
#
# Hardware Matrix for recommended values:
# (Note these are for REAL hardware, Virtual Hardware has it's own
# issues that can arise with too many guest on a host with too many
# CPU cores etc, so remember that when looking at the chart below)
# (One other note that when I tested these, I did use VMware but
# no other VMs where competing for resources)
# (One last note, really. These numbers are to show the relationship
# between the config settings and hardware. We also assume you are running
# the database server on the same server. I know at some point in the
# higher numbers that this would not be the case. These are not numbers
# set in stone nor numbers gotten from Odoo. These are numbers I have
# come up with from the testing I have done. Real world examples if you
# have them would be great and these numbers can and should be updated!
#
# Heading | Description
# ------------------ | ---------------------------------------------------------
# CPUs | Number of CPU Cores not threads
# Physical | Physical memory, not virtual or swap
# workers | Number of workers specified in config file (workers = x)
# cron | Number of workers for cron jobs (max_cron_threads = xx)
# Mem Per | Memory in MB that is the max memory for request per worker
# Max Mem | Maximum amount that can be used by all workers
# limit_memory_soft | Number in bytes that you will use for this setting
#
# Note: Max Memory if notice is less than total memory this is on purpose. As
# workers process requests they can grow beyond the Mem Per limit so a
# server under heavy load could go past this amount. This is why there
# is "head room" built in.
#
# CPUs | Physical | workers | cron | Mem Per | Max Mem | limit_memory_soft
# ---- | -------- | ------- | ---- | ------- | ------- | -----------------------
# ANY | =< 256MB | NR | NR | NR | NR | NR
# 1 | 512MB | 0 | N/A | N/A | N/A | N/A
# 1 | 512MB | 1 | 1 | 177MB | 354MB | 185127901
# 1 | 1GB | 2 | 1 | 244MB | 732MB | 255652815
# 1 | 2GB | 2 | 1 | 506MB | 1518MB | 530242876
# 2 | 1GB | 3 | 1 | 183MB | 732MB | 191739611
# 2 | 2GB | 5 | 2 | 217MB | 1519MB | 227246947
# 2 | 4GB | 5 | 2 | 450MB | 3150MB | 471974428
# 4 | 2GB | 5 | 2 | 217MB | 1519MB | 227246947
# 4 | 4GB | 9 | 2 | 286MB | 3146MB | 300347363
# 4 | 8GB | 9 | 3 | 546MB | 6552MB | 572662306
# 4 | 16GB | 9 | 3 | 1187MB | 14244MB | 1244918057
#
#
#-----------------------------------------------------------------------------
#
# Calculations on how we got the above chart and other info can be found
#
# Memory Matrix Discussion
# https://github.com/DocCyblade/tkl-odoo/issues/49
#
# Shakedown Testing Discussions
# https://github.com/DocCyblade/tkl-odoo/issues/52
# https://github.com/DocCyblade/tkl-odoo/issues/53
# https://github.com/DocCyblade/tkl-odoo/issues/54
# https://github.com/DocCyblade/tkl-odoo/issues/55
#
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Specify the number of workers, 0 disable prefork mode.
# if count is not 0 , enables multiprocessing and sets up the
# specified number of HTTP workers (sub-processes processing HTTP and RPC
# requests). TKL Default is 0
#
# (See chart above for recommended values)
#-----------------------------------------------------------------------------
workers = 2
#-----------------------------------------------------------------------------
# number of workers dedicated to cron jobs. Defaults to 2. The workers are
# threads in multithreading mode and processes in multiprocessing mode.
#-----------------------------------------------------------------------------
max_cron_threads = 1
#-----------------------------------------------------------------------------
# Prevents the worker from using more than <limit> CPU seconds for each
# request. If the limit is exceeded, the worker is killed
#-----------------------------------------------------------------------------
limit_time_cpu = 600
#-----------------------------------------------------------------------------
# Prevents the worker from taking longer than <limit> seconds to process a
# request. If the limit is exceeded, the worker is killed.
#-----------------------------------------------------------------------------
limit_time_real = 900
#-----------------------------------------------------------------------------
# Maximum allowed virtual memory per worker. If the limit is exceeded, the
# worker is killed and recycled at the end of the current request.
#
# (See chart above for recommended values)
#-----------------------------------------------------------------------------
limit_memory_soft = 5368709120
#-----------------------------------------------------------------------------
# Hard limit on virtual memory, any worker exceeding the limit will be
# immediately killed without waiting for the end of the current request
# processing.
#
# Not sure of the reason but if this is set lower that 1.3GB then print jobs
# using PDF does not work. We are unsure why but this was the lowest amount
# for it to work.
#-----------------------------------------------------------------------------
limit_memory_hard = 6710886400
#-----------------------------------------------------------------------------
# Number of requests a worker will process before being recycled and restarted.
#-----------------------------------------------------------------------------
limit_request = 8196
#-----------------------------------------------------------------------------
# Force a limit on the maximum number of records kept in the virtual osv_memory
# tables. The default is False, which means no count-based limit.
#-----------------------------------------------------------------------------
; osv_memory_count_limit = False
#-----------------------------------------------------------------------------
# Force a limit on the maximum age of records kept in the virtual osv_memory
# tables. This is a decimal value expressed in hours, and the default is 1 hour.
#-----------------------------------------------------------------------------
; osv_memory_age_limit = 1.0
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
# Testing and Demo Settings
#HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
#-----------------------------------------------------------------------------
# Enable YAML and unit tests.
#-----------------------------------------------------------------------------
; test_enable = False
#-----------------------------------------------------------------------------
# Launch a python or YML test file.
#-----------------------------------------------------------------------------
; test_file = False
#-----------------------------------------------------------------------------
# If set, will save sample of all reports in this directory.
#-----------------------------------------------------------------------------
; test_report_directory = False
#-----------------------------------------------------------------------------
# Commit database changes performed by YAML or XML tests.
#-----------------------------------------------------------------------------
; test_commit = False
#-----------------------------------------------------------------------------
# disable loading demo data for modules to be installed (comma-separated, use
# "all" for all modules). Default is none
#-----------------------------------------------------------------------------
; without_demo = all

1
docker/pyenv-version.txt Normal file
View file

@ -0,0 +1 @@
v1.2.20

View file

@ -0,0 +1 @@
3.7.7

View file

@ -0,0 +1,40 @@
#!./.venv/bin/python
import argparse
from os import listdir
from os.path import isdir, join, abspath
import configparser
parser = argparse.ArgumentParser(prog='Configure base dir for all addons')
parser.add_argument("addonsBaseDir", help="Path where addons are cloned.")
parser.add_argument("srcConfigPath",
help="Path where we retrieve source config file to adapt with new "
"addons path.")
parser.add_argument("dstConfigPath", help="Path to save adapted configuration.")
args = parser.parse_args()
addonsBaseDir = args.addonsBaseDir
srcConfigPath = args.srcConfigPath
dstConfigPath = args.dstConfigPath
addonsDirs = [abspath(join(addonsBaseDir, f)) for f in listdir(addonsBaseDir) if
isdir(join(addonsBaseDir, f))]
# addonsDirs.insert(0, "/usr/lib/python3/dist-packages/odoo/addons/")
addonsDirs.insert(0, "/ERPLibre/odoo/addons/")
config = configparser.ConfigParser()
config.read(srcConfigPath)
separator = ","
config.set('options', 'addons_path', separator.join(addonsDirs))
print(config.get('options', 'addons_path'))
with open(dstConfigPath, 'w') as configfile:
config.write(configfile)

38
docker/wait-for-psql.py Executable file
View file

@ -0,0 +1,38 @@
#!./.venv/bin/python
import argparse
import psycopg2
import sys
import time
if __name__ == '__main__':
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--db_host', required=True)
arg_parser.add_argument('--db_port', required=True)
arg_parser.add_argument('--db_user', required=True)
arg_parser.add_argument('--db_password', required=True)
arg_parser.add_argument('--db_name', required=False, default="postgres")
arg_parser.add_argument('--timeout', type=int, default=10)
args = arg_parser.parse_args()
start_time = time.time()
print("Try connection to postgres...")
connected = False
error = ''
while ((time.time() - start_time) < args.timeout) or connected is True:
try:
conn = psycopg2.connect(user=args.db_user, host=args.db_host,
port=args.db_port, password=args.db_password,
dbname=args.db_name)
break
except psycopg2.OperationalError as e:
error = e
print(".")
time.sleep(1)
else:
connected = True
conn.close()
if error:
print("Database connection failure: %s" % error, file=sys.stderr)
sys.exit(1)

View file

@ -1,5 +1,11 @@
#!/usr/bin/env bash
ERPLIBRE_VERSION="1.1.0"
ERPLIBRE_DOCKER_BASE="technolibre/erplibre-base"
ERPLIBRE_DOCKER_PROD="technolibre/erplibre"
ERPLIBRE_DOCKER_BASE_VERSION="${ERPLIBRE_DOCKER_BASE}:${ERPLIBRE_VERSION}"
ERPLIBRE_DOCKER_PROD_VERSION="${ERPLIBRE_DOCKER_PROD}:${ERPLIBRE_VERSION}"
EL_USER="erplibre"
EL_HOME="/${EL_USER}"
EL_HOME_ERPLIBRE="${EL_HOME}/erplibre"

14
ignore_requirements.txt Normal file
View file

@ -0,0 +1,14 @@
mercurial
facturx
stdnum
u2flib_server
dateutil
csv
chess
git
voicent
swiftclient
keystoneclient
xlsxwriter
ldap
pythonjsonlogger

View file

@ -1,28 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="CybroOdoo" fetch="https://github.com/ERPLibre/"/>
<remote name="ERPLibre" fetch="https://github.com/ERPLibre/"/>
<remote name="MathBenTech" fetch="https://github.com/ERPLibre/"/>
<remote name="Numigi" fetch="https://github.com/ERPLibre/"/>
<remote name="OCA" fetch="https://github.com/ERPLibre/"/>
<remote name="SanteLibre" fetch="https://github.com/ERPLibre/"/>
<remote name="Smile-SA" fetch="https://github.com/ERPLibre/"/>
<remote name="camptocamp" fetch="https://github.com/ERPLibre/"/>
<remote name="dhongu" fetch="https://github.com/ERPLibre/"/>
<remote name="it-projects-llc" fetch="https://github.com/ERPLibre/"/>
<remote name="itpp-labs" fetch="https://github.com/ERPLibre/"/>
<remote name="kinjal-sorathiya" fetch="https://github.com/ERPLibre/"/>
<remote name="muk-it" fetch="https://github.com/ERPLibre/"/>
<remote name="obayit" fetch="https://github.com/ERPLibre/"/>
<remote name="odoo" fetch="https://github.com/ERPLibre/"/>
<remote name="odooaktiv" fetch="https://github.com/ERPLibre/"/>
<remote name="odoomates" fetch="https://github.com/ERPLibre/"/>
<remote name="openeducat" fetch="https://github.com/ERPLibre/"/>
<remote name="pledra" fetch="https://github.com/ERPLibre/"/>
<remote name="tegin" fetch="https://github.com/ERPLibre/"/>
<default remote="ERPLibre" revision="12.0" sync-j="4" sync-c="true"/>
<project name="OpenHRMS.git" path="addons/CybroOdoo_OpenHRMS" remote="CybroOdoo" groups="addons"/>
<project name="Property-Management_odoo.git" path="addons/kinjal-sorathiya_Property-Management_odoo" remote="kinjal-sorathiya" revision="master" groups="addons"/>
<project name="QuotationRevision.git" path="addons/odooaktiv_QuotationRevision" remote="odooaktiv" groups="addons"/>
<project name="account-analytic.git" path="addons/OCA_account-analytic" remote="OCA" groups="addons"/>
<project name="access-addons.git" path="addons/itpp-labs_access-addons" remote="itpp-labs" revision="12.0_dev" groups="addons"/>
<project name="account-analytic.git" path="addons/OCA_account-analytic" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="account-budgeting.git" path="addons/OCA_account-budgeting" remote="OCA" groups="addons"/>
<project name="account-closing.git" path="addons/OCA_account-closing" remote="OCA" groups="addons"/>
<project name="account-consolidation.git" path="addons/OCA_account-consolidation" remote="OCA" groups="addons"/>
<project name="account-financial-reporting.git" path="addons/OCA_account-financial-reporting" remote="OCA" groups="addons"/>
<project name="account-financial-tools.git" path="addons/OCA_account-financial-tools" remote="OCA" groups="addons"/>
<project name="account-financial-reporting.git" path="addons/OCA_account-financial-reporting" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="account-financial-tools.git" path="addons/OCA_account-financial-tools" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="account-fiscal-rule.git" path="addons/OCA_account-fiscal-rule" remote="OCA" groups="addons"/>
<project name="account-invoice-reporting.git" path="addons/OCA_account-invoice-reporting" remote="OCA" groups="addons"/>
<project name="account-invoicing.git" path="addons/OCA_account-invoicing" remote="OCA" revision="12.0_account_invoice_approbation" groups="addons"/>
<project name="account-invoicing.git" path="addons/OCA_account-invoicing" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="account-payment.git" path="addons/OCA_account-payment" remote="OCA" groups="addons"/>
<project name="account-reconcile.git" path="addons/OCA_account-reconcile" remote="OCA" groups="addons"/>
<project name="apps-store.git" path="addons/OCA_apps-store" remote="OCA" groups="addons"/>
@ -32,25 +44,39 @@
<project name="business-requirement.git" path="addons/OCA_business-requirement" remote="OCA" groups="addons"/>
<project name="commission.git" path="addons/OCA_commission" remote="OCA" groups="addons"/>
<project name="community-data-files.git" path="addons/OCA_community-data-files" remote="OCA" groups="addons"/>
<project name="connector-ecommerce.git" path="addons/OCA_connector-ecommerce" remote="OCA" groups="addons"/>
<project name="connector-interfaces.git" path="addons/OCA_connector-interfaces" remote="OCA" groups="addons"/>
<project name="connector-jira.git" path="addons/OCA_connector-jira" remote="OCA" groups="addons"/>
<project name="connector-telephony.git" path="addons/OCA_connector-telephony" remote="OCA" groups="addons"/>
<project name="connector.git" path="addons/OCA_connector" remote="OCA" groups="addons"/>
<project name="contract.git" path="addons/OCA_contract" remote="OCA" groups="addons"/>
<project name="credit-control.git" path="addons/OCA_credit-control" remote="OCA" groups="addons"/>
<project name="crm.git" path="addons/OCA_crm" remote="OCA" groups="addons"/>
<project name="currency.git" path="addons/OCA_currency" remote="OCA" groups="addons"/>
<project name="data-protection.git" path="addons/OCA_data-protection" remote="OCA" groups="addons"/>
<project name="development.git" path="addons/MathBenTech_development" remote="MathBenTech" revision="12.0" groups="addons"/>
<project name="ddmrp.git" path="addons/OCA_ddmrp" remote="OCA" groups="addons"/>
<project name="delivery-carrier.git" path="addons/OCA_delivery-carrier" remote="OCA" groups="addons"/>
<project name="deltatech.git" path="addons/dhongu_deltatech" remote="dhongu" groups="addons"/>
<project name="development.git" path="addons/MathBenTech_development" remote="MathBenTech" groups="addons"/>
<project name="donation.git" path="addons/OCA_donation" remote="OCA" revision="12.0_module_donation_website" groups="addons"/>
<project name="e-commerce.git" path="addons/OCA_e-commerce" remote="OCA" groups="addons"/>
<project name="edi.git" path="addons/OCA_edi" remote="OCA" groups="addons"/>
<project name="erplibre_addons.git" path="addons/ERPLibre_erplibre_addons" remote="ERPLibre" revision="12.0" groups="addons"/>
<project name="erplibre_addons.git" path="addons/ERPLibre_erplibre_addons" remote="ERPLibre" groups="addons"/>
<project name="erplibre_theme_addons.git" path="addons/ERPLibre_erplibre_theme_addons" remote="ERPLibre" groups="addons"/>
<project name="event.git" path="addons/OCA_event" remote="OCA" groups="addons"/>
<project name="field-service.git" path="addons/OCA_field-service" remote="OCA" groups="addons"/>
<project name="fleet.git" path="addons/OCA_fleet" remote="OCA" groups="addons"/>
<project name="geospatial.git" path="addons/OCA_geospatial" remote="OCA" groups="addons"/>
<project name="helpdesk.git" path="addons/OCA_helpdesk" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="hr.git" path="addons/OCA_hr" remote="OCA" groups="addons"/>
<project name="interface-github.git" path="addons/OCA_interface-github" remote="OCA" groups="addons"/>
<project name="knowledge.git" path="addons/OCA_knowledge" remote="OCA" groups="addons"/>
<project name="l10n-canada.git" path="addons/OCA_l10n-canada" remote="OCA" groups="addons"/>
<project name="maintenance.git" path="addons/OCA_maintenance" remote="OCA" groups="addons"/>
<project name="management-system.git" path="addons/OCA_management-system" remote="OCA" groups="addons"/>
<project name="manufacture.git" path="addons/OCA_manufacture" remote="OCA" groups="addons"/>
<project name="margin-analysis.git" path="addons/OCA_margin-analysis" remote="OCA" revision="12.0_sale_margin_editor" groups="addons"/>
<project name="medical-fhir.git" path="addons/tegin_medical-fhir" remote="tegin" groups="addons"/>
<project name="mis-builder.git" path="addons/OCA_mis-builder" remote="OCA" groups="addons"/>
<project name="muk_base.git" path="addons/muk-it_muk_base" remote="muk-it" groups="addons"/>
<project name="muk_dms.git" path="addons/muk-it_muk_dms" remote="muk-it" groups="addons"/>
@ -60,44 +86,61 @@
<project name="muk_web.git" path="addons/muk-it_muk_web" remote="muk-it" revision="12.0_fix_web_conflict_menu" groups="addons"/>
<project name="muk_website.git" path="addons/muk-it_muk_website" remote="muk-it" revision="12.0_remove_autoinstall" groups="addons"/>
<project name="multi-company.git" path="addons/OCA_multi-company" remote="OCA" groups="addons"/>
<project name="odoo-base-addons.git" path="addons/Numigi_odoo-base-addons" remote="Numigi" groups="addons"/>
<project name="odoo-base-addons.git" path="addons/Numigi_odoo-base-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-business-spending-management-quebec-canada.git" path="addons/MathBenTech_odoo-business-spending-management-quebec-canada" remote="MathBenTech" revision="12.0_sale_order_line_timesheet_attribution" groups="addons"/>
<project name="odoo-entertainment-addons.git" path="addons/Numigi_odoo-entertainment-addons" remote="Numigi" groups="addons"/>
<project name="odoo-git-addons.git" path="addons/Numigi_odoo-git-addons" remote="Numigi" groups="addons"/>
<project name="odoo-cloud-platform.git" path="addons/camptocamp_odoo-cloud-platform" remote="camptocamp" groups="addons"/>
<project name="odoo-entertainment-addons.git" path="addons/Numigi_odoo-entertainment-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-git-addons.git" path="addons/Numigi_odoo-git-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-hr-addons.git" path="addons/Numigi_odoo-hr-addons" remote="Numigi" groups="addons"/>
<project name="odoo-partner-addons.git" path="addons/Numigi_odoo-partner-addons" remote="Numigi" revision="12.0_partner_no_vat_improve_no_vat" groups="addons"/>
<project name="odoo-product-addons.git" path="addons/Numigi_odoo-product-addons" remote="Numigi" groups="addons"/>
<project name="odoo-project-addons.git" path="addons/Numigi_odoo-project-addons" remote="Numigi" groups="addons"/>
<project name="odoo-partner-addons.git" path="addons/Numigi_odoo-partner-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-product-addons.git" path="addons/Numigi_odoo-product-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-product-configurator.git" path="addons/pledra_odoo-product-configurator" remote="pledra" groups="addons"/>
<project name="odoo-project-addons.git" path="addons/Numigi_odoo-project-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-purchase-addons.git" path="addons/Numigi_odoo-purchase-addons" remote="Numigi" groups="addons"/>
<project name="odoo-stock-addons.git" path="addons/Numigi_odoo-stock-addons" remote="Numigi" groups="addons"/>
<project name="odoo-saas-tools.git" path="addons/it-projects-llc_odoo-saas-tools" remote="it-projects-llc" groups="addons"/>
<project name="odoo-stock-addons.git" path="addons/Numigi_odoo-stock-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-survey-addons.git" path="addons/Numigi_odoo-survey-addons" remote="Numigi" groups="addons"/>
<project name="odoo-timesheet-addons.git" path="addons/Numigi_odoo-timesheet-addons" remote="Numigi" groups="addons"/>
<project name="odoo-timesheet-addons.git" path="addons/Numigi_odoo-timesheet-addons" remote="Numigi" revision="12.0_dev" groups="addons"/>
<project name="odoo-web-addons.git" path="addons/Numigi_odoo-web-addons" remote="Numigi" groups="addons"/>
<project name="odoo.git" path="odoo" remote="odoo" revision="ERPLibre/12.0" clone-depth="10" groups="odoo"/>
<project name="odoo_addons.git" path="addons/Smile-SA_odoo_addons" remote="Smile-SA" revision="12.0_remote_autoinstall" groups="addons"/>
<project name="odoo_dhtmlxgantt.git" path="addons/obayit_odoo_dhtmlxgantt" remote="obayit" groups="addons"/>
<project name="odooapps.git" path="addons/odoomates_odooapps" remote="odoomates" groups="addons"/>
<project name="openeducat_erp.git" path="addons/openeducat_openeducat_erp" remote="openeducat" groups="addons"/>
<project name="operating-unit.git" path="addons/OCA_operating-unit" remote="OCA" groups="addons"/>
<project name="partner-contact.git" path="addons/OCA_partner-contact" remote="OCA" groups="addons"/>
<project name="pos-addons.git" path="addons/itpp-labs_pos-addons" remote="itpp-labs" revision="12.0_dev" groups="addons"/>
<project name="pos.git" path="addons/OCA_pos" remote="OCA" groups="addons"/>
<project name="product-attribute.git" path="addons/OCA_product-attribute" remote="OCA" groups="addons"/>
<project name="product-pack.git" path="addons/OCA_product-pack" remote="OCA" groups="addons"/>
<project name="product-variant.git" path="addons/OCA_product-variant" remote="OCA" groups="addons"/>
<project name="product_rating_app.git" path="addons/odooaktiv_product_rating_app" remote="odooaktiv" groups="addons"/>
<project name="project-reporting.git" path="addons/OCA_project-reporting" remote="OCA" groups="addons"/>
<project name="project.git" path="addons/OCA_project" remote="OCA" revision="12.0_fix_conflict_project_key" groups="addons"/>
<project name="purchase-workflow.git" path="addons/OCA_purchase-workflow" remote="OCA" groups="addons"/>
<project name="queue.git" path="addons/OCA_queue" remote="OCA" groups="addons"/>
<project name="reporting-engine.git" path="addons/OCA_reporting-engine" remote="OCA" groups="addons"/>
<project name="rma.git" path="addons/OCA_rma" remote="OCA" groups="addons"/>
<project name="sale-reporting.git" path="addons/OCA_sale-reporting" remote="OCA" groups="addons"/>
<project name="sale-workflow.git" path="addons/OCA_sale-workflow" remote="OCA" revision="12.0_modules_sale_order_line" groups="addons"/>
<project name="santelibre_addons.git" path="addons/SanteLibre_santelibre_addons" remote="SanteLibre" revision="master" groups="addons"/>
<project name="scrummer.git" path="addons/MathBenTech_scrummer" remote="MathBenTech" groups="addons"/>
<project name="scrummer.git" path="addons/MathBenTech_scrummer" remote="MathBenTech" revision="12.0_dev" groups="addons"/>
<project name="server-auth.git" path="addons/OCA_server-auth" remote="OCA" groups="addons"/>
<project name="server-backend.git" path="addons/OCA_server-backend" remote="OCA" groups="addons"/>
<project name="server-brand.git" path="addons/OCA_server-brand" remote="OCA" groups="addons"/>
<project name="server-env.git" path="addons/OCA_server-env" remote="OCA" groups="addons"/>
<project name="server-tools.git" path="addons/OCA_server-tools" remote="OCA" groups="addons"/>
<project name="server-ux.git" path="addons/OCA_server-ux" remote="OCA" groups="addons"/>
<project name="social.git" path="addons/OCA_social" remote="OCA" groups="addons"/>
<project name="stock-logistics-warehouse.git" path="addons/OCA_stock-logistics-warehouse" remote="OCA" groups="addons"/>
<project name="storage.git" path="addons/OCA_storage" remote="OCA" groups="addons"/>
<project name="timesheet.git" path="addons/OCA_timesheet" remote="OCA" revision="12.0_support_project_agile_timesheet" groups="addons"/>
<project name="web.git" path="addons/OCA_web" remote="OCA" groups="addons"/>
<project name="vertical-association.git" path="addons/OCA_vertical-association" remote="OCA" groups="addons"/>
<project name="vertical-hotel.git" path="addons/OCA_vertical-hotel" remote="OCA" groups="addons"/>
<project name="vertical-isp.git" path="addons/OCA_vertical-isp" remote="OCA" groups="addons"/>
<project name="vertical-travel.git" path="addons/OCA_vertical-travel" remote="OCA" groups="addons"/>
<project name="web.git" path="addons/OCA_web" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="website-addons.git" path="addons/itpp-labs_website-addons" remote="itpp-labs" revision="12.0_dev" groups="addons"/>
<project name="website-cms.git" path="addons/OCA_website-cms" remote="OCA" groups="addons"/>
<project name="website.git" path="addons/OCA_website" remote="OCA" revision="12.0_dev" groups="addons"/>
<project name="wms.git" path="addons/OCA_wms" remote="OCA" groups="addons"/>
</manifest>

3906
poetry.lock generated Normal file

File diff suppressed because it is too large Load diff

5
poetry.toml Normal file
View file

@ -0,0 +1,5 @@
cache-dir = "./"
[virtualenvs]
create = false
in-project = false
path = "{cache-dir}.venv"

143
pyproject.toml Normal file
View file

@ -0,0 +1,143 @@
[build-system]
requires = [ "poetry>=1.0.0",]
build-backend = "poetry.masonry.api"
[tool.poetry]
name = "ERPLibre"
version = "1.1.0"
description = "Easy way to configure Odoo community"
license = "AGPL-3.0-or-later"
authors = [ "Mathieu Benoit <mathben@technolibre.ca>", "Alexandre Ferreira Benevides <afbenevides@technolibre.ca>",]
[tool.poetry.dependencies]
python = "^3.7"
Asterisk = "^0.0.8"
Babel = "2.3.4"
GitPython = "^3.1.7"
Jinja2 = "2.10.1"
Mako = "1.0.4"
MarkupSafe = "0.23"
Pillow = "6.1.0"
PyJWT = "1.7.1"
PyPDF2 = "1.26.0"
PyYAML = "4.2b4"
SOAPpy = "^0.12.22"
Voicent-Python = "^1.0"
Werkzeug = "0.11.15"
XlsxWriter = "0.9.3"
agithub = "^2.2.2"
altair = "^4.1.0"
bokeh = "1.1.0"
boto = "^2.49.0"
boto3 = "1.9.102"
cerberus = "^1.3.2"
chardet = "3.0.4"
cryptography = "2.6.1"
cython = "^0.29.21"
ddt = "1.2.0"
decorator = "4.0.10"
docutils = "0.12"
ebaysdk = "2.1.5"
email_validator = "^1.1.1"
extract-msg = "^0.25.3"
extract_msg = "^0.25.3"
factur-x = "^1.12"
feedparser = "5.2.1"
freezegun = "0.3.11"
geojson = "2.4.1"
gevent = "1.3.4"
gitpython = "^3.1.7"
giturlparse = "^0.9.2"
greenlet = "0.4.13"
html2text = "2016.9.19"
invoice2data = "^0.3.5"
iscompatible = "^0.1.1"
jira = "2.0.0"
keystoneauth1 = "3.14.0"
lasso = "^0.0.5"
libsass = "0.12.3"
lxml = "4.2.3"
matplotlib = ">=2.0.0"
mock = "2.0.0"
mpld3 = "0.3"
mysqlclient = "^2.0.1"
num2words = "0.5.6"
numpy = "^1.19.1"
oauthlib = "2.1.0"
"oca.decorators" = "^0.0.1"
ofxparse = "0.16"
openpyxl = "^3.0.4"
openupgradelib = "^2.0.0"
pandas = "^1.1.0"
paramiko = "^2.7.1"
passlib = "1.6.5"
pdf2image = "^1.13.1"
phonenumbers = "^8.12.7"
plotly = "4.1.0"
premailer = "^3.7.0"
psutil = "4.3.1"
psycopg2 = "2.7.3.1"
py-Asterisk = "^0.5.18"
"py3o.formats" = "^0.3"
"py3o.template" = "^0.10.0"
pycountry = "^20.7.3"
pydot = "1.2.3"
pygount = "<1.2.0"
pyldap = "2.4.28"
pymssql = "^2.1.4"
pyotp = "^2.4.0"
pyparsing = "2.1.10"
pyrfc = "^0.1.2"
pyserial = "3.1.1"
pysftp = "^0.2.9"
python-chess = "<0.24"
python-csv = "^0.0.13"
python-dateutil = "2.7.3"
python-git = "^2018.2.1"
python-json-logger = "0.1.5"
python-keystoneclient = "3.22.0"
python-slugify = ">=3.0.2"
python-stdnum = "^1.13"
python-swiftclient = "3.9.0"
python-u2flib-server = "^5.0.0"
python-u2flib_server = "^5.0.0"
pytz = "2017.2"
pyusb = "1.0.0"
pyzbar = "^0.1.8"
qrcode = "5.3"
raven = "^6.10.0"
redis = "2.10.5"
reportlab = "3.3.0"
requests = "2.20.0"
requests-mock = "^1.8.0"
requests-oauthlib = "1.1.0"
requests-toolbelt = "0.9.1"
retrying = "^1.3.3"
rotate_backups_s3 = "^0.3"
serial = "^0.0.97"
shapely = "1.6.4.post2"
simplejson = "^3.17.2"
slugify = "^0.0.1"
sphinx = ">=1.6.7"
sphinx-patchqueue = ">=1.0"
sqlalchemy = "^1.3.18"
statsd = "3.2.1"
suds-jurko = "0.6"
toml = "^0.10.1"
unidecode = "1.0.22"
vatnumber = "1.2"
vcrpy = ">=2.1.1"
vcrpy-unittest = "^0.1.7"
vobject = "0.9.3"
voicent-python = "^1.0"
webcolors = "1.10"
websocket-client = "^0.57.0"
wheel = "^0.34.2"
xlrd = "1.0.0"
xlwt = "1.3"
xmltodict = "^0.12.0"
zeep = "^3.4.0"
zxcvbn = "^4.4.28"
[tool.poetry.dev-dependencies]
websocket_client = "^0.57.0"

View file

@ -1,6 +1,34 @@
# For script
giturlparse
agithub
gitpython
PyYAML
retrying
xmltodict
xmltodict
openupgradelib
# For OSX
cython
# For Odoo
wheel
phonenumbers
# For OCA
factur-x
# For testing
websocket-client
python-stdnum
python-u2flib_server
python-dateutil
python-csv
python-chess
python-git
voicent-python
python-swiftclient
python-keystoneclient
# For updating poetry
toml
iscompatible

2
run.sh
View file

@ -1,3 +1,3 @@
#!/usr/bin/env bash
source ./venv/bin/activate
source ./.venv/bin/activate
python3 ./odoo/odoo-bin -c ./config.conf --limit-time-real 99999 --limit-time-cpu 99999 $@

28
script/delete_production.sh Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env bash
. ./env_var.sh
echo -e "\n==== Delete user ===="
echo -n "Are You Sure to delete user ${EL_HOME}? [Y/n]"
old_stty_cfg=$(stty -g)
stty raw -echo
answer=$( while ! head -c 1 | grep -i '[ny]' ;do true ;done )
stty $old_stty_cfg
if echo "$answer" | grep -iq "^y" ;then
echo "Remove all system of ${EL_HOME}"
else
echo "Cancel..."
exit 1
fi
sudo systemctl stop ${EL_CONFIG}.service
# Disable daemon
sudo systemctl disable ${EL_CONFIG}.service
sudo rm -f /etc/systemd/system/${EL_CONFIG}.service
# Disable nginx
sudo rm -rf ${EL_HOME}
sudo rm -f /etc/nginx/sites-available/${EL_WEBSITE_NAME}
sudo rm -f /etc/nginx/sites-enabled/${EL_WEBSITE_NAME}
sudo systemctl restart nginx

23
script/docker_build.sh Executable file
View file

@ -0,0 +1,23 @@
#!/usr/bin/env bash
. ./env_var.sh
# Rewrite docker-compose
./script/docker_update_version.py --version=${ERPLIBRE_VERSION} --base=${ERPLIBRE_DOCKER_BASE} --prod=${ERPLIBRE_DOCKER_PROD}
cd docker
ARGS=--build-arg=WORKING_BRANCH=$(git rev-parse --abbrev-ref HEAD)
# Clear cache
# ARGS="${ARGS} --no-cache"
set -e
# Build base
docker build ${ARGS} -f Dockerfile.base -t ${ERPLIBRE_DOCKER_BASE_VERSION} .
# Build prod
docker build ${ARGS} -f Dockerfile.prod.pkg -t ${ERPLIBRE_DOCKER_PROD_VERSION} .
cd -
docker-compose up -d

108
script/docker_update_version.py Executable file
View file

@ -0,0 +1,108 @@
#!./.venv/bin/python
import os
import sys
import argparse
import logging
import yaml
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
def get_config():
"""Parse command line arguments, extracting the config file name,
returning the union of config file and command line arguments
:return: dict of config file settings and command line arguments
"""
config = GitTool.get_project_config()
# TODO update description
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description='''\
Update version of docker ready to commit.
''',
epilog='''\
'''
)
parser.add_argument('--version', required=True, help="Version of ERPLibre.")
parser.add_argument('--base', required=True, help="Docker base name.")
parser.add_argument('--prod', required=True, help="Docker prod name.")
parser.add_argument('--docker_compose_file', default="./docker-compose.yml", help="Docker compose file to update.")
parser.add_argument('--docker_prod', default="./docker/Dockerfile.prod.pkg", help="Docker prod file to update.")
args = parser.parse_args()
args.base_version = f"{args.base}:{args.version}"
args.prod_version = f"{args.prod}:{args.version}"
return args
# def edit_yaml(config):
# with open(config.docker_compose_file, 'r') as f:
# docker_info = yaml.safe_load(f)
# if not docker_info:
# print(f"ERROR, file {config.docker_compose_file} is empty.")
# sys.exit(1)
#
# dct_services = docker_info.get("services")
# dct_erplibre = dct_services.get("ERPLibre") if dct_services else None
# if dct_erplibre:
# dct_erplibre["image"] = config.prod_version
# with open(config.docker_compose_file, 'w') as f:
# yaml.dump(docker_info, f)
def edit_text(config):
with open(config.docker_compose_file, 'r') as f:
lst_docker_info = f.readlines()
if not lst_docker_info:
print(f"ERROR, file {config.docker_compose_file} is empty.")
sys.exit(1)
is_find = False
i = 0
for docker_info in lst_docker_info:
if is_find:
key = "image:"
value = lst_docker_info[i]
lst_docker_info[i] = f"{value[:value.find(key) + len(key)]} {config.prod_version}\n"
break
if "ERPLibre" in docker_info:
is_find = True
i += 1
with open(config.docker_compose_file, 'w') as f:
f.writelines(lst_docker_info)
def edit_docker_prod(config):
with open(config.docker_prod, 'r') as f:
lst_docker_info = f.readlines()
if not lst_docker_info:
print(f"ERROR, file {config.docker_compose_file} is empty.")
sys.exit(1)
i = 0
for docker_info in lst_docker_info:
if "FROM " in docker_info:
lst_docker_info[i] = f"FROM {config.base_version}\n"
i += 1
with open(config.docker_prod, 'w') as f:
f.writelines(lst_docker_info)
def main():
config = get_config()
edit_text(config)
edit_docker_prod(config)
if __name__ == '__main__':
main()

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
import os
import sys
import argparse

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
import os
import sys
import argparse

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
import os
import sys
import argparse

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
# © 2020 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
import os
import sys
import argparse

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
import os
import sys
import argparse

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
import os
import sys
import argparse
@ -30,6 +30,8 @@ def get_config():
help="Path of repo to change remote, including submodule.")
parser.add_argument('--clear', action="store_true",
help="Create a new manifest and clear old configuration.")
parser.add_argument('-m', '--manifest', default="manifest/default.dev.xml",
help="The manifest file path to generate.")
args = parser.parse_args()
return args
@ -53,8 +55,9 @@ def main():
dct_remote = {}
dct_project = {}
git_tool.generate_repo_manifest(lst_repo_organization,
output=f"{config.dir}manifest/default.dev.xml",
dct_remote=dct_remote, dct_project=dct_project)
output=f"{config.dir}{config.manifest}",
dct_remote=dct_remote, dct_project=dct_project,
keep_original=True)
git_tool.generate_install_locally()

View file

@ -0,0 +1,75 @@
#!./.venv/bin/python
import os
import sys
import argparse
import logging
from git import Repo
from git.exc import GitCommandError
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
def get_config():
"""Parse command line arguments, extracting the config file name,
returning the union of config file and command line arguments
:return: dict of config file settings and command line arguments
"""
# TODO update description
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description="""Compare actual code with a manifest.""",
epilog='''\
'''
)
parser.add_argument('-m', '--manifest', required=True,
help="The manifest to compare with actual code.")
args = parser.parse_args()
return args
def main():
config = get_config()
git_tool = GitTool()
dct_remote, dct_project, default_remote = git_tool.get_manifest_xml_info(filename=config.manifest, add_root=True)
default_branch_name = default_remote.get("@revision", git_tool.default_branch)
i = 0
total = len(dct_project)
for name, project in dct_project.items():
i += 1
path = project.get("@path")
print(f"{i}/{total} - {path}")
branch_name = project.get("@revision", default_branch_name)
organization = project.get("@remote")
if not organization:
print(f"ERROR missing @remote on project {path}.")
continue
git_repo = Repo(path)
value = git_repo.git.branch("--show-current")
if not value:
# TODO maybe need to check divergence with local branch and not remote branch
commit_head = git_repo.git.rev_parse("HEAD")
try:
commit_branch = git_repo.git.rev_parse(f"{organization}/{branch_name}")
except GitCommandError:
print("ERROR Something wrong with this repo.")
continue
if commit_branch != commit_head:
print("WARNING Not on specified branch, got a divergence.")
else:
print("PASS Not on specified branch, no divergence.")
elif branch_name != value:
print(f"ERROR, manifest revision is {branch_name} and actual revision is {value}.")
else:
print("PASS")
if __name__ == '__main__':
main()

View file

@ -1,4 +1,4 @@
#!./venv/bin/python
#!./.venv/bin/python
# © 2020 TechnoLibre (http://www.technolibre.ca)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
import os
@ -311,7 +311,7 @@ class GitTool:
xml_as_string = xml.read()
xml_dict = xmltodict.parse(xml_as_string, dict_constructor=dict)
dct_manifest = xml_dict.get("manifest")
default_remote = dct_manifest.get("default").get("@remote")
default_remote = dct_manifest.get("default")
lst_remote = dct_manifest.get("remote")
lst_project = dct_manifest.get("project")
dct_remote = {a.get("@name"): a for a in lst_remote}
@ -351,6 +351,7 @@ class GitTool:
webbrowser.open_new_tab(url)
def generate_install_locally(self, repo_path="./"):
filename_locally = f"{repo_path}script/install_locally.sh"
lst_repo = self.get_repo_info(repo_path=repo_path)
lst_result = []
for repo in lst_repo:
@ -361,14 +362,15 @@ class GitTool:
str_repo = f' printf "${{EL_HOME}}/{repo.get("path")}," >> ' \
f'${{EL_CONFIG_FILE}}\n'
lst_result.append(str_repo)
with open(f"{repo_path}script/install_locally.sh") as file:
with open(filename_locally) as file:
all_lines = file.readlines()
# search place to add/replace lines
index = 0
find_index = False
index_find = 0
for line in all_lines:
if not find_index and "if [[ $EL_MINIMAL_ADDONS = \"False\" ]]; then\n" == line:
if not find_index and \
"if [[ ${EL_MINIMAL_ADDONS} = \"False\" ]]; then\n" == line:
index_find = index + 1
for insert_line in lst_result:
all_lines.insert(index_find, insert_line)
@ -381,8 +383,12 @@ class GitTool:
break
index += 1
if not find_index:
print(f"ERROR cannot regenerate file {filename_locally}, "
f"did you change the header?")
# create file
with open(f"{repo_path}script/install_locally.sh", mode="w") as file:
with open(filename_locally, mode="w") as file:
file.writelines(all_lines)
@staticmethod
@ -390,14 +396,17 @@ class GitTool:
return source_str[:pos] + insert_str + source_str[pos:]
def generate_repo_manifest(self, lst_repo: List[Struct] = [], output: str = "",
dct_remote={}, dct_project={}, default_remote=None):
dct_remote={}, dct_project={}, default_remote=None,
keep_original=False):
"""
Generate repo manifest
:param lst_repo: optional, update manifest with list_repo
:param output: filename to write output
:param dct_remote: dict of remote information
:param dct_project: dict of project information
:param default_remote: name of default remote, optional
:param default_remote: dict of default remote
:param keep_original: if True, can manage multiple organization with same name,
but with different fetch url
:return:
"""
if not output:
@ -449,10 +458,15 @@ class GitTool:
('@sync-c', "true"),
]))
else:
if keep_original and repo.project_name not in dct_project.keys():
# Exception, create a new remote to keep tracking on original
original_organization = f"{repo.original_organization}_origin"
else:
original_organization = repo.original_organization
# Add remote, only unique remote
if repo.original_organization not in lst_remote_name:
if original_organization not in lst_remote_name:
lst_remote.append(OrderedDict(
[('@name', repo.original_organization),
[('@name', original_organization),
('@fetch', repo.url_https_organization + "/")]
))
lst_remote_name.append(repo.original_organization)
@ -462,7 +476,7 @@ class GitTool:
lst_project_info = [
('@name', repo.project_name),
('@path', repo.path),
('@remote', repo.original_organization),
('@remote', original_organization),
]
if repo.revision:
lst_project_info.append(('@revision', repo.revision))
@ -476,7 +490,7 @@ class GitTool:
if default_remote and not lst_default:
lst_default.append(OrderedDict([
('@remote', default_remote),
('@remote', default_remote.get("@remote")),
('@revision', DEFAULT_BRANCH),
('@sync-j', "4"),
('@sync-c', "true"),
@ -760,6 +774,30 @@ class GitTool:
upstream_remote.fetch)()
print('Remote "%s" fetched' % repo_info.organization)
def get_pull_request_repo(self, upstream_url: str, github_token: str,
organization_name: str = ""):
"""
:param upstream_url:
:param github_token:
:param organization_name:
:return: List of url if success, else False
"""
gh = GitHub(token=github_token)
parsed_url = parse(upstream_url)
# Fork the repo
status, user = gh.user.get()
user_name = user['login'] if not organization_name else organization_name
status, lst_pull = gh.repos[user_name][parsed_url.repo].pulls.get()
if type(lst_pull) is dict:
print(f"For url {upstream_url}, got {lst_pull.get('message')}")
return False
else:
for pull in lst_pull:
print(pull.get("html_url"))
return lst_pull
def fork_repo(self, upstream_url: str, github_token: str,
organization_name: str = ""):
# https://developer.github.com/apps/building-integrations/setting-up-and-registering-oauth-apps/about-scopes-for-oauth-apps/

113
script/git_update_repo.py Executable file
View file

@ -0,0 +1,113 @@
#!./.venv/bin/python
import os
import sys
import argparse
import logging
from git import Repo # pip install gitpython
from retrying import retry # pip install retrying
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
def get_config():
"""Parse command line arguments, extracting the config file name,
returning the union of config file and command line arguments
:return: dict of config file settings and command line arguments
"""
# TODO update description
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description='''\
''',
epilog='''\
'''
)
parser.add_argument('-d', '--dir', dest="dir", default="./",
help="Path of repo to change remote, including submodule.")
args = parser.parse_args()
return args
def main():
config = get_config()
git_tool = GitTool()
lst_repo = git_tool.get_source_repo_addons(repo_path=config.dir,
add_repo_root=False)
lst_repo_organization = [git_tool.get_transformed_repo_info_from_url(
a.get("url"), repo_path=config.dir, get_obj=True,
is_submodule=a.get("is_submodule"), sub_path=a.get("sub_path"),
revision=a.get("revision"), clone_depth=a.get("clone_depth"))
for a in lst_repo]
i = 0
total = len(lst_repo)
for repo in lst_repo_organization:
i += 1
print(f"\nNb element {i}/{total} - {repo.path}")
# TODO validate with default to ignore duplicate url, if same remote repo
if not repo.is_submodule:
continue
upstream_name = f"ERPLibre_update_12/{git_tool.default_branch}"
remote_branch_name = f"{upstream_name}/{git_tool.default_branch}"
git_repo = Repo(repo.relative_path)
# 1. Add remote if not exist
try:
upstream_remote = git_repo.remote(upstream_name)
print(f'Remote "{upstream_name}" already exists in {repo.relative_path}')
except ValueError:
upstream_remote = retry(
wait_exponential_multiplier=1000,
stop_max_delay=15000
)(git_repo.create_remote)(upstream_name, repo.url_https)
print('Remote "%s" created for %s' % (upstream_name, repo.url_https))
# 2. Fetch the remote source
retry(wait_exponential_multiplier=1000, stop_max_delay=15000)(
upstream_remote.fetch)()
print('Remote "%s" fetched' % upstream_name)
# 3. Rebase actual branch with new branch
rev = repo.revision if repo.revision else git_tool.default_branch
try:
git_repo.git.checkout(rev)
except:
if repo.revision:
rev = f"{repo.original_organization}/{repo.revision}"
else:
rev = f"{repo.original_organization}/{git_tool.default_branch}"
git_repo.git.checkout("--track", rev)
actual_commit = git_repo.git.rev_parse("HEAD")
try:
git_repo.git.rebase(remote_branch_name)
except Exception as e:
print(e, file=sys.stderr)
new_commit = git_repo.git.rev_parse("HEAD")
if actual_commit == new_commit:
print("== No diff ==")
else:
print(f"== Old commit {actual_commit} - new commit {new_commit}")
# push
try:
retry(wait_exponential_multiplier=1000, stop_max_delay=15000)(
git_repo.git.push)(repo.organization, rev)
except:
print("Cannot push, maybe need to push force or resolv rebase conflict",
file=sys.stderr)
print(f"cd {repo.path}")
print(f"git diff ERPLibre/v#.#.#..HEAD")
print(f"git push --force {repo.organization} {rev}")
print(f"cd -")
if __name__ == '__main__':
main()

View file

@ -7,7 +7,7 @@
#-------------------------------------------------------------------------------
################################################################################
EL_USER=$(whoami)
EL_USER=${USER}
#--------------------------------------------------
# Install PostgreSQL Server
@ -22,12 +22,26 @@ sudo su - postgres -c "createuser -s ${EL_USER}" 2> /dev/null || true
# Install Dependencies
#--------------------------------------------------
echo "\n--- Installing Python 3 + pip3 --"
brew install git python3 wget
brew install git python3 wget pyenv
brew link git
brew link wget
echo "\n--- Installing docker --"
brew install minikube docker docker-compose docker-machine
brew cask install virtualbox
docker-machine create --driver virtualbox default
docker-machine env default
eval "$(docker-machine env default)"
echo "\n---- Installing nodeJS NPM and rtlcss for LTR support ----"
brew install nodejs npm
brew install nodejs npm openssl
sudo npm install -g rtlcss
sudo npm install -g lessc
yes n|pyenv install 3.7.7
pyenv local 3.7.7
echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc
echo -e "\n---- Installing poetry for reliable python package ----"
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
#--------------------------------------------------
# Install Wkhtmltopdf if needed
@ -38,15 +52,3 @@ if [ ! -f "wkhtmltox-0.12.5-1.macos-carbon.pkg" ]; then
sudo sudo installer -pkg wkhtmltox-0.12.5-1.macos-carbon.pkg -target /
else echo "Wkhtmltopdf already installed"
fi
# ===============================================================================================
# !!!! FOR OSX there is a problem with python 3.7.5 with PILLOW, use 3.6.9 instead and works fine
# install python 3.6.9
# brew install pyenv
# pyenv install 3.6.9
# then redoo link:
# unlink /usr/local/bin/python3
# ln -s ~/.pyenv/versions/3.6.9/bin/python3.6 /usr/local/bin/python3
# ===============================================================================================
echo "\n---- Installing venv if not already existing (rm -r venv if already exists) ----"
~/.pyenv/versions/3.6.9/bin/python3.6 -m venv venv

View file

@ -30,8 +30,8 @@ User=${EL_USER}
Group=${EL_USER}
Restart=always
RestartSec=5
PIDFile=${EL_HOME_ERPLIBRE}/venv/service.pid
ExecStart=${EL_HOME_ERPLIBRE}/venv/run.sh
PIDFile=${EL_HOME_ERPLIBRE}/.venv/service.pid
ExecStart=${EL_HOME_ERPLIBRE}/.venv/run.sh
StandardOutput=journal+console
[Install]
@ -51,14 +51,14 @@ sudo su ${EL_USER} -c "sudo rm -f /tmp/${EL_USER}run.sh"
cat <<EOF > /tmp/${EL_USER}run.sh
#!/usr/bin/env bash
cd ${EL_HOME_ERPLIBRE}
source ./venv/bin/activate
source ./.venv/bin/activate
python3 ${EL_HOME_ERPLIBRE}/odoo/odoo-bin -c ${EL_HOME_ERPLIBRE}/config.conf --limit-time-real 99999 --limit-time-cpu 99999 $@
EOF
echo -e "* Security Run File"
sudo cp /tmp/${EL_USER}run.sh ${EL_HOME_ERPLIBRE}/venv/run.sh
sudo chmod 755 ${EL_HOME_ERPLIBRE}/venv/run.sh
sudo chown ${EL_USER}: ${EL_HOME_ERPLIBRE}/venv/run.sh
sudo cp /tmp/${EL_USER}run.sh ${EL_HOME_ERPLIBRE}/.venv/run.sh
sudo chmod 755 ${EL_HOME_ERPLIBRE}/.venv/run.sh
sudo chown ${EL_USER}: ${EL_HOME_ERPLIBRE}/.venv/run.sh
echo "-----------------------------------------------------------"
echo "Done! The ERPLibre server is up and running. Specifications:"

View file

@ -2,7 +2,7 @@
. ./env_var.sh
EL_USER=$(whoami)
EL_USER=${USER}
#EL_INSTALL_WKHTMLTOPDF="True"
##
@ -31,42 +31,47 @@ sudo apt-get upgrade -y
# Install PostgreSQL Server
#--------------------------------------------------
echo -e "\n---- Install PostgreSQL Server ----"
sudo apt-get install postgresql -y
sudo apt-get install postgresql libpq-dev -y
echo -e "\n---- Creating the ERPLibre PostgreSQL User ----"
sudo su - postgres -c "createuser -s $EL_USER" 2> /dev/null || true
sudo su - postgres -c "createuser -s ${EL_USER}" 2> /dev/null || true
#--------------------------------------------------
# Install Dependencies
#--------------------------------------------------
echo -e "\n--- Installing Python 3 + pip3 --"
sudo apt-get install git python3 python3-pip build-essential wget python3-dev python3-venv python3-wheel libxslt-dev libzip-dev libldap2-dev libsasl2-dev python3-setuptools node-less libpng12-0 gdebi-core -y
echo -e "\n--- Installing debian dependency --"
sudo apt-get install git build-essential wget libxslt-dev libzip-dev libldap2-dev libsasl2-dev node-less libpng12-0 gdebi-core libffi-dev libbz2-dev -y
sudo apt-get install libmariadbd-dev -y
echo -e "\n---- Installing nodeJS NPM and rtlcss for LTR support ----"
sudo apt-get install nodejs npm -y
sudo npm install -g rtlcss
sudo npm install -g lessc
if [ ${EL_INSTALL_NGINX} = "True" ]; then
sudo apt install nginx -y
echo -e "\n---- Installing nginx ----"
sudo apt install nginx -y
fi
#--------------------------------------------------
# Install Wkhtmltopdf if needed
#--------------------------------------------------
if [ ${EL_INSTALL_WKHTMLTOPDF} = "True" ]; then
echo -e "\n---- Installing wkhtml ----"
INSTALLED=$(dpkg -s wkhtmltox|grep installed)
if [ "" == "${INSTALLED}" ]; then
echo -e "\n---- Install wkhtml and place shortcuts on correct place ----"
#pick up correct one from x64 & x32 versions:
if [ "`getconf LONG_BIT`" == "64" ];then
_url=$WKHTMLTOX_X64
_url=${WKHTMLTOX_X64}
else
_url=$WKHTMLTOX_X32
_url=${WKHTMLTOX_X32}
fi
sudo wget ${_url}
sudo gdebi --n `basename ${_url}`
sudo ln -s /usr/local/bin/wkhtmltopdf /usr/bin
sudo ln -s /usr/local/bin/wkhtmltoimage /usr/bin
else echo -e "\n---- Already installed wkhtml ----"
fi
else
echo "Wkhtmltopdf isn't installed due to the choice of the user!"

View file

@ -8,11 +8,11 @@ if [[ "${OSTYPE}" == "linux-gnu" ]]; then
OS=$(lsb_release -si)
if [[ "${OS}" == "Ubuntu" ]]; then
echo "\n---- linux-gnu installation process started ----"
./script/install_debian_dependancy.sh
./script/install_debian_dependency.sh
else
echo "Your Linux system is not supported."
fi
elif [[ "${OSTYPE}" == "darwin"* ]]; then
echo "\n---- Darwin installation process started ----"
./script/install_OSX_dependancy.sh
./script/install_OSX_dependency.sh
fi

View file

@ -2,7 +2,7 @@
. ./env_var.sh
EL_USER=$(whoami)
EL_USER=${USER}
EL_HOME=$PWD
EL_HOME_ODOO="${EL_HOME}/odoo"
#EL_INSTALL_WKHTMLTOPDF="True"
@ -14,17 +14,6 @@ EL_CONFIG_FILE="${EL_HOME}/config.conf"
#EL_MINIMAL_ADDONS="False"
#EL_INSTALL_NGINX="True"
if hash python3.7 2>/dev/null; then
PYTHON37="True"
PYTHON36="False"
elif hash python3.6 2>/dev/null; then
PYTHON37="False"
PYTHON36="True"
else
echo "Missing python3.7 or python3.6. Python3.8 is not compatible."
exit 1
fi
echo -e "* Create server config file"
touch ${EL_CONFIG_FILE}
@ -40,8 +29,10 @@ printf "longpolling_port = ${EL_LONGPOLLING_PORT}\n" >> ${EL_CONFIG_FILE}
printf "addons_path = ${EL_HOME_ODOO}/addons,${EL_HOME}/addons/addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_web," >> ${EL_CONFIG_FILE}
if [[ $EL_MINIMAL_ADDONS = "False" ]]; then
if [[ ${EL_MINIMAL_ADDONS} = "False" ]]; then
printf "${EL_HOME}/addons/CybroOdoo_OpenHRMS," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/ERPLibre_erplibre_addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/ERPLibre_erplibre_theme_addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/MathBenTech_development," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/MathBenTech_odoo-business-spending-management-quebec-canada," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/MathBenTech_scrummer," >> ${EL_CONFIG_FILE}
@ -75,17 +66,28 @@ if [[ $EL_MINIMAL_ADDONS = "False" ]]; then
printf "${EL_HOME}/addons/OCA_business-requirement," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_commission," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_community-data-files," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_connector," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_connector-ecommerce," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_connector-interfaces," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_connector-jira," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_connector-telephony," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_contract," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_credit-control," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_crm," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_currency," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_data-protection," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_ddmrp," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_delivery-carrier," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_donation," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_e-commerce," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_edi," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_event," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_field-service," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_fleet," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_geospatial," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_helpdesk," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_hr," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_interface-github," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_knowledge," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_l10n-canada," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_maintenance," >> ${EL_CONFIG_FILE}
@ -94,6 +96,7 @@ if [[ $EL_MINIMAL_ADDONS = "False" ]]; then
printf "${EL_HOME}/addons/OCA_margin-analysis," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_mis-builder," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_multi-company," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_operating-unit," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_partner-contact," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_pos," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_product-attribute," >> ${EL_CONFIG_FILE}
@ -104,19 +107,34 @@ if [[ $EL_MINIMAL_ADDONS = "False" ]]; then
printf "${EL_HOME}/addons/OCA_purchase-workflow," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_queue," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_reporting-engine," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_rma," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_sale-reporting," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_sale-workflow," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_server-auth," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_server-backend," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_server-brand," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_server-env," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_server-tools," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_server-ux," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_social," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_stock-logistics-warehouse," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_storage," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_timesheet," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_vertical-association," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_vertical-hotel," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_vertical-isp," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_vertical-travel," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_website," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_website-cms," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/OCA_wms," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/SanteLibre_santelibre_addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/Smile-SA_odoo_addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/camptocamp_odoo-cloud-platform," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/dhongu_deltatech," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/it-projects-llc_odoo-saas-tools," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/itpp-labs_access-addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/itpp-labs_pos-addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/itpp-labs_website-addons," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/kinjal-sorathiya_Property-Management_odoo," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/muk-it_muk_base," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/muk-it_muk_dms," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/muk-it_muk_docs," >> ${EL_CONFIG_FILE}
@ -124,15 +142,20 @@ if [[ $EL_MINIMAL_ADDONS = "False" ]]; then
printf "${EL_HOME}/addons/muk-it_muk_quality," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/muk-it_muk_web," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/muk-it_muk_website," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/obayit_odoo_dhtmlxgantt," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/odooaktiv_QuotationRevision," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/odooaktiv_product_rating_app," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/odoomates_odooapps," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/openeducat_openeducat_erp," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/pledra_odoo-product-configurator," >> ${EL_CONFIG_FILE}
printf "${EL_HOME}/addons/tegin_medical-fhir," >> ${EL_CONFIG_FILE}
fi
printf "\n" >> ${EL_CONFIG_FILE}
printf "workers = 2\n" >> ${EL_CONFIG_FILE}
printf "max_cron_threads = 2\n" >> ${EL_CONFIG_FILE}
if [ ${EL_INSTALL_NGINX} = "True" ]; then
if [[ ${EL_INSTALL_NGINX} = "True" ]]; then
printf "xmlrpc_interface = 127.0.0.1\n" >> ${EL_CONFIG_FILE}
printf "netrpc_interface = 127.0.0.1\n" >> ${EL_CONFIG_FILE}
printf "proxy_mode = True\n" >> ${EL_CONFIG_FILE}
@ -142,22 +165,69 @@ echo -e "\n---- Install Odoo with addons module ----"
git submodule update --init
# Generate empty addons if missing
if [ ! -d "./addons/addons" ]; then
if [[ ! -d "./addons/addons" ]]; then
mkdir -p ./addons/addons
fi
echo -e "\n---- Create Virtual environment Python ----"
cd ${EL_HOME}
if [[ ${PYTHON37} = "True" ]]; then
python3.7 -m venv venv
elif [[ ${PYTHON36} = "True" ]]; then
python3.6 -m venv venv
PYENV_PATH=~/.pyenv
PYENV_VERSION_PATH=${PYENV_PATH}/versions/3.7.7
PYTHON_EXEC=${PYENV_VERSION_PATH}/bin/python
POETRY_PATH=~/.poetry
VENV_PATH=./.venv
VENV_REPO_PATH=${VENV_PATH}/repo
if [[ ! -d "${PYENV_PATH}" ]]; then
echo -e "\n---- Installing pyenv in ${PYENV_PATH} ----"
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
fi
echo -e "\n---- Export pyenv in ${PYENV_PATH} ----"
export PATH="${PYENV_PATH}/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
if [[ ! -d "${PYENV_VERSION_PATH}" ]]; then
echo -e "\n---- Installing python 3.7.7 with pyenv in ${PYENV_VERSION_PATH} ----"
yes n|pyenv install 3.7.7
fi
pyenv local 3.7.7
if [[ ! -d "${POETRY_PATH}" ]]; then
echo -e "\n---- Installing poetry for reliable python package ----"
# curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | ${PYTHON_EXEC}
curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py
python get-poetry.py -y --preview
fi
if [[ ! -d ${VENV_PATH} ]]; then
echo -e "\n---- Create Virtual environment Python ----"
if [[ -e ${PYTHON_EXEC} ]]; then
${PYTHON_EXEC} -m venv .venv
else
echo "Missing pyenv, please refer installation guide."
exit 1
fi
fi
cd -
# Install git-repo if missing
if [ ! -f "./venv/repo" ]; then
echo "Install git-repo from Google APIS"
curl https://storage.googleapis.com/git-repo-downloads/repo > ./venv/repo
chmod +x ./venv/repo
if [[ ! -f ${VENV_REPO_PATH} ]]; then
echo "\n---- Install git-repo from Google APIS ----"
curl https://storage.googleapis.com/git-repo-downloads/repo > ${VENV_REPO_PATH}
chmod +x ${VENV_REPO_PATH}
sed -i 1d ${VENV_REPO_PATH}
PYTHON_HASHBANG="#!./.venv/bin/python"
sed -i "1 i ${PYTHON_HASHBANG}" ${VENV_REPO_PATH}
fi
echo -e "\n---- Installing poetry dependency ----"
${VENV_PATH}/bin/pip install --upgrade pip
#/home/"${USER}"/.poetry/bin/poetry env use ${PYTHON_EXEC}
source $HOME/.poetry/env
poetry install
# Delete artifacts created by pip, cause error in next "poetry install"
rm -rf artifacts
# Link for dev
echo -e "\n---- Add link dependency in site-packages of Python ----"
ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/.venv/lib/python3.7/site-packages/

View file

@ -2,37 +2,7 @@
. ./env_var.sh
EL_USER=$(whoami)
EL_HOME=$PWD
EL_HOME_ODOO="${EL_HOME}/odoo"
#EL_INSTALL_WKHTMLTOPDF="True"
#EL_PORT="8069"
#EL_LONGPOLLING_PORT="8072"
#EL_SUPERADMIN="admin"
EL_CONFIG_FILE="${EL_HOME}/config.conf"
#EL_CONFIG="${EL_USER}"
#EL_MINIMAL_ADDONS="False"
#EL_INSTALL_NGINX="True"
#EL_MANIFEST_PROD="./manifest/default.xml"
#EL_MANIFEST_DEV="./manifest/default.dev.xml"
./script/install_locally.sh
# Update git-repo
./script/update_manifest_local_dev.sh
echo -e "\n---- Install python packages/requirements ----"
${EL_HOME}/venv/bin/pip3 install --upgrade pip
${EL_HOME}/venv/bin/pip3 install wheel phonenumbers
${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/odoo/requirements.txt"
${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/requirements.txt"
# For dev/testing
${EL_HOME}/venv/bin/pip3 install websocket-client
echo -e "\n---- Add link dependency in site-packages of Python ----"
if [[ ${PYTHON37} = "True" ]]; then
ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.7/site-packages/
elif [[ ${PYTHON36} = "True" ]]; then
ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.6/site-packages/
fi

View file

@ -2,37 +2,7 @@
. ./env_var.sh
EL_USER=$(whoami)
EL_HOME=$PWD
EL_HOME_ODOO="${EL_HOME}/odoo"
#EL_INSTALL_WKHTMLTOPDF="True"
#EL_PORT="8069"
#EL_LONGPOLLING_PORT="8072"
#EL_SUPERADMIN="admin"
EL_CONFIG_FILE="${EL_HOME}/config.conf"
#EL_CONFIG="${EL_USER}"
#EL_MINIMAL_ADDONS="False"
#EL_INSTALL_NGINX="True"
#EL_MANIFEST_PROD="./manifest/default.xml"
#EL_MANIFEST_DEV="./manifest/default.dev.xml"
./script/install_locally.sh
# Update git-repo
./script/update_manifest_prod.sh
echo -e "\n---- Install python packages/requirements ----"
${EL_HOME}/venv/bin/pip3 install --upgrade pip
${EL_HOME}/venv/bin/pip3 install wheel phonenumbers
${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/odoo/requirements.txt"
${EL_HOME}/venv/bin/pip3 install -r "${EL_HOME}/requirements.txt"
# For dev/testing
${EL_HOME}/venv/bin/pip3 install websocket-client
echo -e "\n---- Add link dependency in site-packages of Python ----"
if [[ ${PYTHON37} = "True" ]]; then
ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.7/site-packages/
elif [[ ${PYTHON36} = "True" ]]; then
ln -fs ${EL_HOME_ODOO}/odoo ${EL_HOME}/venv/lib/python3.6/site-packages/
fi

View file

@ -2,7 +2,7 @@
. ./env_var.sh
./script/install_debian_dependancy.sh
./script/install_debian_dependency.sh
echo -e "\n---- Create ERPLIBRE system user ----"
sudo adduser --system --quiet --shell=/bin/bash --home=/${EL_USER} --gecos 'ERPLIBRE' --group ${EL_USER}

View file

@ -0,0 +1,5 @@
#!/usr/bin/env bash
source $HOME/.poetry/env
poetry add -vv $(grep -v ";" ./.venv/build_dependency.txt | grep -v "*" )
# poetry add -vv $(grep -v ";" ./.venv/build_dependency.txt | grep -v "*" | sed 's/==/@^/' )
# poetry export -f ./.venv/build_dependency.txt --dev | poetry run -- pip install -r /dev/stdin

297
script/poetry_update.py Executable file
View file

@ -0,0 +1,297 @@
#!./.venv/bin/python
import os
import sys
import argparse
import logging
import toml
import ast
from collections import OrderedDict, defaultdict
from pathlib import Path
import iscompatible
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
from script import git_tool
_logger = logging.getLogger(__name__)
def get_config():
"""Parse command line arguments, extracting the config file name,
returning the union of config file and command line arguments
:return: dict of config file settings and command line arguments
"""
config = git_tool.GitTool.get_project_config()
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description='''\
Update pip dependency in Poetry, clear pyproject.toml, search all dependencies
from requirements.txt, search conflict version and generate a new list.
Launch Poetry installation.
''',
epilog='''\
'''
)
parser.add_argument('-d', '--dir', dest="dir", default="./",
help="Path of repo to change remote, including submodule.")
parser.add_argument('-f', '--force', action="store_true",
help="Force create new list of dependency, ignore poetry.lock.")
parser.add_argument('-v', '--verbose', action="store_true",
help="More information in execution, show stats.")
args = parser.parse_args()
return args
def get_lst_requirements_txt():
return list(Path(".").rglob("requirements.[tT][xX][tT]"))
def get_lst_manifest_py():
return list(Path(".").rglob("__manifest__.py"))
def combine_requirements(config):
"""
Search all module and version in all requirements.txt file in this project.
For each version, check compatibility and show warning with provenance file
Generate requirements.txt to "./.venv/build_dependency.txt"
:param config:
:return:
"""
priority_filename_requirement = "odoo/requirements.txt"
lst_sign = ("==", "!=", ">=", "<=", "<", ">", ";")
lst_requirements = []
ignore_requirements = ["sys_platform == 'win32'", "python_version < '3.7'"]
dct_requirements = defaultdict(set)
lst_requirements_file = get_lst_requirements_txt()
lst_requirements_with_condition = set()
dct_special_condition = defaultdict(list)
dct_requirements_module_filename = defaultdict(list)
for requirements_filename in lst_requirements_file:
with open(requirements_filename, 'r') as f:
for a in f.readlines():
b = a.strip()
if not b or b[0] == "#":
continue
# Regroup requirement
for sign in lst_sign:
if sign in b:
# Exception, some time the sign ; can be first, just check
if sign != ";" and ";" in b and b.find(sign) > b.find(";"):
module_name = b[:b.find(";")]
else:
module_name = b[:b.find(sign)]
module_name = module_name.strip()
# Special condition for ";", ignore it
if ";" in b:
for ignore_string in ignore_requirements:
if ignore_string in b:
break
if ignore_string in b:
break
lst_requirements_with_condition.add(module_name)
value = b[:b.find(";")].strip()
dct_special_condition[module_name].append(b)
else:
value = b
dct_requirements[module_name].add(value)
filename = str(requirements_filename)
dct_requirements_module_filename[value].append(filename)
break
else:
dct_requirements[b].add(b)
filename = str(requirements_filename)
dct_requirements_module_filename[b].append(filename)
lst_requirements.append(b)
dct_requirements = get_manifest_external_dependencies(dct_requirements)
dct_requirements_diff_version = {k: v for k, v in dct_requirements.items() if
len(v) > 1}
# dct_requirements_same_version = {k: v for k, v in dct_requirements.items() if
# len(v) == 1}
if config.verbose:
# TODO show total repo to compare lst requirements
print(f"Total requirements.txt {len(lst_requirements_file)}, "
f"total module {len(lst_requirements)}, "
f"unique module {len(dct_requirements)}, "
f"module with different version {len(dct_requirements_diff_version)}.")
if dct_requirements_diff_version:
# Validate compatibility
for key, lst_requirement in dct_requirements_diff_version.items():
result = None
lst_version_requirement = []
for requirement in lst_requirement:
if ".*" in requirement:
requirement = requirement.replace(".*", "")
result_number = iscompatible.parse_requirements(requirement)
if not result_number:
# Ignore empty version
continue
# Exception of missing feature in iscompatible
# TODO support me in iscompatible lib
no_version = result_number[0][1]
if "b" in no_version:
result_number[0] = result_number[0][0], no_version[
:no_version.find("b")]
elif not no_version[no_version.rfind(".") + 1:].isnumeric():
result_number[0] = result_number[0][0], no_version[
:no_version.rfind(".")]
result_number = iscompatible.string_to_tuple(result_number[0][1])
lst_version_requirement.append((requirement, result_number))
# Check compatibility with all possibility
is_compatible = True
if len(lst_version_requirement) > 1:
highest_value = sorted(lst_version_requirement, key=lambda tup: tup[1])[-1]
for version_requirement in lst_version_requirement:
is_compatible &= iscompatible.iscompatible(version_requirement[0],
highest_value[1])
if is_compatible:
result = highest_value[0]
else:
# Find the requirements file and print the conflict
# Take the version from Odoo by default, else take the more recent
odoo_value = None
for version_requirement in lst_version_requirement:
filename_1 = dct_requirements_module_filename.get(
version_requirement[0])
if priority_filename_requirement in filename_1:
odoo_value = version_requirement[0]
break
if odoo_value:
str_result_choose = f"Select {odoo_value} because from Odoo"
result = odoo_value
else:
result = highest_value[0]
str_result_choose = f"Select highest value {result}"
str_versions = " VS ".join(
[f"{a[0]} from {dct_requirements_module_filename.get(a[0])}" for
a in lst_version_requirement])
print(f"WARNING - Not compatible {str_versions} - "
f"{str_result_choose}.")
elif len(lst_version_requirement) == 1:
result = lst_version_requirement[0][0]
else:
result = key
if result:
dct_requirements[key] = set((result,))
else:
print(f"Internal error, missing result for {lst_requirement}.")
# Support ignored requirements
lst_ignore = get_list_ignored()
lst_ignored_key = []
for key in dct_requirements.keys():
for ignored in lst_ignore:
if ignored == key:
lst_ignored_key.append(key)
for key in lst_ignored_key:
del dct_requirements[key]
with open("./.venv/build_dependency.txt", 'w') as f:
f.writelines([f"{list(a)[0]}\n" for a in dct_requirements.values()])
def sorted_dependency_poetry(pyproject_filename):
# Open pyproject.toml
with open(pyproject_filename, 'r') as f:
dct_pyproject = toml.load(f)
# Get dependencies and update list, sorted
# [tool.poetry.dependencies]
tool = dct_pyproject.get("tool")
if tool:
poetry = tool.get("poetry")
if poetry:
dependencies = poetry.get("dependencies")
python_dependency = ("python", dependencies.get("python", ''))
lst_dependency = [(k, v) for k, v in dependencies.items() if k != "python"]
lst_dependency = sorted(lst_dependency, key=lambda tup: tup[0])
poetry["dependencies"] = OrderedDict([python_dependency] + lst_dependency)
# Rewrite pyproject.toml
with open(pyproject_filename, 'w') as f:
toml.dump(dct_pyproject, f)
def delete_dependency_poetry(pyproject_filename):
# Open pyproject.toml
with open(pyproject_filename, 'r') as f:
dct_pyproject = toml.load(f)
# Get dependencies and update list, sorted
# [tool.poetry.dependencies]
tool = dct_pyproject.get("tool")
if tool:
poetry = tool.get("poetry")
if poetry:
dependencies = poetry.get("dependencies")
python_dependency = ("python", dependencies.get("python", ''))
poetry["dependencies"] = OrderedDict([python_dependency])
# Rewrite pyproject.toml
with open(pyproject_filename, 'w') as f:
toml.dump(dct_pyproject, f)
def get_manifest_external_dependencies(dct_requirements):
lst_manifest_file = get_lst_manifest_py()
lst_dct_ext_depend = []
for manifest_file in lst_manifest_file:
with open(manifest_file, 'r') as f:
contents = f.read()
try:
dct = ast.literal_eval(contents)
except:
_logger.error(f"File {manifest_file} contains error, skip.")
continue
ext_depend = dct.get("external_dependencies")
if not ext_depend:
continue
python = ext_depend.get("python")
if not python:
continue
for depend in python:
requirement = dct_requirements.get(depend)
if requirement:
requirement.add(depend)
else:
dct_requirements[depend] = set([depend])
return dct_requirements
def call_poetry_add_build_dependency():
os.system("./script/poetry_add_build_dependency.sh")
def get_list_ignored():
with open("./ignore_requirements.txt", 'r') as f:
lst_ignore_requirements = [a.strip() for a in f.readlines()]
return lst_ignore_requirements
def main():
# repo = Repo(root_path)
# lst_repo = get_all_repo()
config = get_config()
pyproject_toml_filename = f'{config.dir}pyproject.toml'
delete_dependency_poetry(pyproject_toml_filename)
combine_requirements(config)
if config.force and os.path.isfile("./poetry.lock"):
os.remove("./poetry.lock")
call_poetry_add_build_dependency()
sorted_dependency_poetry(pyproject_toml_filename)
if __name__ == '__main__':
main()

82
script/pull_request_ERPLibre.py Executable file
View file

@ -0,0 +1,82 @@
#!./.venv/bin/python
import os
import sys
import argparse
import logging
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
CST_EL_GITHUB_TOKEN = "EL_GITHUB_TOKEN"
def get_config():
"""Parse command line arguments, extracting the config file name,
returning the union of config file and command line arguments
:return: dict of config file settings and command line arguments
"""
config = GitTool.get_project_config()
# TODO update description
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description='''\
''',
epilog='''\
'''
)
parser.add_argument('-d', '--dir', dest="dir", default="./",
help="Path of repo to change remote, including submodule.")
parser.add_argument('--organization', dest="organization", default="ERPLibre",
help="Choose organization to fork and change all repo.")
parser.add_argument('--github_token', dest="github_token",
default=config.get(CST_EL_GITHUB_TOKEN),
help="GitHub token generated by user")
args = parser.parse_args()
return args
def main():
config = get_config()
github_token = config.github_token
git_tool = GitTool()
if not github_token:
raise ValueError("Missing github_token")
organization_name = config.organization
lst_repo = git_tool.get_source_repo_addons(repo_path=config.dir, add_repo_root=True)
lst_repo_organization = [git_tool.get_transformed_repo_info_from_url(
a.get("url"), repo_path=config.dir, organization_force=organization_name,
is_submodule=a.get("is_submodule"), sub_path=a.get("sub_path"),
revision=a.get("revision"), clone_depth=a.get("clone_depth"))
for a in lst_repo]
url_not_found_count = 0
url_found_count = 0
i = 0
total = len(lst_repo_organization)
for repo in lst_repo_organization:
i += 1
print(f"Nb element {i}/{total} - {repo.project_name}")
url = repo.url
status = git_tool.get_pull_request_repo(upstream_url=url,
github_token=github_token,
organization_name=organization_name)
if status is False:
url_not_found_count += 1
else:
url_found_count += len(status)
print(f"Repository not found: {url_not_found_count}")
print(f"URL found: {url_found_count}")
if __name__ == '__main__':
main()

View file

@ -0,0 +1,117 @@
#!./.venv/bin/python
import os
import sys
import argparse
import logging
from pathlib import Path
from git import Repo # pip install gitpython
from git.exc import GitCommandError
new_path = os.path.normpath(os.path.join(os.path.dirname(__file__), '..'))
sys.path.append(new_path)
from script.git_tool import GitTool
_logger = logging.getLogger(__name__)
def get_config():
"""Parse command line arguments, extracting the config file name,
returning the union of config file and command line arguments
:return: dict of config file settings and command line arguments
"""
# TODO update description
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
description='''\
''',
epilog='''\
'''
)
parser.add_argument('-d', '--dir', dest="dir", default="./",
help="Path of repo to change remote, including submodule.")
args = parser.parse_args()
return args
def main():
config = get_config()
git_tool = GitTool()
lst_repo = git_tool.get_source_repo_addons(repo_path=config.dir,
add_repo_root=False)
lst_repo_organization = [git_tool.get_transformed_repo_info_from_url(
a.get("url"), repo_path=config.dir, get_obj=True,
is_submodule=a.get("is_submodule"), sub_path=a.get("sub_path"),
revision=a.get("revision"), clone_depth=a.get("clone_depth"))
for a in lst_repo]
lst_ignore_repo = ["odoo"]
i = 0
total = len(lst_repo)
branch_name = "12.0_dev"
for repo in lst_repo_organization:
i += 1
print(f"\nNb element {i}/{total} - {repo.path}")
is_checkout_branch = False
if repo.repo_name in lst_ignore_repo:
print(f"Ignore {repo.repo_name}.")
continue
git_repo = Repo(repo.relative_path)
# Force checkout branch if exist
try:
git_repo.git.checkout(branch_name)
is_checkout_branch = True
except GitCommandError:
try:
git_repo.git.checkout("-t", f"{repo.organization}/{branch_name}")
is_checkout_branch = True
except GitCommandError:
pass
has_change = get_manifest_external_dependencies(repo)
if has_change:
if not is_checkout_branch:
git_repo.git.checkout("-b", branch_name)
# change branch, commit and push
git_repo.git.add(".")
git_repo.git.commit("-m", "Set all module auto_install at False")
git_repo.git.push("-u", repo.organization, branch_name)
def get_lst_manifest_py(relative_path):
return list(Path(relative_path).rglob("__manifest__.py"))
def get_manifest_external_dependencies(repo):
has_change = False
lst_manifest_file = get_lst_manifest_py(repo.relative_path)
for manifest_file in lst_manifest_file:
has_change_manifest = False
with open(manifest_file, 'r') as f:
lst_content = f.readlines()
i = 0
for content in lst_content:
if "auto_install" in content and "True" in content:
has_change_manifest = True
has_change = True
first_char_index = content.find("auto_install")
index = content.find("True", first_char_index)
lst_content[i] = content[:index] + "False" + content[index + 4:]
i += 1
if has_change_manifest:
print(f"Update file {manifest_file}")
with open(manifest_file, 'w') as f:
f.writelines(lst_content)
return has_change
if __name__ == '__main__':
main()

View file

@ -6,6 +6,6 @@
#EL_MANIFEST_DEV="./manifest/default.dev.xml"
# Update git-repo
./venv/repo init -u http://git.erplibre.ca/ERPLibre -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_DEV}
#./venv/repo sync --force-sync
./venv/repo sync --force-sync -v
./.venv/repo init -u http://git.erplibre.ca/ERPLibre -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_DEV}
#./.venv/repo sync --force-sync
./.venv/repo sync --force-sync -v

View file

@ -9,7 +9,7 @@
git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
DAEMON_PID=$!
./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_DEV}
./venv/repo sync -v --force-sync -m ${EL_MANIFEST_DEV}
./.venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_DEV}
./.venv/repo sync -v --force-sync -m ${EL_MANIFEST_DEV}
kill ${DAEMON_PID}

View file

@ -10,7 +10,7 @@
git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
DAEMON_PID=$!
./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_EXP}
./venv/repo sync -v --force-sync -m ${EL_MANIFEST_EXP}
./.venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_EXP}
./.venv/repo sync -v --force-sync -m ${EL_MANIFEST_EXP}
kill ${DAEMON_PID}

View file

@ -9,7 +9,7 @@
git daemon --base-path=. --export-all --reuseaddr --informative-errors --verbose &
DAEMON_PID=$!
./venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_PROD}
./venv/repo sync -v -m ${EL_MANIFEST_PROD}
./.venv/repo init -u git://127.0.0.1:9418/ -b $(git rev-parse --abbrev-ref HEAD) -m ${EL_MANIFEST_PROD}
./.venv/repo sync -v -m ${EL_MANIFEST_PROD}
kill ${DAEMON_PID}

View file

@ -6,6 +6,6 @@
#EL_MANIFEST_DEV="./manifest/default.dev.xml"
# Update git-repo
./venv/repo init -u http://git.erplibre.ca/ERPLibre -b $(git rev-parse --abbrev-ref HEAD)
#./venv/repo sync --force-sync
./venv/repo sync -v
./.venv/repo init -u http://git.erplibre.ca/ERPLibre -b $(git rev-parse --abbrev-ref HEAD)
#./.venv/repo sync --force-sync
./.venv/repo sync -v

View file

@ -1,5 +1,6 @@
url,path,revision,clone-depth
https://github.com/ERPLibre/erplibre_addons.git,addons,,
https://github.com/ERPLibre/erplibre_theme_addons.git,addons,,
https://github.com/MathBenTech/development.git,addons,,
https://github.com/MathBenTech/odoo-business-spending-management-quebec-canada.git,addons,12.0_sale_order_line_timesheet_attribution,
https://github.com/MathBenTech/scrummer.git,addons,,
@ -14,7 +15,7 @@ https://github.com/Numigi/odoo-base-addons.git,addons,,
https://github.com/Numigi/odoo-entertainment-addons.git,addons,,
https://github.com/Numigi/odoo-git-addons.git,addons,,
https://github.com/Numigi/odoo-hr-addons.git,addons,,
https://github.com/Numigi/odoo-partner-addons.git,addons,12.0_partner_no_vat_improve_no_vat,
https://github.com/Numigi/odoo-partner-addons.git,addons,,
https://github.com/Numigi/odoo-product-addons.git,addons,,
https://github.com/Numigi/odoo-project-addons.git,addons,,
https://github.com/Numigi/odoo-purchase-addons.git,addons,,
@ -81,8 +82,41 @@ https://github.com/OCA/timesheet.git,addons,12.0_support_project_agile_timesheet
https://github.com/OCA/web.git,addons,,
https://github.com/OCA/website.git,addons,12.0_dev,
https://github.com/OCA/wms.git,addons,,
https://github.com/odoo/odoo.git,.,12.0_feature_5_star_CRM,1
https://github.com/odoo/odoo.git,.,ERPLibre/12.0,10
https://github.com/odooaktiv/QuotationRevision.git,addons,,
https://github.com/openeducat/openeducat_erp.git,addons,,
https://github.com/SanteLibre/santelibre_addons.git,addons,master,
https://github.com/Smile-SA/odoo_addons.git,addons,12.0_remote_autoinstall,
https://github.com/odooaktiv/product_rating_app.git,addons,,
https://github.com/pledra/odoo-product-configurator.git,addons,,
https://github.com/OCA/vertical-association.git,addons,,
https://github.com/OCA/delivery-carrier.git,addons,,
https://github.com/OCA/geospatial.git,addons,,
https://github.com/OCA/sale-reporting.git,addons,,
https://github.com/OCA/server-backend.git,addons,,
https://github.com/OCA/ddmrp.git,addons,,
https://github.com/OCA/vertical-hotel.git,addons,,
https://github.com/OCA/rma.git,addons,,
https://github.com/OCA/storage.git,addons,,
https://github.com/OCA/crm.git,addons,,
https://github.com/OCA/operating-unit.git,addons,,
https://github.com/OCA/connector-interfaces.git,addons,,
https://github.com/OCA/vertical-isp,addons,,
https://github.com/OCA/fleet.git,addons,,
https://github.com/OCA/connector-jira.git,addons,,
https://github.com/OCA/connector-ecommerce.git,addons,,
https://github.com/OCA/vertical-travel.git,addons,,
https://github.com/OCA/website-cms.git,addons,,
https://github.com/OCA/field-service.git,addons,,
https://github.com/OCA/interface-github.git,addons,,
https://github.com/obayit/odoo_dhtmlxgantt.git,addons,,
https://github.com/camptocamp/odoo-cloud-platform.git,addons,,
https://github.com/CybroOdoo/OpenHRMS.git,addons,,
https://github.com/dhongu/deltatech.git,addons,,
https://github.com/kinjal-sorathiya/Property-Management_odoo.git,addons,master,
https://github.com/tegin/medical-fhir.git,addons,,
https://github.com/odoomates/odooapps.git,addons,,
https://github.com/it-projects-llc/odoo-saas-tools.git,addons,,
https://github.com/itpp-labs/website-addons.git,addons,,
https://github.com/itpp-labs/access-addons.git,addons,,
https://github.com/itpp-labs/pos-addons.git,addons,,
https://github.com/OCA/connector.git,addons,,

1 url path revision clone-depth
2 https://github.com/ERPLibre/erplibre_addons.git addons
3 https://github.com/ERPLibre/erplibre_theme_addons.git addons
4 https://github.com/MathBenTech/development.git addons
5 https://github.com/MathBenTech/odoo-business-spending-management-quebec-canada.git addons 12.0_sale_order_line_timesheet_attribution
6 https://github.com/MathBenTech/scrummer.git addons
15 https://github.com/Numigi/odoo-entertainment-addons.git addons
16 https://github.com/Numigi/odoo-git-addons.git addons
17 https://github.com/Numigi/odoo-hr-addons.git addons
18 https://github.com/Numigi/odoo-partner-addons.git addons 12.0_partner_no_vat_improve_no_vat
19 https://github.com/Numigi/odoo-product-addons.git addons
20 https://github.com/Numigi/odoo-project-addons.git addons
21 https://github.com/Numigi/odoo-purchase-addons.git addons
82 https://github.com/OCA/web.git addons
83 https://github.com/OCA/website.git addons 12.0_dev
84 https://github.com/OCA/wms.git addons
85 https://github.com/odoo/odoo.git . 12.0_feature_5_star_CRM ERPLibre/12.0 1 10
86 https://github.com/odooaktiv/QuotationRevision.git addons
87 https://github.com/openeducat/openeducat_erp.git addons
https://github.com/SanteLibre/santelibre_addons.git addons master
88 https://github.com/Smile-SA/odoo_addons.git addons 12.0_remote_autoinstall
89 https://github.com/odooaktiv/product_rating_app.git addons
90 https://github.com/pledra/odoo-product-configurator.git addons
91 https://github.com/OCA/vertical-association.git addons
92 https://github.com/OCA/delivery-carrier.git addons
93 https://github.com/OCA/geospatial.git addons
94 https://github.com/OCA/sale-reporting.git addons
95 https://github.com/OCA/server-backend.git addons
96 https://github.com/OCA/ddmrp.git addons
97 https://github.com/OCA/vertical-hotel.git addons
98 https://github.com/OCA/rma.git addons
99 https://github.com/OCA/storage.git addons
100 https://github.com/OCA/crm.git addons
101 https://github.com/OCA/operating-unit.git addons
102 https://github.com/OCA/connector-interfaces.git addons
103 https://github.com/OCA/vertical-isp addons
104 https://github.com/OCA/fleet.git addons
105 https://github.com/OCA/connector-jira.git addons
106 https://github.com/OCA/connector-ecommerce.git addons
107 https://github.com/OCA/vertical-travel.git addons
108 https://github.com/OCA/website-cms.git addons
109 https://github.com/OCA/field-service.git addons
110 https://github.com/OCA/interface-github.git addons
111 https://github.com/obayit/odoo_dhtmlxgantt.git addons
112 https://github.com/camptocamp/odoo-cloud-platform.git addons
113 https://github.com/CybroOdoo/OpenHRMS.git addons
114 https://github.com/dhongu/deltatech.git addons
115 https://github.com/kinjal-sorathiya/Property-Management_odoo.git addons master
116 https://github.com/tegin/medical-fhir.git addons
117 https://github.com/odoomates/odooapps.git addons
118 https://github.com/it-projects-llc/odoo-saas-tools.git addons
119 https://github.com/itpp-labs/website-addons.git addons
120 https://github.com/itpp-labs/access-addons.git addons
121 https://github.com/itpp-labs/pos-addons.git addons
122 https://github.com/OCA/connector.git addons