diff --git a/.copier-answers.yml b/.copier-answers.yml
new file mode 100644
index 000000000..c8674fc07
--- /dev/null
+++ b/.copier-answers.yml
@@ -0,0 +1,23 @@
+# Do NOT update manually; changes here will be overwritten by Copier
+_commit: v1.20
+_src_path: gh:oca/oca-addons-repo-template
+ci: GitHub
+convert_readme_fragments_to_markdown: false
+generate_requirements_txt: true
+github_check_license: true
+github_ci_extra_env: {}
+github_enable_codecov: true
+github_enable_makepot: true
+github_enable_stale_action: true
+github_enforce_dev_status_compatibility: true
+include_wkhtmltopdf: false
+odoo_test_flavor: Both
+odoo_version: 13.0
+org_name: Odoo Community Association (OCA)
+org_slug: OCA
+rebel_module_groups: []
+repo_description: ''
+repo_name: Magento eCommerce Connector
+repo_slug: connector-magento
+repo_website: https://github.com/OCA/connector-magento
+
diff --git a/.eslintrc.yml b/.eslintrc.yml
index 88f2881b4..fed88d70d 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -1,9 +1,16 @@
env:
browser: true
+ es6: true
# See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449
parserOptions:
- ecmaVersion: 2017
+ ecmaVersion: 2019
+
+overrides:
+ - files:
+ - "**/*.esm.js"
+ parserOptions:
+ sourceType: module
# Globals available in Odoo that shouldn't produce errorings
globals:
@@ -14,7 +21,8 @@ globals:
moment: readonly
odoo: readonly
openerp: readonly
- Promise: readonly
+ owl: readonly
+ luxon: readonly
# Styling is handled by Prettier, so we only need to enable AST rules;
# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
diff --git a/.flake8 b/.flake8
index 44ed868f7..e397e8ed4 100644
--- a/.flake8
+++ b/.flake8
@@ -1,5 +1,5 @@
[flake8]
-max-line-length = 80
+max-line-length = 88
max-complexity = 16
# B = bugbear
# B9 = bugbear opinionated (incl line length)
@@ -8,3 +8,5 @@ select = C,E,F,W,B,B9
# E501: flake8 line length (covered by bugbear B950)
# W503: line break before binary operator (black behaviour)
ignore = E203,E501,W503
+per-file-ignores=
+ __init__.py:F401
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
new file mode 100644
index 000000000..e638c6f64
--- /dev/null
+++ b/.github/workflows/pre-commit.yml
@@ -0,0 +1,46 @@
+name: pre-commit
+
+on:
+ pull_request:
+ branches:
+ - "13.0*"
+ push:
+ branches:
+ - "13.0"
+ - "13.0-ocabot-*"
+
+jobs:
+ pre-commit:
+ runs-on: ubuntu-20.04
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v2
+ with:
+ python-version: "3.8"
+ - name: Get python version
+ run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
+ - uses: actions/cache@v1
+ with:
+ path: ~/.cache/pre-commit
+ key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }}
+ - name: Install pre-commit
+ run: pip install pre-commit
+ - name: Run pre-commit
+ run: pre-commit run --all-files --show-diff-on-failure --color=always
+ env:
+ # Consider valid a PR that changes README fragments but doesn't
+ # change the README.rst file itself. It's not really a problem
+ # because the bot will update it anyway after merge. This way, we
+ # lower the barrier for functional contributors that want to fix the
+ # readme fragments, while still letting developers get README
+ # auto-generated (which also helps functionals when using runboat).
+ # DOCS https://pre-commit.com/#temporarily-disabling-hooks
+ SKIP: oca-gen-addon-readme
+ - name: Check that all files generated by pre-commit are in git
+ run: |
+ newfiles="$(git ls-files --others --exclude-from=.gitignore)"
+ if [ "$newfiles" != "" ] ; then
+ echo "Please check-in the following files:"
+ echo "$newfiles"
+ exit 1
+ fi
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 000000000..1693a1253
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,69 @@
+name: Mark stale issues and pull requests
+
+on:
+ schedule:
+ - cron: "0 12 * * 0"
+
+jobs:
+ stale:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Stale PRs and issues policy
+ uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ # General settings.
+ ascending: true
+ remove-stale-when-updated: true
+ # Pull Requests settings.
+ # 120+30 day stale policy for PRs
+ # * Except PRs marked as "no stale"
+ days-before-pr-stale: 120
+ days-before-pr-close: 30
+ exempt-pr-labels: "no stale"
+ stale-pr-label: "stale"
+ stale-pr-message: >
+ There hasn't been any activity on this pull request in the past 4 months, so
+ it has been marked as stale and it will be closed automatically if no
+ further activity occurs in the next 30 days.
+
+ If you want this PR to never become stale, please ask a PSC member to apply
+ the "no stale" label.
+ # Issues settings.
+ # 180+30 day stale policy for open issues
+ # * Except Issues marked as "no stale"
+ days-before-issue-stale: 180
+ days-before-issue-close: 30
+ exempt-issue-labels: "no stale,needs more information"
+ stale-issue-label: "stale"
+ stale-issue-message: >
+ There hasn't been any activity on this issue in the past 6 months, so it has
+ been marked as stale and it will be closed automatically if no further
+ activity occurs in the next 30 days.
+
+ If you want this issue to never become stale, please ask a PSC member to
+ apply the "no stale" label.
+
+ # 15+30 day stale policy for issues pending more information
+ # * Issues that are pending more information
+ # * Except Issues marked as "no stale"
+ - name: Needs more information stale issues policy
+ uses: actions/stale@v4
+ with:
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
+ ascending: true
+ only-labels: "needs more information"
+ exempt-issue-labels: "no stale"
+ days-before-stale: 15
+ days-before-close: 30
+ days-before-pr-stale: -1
+ days-before-pr-close: -1
+ remove-stale-when-updated: true
+ stale-issue-label: "stale"
+ stale-issue-message: >
+ This issue needs more information and there hasn't been any activity
+ recently, so it has been marked as stale and it will be closed automatically
+ if no further activity occurs in the next 30 days.
+
+ If you think this is a mistake, please ask a PSC member to remove the "needs
+ more information" label.
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 000000000..8a262b182
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,69 @@
+name: tests
+
+on:
+ pull_request:
+ branches:
+ - "13.0*"
+ push:
+ branches:
+ - "13.0"
+ - "13.0-ocabot-*"
+
+jobs:
+ unreleased-deps:
+ runs-on: ubuntu-latest
+ name: Detect unreleased dependencies
+ steps:
+ - uses: actions/checkout@v3
+ - run: |
+ for reqfile in requirements.txt test-requirements.txt ; do
+ if [ -f ${reqfile} ] ; then
+ result=0
+ # reject non-comment lines that contain a / (i.e. URLs, relative paths)
+ grep "^[^#].*/" ${reqfile} || result=$?
+ if [ $result -eq 0 ] ; then
+ echo "Unreleased dependencies found in ${reqfile}."
+ exit 1
+ fi
+ fi
+ done
+ test:
+ runs-on: ubuntu-20.04
+ container: ${{ matrix.container }}
+ name: ${{ matrix.name }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - container: ghcr.io/oca/oca-ci/py3.6-odoo13.0:latest
+ name: test with Odoo
+ - container: ghcr.io/oca/oca-ci/py3.6-ocb13.0:latest
+ name: test with OCB
+ makepot: "true"
+ services:
+ postgres:
+ image: postgres:9.6
+ env:
+ POSTGRES_USER: odoo
+ POSTGRES_PASSWORD: odoo
+ POSTGRES_DB: odoo
+ ports:
+ - 5432:5432
+ steps:
+ - uses: actions/checkout@v3
+ with:
+ persist-credentials: false
+ - name: Install addons and dependencies
+ run: oca_install_addons
+ - name: Check licenses
+ run: manifestoo -d . check-licenses
+ - name: Check development status
+ run: manifestoo -d . check-dev-status --default-dev-status=Beta
+ - name: Initialize test db
+ run: oca_init_test_database
+ - name: Run tests
+ run: oca_run_tests
+ - uses: codecov/codecov-action@v1
+ - name: Update .pot files
+ run: oca_export_and_push_pot https://x-access-token:${{ secrets.GIT_PUSH_TOKEN }}@github.com/${{ github.repository }}
+ if: ${{ matrix.makepot == 'true' && github.event_name == 'push' && github.repository_owner == 'OCA' }}
diff --git a/.gitignore b/.gitignore
index 890ff0109..0090721f5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,9 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
+/.venv
+/.pytest_cache
+/.ruff_cache
# C extensions
*.so
@@ -13,7 +16,6 @@ build/
develop-eggs/
dist/
eggs/
-lib/
lib64/
parts/
sdist/
@@ -21,6 +23,7 @@ var/
*.egg-info/
.installed.cfg
*.egg
+*.eggs
# Installer logs
pip-log.txt
@@ -40,6 +43,19 @@ coverage.xml
# Pycharm
.idea
+# Eclipse
+.settings
+
+# Visual Studio cache/options directory
+.vs/
+.vscode
+
+# OSX Files
+.DS_Store
+
+# Django stuff:
+*.log
+
# Mr Developer
.mr.developer.cfg
.project
@@ -54,3 +70,6 @@ docs/_build/
# Backup files
*~
*.swp
+
+# OCA rules
+!static/lib/
diff --git a/.isort.cfg b/.isort.cfg
index 7683badfa..0ec187efd 100644
--- a/.isort.cfg
+++ b/.isort.cfg
@@ -10,3 +10,4 @@ known_odoo=odoo
known_odoo_addons=odoo.addons
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
default_section=THIRDPARTY
+ensure_newline_before_comments = True
diff --git a/.oca_hooks.cfg b/.oca_hooks.cfg
new file mode 100644
index 000000000..1f3e3e426
--- /dev/null
+++ b/.oca_hooks.cfg
@@ -0,0 +1,2 @@
+[MESSAGES_CONTROL]
+disable=xml-deprecated-data-node,xml-deprecated-tree-attribute
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 6c30e9008..41b346002 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,38 +1,72 @@
exclude: |
(?x)
+ # NOT INSTALLABLE ADDONS
+ # END NOT INSTALLABLE ADDONS
# Files and folders generated by bots, to avoid loops
^setup/|/static/description/index\.html$|
+ # We don't want to mess with tool-generated files
+ .svg$|/tests/([^/]+/)?cassettes/|^.copier-answers.yml$|^.github/|
# Maybe reactivate this when all README files include prettier ignore tags?
^README\.md$|
# Library files can have extraneous formatting (even minimized)
/static/(src/)?lib/|
# Repos using Sphinx to generate docs don't need prettying
^docs/_templates/.*\.html$|
+ # Ignore build and dist directories in addons
+ /build/|/dist/|
# You don't usually want a bot to modify your legal texts
(LICENSE.*|COPYING.*)
default_language_version:
- python: python3
+ python: python3.8
node: "14.13.0"
repos:
+ - repo: local
+ hooks:
+ # These files are most likely copier diff rejection junks; if found,
+ # review them manually, fix the problem (if needed) and remove them
+ - id: forbidden-files
+ name: forbidden files
+ entry: found forbidden files; remove them
+ language: fail
+ files: "\\.rej$"
+ - id: en-po-files
+ name: en.po files cannot exist
+ entry: found a en.po file
+ language: fail
+ files: '[a-zA-Z0-9_]*/i18n/en\.po$'
+ - repo: https://github.com/oca/maintainer-tools
+ rev: ab1d7f6
+ hooks:
+ # update the NOT INSTALLABLE ADDONS section above
+ - id: oca-update-pre-commit-excluded-addons
+ - id: oca-fix-manifest-website
+ args: ["https://github.com/OCA/connector-magento"]
+ - repo: https://github.com/myint/autoflake
+ rev: v1.4
+ hooks:
+ - id: autoflake
+ args:
+ - --expand-star-imports
+ - --ignore-init-module-imports
+ - --in-place
+ - --remove-all-unused-imports
+ - --remove-duplicate-keys
+ - --remove-unused-variables
- repo: https://github.com/psf/black
rev: 19.10b0
hooks:
- id: black
- - repo: https://github.com/prettier/pre-commit
- rev: "v1.19.1"
+ additional_dependencies: ["click<8.1.0"]
+ - repo: https://github.com/pre-commit/mirrors-prettier
+ rev: v1.19.1
hooks:
- id: prettier
- # TODO Avoid awebdeveloper/pre-commit-prettier if possible
- # HACK https://github.com/prettier/prettier/issues/7407
- - repo: https://github.com/awebdeveloper/pre-commit-prettier
- rev: v0.0.1
- hooks:
- - id: prettier
- name: prettier xml plugin
+ name: prettier (with plugin-xml)
+ entry: prettier --write --list-different
additional_dependencies:
- "prettier@1.19.1"
- "@prettier/plugin-xml@0.7.2"
- files: \.xml$
+ files: \.(css|htm|html|js|json|jsx|less|md|scss|toml|ts|xml|yaml|yml)$
- repo: https://github.com/pre-commit/mirrors-eslint
rev: v6.8.0
hooks:
@@ -63,34 +97,11 @@ repos:
- id: check-xml
- id: mixed-line-ending
args: ["--fix=lf"]
- - repo: https://gitlab.com/pycqa/flake8
- rev: 3.7.9
- hooks:
- - id: flake8
- name: flake8 except __init__.py
- exclude: /__init__\.py$
- additional_dependencies: ["flake8-bugbear==19.8.0"]
- - id: flake8
- name: flake8 only __init__.py
- args: ["--extend-ignore=F401"] # ignore unused imports in __init__.py
- files: /__init__\.py$
- additional_dependencies: ["flake8-bugbear==19.8.0"]
- - repo: https://github.com/pre-commit/mirrors-pylint
- rev: v2.5.3
- hooks:
- - id: pylint
- name: pylint with optional checks
- args: ["--rcfile=.pylintrc", "--exit-zero"]
- verbose: true
- additional_dependencies: ["pylint-odoo==3.5.0"]
- - id: pylint
- name: pylint with mandatory checks
- args: ["--rcfile=.pylintrc-mandatory"]
- additional_dependencies: ["pylint-odoo==3.5.0"]
- repo: https://github.com/asottile/pyupgrade
rev: v1.26.2
hooks:
- id: pyupgrade
+ args: ["--keep-percent-format"]
- repo: https://github.com/pre-commit/mirrors-isort
rev: v4.3.21
hooks:
@@ -98,6 +109,35 @@ repos:
name: isort except __init__.py
exclude: /__init__\.py$
- repo: https://github.com/acsone/setuptools-odoo
- rev: 2.5.2
+ rev: 3.1.8
hooks:
- id: setuptools-odoo-make-default
+ - id: setuptools-odoo-get-requirements
+ args:
+ - --output
+ - requirements.txt
+ - --header
+ - "# generated from manifests external_dependencies"
+ - repo: https://github.com/PyCQA/flake8
+ rev: 3.7.9
+ hooks:
+ - id: flake8
+ name: flake8
+ additional_dependencies: ["flake8-bugbear==19.8.0"]
+ - repo: https://github.com/pre-commit/mirrors-pylint
+ rev: v2.5.3
+ hooks:
+ - id: pylint
+ name: pylint with optional checks
+ args:
+ - --rcfile=.pylintrc
+ - --exit-zero
+ verbose: true
+ additional_dependencies: &pylint_deps
+ - pylint-odoo==3.5.0
+ - id: pylint
+ name: pylint with mandatory checks
+ args:
+ - --rcfile=.pylintrc-mandatory
+ additional_dependencies: *pylint_deps
+
diff --git a/.prettierrc.yml b/.prettierrc.yml
index fc5f3a7c4..5b6d4b361 100644
--- a/.prettierrc.yml
+++ b/.prettierrc.yml
@@ -5,4 +5,4 @@ printWidth: 88
proseWrap: always
semi: true
trailingComma: "es5"
-xmlWhitespaceSensitivity: "ignore"
+xmlWhitespaceSensitivity: "strict"
diff --git a/.pylintrc b/.pylintrc
index 485836baf..20d850dfe 100644
--- a/.pylintrc
+++ b/.pylintrc
@@ -1,3 +1,5 @@
+
+
[MASTER]
load-plugins=pylint_odoo
score=n
@@ -46,8 +48,6 @@ enable=anomalous-backslash-in-string,
method-inverse,
method-required-super,
method-search,
- missing-import-error,
- missing-manifest-dependency,
openerp-exception-warning,
pointless-statement,
pointless-string-statement,
@@ -73,6 +73,7 @@ enable=anomalous-backslash-in-string,
deprecated-module,
file-not-used,
invalid-commit,
+ missing-manifest-dependency,
missing-newline-extrafiles,
missing-readme,
no-utf8-coding-comment,
@@ -82,6 +83,7 @@ enable=anomalous-backslash-in-string,
too-complex,
unnecessary-utf8-coding-comment
+
[REPORTS]
msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}
output-format=colorized
diff --git a/.pylintrc-mandatory b/.pylintrc-mandatory
index 55893fe8b..1c8f3771f 100644
--- a/.pylintrc-mandatory
+++ b/.pylintrc-mandatory
@@ -1,3 +1,4 @@
+
[MASTER]
load-plugins=pylint_odoo
score=n
@@ -39,8 +40,6 @@ enable=anomalous-backslash-in-string,
method-inverse,
method-required-super,
method-search,
- missing-import-error,
- missing-manifest-dependency,
openerp-exception-warning,
pointless-statement,
pointless-string-statement,
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 6716bfade..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-language: python
-cache:
- directories:
- - $HOME/.cache/pip
- - $HOME/.cache/pre-commit
-
-python:
- - "3.6"
-
-addons:
- postgresql: "9.6"
- apt:
- packages:
- - expect-dev # provides unbuffer utility
-
-stages:
- - linting
- - test
-
-jobs:
- include:
- - stage: linting
- name: "pre-commit"
- before_install:
- install: pip install pre-commit
- script: pre-commit run --all --show-diff-on-failure --verbose --color always
- after_success:
- - stage: test
- env:
- - TESTS="1" ODOO_REPO="odoo/odoo" MAKEPOT="1"
- - stage: test
- env:
- - TESTS="1" ODOO_REPO="OCA/OCB"
-
-env:
- global:
- - VERSION="13.0" TESTS="0" LINT_CHECK="0" MAKEPOT="0"
-
-install:
- - git clone --depth=1 https://github.com/OCA/maintainer-quality-tools.git
- ${HOME}/maintainer-quality-tools
- - export PATH=${HOME}/maintainer-quality-tools/travis:${PATH}
- - travis_install_nightly
-
-script:
- - travis_run_tests
-
-after_success:
- - travis_after_tests_success
diff --git a/LICENSE b/LICENSE
index 58777e31a..be3f7b28e 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,7 +1,7 @@
-GNU AFFERO GENERAL PUBLIC LICENSE
+ GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
- Copyright (C) 2007 Free Software Foundation, Inc.
+ Copyright (C) 2007 Free Software Foundation, Inc.
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -633,8 +633,8 @@ the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published
- by the Free Software Foundation, either version 3 of the License, or
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
@@ -643,7 +643,7 @@ the "copyright" line and a pointer to where the full notice is found.
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see .
+ along with this program. If not, see .
Also add information on how to contact you by electronic and paper mail.
@@ -658,4 +658,4 @@ specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
-.
+.
diff --git a/README.md b/README.md
index 87947b39a..7ce7efdfe 100644
--- a/README.md
+++ b/README.md
@@ -1,21 +1,37 @@
-[![Build Status](https://travis-ci.org/OCA/connector-magento.svg?branch=13.0)](https://travis-ci.org/OCA/connector-magento)
-[![Coverage Status](https://coveralls.io/repos/OCA/connector-magento/badge.svg?branch=13.0)](https://coveralls.io/r/OCA/connector-magento?branch=13.0)
-Odoo Connector Magento Modules
-==============================
+[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/connector-magento&target_branch=13.0)
+[![Pre-commit Status](https://github.com/OCA/connector-magento/actions/workflows/pre-commit.yml/badge.svg?branch=13.0)](https://github.com/OCA/connector-magento/actions/workflows/pre-commit.yml?query=branch%3A13.0)
+[![Build Status](https://github.com/OCA/connector-magento/actions/workflows/test.yml/badge.svg?branch=13.0)](https://github.com/OCA/connector-magento/actions/workflows/test.yml?query=branch%3A13.0)
+[![codecov](https://codecov.io/gh/OCA/connector-magento/branch/13.0/graph/badge.svg)](https://codecov.io/gh/OCA/connector-magento)
+[![Translation Status](https://translation.odoo-community.org/widgets/connector-magento-13-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/connector-magento-13-0/?utm_source=widget)
-*Odoo Magento Connector (also known as MagentoERPconnect) is a bi-directional connector, 100% compatible with the last OpenERP 13.0 and latest Magento versions (1.x).*
+
-This new release of MagentoERPconnect is based on the [OpenERP Connector framework](https://github.com/OCA/connector).
+# Magento eCommerce Connector
-The mailing list for this project is named 'Connectors' and is on https://odoo-community.org/groups
-Documentation:
-http://www.odoo-magento-connector.com
-http://www.odoo-connector.com
+
+
-Translation Status
-------------------
-[![Transifex Status](https://www.transifex.com/projects/p/OCA-connector-magento-13-0/chart/image_png)](https://www.transifex.com/projects/p/OCA-connector-magento-13-0)
+[//]: # (addons)
+
+This part will be replaced when running the oca-gen-addons-table script from OCA/maintainer-tools.
+
+[//]: # (end addons)
+
+
+
+## Licenses
+
+This repository is licensed under [AGPL-3.0](LICENSE).
+
+However, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA)
+policy. Consult each module's `__manifest__.py` file, which contains a `license` key
+that explains its license.
+
+----
+OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit
+organization whose mission is to support the collaborative development of Odoo features
+and promote its widespread use.