Odoo MCA

odoo_repository
REPOSITORY
REPOSITORYOCA/module-composition-analysis
GIT
GIThttps://github.com/OCA/module-composition-analysis.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/module-composition-analysis/tree/18.0/odoo_repository
VERSION
VERSION 1.2.0
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSSébastien Alix, Weblate, OCA-git-bot, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/module-composition-analysis
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:20
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/queue:
    - queue_job
OCA/server-tools:
    - base_time_window
odoo/odoo:
    - base_sparse_field
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES gitpython
odoo-addons-parser
pyyaml
requests
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Base module to host data collected from Odoo repositories.

It allows you to:
- declare the Odoo versions (last 3 versions by default)
- declare repositories containing modules (Odoo repositories included by default, and OCA ones are synced automatically)
- scan these repositories to collect modules informations per Odoo version

Code Analysis

Views touched (44)
XML IDNameModelTypeStatus
authentication_token_view_form authentication.token.form authentication.token form New
authentication_token_view_search authentication.token.search authentication.token search New
authentication_token_view_tree authentication.token.tree authentication.token list New
odoo_author_view_form odoo.author.form odoo.author form New
odoo_author_view_search odoo.author.search odoo.author search New
odoo_author_view_tree odoo.author.tree odoo.author list New
odoo_branch_view_form odoo.branch.form odoo.branch form New
odoo_branch_view_search odoo.branch.search odoo.branch search New
odoo_branch_view_tree odoo.branch.tree odoo.branch list New
odoo_license_view_search odoo.license.search odoo.license search New
odoo_license_view_tree odoo.license.tree odoo.license list New
odoo_maintainer_view_form odoo.maintainer.form odoo.maintainer form New
odoo_maintainer_view_search odoo.maintainer.search odoo.maintainer search New
odoo_maintainer_view_tree odoo.maintainer.tree odoo.maintainer list New
odoo_module_branch_view_form odoo.module.branch.form odoo.module.branch form New
odoo_module_branch_view_graph odoo.module.branch.graph odoo.module.branch graph New
odoo_module_branch_view_pivot odoo.module.branch.pivot odoo.module.branch pivot New
odoo_module_branch_view_search odoo.module.branch.search odoo.module.branch search New
odoo_module_branch_view_tree odoo.module.branch.tree odoo.module.branch list New
odoo_module_branch_view_tree_recursive_dependencies odoo.module.branch.tree.recursive_dependencies odoo.module.branch list Inherits odoo_module_branch_view_tree
odoo_module_category_view_search odoo.module.category.search odoo.module.category search New
odoo_module_category_view_tree odoo.module.category.tree odoo.module.category list New
odoo_module_dev_status_view_search odoo.module.dev.status.search odoo.module.dev.status search New
odoo_module_dev_status_view_tree odoo.module.dev.status.tree odoo.module.dev.status list New
odoo_module_view_form odoo.module.form odoo.module form New
odoo_module_view_search odoo.module.search odoo.module search New
odoo_module_view_tree odoo.module.tree odoo.module list New
odoo_python_dependency_view_search odoo.python.dependency.search odoo.python.dependency search New
odoo_python_dependency_view_tree odoo.python.dependency.tree odoo.python.dependency list New
odoo_repository_addons_path_view_form odoo.repository.addons_path.form odoo.repository.addons_path form New
odoo_repository_addons_path_view_tree odoo.repository.addons_path.tree odoo.repository.addons_path list New
odoo_repository_branch_view_form odoo.repository.branch.form odoo.repository.branch form New
odoo_repository_branch_view_search odoo.repository.branch.search odoo.repository.branch search New
odoo_repository_branch_view_tree odoo.repository.branch.tree odoo.repository.branch list New
odoo_repository_org_view_form odoo.repository.org.form odoo.repository.org form New
odoo_repository_org_view_search odoo.repository.org.search odoo.repository.org search New
odoo_repository_org_view_tree odoo.repository.org.tree odoo.repository.org list New
odoo_repository_view_form odoo.repository.form odoo.repository form New
odoo_repository_view_search odoo.repository.search odoo.repository search New
odoo_repository_view_tree odoo.repository.tree odoo.repository list New
res_config_settings_view_form res.config.settings.form.inherit res.config.settings xpath Inherits base.res_config_settings_view_form
ssh_key_view_form ssh.key.form ssh.key form New
ssh_key_view_search ssh.key.search ssh.key search New
ssh_key_view_tree ssh.key.tree ssh.key list New
Models touched (19)

