diff --git a/runbot_merge/__manifest__.py b/runbot_merge/__manifest__.py index 770bd488..fff46f02 100644 --- a/runbot_merge/__manifest__.py +++ b/runbot_merge/__manifest__.py @@ -14,6 +14,7 @@ 'views/configuration.xml', 'views/templates.xml', 'models/project_freeze/views.xml', + 'models/staging_cancel/views.xml', ], 'assets': { 'web.assets_frontend': [ diff --git a/runbot_merge/models/__init__.py b/runbot_merge/models/__init__.py index b457f468..235ca1c5 100644 --- a/runbot_merge/models/__init__.py +++ b/runbot_merge/models/__init__.py @@ -2,3 +2,4 @@ from . import res_partner from . import project from . import pull_requests from . import project_freeze +from . import staging_cancel diff --git a/runbot_merge/models/pull_requests.py b/runbot_merge/models/pull_requests.py index cd811641..8d5dcd89 100644 --- a/runbot_merge/models/pull_requests.py +++ b/runbot_merge/models/pull_requests.py @@ -1831,8 +1831,17 @@ class Stagings(models.Model): s.write(vals) def action_cancel(self): - self.cancel("explicitly cancelled by %s", self.env.user.display_name) - return { 'type': 'ir.actions.act_window_close' } + w = self.env['runbot_merge.stagings.cancel'].create({ + 'staging_id': self.id, + }) + return { + 'type': 'ir.actions.act_window', + 'target': 'new', + 'name': f'Cancel staging {self.id} ({self.target.name})', + 'view_mode': 'form', + 'res_model': w._name, + 'res_id': w.id, + } def cancel(self, reason, *args): self = self.filtered('active') diff --git a/runbot_merge/models/staging_cancel/__init__.py b/runbot_merge/models/staging_cancel/__init__.py new file mode 100644 index 00000000..66c60ebb --- /dev/null +++ b/runbot_merge/models/staging_cancel/__init__.py @@ -0,0 +1,27 @@ +import logging + +from odoo import models, fields + +_logger = logging.getLogger(__name__) +class CancelWizard(models.TransientModel): + _name = 'runbot_merge.stagings.cancel' + _description = "Wizard for cancelling a staging" + + staging_id = fields.Many2one('runbot_merge.stagings', required=True) + reason = fields.Char() + cancel_splits = fields.Boolean(help="\ + If any split is pending, also cancel them and move the corresponding \ + pull requests back into the general pool.") + + def action_cancel(self): + if self.cancel_splits: + self.env['runbot_merge.split'].search([ + ('target', '=', self.staging_id.target.id) + ]).unlink() + + reason = self.reason.replace('%', '%%').strip() if self.reason else '' + if reason: + reason = f' because {reason}' + self.staging_id.cancel(f'Cancelled by {self.env.user.display_name}{reason}') + self.unlink() + return { 'type': 'ir.actions.act_window_close' } diff --git a/runbot_merge/models/staging_cancel/views.xml b/runbot_merge/models/staging_cancel/views.xml new file mode 100644 index 00000000..a7300d23 --- /dev/null +++ b/runbot_merge/models/staging_cancel/views.xml @@ -0,0 +1,17 @@ + + + Staging Cancel Form + runbot_merge.stagings.cancel + +
+ + + + + +
+
+
+
diff --git a/runbot_merge/security/ir.model.access.csv b/runbot_merge/security/ir.model.access.csv index 0de5d476..65f02444 100644 --- a/runbot_merge/security/ir.model.access.csv +++ b/runbot_merge/security/ir.model.access.csv @@ -10,6 +10,7 @@ access_runbot_merge_pull_requests_admin,Admin access to PR,model_runbot_merge_pu access_runbot_merge_pull_requests_tagging_admin,Admin access to tagging,model_runbot_merge_pull_requests_tagging,runbot_merge.group_admin,1,1,1,1 access_runbot_merge_commit_admin,Admin access to commits,model_runbot_merge_commit,runbot_merge.group_admin,1,1,1,1 access_runbot_merge_stagings_admin,Admin access to stagings,model_runbot_merge_stagings,runbot_merge.group_admin,1,1,1,1 +access_runbot_merge_stagings_cancel_admin,Admin access to cancelling stagings,model_runbot_merge_stagings_cancel,runbot_merge.group_admin,1,1,1,1 access_runbot_merge_split_admin,Admin access to splits,model_runbot_merge_split,runbot_merge.group_admin,1,1,1,1 access_runbot_merge_batch_admin,Admin access to batches,model_runbot_merge_batch,runbot_merge.group_admin,1,1,1,1 access_runbot_merge_fetch_job_admin,Admin access to fetch jobs,model_runbot_merge_fetch_job,runbot_merge.group_admin,1,1,1,1