diff --git a/forwardport/data/queues.xml b/forwardport/data/queues.xml index 8d552a2a..c7eaac00 100644 --- a/forwardport/data/queues.xml +++ b/forwardport/data/queues.xml @@ -8,7 +8,8 @@ Forward port batches forwardport.batches - + + diff --git a/forwardport/models/forwardport.py b/forwardport/models/forwardport.py index d5e63dbb..7f45133d 100644 --- a/forwardport/models/forwardport.py +++ b/forwardport/models/forwardport.py @@ -3,6 +3,7 @@ import builtins import collections import logging import re +import sys from collections.abc import Mapping from contextlib import ExitStack from datetime import datetime, timedelta @@ -64,6 +65,7 @@ class Queue: class ForwardPortTasks(models.Model, Queue): _name = 'forwardport.batches' + _inherit = ['mail.thread'] _description = 'batches which got merged and are candidates for forward-porting' limit = 10 @@ -76,6 +78,7 @@ class ForwardPortTasks(models.Model, Queue): ('complete', 'Complete ported batches'), ], required=True) retry_after = fields.Datetime(required=True, default='1900-01-01 01:01:01') + cannot_apply = fields.Boolean(compute='_compute_cannot_apply', store=True) retry_after_relative = fields.Char(compute="_compute_retry_after_relative") pr_id = fields.Many2one('runbot_merge.pull_requests') @@ -92,21 +95,31 @@ class ForwardPortTasks(models.Model, Queue): def _search_domain(self): return super()._search_domain() + [ + ('cannot_apply', '=', False), ('retry_after', '<=', fields.Datetime.to_string(fields.Datetime.now())), ] - @api.depends('retry_after') + @api.depends('retry_after', 'cannot_apply') def _compute_retry_after_relative(self): now = fields.Datetime.now() for t in self: - if t.retry_after <= now: + if t.cannot_apply: + t.retry_after_relative = "N/A" + elif t.retry_after <= now: t.retry_after_relative = "" else: t.retry_after_relative = format_timedelta(t.retry_after - now, locale=t.env.lang) + @api.depends('retry_after') + def _compute_cannot_apply(self): + for t in self: + t.cannot_apply = t.retry_after > (t.create_date + timedelta(days=1)) + def _on_failure(self): super()._on_failure() - self.retry_after = fields.Datetime.to_string(fields.Datetime.now() + timedelta(minutes=30)) + _, e, _ = sys.exc_info() + self._message_log(body=f"Error while processing forward-port batch: {e}") + self.retry_after = fields.Datetime.now() + timedelta(hours=1) def _process_item(self): batch = self.batch_id