diff --git a/base_changeset/models/changeset_field_rule.py b/base_changeset/models/changeset_field_rule.py index ad8784cea..64e700051 100644 --- a/base_changeset/models/changeset_field_rule.py +++ b/base_changeset/models/changeset_field_rule.py @@ -38,6 +38,7 @@ class ChangesetFieldRule(models.Model): ) company_id = fields.Many2one("res.company", default=lambda self: self.env.company) active = fields.Boolean(default=True) + prevent_self_validation = fields.Boolean(default=False) def init(self): """Ensure there is at most one rule with source_model_id NULL.""" diff --git a/base_changeset/models/record_changeset_change.py b/base_changeset/models/record_changeset_change.py index c1bc47a0b..7a930d4ba 100644 --- a/base_changeset/models/record_changeset_change.py +++ b/base_changeset/models/record_changeset_change.py @@ -394,6 +394,8 @@ class RecordChangesetChange(models.Model): has_group = self.user_has_groups("base_changeset.group_changeset_user") for rec in self: can_validate = rec._is_change_pending() and (is_superuser or has_group) + if rec.rule_id.prevent_self_validation: + can_validate = can_validate and rec.modified_by_id != self.env.user rec.user_can_validate_changeset = can_validate @api.model diff --git a/base_changeset/tests/test_changeset_flow.py b/base_changeset/tests/test_changeset_flow.py index f8f34d503..22472389a 100644 --- a/base_changeset/tests/test_changeset_flow.py +++ b/base_changeset/tests/test_changeset_flow.py @@ -118,6 +118,35 @@ class TestChangesetFlow(ChangesetTestCommon, TransactionCase): # All computed fields are assigned changeset.change_ids.read() + def test_apply_change_with_prevent_self_validation(self): + """ Don't apply a changeset change and prevent self validation """ + self.partner.write({"street": "street Z"}) + self.partner._compute_changeset_ids() + self.partner._compute_count_pending_changesets() + self.assertEqual(self.partner.count_pending_changesets, 1) + self.assertEqual(self.partner.count_pending_changeset_changes, 1) + self.partner.changeset_ids.change_ids.rule_id.prevent_self_validation = True + with self.assertRaises( + UserError, msg="You don't have the rights to reject the changes." + ): + self.partner.changeset_ids.change_ids.apply() + self.partner._compute_changeset_ids() + self.partner._compute_count_pending_changesets() + self.assertEqual(self.partner.count_pending_changesets, 1) + self.assertEqual(self.partner.count_pending_changeset_changes, 1) + self.assertEqual(self.partner.street, "street X") + self.assertEqual(self.partner.changeset_ids.change_ids.state, "draft") + + user = self.env.ref("base.user_demo") + user.groups_id += self.env.ref("base_changeset.group_changeset_user") + self.partner.changeset_ids.change_ids.with_user(user).apply() + self.partner._compute_changeset_ids() + self.partner._compute_count_pending_changesets() + self.assertEqual(self.partner.count_pending_changesets, 0) + self.assertEqual(self.partner.count_pending_changeset_changes, 0) + self.assertEqual(self.partner.street, "street Z") + self.assertEqual(self.partner.changeset_ids.change_ids.state, "done") + def test_apply_done_change(self): """ Done changes do not apply (already applied) """ changes = [(self.field_name, "Y", "done")] diff --git a/base_changeset/views/changeset_field_rule_views.xml b/base_changeset/views/changeset_field_rule_views.xml index 0b282d22e..ea47362d2 100644 --- a/base_changeset/views/changeset_field_rule_views.xml +++ b/base_changeset/views/changeset_field_rule_views.xml @@ -39,6 +39,7 @@ /> +