Odoo Project

odoo_project
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_project
VERSION
VERSION 1.0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Camptocamp
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Camptocamp
COMMITTERS
COMMITTERSSébastien Alix, 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/module-composition-analysis:
    - odoo_repository
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
This module allows you to declare your Odoo projects with the list of installed modules.

Based on the data collected by `odoo_repository` module, it will:

- give some code stats (lines of code, and how they are spread among Odoo/OCA/your organization)
- give the list of modules available for upgrade in current Odoo version (based on module versions)
- list modules still hosted in a pending Pull Request (so not yet merged, could be considered as technical debt)
- list modules available in your project repository (if any) but not installed in your database (dead code)

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
odoo_module_branch_view_form odoo.module.branch.form.inherit odoo.module.branch page Inherits odoo_repository.odoo_module_branch_view_form
odoo_module_branch_view_search odoo.module.branch.search.inherit odoo.module.branch filter Inherits odoo_repository.odoo_module_branch_view_search
odoo_project_import_modules_view_form odoo.project.import.modules.form odoo.project.import.modules form New
odoo_project_module_view_form odoo.project.module.form.inherit odoo.project.module field Inherits odoo_repository.odoo_module_branch_view_form
odoo_project_module_view_pivot odoo.project.module.pivot odoo.project.module pivot New
odoo_project_module_view_search odoo.project.module.search.inherit odoo.project.module field Inherits odoo_repository.odoo_module_branch_view_search
odoo_project_module_view_tree odoo.project.module.list.inherit odoo.project.module list Inherits odoo_repository.odoo_module_branch_view_tree
odoo_project_module_view_tree_recursive_dependencies odoo.project.module.list.recursive_dependencies odoo.project.module list Inherits odoo_project_module_view_tree
odoo_project_view_form odoo.project.form odoo.project form New
odoo_project_view_search odoo.project.search odoo.project search New
odoo_project_view_tree odoo.project.list odoo.project list New
odoo_repository_view_form odoo.repository.form.inherit odoo.repository div Inherits odoo_repository.odoo_repository_view_form
Models touched (5)

New fields (2)
  • odoo_project_ids Many2many → odoo.project
    column1='module_branch_id' column2='odoo_project_id' comodel_name='odoo.project' compute='_compute_module_ids' relation='odoo_project_module_branch_rel' store=True string='Projects'
  • odoo_project_module_ids One2many → odoo.project.module
    comodel_name='odoo.project.module' inverse_name='module_branch_id' string='Deployed Modules'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True
  • available_odoo_version_ids One2many → odoo.branch
    comodel_name='odoo.branch' compute='_compute_available_odoo_version_ids' string='Available Odoo Versions'
  • module_ids Many2many → odoo.module
    column1='odoo_project_id' column2='module_id' comodel_name='odoo.module' compute='_compute_module_ids' relation='odoo_project_module_rel' store=True string='Modules'
  • module_not_installed_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_module_not_installed_ids' help='Modules available in the project repository but not installed.' string='Modules not installed'
  • modules_count Integer
    compute='_compute_modules_count'
  • name Char
    index=True required=True
  • odoo_version_id Many2one → odoo.branch
    comodel_name='odoo.branch' index=True ondelete='restrict' store=True string='Odoo Version'
  • project_module_ids One2many → odoo.project.module
    comodel_name='odoo.project.module' inverse_name='odoo_project_id' string='Deployed Modules'
  • repository_branch_id Many2one → odoo.repository.branch
    comodel_name='odoo.repository.branch' compute='_compute_repository_branch_id' index=True store=True string='Repository / Branch'
  • repository_id Many2one → odoo.repository
    comodel_name='odoo.repository' domain=[('specific', '=', True)] help='Repository this project is based on (optional). You can start to build/simulate a project without repository to get some figures.' index=True store=True string='Repository'
  • unknown_module_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_unknown_module_ids' help='Modules installed but cannot be found among repositories/branches.' string='Modules unknown'
  • unmerged_module_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_unmerged_module_ids' help='Modules installed belonging to an open PR.' string='Modules to merge'
Public methods (4)
  • action_find_unknown_modules(self)
    Try to locate unknown modules.
  • action_scan(self, force=False)
    Scan all the repositories used by the project.
  • open_import_modules(self)
    Open a wizard to import the modules of this Odoo project.
  • open_modules(self)

