Skip to main content

odoo-pre-commit-hooks to use in pre-commit-config.yml files

Project description

Build Status codecov version wheel supported-versions commits-since code-style-black


OCA's custom pre-commit hooks for Odoo modules


You don't need to install it directly only configure your ".pre-commit-config.yaml" file

You even can install it directly:

  • Installing from pypi:

    • pip install -U oca-odoo-pre-commit-hooks
  • Installing from github:

    • pip install --force-reinstall -U git+

Usage pre-commit-config.yaml

Add to your ".pre-commit-config.yaml" configuration file the following input

    - repo:
        rev: v0.0.31
        - id: oca-checks-odoo-module
        - id: oca-checks-po
          args: ["--fix"]

Usage directly the entry points

If you install directly the package use the entry point:

oca-checks-odoo-module --help
oca-checks-po --help

Skip one xml-check for only one file

If you need to skip one check in one particular XML file you can use the follow comment

<?xml version="1.0" encoding="utf-8"?>
<!-- oca-hooks:disable=xml-check-to-skip -->
<?xml version="1.0" encoding="utf-8"?>
<!-- oca-hooks:disable=xml-check-to-skip,
                       xml-check-to-skip2 -->

The position of the comment it is not relative to the line that throw the check

It disable the entire file


Behavior can be configured through several methods and as of now only consists of enabling/disabling checks.

Enabling or Disabling Checks

Each available hook consists of multiple checks which can be enabled/disabled using any of the following methods (ordered by priority):

  1. As an argument e.g., oca-checks-odoo --enable=check-to-enable --disable=check-to-disable1,check-to-disable2
  2. Using environment variables OCA_HOOKS_ENABLE or OCA_HOOKS_DISABLE e.g., export OCA_HOOKS_ENABLE=check1,check2
  3. A configuration file. The path to it can be specified with the argument --config. Alternatively a file named .oca_hooks.cfg will be looked for (by default) in the following locations (in order):
    1. Current working directory
    2. Repo's root
    3. User's home

Using a Configuration File

To enable or disable checks using a configuration file, add a disable or enable key under the MESSAGES_CONTROL section. For example:


As stated before, each source has a certain priority. This means that if the environment variable OCA_HOOKS_ENABLE=check1 exists, the configuration file above would not have any effect when it comes to enabling checks, and the only enabled check will be check1.

However, if OCA_HOOKS_DISABLE is not set, the configuration file will still have an effect and check-to-disable will be disabled.


  • Check manifest-syntax-error Check if the manifest file has syntax error

  • Check csv-duplicate-record-id duplicate CSV "id" AKA xmlid but for CSV files

  • Check csv-syntax-error Check syntax error for CSV files declared in the manifest

  • Check xml-deprecated-data-node Deprecated node inside xml node

  • Check xml-deprecated-openerp-node deprecated xml node

  • Check xml-deprecated-qweb-directive for use of deprecated QWeb directives t-*-options

  • Check xml-not-valid-char-link The resource in in src/href contains a not valid character.

  • Check xml-oe-structure-missing-id

      Ensure all tags with class 'oe_structure' have an ID. For more information on the rationale, see:
  • Check xml-redundant-module-name

      If the module is called "module_a" and the xmlid is
      `<record id="module_a.xmlid_name1" ...`
      The "module_a." is redundant it could be replaced to only
      `<record id="xmlid_name1" ...`
  • Check xml-dangerous-filter-wo-user Check dangerous filter without a user assigned.

  • Check xml-create-user-wo-reset-password records of user without context="{'no_reset_password': True}" This context avoid send email and mail log warning

  • Check xml-view-dangerous-replace-low-priority in ir.ui.view

          <field name="priority" eval="10"/>
              <field name="name" position="replace"/>
  • Check xml-deprecated-tree-attribute The tree-view declaration is using a deprecated attribute.

  • Check xml-record-missing-id Generated when a tag has no id.

  • Check xml-duplicate-record-id

      If a module has duplicated record_id AKA xml_ids
          <record id="xmlid_name1"
          <record id="xmlid_name1"
  • Check xml-duplicate-fields in all record nodes <record id="xmlid_name1"... <field name="field_name1"... <field name="field_name1"...

  • Check xml-syntax-error Check syntax of XML files declared in the Odoo manifest

  • Check xml-dangerous-qweb-replace-low-priority Dangerous qweb view defined with low priority

  • Check xml-duplicate-template-id Triggered when two templates share the same ID

  • Check xml-xpath-translatable-item check xpath nodes using contains(text(), 'Text translatable') Since that the text could be translated so it is a mutable value. It could raise ValueError exception if the language is changed.

