From 67f1c1e28818df6e1d8cd041edd0cf85de482992 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 30 May 2024 15:11:38 +0200 Subject: [PATCH] [IMP] runbot_merge: add staging duration Computed on the fly for now. Formatted nicely in the frontend, there does not seem to be any sort of duration widget in the backend so just display the integer number of seconds. Fixes #865 --- runbot_merge/__manifest__.py | 2 +- runbot_merge/migrations/15.0.1.13/pre-migration.py | 4 ++++ runbot_merge/models/pull_requests.py | 10 +++++++++- runbot_merge/views/mergebot.xml | 2 ++ runbot_merge/views/templates.xml | 12 +++++++++++- 5 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 runbot_merge/migrations/15.0.1.13/pre-migration.py diff --git a/runbot_merge/__manifest__.py b/runbot_merge/__manifest__.py index 13bed3dc..b005c5a9 100644 --- a/runbot_merge/__manifest__.py +++ b/runbot_merge/__manifest__.py @@ -1,6 +1,6 @@ { 'name': 'merge bot', - 'version': '1.12', + 'version': '1.13', 'depends': ['contacts', 'mail', 'website'], 'data': [ 'security/security.xml', diff --git a/runbot_merge/migrations/15.0.1.13/pre-migration.py b/runbot_merge/migrations/15.0.1.13/pre-migration.py new file mode 100644 index 00000000..ed9ba615 --- /dev/null +++ b/runbot_merge/migrations/15.0.1.13/pre-migration.py @@ -0,0 +1,4 @@ +def migrate(cr, version): + cr.execute("ALTER TABLE runbot_merge_stagings " + "ADD COLUMN staging_end timestamp without time zone") + cr.execute("UPDATE runbot_merge_stagings SET staging_end = write_date") diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index 1a174aef..f5cf0235 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -1796,6 +1796,8 @@ class Stagings(models.Model): active = fields.Boolean(default=True) staged_at = fields.Datetime(default=fields.Datetime.now, index=True) + staging_end = fields.Datetime() + staging_duration = fields.Float(compute='_compute_duration') timeout_limit = fields.Datetime(store=True, compute='_compute_timeout_limit') reason = fields.Text("Reason for final state (if any)") @@ -1819,11 +1821,17 @@ class Stagings(models.Model): for staging in previously_pending: if staging.state != 'pending': super(Stagings, staging).write({ - 'statuses_cache': json.dumps(staging.statuses) + 'staging_end': fields.Datetime.now(), + 'statuses_cache': json.dumps(staging.statuses), }) return True + @api.depends('staged_at', 'staging_end') + def _compute_duration(self): + for s in self: + s.staging_duration = ((s.staging_end or fields.Datetime.now()) - s.staged_at).total_seconds() + def name_get(self): return [ (staging.id, "%d (%s, %s%s)" % ( diff --git a/runbot_merge/views/mergebot.xml b/runbot_merge/views/mergebot.xml index c1cea06b..c1d7418a 100644 --- a/runbot_merge/views/mergebot.xml +++ b/runbot_merge/views/mergebot.xml @@ -311,6 +311,8 @@ + diff --git a/runbot_merge/views/templates.xml b/runbot_merge/views/templates.xml index ef3cbe81..3b8d4d14 100644 --- a/runbot_merge/views/templates.xml +++ b/runbot_merge/views/templates.xml @@ -24,7 +24,7 @@ data-toggle="dropdown" aria-haspopup="true" aria-expanded="true" - t-attf-title="Staged at {{staging.staged_at}}Z" + t-attf-title="Staged at {{staging.staged_at}}Z for {{round(staging.staging_duration)}}s" > @@ -187,6 +187,11 @@ Staged + (duration ) @@ -248,6 +253,11 @@ + in