New fields (2)
  • name Char
    required=True
  • token Char
    required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (6)
  • active Boolean
    default=True
  • name Char
    help='An Odoo version is also used as an Odoo branch name in generic repositories (Odoo, OCA...).' index=True required=True string='Version'
  • next_id Many2one → odoo.branch
    comodel_name='odoo.branch' compute='_compute_next_and_previous'
  • previous_id Many2one → odoo.branch
    comodel_name='odoo.branch' compute='_compute_next_and_previous'
  • repository_branch_ids One2many → odoo.repository.branch
    comodel_name='odoo.repository.branch' inverse_name='branch_id' readonly=True string='Repositories'
  • sequence Integer
Public methods (4)
  • action_force_scan(self)
    Force the scan of this branch in all repositories. It will restart the scan without considering the last scanned commit, overriding already collected module data if any.
  • action_scan(self, force=False)
    Scan this branch in all repositories.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (3)
  • github_url Char
    compute='_compute_github_url' string='GitHub URL'
  • module_branch_ids Many2many → odoo.module.branch
    column1='maintainer_id' column2='module_branch_id' comodel_name='odoo.module.branch' relation='module_branch_maintainer_rel' string='Maintainers'
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • blacklisted Boolean
    help="Blacklisted modules won't be scanned." readonly=True
  • module_branch_ids One2many → odoo.module.branch
    comodel_name='odoo.module.branch' inverse_name='module_id' readonly=True string='Modules'
  • name Char
    help='Technical Name' index=True required=True
Public methods (0)

No public methods.

New fields (42)
  • addons_path Char
    help='Technical field. Where the module is located in the repository.'
  • application Boolean
    default=False
  • author_ids Many2many → odoo.author
    comodel_name='odoo.author' string='Authors'
  • auto_install Boolean
    default=False string='Auto-Install'
  • branch_id Many2one → odoo.branch
    comodel_name='odoo.branch' index=True ondelete='cascade' required=True string='Odoo Version'
  • branch_name Char
    index=True related='branch_id.name' store=True string='Branch Name'
  • branch_sequence Integer
    index=True related='branch_id.sequence' store=True string='Branch Sequence'
  • category_id Many2one → odoo.module.category
    comodel_name='odoo.module.category' index=True ondelete='restrict' string='Category'
  • dependency_ids Many2many → odoo.module.branch
    column1='module_branch_id' column2='dependency_id' comodel_name='odoo.module.branch' relation='module_branch_dependency_rel' string='Dependencies'
  • development_status_id Many2one → odoo.module.dev.status
    comodel_name='odoo.module.dev.status' index=True ondelete='restrict' string='Develoment Status'
  • external_dependencies Serialized
  • full_path Char
    compute='_compute_full_path'
  • global_dependency_level Integer
    compute='_compute_dependency_level' help='Dependency level including all standard Odoo modules.' recursive=True store=True string='Global Dep. Level'
  • installable Boolean
    default=True
  • is_community Boolean
    default=False help='Is this module a contribution of the community?' string='Community?'
  • is_enterprise Boolean
    default=False help='Is this module designed for Odoo Enterprise only?' string='Enterprise?'
  • is_standard Boolean
    default=False help='Is this module part of Odoo standard?' string='Standard?'
  • last_scanned_commit Char
  • license_id Many2one → odoo.license
    comodel_name='odoo.license' index=True ondelete='restrict' string='License'
  • maintainer_ids Many2many → odoo.maintainer
    column1='module_branch_id' column2='maintainer_id' comodel_name='odoo.maintainer' relation='module_branch_maintainer_rel' string='Maintainers'
  • module_id Many2one → odoo.module
    comodel_name='odoo.module' index=True ondelete='restrict' required=True string='Technical name'
  • module_name Char
    index=True related='module_id.name' store=True string='Module Technical Name'
  • name Char
    compute='_compute_name' index=True store=True string='Techname'
  • non_std_dependency_level Integer
    compute='_compute_dependency_level' help='Dependency level excluding all standard Odoo modules.' recursive=True store=True string='Non-Std Dep. Level'
  • org_id Many2one
    related='repository_branch_id.repository_id.org_id' store=True string='Organization'
  • pr_url Char
    string='PR URL'
  • python_dependency_ids Many2many → odoo.python.dependency
    comodel_name='odoo.python.dependency' string='Python Dependencies'
  • removed Boolean
  • repository_branch_id Many2one → odoo.repository.branch
    comodel_name='odoo.repository.branch' index=True ondelete='set null' string='Repository Branch'
  • repository_id Many2one
    index=True precompute=True related='repository_branch_id.repository_id' store=True string='Repository'
  • repository_sequence Integer
    index=True related='repository_id.sequence' store=True
  • reverse_dependency_ids Many2many → odoo.module.branch
    column1='dependency_id' column2='module_branch_id' comodel_name='odoo.module.branch' relation='module_branch_dependency_rel' string='Reverse Dependencies'
  • sloc_css Integer
    help='CSS source lines of code' args: 'CSS'
  • sloc_js Integer
    help='JavaScript source lines of code' args: 'JS'
  • sloc_python Integer
    help='Python source lines of code' args: 'Python'
  • sloc_xml Integer
    help='XML source lines of code' args: 'XML'
  • specific Boolean
    help='Module specific to a project repository.It cannot be used across different projects.'
  • summary Char
    index=True
  • title Char
    help='Descriptive name' index=True
  • url Char
    compute='_compute_url' args: 'URL'
  • version Char
    args: 'Last version'
  • version_ids One2many → odoo.module.branch.version
    comodel_name='odoo.module.branch.version' inverse_name='module_branch_id' string='Versions'
