[IMP] base_changeset: optionally prevent self validation

pull/2380/head
shams-emesa 2022-01-27 17:28:32 +01:00 committed by Miquel Raïch
parent e507256b63
commit b3d4640dae
4 changed files with 33 additions and 0 deletions

View File

@ -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."""

View File

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

View File

@ -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")]

View File

@ -39,6 +39,7 @@
/>
<field name="action" />
<field name="source_model_id" widget="selection" />
<field name="prevent_self_validation" />
</group>
</group>
</sheet>