[IMP] models: new records return default values

This commit is contained in:
Raphael Collet
2019-05-20 11:00:40 +00:00
parent 7f1a1fee49
commit 6ad43a44a2
2 changed files with 40 additions and 19 deletions
@@ -928,25 +928,38 @@ class TestFields(common.TransactionCase):
with self.assertRaises(AccessError):
cat1.name
def test_40_new(self):
""" test new records. """
def test_40_new_defaults(self):
""" Test new records with defaults. """
user = self.env.user
discussion = self.env.ref('test_new_api.discussion_0')
# create a new message
message = self.env['test_new_api.message'].new()
self.assertFalse(message.id)
# create a new message; fields have their default value if not given
new_msg = self.env['test_new_api.message'].new({'body': "XXX"})
self.assertFalse(new_msg.id)
self.assertEqual(new_msg.body, "XXX")
self.assertEqual(new_msg.author, user)
# assign some fields; should have no side effect
message.discussion = discussion
message.body = BODY = "May the Force be with you."
self.assertEqual(message.discussion, discussion)
self.assertEqual(message.body, BODY)
self.assertFalse(message.author)
self.assertNotIn(message, discussion.messages)
new_msg.discussion = discussion
new_msg.body = "YYY"
self.assertEqual(new_msg.discussion, discussion)
self.assertEqual(new_msg.body, "YYY")
self.assertNotIn(new_msg, discussion.messages)
# check computed values of fields
self.assertEqual(message.name, "[%s] %s" % (discussion.name, ''))
self.assertEqual(message.size, len(BODY))
self.assertEqual(new_msg.name, "[%s] %s" % (discussion.name, user.name))
self.assertEqual(new_msg.size, 3)
# extra tests for x2many fields with default
cat1 = self.env['test_new_api.category'].create({'name': "Cat1"})
cat2 = self.env['test_new_api.category'].create({'name': "Cat2"})
discussion = discussion.with_context(default_categories=[(4, cat1.id)])
# no value gives the default value
new_disc = discussion.new({'name': "Foo"})
self.assertEqual(new_disc.categories, cat1)
# value is combined with default value
new_disc = discussion.new({'name': "Foo", 'categories': [(4, cat2.id)]})
self.assertEqual(new_disc.categories, cat1 + cat2)
@mute_logger('odoo.addons.base.models.ir_model')
def test_41_new_related(self):
+14 -6
View File
@@ -1116,12 +1116,20 @@ class Field(MetaField('DummyField', (object,), {})):
def determine_draft_value(self, record):
""" Determine the value of ``self`` for the given draft ``record``. """
if self.compute:
fields = record._field_computed[self]
with record.env.protecting(fields, record):
self._compute_value(record)
else:
null = self.convert_to_cache(False, record, validate=False)
record.env.cache.set_special(record, self, lambda: null)
return self.compute_value(record)
null = self.convert_to_cache(False, record, validate=False)
record.env.cache.set_special(record, self, lambda: null)
defaults = record.default_get([self.name])
if self.name in defaults:
# The null value above is necessary to convert x2many field values.
# For instance, converting [(4, id)] accesses the field's current
# value, then adds the given id. Without an initial value, the
# conversion ends up here to determine the field's value, and this
# generates an infinite recursion.
value = self.convert_to_cache(defaults[self.name], record)
return record.env.cache.set(record, self, value)
def determine_inverse(self, records):
""" Given the value of ``self`` on ``records``, inverse the computation. """