[IMP] base_changeset: optionally prevent self validation
parent
e507256b63
commit
b3d4640dae
|
@ -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."""
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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")]
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
/>
|
||||
<field name="action" />
|
||||
<field name="source_model_id" widget="selection" />
|
||||
<field name="prevent_self_validation" />
|
||||
</group>
|
||||
</group>
|
||||
</sheet>
|
||||
|
|
Loading…
Reference in New Issue