TIP: You can type at any time to perform a new search.
Odoo MCA
odoo_repository · OCA/module-composition-analysis
- Repository
- OCA/module-composition-analysis · module folder · Try on Runboat
- Module version
- Category
- Tools
- Folder size
- 0.45 MB
- License
- AGPL-3
- Application
- Yes
- Auto-installable
- No
- Website
- https://github.com/OCA/module-composition-analysis
- Last tracking update
- 2026-08-19 17:25:11
- Authors
- Camptocamp, Odoo Community Association (OCA)
- Maintainers
- Camptocamp, Odoo Community Association (OCA)
- Committers
- Laurent Mignon (ACSONE), Sébastien Alix, Weblate, OCA-git-bot, oca-ci
- Odoo dependencies
- Python dependencies
- gitpython, odoo-addons-parser, pyyaml, requests, cachetools
- System dependencies
- None
- Required by
- odoo_project, odoo_repository_migration
- 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 ID | Name | Model | Type | Status |
|---|---|---|---|---|
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 | form | 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 |
HTTP endpoints (1)
| Route(s) | Handler | Auth | Type | Methods | Flags |
|---|---|---|---|---|---|
/odoo-repository/data |
OdooRepository.index |
none | http | ALL | csrf off sudo |
Models touched (20)
New fields (2)
-
nameCharrequired=True -
tokenCharrequired=True
No public methods.
New fields (1)
-
nameCharindex=Truerequired=True
No public methods.
New fields (6)
-
activeBooleandefault=True -
nameCharhelp='An Odoo version is also used as an Odoo branch name in generic repositories (Odoo, OCA...).'index=Truerequired=Truestring='Version' -
next_idMany2one → odoo.branchcomodel_name='odoo.branch'compute='_compute_next_and_previous' -
previous_idMany2one → odoo.branchcomodel_name='odoo.branch'compute='_compute_next_and_previous' -
repository_branch_idsOne2many → odoo.repository.branchcomodel_name='odoo.repository.branch'inverse_name='branch_id'readonly=Truestring='Repositories' -
sequenceInteger
-
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)
-
nameCharindex=Truerequired=True
No public methods.
New fields (3)
-
github_urlCharcompute='_compute_github_url'string='GitHub URL' -
module_branch_idsMany2many → odoo.module.branchcolumn1='maintainer_id'column2='module_branch_id'comodel_name='odoo.module.branch'relation='module_branch_maintainer_rel'string='Maintainers' -
nameCharindex=Truerequired=True
No public methods.
New fields (1)
-
nameCharrequired=True
No public methods.
New fields (3)
-
blacklistedBooleanhelp="Blacklisted modules won't be scanned."readonly=True -
module_branch_idsOne2many → odoo.module.branchcomodel_name='odoo.module.branch'inverse_name='module_id'readonly=Truestring='Modules' -
nameCharhelp='Technical Name'index=Truerequired=True
No public methods.
New fields (43)
-
addons_pathCharhelp='Technical field. Where the module is located in the repository.' -
applicationBooleandefault=False -
author_idsMany2many → odoo.authorcomodel_name='odoo.author'string='Authors' -
auto_installBooleandefault=Falsestring='Auto-Install' -
branch_idMany2one → odoo.branchcomodel_name='odoo.branch'index=Trueondelete='cascade'required=Truestring='Odoo Version' -
branch_nameCharindex=Truerelated='branch_id.name'store=Truestring='Branch Name' -
branch_sequenceIntegerindex=Truerelated='branch_id.sequence'store=Truestring='Branch Sequence' -
category_idMany2one → odoo.module.categorycomodel_name='odoo.module.category'index=Trueondelete='restrict'string='Category' -
dependency_idsMany2many → odoo.module.branchcolumn1='module_branch_id'column2='dependency_id'comodel_name='odoo.module.branch'relation='module_branch_dependency_rel'string='Dependencies' -
development_status_idMany2one → odoo.module.dev.statuscomodel_name='odoo.module.dev.status'index=Trueondelete='restrict'string='Develoment Status' -
external_dependenciesSerialized -
full_pathCharcompute='_compute_full_path' -
global_dependency_levelIntegercompute='_compute_dependency_level'help='Dependency level including all standard Odoo modules.'recursive=Truestore=Truestring='Global Dep. Level' -
installableBooleandefault=True -
is_communityBooleandefault=Falsehelp='Is this module a contribution of the community?'string='Community?' -
is_enterpriseBooleandefault=Falsehelp='Is this module designed for Odoo Enterprise only?'string='Enterprise?' -
is_standardBooleandefault=Falsehelp='Is this module part of Odoo standard?'string='Standard?' -
last_scanned_commitChar -
license_idMany2one → odoo.licensecomodel_name='odoo.license'index=Trueondelete='restrict'string='License' -
maintainer_idsMany2many → odoo.maintainercolumn1='module_branch_id'column2='maintainer_id'comodel_name='odoo.maintainer'relation='module_branch_maintainer_rel'string='Maintainers' -
module_idMany2one → odoo.modulecomodel_name='odoo.module'index=Trueondelete='restrict'required=Truestring='Technical name' -
module_nameCharindex=Truerelated='module_id.name'store=Truestring='Module Technical Name' -
nameCharcompute='_compute_name'index=Truestore=Truestring='Techname' -
non_std_dependency_levelIntegercompute='_compute_dependency_level'help='Dependency level excluding all standard Odoo modules.'recursive=Truestore=Truestring='Non-Std Dep. Level' -
org_idMany2onerelated='repository_branch_id.repository_id.org_id'store=Truestring='Organization' -
org_sequenceIntegerindex=Truerelated='repository_branch_id.repository_id.org_id.sequence'store=Truestring='Organization Sequence' -
pr_urlCharstring='PR URL' -
python_dependency_idsMany2many → odoo.python.dependencycomodel_name='odoo.python.dependency'string='Python Dependencies' -
removedBoolean -
repository_branch_idMany2one → odoo.repository.branchcomodel_name='odoo.repository.branch'index=Trueondelete='set null'string='Repository Branch' -
repository_idMany2oneindex=Trueprecompute=Truerelated='repository_branch_id.repository_id'store=Truestring='Repository' -
repository_sequenceIntegerindex=Truerelated='repository_id.sequence'store=True -
reverse_dependency_idsMany2many → odoo.module.branchcolumn1='dependency_id'column2='module_branch_id'comodel_name='odoo.module.branch'relation='module_branch_dependency_rel'string='Reverse Dependencies' -
sloc_cssIntegerhelp='CSS source lines of code' args: 'CSS' -
sloc_jsIntegerhelp='JavaScript source lines of code' args: 'JS' -
sloc_pythonIntegerhelp='Python source lines of code' args: 'Python' -
sloc_xmlIntegerhelp='XML source lines of code' args: 'XML' -
specificBooleanhelp='Module specific to a project repository.It cannot be used across different projects.' -
summaryCharindex=True -
titleCharhelp='Descriptive name'index=True -
urlCharcompute='_compute_url' args: 'URL' -
versionCharargs: 'Last version' -
version_idsOne2many → odoo.module.branch.versioncomodel_name='odoo.module.branch.version'inverse_name='module_branch_id'string='Versions'
-
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_idMany2onerelated='module_branch_id.branch_id'store=True -
branch_sequenceIntegerrelated='branch_id.sequence'store=Truestring='Branch Sequence' -
commitChar -
has_migration_scriptBooleandefault=False -
manifest_valueCharhelp='Technical field to host the manifest value.'required=True -
migration_script_urlCharcompute='_compute_migration_script_url'string='Migration Script' -
module_branch_idMany2one → odoo.module.branchcomodel_name='odoo.module.branch'index=Trueondelete='cascade'required=Truestring='Module' -
module_idMany2oneindex=Truerelated='module_branch_id.module_id'store=Truestring='Module ' -
module_nameCharindex=Truerelated='module_branch_id.module_name'store=Truestring='Module Technical Name' -
nameCharrequired=True -
sequenceInteger
-
create(self, vals_list)@api.model_create_multi -
write(self, values)
New fields (1)
-
nameCharindex=Truerequired=True
No public methods.
New fields (1)
-
nameCharindex=Truerequired=True
No public methods.
New fields (1)
-
nameCharindex=Truerequired=True
No public methods.
New fields (0)
No new fields.
Public methods (0)No public methods.
New fields (19)
-
activeBooleandefault=True -
activeBooleandefault=True -
addons_path_idsMany2many → odoo.repository.addons_pathcomodel_name='odoo.repository.addons_path'help='Relative path of folders in this repository hosting Odoo modules'string='Addons Path' -
branch_idsOne2many → odoo.repository.branchcomodel_name='odoo.repository.branch'inverse_name='repository_id'string='Branches' -
clone_nameCharhelp='Force the name of the cloned repository (folder on disk). If not set, the name of the repository will be used.' -
clone_urlCharhelp='Used to clone the repository.'string='Clone URL' -
display_nameCharcompute='_compute_display_name'store=True -
manual_branchesBooleanhelp='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_idsOne2many → odoo.module.branchcomodel_name='odoo.module.branch'inverse_name='repository_id'readonly=Truestring='Modules' -
nameCharindex=Truerequired=True -
org_idMany2one → odoo.repository.orgcomodel_name='odoo.repository.org'index=Trueondelete='cascade'required=Truestring='Organization' -
repo_typeSelectionselection=[('github', 'GitHub'), ('gitlab', 'GitLab')] -
repo_urlCharhelp='Web access to this repository.'required=Truestring='Web URL' -
scan_weekday_idsMany2many → time.weekdaycomodel_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' -
sequenceIntegerdefault=100 -
specificBooleanhelp='Host specific modules (that are not generic). Used for project repositories.' -
ssh_key_idMany2one → ssh.keycomodel_name='ssh.key'help='SSH key used to clone/fetch this repository.'ondelete='restrict'string='SSH Key' -
to_scanBooleandefault=Truehelp='Scan this repository to collect data.' -
token_idMany2one → authentication.tokencomodel_name='authentication.token'help='Token used to clone/fetch this repository.'ondelete='restrict'string='Token'
-
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.modelFetch Odoo repositories data from the main node (if any). -
cron_scanner(self, branches=None, force=False)@api.modelScan 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.modelCreate 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_communityBooleandefault=Falsehelp='Does this folder contain Odoo generic community modules?\n(from OCA, a contributor or your organization)'string='Community Contribution?' -
is_enterpriseBooleandefault=Falsehelp='Does this folder contain Enterprise modules?\n(from Odoo S.A., a contributor or your organization)'string='Enterprise?' -
is_standardBooleandefault=Falsehelp='Does this folder contain modules from Odoo S.A.?'string='Standard?' -
relative_pathCharrequired=True
No public methods.
New fields (9)
-
activeBooleancompute='_compute_active'store=True -
branch_idMany2one → odoo.branchcomodel_name='odoo.branch'index=Trueondelete='cascade'required=Truestring='Odoo Version' -
cloned_branchCharhelp="Force the branch to clone (optional). Used on repositories with 'Configure branches manually' option enabled." -
last_scanned_commitCharreadonly=True -
manual_branchesBooleanrelated='repository_id.manual_branches'store=True -
module_idsOne2many → odoo.module.branchcomodel_name='odoo.module.branch'inverse_name='repository_branch_id'readonly=Truestring='Modules' -
nameCharcompute='_compute_name'index=Truestore=True -
repository_idMany2one → odoo.repositorycomodel_name='odoo.repository'index=Trueondelete='cascade'readonly=Truerequired=Truestring='Repository' -
specificBooleanrelated='repository_id.specific'store=True
-
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 (3)
-
github_urlCharcompute='_compute_github_url'string='GitHub URL' -
nameCharindex=Truerequired=True -
sequenceIntegerdefault=100help='Priority of this organization when looking for the origin of a module shared by several organizations (forks). The lowest sequence wins.'
No public methods.
New fields (2)
-
config_odoo_repository_default_token_idMany2one → authentication.tokencomodel_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_errorsBooleanhelp="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'
No public methods.
New fields (5)
-
config_odoo_repository_default_token_idMany2onereadonly=Falserelated='company_id.config_odoo_repository_default_token_id' -
config_odoo_repository_main_node_urlCharconfig_parameter='odoo_repository_main_node_url'string='Main Node' -
config_odoo_repository_oca_blacklistCharconfig_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_pathCharconfig_parameter='odoo_repository_storage_path'string='Storage local path' -
config_odoo_repository_workaround_fs_errorsBooleanreadonly=Falserelated='company_id.config_odoo_repository_workaround_fs_errors'
No public methods.
New fields (2)
-
nameCharrequired=True -
private_keyTexthelp='SSH private key without passphrase.'required=True
No public methods.
Loading…
- Status
- Open migration PR — not merged yet for this version
- CI status
- checks failing
- Open since
- 23 days ago
- Last activity
- 2 days ago
- Repository
- OCA/module-composition-analysis
- Pull request
- [19.0][MIG] odoo_repository (#149)