From 8557d1163ff31f19e67afa2c068bd26284e803ac Mon Sep 17 00:00:00 2001 From: Stefan Rijnhart Date: Mon, 13 Jun 2022 15:49:27 +0200 Subject: [PATCH] [RFR] base_changeset: adapt intercept of create to Odoo 14 cache changes --- base_changeset/models/base.py | 18 +----------------- base_changeset/models/record_changeset.py | 19 ++++++++++++++----- .../models/record_changeset_change.py | 8 +++++--- base_changeset/tests/test_changeset_flow.py | 6 +++--- .../tests/test_changeset_security.py | 2 +- 5 files changed, 24 insertions(+), 29 deletions(-) diff --git a/base_changeset/models/base.py b/base_changeset/models/base.py index 7680b986b..9d4b9c6ac 100644 --- a/base_changeset/models/base.py +++ b/base_changeset/models/base.py @@ -81,23 +81,7 @@ class Base(models.AbstractModel): return result for this, vals in zip(result, vals_list): local_vals = self.env["record.changeset"].add_changeset( - # create a record-like object with empty values, - # but pass required many2one fields as those are - # most likely to be used in rule conditions - self.new( - { - field_name: value - for field_name, value in vals.items() - if field_name in self._fields - and self._fields[field_name].required - and isinstance( - self._fields[field_name], - fields.Many2one, - ) - }, - this, - ), - vals, + this, vals, create=True ) local_vals = { key: value for key, value in local_vals.items() if vals[key] != value diff --git a/base_changeset/models/record_changeset.py b/base_changeset/models/record_changeset.py index fd520c7eb..84eb9c56e 100644 --- a/base_changeset/models/record_changeset.py +++ b/base_changeset/models/record_changeset.py @@ -78,7 +78,7 @@ class RecordChangeset(models.Model): self.with_context(skip_pending_status_check=True).mapped("change_ids").cancel() @api.model - def add_changeset(self, record, values): + def add_changeset(self, record, values, create=False): """Add a changeset on a record By default, when a record is modified by a user or by the @@ -102,6 +102,9 @@ class RecordChangeset(models.Model): :param values: the values being written on the record :type values: dict + :param create: in create mode, no check is made to see if the field + value consitutes a change. + :type creatie: boolean :returns: dict of values that should be wrote on the record (fields with a 'Validate' or 'Never' rule are excluded) @@ -133,14 +136,20 @@ class RecordChangeset(models.Model): if not rule or not rule._evaluate_expression(record): continue if field in values: - if not change_model._has_field_changed(record, field, values[field]): + if not create and not change_model._has_field_changed( + record, field, values[field] + ): continue change, pop_value = change_model._prepare_changeset_change( - record, rule, field, values[field] + record, + rule, + field, + values[field], + create=create, ) if pop_value: write_values.pop(field) - if not record.id: + if create: # overwrite with null value for new records write_values[field] = ( # but create some default for required text fields @@ -159,7 +168,7 @@ class RecordChangeset(models.Model): def _prepare_changeset_vals(self, changes, record, source): has_company = "company_id" in self.env[record._name]._fields has_company = has_company and record.company_id - company = record.company_id if has_company else self.env.user.company_id + company = record.company_id if has_company else self.env.company return { # newly created records are passed as newid records with the id in ref "res_id": record.id or record.id.ref, diff --git a/base_changeset/models/record_changeset_change.py b/base_changeset/models/record_changeset_change.py index 4d8cc6682..fe082c8f1 100644 --- a/base_changeset/models/record_changeset_change.py +++ b/base_changeset/models/record_changeset_change.py @@ -338,7 +338,7 @@ class RecordChangesetChange(models.Model): return value @api.model - def _prepare_changeset_change(self, record, rule, field_name, value): + def _prepare_changeset_change(self, record, rule, field_name, value, create=False): """Prepare data for a changeset change It returns a dict of the values to write on the changeset change @@ -364,7 +364,7 @@ class RecordChangesetChange(models.Model): change["state"] = "cancel" pop_value = True # change never applied - if change["state"] in ("cancel", "done"): + if create or change["state"] in ("cancel", "done"): # Normally the 'old' value is set when we use the 'apply' # button, but since we short circuit the 'apply', we # directly set the 'old' value here @@ -372,7 +372,9 @@ class RecordChangesetChange(models.Model): # get values ready to write as expected by the changeset # (for instance, a many2one is written in a reference # field) - origin_value = self._value_for_changeset(record, field_name) + origin_value = self._value_for_changeset( + record, field_name, value=False if create else _NO_VALUE + ) change[old_field_name] = origin_value return change, pop_value diff --git a/base_changeset/tests/test_changeset_flow.py b/base_changeset/tests/test_changeset_flow.py index d84235b70..a5e83f1ac 100644 --- a/base_changeset/tests/test_changeset_flow.py +++ b/base_changeset/tests/test_changeset_flow.py @@ -79,9 +79,7 @@ class TestChangesetFlow(ChangesetTestCommon, TransactionCase): """Create a new partner with a changeset""" new = ( self.env["res.partner"] - .with_context( - test_record_changeset=True, - ) + .with_context(test_record_changeset=True) .create( { "name": "partner", @@ -90,6 +88,8 @@ class TestChangesetFlow(ChangesetTestCommon, TransactionCase): } ) ) + new._compute_changeset_ids() + new._compute_count_pending_changesets() self.assertEqual(new.count_pending_changesets, 1) self.assert_changeset( new, diff --git a/base_changeset/tests/test_changeset_security.py b/base_changeset/tests/test_changeset_security.py index 5bb571ea7..ebc369adb 100644 --- a/base_changeset/tests/test_changeset_security.py +++ b/base_changeset/tests/test_changeset_security.py @@ -34,4 +34,4 @@ class TestChangesetFlow(ChangesetTestCommon, TransactionCase): ] ) self.assertTrue(changeset) - self.assertFalse(changeset.sudo(user).search([("id", "=", changeset.id)])) + self.assertFalse(changeset.with_user(user).search([("id", "=", changeset.id)]))