Public methods (4)
  • action_find_pr_url(self)
    Find the PR on GitHub that adds this module.
  • init(self)
  • open_recursive_dependencies(self)
  • push_scanned_data(self, repo_branch_id, module, data)
    @api.model@api.returns('odoo.module.branch')
    Entry point for the scanner to push its data.

New fields (11)
  • branch_id Many2one
    related='module_branch_id.branch_id' store=True
  • branch_sequence Integer
    related='branch_id.sequence' store=True string='Branch Sequence'
  • commit Char
  • has_migration_script Boolean
    default=False
  • manifest_value Char
    help='Technical field to host the manifest value.' required=True
  • migration_script_url Char
    compute='_compute_migration_script_url' string='Migration Script'
  • module_branch_id Many2one → odoo.module.branch
    comodel_name='odoo.module.branch' index=True ondelete='cascade' required=True string='Module'
  • module_id Many2one
    index=True related='module_branch_id.module_id' store=True string='Module '
  • module_name Char
    index=True related='module_branch_id.module_name' store=True string='Module Technical Name'
  • name Char
    required=True
  • sequence Integer
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • active Boolean
    default=True
  • addons_path_ids Many2many → odoo.repository.addons_path
    comodel_name='odoo.repository.addons_path' help='Relative path of folders in this repository hosting Odoo modules' string='Addons Path'
  • branch_ids One2many → odoo.repository.branch
    comodel_name='odoo.repository.branch' inverse_name='repository_id' string='Branches'
  • clone_name Char
    help='Force the name of the cloned repository (folder on disk). If not set, the name of the repository will be used.'
  • clone_url Char
    help='Used to clone the repository.' string='Clone URL'
  • display_name Char
    compute='_compute_display_name' store=True
  • manual_branches Boolean
    help='By default repository branches follows the configured Odoo versions (e.g: 17.0, 18.0...). Enable this option to configure your own branches.' string='Configure branches manually'
  • module_ids One2many → odoo.module.branch
    comodel_name='odoo.module.branch' inverse_name='repository_id' readonly=True string='Modules'
  • name Char
    index=True required=True
  • org_id Many2one → odoo.repository.org
    comodel_name='odoo.repository.org' index=True ondelete='cascade' required=True string='Organization'
  • repo_type Selection
    selection=[('github', 'GitHub'), ('gitlab', 'GitLab')]
  • repo_url Char
    help='Web access to this repository.' required=True string='Web URL'
  • scan_weekday_ids Many2many → time.weekday
    comodel_name='time.weekday' help='Limit scanning of this repository by the scheduled action to certain days only. If not defined, the scan will happen every day.' string='Scanning days'
  • sequence Integer
    default=100
  • specific Boolean
    help='Host specific modules (that are not generic). Used for project repositories.'
  • ssh_key_id Many2one → ssh.key
    comodel_name='ssh.key' help='SSH key used to clone/fetch this repository.' ondelete='restrict' string='SSH Key'
  • to_scan Boolean
    default=True help='Scan this repository to collect data.'
  • token_id Many2one → authentication.token
    comodel_name='authentication.token' help='Token used to clone/fetch this repository.' ondelete='restrict' string='Token'