Checks PO

  • Check po-requires-module Translation entry requires comment #. module: MODULE

  • Check po-python-parse-printf Check if msgid is using str variables like %s So translation msgstr must be the same number of variables too

  • Check po-python-parse-format Check if msgid is using str variables like {} So translation msgstr must be the same number of variables too

  • Check po-duplicate-message-definition (message-id) in all entries of PO files

  • Check po-duplicate-model-definition Verify that no entries share the same 'model:' tag

  • Check po-pretty-format Check the following: 1. Entries sorted alphabetically 2. Lines are wrapped at 78 columns (same as Odoo) 3. Clear msgstr when it is the same as msgid

  • Check po-syntax-error Check syntax of PO files from i18n* folders


usage: oca-checks-odoo-module [-h] [--no-verbose] [--no-exit] [--disable DISABLE] [--enable ENABLE] [--config CONFIG] [--list-msgs] [--fix] [files_or_modules ...]

positional arguments:
 files_or_modules Odoo paths or Odoo module paths.

 -h, --help show this help message and exit
 --no-verbose If enabled so disable verbose mode.
 --no-exit If enabled so it will not call exit.
 --disable DISABLE, -d DISABLE Disable the checker with the given 'check-name', separated by commas.
 --enable ENABLE, -e ENABLE Enable the checker with the given 'check-name', separated by commas. Default: All checks are enabled by default
 --config CONFIG, -c CONFIG Path to a configuration file (default: .oca_hooks.cfg)
 --list-msgs List all currently enabled messages.
 --fix Automatically fix files when possible

Help PO

usage: oca-checks-po [-h] [--no-verbose] [--no-exit] [--disable DISABLE] [--enable ENABLE] [--config CONFIG] [--list-msgs] [--fix] [po_files ...]

positional arguments:
 po_files PO files.

 -h, --help show this help message and exit
 --no-verbose If enabled so disable verbose mode.
 --no-exit If enabled so it will not call exit.
 --disable DISABLE, -d DISABLE Disable the checker with the given 'check-name', separated by commas.
 --enable ENABLE, -e ENABLE Enable the checker with the given 'check-name', separated by commas. Default: All checks are enabled by default
 --config CONFIG, -c CONFIG Path to a configuration file (default: .oca_hooks.cfg)
 --list-msgs List all currently enabled messages.
 --fix Automatically fix files when possible


Examples PO