New fields (5)
  • additional_module_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' domain="[('branch_id', '=', odoo_version_id), ('repository_id', '!=', False)]" string='Additional Modules'
  • import_missing_dependencies Boolean
    default=False help='Import module dependencies that are not part of the list above to get an exhaustive list of modules installed in the project.'
  • modules_list Text
    help='Copy/paste your list of technical module names here.\nOne module per line with an optional version number (separated by any special character (space, tabulation, comma...).'
  • odoo_project_id Many2one → odoo.project
    comodel_name='odoo.project' required=True string='Project'
  • odoo_version_id Many2one
    related='odoo_project_id.odoo_version_id'
Public methods (1)
  • action_import(self)
    Import the modules for the given Odoo project.

New fields (8)
  • installed_reverse_dependency_ids Many2many → odoo.project.module
    comodel_name='odoo.project.module' compute='_compute_installed_reverse_dependency_ids' string='Installed Reverse Dependencies'
  • installed_version Char
    help='Installed version in project database.'
  • installed_version_id Many2one → odoo.module.branch.version
    comodel_name='odoo.module.branch.version' compute='_compute_installed_version_id' help='If the real installed version is not available in the history of versions (could come from a pending merge not scanned), this field computes the nearest version available.' string='Nearest installed version'
  • migration_scripts Boolean
    compute='_compute_migration_scripts' help='Available migration scripts between installed and last version.' store=True
  • module_branch_id Many2one → odoo.module.branch
    comodel_name='odoo.module.branch' ondelete='cascade' required=True string='Upstream Module'
  • not_installed_reverse_dependency_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_installed_reverse_dependency_ids' string='Not Installed Reverse Dependencies'
  • odoo_project_id Many2one → odoo.project
    comodel_name='odoo.project' ondelete='cascade' string='Project'
  • to_upgrade Boolean
    compute='_compute_to_upgrade' store=True
Public methods (1)
  • open_recursive_dependencies(self)

New fields (2)
  • project_count Integer
    compute='_compute_project_count'
  • project_ids One2many → odoo.project
    comodel_name='odoo.project' inverse_name='repository_id' string='Projects'
Public methods (1)
  • action_view_projects(self)
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_project
VERSION
VERSION 1.0.2
CATEGORY
CATEGORYTools
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
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, 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/module-composition-analysis:
    - odoo_repository
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
This module allows you to declare your Odoo projects with the list of installed modules.

Based on the data collected by `odoo_repository` module, it will:

- give some code stats (lines of code, and how they are spread among Odoo/OCA/your organization)
- give the list of modules available for upgrade in current Odoo version (based on module versions)
- list modules still hosted in a pending Pull Request (so not yet merged, could be considered as technical debt)
- list modules available in your project repository (if any) but not installed in your database (dead code)

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
odoo_module_branch_view_form odoo.module.branch.form.inherit odoo.module.branch page Inherits odoo_repository.odoo_module_branch_view_form
odoo_module_branch_view_search odoo.module.branch.search.inherit odoo.module.branch filter Inherits odoo_repository.odoo_module_branch_view_search
odoo_project_import_modules_view_form odoo.project.import.modules.form odoo.project.import.modules form New
odoo_project_module_view_form odoo.project.module.form.inherit odoo.project.module field Inherits odoo_repository.odoo_module_branch_view_form
odoo_project_module_view_pivot odoo.project.module.pivot odoo.project.module pivot New
odoo_project_module_view_search odoo.project.module.search.inherit odoo.project.module field Inherits odoo_repository.odoo_module_branch_view_search
odoo_project_module_view_tree odoo.project.module.tree.inherit odoo.project.module tree Inherits odoo_repository.odoo_module_branch_view_tree
odoo_project_module_view_tree_recursive_dependencies odoo.project.module.tree.recursive_dependencies odoo.project.module tree Inherits odoo_project_module_view_tree
odoo_project_view_form odoo.project.form odoo.project form New
odoo_project_view_search odoo.project.search odoo.project search New
odoo_project_view_tree odoo.project.tree odoo.project tree New
odoo_repository_view_form odoo.repository.form.inherit odoo.repository div Inherits odoo_repository.odoo_repository_view_form
Models touched (5)

New fields (2)
  • odoo_project_ids Many2many → odoo.project
    column1='module_branch_id' column2='odoo_project_id' comodel_name='odoo.project' compute='_compute_module_ids' relation='odoo_project_module_branch_rel' store=True string='Projects'
  • odoo_project_module_ids One2many → odoo.project.module
    comodel_name='odoo.project.module' inverse_name='module_branch_id' string='Deployed Modules'
