From 5ae2eb75a9fa2739e23b5a3340a001f94de9c033 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 1 Sep 2023 16:14:23 +0200
Subject: [PATCH 01/38] Add 'odoo_project'
Module listing all modules belonging to an Odoo project by leveraging
the data provided by 'odoo_repository'.
---
odoo_project/__init__.py | 2 +
odoo_project/__manifest__.py | 21 ++++
odoo_project/models/__init__.py | 2 +
odoo_project/models/odoo_module_branch.py | 15 +++
odoo_project/models/odoo_project.py | 117 ++++++++++++++++++
odoo_project/security/ir.model.access.csv | 4 +
odoo_project/views/odoo_module_branch.xml | 37 ++++++
odoo_project/views/odoo_project.xml | 110 ++++++++++++++++
odoo_project/wizards/__init__.py | 1 +
.../wizards/odoo_project_import_modules.py | 79 ++++++++++++
.../wizards/odoo_project_import_modules.xml | 33 +++++
11 files changed, 421 insertions(+)
create mode 100644 odoo_project/__init__.py
create mode 100644 odoo_project/__manifest__.py
create mode 100644 odoo_project/models/__init__.py
create mode 100644 odoo_project/models/odoo_module_branch.py
create mode 100644 odoo_project/models/odoo_project.py
create mode 100644 odoo_project/security/ir.model.access.csv
create mode 100644 odoo_project/views/odoo_module_branch.xml
create mode 100644 odoo_project/views/odoo_project.xml
create mode 100644 odoo_project/wizards/__init__.py
create mode 100644 odoo_project/wizards/odoo_project_import_modules.py
create mode 100644 odoo_project/wizards/odoo_project_import_modules.xml
diff --git a/odoo_project/__init__.py b/odoo_project/__init__.py
new file mode 100644
index 00000000..aee8895e
--- /dev/null
+++ b/odoo_project/__init__.py
@@ -0,0 +1,2 @@
+from . import models
+from . import wizards
diff --git a/odoo_project/__manifest__.py b/odoo_project/__manifest__.py
new file mode 100644
index 00000000..64cd3410
--- /dev/null
+++ b/odoo_project/__manifest__.py
@@ -0,0 +1,21 @@
+# Copyright 2023 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
+{
+ "name": "Odoo Project",
+ "summary": "Analyze your Odoo projects code bases.",
+ "version": "16.0.1.0.0",
+ "category": "Tools",
+ "author": "Camptocamp, Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/TODO",
+ "data": [
+ "security/ir.model.access.csv",
+ "views/odoo_module_branch.xml",
+ "views/odoo_project.xml",
+ "wizards/odoo_project_import_modules.xml",
+ ],
+ "installable": True,
+ "depends": [
+ "odoo_repository",
+ ],
+ "license": "AGPL-3",
+}
diff --git a/odoo_project/models/__init__.py b/odoo_project/models/__init__.py
new file mode 100644
index 00000000..1a51d937
--- /dev/null
+++ b/odoo_project/models/__init__.py
@@ -0,0 +1,2 @@
+from . import odoo_project
+from . import odoo_module_branch
diff --git a/odoo_project/models/odoo_module_branch.py b/odoo_project/models/odoo_module_branch.py
new file mode 100644
index 00000000..d1adb2a4
--- /dev/null
+++ b/odoo_project/models/odoo_module_branch.py
@@ -0,0 +1,15 @@
+# Copyright 2023 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
+
+from odoo import fields, models
+
+
+class OdooModuleBranch(models.Model):
+ _inherit = "odoo.module.branch"
+
+ odoo_project_ids = fields.Many2many(
+ comodel_name="odoo.project",
+ relation="odoo_project_module_branch_rel",
+ column1="module_branch_id", column2="odoo_project_id",
+ string="Projects",
+ )
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
new file mode 100644
index 00000000..ebb142a8
--- /dev/null
+++ b/odoo_project/models/odoo_project.py
@@ -0,0 +1,117 @@
+# Copyright 2023 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
+
+import ast
+
+from odoo import api, fields, models
+
+
+class OdooProject(models.Model):
+ _name = "odoo.project"
+ _inherits = {"odoo.repository": "repository_id"}
+ _description = "Odoo Project"
+ _order = "name"
+
+ name = fields.Char(required=True, index=True)
+ active = fields.Boolean(default=True)
+ repository_id = fields.Many2one(
+ comodel_name="odoo.repository",
+ ondelete="restrict",
+ string="Repository",
+ domain=[
+ ("clone_branch_id", "!=", False),
+ ("odoo_version_id", "!=", False),
+ ],
+ required=True,
+ )
+ module_branch_ids = fields.Many2many(
+ comodel_name="odoo.module.branch",
+ relation="odoo_project_module_branch_rel",
+ column1="odoo_project_id", column2="module_branch_id",
+ string="Modules/Branch",
+ )
+ module_ids = fields.Many2many(
+ comodel_name="odoo.module",
+ relation="odoo_project_module_rel",
+ column1="odoo_project_id", column2="module_id",
+ string="Modules",
+ compute="_compute_module_ids",
+ store=True,
+ )
+ modules_count = fields.Integer(compute="_compute_modules_count")
+ module_not_installed_ids = fields.Many2many(
+ comodel_name="odoo.module.branch",
+ string="Modules not installed",
+ help="Modules available in the project repository but not installed.",
+ compute="_compute_module_not_installed_ids",
+ )
+ unmerged_module_ids = fields.Many2many(
+ comodel_name="odoo.module.branch",
+ string="Modules to merge",
+ help="Modules installed belonging to an open PR.",
+ compute="_compute_unmerged_module_ids",
+ )
+ unknown_module_ids = fields.Many2many(
+ comodel_name="odoo.module.branch",
+ string="Modules unknown",
+ help="Modules installed but cannot be found among repositories/branches.",
+ compute="_compute_unknown_module_ids",
+ )
+
+ @api.depends("module_branch_ids.module_id")
+ def _compute_module_ids(self):
+ for rec in self:
+ rec.module_ids = rec.module_branch_ids.module_id.ids
+
+ @api.depends("module_branch_ids")
+ def _compute_modules_count(self):
+ for rec in self:
+ rec.modules_count = len(rec.module_branch_ids)
+
+ @api.depends("repository_id.branch_ids.module_ids", "module_branch_ids")
+ def _compute_module_not_installed_ids(self):
+ for rec in self:
+ all_module_ids = set(rec.repository_id.branch_ids.module_ids.ids)
+ installed_module_ids = set(rec.module_branch_ids.ids)
+ rec.module_not_installed_ids = list(all_module_ids - installed_module_ids)
+
+ @api.depends("module_branch_ids.pr_url")
+ def _compute_unmerged_module_ids(self):
+ for rec in self:
+ rec.unmerged_module_ids = rec.module_branch_ids.filtered(
+ lambda module: module.pr_url
+ )
+
+ @api.depends("module_branch_ids.repository_id")
+ def _compute_unknown_module_ids(self):
+ for rec in self:
+ rec.unknown_module_ids = rec.module_branch_ids.filtered(
+ lambda module: not module.repository_id
+ )
+
+ def open_import_modules(self):
+ """Open a wizard to import the modules of this Odoo project."""
+ self.ensure_one()
+ action = self.env["ir.actions.actions"]._for_xml_id(
+ "odoo_project.odoo_project_import_modules_action"
+ )
+ ctx = action.get("context", {})
+ if isinstance(ctx, str):
+ ctx = ast.literal_eval(ctx)
+ ctx["default_odoo_project_id"] = self.id
+ action["context"] = ctx
+ return action
+
+ def open_modules(self):
+ self.ensure_one()
+ action = self.env["ir.actions.actions"]._for_xml_id(
+ "odoo_repository.odoo_module_branch_action"
+ )
+ ctx = action.get("context", {})
+ if isinstance(ctx, str):
+ ctx = ast.literal_eval(ctx)
+ action["domain"] = [("id", "in", self.module_branch_ids.ids)]
+ ctx["search_default_group_by_org_id"] = 1
+ ctx["search_default_group_by_repository_id"] = 2
+ action["context"] = ctx
+ return action
diff --git a/odoo_project/security/ir.model.access.csv b/odoo_project/security/ir.model.access.csv
new file mode 100644
index 00000000..6cbba4ce
--- /dev/null
+++ b/odoo_project/security/ir.model.access.csv
@@ -0,0 +1,4 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_odoo_project_user,odoo_project_user,model_odoo_project,base.group_user,1,1,1,0
+access_odoo_project_manager_manager,odoo_project_manager,model_odoo_project,base.group_system,1,1,1,1
+access_odoo_project_import_modules_user,odoo_project_import_modules_user,model_odoo_project_import_modules,base.group_user,1,1,1,1
diff --git a/odoo_project/views/odoo_module_branch.xml b/odoo_project/views/odoo_module_branch.xml
new file mode 100644
index 00000000..84147403
--- /dev/null
+++ b/odoo_project/views/odoo_module_branch.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+ odoo.module.branch.form.inherit
+ odoo.module.branch
+
+
+
+
+
+
+
+
+
+
+
+ odoo.module.branch.search.inherit
+ odoo.module.branch
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
new file mode 100644
index 00000000..f782bc9f
--- /dev/null
+++ b/odoo_project/views/odoo_project.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+ odoo.project.form
+ odoo.project
+
+
+
+
+
+
+ odoo.project.tree
+ odoo.project
+
+
+
+
+
+
+
+
+
+
+ odoo.project.search
+ odoo.project
+ search
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Projects
+ ir.actions.act_window
+ odoo.project
+
+
+
+
+
+
diff --git a/odoo_project/wizards/__init__.py b/odoo_project/wizards/__init__.py
new file mode 100644
index 00000000..7b4f991f
--- /dev/null
+++ b/odoo_project/wizards/__init__.py
@@ -0,0 +1 @@
+from . import odoo_project_import_modules
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
new file mode 100644
index 00000000..b68abbe3
--- /dev/null
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -0,0 +1,79 @@
+# Copyright 2023 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
+
+import re
+
+from odoo import fields, models
+
+
+class OdooProjectImportModules(models.TransientModel):
+ _name = "odoo.project.import.modules"
+ _description = "Import modules for an Odoo project"
+
+ odoo_project_id = fields.Many2one(
+ comodel_name="odoo.project",
+ string="Project",
+ required=True,
+ )
+ modules_list = fields.Text(
+ string="Modules List",
+ help=(
+ "Copy/paste your list of technical module names here.\n"
+ "They can be separated by spaces, tabulations, comma or any other "
+ "special characters."
+ ),
+ required=True,
+ )
+
+ def action_import(self):
+ """Import the modules for the given Odoo project."""
+ self.ensure_one()
+ self.odoo_project_id.module_branch_ids = False
+ module_names = (
+ re.split(r"\W+", self.modules_list) if self.modules_list else []
+ )
+ module_names = list(filter(None, module_names))
+ module_branch_ids = []
+ for module_name in module_names:
+ module = self._get_module(module_name)
+ module_branch = self._get_module_branch(module)
+ module_branch_ids.append(module_branch.id)
+ self.odoo_project_id.module_branch_ids = module_branch_ids
+ return True
+
+ def _get_module(self, module_name):
+ """Return a `odoo.module` record.
+
+ If it doesn't exist it'll be automatically created.
+ """
+ module_model = self.env["odoo.module"]
+ module = module_model.search([("name", "=", module_name)])
+ if not module:
+ module = module_model.sudo().create({"name": module_name})
+ return module
+
+ def _get_module_branch(self, module):
+ """Return a `odoo.module.branch` record for the project.
+
+ If it doesn't exist it'll be automatically created.
+ """
+ module_branch_model = self.env["odoo.module.branch"]
+ args = [
+ ("module_id", "=", module.id),
+ ("branch_id", "=", self.odoo_project_id.odoo_version_id.id),
+ ]
+ module_branch = module_branch_model.search(args)
+ if not module_branch:
+ # Create the module to make it available for the project
+ branch = self.odoo_project_id.odoo_version_id
+ values = {
+ "module_id": module.id,
+ "branch_id": branch.id,
+ }
+ module_branch = module_branch_model.sudo().create(values)
+ if not module_branch.repository_branch_id:
+ # If the module hasn't been found in existing repositories content,
+ # it could be available somewhere on GitHub as a PR that could help
+ # to identity its repository
+ module_branch.with_delay().action_find_pr_url()
+ return module_branch
diff --git a/odoo_project/wizards/odoo_project_import_modules.xml b/odoo_project/wizards/odoo_project_import_modules.xml
new file mode 100644
index 00000000..60af61ef
--- /dev/null
+++ b/odoo_project/wizards/odoo_project_import_modules.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+ odoo.project.import.modules.form
+ odoo.project.import.modules
+
+
+
+
+
+
+ Import Project Modules
+ ir.actions.act_window
+ odoo.project.import.modules
+ form
+ new
+
+
+
From f2bb32d443dca7dd6b593e7185e88bdec4300ec8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 3 Nov 2023 11:13:16 +0100
Subject: [PATCH 02/38] New data model 'odoo.project.module'
This new data model is here to distinguish available upstream modules
and installed modules in a project.
It inherits from `odoo.module.branch` so it has access to all its data,
but is linked to an `odoo.project` and has its own `installed_version`
so it becomes easy to find modules that could be upgraded within a
project.
---
odoo_project/__manifest__.py | 2 +
odoo_project/models/__init__.py | 1 +
odoo_project/models/odoo_module_branch.py | 14 +++-
odoo_project/models/odoo_project.py | 41 +++++-----
odoo_project/models/odoo_project_module.py | 38 ++++++++++
odoo_project/security/ir.model.access.csv | 1 +
odoo_project/views/menu.xml | 11 +++
odoo_project/views/odoo_module_branch.xml | 2 +-
odoo_project/views/odoo_project.xml | 14 ++--
odoo_project/views/odoo_project_module.xml | 75 +++++++++++++++++++
.../wizards/odoo_project_import_modules.py | 58 ++++++++++----
11 files changed, 215 insertions(+), 42 deletions(-)
create mode 100644 odoo_project/models/odoo_project_module.py
create mode 100644 odoo_project/views/menu.xml
create mode 100644 odoo_project/views/odoo_project_module.xml
diff --git a/odoo_project/__manifest__.py b/odoo_project/__manifest__.py
index 64cd3410..89c6da71 100644
--- a/odoo_project/__manifest__.py
+++ b/odoo_project/__manifest__.py
@@ -9,8 +9,10 @@
"website": "https://github.com/OCA/TODO",
"data": [
"security/ir.model.access.csv",
+ "views/menu.xml",
"views/odoo_module_branch.xml",
"views/odoo_project.xml",
+ "views/odoo_project_module.xml",
"wizards/odoo_project_import_modules.xml",
],
"installable": True,
diff --git a/odoo_project/models/__init__.py b/odoo_project/models/__init__.py
index 1a51d937..c59b850c 100644
--- a/odoo_project/models/__init__.py
+++ b/odoo_project/models/__init__.py
@@ -1,2 +1,3 @@
from . import odoo_project
+from . import odoo_project_module
from . import odoo_module_branch
diff --git a/odoo_project/models/odoo_module_branch.py b/odoo_project/models/odoo_module_branch.py
index d1adb2a4..d0232ef7 100644
--- a/odoo_project/models/odoo_module_branch.py
+++ b/odoo_project/models/odoo_module_branch.py
@@ -1,15 +1,27 @@
# Copyright 2023 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
-from odoo import fields, models
+from odoo import api, fields, models
class OdooModuleBranch(models.Model):
_inherit = "odoo.module.branch"
+ odoo_project_module_ids = fields.One2many(
+ comodel_name="odoo.project.module",
+ inverse_name="module_branch_id",
+ string="Deployed Modules",
+ )
odoo_project_ids = fields.Many2many(
comodel_name="odoo.project",
relation="odoo_project_module_branch_rel",
column1="module_branch_id", column2="odoo_project_id",
string="Projects",
+ compute="_compute_module_ids",
+ store=True,
)
+
+ @api.depends("odoo_project_module_ids.odoo_project_id")
+ def _compute_module_ids(self):
+ for rec in self:
+ rec.odoo_project_ids = rec.odoo_project_module_ids.odoo_project_id.ids
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index ebb142a8..596d0d18 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -24,11 +24,10 @@ class OdooProject(models.Model):
],
required=True,
)
- module_branch_ids = fields.Many2many(
- comodel_name="odoo.module.branch",
- relation="odoo_project_module_branch_rel",
- column1="odoo_project_id", column2="module_branch_id",
- string="Modules/Branch",
+ project_module_ids = fields.One2many(
+ comodel_name="odoo.project.module",
+ inverse_name="odoo_project_id",
+ string="Deployed Modules",
)
module_ids = fields.Many2many(
comodel_name="odoo.module",
@@ -58,35 +57,39 @@ class OdooProject(models.Model):
compute="_compute_unknown_module_ids",
)
- @api.depends("module_branch_ids.module_id")
+ @api.depends("project_module_ids.module_id")
def _compute_module_ids(self):
for rec in self:
- rec.module_ids = rec.module_branch_ids.module_id.ids
+ rec.module_ids = rec.project_module_ids.module_id.ids
- @api.depends("module_branch_ids")
+ @api.depends("project_module_ids")
def _compute_modules_count(self):
for rec in self:
- rec.modules_count = len(rec.module_branch_ids)
+ rec.modules_count = len(rec.project_module_ids)
- @api.depends("repository_id.branch_ids.module_ids", "module_branch_ids")
+ @api.depends("repository_id.branch_ids.module_ids", "project_module_ids")
def _compute_module_not_installed_ids(self):
for rec in self:
all_module_ids = set(rec.repository_id.branch_ids.module_ids.ids)
- installed_module_ids = set(rec.module_branch_ids.ids)
+ installed_module_ids = set(rec.project_module_ids.ids)
rec.module_not_installed_ids = list(all_module_ids - installed_module_ids)
- @api.depends("module_branch_ids.pr_url")
+ @api.depends("project_module_ids.pr_url")
def _compute_unmerged_module_ids(self):
for rec in self:
- rec.unmerged_module_ids = rec.module_branch_ids.filtered(
- lambda module: module.pr_url
+ rec.unmerged_module_ids = (
+ rec.project_module_ids.module_branch_id.filtered(
+ lambda module: module.pr_url
+ )
)
- @api.depends("module_branch_ids.repository_id")
+ @api.depends("project_module_ids.repository_id")
def _compute_unknown_module_ids(self):
for rec in self:
- rec.unknown_module_ids = rec.module_branch_ids.filtered(
- lambda module: not module.repository_id
+ rec.unknown_module_ids = (
+ rec.project_module_ids.module_branch_id.filtered(
+ lambda module: not module.repository_id
+ )
)
def open_import_modules(self):
@@ -105,12 +108,12 @@ def open_import_modules(self):
def open_modules(self):
self.ensure_one()
action = self.env["ir.actions.actions"]._for_xml_id(
- "odoo_repository.odoo_module_branch_action"
+ "odoo_project.odoo_project_module_action"
)
ctx = action.get("context", {})
if isinstance(ctx, str):
ctx = ast.literal_eval(ctx)
- action["domain"] = [("id", "in", self.module_branch_ids.ids)]
+ action["domain"] = [("id", "in", self.project_module_ids.ids)]
ctx["search_default_group_by_org_id"] = 1
ctx["search_default_group_by_repository_id"] = 2
action["context"] = ctx
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
new file mode 100644
index 00000000..031ceac4
--- /dev/null
+++ b/odoo_project/models/odoo_project_module.py
@@ -0,0 +1,38 @@
+# Copyright 2023 Camptocamp SA
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
+
+from odoo import api, fields, models
+from odoo.tools.parse_version import parse_version as v
+
+
+class OdooProjectModule(models.Model):
+ _name = "odoo.project.module"
+ _inherits = {"odoo.module.branch": "module_branch_id"}
+ _description = "Odoo Project Module"
+ _order = "name"
+
+ odoo_project_id = fields.Many2one(
+ comodel_name="odoo.project",
+ ondelete="cascade",
+ string="Project",
+ )
+ module_branch_id = fields.Many2one(
+ comodel_name="odoo.module.branch",
+ ondelete="set null",
+ string="Upstream Module",
+ required=True,
+ )
+ installed_version = fields.Char()
+ to_upgrade = fields.Boolean(
+ string="To Upgrade",
+ compute="_compute_to_upgrade",
+ store=True,
+ )
+
+ @api.depends("version", "installed_version")
+ def _compute_to_upgrade(self):
+ for rec in self:
+ rec.to_upgrade = False
+ installed_version = rec.installed_version or rec.version
+ if installed_version and rec.version:
+ rec.to_upgrade = v(installed_version) < v(rec.version)
diff --git a/odoo_project/security/ir.model.access.csv b/odoo_project/security/ir.model.access.csv
index 6cbba4ce..209d57da 100644
--- a/odoo_project/security/ir.model.access.csv
+++ b/odoo_project/security/ir.model.access.csv
@@ -1,4 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_odoo_project_user,odoo_project_user,model_odoo_project,base.group_user,1,1,1,0
access_odoo_project_manager_manager,odoo_project_manager,model_odoo_project,base.group_system,1,1,1,1
+access_odoo_project_module_user,odoo_project_module_user,model_odoo_project_module,base.group_user,1,0,0,0
access_odoo_project_import_modules_user,odoo_project_import_modules_user,model_odoo_project_import_modules,base.group_user,1,1,1,1
diff --git a/odoo_project/views/menu.xml b/odoo_project/views/menu.xml
new file mode 100644
index 00000000..07e8d4bb
--- /dev/null
+++ b/odoo_project/views/menu.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/odoo_project/views/odoo_module_branch.xml b/odoo_project/views/odoo_module_branch.xml
index 84147403..0bbf4cf5 100644
--- a/odoo_project/views/odoo_module_branch.xml
+++ b/odoo_project/views/odoo_module_branch.xml
@@ -23,7 +23,7 @@
+ domain="[('odoo_project_ids', '!=', False)]"/>
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index f782bc9f..acbbbe8f 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -13,7 +13,7 @@
string="Import modules" class="btn-primary"/>
-
+
@@ -27,7 +27,7 @@
-
+
@@ -70,7 +70,7 @@
-
+
@@ -83,13 +83,12 @@
+
-
@@ -103,8 +102,7 @@
+ parent="odoo_project_main_menu"
+ action="odoo_project_action"/>
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
new file mode 100644
index 00000000..1bc5483a
--- /dev/null
+++ b/odoo_project/views/odoo_project_module.xml
@@ -0,0 +1,75 @@
+
+
+
+
+
+ odoo.project.module.form.inherit
+ odoo.project.module
+
+ primary
+
+
+
+
+
+ Last Version
+
+
+
+
+
+ odoo.project.module.tree.inherit
+ odoo.project.module
+
+ primary
+
+
+ to_upgrade
+ pr_url
+
+
+ hide
+
+
+
+
+
+
+ Last Version
+
+
+
+ show
+
+
+
+
+
+ odoo.project.module.search.inherit
+ odoo.project.module
+
+ primary
+
+
+
+
+
+
+
+
+
+
+
+ Installed Modules
+ ir.actions.act_window
+ odoo.project.module
+
+
+
+
+
+
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
index b68abbe3..a3cba9b7 100644
--- a/odoo_project/wizards/odoo_project_import_modules.py
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -19,8 +19,9 @@ class OdooProjectImportModules(models.TransientModel):
string="Modules List",
help=(
"Copy/paste your list of technical module names here.\n"
- "They can be separated by spaces, tabulations, comma or any other "
- "special characters."
+ "One module per line, with an optional version number placed "
+ "after the module name separated by any special character "
+ "(space, tabulation, comma...)."
),
required=True,
)
@@ -28,17 +29,25 @@ class OdooProjectImportModules(models.TransientModel):
def action_import(self):
"""Import the modules for the given Odoo project."""
self.ensure_one()
- self.odoo_project_id.module_branch_ids = False
- module_names = (
- re.split(r"\W+", self.modules_list) if self.modules_list else []
- )
- module_names = list(filter(None, module_names))
- module_branch_ids = []
- for module_name in module_names:
+ self.odoo_project_id.sudo().project_module_ids = False
+ module_lines = list(filter(None, self.modules_list.split("\n")))
+ # module_names = (
+ # re.split(r"\W+", self.modules_list) if self.modules_list else []
+ # )
+ # module_names = list(filter(None, module_names))
+ project_module_ids = []
+ for line in module_lines:
+ data = re.split(r"\W+", line, maxsplit=1)
+ if len(data) > 1:
+ module_name, version = data
+ else:
+ module_name, version = data[0], False
+ # for module_name in module_names:
module = self._get_module(module_name)
module_branch = self._get_module_branch(module)
- module_branch_ids.append(module_branch.id)
- self.odoo_project_id.module_branch_ids = module_branch_ids
+ project_module = self._get_project_module(module_branch, version)
+ project_module_ids.append(project_module.id)
+ self.odoo_project_id.sudo().project_module_ids = project_module_ids
return True
def _get_module(self, module_name):
@@ -53,7 +62,7 @@ def _get_module(self, module_name):
return module
def _get_module_branch(self, module):
- """Return a `odoo.module.branch` record for the project.
+ """Return a `odoo.module.branch` record.
If it doesn't exist it'll be automatically created.
"""
@@ -64,7 +73,7 @@ def _get_module_branch(self, module):
]
module_branch = module_branch_model.search(args)
if not module_branch:
- # Create the module to make it available for the project
+ # Create the module
branch = self.odoo_project_id.odoo_version_id
values = {
"module_id": module.id,
@@ -77,3 +86,26 @@ def _get_module_branch(self, module):
# to identity its repository
module_branch.with_delay().action_find_pr_url()
return module_branch
+
+ def _get_project_module(self, module_branch, version):
+ """Return a `odoo.project.module` record for the project.
+
+ If it doesn't exist it'll be automatically created.
+ """
+ project_module_model = self.env["odoo.project.module"]
+ args = [
+ ("module_branch_id", "=", module_branch.id),
+ ("odoo_project_id", "=", self.odoo_project_id.id),
+ ]
+ project_module = project_module_model.search(args)
+ values = {
+ "module_branch_id": module_branch.id,
+ "odoo_project_id": self.odoo_project_id.id,
+ "installed_version": version,
+ }
+ if project_module:
+ project_module.sudo().write(values)
+ else:
+ # Create the module to make it available for the project
+ project_module = project_module_model.sudo().create(values)
+ return project_module
From 1c06ae2e5b2fb30b763ef462bd178fdc28ed7436 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 3 Nov 2023 11:36:16 +0100
Subject: [PATCH 03/38] odoo_project: fix computation of uninstalled modules
---
odoo_project/models/odoo_project.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index 596d0d18..fd473789 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -67,11 +67,11 @@ def _compute_modules_count(self):
for rec in self:
rec.modules_count = len(rec.project_module_ids)
- @api.depends("repository_id.branch_ids.module_ids", "project_module_ids")
+ @api.depends("repository_id.branch_ids.module_ids", "project_module_ids.module_branch_id")
def _compute_module_not_installed_ids(self):
for rec in self:
all_module_ids = set(rec.repository_id.branch_ids.module_ids.ids)
- installed_module_ids = set(rec.project_module_ids.ids)
+ installed_module_ids = set(rec.project_module_ids.module_branch_id.ids)
rec.module_not_installed_ids = list(all_module_ids - installed_module_ids)
@api.depends("project_module_ids.pr_url")
From 11513936fd0b58d064c2c9ad3b87f1d65a090593 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 3 Nov 2023 12:13:31 +0100
Subject: [PATCH 04/38] Apply pre-commit
---
odoo_project/README.rst | 61 +++
odoo_project/__manifest__.py | 2 +-
odoo_project/models/odoo_module_branch.py | 3 +-
odoo_project/models/odoo_project.py | 19 +-
odoo_project/models/odoo_project_module.py | 1 -
odoo_project/readme/CONTRIBUTORS.rst | 2 +
odoo_project/readme/DESCRIPTION.rst | 1 +
odoo_project/static/description/index.html | 417 ++++++++++++++++++
odoo_project/views/menu.xml | 12 +-
odoo_project/views/odoo_module_branch.xml | 29 +-
odoo_project/views/odoo_project.xml | 82 ++--
odoo_project/views/odoo_project_module.xml | 35 +-
.../wizards/odoo_project_import_modules.py | 3 +-
.../wizards/odoo_project_import_modules.xml | 15 +-
14 files changed, 601 insertions(+), 81 deletions(-)
create mode 100644 odoo_project/README.rst
create mode 100644 odoo_project/readme/CONTRIBUTORS.rst
create mode 100644 odoo_project/readme/DESCRIPTION.rst
create mode 100644 odoo_project/static/description/index.html
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
new file mode 100644
index 00000000..e948e679
--- /dev/null
+++ b/odoo_project/README.rst
@@ -0,0 +1,61 @@
+============
+Odoo Project
+============
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:dc350fed0f23a205eb546f1673d2c5e99b4f6cdb5be6d6ab76a010e2517e203b
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
+ :target: https://odoo-community.org/page/development-status
+ :alt: Beta
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-3
+.. |badge3| image:: https://img.shields.io/badge/github-camptocamp%2Fodoo--repository-lightgray.png?logo=github
+ :target: https://github.com/camptocamp/odoo-repository/tree/16.0/odoo_project
+ :alt: camptocamp/odoo-repository
+
+|badge1| |badge2| |badge3|
+
+This module allows to declare your Odoo projects and analyze their code bases.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub Issues `_.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+`feedback `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+~~~~~~~
+
+* Camptocamp
+
+Contributors
+~~~~~~~~~~~~
+
+* Camptocamp
+ * Sébastien Alix
+
+Maintainers
+~~~~~~~~~~~
+
+This module is part of the `camptocamp/odoo-repository `_ project on GitHub.
+
+You are welcome to contribute.
diff --git a/odoo_project/__manifest__.py b/odoo_project/__manifest__.py
index 89c6da71..4ff208db 100644
--- a/odoo_project/__manifest__.py
+++ b/odoo_project/__manifest__.py
@@ -6,7 +6,7 @@
"version": "16.0.1.0.0",
"category": "Tools",
"author": "Camptocamp, Odoo Community Association (OCA)",
- "website": "https://github.com/OCA/TODO",
+ "website": "https://github.com/camptocamp/odoo-repository",
"data": [
"security/ir.model.access.csv",
"views/menu.xml",
diff --git a/odoo_project/models/odoo_module_branch.py b/odoo_project/models/odoo_module_branch.py
index d0232ef7..6f190121 100644
--- a/odoo_project/models/odoo_module_branch.py
+++ b/odoo_project/models/odoo_module_branch.py
@@ -15,7 +15,8 @@ class OdooModuleBranch(models.Model):
odoo_project_ids = fields.Many2many(
comodel_name="odoo.project",
relation="odoo_project_module_branch_rel",
- column1="module_branch_id", column2="odoo_project_id",
+ column1="module_branch_id",
+ column2="odoo_project_id",
string="Projects",
compute="_compute_module_ids",
store=True,
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index fd473789..7bf51e9b 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -32,7 +32,8 @@ class OdooProject(models.Model):
module_ids = fields.Many2many(
comodel_name="odoo.module",
relation="odoo_project_module_rel",
- column1="odoo_project_id", column2="module_id",
+ column1="odoo_project_id",
+ column2="module_id",
string="Modules",
compute="_compute_module_ids",
store=True,
@@ -67,7 +68,9 @@ def _compute_modules_count(self):
for rec in self:
rec.modules_count = len(rec.project_module_ids)
- @api.depends("repository_id.branch_ids.module_ids", "project_module_ids.module_branch_id")
+ @api.depends(
+ "repository_id.branch_ids.module_ids", "project_module_ids.module_branch_id"
+ )
def _compute_module_not_installed_ids(self):
for rec in self:
all_module_ids = set(rec.repository_id.branch_ids.module_ids.ids)
@@ -77,19 +80,15 @@ def _compute_module_not_installed_ids(self):
@api.depends("project_module_ids.pr_url")
def _compute_unmerged_module_ids(self):
for rec in self:
- rec.unmerged_module_ids = (
- rec.project_module_ids.module_branch_id.filtered(
- lambda module: module.pr_url
- )
+ rec.unmerged_module_ids = rec.project_module_ids.module_branch_id.filtered(
+ lambda module: module.pr_url
)
@api.depends("project_module_ids.repository_id")
def _compute_unknown_module_ids(self):
for rec in self:
- rec.unknown_module_ids = (
- rec.project_module_ids.module_branch_id.filtered(
- lambda module: not module.repository_id
- )
+ rec.unknown_module_ids = rec.project_module_ids.module_branch_id.filtered(
+ lambda module: not module.repository_id
)
def open_import_modules(self):
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index 031ceac4..2beb93c3 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -24,7 +24,6 @@ class OdooProjectModule(models.Model):
)
installed_version = fields.Char()
to_upgrade = fields.Boolean(
- string="To Upgrade",
compute="_compute_to_upgrade",
store=True,
)
diff --git a/odoo_project/readme/CONTRIBUTORS.rst b/odoo_project/readme/CONTRIBUTORS.rst
new file mode 100644
index 00000000..a0c91e35
--- /dev/null
+++ b/odoo_project/readme/CONTRIBUTORS.rst
@@ -0,0 +1,2 @@
+* Camptocamp
+ * Sébastien Alix
diff --git a/odoo_project/readme/DESCRIPTION.rst b/odoo_project/readme/DESCRIPTION.rst
new file mode 100644
index 00000000..a86173ee
--- /dev/null
+++ b/odoo_project/readme/DESCRIPTION.rst
@@ -0,0 +1 @@
+This module allows to declare your Odoo projects and analyze their code bases.
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
new file mode 100644
index 00000000..747faf31
--- /dev/null
+++ b/odoo_project/static/description/index.html
@@ -0,0 +1,417 @@
+
+
+
+
+
+
+Odoo Project
+
+
+
+
+
Odoo Project
+
+
+
+
This module allows to declare your Odoo projects and analyze their code bases.
+
Table of contents
+
+
+
+
Bugs are tracked on GitHub Issues .
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+feedback .
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
diff --git a/odoo_project/views/menu.xml b/odoo_project/views/menu.xml
index 07e8d4bb..60def18d 100644
--- a/odoo_project/views/menu.xml
+++ b/odoo_project/views/menu.xml
@@ -1,11 +1,13 @@
-
+
-
+
diff --git a/odoo_project/views/odoo_module_branch.xml b/odoo_project/views/odoo_module_branch.xml
index 0bbf4cf5..570b8254 100644
--- a/odoo_project/views/odoo_module_branch.xml
+++ b/odoo_project/views/odoo_module_branch.xml
@@ -1,4 +1,4 @@
-
+
@@ -6,11 +6,11 @@
odoo.module.branch.form.inherit
odoo.module.branch
-
+
-
+
@@ -19,17 +19,26 @@
odoo.module.branch.search.inherit
odoo.module.branch
-
+
-
-
+
+
-
+
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index acbbbe8f..4c28bf52 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -1,4 +1,4 @@
-
+
@@ -9,33 +9,45 @@
@@ -81,14 +93,20 @@
search
-
-
-
+
+
+
-
-
+
+
@@ -98,11 +116,13 @@
Projects
ir.actions.act_window
odoo.project
-
+
-
+
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index 1bc5483a..6feac27a 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -1,4 +1,4 @@
-
+
@@ -6,11 +6,11 @@
odoo.project.module.form.inherit
odoo.project.module
-
+
primary
-
+
Last Version
@@ -21,7 +21,7 @@
odoo.project.module.tree.inherit
odoo.project.module
-
+
primary
@@ -32,12 +32,12 @@
hide
-
-
+
+
Last Version
-
+
show
@@ -48,15 +48,18 @@
odoo.project.module.search.inherit
odoo.project.module
-
+
primary
-
+
-
+
@@ -65,11 +68,13 @@
Installed Modules
ir.actions.act_window
odoo.project.module
-
+
-
+
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
index a3cba9b7..d7de8ac6 100644
--- a/odoo_project/wizards/odoo_project_import_modules.py
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -16,7 +16,6 @@ class OdooProjectImportModules(models.TransientModel):
required=True,
)
modules_list = fields.Text(
- string="Modules List",
help=(
"Copy/paste your list of technical module names here.\n"
"One module per line, with an optional version number placed "
@@ -42,7 +41,7 @@ def action_import(self):
module_name, version = data
else:
module_name, version = data[0], False
- # for module_name in module_names:
+ # for module_name in module_names:
module = self._get_module(module_name)
module_branch = self._get_module_branch(module)
project_module = self._get_project_module(module_branch, version)
diff --git a/odoo_project/wizards/odoo_project_import_modules.xml b/odoo_project/wizards/odoo_project_import_modules.xml
index 60af61ef..34a3da32 100644
--- a/odoo_project/wizards/odoo_project_import_modules.xml
+++ b/odoo_project/wizards/odoo_project_import_modules.xml
@@ -1,4 +1,4 @@
-
+
@@ -10,13 +10,18 @@
From eb3f84661c68417970672429e6c03a8f9bc97c24 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 3 Nov 2023 12:43:00 +0100
Subject: [PATCH 05/38] Remove dead code
---
odoo_project/wizards/odoo_project_import_modules.py | 4 ----
1 file changed, 4 deletions(-)
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
index d7de8ac6..2bf1adb0 100644
--- a/odoo_project/wizards/odoo_project_import_modules.py
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -30,10 +30,6 @@ def action_import(self):
self.ensure_one()
self.odoo_project_id.sudo().project_module_ids = False
module_lines = list(filter(None, self.modules_list.split("\n")))
- # module_names = (
- # re.split(r"\W+", self.modules_list) if self.modules_list else []
- # )
- # module_names = list(filter(None, module_names))
project_module_ids = []
for line in module_lines:
data = re.split(r"\W+", line, maxsplit=1)
From ff69744ca14c40d759b18a1577c0d6d6c1d1607e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Sat, 4 Nov 2023 15:22:41 +0100
Subject: [PATCH 06/38] odoo_project: enable chatter on 'odoo.project'
---
odoo_project/models/odoo_project.py | 1 +
odoo_project/views/odoo_project.xml | 4 ++++
2 files changed, 5 insertions(+)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index 7bf51e9b..e7d816e0 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -9,6 +9,7 @@
class OdooProject(models.Model):
_name = "odoo.project"
_inherits = {"odoo.repository": "repository_id"}
+ _inherit = "mail.thread"
_description = "Odoo Project"
_order = "name"
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index 4c28bf52..e5da2fd4 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -71,6 +71,10 @@
+
+
+
+
From b4cd7eb01fd9ede9136fe502fd3a9aa46beacc94 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Sat, 4 Nov 2023 16:56:06 +0100
Subject: [PATCH 07/38] odoo_project: fix warning regarding '_inherits'
---
odoo_project/models/odoo_project_module.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index 2beb93c3..5868eb4c 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -18,7 +18,7 @@ class OdooProjectModule(models.Model):
)
module_branch_id = fields.Many2one(
comodel_name="odoo.module.branch",
- ondelete="set null",
+ ondelete="cascade",
string="Upstream Module",
required=True,
)
From cbb6564ea437f191c8dec0b69a548cd8b5a2950e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 24 Nov 2023 12:03:14 +0100
Subject: [PATCH 08/38] odoo_project: global 'Installed modules' menu opening
pivot view
---
odoo_project/models/odoo_project.py | 2 +-
odoo_project/views/odoo_project_module.xml | 36 ++++++++++++++++++++++
2 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index e7d816e0..a67625fc 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -108,7 +108,7 @@ def open_import_modules(self):
def open_modules(self):
self.ensure_one()
action = self.env["ir.actions.actions"]._for_xml_id(
- "odoo_project.odoo_project_module_action"
+ "odoo_project.odoo_project_module_for_project_action"
)
ctx = action.get("context", {})
if isinstance(ctx, str):
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index 6feac27a..70004833 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -28,10 +28,14 @@
to_upgrade
pr_url
+
+
+
hide
+
@@ -61,6 +65,22 @@
domain="[('to_upgrade', '=', True)]"
/>
+
+
+ {'group_by': 'odoo_project_id'}
+
+
+
+
+
+ odoo.project.module.pivot
+ odoo.project.module
+
+
+
+
+
+
@@ -68,6 +88,22 @@
Installed Modules
ir.actions.act_window
odoo.project.module
+ tree,form,pivot
+
+
+
+
+
+ pivot
+
+
+
+
+
+ Installed Modules
+ ir.actions.act_window
+ odoo.project.module
+ tree,form,pivot
From c2155f25e52baacadd8db59f343e89640a992564 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 1 Dec 2023 09:41:17 +0100
Subject: [PATCH 09/38] odoo_project: add migration scripts indicator
New boolean field on installed modules to tell if some migration scripts
have to be played between the installed version and the latest version
available.
---
odoo_project/models/odoo_project_module.py | 43 ++++++++++++++++++++++
odoo_project/views/odoo_project_module.xml | 14 ++++++-
2 files changed, 55 insertions(+), 2 deletions(-)
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index 5868eb4c..71b9f3b0 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -27,6 +27,11 @@ class OdooProjectModule(models.Model):
compute="_compute_to_upgrade",
store=True,
)
+ migration_scripts = fields.Boolean(
+ compute="_compute_migration_scripts",
+ store=True,
+ help="Available migration scripts between installed and last version.",
+ )
@api.depends("version", "installed_version")
def _compute_to_upgrade(self):
@@ -35,3 +40,41 @@ def _compute_to_upgrade(self):
installed_version = rec.installed_version or rec.version
if installed_version and rec.version:
rec.to_upgrade = v(installed_version) < v(rec.version)
+
+ @api.depends(
+ "to_upgrade",
+ "installed_version",
+ "version_ids.name",
+ "version_ids.has_migration_script",
+ )
+ def _compute_migration_scripts(self):
+ for rec in self:
+ rec.migration_scripts = False
+ if not rec.to_upgrade:
+ continue
+ installed_version = rec._get_installed_version()
+ versions_with_mig_script = rec.version_ids.filtered(
+ lambda v: (
+ v.sequence > installed_version.sequence and v.has_migration_script
+ )
+ )
+ rec.migration_scripts = bool(versions_with_mig_script)
+
+ def _get_installed_version(self):
+ self.ensure_one()
+ installed_version = self.version_ids.browse()
+ if not self.installed_version:
+ return installed_version
+ # Installed version could not be available in inventoried versions
+ # if it is coming from a pending-merge. In such case we take the last
+ # matching version as the installed one.
+ # - Available versions upstream = "14.0.2.0.0" & "14.0.2.1.0"
+ # - Installed version = "14.0.2.0.1" (in a pending-merge)
+ # - Computed installed version = "14.0.2.0.0"
+ inst_ver = [int(n) for n in self.installed_version.split(".")]
+ for version in self.version_ids.sorted("sequence"):
+ ver = [int(n) for n in version.name.split(".")]
+ if ver > inst_ver:
+ break
+ installed_version = version
+ return installed_version
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index 70004833..1d0da748 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -12,6 +12,9 @@
+
+
+
Last Version
@@ -29,16 +32,18 @@
pr_url
-
+
hide
-
+
+
+
Last Version
@@ -64,6 +69,11 @@
string="To Upgrade"
domain="[('to_upgrade', '=', True)]"
/>
+
From 5a886518437b94a97f50cc5060ccfd1e9d095c14 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 19 Apr 2024 18:24:43 +0200
Subject: [PATCH 10/38] odoo_project: compute nearest installed version
---
odoo_project/models/odoo_project_module.py | 52 +++++++++++++---------
1 file changed, 31 insertions(+), 21 deletions(-)
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index 71b9f3b0..1c5af9cd 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -22,7 +22,17 @@ class OdooProjectModule(models.Model):
string="Upstream Module",
required=True,
)
- installed_version = fields.Char()
+ installed_version = fields.Char(help="Installed version in project database.")
+ installed_version_id = fields.Many2one(
+ comodel_name="odoo.module.branch.version",
+ string="Nearest installed version",
+ 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."
+ ),
+ compute="_compute_installed_version_id",
+ )
to_upgrade = fields.Boolean(
compute="_compute_to_upgrade",
store=True,
@@ -33,6 +43,25 @@ class OdooProjectModule(models.Model):
help="Available migration scripts between installed and last version.",
)
+ @api.depends("installed_version")
+ def _compute_installed_version_id(self):
+ for rec in self:
+ rec.installed_version_id = rec.version_ids.browse()
+ if not rec.installed_version:
+ continue
+ # Installed version could not be available in inventoried versions
+ # if it is coming from a pending-merge. In such case we take the
+ # nearest version matching the installed one.
+ # - Available versions upstream = "14.0.2.0.0" & "14.0.2.1.0"
+ # - Installed version = "14.0.2.0.1" (in a pending-merge)
+ # - Computed installed version = "14.0.2.0.0"
+ inst_ver = [int(n) for n in rec.installed_version.split(".")]
+ for version in rec.version_ids.sorted("sequence"):
+ ver = [int(n) for n in version.name.split(".")]
+ if ver > inst_ver:
+ break
+ rec.installed_version_id = version
+
@api.depends("version", "installed_version")
def _compute_to_upgrade(self):
for rec in self:
@@ -52,29 +81,10 @@ def _compute_migration_scripts(self):
rec.migration_scripts = False
if not rec.to_upgrade:
continue
- installed_version = rec._get_installed_version()
+ installed_version = rec.installed_version_id
versions_with_mig_script = rec.version_ids.filtered(
lambda v: (
v.sequence > installed_version.sequence and v.has_migration_script
)
)
rec.migration_scripts = bool(versions_with_mig_script)
-
- def _get_installed_version(self):
- self.ensure_one()
- installed_version = self.version_ids.browse()
- if not self.installed_version:
- return installed_version
- # Installed version could not be available in inventoried versions
- # if it is coming from a pending-merge. In such case we take the last
- # matching version as the installed one.
- # - Available versions upstream = "14.0.2.0.0" & "14.0.2.1.0"
- # - Installed version = "14.0.2.0.1" (in a pending-merge)
- # - Computed installed version = "14.0.2.0.0"
- inst_ver = [int(n) for n in self.installed_version.split(".")]
- for version in self.version_ids.sorted("sequence"):
- ver = [int(n) for n in version.name.split(".")]
- if ver > inst_ver:
- break
- installed_version = version
- return installed_version
From a62a5ab585365bc053fc817db527c4d16b27e8cc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 19 Apr 2024 18:49:42 +0200
Subject: [PATCH 11/38] odoo_project: add a button to recheck unknown modules
---
odoo_project/models/odoo_project.py | 5 +++++
odoo_project/views/odoo_project.xml | 6 ++++++
2 files changed, 11 insertions(+)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index a67625fc..5b4a88ad 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -118,3 +118,8 @@ def open_modules(self):
ctx["search_default_group_by_repository_id"] = 2
action["context"] = ctx
return action
+
+ def action_find_unknown_modules(self):
+ """Try to locate unknown modules."""
+ for module in self.unknown_module_ids:
+ module.action_find_pr_url()
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index e5da2fd4..4cd80d9c 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -68,6 +68,12 @@
+
From d49acbe913f63426482e3cfa245003a64c306e13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 10 May 2024 09:55:26 +0200
Subject: [PATCH 12/38] odoo_project: do not try to find a PR for blacklisted
modules
---
odoo_project/wizards/odoo_project_import_modules.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
index 2bf1adb0..bf94436c 100644
--- a/odoo_project/wizards/odoo_project_import_modules.py
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -75,7 +75,7 @@ def _get_module_branch(self, module):
"branch_id": branch.id,
}
module_branch = module_branch_model.sudo().create(values)
- if not module_branch.repository_branch_id:
+ if not module.blacklisted and not module_branch.repository_branch_id:
# If the module hasn't been found in existing repositories content,
# it could be available somewhere on GitHub as a PR that could help
# to identity its repository
From 1005a6937c1c5a6ceae284817ab1c0bc6c9abeed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Thu, 20 Jun 2024 10:58:11 +0200
Subject: [PATCH 13/38] odoo_project: split reverse dependencies in two,
installed/not installed
---
odoo_project/models/odoo_project_module.py | 29 +++++++++++++++++++++
odoo_project/views/odoo_project_module.xml | 30 ++++++++++++++++++++++
2 files changed, 59 insertions(+)
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index 1c5af9cd..84890bf7 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -42,6 +42,16 @@ class OdooProjectModule(models.Model):
store=True,
help="Available migration scripts between installed and last version.",
)
+ installed_reverse_dependency_ids = fields.Many2many(
+ comodel_name="odoo.project.module",
+ compute="_compute_installed_reverse_dependency_ids",
+ string="Installed Reverse Dependencies",
+ )
+ not_installed_reverse_dependency_ids = fields.Many2many(
+ comodel_name="odoo.module.branch",
+ compute="_compute_installed_reverse_dependency_ids",
+ string="Not Installed Reverse Dependencies",
+ )
@api.depends("installed_version")
def _compute_installed_version_id(self):
@@ -88,3 +98,22 @@ def _compute_migration_scripts(self):
)
)
rec.migration_scripts = bool(versions_with_mig_script)
+
+ @api.depends("odoo_project_id", "reverse_dependency_ids")
+ def _compute_installed_reverse_dependency_ids(self):
+ for rec in self:
+ installed_project_modules = rec.odoo_project_id.project_module_ids
+ installed_modules = installed_project_modules.module_branch_id
+ installed_reverse_dependencies = rec.reverse_dependency_ids.filtered(
+ lambda dep: dep in installed_modules
+ )
+ # Installed rev. deps. are 'odoo.project.module' records
+ rec.installed_reverse_dependency_ids = (
+ installed_reverse_dependencies.odoo_project_module_ids.filtered_domain(
+ [("odoo_project_id", "=", rec.odoo_project_id.id)]
+ )
+ )
+ # Not installed rev. deps. are 'odoo.module.branch' records
+ rec.not_installed_reverse_dependency_ids = (
+ rec.reverse_dependency_ids - installed_reverse_dependencies
+ )
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index 1d0da748..5e6758b6 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -18,6 +18,36 @@
Last Version
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
From 1de663c8fa19d03fd226d494a312b52282521d6f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 12 Jul 2024 12:05:56 +0200
Subject: [PATCH 14/38] odoo_project: display dependency levels
---
odoo_project/views/odoo_project_module.xml | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index 5e6758b6..cd0d5370 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -29,9 +29,11 @@
-
-
+
+
+
+
@@ -40,8 +42,10 @@
-
-
+
+
+
+
From 46f7203b1188f04bc001a1d010f845f33e310ce9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Tue, 20 Aug 2024 17:58:27 +0200
Subject: [PATCH 15/38] odoo_project: list recursive dependencies from project
module
---
odoo_project/models/odoo_project_module.py | 12 +++++++
odoo_project/views/odoo_project_module.xml | 37 ++++++++++++++++++++++
2 files changed, 49 insertions(+)
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index 84890bf7..988f168a 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -117,3 +117,15 @@ def _compute_installed_reverse_dependency_ids(self):
rec.not_installed_reverse_dependency_ids = (
rec.reverse_dependency_ids - installed_reverse_dependencies
)
+
+ def open_recursive_dependencies(self):
+ self.ensure_one()
+ xml_id = "odoo_project.odoo_project_module_action_recursive_dependencies"
+ action = self.env["ir.actions.actions"]._for_xml_id(xml_id)
+ action["name"] = "All dependencies"
+ dependencies = self.module_branch_id._get_recursive_dependencies()
+ project_dependencies = dependencies.odoo_project_module_ids.filtered(
+ lambda o: o.odoo_project_id == self.odoo_project_id
+ )
+ action["domain"] = [("id", "in", project_dependencies.ids)]
+ return action
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index cd0d5370..50094af6 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -88,6 +88,33 @@
+
+ odoo.project.module.tree.recursive_dependencies
+ odoo.project.module
+
+ primary
+ 100
+
+
+ global_dependency_level, non_std_dependency_level, module_name
+
+
+ 1
+
+
+ show
+
+
+ show
+
+
+ show
+
+
+
+
odoo.project.module.search.inherit
odoo.project.module
@@ -157,4 +184,14 @@
action="odoo_project_module_action"
/>
+
+ Dependencies
+ ir.actions.act_window
+ odoo.project.module
+
+
+
From 7c9e333b7ecdbbc8cfd0b3efa91dc6d394472338 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Tue, 20 Aug 2024 18:12:19 +0200
Subject: [PATCH 16/38] odoo_project: option to import unlisted dependencies
automatically
This allows to declare projects not yet live for instance, by listing
only modules we would like to install in it.
---
.../wizards/odoo_project_import_modules.py | 18 ++++++++++++++++++
.../wizards/odoo_project_import_modules.xml | 1 +
2 files changed, 19 insertions(+)
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
index bf94436c..96d8158e 100644
--- a/odoo_project/wizards/odoo_project_import_modules.py
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -24,6 +24,13 @@ class OdooProjectImportModules(models.TransientModel):
),
required=True,
)
+ import_missing_dependencies = fields.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."
+ ),
+ )
def action_import(self):
"""Import the modules for the given Odoo project."""
@@ -42,6 +49,17 @@ def action_import(self):
module_branch = self._get_module_branch(module)
project_module = self._get_project_module(module_branch, version)
project_module_ids.append(project_module.id)
+ # Complete list of modules by adding all dependencies
+ if self.import_missing_dependencies:
+ project_modules = self.env["odoo.project.module"].browse(project_module_ids)
+ branch_modules = project_modules.module_branch_id
+ all_dependencies = branch_modules._get_recursive_dependencies()
+ missing_dependencies = all_dependencies - branch_modules
+ for missing_dependency in missing_dependencies:
+ project_module = self._get_project_module(
+ missing_dependency, missing_dependency.version
+ )
+ project_module_ids.append(project_module.id)
self.odoo_project_id.sudo().project_module_ids = project_module_ids
return True
diff --git a/odoo_project/wizards/odoo_project_import_modules.xml b/odoo_project/wizards/odoo_project_import_modules.xml
index 34a3da32..7ab7a8d6 100644
--- a/odoo_project/wizards/odoo_project_import_modules.xml
+++ b/odoo_project/wizards/odoo_project_import_modules.xml
@@ -12,6 +12,7 @@
+
From f84967efa40081c87f840157dbfee3ee75607ef0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Wed, 18 Sep 2024 15:41:36 +0200
Subject: [PATCH 17/38] odoo_project: able to scan all repositories used by a
project
---
odoo_project/models/odoo_project.py | 22 ++++++++++++++++++++++
odoo_project/views/odoo_project.xml | 8 ++++++++
2 files changed, 30 insertions(+)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index 5b4a88ad..b4944989 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -123,3 +123,25 @@ def action_find_unknown_modules(self):
"""Try to locate unknown modules."""
for module in self.unknown_module_ids:
module.action_find_pr_url()
+
+ def _get_repositories_to_scan(self):
+ """Returnt the repositories to scan."""
+ return self.project_module_ids.repository_id
+
+ def _get_branches_to_scan(self):
+ """Return the branches to scan."""
+ return self.project_module_ids.repository_branch_id.branch_id
+
+ def action_scan(self, force=False):
+ """Scan all the repositories used by the project."""
+ # Scan all the repositories used within the project with relevant branches
+ repositories = self._get_repositories_to_scan().with_context(
+ strict_branches_scan=True
+ )
+ branches = self._get_branches_to_scan()
+ if branches:
+ for repository in repositories:
+ repository.action_scan(branches=branches.mapped("name"), force=force)
+ # Scan the underlying project repository itself
+ self.repository_id.action_scan(force=force)
+ return True
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index 4cd80d9c..ddc6689c 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -15,6 +15,14 @@
string="Import modules"
class="btn-primary"
/>
+
From c5ba7d88356d2bce7368bec97f6e15e78b4fe520 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 20 Sep 2024 12:19:54 +0200
Subject: [PATCH 18/38] odoo_project: ability to build projects without
repository
This allows to get figures from projects before actually launching them
(gap analysis...), or to study a project to recover from another Odoo
integrator for instance.
---
odoo_project/models/odoo_project.py | 21 ++++++-
odoo_project/views/odoo_project.xml | 8 ++-
.../wizards/odoo_project_import_modules.py | 60 ++++++++++++++-----
.../wizards/odoo_project_import_modules.xml | 24 +++++++-
4 files changed, 92 insertions(+), 21 deletions(-)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index b4944989..41fb3c7e 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -8,7 +8,6 @@
class OdooProject(models.Model):
_name = "odoo.project"
- _inherits = {"odoo.repository": "repository_id"}
_inherit = "mail.thread"
_description = "Odoo Project"
_order = "name"
@@ -23,7 +22,21 @@ class OdooProject(models.Model):
("clone_branch_id", "!=", False),
("odoo_version_id", "!=", False),
],
+ help=(
+ "Repository is optional. "
+ "You can start to build/simulate a project without repository "
+ "to get some figures."
+ ),
+ )
+ odoo_version_id = fields.Many2one(
+ comodel_name="odoo.branch",
+ ondelete="restrict",
+ string="Odoo Version",
+ domain=[("odoo_version", "=", True)],
required=True,
+ compute="_compute_odoo_version_id",
+ store=True,
+ readonly=False,
)
project_module_ids = fields.One2many(
comodel_name="odoo.project.module",
@@ -59,6 +72,12 @@ class OdooProject(models.Model):
compute="_compute_unknown_module_ids",
)
+ @api.depends("repository_id")
+ def _compute_odoo_version_id(self):
+ for rec in self:
+ if rec.repository_id:
+ rec.odoo_version_id = rec.repository_id.odoo_version_id
+
@api.depends("project_module_ids.module_id")
def _compute_module_ids(self):
for rec in self:
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index ddc6689c..9256e3c8 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -48,7 +48,11 @@
name="repository_id"
attrs="{'readonly': [('project_module_ids', '!=', [])]}"
/>
-
+
@@ -59,7 +63,7 @@
-
+
diff --git a/odoo_project/wizards/odoo_project_import_modules.py b/odoo_project/wizards/odoo_project_import_modules.py
index 96d8158e..f3b43c72 100644
--- a/odoo_project/wizards/odoo_project_import_modules.py
+++ b/odoo_project/wizards/odoo_project_import_modules.py
@@ -3,7 +3,7 @@
import re
-from odoo import fields, models
+from odoo import api, fields, models
class OdooProjectImportModules(models.TransientModel):
@@ -15,14 +15,18 @@ class OdooProjectImportModules(models.TransientModel):
string="Project",
required=True,
)
+ odoo_version_id = fields.Many2one(related="odoo_project_id.odoo_version_id")
+ additional_module_ids = fields.Many2many(
+ comodel_name="odoo.module.branch",
+ string="Additional Modules",
+ domain="[('branch_id', '=', odoo_version_id), ('repository_id', '!=', False)]",
+ )
modules_list = fields.Text(
help=(
"Copy/paste your list of technical module names here.\n"
- "One module per line, with an optional version number placed "
- "after the module name separated by any special character "
- "(space, tabulation, comma...)."
+ "One module per line with an optional version number (separated by "
+ "any special character (space, tabulation, comma...)."
),
- required=True,
)
import_missing_dependencies = fields.Boolean(
default=False,
@@ -32,13 +36,30 @@ class OdooProjectImportModules(models.TransientModel):
),
)
+ @api.onchange("additional_module_ids")
+ def _onchange_additional_module_ids(self):
+ if self.additional_module_ids:
+ self.import_missing_dependencies = True
+
def action_import(self):
"""Import the modules for the given Odoo project."""
self.ensure_one()
+ project_module_ids = []
+ if self.modules_list:
+ project_module_ids = self._action_import_modules_list()
+ project_module_ids.extend(self._action_import_additional_modules())
+ if self.import_missing_dependencies:
+ self._action_import_missing_dependencies(project_module_ids)
+
+ def _action_import_modules_list(self):
+ """Import a fresh list of installed modules into the project."""
self.odoo_project_id.sudo().project_module_ids = False
module_lines = list(filter(None, self.modules_list.split("\n")))
project_module_ids = []
for line in module_lines:
+ # Ignore comments
+ if line.strip().startswith("#"):
+ continue
data = re.split(r"\W+", line, maxsplit=1)
if len(data) > 1:
module_name, version = data
@@ -49,18 +70,25 @@ def action_import(self):
module_branch = self._get_module_branch(module)
project_module = self._get_project_module(module_branch, version)
project_module_ids.append(project_module.id)
- # Complete list of modules by adding all dependencies
- if self.import_missing_dependencies:
- project_modules = self.env["odoo.project.module"].browse(project_module_ids)
- branch_modules = project_modules.module_branch_id
- all_dependencies = branch_modules._get_recursive_dependencies()
- missing_dependencies = all_dependencies - branch_modules
- for missing_dependency in missing_dependencies:
- project_module = self._get_project_module(
- missing_dependency, missing_dependency.version
- )
- project_module_ids.append(project_module.id)
self.odoo_project_id.sudo().project_module_ids = project_module_ids
+ return project_module_ids
+
+ def _action_import_additional_modules(self):
+ """Import additional modules into the project."""
+ project_module_ids = []
+ for module_branch in self.additional_module_ids:
+ project_module = self._get_project_module(module_branch, version=False)
+ project_module_ids.append(project_module.id)
+ return project_module_ids
+
+ def _action_import_missing_dependencies(self, project_module_ids):
+ """Complete list of modules by adding all dependencies."""
+ project_modules = self.env["odoo.project.module"].browse(project_module_ids)
+ branch_modules = project_modules.module_branch_id
+ all_dependencies = branch_modules._get_recursive_dependencies()
+ missing_dependencies = all_dependencies - branch_modules
+ for missing_dependency in missing_dependencies:
+ self._get_project_module(missing_dependency, missing_dependency.version)
return True
def _get_module(self, module_name):
diff --git a/odoo_project/wizards/odoo_project_import_modules.xml b/odoo_project/wizards/odoo_project_import_modules.xml
index 7ab7a8d6..e6f10598 100644
--- a/odoo_project/wizards/odoo_project_import_modules.xml
+++ b/odoo_project/wizards/odoo_project_import_modules.xml
@@ -9,9 +9,29 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From ec2c7aff6ca038109d63cfe3890b396959b61cb3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Mon, 13 Jan 2025 18:34:59 +0100
Subject: [PATCH 25/38] odoo_project: make cron task and scan button behave the
same
---
odoo_project/models/odoo_project.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index 074197f5..55479e5c 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -146,7 +146,8 @@ def action_find_unknown_modules(self):
def _get_repositories_to_scan(self):
"""Returnt the repositories to scan."""
- return self.project_module_ids.repository_id
+ domain = self.env["odoo.repository"]._cron_scanner_domain()
+ return self.project_module_ids.repository_id.filtered_domain(domain)
def _get_branches_to_scan(self):
"""Return the branches to scan."""
From 71e3228baa678824dde974324fb250f7e33bfd1f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Wed, 28 May 2025 13:58:08 +0200
Subject: [PATCH 26/38] odoo_project: minor fixes/adaptations
---
odoo_project/models/odoo_project.py | 54 +++++++++++++++--------
odoo_project/tests/test_import_modules.py | 2 +-
odoo_project/views/odoo_project.xml | 8 +++-
3 files changed, 43 insertions(+), 21 deletions(-)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index 55479e5c..b56d4b66 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -16,28 +16,34 @@ class OdooProject(models.Model):
active = fields.Boolean(default=True)
repository_id = fields.Many2one(
comodel_name="odoo.repository",
- ondelete="restrict",
string="Repository",
- domain=[
- ("clone_branch_id", "!=", False),
- ("specific", "=", True),
- ("odoo_version_id", "!=", False),
- ],
+ domain=[("specific", "=", True)],
+ store=True,
+ index=True,
help=(
- "Repository is optional. "
+ "Repository this project is based on (optional). "
"You can start to build/simulate a project without repository "
"to get some figures."
),
)
+ available_odoo_version_ids = fields.One2many(
+ comodel_name="odoo.branch",
+ compute="_compute_available_odoo_version_ids",
+ string="Available Odoo Versions",
+ )
odoo_version_id = fields.Many2one(
comodel_name="odoo.branch",
ondelete="restrict",
string="Odoo Version",
- domain=[("odoo_version", "=", True)],
- required=True,
- compute="_compute_odoo_version_id",
store=True,
- readonly=False,
+ index=True,
+ )
+ repository_branch_id = fields.Many2one(
+ comodel_name="odoo.repository.branch",
+ string="Repository / Branch",
+ compute="_compute_repository_branch_id",
+ store=True,
+ index=True,
)
project_module_ids = fields.One2many(
comodel_name="odoo.project.module",
@@ -74,10 +80,22 @@ class OdooProject(models.Model):
)
@api.depends("repository_id")
- def _compute_odoo_version_id(self):
+ def _compute_available_odoo_version_ids(self):
+ all_versions = self.env["odoo.branch"]._get_all_odoo_versions()
for rec in self:
+ rec.available_odoo_version_ids = all_versions
if rec.repository_id:
- rec.odoo_version_id = rec.repository_id.odoo_version_id
+ rec.available_odoo_version_ids = rec.repository_id.branch_ids.branch_id
+
+ @api.depends("repository_id", "odoo_version_id")
+ def _compute_repository_branch_id(self):
+ for rec in self:
+ rec.repository_branch_id = False
+ if not rec.repository_id or not rec.odoo_version_id:
+ continue
+ rec.repository_branch_id = rec.repository_id.branch_ids.filtered(
+ lambda rb: rb.branch_id == rec.odoo_version_id
+ )
@api.depends("project_module_ids.module_id")
def _compute_module_ids(self):
@@ -90,11 +108,11 @@ def _compute_modules_count(self):
rec.modules_count = len(rec.project_module_ids)
@api.depends(
- "repository_id.branch_ids.module_ids", "project_module_ids.module_branch_id"
+ "repository_branch_id.module_ids", "project_module_ids.module_branch_id"
)
def _compute_module_not_installed_ids(self):
for rec in self:
- all_module_ids = set(rec.repository_id.branch_ids.module_ids.ids)
+ all_module_ids = set(rec.repository_branch_id.module_ids.ids)
installed_module_ids = set(rec.project_module_ids.module_branch_id.ids)
rec.module_not_installed_ids = list(all_module_ids - installed_module_ids)
@@ -145,12 +163,12 @@ def action_find_unknown_modules(self):
module.action_find_pr_url()
def _get_repositories_to_scan(self):
- """Returnt the repositories to scan."""
+ """Return the repositories to scan."""
domain = self.env["odoo.repository"]._cron_scanner_domain()
return self.project_module_ids.repository_id.filtered_domain(domain)
def _get_branches_to_scan(self):
- """Return the branches to scan."""
+ """Return the branches/versions to scan."""
return self.project_module_ids.repository_branch_id.branch_id
def action_scan(self, force=False):
@@ -163,7 +181,7 @@ def action_scan(self, force=False):
branches = self._get_branches_to_scan()
if branches:
repositories.action_scan(
- branches=branches.mapped("name"), force=force, raise_exc=False
+ branch_ids=branches.ids, force=force, raise_exc=False
)
# Scan the underlying project repository itself
self.repository_id.action_scan(force=force, raise_exc=True)
diff --git a/odoo_project/tests/test_import_modules.py b/odoo_project/tests/test_import_modules.py
index 390fdcd4..361de268 100644
--- a/odoo_project/tests/test_import_modules.py
+++ b/odoo_project/tests/test_import_modules.py
@@ -134,8 +134,8 @@ def test_match_generic_module(self):
def test_match_project_repo_module(self):
# Assign a repository to the project
- self.odoo_repository.odoo_version_id = self.branch
self.project.repository_id = self.odoo_repository
+ self.project.odoo_version_id = self.branch
mod1 = "test1"
mod2 = "test2"
mod1_in_repo = self.wiz_model._get_module(mod1)
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index 59502512..4cc06d91 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -44,13 +44,17 @@
+
From abf48ff330ec00c3a013ccedef9b56ee7b1acec4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Tue, 26 Nov 2024 10:33:47 +0100
Subject: [PATCH 27/38] odoo_project: fix access right typo
---
odoo_project/security/ir.model.access.csv | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/odoo_project/security/ir.model.access.csv b/odoo_project/security/ir.model.access.csv
index 2321cdcb..48748488 100644
--- a/odoo_project/security/ir.model.access.csv
+++ b/odoo_project/security/ir.model.access.csv
@@ -1,5 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_odoo_project_user,odoo_project_user,model_odoo_project,odoo_repository.group_odoo_repository_user,1,1,1,0
-access_odoo_project_manager_manager,odoo_project_manager,model_odoo_project,odoo_repository.group_odoo_repository_manager,1,1,1,1
+access_odoo_project_manager,odoo_project_manager,model_odoo_project,odoo_repository.group_odoo_repository_manager,1,1,1,1
access_odoo_project_module_user,odoo_project_module_user,model_odoo_project_module,odoo_repository.group_odoo_repository_user,1,0,0,0
access_odoo_project_import_modules_user,odoo_project_import_modules_user,model_odoo_project_import_modules,odoo_repository.group_odoo_repository_user,1,1,1,1
From 24d06fe76b09bfd25405b3ebacf67b1f1d7cbb67 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Tue, 8 Jul 2025 14:49:13 +0200
Subject: [PATCH 28/38] odoo_project: add SQL constraint on project name
---
odoo_project/models/odoo_project.py | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index b56d4b66..f510e8e5 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -79,6 +79,10 @@ class OdooProject(models.Model):
compute="_compute_unknown_module_ids",
)
+ _sql_constraints = [
+ ("name_uniq", "UNIQUE (name)", "This project already exists."),
+ ]
+
@api.depends("repository_id")
def _compute_available_odoo_version_ids(self):
all_versions = self.env["odoo.branch"]._get_all_odoo_versions()
From 7a43dbb2fbef600ffc1cf612d8d5975e5a493aec Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Wed, 3 Dec 2025 03:33:36 +0000
Subject: [PATCH 29/38] [UPD] README.rst
---
odoo_project/README.rst | 42 ++++++++++++++-----
odoo_project/static/description/index.html | 49 ++++++++++++++--------
2 files changed, 62 insertions(+), 29 deletions(-)
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
index e948e679..c283f950 100644
--- a/odoo_project/README.rst
+++ b/odoo_project/README.rst
@@ -1,3 +1,7 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
============
Odoo Project
============
@@ -7,20 +11,26 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:dc350fed0f23a205eb546f1673d2c5e99b4f6cdb5be6d6ab76a010e2517e203b
+ !! source digest: sha256:45acdfcefcca8e9e3cfff469c0658332d0be4e22f55572185022b3e0dcd1aaf2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
-.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
-.. |badge3| image:: https://img.shields.io/badge/github-camptocamp%2Fodoo--repository-lightgray.png?logo=github
- :target: https://github.com/camptocamp/odoo-repository/tree/16.0/odoo_project
- :alt: camptocamp/odoo-repository
-
-|badge1| |badge2| |badge3|
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fodoo--repository-lightgray.png?logo=github
+ :target: https://github.com/OCA/odoo-repository/tree/16.0/odoo_project
+ :alt: OCA/odoo-repository
+.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
+ :target: https://translation.odoo-community.org/projects/odoo-repository-16-0/odoo-repository-16-0-odoo_project
+ :alt: Translate me on Weblate
+.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/odoo-repository&target_branch=16.0
+ :alt: Try me on Runboat
+
+|badge1| |badge2| |badge3| |badge4| |badge5|
This module allows to declare your Odoo projects and analyze their code bases.
@@ -32,10 +42,10 @@ This module allows to declare your Odoo projects and analyze their code bases.
Bug Tracker
===========
-Bugs are tracked on `GitHub Issues `_.
+Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -56,6 +66,16 @@ Contributors
Maintainers
~~~~~~~~~~~
-This module is part of the `camptocamp/odoo-repository `_ project on GitHub.
+This module is maintained by the OCA.
+
+.. image:: https://odoo-community.org/logo.png
+ :alt: Odoo Community Association
+ :target: https://odoo-community.org
+
+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.
+
+This module is part of the `OCA/odoo-repository `_ project on GitHub.
-You are welcome to contribute.
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
index 747faf31..501b1ab9 100644
--- a/odoo_project/static/description/index.html
+++ b/odoo_project/static/description/index.html
@@ -1,18 +1,18 @@
-
-Odoo Project
+README.rst
-
-
Odoo Project
+
+
+
+
+
+
+
Odoo Project
-
+
This module allows to declare your Odoo projects and analyze their code bases.
Table of contents
@@ -384,32 +389,40 @@
Odoo Project
-
-
Bugs are tracked on GitHub Issues .
+
+
Bugs are tracked on GitHub Issues .
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback .
+
feedback .
Do not contact contributors directly about support or help with technical issues.
-
+
-
-
This module is part of the camptocamp/odoo-repository project on GitHub.
-
You are welcome to contribute.
+
+
This module is maintained by the OCA.
+
+
+
+
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.
+
This module is part of the OCA/odoo-repository project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute .
+
From 726717f90efcc99fd16647efb5d41da2a85730a0 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Wed, 3 Dec 2025 03:33:36 +0000
Subject: [PATCH 30/38] [ADD] icon.png
---
odoo_project/static/description/icon.png | Bin 0 -> 10254 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 odoo_project/static/description/icon.png
diff --git a/odoo_project/static/description/icon.png b/odoo_project/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..1dcc49c24f364e9adf0afbc6fc0bac6dbecdeb11
GIT binary patch
literal 10254
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
Date: Wed, 3 Dec 2025 18:22:52 +0100
Subject: [PATCH 31/38] [IMP] odoo_project: update README
---
odoo_project/README.rst | 31 ++++++----
odoo_project/readme/CONTRIBUTORS.md | 2 +
odoo_project/readme/CONTRIBUTORS.rst | 2 -
odoo_project/readme/DESCRIPTION.md | 8 +++
odoo_project/readme/DESCRIPTION.rst | 1 -
odoo_project/static/description/index.html | 69 ++++++++++++----------
6 files changed, 67 insertions(+), 46 deletions(-)
create mode 100644 odoo_project/readme/CONTRIBUTORS.md
delete mode 100644 odoo_project/readme/CONTRIBUTORS.rst
create mode 100644 odoo_project/readme/DESCRIPTION.md
delete mode 100644 odoo_project/readme/DESCRIPTION.rst
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
index c283f950..323ed576 100644
--- a/odoo_project/README.rst
+++ b/odoo_project/README.rst
@@ -1,7 +1,3 @@
-.. image:: https://odoo-community.org/readme-banner-image
- :target: https://odoo-community.org/get-involved?utm_source=readme
- :alt: Odoo Community Association
-
============
Odoo Project
============
@@ -17,7 +13,7 @@ Odoo Project
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
-.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
+.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fodoo--repository-lightgray.png?logo=github
@@ -32,7 +28,19 @@ Odoo Project
|badge1| |badge2| |badge3| |badge4| |badge5|
-This module allows to declare your Odoo projects and analyze their code bases.
+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)
**Table of contents**
@@ -53,18 +61,19 @@ Credits
=======
Authors
-~~~~~~~
+-------
* Camptocamp
Contributors
-~~~~~~~~~~~~
+------------
-* Camptocamp
- * Sébastien Alix
+- Camptocamp
+
+ - Sébastien Alix
Maintainers
-~~~~~~~~~~~
+-----------
This module is maintained by the OCA.
diff --git a/odoo_project/readme/CONTRIBUTORS.md b/odoo_project/readme/CONTRIBUTORS.md
new file mode 100644
index 00000000..17752927
--- /dev/null
+++ b/odoo_project/readme/CONTRIBUTORS.md
@@ -0,0 +1,2 @@
+- Camptocamp
+ - Sébastien Alix \
diff --git a/odoo_project/readme/CONTRIBUTORS.rst b/odoo_project/readme/CONTRIBUTORS.rst
deleted file mode 100644
index a0c91e35..00000000
--- a/odoo_project/readme/CONTRIBUTORS.rst
+++ /dev/null
@@ -1,2 +0,0 @@
-* Camptocamp
- * Sébastien Alix
diff --git a/odoo_project/readme/DESCRIPTION.md b/odoo_project/readme/DESCRIPTION.md
new file mode 100644
index 00000000..f78abb84
--- /dev/null
+++ b/odoo_project/readme/DESCRIPTION.md
@@ -0,0 +1,8 @@
+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)
diff --git a/odoo_project/readme/DESCRIPTION.rst b/odoo_project/readme/DESCRIPTION.rst
deleted file mode 100644
index a86173ee..00000000
--- a/odoo_project/readme/DESCRIPTION.rst
+++ /dev/null
@@ -1 +0,0 @@
-This module allows to declare your Odoo projects and analyze their code bases.
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
index 501b1ab9..724d6f71 100644
--- a/odoo_project/static/description/index.html
+++ b/odoo_project/static/description/index.html
@@ -2,19 +2,18 @@
-
-README.rst
+
+Odoo Project
-
+
+
Odoo Project
-
-
-
-
-
-
Odoo Project
-
-
This module allows to declare your Odoo projects and analyze their code bases.
+
+
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)
+
Table of contents
-
+
Bugs are tracked on GitHub Issues .
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -397,26 +403,26 @@
Do not contact contributors directly about support or help with technical issues.
-
+
-
+
This module is maintained by the OCA.
-
-
-
+
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.
@@ -425,6 +431,5 @@
-
From aad6d764148ec138e4e891c15032cf3109a4d5e8 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Mon, 8 Dec 2025 11:19:19 +0000
Subject: [PATCH 32/38] [UPD] README.rst
---
odoo_project/README.rst | 8 +++-
odoo_project/static/description/index.html | 51 +++++++++++++---------
2 files changed, 36 insertions(+), 23 deletions(-)
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
index 323ed576..14994160 100644
--- a/odoo_project/README.rst
+++ b/odoo_project/README.rst
@@ -1,3 +1,7 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
============
Odoo Project
============
@@ -7,13 +11,13 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:45acdfcefcca8e9e3cfff469c0658332d0be4e22f55572185022b3e0dcd1aaf2
+ !! source digest: sha256:64ee6ace30499da7b597330f4a0bdf07a6a9c2dc9e0faa51972f952e1e68dcd2
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
-.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
+.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fodoo--repository-lightgray.png?logo=github
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
index 724d6f71..17e97802 100644
--- a/odoo_project/static/description/index.html
+++ b/odoo_project/static/description/index.html
@@ -2,18 +2,19 @@
-
-Odoo Project
+
+README.rst
-
-
Odoo Project
+
+
+
+
+
+
+
Odoo Project
-
+
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:
@@ -385,17 +391,17 @@
Odoo Project
Table of contents
-
+
Bugs are tracked on GitHub Issues .
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
@@ -403,15 +409,15 @@
Do not contact contributors directly about support or help with technical issues.
-
+
-
+
This module is maintained by the OCA.
-
+
+
+
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.
@@ -431,5 +439,6 @@
+
From 2dc61558211cf889b77592b0d30d1b8a5c6969cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Sat, 17 Jan 2026 13:16:12 +0100
Subject: [PATCH 33/38] Update all modules manifest and README with new repo
info
---
odoo_project/README.rst | 18 +++++++++---------
odoo_project/__manifest__.py | 2 +-
odoo_project/static/description/index.html | 10 +++++-----
3 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
index 14994160..02d2f436 100644
--- a/odoo_project/README.rst
+++ b/odoo_project/README.rst
@@ -11,7 +11,7 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:64ee6ace30499da7b597330f4a0bdf07a6a9c2dc9e0faa51972f952e1e68dcd2
+ !! source digest: sha256:bb81d0c24d3fcc03e1d233d9b21b092a81458b2388fa3e8456b2582200dcb4b8
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -20,14 +20,14 @@ Odoo Project
.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
-.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fodoo--repository-lightgray.png?logo=github
- :target: https://github.com/OCA/odoo-repository/tree/16.0/odoo_project
- :alt: OCA/odoo-repository
+.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmodule--composition--analysis-lightgray.png?logo=github
+ :target: https://github.com/OCA/module-composition-analysis/tree/16.0/odoo_project
+ :alt: OCA/module-composition-analysis
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/odoo-repository-16-0/odoo-repository-16-0-odoo_project
+ :target: https://translation.odoo-community.org/projects/module-composition-analysis-16-0/module-composition-analysis-16-0-odoo_project
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/odoo-repository&target_branch=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/module-composition-analysis&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -54,10 +54,10 @@ Based on the data collected by ``odoo_repository`` module, it will:
Bug Tracker
===========
-Bugs are tracked on `GitHub Issues `_.
+Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -89,6 +89,6 @@ 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.
-This module is part of the `OCA/odoo-repository `_ project on GitHub.
+This module is part of the `OCA/module-composition-analysis `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/odoo_project/__manifest__.py b/odoo_project/__manifest__.py
index 81b39a7f..90fc79a2 100644
--- a/odoo_project/__manifest__.py
+++ b/odoo_project/__manifest__.py
@@ -6,7 +6,7 @@
"version": "16.0.1.0.0",
"category": "Tools",
"author": "Camptocamp, Odoo Community Association (OCA)",
- "website": "https://github.com/camptocamp/odoo-repository",
+ "website": "https://github.com/OCA/module-composition-analysis",
"data": [
"security/ir.model.access.csv",
"views/menu.xml",
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
index 17e97802..8dbe078a 100644
--- a/odoo_project/static/description/index.html
+++ b/odoo_project/static/description/index.html
@@ -372,9 +372,9 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:64ee6ace30499da7b597330f4a0bdf07a6a9c2dc9e0faa51972f952e1e68dcd2
+!! source digest: sha256:bb81d0c24d3fcc03e1d233d9b21b092a81458b2388fa3e8456b2582200dcb4b8
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
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:
@@ -402,10 +402,10 @@ Odoo Project
-
Bugs are tracked on GitHub Issues .
+
Bugs are tracked on GitHub Issues .
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback .
+
feedback .
Do not contact contributors directly about support or help with technical issues.
From db60a52ad82ad15135b5f0ab466c0625d0e00d44 Mon Sep 17 00:00:00 2001
From: OCA-git-bot
Date: Sat, 17 Jan 2026 12:45:07 +0000
Subject: [PATCH 34/38] [BOT] post-merge updates
---
odoo_project/README.rst | 2 +-
odoo_project/__manifest__.py | 2 +-
odoo_project/static/description/index.html | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
index 02d2f436..12c92612 100644
--- a/odoo_project/README.rst
+++ b/odoo_project/README.rst
@@ -11,7 +11,7 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:bb81d0c24d3fcc03e1d233d9b21b092a81458b2388fa3e8456b2582200dcb4b8
+ !! source digest: sha256:575fe986992605688cf025147ff99f33cff9b8416f0105df732ed9b2102da90f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
diff --git a/odoo_project/__manifest__.py b/odoo_project/__manifest__.py
index 90fc79a2..24f6badd 100644
--- a/odoo_project/__manifest__.py
+++ b/odoo_project/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Odoo Project",
"summary": "Analyze your Odoo projects code bases.",
- "version": "16.0.1.0.0",
+ "version": "16.0.1.0.1",
"category": "Tools",
"author": "Camptocamp, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/module-composition-analysis",
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
index 8dbe078a..c4a6d2c1 100644
--- a/odoo_project/static/description/index.html
+++ b/odoo_project/static/description/index.html
@@ -372,7 +372,7 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:bb81d0c24d3fcc03e1d233d9b21b092a81458b2388fa3e8456b2582200dcb4b8
+!! source digest: sha256:575fe986992605688cf025147ff99f33cff9b8416f0105df732ed9b2102da90f
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
This module allows you to declare your Odoo projects with the list of
From 13d2879153f5d4f9374310e5f21ba9012711978a Mon Sep 17 00:00:00 2001
From: oca-ci
Date: Sun, 1 Feb 2026 10:53:26 +0000
Subject: [PATCH 35/38] [UPD] Update odoo_project.pot
---
odoo_project/i18n/odoo_project.pot | 783 +++++++++++++++++++++++++++++
1 file changed, 783 insertions(+)
create mode 100644 odoo_project/i18n/odoo_project.pot
diff --git a/odoo_project/i18n/odoo_project.pot b/odoo_project/i18n/odoo_project.pot
new file mode 100644
index 00000000..170bac0d
--- /dev/null
+++ b/odoo_project/i18n/odoo_project.pot
@@ -0,0 +1,783 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * odoo_project
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid ""
+"# One module per line with an optional version number (separated by any special character like space, tabulation, comma...). E.g:\n"
+"sale\n"
+"server_environment 17.0.1.1.0"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid " Modules inst. "
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__active
+msgid "Active"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__additional_module_ids
+msgid "Additional Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Additional modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__addons_path
+msgid "Addons Path"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__branch_name
+msgid ""
+"An Odoo version is also used as an Odoo branch name in generic repositories "
+"(Odoo, OCA...)."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__application
+msgid "Application"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_attachment_count
+msgid "Attachment Count"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__author_ids
+msgid "Authors"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__auto_install
+msgid "Auto-Install"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__available_odoo_version_ids
+msgid "Available Odoo Versions"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__migration_scripts
+msgid "Available migration scripts between installed and last version."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__branch_name
+msgid "Branch Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__branch_sequence
+msgid "Branch Sequence"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid ""
+"Build your project by adding modules. This can help to get some figures "
+"before a launch to estimate maintenance cost for instance."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_css
+msgid "CSS"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_css
+msgid "CSS source lines of code"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Cancel"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__category_id
+msgid "Category"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__is_community
+msgid "Community?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_import_modules__modules_list
+msgid ""
+"Copy/paste your list of technical module names here.\n"
+"One module per line with an optional version number (separated by any special character (space, tabulation, comma...)."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__create_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__create_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__create_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__create_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_module_action_recursive_dependencies
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__dependency_ids
+msgid "Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__non_std_dependency_level
+msgid "Dependency level excluding all standard Odoo modules."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__global_dependency_level
+msgid "Dependency level including all standard Odoo modules."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_module_branch__odoo_project_module_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__project_module_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__odoo_project_module_ids
+msgid "Deployed Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__title
+msgid "Descriptive name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__development_status_id
+msgid "Develoment Status"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__display_name
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__display_name
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__is_enterprise
+msgid "Enterprise?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__external_dependencies
+msgid "External Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Find modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__full_path
+msgid "Full Path"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__global_dependency_level
+msgid "Global Dep. Level"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__has_message
+msgid "Has Message"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__id
+msgid "ID"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_needaction
+msgid "If checked, new messages require your attention."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_has_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__installed_version_id
+msgid ""
+"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."
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Import"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__import_missing_dependencies
+msgid "Import Missing Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_import_modules_action
+msgid "Import Project Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_import_modules__import_missing_dependencies
+msgid ""
+"Import module dependencies that are not part of the list above to get an "
+"exhaustive list of modules installed in the project."
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Import modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_project_import_modules
+msgid "Import modules for an Odoo project"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Initialize from modules list"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid ""
+"Initialize the list of modules that are installed in your project. This will"
+" wipe the current installed modules. The list can be copied-pasted from "
+"columns 'Technical Name' and 'Latest Version' put side by side from a "
+"standard Odoo export of modules installed."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installable
+msgid "Installable"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_module_action
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_module_for_project_action
+#: model:ir.ui.menu,name:odoo_project.odoo_project_module_menu
+msgid "Installed Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installed_reverse_dependency_ids
+msgid "Installed Reverse Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installed_version
+msgid "Installed Version"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_tree
+msgid "Installed in"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_search
+msgid "Installed in projects"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_form
+msgid "Installed reverse dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__installed_version
+msgid "Installed version in project database."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__is_community
+msgid "Is this module a contribution of the community?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__is_enterprise
+msgid "Is this module designed for Odoo Enterprise only?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__is_standard
+msgid "Is this module part of Odoo standard?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_js
+msgid "JS"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_js
+msgid "JavaScript source lines of code"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project____last_update
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules____last_update
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__last_scanned_commit
+msgid "Last Scanned Commit"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__write_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__write_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__write_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__write_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_form
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_tree
+msgid "Last Version"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__version
+msgid "Last version"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__license_id
+msgid "License"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_main_attachment_id
+msgid "Main Attachment"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__maintainer_ids
+msgid "Maintainers"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__migration_scripts
+msgid "Migration Scripts"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_search
+msgid "Migration Scripts to play"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_search
+msgid "Module"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__module_name
+msgid "Module Technical Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__specific
+msgid ""
+"Module specific to a project repository.It cannot be used across different "
+"projects."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__module_ids
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__modules_count
+msgid "Modules Count"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__modules_list
+msgid "Modules List"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__module_not_installed_ids
+msgid "Modules available in the project repository but not installed."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__unmerged_module_ids
+msgid "Modules installed belonging to an open PR."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__unknown_module_ids
+msgid "Modules installed but cannot be found among repositories/branches."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__module_not_installed_ids
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Modules not installed"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__unmerged_module_ids
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Modules to merge"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__unknown_module_ids
+msgid "Modules unknown"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__name
+msgid "Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installed_version_id
+msgid "Nearest installed version"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_search
+msgid "No project"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__non_std_dependency_level
+msgid "Non-Std Dep. Level"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__not_installed_reverse_dependency_ids
+msgid "Not Installed Reverse Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_form
+msgid "Not installed reverse dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_needaction_counter
+msgid "Number of messages requiring action"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_module_branch
+msgid "Odoo Module Branch"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_repository
+msgid "Odoo Modules Repository"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_project
+msgid "Odoo Project"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_project_module
+msgid "Odoo Project Module"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__odoo_version_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__odoo_version_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__branch_id
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_search
+msgid "Odoo Version"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__org_id
+msgid "Organization"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__pr_url
+msgid "PR URL"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__odoo_project_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__odoo_project_id
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_search
+msgid "Project"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_repository__project_count
+msgid "Project Count"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Project Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_action
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_module_branch__odoo_project_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__odoo_project_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_repository__project_ids
+#: model:ir.ui.menu,name:odoo_project.odoo_project_main_menu
+#: model:ir.ui.menu,name:odoo_project.odoo_project_menu
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_form
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_repository_view_form
+msgid "Projects"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_python
+msgid "Python"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__python_dependency_ids
+msgid "Python Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_python
+msgid "Python source lines of code"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__removed
+msgid "Removed"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__repository_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__repository_id
+msgid "Repository"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__repository_branch_id
+msgid "Repository / Branch"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__repository_branch_id
+msgid "Repository Branch"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__repository_id
+msgid ""
+"Repository this project is based on (optional). You can start to "
+"build/simulate a project without repository to get some figures."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__reverse_dependency_ids
+msgid "Reverse Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Scan"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Scan all the repositories used by this project."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__repository_sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__specific
+msgid "Specific"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__is_standard
+msgid "Standard?"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Status"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__summary
+msgid "Summary"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__name
+msgid "Techname"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__module_name
+msgid "Technical Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__addons_path
+msgid "Technical field. Where the module is located in the repository."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__module_id
+msgid "Technical name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.constraint,message:odoo_project.constraint_odoo_project_name_uniq
+msgid "This project already exists."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__title
+msgid "Title"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__to_upgrade
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_search
+msgid "To Upgrade"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__url
+msgid "URL"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Unknown modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__module_branch_id
+msgid "Upstream Module"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__version_ids
+msgid "Versions"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_xml
+msgid "XML"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_xml
+msgid "XML source lines of code"
+msgstr ""
From e92fc6b12675516a72d6dec028ab2eb7f22aff26 Mon Sep 17 00:00:00 2001
From: mymage
Date: Mon, 2 Feb 2026 07:47:32 +0000
Subject: [PATCH 36/38] Added translation using Weblate (Italian)
---
odoo_project/i18n/it.po | 784 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 784 insertions(+)
create mode 100644 odoo_project/i18n/it.po
diff --git a/odoo_project/i18n/it.po b/odoo_project/i18n/it.po
new file mode 100644
index 00000000..c7af44b5
--- /dev/null
+++ b/odoo_project/i18n/it.po
@@ -0,0 +1,784 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * odoo_project
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0\n"
+"Report-Msgid-Bugs-To: \n"
+"Last-Translator: Automatically generated\n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid ""
+"# One module per line with an optional version number (separated by any special character like space, tabulation, comma...). E.g:\n"
+"sale\n"
+"server_environment 17.0.1.1.0"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid " Modules inst. "
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_needaction
+msgid "Action Needed"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__active
+msgid "Active"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__additional_module_ids
+msgid "Additional Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Additional modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__addons_path
+msgid "Addons Path"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__branch_name
+msgid ""
+"An Odoo version is also used as an Odoo branch name in generic repositories "
+"(Odoo, OCA...)."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__application
+msgid "Application"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_attachment_count
+msgid "Attachment Count"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__author_ids
+msgid "Authors"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__auto_install
+msgid "Auto-Install"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__available_odoo_version_ids
+msgid "Available Odoo Versions"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__migration_scripts
+msgid "Available migration scripts between installed and last version."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__branch_name
+msgid "Branch Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__branch_sequence
+msgid "Branch Sequence"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid ""
+"Build your project by adding modules. This can help to get some figures "
+"before a launch to estimate maintenance cost for instance."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_css
+msgid "CSS"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_css
+msgid "CSS source lines of code"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Cancel"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__category_id
+msgid "Category"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__is_community
+msgid "Community?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_import_modules__modules_list
+msgid ""
+"Copy/paste your list of technical module names here.\n"
+"One module per line with an optional version number (separated by any special character (space, tabulation, comma...)."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__create_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__create_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__create_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__create_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__create_date
+msgid "Created on"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_module_action_recursive_dependencies
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__dependency_ids
+msgid "Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__non_std_dependency_level
+msgid "Dependency level excluding all standard Odoo modules."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__global_dependency_level
+msgid "Dependency level including all standard Odoo modules."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_module_branch__odoo_project_module_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__project_module_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__odoo_project_module_ids
+msgid "Deployed Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__title
+msgid "Descriptive name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__development_status_id
+msgid "Develoment Status"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__display_name
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__display_name
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__is_enterprise
+msgid "Enterprise?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__external_dependencies
+msgid "External Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Find modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_follower_ids
+msgid "Followers"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_partner_ids
+msgid "Followers (Partners)"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__full_path
+msgid "Full Path"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__global_dependency_level
+msgid "Global Dep. Level"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_search
+msgid "Group By"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__has_message
+msgid "Has Message"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__id
+msgid "ID"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_needaction
+msgid "If checked, new messages require your attention."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_has_error
+msgid "If checked, some messages have a delivery error."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__installed_version_id
+msgid ""
+"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."
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Import"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__import_missing_dependencies
+msgid "Import Missing Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_import_modules_action
+msgid "Import Project Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_import_modules__import_missing_dependencies
+msgid ""
+"Import module dependencies that are not part of the list above to get an "
+"exhaustive list of modules installed in the project."
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Import modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_project_import_modules
+msgid "Import modules for an Odoo project"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid "Initialize from modules list"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_import_modules_view_form
+msgid ""
+"Initialize the list of modules that are installed in your project. This will"
+" wipe the current installed modules. The list can be copied-pasted from "
+"columns 'Technical Name' and 'Latest Version' put side by side from a "
+"standard Odoo export of modules installed."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installable
+msgid "Installable"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_module_action
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_module_for_project_action
+#: model:ir.ui.menu,name:odoo_project.odoo_project_module_menu
+msgid "Installed Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installed_reverse_dependency_ids
+msgid "Installed Reverse Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installed_version
+msgid "Installed Version"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_tree
+msgid "Installed in"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_search
+msgid "Installed in projects"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_form
+msgid "Installed reverse dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__installed_version
+msgid "Installed version in project database."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_is_follower
+msgid "Is Follower"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__is_community
+msgid "Is this module a contribution of the community?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__is_enterprise
+msgid "Is this module designed for Odoo Enterprise only?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__is_standard
+msgid "Is this module part of Odoo standard?"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_js
+msgid "JS"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_js
+msgid "JavaScript source lines of code"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project____last_update
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules____last_update
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module____last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__last_scanned_commit
+msgid "Last Scanned Commit"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__write_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__write_uid
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__write_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__write_date
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__write_date
+msgid "Last Updated on"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_form
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_tree
+msgid "Last Version"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__version
+msgid "Last version"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__license_id
+msgid "License"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_main_attachment_id
+msgid "Main Attachment"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__maintainer_ids
+msgid "Maintainers"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_has_error
+msgid "Message Delivery error"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_ids
+msgid "Messages"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__migration_scripts
+msgid "Migration Scripts"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_search
+msgid "Migration Scripts to play"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_search
+msgid "Module"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__module_name
+msgid "Module Technical Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__specific
+msgid ""
+"Module specific to a project repository.It cannot be used across different "
+"projects."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__module_ids
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__modules_count
+msgid "Modules Count"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__modules_list
+msgid "Modules List"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__module_not_installed_ids
+msgid "Modules available in the project repository but not installed."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__unmerged_module_ids
+msgid "Modules installed belonging to an open PR."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__unknown_module_ids
+msgid "Modules installed but cannot be found among repositories/branches."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__module_not_installed_ids
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Modules not installed"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__unmerged_module_ids
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Modules to merge"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__unknown_module_ids
+msgid "Modules unknown"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__name
+msgid "Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__installed_version_id
+msgid "Nearest installed version"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_search
+msgid "No project"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__non_std_dependency_level
+msgid "Non-Std Dep. Level"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__not_installed_reverse_dependency_ids
+msgid "Not Installed Reverse Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_form
+msgid "Not installed reverse dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_needaction_counter
+msgid "Number of Actions"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__message_has_error_counter
+msgid "Number of errors"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_needaction_counter
+msgid "Number of messages requiring action"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__message_has_error_counter
+msgid "Number of messages with delivery error"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_module_branch
+msgid "Odoo Module Branch"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_repository
+msgid "Odoo Modules Repository"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_project
+msgid "Odoo Project"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model,name:odoo_project.model_odoo_project_module
+msgid "Odoo Project Module"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__odoo_version_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__odoo_version_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__branch_id
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_search
+msgid "Odoo Version"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__org_id
+msgid "Organization"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__pr_url
+msgid "PR URL"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_import_modules__odoo_project_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__odoo_project_id
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_search
+msgid "Project"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_repository__project_count
+msgid "Project Count"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Project Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.actions.act_window,name:odoo_project.odoo_project_action
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_module_branch__odoo_project_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__odoo_project_ids
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_repository__project_ids
+#: model:ir.ui.menu,name:odoo_project.odoo_project_main_menu
+#: model:ir.ui.menu,name:odoo_project.odoo_project_menu
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_module_branch_view_form
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_repository_view_form
+msgid "Projects"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_python
+msgid "Python"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__python_dependency_ids
+msgid "Python Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_python
+msgid "Python source lines of code"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__removed
+msgid "Removed"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__repository_id
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__repository_id
+msgid "Repository"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project__repository_branch_id
+msgid "Repository / Branch"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__repository_branch_id
+msgid "Repository Branch"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project__repository_id
+msgid ""
+"Repository this project is based on (optional). You can start to "
+"build/simulate a project without repository to get some figures."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__reverse_dependency_ids
+msgid "Reverse Dependencies"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Scan"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Scan all the repositories used by this project."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__repository_sequence
+msgid "Sequence"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__specific
+msgid "Specific"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__is_standard
+msgid "Standard?"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Status"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__summary
+msgid "Summary"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__name
+msgid "Techname"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__module_name
+msgid "Technical Name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__addons_path
+msgid "Technical field. Where the module is located in the repository."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__module_id
+msgid "Technical name"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.constraint,message:odoo_project.constraint_odoo_project_name_uniq
+msgid "This project already exists."
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__title
+msgid "Title"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__to_upgrade
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_module_view_search
+msgid "To Upgrade"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__url
+msgid "URL"
+msgstr ""
+
+#. module: odoo_project
+#: model_terms:ir.ui.view,arch_db:odoo_project.odoo_project_view_form
+msgid "Unknown modules"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__module_branch_id
+msgid "Upstream Module"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__version_ids
+msgid "Versions"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,field_description:odoo_project.field_odoo_project_module__sloc_xml
+msgid "XML"
+msgstr ""
+
+#. module: odoo_project
+#: model:ir.model.fields,help:odoo_project.field_odoo_project_module__sloc_xml
+msgid "XML source lines of code"
+msgstr ""
From 12ed0dafda3c1851b42ef255ae73c724da929340 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 3 Apr 2026 10:57:24 +0200
Subject: [PATCH 37/38] [IMP] odoo_project: pre-commit auto fixes
---
odoo_project/data/queue_job.xml | 14 +-
odoo_project/pyproject.toml | 3 +
odoo_project/views/menu.xml | 4 +-
odoo_project/views/odoo_module_branch.xml | 54 ++-
odoo_project/views/odoo_project.xml | 227 ++++++------
odoo_project/views/odoo_project_module.xml | 337 +++++++++---------
odoo_project/views/odoo_repository.xml | 26 +-
.../wizards/odoo_project_import_modules.xml | 79 ++--
8 files changed, 383 insertions(+), 361 deletions(-)
create mode 100644 odoo_project/pyproject.toml
diff --git a/odoo_project/data/queue_job.xml b/odoo_project/data/queue_job.xml
index 641669a7..921e430c 100644
--- a/odoo_project/data/queue_job.xml
+++ b/odoo_project/data/queue_job.xml
@@ -2,15 +2,13 @@
-
-
-
- _remap_to_specific_module
-
-
-
-
+
+ _remap_to_specific_module
+
+
+
diff --git a/odoo_project/pyproject.toml b/odoo_project/pyproject.toml
new file mode 100644
index 00000000..4231d0cc
--- /dev/null
+++ b/odoo_project/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/odoo_project/views/menu.xml b/odoo_project/views/menu.xml
index 60def18d..5b44227b 100644
--- a/odoo_project/views/menu.xml
+++ b/odoo_project/views/menu.xml
@@ -2,12 +2,10 @@
-
-
-
diff --git a/odoo_project/views/odoo_module_branch.xml b/odoo_project/views/odoo_module_branch.xml
index 47fc3c52..4671da77 100644
--- a/odoo_project/views/odoo_module_branch.xml
+++ b/odoo_project/views/odoo_module_branch.xml
@@ -2,45 +2,43 @@
+
+ odoo.module.branch.form.inherit
+ odoo.module.branch
+
+
+
+
+
+
+
+
+
-
- odoo.module.branch.form.inherit
- odoo.module.branch
-
-
-
-
-
-
-
-
-
-
-
- odoo.module.branch.search.inherit
- odoo.module.branch
-
-
-
-
+ odoo.module.branch.search.inherit
+ odoo.module.branch
+
+
+
+
-
-
-
-
+
+
-
-
-
-
+
+
+
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index 4cc06d91..f9db14a8 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -2,20 +2,19 @@
-
-
- odoo.project.form
- odoo.project
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
- odoo.project.tree
- odoo.project
-
-
-
-
-
-
-
-
+
+ odoo.project.tree
+ odoo.project
+
+
+
+
+
+
+
+
-
- odoo.project.search
- odoo.project
- search
-
-
-
-
-
-
-
+ odoo.project.search
+ odoo.project
+ search
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
-
- Projects
- ir.actions.act_window
- odoo.project
-
-
+
+ Projects
+ ir.actions.act_window
+ odoo.project
+
+
-
-
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index 50094af6..f2b7e255 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -2,196 +2,203 @@
-
-
- odoo.project.module.form.inherit
- odoo.project.module
-
- primary
-
-
-
-
-
-
-
-
- Last Version
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ odoo.project.module.form.inherit
+ odoo.project.module
+
+ primary
+
+
+
+
+
+
+
+
+ Last Version
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
-
-
- 1
-
-
-
+
-
- odoo.project.module.tree.inherit
- odoo.project.module
-
- primary
-
-
- to_upgrade
- pr_url
-
-
-
-
-
- hide
-
-
-
-
-
-
-
-
-
- Last Version
-
-
-
- show
-
-
-
+
+ odoo.project.module.tree.inherit
+ odoo.project.module
+
+ primary
+
+
+ to_upgrade
+ pr_url
+
+
+
+
+
+ hide
+
+
+
+
+
+
+
+
+
+ Last Version
+
+
+
+ show
+
+
+
-
- odoo.project.module.tree.recursive_dependencies
- odoo.project.module
-
- primary
- 100
-
-
-
+ odoo.project.module.tree.recursive_dependencies
+ odoo.project.module
+
+ primary
+ 100
+
+
+ global_dependency_level, non_std_dependency_level, module_name
-
-
- 1
-
-
- show
-
-
- show
-
-
- show
-
-
-
+
+
+ 1
+
+
+ show
+
+
+ show
+
+
+ show
+
+
+
-
- odoo.project.module.search.inherit
- odoo.project.module
-
- primary
-
-
-
-
-
-
+ odoo.project.module.search.inherit
+ odoo.project.module
+
+ primary
+
+
+
+
+
+
-
-
-
-
- {'group_by': 'odoo_project_id'}
-
-
-
+
+
+
+ {'group_by': 'odoo_project_id'}
+
+
+
-
- odoo.project.module.pivot
- odoo.project.module
-
-
-
-
-
-
-
-
+
+ odoo.project.module.pivot
+ odoo.project.module
+
+
+
+
+
+
+
+
-
- Installed Modules
- ir.actions.act_window
- odoo.project.module
- tree,form,pivot
-
-
+
+ Installed Modules
+ ir.actions.act_window
+ odoo.project.module
+ tree,form,pivot
+
+
-
-
- pivot
-
-
-
+
+
+ pivot
+
+
+
-
- Installed Modules
- ir.actions.act_window
- odoo.project.module
- tree,form,pivot
-
-
+
+ Installed Modules
+ ir.actions.act_window
+ odoo.project.module
+ tree,form,pivot
+
+
-
-
- Dependencies
- ir.actions.act_window
- odoo.project.module
-
-
-
+ Dependencies
+ ir.actions.act_window
+ odoo.project.module
+
+
diff --git a/odoo_project/views/odoo_repository.xml b/odoo_project/views/odoo_repository.xml
index 27997ea9..2ac3ae3f 100644
--- a/odoo_project/views/odoo_repository.xml
+++ b/odoo_project/views/odoo_repository.xml
@@ -2,24 +2,22 @@
-
-
- odoo.repository.form.inherit
- odoo.repository
-
-
-
-
+ odoo.repository.form.inherit
+ odoo.repository
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
diff --git a/odoo_project/wizards/odoo_project_import_modules.xml b/odoo_project/wizards/odoo_project_import_modules.xml
index e6f10598..2e8f7ec5 100644
--- a/odoo_project/wizards/odoo_project_import_modules.xml
+++ b/odoo_project/wizards/odoo_project_import_modules.xml
@@ -2,58 +2,59 @@
-
-
- odoo.project.import.modules.form
- odoo.project.import.modules
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
- Import Project Modules
- ir.actions.act_window
- odoo.project.import.modules
- form
- new
-
+
+
+
+
+
+
+ Import Project Modules
+ ir.actions.act_window
+ odoo.project.import.modules
+ form
+ new
+
From 9413752fe90ef71e852225a4514a91620e7f5e2b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Alix?=
Date: Fri, 3 Apr 2026 10:57:25 +0200
Subject: [PATCH 38/38] [MIG] odoo_project: Migration to 18.0
---
odoo_project/README.rst | 12 ++++-----
odoo_project/__manifest__.py | 2 +-
odoo_project/models/odoo_project.py | 2 +-
odoo_project/models/odoo_project_module.py | 6 +++--
odoo_project/static/description/index.html | 8 +++---
odoo_project/tests/common.py | 3 ++-
odoo_project/views/odoo_project.xml | 31 +++++++++-------------
odoo_project/views/odoo_project_module.xml | 24 ++++++++---------
odoo_project/views/odoo_repository.xml | 2 +-
9 files changed, 44 insertions(+), 46 deletions(-)
diff --git a/odoo_project/README.rst b/odoo_project/README.rst
index 12c92612..9b967099 100644
--- a/odoo_project/README.rst
+++ b/odoo_project/README.rst
@@ -11,7 +11,7 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- !! source digest: sha256:575fe986992605688cf025147ff99f33cff9b8416f0105df732ed9b2102da90f
+ !! source digest: sha256:3331542182c08aa9be85d1710d7fea6e5eb548ce72a9634c889bee41d66da216
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
@@ -21,13 +21,13 @@ Odoo Project
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmodule--composition--analysis-lightgray.png?logo=github
- :target: https://github.com/OCA/module-composition-analysis/tree/16.0/odoo_project
+ :target: https://github.com/OCA/module-composition-analysis/tree/18.0/odoo_project
:alt: OCA/module-composition-analysis
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
- :target: https://translation.odoo-community.org/projects/module-composition-analysis-16-0/module-composition-analysis-16-0-odoo_project
+ :target: https://translation.odoo-community.org/projects/module-composition-analysis-18-0/module-composition-analysis-18-0-odoo_project
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
- :target: https://runboat.odoo-community.org/builds?repo=OCA/module-composition-analysis&target_branch=16.0
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/module-composition-analysis&target_branch=18.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -57,7 +57,7 @@ Bug Tracker
Bugs are tracked on `GitHub Issues `_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-`feedback `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -89,6 +89,6 @@ 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.
-This module is part of the `OCA/module-composition-analysis `_ project on GitHub.
+This module is part of the `OCA/module-composition-analysis `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/odoo_project/__manifest__.py b/odoo_project/__manifest__.py
index 24f6badd..eee01808 100644
--- a/odoo_project/__manifest__.py
+++ b/odoo_project/__manifest__.py
@@ -3,7 +3,7 @@
{
"name": "Odoo Project",
"summary": "Analyze your Odoo projects code bases.",
- "version": "16.0.1.0.1",
+ "version": "18.0.1.0.0",
"category": "Tools",
"author": "Camptocamp, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/module-composition-analysis",
diff --git a/odoo_project/models/odoo_project.py b/odoo_project/models/odoo_project.py
index f510e8e5..6f613e6e 100644
--- a/odoo_project/models/odoo_project.py
+++ b/odoo_project/models/odoo_project.py
@@ -98,7 +98,7 @@ def _compute_repository_branch_id(self):
if not rec.repository_id or not rec.odoo_version_id:
continue
rec.repository_branch_id = rec.repository_id.branch_ids.filtered(
- lambda rb: rb.branch_id == rec.odoo_version_id
+ lambda rb, rec=rec: rb.branch_id == rec.odoo_version_id
)
@api.depends("project_module_ids.module_id")
diff --git a/odoo_project/models/odoo_project_module.py b/odoo_project/models/odoo_project_module.py
index c4015aaf..767179bc 100644
--- a/odoo_project/models/odoo_project_module.py
+++ b/odoo_project/models/odoo_project_module.py
@@ -93,7 +93,7 @@ def _compute_migration_scripts(self):
continue
installed_version = rec.installed_version_id
versions_with_mig_script = rec.version_ids.filtered(
- lambda v: (
+ lambda v, installed_version=installed_version: (
v.sequence > installed_version.sequence and v.has_migration_script
)
)
@@ -105,7 +105,9 @@ def _compute_installed_reverse_dependency_ids(self):
installed_project_modules = rec.odoo_project_id.project_module_ids
installed_modules = installed_project_modules.module_branch_id
installed_reverse_dependencies = rec.reverse_dependency_ids.filtered(
- lambda dep: dep in installed_modules
+ lambda dep, installed_modules=installed_modules: (
+ dep in installed_modules
+ )
)
# Installed rev. deps. are 'odoo.project.module' records
rec.installed_reverse_dependency_ids = (
diff --git a/odoo_project/static/description/index.html b/odoo_project/static/description/index.html
index c4a6d2c1..848eb740 100644
--- a/odoo_project/static/description/index.html
+++ b/odoo_project/static/description/index.html
@@ -372,9 +372,9 @@ Odoo Project
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! source digest: sha256:575fe986992605688cf025147ff99f33cff9b8416f0105df732ed9b2102da90f
+!! source digest: sha256:3331542182c08aa9be85d1710d7fea6e5eb548ce72a9634c889bee41d66da216
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-
+
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:
@@ -405,7 +405,7 @@
Bugs are tracked on GitHub Issues .
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
-feedback .
+feedback .
Do not contact contributors directly about support or help with technical issues.
diff --git a/odoo_project/tests/common.py b/odoo_project/tests/common.py
index 2506670c..b387a9d5 100644
--- a/odoo_project/tests/common.py
+++ b/odoo_project/tests/common.py
@@ -1,7 +1,7 @@
# Copyright 2024 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
-from odoo.tests.common import Form
+from odoo.tests import Form
from odoo.addons.odoo_repository.tests import common
@@ -26,4 +26,5 @@ def _run_import_modules(cls, project, modules_list_text, **kwargs):
form.modules_list = modules_list_text
wiz = form.save()
wiz.action_import()
+ cls.env.flush_all() # Force fields computation
return wiz
diff --git a/odoo_project/views/odoo_project.xml b/odoo_project/views/odoo_project.xml
index f9db14a8..ac0e1556 100644
--- a/odoo_project/views/odoo_project.xml
+++ b/odoo_project/views/odoo_project.xml
@@ -51,14 +51,14 @@
@@ -69,16 +69,14 @@
nolabel="1"
colspan="2"
>
-
+
-
+
-
+
-
+
-
+
@@ -101,10 +99,10 @@
nolabel="1"
colspan="2"
>
-
+
-
+
-
-
-
-
+
- odoo.project.tree
+ odoo.project.list
odoo.project
-
+
-
+
diff --git a/odoo_project/views/odoo_project_module.xml b/odoo_project/views/odoo_project_module.xml
index f2b7e255..91c80751 100644
--- a/odoo_project/views/odoo_project_module.xml
+++ b/odoo_project/views/odoo_project_module.xml
@@ -21,7 +21,7 @@
-
+
@@ -33,11 +33,11 @@
-
+
-
+
@@ -45,7 +45,7 @@
-
+
@@ -55,15 +55,15 @@
- odoo.project.module.tree.inherit
+ odoo.project.module.list.inherit
odoo.project.module
primary
-
+
to_upgrade
pr_url
-
+
@@ -91,17 +91,17 @@
id="odoo_project_module_view_tree_recursive_dependencies"
model="ir.ui.view"
>
- odoo.project.module.tree.recursive_dependencies
+ odoo.project.module.list.recursive_dependencies
odoo.project.module
primary
100
-
+
global_dependency_level, non_std_dependency_level, module_name
-
+
1
@@ -161,7 +161,7 @@
Installed Modules
ir.actions.act_window
odoo.project.module
- tree,form,pivot
+ list,form,pivot
@@ -179,7 +179,7 @@
Installed Modules
ir.actions.act_window
odoo.project.module
- tree,form,pivot
+ list,form,pivot
diff --git a/odoo_project/views/odoo_repository.xml b/odoo_project/views/odoo_repository.xml
index 2ac3ae3f..868fe34b 100644
--- a/odoo_project/views/odoo_repository.xml
+++ b/odoo_project/views/odoo_repository.xml
@@ -13,7 +13,7 @@
type="object"
class="oe_stat_button"
icon="fa-puzzle-piece"
- attrs="{'invisible': [('project_count', '=', 0)]}"
+ invisible="project_count == 0"
>