Public methods (8)
  • action_force_scan(self, branch_ids=None, raise_exc=True)
    Force the scan of the repositories. It will restart the scan without considering the last scanned commit, overriding already collected module data if any.
  • action_scan(self, branch_ids=None, force=False, raise_exc=True)
    Scan the whole repository.
  • cron_fetch_data(self, branches=None, force=False)
    @api.model
    Fetch Odoo repositories data from the main node (if any).
  • cron_scanner(self, branches=None, force=False)
    @api.model
    Scan and collect Odoo repositories data. As the scanner is run on the same server than Odoo, a special class `RepositoryScannerOdooEnv` is used so the scanner can request Odoo through an environment (api.Environment). `branches` parameter allows to filter the `odoo.branch` to take into account for the scan, e.g. `branches=["16.0", "18.0"]`.
  • cron_sync_oca_repositories(self)
    @api.model
    Create and update OCA repositories from GitHub configuration. This method spawns a job to fetch the repository configurations from OCA/repo-maintainer-conf, parse the YAML files, and synchronize the local repository database by: - Creating new repositories that exist in OCA config but not locally - Updating existing repositories with any changes - Archiving repositories that no longer exist in OCA config
  • default_get(self, fields_list)
    @api.model
    'default_get' method overloaded.
  • open_modules(self)
  • unlink(self)

New fields (4)
  • is_community Boolean
    default=False help='Does this folder contain Odoo generic community modules?\n(from OCA, a contributor or your organization)' string='Community Contribution?'
  • is_enterprise Boolean
    default=False help='Does this folder contain Enterprise modules?\n(from Odoo S.A., a contributor or your organization)' string='Enterprise?'
  • is_standard Boolean
    default=False help='Does this folder contain modules from Odoo S.A.?' string='Standard?'
  • relative_path Char
    required=True
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    compute='_compute_active' store=True
  • branch_id Many2one → odoo.branch
    comodel_name='odoo.branch' index=True ondelete='cascade' required=True string='Odoo Version'
  • cloned_branch Char
    help="Force the branch to clone (optional). Used on repositories with 'Configure branches manually' option enabled."
  • last_scanned_commit Char
    readonly=True
  • manual_branches Boolean
    related='repository_id.manual_branches' store=True
  • module_ids One2many → odoo.module.branch
    comodel_name='odoo.module.branch' inverse_name='repository_branch_id' readonly=True string='Modules'
  • name Char
    compute='_compute_name' index=True store=True
  • repository_id Many2one → odoo.repository
    comodel_name='odoo.repository' index=True ondelete='cascade' readonly=True required=True string='Repository'
  • specific Boolean
    related='repository_id.specific' store=True
Public methods (2)
  • action_force_scan(self, raise_exc=True)
    Force the scan of the repository/branch. It will restart the scan without considering the last scanned commit, overriding already collected module data if any.
  • action_scan(self, force=False, raise_exc=True)
    Scan the repository/branch.

New fields (2)
  • github_url Char
    compute='_compute_github_url' string='GitHub URL'
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (2)
  • config_odoo_repository_default_token_id Many2one → authentication.token
    comodel_name='authentication.token' help='Default token used to clone repositories and authenticate on API like GitHub.' string='Default Authentication Token'
  • config_odoo_repository_workaround_fs_errors Boolean
    help="Fix file system permissions when cloning repositories. Errors could be triggered on some file systems when git tries to execute 'chown' commands on its internal configuration files. This option will workaround this issue." string='Workaround FS errors'
Public methods (0)

No public methods.

New fields (5)
  • config_odoo_repository_default_token_id Many2one
    readonly=False related='company_id.config_odoo_repository_default_token_id'
  • config_odoo_repository_main_node_url Char
    config_parameter='odoo_repository_main_node_url' string='Main Node'
  • config_odoo_repository_oca_blacklist Char
    config_parameter='odoo_repository.oca_repo_blacklist' help='Comma-separated list of OCA repositories to skip during synchronization. Example: OCB,OpenUpgrade' string='OCA Repository Blacklist'
  • config_odoo_repository_storage_path Char
    config_parameter='odoo_repository_storage_path' string='Storage local path'
  • config_odoo_repository_workaround_fs_errors Boolean
    readonly=False related='company_id.config_odoo_repository_workaround_fs_errors'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True
  • private_key Text
    help='SSH private key without passphrase.' required=True
Public methods (0)

No public methods.

