From 6909b7e583f8a58dd414cbb0f4214b56e62c24cc Mon Sep 17 00:00:00 2001 From: Xavier-Do Date: Wed, 5 Feb 2020 15:42:18 +0100 Subject: [PATCH] [IMP] runbot: allow build copy --- runbot/fields.py | 3 +++ runbot/models/build.py | 43 ++++++++++++++++++++++++++++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/runbot/fields.py b/runbot/fields.py index d86cb9f4..f37c42b2 100644 --- a/runbot/fields.py +++ b/runbot/fields.py @@ -22,6 +22,9 @@ class JsonDictField(Field): def convert_to_record(self, value, record): return FieldDict(value or {}, self, record) + def convert_to_read(self, value, record, use_name_get=True): + return self.convert_to_cache(value, record) + class FieldDict(MutableMapping): diff --git a/runbot/models/build.py b/runbot/models/build.py index 02dd77ed..bf25754b 100644 --- a/runbot/models/build.py +++ b/runbot/models/build.py @@ -24,6 +24,27 @@ _logger = logging.getLogger(__name__) result_order = ['ok', 'warn', 'ko', 'skipped', 'killed', 'manually_killed'] state_order = ['pending', 'testing', 'waiting', 'running', 'duplicate', 'done'] +COPY_WHITELIST = [ + "branch_id", + "repo_id", + "name", + "description", + "date", + "author", + "author_email", + "committer", + "committer_email", + "subject", + "config_data", + "extra_params", + "build_type", + "parent_id", + "hidden", + "dependency_ids", + "config_id", + "orphan_result", + "commit_path_mode", +] def make_selection(array): def format(string): @@ -56,7 +77,7 @@ class runbot_build(models.Model): sequence = fields.Integer('Sequence') log_ids = fields.One2many('ir.logging', 'build_id', string='Logs') error_log_ids = fields.One2many('ir.logging', 'build_id', domain=[('level', 'in', ['WARNING', 'ERROR', 'CRITICAL'])], string='Error Logs') - config_data = JsonDictField('Json Data') + config_data = JsonDictField('Config Data') # state machine @@ -101,7 +122,7 @@ class runbot_build(models.Model): # should we add a has children stored boolean? hidden = fields.Boolean("Don't show build on main page", default=False) # index? children_ids = fields.One2many('runbot.build', 'parent_id') - dependency_ids = fields.One2many('runbot.build.dependency', 'build_id') + dependency_ids = fields.One2many('runbot.build.dependency', 'build_id', copy=True) config_id = fields.Many2one('runbot.build.config', 'Run Config', required=True, default=lambda self: self.env.ref('runbot.runbot_build_config_default', raise_if_not_found=False)) real_build = fields.Many2one('runbot.build', 'Real Build', help="duplicate_id or self", compute='_compute_real_build') @@ -190,8 +211,18 @@ class runbot_build(models.Model): for build in self: build.real_build = build.duplicate_id or build - def copy(self, values=None): - raise UserError("Cannot duplicate build!") + def copy_data(self, default=None): + values = super().copy_data(default)[0] + values = {key: value for key, value in values.items() if key in COPY_WHITELIST} + values.update({ + 'host': 'PAUSED', # hack to keep the build in pending waiting for a manual update. Todo: add a paused state instead + 'local_state': 'pending', + }) + return [values] + + def copy(self, default=None): + return super(runbot_build, self.with_context(force_rebuild=True)).copy(default) + @api.model_create_single def create(self, vals): @@ -355,14 +386,14 @@ class runbot_build(models.Model): for build in self: if build.duplicate_id: build.job_time = build.duplicate_id.job_time - elif build.job_end: + elif build.job_end and build.job_start: build.job_time = int(dt2time(build.job_end) - dt2time(build.job_start)) elif build.job_start: build.job_time = int(time.time() - dt2time(build.job_start)) else: build.job_time = 0 - @api.depends('build_start', 'build_end', 'duplicate_id.build_time') + @api.depends('build_start', 'build_end', 'global_state', 'duplicate_id.build_time') def _compute_build_time(self): for build in self: if build.duplicate_id: