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 @@ + + + + + + + Comments + vcp.comment + vcp-comment + list,form + 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 @@ [] {} - - - Platform Types - - - - 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 @@ [] {} - - - Organizations - - - - 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 @@ [] {} - - - Platforms - - - - 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 @@ [] {} - - - Repositories - - - - 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)] {} - - - Requests - - - - 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 @@ [] {} - - - Processing Rules - - - - 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 @@ [] {} - - - Users - - - - 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} diff --git a/vcp_portal/tests/test_portal.py b/vcp_portal/tests/test_portal.py index 901fbe2..bdf5b42 100644 --- a/vcp_portal/tests/test_portal.py +++ b/vcp_portal/tests/test_portal.py @@ -41,7 +41,7 @@ def setUpClass(cls): ) platform = cls.env["vcp.platform"].create( { - "name": "oca", + "name": "oca-dev", "short_description": "OCA", "description": "OCA", "host_id": cls.host.id, @@ -50,7 +50,7 @@ def setUpClass(cls): repository = cls.env["vcp.repository"].create( { "name": "contributors-module", - "description": "OCA/contributors-module", + "description": "OCA-dev/contributors-module", "platform_id": platform.id, "from_date": date, }