REPOSITORY
REPOSITORYOCA/module-composition-analysis
GIT
GIThttps://github.com/OCA/module-composition-analysis.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/module-composition-analysis/tree/16.0/odoo_repository
VERSION
VERSION 1.5.5
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONYes
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSGitHub, Sébastien Alix, Weblate, OCA-git-bot, hparfr, Tom, oca-ci
WEBSITE
WEBSITEhttps://github.com/OCA/module-composition-analysis
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:12:08
ODOO DEPENDENCIES
ODOO DEPENDENCIES OCA/connector:
    - component
OCA/queue:
    - queue_job
OCA/server-tools:
    - base_time_window
odoo/odoo:
    - base_sparse_field
    - base
    - mail
    - base_setup
    - web
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES gitpython
odoo-addons-parser
pyyaml
requests
cachetools
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Base module to host data collected from Odoo repositories.

It allows you to:
- declare the Odoo versions (last 3 versions by default)
- declare repositories containing modules (Odoo repositories included by default, and OCA ones are synced automatically)
- scan these repositories to collect modules informations per Odoo version

Code Analysis

Views touched (44)
XML IDNameModelTypeStatus
authentication_token_view_form authentication.token.form authentication.token form New
authentication_token_view_search authentication.token.search authentication.token search New
authentication_token_view_tree authentication.token.tree authentication.token tree New
odoo_author_view_form odoo.author.form odoo.author form New
odoo_author_view_search odoo.author.search odoo.author search New
odoo_author_view_tree odoo.author.tree odoo.author tree New
odoo_branch_view_form odoo.branch.form odoo.branch form New
odoo_branch_view_search odoo.branch.search odoo.branch search New
odoo_branch_view_tree odoo.branch.tree odoo.branch tree New
odoo_license_view_search odoo.license.search odoo.license search New
odoo_license_view_tree odoo.license.tree odoo.license tree New
odoo_maintainer_view_form odoo.maintainer.form odoo.maintainer form New
odoo_maintainer_view_search odoo.maintainer.search odoo.maintainer search New
odoo_maintainer_view_tree odoo.maintainer.tree odoo.maintainer tree New
odoo_module_branch_view_form odoo.module.branch.form odoo.module.branch form New
odoo_module_branch_view_graph odoo.module.branch.graph odoo.module.branch graph New
odoo_module_branch_view_pivot odoo.module.branch.pivot odoo.module.branch pivot New
odoo_module_branch_view_search odoo.module.branch.search odoo.module.branch search New
odoo_module_branch_view_tree odoo.module.branch.tree odoo.module.branch tree New
odoo_module_branch_view_tree_recursive_dependencies odoo.module.branch.tree.recursive_dependencies odoo.module.branch tree Inherits odoo_module_branch_view_tree
odoo_module_category_view_search odoo.module.category.search odoo.module.category search New
odoo_module_category_view_tree odoo.module.category.tree odoo.module.category tree New
odoo_module_dev_status_view_search odoo.module.dev.status.search odoo.module.dev.status search New
odoo_module_dev_status_view_tree odoo.module.dev.status.tree odoo.module.dev.status tree New
odoo_module_view_form odoo.module.form odoo.module form New
odoo_module_view_search odoo.module.search odoo.module search New
odoo_module_view_tree odoo.module.tree odoo.module tree New
odoo_python_dependency_view_search odoo.python.dependency.search odoo.python.dependency search New
odoo_python_dependency_view_tree odoo.python.dependency.tree odoo.python.dependency tree New
odoo_repository_addons_path_view_form odoo.repository.addons_path.form odoo.repository.addons_path form New
odoo_repository_addons_path_view_tree odoo.repository.addons_path.tree odoo.repository.addons_path tree New
odoo_repository_branch_view_form odoo.repository.branch.form odoo.repository.branch form New
odoo_repository_branch_view_search odoo.repository.branch.search odoo.repository.branch search New
odoo_repository_branch_view_tree odoo.repository.branch.tree odoo.repository.branch tree New
odoo_repository_org_view_form odoo.repository.org.form odoo.repository.org form New
odoo_repository_org_view_search odoo.repository.org.search odoo.repository.org search New
odoo_repository_org_view_tree odoo.repository.org.tree odoo.repository.org tree New
odoo_repository_view_form odoo.repository.form odoo.repository form New
odoo_repository_view_search odoo.repository.search odoo.repository search New
odoo_repository_view_tree odoo.repository.tree odoo.repository tree New
res_config_settings_view_form res.config.settings.form.inherit res.config.settings xpath Inherits base_setup.res_config_settings_view_form
ssh_key_view_form ssh.key.form ssh.key form New
ssh_key_view_search ssh.key.search ssh.key search New
ssh_key_view_tree ssh.key.tree ssh.key tree New
Models touched (19)

