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 @@
/>
+