This repository is licensed under AGPL-3.0.

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.



  • [REF] setup: Add py3.12 support info (#98)
  • [REF] .github: Update actions version, fix cache and update lints (#97)
  • [REF] tests: Fixing windows po autofix unitest (#96)


  • CI improvements (#93)
  • [REF] setup: Enable py311 classifier (#87)


  • IMP] add xml-duplicate-template-id message (#82)
  • [FIX] lints (#86)
  • [ADD] po-duplicate-model-definition check (#85)
  • [REF] Don't filter out messages, move is_message_enabled (#83)
  • [IMP] add xml-record-missing-id (#84)


  • [FIX] oe-structure-missing-id: change constraints, add docs (#81)


  • [REF] improve xpath expressions (#80)


  • [IMP] Improve XPath expressions, compile them only once, fix false negative, add profiling tests (#79)
  • [ADD] pretty-format-po check (#76)
  • [IMP] add xml-oe-structure-missing-id check (#78)
  • [REF] tests: Generate immutable readme (without extra spaces)
  • [IMP] README: Added a section on configuration


  • [REF] requirements.txt: Update polib to fix issues and improves (#72)


  • [FIX] pre-commit: Fix isort hook - RuntimeError The Poetry configuration is invalid (#71)


  • [FIX] Correct documentation (#69)


  • [IMP] Help msg for "xml-view-dangerous-replace-low-priority" (#68)
  • Wrote documentation for proposed refactoring (#66)
  • [FIX] ci: update flake8 repo URL, tox.ini and gh actions .yml (#65)
  • [REF] hooks: Add support for `` (#62)


  • [REF] duplicate-xml-fields: Only applies to direct record's children (#58)


  • [FIX] xml-xpath-translatable-item: Fix false negative calling a method o.amount_to_text() (#57)


  • [FIX] setup: Add missing "requirements.txt" file to package (#441) (#55)


  • [FIX] checks_odoo_module: Support glob expression for "qweb" manifest data section (#54)
  • [IMP] oca_pre_commit_hooks: Add --list-msgs option (#53)
  • [REF] oca_pre_commit_hooks: Silent subprocess git error (#52)


  • [IMP] oca_pre_commit_hooks: Support enable/disable from ENV (#38) (#49)


  • [ADD] xml-xpath-translatable-item: Add new check to identify mutable item used from xpath (#50)


  • [FIX] oca_pre_commit_hooks: Fix exit_status false error (#48)


  • [IMP] oca_pre_commit_hooks: Support for config file (#41)


  • [REF] pylint_odoo: Remove TODO comments (#47)
  • [REF] requirements: Remove unused libraries and pre-commit hooks (#45)
  • [REF] xml-deprecated-data-node: Use the data node sourceline instead of odoo node (#43)
  • [IMP] oca_pre_commit_hooks: Support disable XML checks from disable comments (#42)
  • [REF] README: Fix name of pypi package (#35)
  • [REF] oca_pre_commit_hooks: cli_po, cli: Add cli_po and cli global (#36)
  • [REF] setup: Match requires-python = ">=3.7" from pre-commit
  • [REF] CI: Enable py3.11


  • [REF] checks_odoo_module_xml: Allow duplicated fields with 'groups' (#32)
  • [REF] CI: Enable tox with parallels + codecov compatibility (#33)


  • [REF] codecov: Enable codecov again
  • [REM] missing-readme: Check add to pylint-odoo
  • [REF] TOX: Strip names, remove no-cover, compatible with parallels option (#24)
  • [REF] lint: Adapt lints for py packages instead of odoo module (#23)


  • [REF] README: Update README and fix mutable results auto-generating it (#22)
  • [REF] checks_odoo_module_po: Run on modified PO files only (#21)
  • [REF] manifest: Skip duplicated data files (#20)


  • [FIX] README: Fix regex to replace autogenerated content (#18)
  • [REF] README: Detect from CI if README needs to be updated (#17)


  • [REF] README: Add examples of checks section and script to auto-generate it (#16)
  • [REF] README: Add help section and script to auto-generate it (#15)


  • [REF] checks: name_checks changed to name-checks (#14)
  • [REF] oca_pre_commit_hooks: Use shorter path in messages (#13)
  • [FIX] pre-commit-hooks.yaml: Run checks even if the manifest was not changed
  • [REF] test: Remove TODO comments already fixed


  • [FIX] oca_pre_commit_hooks: Fix checks if it has syntax error (#8)


  • [REF] oca_pre_commit_hooks: Small improvements (#7)


  • [IMP] oca_pre_commit_hooks: Enable feature to 'enable' checks (#6)
  • [IMP] oca_pre_commit_hooks: Add entrypoint arguments to disable checks (#5)


  • [REF] README: Remove deprecated CI build


  • [REF] CI: Re-use tox to run pre-commit in the CI with same caches and packages
  • [ADD] .pre-commit-hooks.yaml: Compatible with pre-commit-hooks to use as hook id directly


  • [ADD] Migrate pylint-odoo checks (not related to python) to pre-commit hooks (#2)
  • Initialize

Project details

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oca-odoo-pre-commit-hooks-0.0.31.tar.gz (51.1 kB view hashes)

Uploaded Source

Built Distribution

oca_odoo_pre_commit_hooks-0.0.31-py3-none-any.whl (40.6 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page