New fields (2)
  • name Char
    required=True
  • token Char
    required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (5)
  • active Boolean
    default=True
  • name Char
    help='An Odoo version is also used as an Odoo branch name in generic repositories (Odoo, OCA...).' index=True required=True string='Version'
  • next_id Many2one → odoo.branch
    comodel_name='odoo.branch' compute='_compute_next_id'
  • repository_branch_ids One2many → odoo.repository.branch
    comodel_name='odoo.repository.branch' inverse_name='branch_id' readonly=True string='Repositories'
  • sequence Integer
Public methods (4)
  • action_force_scan(self)
    Force the scan of this branch in all repositories. It will restart the scan without considering the last scanned commit, overriding already collected module data if any.
  • action_scan(self, force=False)
    Scan this branch in all repositories.
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (3)
  • github_url Char
    compute='_compute_github_url' string='GitHub URL'
  • module_branch_ids Many2many → odoo.module.branch
    column1='maintainer_id' column2='module_branch_id' comodel_name='odoo.module.branch' relation='module_branch_maintainer_rel' string='Maintainers'
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (3)
  • blacklisted Boolean
    help="Blacklisted modules won't be scanned." readonly=True
  • module_branch_ids One2many → odoo.module.branch
    comodel_name='odoo.module.branch' inverse_name='module_id' readonly=True string='Modules'
  • name Char
    help='Technical Name' index=True required=True
Public methods (0)

No public methods.

New fields (42)
  • addons_path Char
    help='Technical field. Where the module is located in the repository.'
  • application Boolean
    default=False
  • author_ids Many2many → odoo.author
    comodel_name='odoo.author' string='Authors'
  • auto_install Boolean
    default=False string='Auto-Install'
  • branch_id Many2one → odoo.branch
    comodel_name='odoo.branch' index=True ondelete='cascade' required=True string='Odoo Version'
  • branch_name Char
    index=True related='branch_id.name' store=True string='Branch Name'
  • branch_sequence Integer
    index=True related='branch_id.sequence' store=True string='Branch Sequence'
  • category_id Many2one → odoo.module.category
    comodel_name='odoo.module.category' index=True ondelete='restrict' string='Category'
  • dependency_ids Many2many → odoo.module.branch
    column1='module_branch_id' column2='dependency_id' comodel_name='odoo.module.branch' relation='module_branch_dependency_rel' string='Dependencies'
  • development_status_id Many2one → odoo.module.dev.status
    comodel_name='odoo.module.dev.status' index=True ondelete='restrict' string='Develoment Status'
  • external_dependencies Serialized
  • full_path Char
    compute='_compute_full_path'
  • global_dependency_level Integer
    compute='_compute_dependency_level' help='Dependency level including all standard Odoo modules.' recursive=True store=True string='Global Dep. Level'
  • installable Boolean
    default=True
  • is_community Boolean
    default=False help='Is this module a contribution of the community?' string='Community?'
  • is_enterprise Boolean
    default=False help='Is this module designed for Odoo Enterprise only?' string='Enterprise?'
  • is_standard Boolean
    default=False help='Is this module part of Odoo standard?' string='Standard?'
  • last_scanned_commit Char
  • license_id Many2one → odoo.license
    comodel_name='odoo.license' index=True ondelete='restrict' string='License'
  • maintainer_ids Many2many → odoo.maintainer
    column1='module_branch_id' column2='maintainer_id' comodel_name='odoo.maintainer' relation='module_branch_maintainer_rel' string='Maintainers'
  • module_id Many2one → odoo.module
    comodel_name='odoo.module' index=True ondelete='restrict' required=True string='Technical name'
  • module_name Char
    index=True related='module_id.name' store=True string='Module Technical Name'
  • name Char
    compute='_compute_name' index=True store=True string='Techname'
  • non_std_dependency_level Integer
    compute='_compute_dependency_level' help='Dependency level excluding all standard Odoo modules.' recursive=True store=True string='Non-Std Dep. Level'
  • org_id Many2one
    related='repository_branch_id.repository_id.org_id' store=True string='Organization'
  • pr_url Char
    string='PR URL'
  • python_dependency_ids Many2many → odoo.python.dependency
    comodel_name='odoo.python.dependency' string='Python Dependencies'
  • removed Boolean
  • repository_branch_id Many2one → odoo.repository.branch
    comodel_name='odoo.repository.branch' index=True ondelete='set null' string='Repository Branch'
  • repository_id Many2one
    index=True precompute=True related='repository_branch_id.repository_id' store=True string='Repository'
  • repository_sequence Integer
    index=True related='repository_id.sequence' store=True
  • reverse_dependency_ids Many2many → odoo.module.branch
    column1='dependency_id' column2='module_branch_id' comodel_name='odoo.module.branch' relation='module_branch_dependency_rel' string='Reverse Dependencies'
  • sloc_css Integer
    help='CSS source lines of code' args: 'CSS'
  • sloc_js Integer
    help='JavaScript source lines of code' args: 'JS'
  • sloc_python Integer
    help='Python source lines of code' args: 'Python'
  • sloc_xml Integer
    help='XML source lines of code' args: 'XML'
  • specific Boolean
    help='Module specific to a project repository.It cannot be used across different projects.'
  • summary Char
    index=True
  • title Char
    help='Descriptive name' index=True
  • url Char
    compute='_compute_url' args: 'URL'
  • version Char
    args: 'Last version'
  • version_ids One2many → odoo.module.branch.version
    comodel_name='odoo.module.branch.version' inverse_name='module_branch_id' string='Versions'
