Tower: upload cetmix_tower_git 16.0.2.0.2 (via marketplace)
This commit is contained in:
189
addons/cetmix_tower_git/models/cx_tower_git_source.py
Normal file
189
addons/cetmix_tower_git/models/cx_tower_git_source.py
Normal file
@@ -0,0 +1,189 @@
|
||||
# Copyright (C) 2024 Cetmix OÜ
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||
from odoo import _, api, fields, models
|
||||
|
||||
|
||||
class CxTowerGitSource(models.Model):
|
||||
"""
|
||||
Git Source.
|
||||
Implements single git source.
|
||||
Each source can include multiple remotes which can be
|
||||
branches or pull requests of different repositories.
|
||||
"""
|
||||
|
||||
_name = "cx.tower.git.source"
|
||||
_description = "Cetmix Tower Git Source"
|
||||
|
||||
_inherit = [
|
||||
"cx.tower.reference.mixin",
|
||||
"cx.tower.yaml.mixin",
|
||||
]
|
||||
_order = "sequence, name"
|
||||
|
||||
active = fields.Boolean(related="git_project_id.active", store=True, readonly=True)
|
||||
enabled = fields.Boolean(
|
||||
default=True, help="Enable in configuration and exported to files"
|
||||
)
|
||||
name = fields.Char(required=False)
|
||||
sequence = fields.Integer(default=10)
|
||||
git_project_id = fields.Many2one(
|
||||
comodel_name="cx.tower.git.project",
|
||||
string="Git Configuration",
|
||||
required=True,
|
||||
ondelete="cascade",
|
||||
auto_join=True,
|
||||
)
|
||||
|
||||
remote_ids = fields.One2many(
|
||||
comodel_name="cx.tower.git.remote",
|
||||
inverse_name="source_id",
|
||||
auto_join=True,
|
||||
copy=True,
|
||||
)
|
||||
remote_count = fields.Integer(
|
||||
compute="_compute_remote_count",
|
||||
string="Remotes",
|
||||
)
|
||||
remote_count_private = fields.Integer(
|
||||
compute="_compute_remote_count",
|
||||
string="Private Remotes",
|
||||
)
|
||||
|
||||
@api.depends("remote_ids", "remote_ids.enabled", "remote_ids.is_private")
|
||||
def _compute_remote_count(self):
|
||||
for record in self:
|
||||
remote_count = private_remote_count = 0
|
||||
for remote in record.remote_ids:
|
||||
if not remote.enabled:
|
||||
continue
|
||||
if remote.is_private:
|
||||
private_remote_count += 1
|
||||
remote_count += 1
|
||||
record.update(
|
||||
{
|
||||
"remote_count": remote_count,
|
||||
"remote_count_private": private_remote_count,
|
||||
}
|
||||
)
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
res = super().create(vals_list)
|
||||
# Update name
|
||||
res._compose_name()
|
||||
# Update related files and templates on create
|
||||
res._update_related_files_and_templates()
|
||||
return res
|
||||
|
||||
def write(self, vals):
|
||||
res = super().write(vals)
|
||||
# Compose name
|
||||
if "name" in vals and not vals.get("name"):
|
||||
self._compose_name()
|
||||
# Update related files and templates on update
|
||||
self._update_related_files_and_templates()
|
||||
return res
|
||||
|
||||
def unlink(self):
|
||||
"""
|
||||
Override to update related files and templates on unlink
|
||||
"""
|
||||
related_files = self.mapped("git_project_id").mapped("git_project_rel_ids")
|
||||
related_templates = self.mapped("git_project_id").mapped(
|
||||
"git_project_file_template_rel_ids"
|
||||
)
|
||||
res = super().unlink()
|
||||
# Update related files and templates on unlink
|
||||
if related_files:
|
||||
related_files._save_to_file()
|
||||
if related_templates:
|
||||
related_templates._save_to_file_template()
|
||||
return res
|
||||
|
||||
def _compose_name(self):
|
||||
"""Compose name if not provided explicitly"""
|
||||
for source in self:
|
||||
if source.name:
|
||||
continue
|
||||
remote = fields.first(source.remote_ids)
|
||||
if not remote:
|
||||
source.name = _("Empty Source")
|
||||
continue
|
||||
|
||||
remote_repo = remote.repo_id
|
||||
source.name = f"{remote_repo.owner_id.name}/{remote_repo.repo}"
|
||||
|
||||
def _update_related_files_and_templates(self):
|
||||
# Update related files and templates on update
|
||||
related_files = self.mapped("git_project_id").mapped("git_project_rel_ids")
|
||||
if related_files:
|
||||
related_files._save_to_file()
|
||||
related_templates = self.mapped("git_project_id").mapped(
|
||||
"git_project_file_template_rel_ids"
|
||||
)
|
||||
if related_templates:
|
||||
related_templates._save_to_file_template()
|
||||
|
||||
# ------------------------------
|
||||
# Reference mixin methods
|
||||
# ------------------------------
|
||||
def _get_pre_populated_model_data(self):
|
||||
res = super()._get_pre_populated_model_data()
|
||||
res.update({"cx.tower.git.source": ["cx.tower.git.project", "git_project_id"]})
|
||||
return res
|
||||
|
||||
# ------------------------------
|
||||
# YAML mixin methods
|
||||
# ------------------------------
|
||||
def _get_fields_for_yaml(self):
|
||||
res = super()._get_fields_for_yaml()
|
||||
res += [
|
||||
"name",
|
||||
"enabled",
|
||||
"sequence",
|
||||
"remote_ids",
|
||||
]
|
||||
return res
|
||||
|
||||
# ------------------------------
|
||||
# Git Aggregator related methods
|
||||
# ------------------------------
|
||||
def _git_aggregator_prepare_record(self):
|
||||
"""Prepare json structure for git aggregator.
|
||||
|
||||
Returns:
|
||||
Dict: Json structure for git aggregator
|
||||
"""
|
||||
self.ensure_one()
|
||||
|
||||
# Prepare remotes, merges and target
|
||||
remotes = {}
|
||||
merges = []
|
||||
target = None
|
||||
for remote in self.remote_ids:
|
||||
if remote.enabled:
|
||||
remotes.update({remote.name: remote._git_aggregator_prepare_url()})
|
||||
merges.append(
|
||||
{
|
||||
"remote": remote.name,
|
||||
"ref": remote._git_aggregator_prepare_head(),
|
||||
}
|
||||
)
|
||||
# Set target to first remote name
|
||||
if not target:
|
||||
target = remote.name
|
||||
|
||||
# If no remotes, return empty dict
|
||||
if not remotes:
|
||||
return {}
|
||||
|
||||
vals = {
|
||||
"remotes": remotes,
|
||||
"merges": merges,
|
||||
"target": target,
|
||||
}
|
||||
|
||||
# Fetch only first commit if there is only one remote
|
||||
if len(remotes) == 1:
|
||||
vals.update({"defaults": {"depth": 1}})
|
||||
return vals
|
||||
Reference in New Issue
Block a user