diff --git a/requirements.txt b/requirements.txt
index e67d950..06fba4a 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,4 +1,5 @@
# generated from manifests external_dependencies
GitPython
github3.py
+markdown
pathspec
diff --git a/vcp_github/__manifest__.py b/vcp_github/__manifest__.py
index 668f42d..d10048f 100644
--- a/vcp_github/__manifest__.py
+++ b/vcp_github/__manifest__.py
@@ -12,10 +12,12 @@
"vcp_management",
],
"external_dependencies": {
- "python": ["github3.py"],
+ "python": ["github3.py", "markdown"],
},
"data": [
"data/data.xml",
],
- "demo": [],
+ "demo": [
+ "demo/demo_vcp_platform.xml",
+ ],
}
diff --git a/vcp_github/demo/demo_vcp_platform.xml b/vcp_github/demo/demo_vcp_platform.xml
new file mode 100644
index 0000000..a039cd5
--- /dev/null
+++ b/vcp_github/demo/demo_vcp_platform.xml
@@ -0,0 +1,8 @@
+
+
+
+ OCA
+
+ ^\d+\.\d+$
+
+
diff --git a/vcp_github/models/vcp_platform.py b/vcp_github/models/vcp_platform.py
index b8534bc..aba8a07 100644
--- a/vcp_github/models/vcp_platform.py
+++ b/vcp_github/models/vcp_platform.py
@@ -5,6 +5,7 @@
from datetime import datetime
import github3
+import markdown
import requests
from pytz import UTC
@@ -40,6 +41,10 @@ def _update_information_github(self):
self.image_1920 = base64.b64encode(response.content)
repos = org.repositories()
for repo in repos:
+ if repo.fork and not self.fetch_repository_fork:
+ continue
+ if repo.archived and not self.fetch_repository_archived:
+ continue
self._update_github_repository(repo)
self.last_update = fields.Datetime.now()
@@ -50,20 +55,30 @@ def _parse_github_date(self, date):
datetime.fromisoformat(date.replace("Z", "+00:00"))
).replace(tzinfo=None)
+ def _parse_github_markdown(self, text):
+ return markdown.markdown(text)
+
def _update_github_repository(self, repo):
vals = {
"created_at": self._parse_github_date(repo.created_at),
+ "last_commit_date": self._parse_github_date(repo.pushed_at),
"stargazers_count": repo.stargazers_count,
"fork_count": repo.forks_count,
+ "is_fork": repo.fork,
+ "active": not repo.archived,
"watchers_count": repo.watchers_count,
"description": repo.description,
}
- repository = self.env["vcp.repository"].search(
- [
- ("name", "=", repo.name),
- ("platform_id", "=", self.id),
- ],
- limit=1,
+ repository = (
+ self.env["vcp.repository"]
+ .with_context(active_test=False)
+ .search(
+ [
+ ("name", "=", repo.name),
+ ("platform_id", "=", self.id),
+ ],
+ limit=1,
+ )
)
if not repository:
repository = (
diff --git a/vcp_github/models/vcp_repository.py b/vcp_github/models/vcp_repository.py
index cadc3e6..a44dc09 100644
--- a/vcp_github/models/vcp_repository.py
+++ b/vcp_github/models/vcp_repository.py
@@ -1,6 +1,7 @@
# Copyright 2026 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
import logging
+import re
from datetime import datetime, timedelta
import github3
@@ -25,6 +26,13 @@ def _update_branches_github(self):
existing_branches = {b.branch_id.name: b for b in self.branch_ids}
found_branches = self.env["vcp.repository.branch"]
for branch in repo.branches():
+ branch_pattern = (
+ self.fetch_branch_pattern
+ or self.platform_id.fetch_repository_branch_pattern
+ or False
+ )
+ if branch_pattern and not re.match(branch_pattern, branch.name):
+ continue
if branch.name in existing_branches:
existing_branches[branch.name].sudo().write(
{"last_commit": branch.commit.sha}
@@ -105,7 +113,7 @@ def _parse_github_pr(self, pr, client):
"id": str(c["id"]),
"user_id": c.get("user")
and self.platform_id.host_id._get_user(c["user"].get("login")),
- "body": c["body"],
+ "body": self.platform_id._parse_github_markdown(c["body"]),
"created_at": self.platform_id._parse_github_date(c["created_at"]),
"updated_at": self.platform_id._parse_github_date(c["updated_at"]),
}
@@ -116,7 +124,7 @@ def _parse_github_pr(self, pr, client):
"id": str(r["id"]),
"user_id": r.get("user")
and self.platform_id.host_id._get_user(r["user"].get("login")),
- "body": r["body"],
+ "body": self.platform_id._parse_github_markdown(r["body"]),
"submitted_at": self.platform_id._parse_github_date(
r.get("submitted_at")
),
diff --git a/vcp_github/tests/test_github.py b/vcp_github/tests/test_github.py
index dd00238..f1d3df4 100644
--- a/vcp_github/tests/test_github.py
+++ b/vcp_github/tests/test_github.py
@@ -60,10 +60,16 @@ def test_update_organization_with_repository(self):
mock_org.avatar_url = False
mock_repo1 = MagicMock()
mock_repo1.name = "server-tools"
+ mock_repo1.archived = False
+ mock_repo1.fork = False
mock_repo1.created_at = "2020-01-01T00:00:00Z"
+ mock_repo1.pushed_at = "2020-02-01T00:00:00Z"
mock_repo2 = MagicMock()
mock_repo2.name = "server-brand"
+ mock_repo2.archived = False
+ mock_repo2.fork = False
mock_repo2.created_at = "2021-01-01T10:00:00Z"
+ mock_repo2.pushed_at = "2021-02-01T00:00:00Z"
mock_org.repositories.return_value = [mock_repo1, mock_repo2]
mock_client.organization.return_value = mock_org
mock_github3.login.return_value = mock_client
@@ -102,6 +108,7 @@ def test_update_repository(self):
"created_at": "2023-01-01T00:00:00Z",
"updated_at": "2023-01-03T00:00:00Z",
"closed_at": "2023-01-02T00:00:00Z",
+ "pushed_at": "2024-01-02T00:00:00Z",
"commits": 3,
"comments": 2,
"review_comments": 1,
diff --git a/vcp_management/__manifest__.py b/vcp_management/__manifest__.py
index 24fe0d4..ea5f64d 100644
--- a/vcp_management/__manifest__.py
+++ b/vcp_management/__manifest__.py
@@ -14,7 +14,6 @@
"security/ir.model.access.csv",
"data/ir_cron.xml",
"templates/templates.xml",
- "views/menu.xml",
"views/vcp_comment.xml",
"views/vcp_review.xml",
"views/vcp_request.xml",
@@ -26,6 +25,7 @@
"views/vcp_host.xml",
"views/vcp_rule.xml",
"views/vcp_rule_information.xml",
+ "views/menu.xml",
],
"demo": [],
"external_dependencies": {
diff --git a/vcp_management/models/__init__.py b/vcp_management/models/__init__.py
index aa400f5..be3a675 100644
--- a/vcp_management/models/__init__.py
+++ b/vcp_management/models/__init__.py
@@ -1,4 +1,5 @@
from . import vcp_platform
+from . import vcp_platform_key
from . import vcp_branch
from . import vcp_rule
from . import vcp_rule_information
diff --git a/vcp_management/models/vcp_branch.py b/vcp_management/models/vcp_branch.py
index 1ac5390..3c47744 100644
--- a/vcp_management/models/vcp_branch.py
+++ b/vcp_management/models/vcp_branch.py
@@ -17,6 +17,7 @@ class VcpBranch(models.Model):
comodel_name="vcp.platform",
string="Platform",
required=True,
+ readonly=True,
)
_sql_constraints = [
("name_uniq", "unique(name, platform_id)", "Branch name must be unique.")
diff --git a/vcp_management/models/vcp_platform.py b/vcp_management/models/vcp_platform.py
index fe58e55..77c6e6d 100644
--- a/vcp_management/models/vcp_platform.py
+++ b/vcp_management/models/vcp_platform.py
@@ -20,6 +20,7 @@ class VcpPlatform(models.Model):
"""
_name = "vcp.platform"
+ _inherit = ["image.mixin"]
_description = "VCP Platform"
name = fields.Char(required=True)
@@ -28,21 +29,10 @@ class VcpPlatform(models.Model):
last_update = fields.Datetime(readonly=True)
active = fields.Boolean(default=True)
update_interval_days = fields.Integer(default=3)
- image_1920 = fields.Image()
branch_ids = fields.One2many(
"vcp.branch",
inverse_name="platform_id",
)
- image_128 = fields.Image(
- max_width=128,
- max_height=128,
- store=True,
- related="image_1920",
- string="Image 128",
- )
- image_64 = fields.Image(
- max_width=64, max_height=64, store=True, related="image_1920", string="Image 64"
- )
host_id = fields.Many2one(
"vcp.host",
required=True,
@@ -57,8 +47,22 @@ class VcpPlatform(models.Model):
"vcp.repository",
inverse_name="platform_id",
)
+ repository_count = fields.Integer(compute="_compute_repository_count", store=True)
default_update_repository_information = fields.Boolean()
information_update = fields.Boolean()
+ fetch_repository_fork = fields.Boolean(
+ help="If checked, all repositories will be fetched (sources and forks)."
+ " Otherwise, only sources repositories will be fetched"
+ )
+ fetch_repository_archived = fields.Boolean(
+ help="If checked, all repositories will be fetched (actives and archived)."
+ " Otherwise, only active repositories will be fetched"
+ )
+ fetch_repository_branch_pattern = fields.Char(
+ help="Regular Expression. If set, only branches whose names are matching"
+ " the pattern will be fetched, when fetching branches of the repositories"
+ " of the platform."
+ )
local_path = fields.Char(compute="_compute_local_path")
rule_ids = fields.Many2many(
"vcp.rule",
@@ -80,6 +84,11 @@ def _compute_local_path(self):
for record in self:
record.local_path = f"{source_path}/{record.id}"
+ @api.depends("repository_ids")
+ def _compute_repository_count(self):
+ for record in self:
+ record.repository_count = len(record.repository_ids)
+
def update_information(self):
self.ensure_one()
getattr(self, f"_update_information_{self.kind}")()
@@ -352,20 +361,3 @@ def _improve_vcp_data(self, data, kind, **kwargs):
values["name"] = repository.name
values["url"] = repository._get_repository_url()
return data
-
-
-class VcpPlatformKey(models.Model):
- _name = "vcp.platform.key"
- _description = "VCP Platform API Key" # TODO
-
- platform_id = fields.Many2one(
- comodel_name="vcp.platform",
- string="Platform",
- required=True,
- ondelete="cascade",
- )
- name = fields.Char(required=True)
-
- _sql_constraints = [
- ("name_uniq", "unique(name, platform_id)", "API Key must be unique.")
- ]
diff --git a/vcp_management/models/vcp_platform_key.py b/vcp_management/models/vcp_platform_key.py
new file mode 100644
index 0000000..8e953ba
--- /dev/null
+++ b/vcp_management/models/vcp_platform_key.py
@@ -0,0 +1,24 @@
+# Copyright 2026 Dixmit
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+import logging
+
+from odoo import fields, models
+
+_logger = logging.getLogger(__name__)
+
+
+class VcpPlatformKey(models.Model):
+ _name = "vcp.platform.key"
+ _description = "VCP Platform API Key" # TODO
+
+ platform_id = fields.Many2one(
+ comodel_name="vcp.platform",
+ string="Platform",
+ required=True,
+ ondelete="cascade",
+ )
+ name = fields.Char(required=True)
+
+ _sql_constraints = [
+ ("name_uniq", "unique(name, platform_id)", "API Key must be unique.")
+ ]
diff --git a/vcp_management/models/vcp_repository.py b/vcp_management/models/vcp_repository.py
index eeb44f3..665ef56 100644
--- a/vcp_management/models/vcp_repository.py
+++ b/vcp_management/models/vcp_repository.py
@@ -19,14 +19,23 @@ class VcpRepository(models.Model):
required=True,
)
created_at = fields.Datetime(readonly=True)
+ last_commit_date = fields.Datetime(readonly=True)
+ fetch_branch_pattern = fields.Char(
+ help="Regular Expression. If set, only branches whose names are matching"
+ " the pattern will be fetched. You can define that value at platform level."
+ )
stargazers_count = fields.Integer(readonly=True)
+ is_fork = fields.Boolean(
+ readonly=True,
+ help="Specify if the repo is a Source or a Fork repository",
+ )
fork_count = fields.Integer(readonly=True)
watchers_count = fields.Integer(readonly=True)
from_date = fields.Datetime(readonly=True, required=True)
request_ids = fields.One2many("vcp.request", inverse_name="repository_id")
request_count = fields.Integer(compute="_compute_request_count")
test_field = fields.Char() # TODO remove after testing
- active = fields.Boolean(default=True)
+ active = fields.Boolean(default=True, readonly=True)
information_update = fields.Boolean(
compute="_compute_information_update",
store=True,
@@ -46,6 +55,7 @@ class VcpRepository(models.Model):
"vcp.repository.branch",
inverse_name="repository_id",
)
+ branch_count = fields.Integer(compute="_compute_branch_count", store=True)
def _get_rules(self):
rules = self.rule_ids
@@ -74,6 +84,11 @@ def _compute_request_count(self):
for record in self:
record.request_count = len(record.request_ids)
+ @api.depends("branch_ids")
+ def _compute_branch_count(self):
+ for record in self:
+ record.branch_count = len(record.branch_ids)
+
def update_branches(self):
self.ensure_one()
now = fields.Datetime.now()
diff --git a/vcp_management/models/vcp_repository_branch.py b/vcp_management/models/vcp_repository_branch.py
index 0305e8e..88f5407 100644
--- a/vcp_management/models/vcp_repository_branch.py
+++ b/vcp_management/models/vcp_repository_branch.py
@@ -18,10 +18,12 @@ class VcpRepositoryBranch(models.Model):
"vcp.branch",
string="Branch",
required=True,
+ ondelete="cascade",
)
repository_id = fields.Many2one(
"vcp.repository",
required=True,
+ ondelete="cascade",
)
platform_id = fields.Many2one(
related="repository_id.platform_id",
@@ -96,3 +98,10 @@ def _download_code(self):
depth=1,
)
return result
+
+ def _compute_display_name(self):
+ if not self._context.get("display_only_branch_name"):
+ return super()._compute_display_name()
+
+ for record in self:
+ record.display_name = record.branch_id.name
diff --git a/vcp_management/views/menu.xml b/vcp_management/views/menu.xml
index 1d785b5..91d7b02 100644
--- a/vcp_management/views/menu.xml
+++ b/vcp_management/views/menu.xml
@@ -6,12 +6,78 @@
id="vcp_main_menu"
name="Virtual Control Platform"
sequence="16"
- web_icon="vcp,static/description/icon.png"
- />
-
+ web_icon="vcp_management,static/description/icon.png"
+ >
+
+
+
+
+
+
+
+
+
+
diff --git a/vcp_management/views/vcp_branch.xml b/vcp_management/views/vcp_branch.xml
index f5b6041..9e8d7ed 100644
--- a/vcp_management/views/vcp_branch.xml
+++ b/vcp_management/views/vcp_branch.xml
@@ -9,7 +9,8 @@
-
+
+
@@ -21,7 +22,17 @@
+
+
+
+ Branches
+ vcp.branch
+ vcp-branch
+ list,form
+ []
+ {}
+
diff --git a/vcp_management/views/vcp_comment.xml b/vcp_management/views/vcp_comment.xml
index c43cec9..a81b1c4 100644
--- a/vcp_management/views/vcp_comment.xml
+++ b/vcp_management/views/vcp_comment.xml
@@ -9,7 +9,16 @@
+
+
+
+
+
+
+
+
+
@@ -20,7 +29,18 @@
+
+
+
+
+
+
diff --git a/vcp_management/views/vcp_host.xml b/vcp_management/views/vcp_host.xml
index d82675e..a231261 100644
--- a/vcp_management/views/vcp_host.xml
+++ b/vcp_management/views/vcp_host.xml
@@ -46,11 +46,4 @@
[]
{}
-
-
diff --git a/vcp_management/views/vcp_organization.xml b/vcp_management/views/vcp_organization.xml
index e27b22e..142a44a 100644
--- a/vcp_management/views/vcp_organization.xml
+++ b/vcp_management/views/vcp_organization.xml
@@ -44,11 +44,4 @@
[]
{}
-
-
diff --git a/vcp_management/views/vcp_platform.xml b/vcp_management/views/vcp_platform.xml
index 7df0195..4798e72 100644
--- a/vcp_management/views/vcp_platform.xml
+++ b/vcp_management/views/vcp_platform.xml
@@ -15,7 +15,20 @@
/>
-
+
+
+
+
+
+
-
+
+
+
+
+
@@ -64,6 +84,7 @@
+
@@ -76,11 +97,4 @@
[]
{}
-
-
diff --git a/vcp_management/views/vcp_repository.xml b/vcp_management/views/vcp_repository.xml
index 94f82b1..75ba13f 100644
--- a/vcp_management/views/vcp_repository.xml
+++ b/vcp_management/views/vcp_repository.xml
@@ -58,9 +58,18 @@
/>
+
+
+
+
@@ -100,6 +109,11 @@
+
@@ -107,11 +121,13 @@
vcp.repository
-
+
+
+
@@ -143,6 +159,13 @@
+
+ Repositories
+ vcp.repository
+ list,form
+ [("platform_id", "=", active_id)]
+
+
Repositories
vcp-repositories
@@ -151,11 +174,4 @@
[]
{}
-
-
diff --git a/vcp_management/views/vcp_request.xml b/vcp_management/views/vcp_request.xml
index fd7b5ee..d2a203a 100644
--- a/vcp_management/views/vcp_request.xml
+++ b/vcp_management/views/vcp_request.xml
@@ -82,11 +82,4 @@
[("repository_id", "=", active_id)]
{}
-
-
diff --git a/vcp_management/views/vcp_review.xml b/vcp_management/views/vcp_review.xml
index 6c20335..b30c8fd 100644
--- a/vcp_management/views/vcp_review.xml
+++ b/vcp_management/views/vcp_review.xml
@@ -10,6 +10,11 @@
+
+
+
+
+
@@ -21,7 +26,18 @@
+
+
+
+
+
+
+ Reviews
+ vcp.review
+ vcp-review
+ list,form
+
diff --git a/vcp_management/views/vcp_rule.xml b/vcp_management/views/vcp_rule.xml
index ab5ca77..e621272 100644
--- a/vcp_management/views/vcp_rule.xml
+++ b/vcp_management/views/vcp_rule.xml
@@ -49,11 +49,4 @@
[]
{}
-
-
diff --git a/vcp_management/views/vcp_user.xml b/vcp_management/views/vcp_user.xml
index 7cff525..18e17f9 100644
--- a/vcp_management/views/vcp_user.xml
+++ b/vcp_management/views/vcp_user.xml
@@ -47,11 +47,4 @@
[]
{}
-
-
diff --git a/vcp_odoo/models/__init__.py b/vcp_odoo/models/__init__.py
index 7e48d76..be6d37f 100644
--- a/vcp_odoo/models/__init__.py
+++ b/vcp_odoo/models/__init__.py
@@ -1,3 +1,5 @@
from . import vcp_rule
from . import vcp_odoo_module
from . import vcp_odoo_module_version
+from . import vcp_odoo_bin_package
+from . import vcp_odoo_lib_python
diff --git a/vcp_odoo/models/vcp_odoo_bin_package.py b/vcp_odoo/models/vcp_odoo_bin_package.py
new file mode 100644
index 0000000..2625e28
--- /dev/null
+++ b/vcp_odoo/models/vcp_odoo_bin_package.py
@@ -0,0 +1,18 @@
+# Copyright 2026 Dixmit
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models, tools
+
+
+class VcpOdooBinPackage(models.Model):
+ _name = "vcp.odoo.bin.package"
+ _description = "Binary Package required by an Odoo Module"
+
+ name = fields.Char(required=True)
+
+ @tools.ormcache("name")
+ def _get_bin(self, name):
+ bin_src = self.search([("name", "=", name)], limit=1)
+ if not bin_src:
+ bin_src = self.create({"name": name})
+ return bin_src.id
diff --git a/vcp_odoo/models/vcp_odoo_lib_python.py b/vcp_odoo/models/vcp_odoo_lib_python.py
new file mode 100644
index 0000000..2759f3c
--- /dev/null
+++ b/vcp_odoo/models/vcp_odoo_lib_python.py
@@ -0,0 +1,18 @@
+# Copyright 2026 Dixmit
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo import fields, models, tools
+
+
+class VcpOdooLibPython(models.Model):
+ _name = "vcp.odoo.lib.python"
+ _description = "Python Library required by an Odoo Module"
+
+ name = fields.Char(required=True)
+
+ @tools.ormcache("name")
+ def _get_lib_python(self, name):
+ lib = self.search([("name", "=", name)], limit=1)
+ if not lib:
+ lib = self.create({"name": name})
+ return lib.id
diff --git a/vcp_odoo/models/vcp_odoo_module.py b/vcp_odoo/models/vcp_odoo_module.py
index b5f2e16..479107e 100644
--- a/vcp_odoo/models/vcp_odoo_module.py
+++ b/vcp_odoo/models/vcp_odoo_module.py
@@ -1,7 +1,7 @@
# Copyright 2026 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import fields, models, tools
+from odoo import api, fields, models, tools
class VcpOdooModule(models.Model):
@@ -10,11 +10,31 @@ class VcpOdooModule(models.Model):
name = fields.Char(required=True)
version_ids = fields.One2many("vcp.odoo.module.version", inverse_name="module_id")
+ version_count = fields.Integer(
+ compute="_compute_version_count",
+ help="number of versions in which the module is available",
+ store=True,
+ )
+ repository_branch_ids = fields.Many2many(
+ "vcp.repository.branch", compute="_compute_repository_branch_ids"
+ )
_sql_constraints = [
("name_uniq", "unique(name)", "The module name must be unique"),
]
+ @api.depends("version_ids")
+ def _compute_version_count(self):
+ for record in self:
+ record.version_count = len(record.version_ids)
+
+ @api.depends("version_ids.repository_branch_id")
+ def _compute_repository_branch_ids(self):
+ for record in self:
+ record.repository_branch_ids = record.mapped(
+ "version_ids.repository_branch_id"
+ ).sorted(lambda x: x.branch_id.name)
+
@tools.ormcache("name")
def _get_odoo_module(self, name):
"""
diff --git a/vcp_odoo/models/vcp_odoo_module_version.py b/vcp_odoo/models/vcp_odoo_module_version.py
index e56a884..363f860 100644
--- a/vcp_odoo/models/vcp_odoo_module_version.py
+++ b/vcp_odoo/models/vcp_odoo_module_version.py
@@ -1,13 +1,13 @@
# Copyright 2026 Dixmit
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
-from odoo import fields, models, tools
+from odoo import fields, models
class VcpOdooModuleVersion(models.Model):
_name = "vcp.odoo.module.version"
_description = "Odoo Module on an specific repository branch"
- _inherit = ["vcp.rule.information.mixin"]
+ _inherit = ["vcp.rule.information.mixin", "image.mixin"]
name = fields.Char(required=True)
path = fields.Char(required=True)
@@ -19,6 +19,8 @@ class VcpOdooModuleVersion(models.Model):
version = fields.Char(required=True)
repository_branch_id = fields.Many2one(
"vcp.repository.branch",
+ required=True,
+ ondelete="cascade",
)
depends_on_module_ids = fields.Many2many(
"vcp.odoo.module",
@@ -27,19 +29,6 @@ class VcpOdooModuleVersion(models.Model):
license = fields.Char(string="License (Manifest)", readonly=True)
summary = fields.Char(string="Summary (Manifest)", readonly=True)
website = fields.Char(string="Website (Manifest)", readonly=True)
- image_1920 = fields.Image(
- max_width=1920,
- max_height=1920,
- readonly=True,
- string="Image 1920x1920 (Manifest)",
- )
- image_128 = fields.Image(
- related="image_1920",
- readonly=True,
- max_width=128,
- max_height=128,
- string="Image 128x128 (Manifest)",
- )
lib_python_ids = fields.Many2many(
"vcp.odoo.lib.python",
string="Python Libraries",
@@ -51,31 +40,3 @@ class VcpOdooModuleVersion(models.Model):
def _get_local_path(self):
return f"{self.repository_branch_id.local_path}/{self.path}"
-
-
-class VcpOdooLibPython(models.Model):
- _name = "vcp.odoo.lib.python"
- _description = "Python Library required by an Odoo Module"
-
- name = fields.Char(required=True)
-
- @tools.ormcache("name")
- def _get_lib_python(self, name):
- lib = self.search([("name", "=", name)], limit=1)
- if not lib:
- lib = self.create({"name": name})
- return lib.id
-
-
-class VcpOdooBinPackage(models.Model):
- _name = "vcp.odoo.bin.package"
- _description = "Binary Package required by an Odoo Module"
-
- name = fields.Char(required=True)
-
- @tools.ormcache("name")
- def _get_bin(self, name):
- bin_src = self.search([("name", "=", name)], limit=1)
- if not bin_src:
- bin_src = self.create({"name": name})
- return bin_src.id
diff --git a/vcp_odoo/views/vcp_odoo_module.xml b/vcp_odoo/views/vcp_odoo_module.xml
index 57b2d67..105d54a 100644
--- a/vcp_odoo/views/vcp_odoo_module.xml
+++ b/vcp_odoo/views/vcp_odoo_module.xml
@@ -26,6 +26,11 @@
+
@@ -35,6 +40,12 @@
+
+
@@ -44,7 +55,7 @@
vcp.odoo.module
list,form
[]
- {}
+ {'search_default_filter_with_version': 1}