Public methods (4)
  • action_find_pr_url(self)
    Find the PR on GitHub that adds this module.
  • init(self)
  • open_recursive_dependencies(self)
  • push_scanned_data(self, repo_branch_id, module, data)
    @api.model@api.returns('odoo.module.branch')
    Entry point for the scanner to push its data.

New fields (11)
  • branch_id Many2one
    related='module_branch_id.branch_id' store=True
  • branch_sequence Integer
    related='branch_id.sequence' store=True string='Branch Sequence'
  • commit Char
  • has_migration_script Boolean
    default=False
  • manifest_value Char
    help='Technical field to host the manifest value.' required=True
  • migration_script_url Char
    compute='_compute_migration_script_url' string='Migration Script'
  • module_branch_id Many2one → odoo.module.branch
    comodel_name='odoo.module.branch' index=True ondelete='cascade' required=True string='Module'
  • module_id Many2one
    index=True related='module_branch_id.module_id' store=True string='Module'
  • module_name Char
    index=True related='module_branch_id.module_name' store=True string='Module Technical Name'
  • name Char
    required=True
  • sequence Integer
Public methods (2)
  • create(self, vals_list)
    @api.model_create_multi
  • write(self, values)

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (1)
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • active Boolean
    default=True
  • addons_path_ids Many2many → odoo.repository.addons_path
    comodel_name='odoo.repository.addons_path' help='Relative path of folders in this repository hosting Odoo modules' string='Addons Path'
  • branch_ids One2many → odoo.repository.branch
    comodel_name='odoo.repository.branch' inverse_name='repository_id' string='Branches'
  • clone_name Char
    help='Force the name of the cloned repository (folder on disk). If not set, the name of the repository will be used.'
  • clone_url Char
    help='Used to clone the repository.' string='Clone URL'
  • display_name Char
    compute='_compute_display_name' store=True
  • manual_branches Boolean
    help='By default repository branches follows the configured Odoo versions (e.g: 17.0, 18.0...). Enable this option to configure your own branches.' string='Configure branches manually'
  • module_ids One2many → odoo.module.branch
    comodel_name='odoo.module.branch' inverse_name='repository_id' readonly=True string='Modules'
  • name Char
    index=True required=True
  • org_id Many2one → odoo.repository.org
    comodel_name='odoo.repository.org' index=True ondelete='cascade' required=True string='Organization'
  • repo_type Selection
    selection=[('github', 'GitHub'), ('gitlab', 'GitLab')]
  • repo_url Char
    help='Web access to this repository.' required=True string='Web URL'
  • scan_weekday_ids Many2many → time.weekday
    comodel_name='time.weekday' help='Limit scanning of this repository by the scheduled action to certain days only. If not defined, the scan will happen every day.' string='Scanning days'
  • sequence Integer
    default=100
  • specific Boolean
    help='Host specific modules (that are not generic). Used for project repositories.'
  • ssh_key_id Many2one → ssh.key
    comodel_name='ssh.key' help='SSH key used to clone/fetch this repository.' ondelete='restrict' string='SSH Key'
  • to_scan Boolean
    default=True help='Scan this repository to collect data.'
  • token_id Many2one → authentication.token
    comodel_name='authentication.token' help='Token used to clone/fetch this repository.' ondelete='restrict' string='Token'