Public methods (0)

No public methods.

New fields (12)
  • active Boolean
    default=True
  • available_odoo_version_ids One2many → odoo.branch
    comodel_name='odoo.branch' compute='_compute_available_odoo_version_ids' string='Available Odoo Versions'
  • module_ids Many2many → odoo.module
    column1='odoo_project_id' column2='module_id' comodel_name='odoo.module' compute='_compute_module_ids' relation='odoo_project_module_rel' store=True string='Modules'
  • module_not_installed_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_module_not_installed_ids' help='Modules available in the project repository but not installed.' string='Modules not installed'
  • modules_count Integer
    compute='_compute_modules_count'
  • name Char
    index=True required=True
  • odoo_version_id Many2one → odoo.branch
    comodel_name='odoo.branch' index=True ondelete='restrict' store=True string='Odoo Version'
  • project_module_ids One2many → odoo.project.module
    comodel_name='odoo.project.module' inverse_name='odoo_project_id' string='Deployed Modules'
  • repository_branch_id Many2one → odoo.repository.branch
    comodel_name='odoo.repository.branch' compute='_compute_repository_branch_id' index=True store=True string='Repository / Branch'
  • repository_id Many2one → odoo.repository
    comodel_name='odoo.repository' domain=[('specific', '=', True)] help='Repository this project is based on (optional). You can start to build/simulate a project without repository to get some figures.' index=True store=True string='Repository'
  • unknown_module_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_unknown_module_ids' help='Modules installed but cannot be found among repositories/branches.' string='Modules unknown'
  • unmerged_module_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_unmerged_module_ids' help='Modules installed belonging to an open PR.' string='Modules to merge'
Public methods (4)
  • action_find_unknown_modules(self)
    Try to locate unknown modules.
  • action_scan(self, force=False)
    Scan all the repositories used by the project.
  • open_import_modules(self)
    Open a wizard to import the modules of this Odoo project.
  • open_modules(self)

New fields (5)
  • additional_module_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' domain="[('branch_id', '=', odoo_version_id), ('repository_id', '!=', False)]" string='Additional Modules'
  • import_missing_dependencies Boolean
    default=False help='Import module dependencies that are not part of the list above to get an exhaustive list of modules installed in the project.'
  • modules_list Text
    help='Copy/paste your list of technical module names here.\nOne module per line with an optional version number (separated by any special character (space, tabulation, comma...).'
  • odoo_project_id Many2one → odoo.project
    comodel_name='odoo.project' required=True string='Project'
  • odoo_version_id Many2one
    related='odoo_project_id.odoo_version_id'
Public methods (1)
  • action_import(self)
    Import the modules for the given Odoo project.

New fields (8)
  • installed_reverse_dependency_ids Many2many → odoo.project.module
    comodel_name='odoo.project.module' compute='_compute_installed_reverse_dependency_ids' string='Installed Reverse Dependencies'
  • installed_version Char
    help='Installed version in project database.'
  • installed_version_id Many2one → odoo.module.branch.version
    comodel_name='odoo.module.branch.version' compute='_compute_installed_version_id' help='If the real installed version is not available in the history of versions (could come from a pending merge not scanned), this field computes the nearest version available.' string='Nearest installed version'
  • migration_scripts Boolean
    compute='_compute_migration_scripts' help='Available migration scripts between installed and last version.' store=True
  • module_branch_id Many2one → odoo.module.branch
    comodel_name='odoo.module.branch' ondelete='cascade' required=True string='Upstream Module'
  • not_installed_reverse_dependency_ids Many2many → odoo.module.branch
    comodel_name='odoo.module.branch' compute='_compute_installed_reverse_dependency_ids' string='Not Installed Reverse Dependencies'
  • odoo_project_id Many2one → odoo.project
    comodel_name='odoo.project' ondelete='cascade' string='Project'
  • to_upgrade Boolean
    compute='_compute_to_upgrade' store=True
Public methods (1)
  • open_recursive_dependencies(self)

New fields (2)
  • project_count Integer
    compute='_compute_project_count'
  • project_ids One2many → odoo.project
    comodel_name='odoo.project' inverse_name='repository_id' string='Projects'
Public methods (1)
  • action_view_projects(self)