Public methods (8)
  • action_force_scan(self, branch_ids=None, raise_exc=True)
    Force the scan of the repositories. It will restart the scan without considering the last scanned commit, overriding already collected module data if any.
  • action_scan(self, branch_ids=None, force=False, raise_exc=True)
    Scan the whole repository.
  • cron_fetch_data(self, branches=None, force=False)
    @api.model
    Fetch Odoo repositories data from the main node (if any).
  • cron_scanner(self, branches=None, force=False)
    @api.model
    Scan and collect Odoo repositories data. As the scanner is run on the same server than Odoo, a special class `RepositoryScannerOdooEnv` is used so the scanner can request Odoo through an environment (api.Environment). `branches` parameter allows to filter the `odoo.branch` to take into account for the scan, e.g. `branches=["16.0", "18.0"]`.
  • cron_sync_oca_repositories(self)
    @api.model
    Create and update OCA repositories from GitHub configuration. This method spawns a job to fetch the repository configurations from OCA/repo-maintainer-conf, parse the YAML files, and synchronize the local repository database by: - Creating new repositories that exist in OCA config but not locally - Updating existing repositories with any changes - Archiving repositories that no longer exist in OCA config
  • default_get(self, fields_list)
    @api.model
    'default_get' method overloaded.
  • open_modules(self)
  • unlink(self)

New fields (4)
  • is_community Boolean
    default=False help='Does this folder contain Odoo generic community modules?\n(from OCA, a contributor or your organization)' string='Community Contribution?'
  • is_enterprise Boolean
    default=False help='Does this folder contain Enterprise modules?\n(from Odoo S.A., a contributor or your organization)' string='Enterprise?'
  • is_standard Boolean
    default=False help='Does this folder contain modules from Odoo S.A.?' string='Standard?'
  • relative_path Char
    required=True
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    compute='_compute_active' store=True
  • branch_id Many2one → odoo.branch
    comodel_name='odoo.branch' index=True ondelete='cascade' required=True string='Odoo Version'
  • cloned_branch Char
    help="Force the branch to clone (optional). Used on repositories with 'Configure branches manually' option enabled."
  • last_scanned_commit Char
    readonly=True
  • manual_branches Boolean
    related='repository_id.manual_branches' store=True
  • module_ids One2many → odoo.module.branch
    comodel_name='odoo.module.branch' inverse_name='repository_branch_id' readonly=True string='Modules'
  • name Char
    compute='_compute_name' index=True store=True
  • repository_id Many2one → odoo.repository
    comodel_name='odoo.repository' index=True ondelete='cascade' readonly=True required=True string='Repository'
  • specific Boolean
    related='repository_id.specific' store=True
Public methods (2)
  • action_force_scan(self, raise_exc=True)
    Force the scan of the repository/branch. It will restart the scan without considering the last scanned commit, overriding already collected module data if any.
  • action_scan(self, force=False, raise_exc=True)
    Scan the repository/branch.

New fields (2)
  • github_url Char
    compute='_compute_github_url' string='GitHub URL'
  • name Char
    index=True required=True
Public methods (0)

No public methods.

New fields (2)
  • config_odoo_repository_default_token_id Many2one → authentication.token
    comodel_name='authentication.token' help='Default token used to clone repositories and authenticate on API like GitHub.' string='Default token'
  • config_odoo_repository_workaround_fs_errors Boolean
    help="Fix file system permissions when cloning repositories. Errors could be triggered on some file systems when git tries to execute 'chown' commands on its internal configuration files. This option will workaround this issue." string='Workaround FS errors'
Public methods (0)

No public methods.

New fields (5)
  • config_odoo_repository_default_token_id Many2one
    readonly=False related='company_id.config_odoo_repository_default_token_id'
  • config_odoo_repository_main_node_url Char
    config_parameter='odoo_repository_main_node_url' string='Endpoint URL'
  • config_odoo_repository_oca_blacklist Char
    config_parameter='odoo_repository.oca_repo_blacklist' help='Comma-separated list of OCA repositories to skip during synchronization. Example: OCB,OpenUpgrade' string='OCA Repository Blacklist'
  • config_odoo_repository_storage_path Char
    config_parameter='odoo_repository_storage_path' string='Storage local path'
  • config_odoo_repository_workaround_fs_errors Boolean
    readonly=False related='company_id.config_odoo_repository_workaround_fs_errors'
Public methods (0)

No public methods.

New fields (2)
  • name Char
    required=True
  • private_key Text
    help='SSH private key without passphrase.' required=True
Public methods (0)

No public methods.