[IMP] make resolve_o2m_commands_to_record_dicts's result eager as per vmt's suggestion

bzr revid: xmo@openerp.com-20111011085715-cvcficcy4di9q29i
This commit is contained in:
Xavier Morel 2011-10-11 10:57:15 +02:00
parent 2646a34cf0
commit 8507ceddcf
2 changed files with 27 additions and 22 deletions

View File

@ -4809,12 +4809,14 @@ class BaseModel(object):
for record in self.pool.get(o2m_model).read(
cr, uid, ids_to_read, fields=fields, context=context))
record_dicts = []
# merge record from db with record provided by command
for command, id, record in commands:
item = {}
if command in (1, 4): item.update(records_by_id[id])
if command in (0, 1): item.update(record)
yield item
record_dicts.append(item)
return record_dicts
# keep this import here, at top it will cause dependency cycle errors
import expression

View File

@ -27,15 +27,16 @@ class TestO2MSerialization(unittest2.TestCase):
def test_no_command(self):
" empty list of commands yields an empty list of records "
results = list(self.partner.resolve_o2m_commands_to_record_dicts(self.cr, UID, 'address', []))
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [])
self.assertEqual(results, [])
def test_CREATE_commands(self):
" returns the VALUES dict as-is "
results = list(self.partner.resolve_o2m_commands_to_record_dicts(
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address',
map(CREATE, [{'foo': 'bar'}, {'foo': 'baz'}, {'foo': 'baq'}])))
map(CREATE, [{'foo': 'bar'}, {'foo': 'baz'}, {'foo': 'baq'}]))
self.assertEqual(results, [
{'foo': 'bar'},
{'foo': 'baz'},
@ -51,7 +52,8 @@ class TestO2MSerialization(unittest2.TestCase):
]
commands = map(LINK_TO, ids)
results = list(self.partner.resolve_o2m_commands_to_record_dicts(self.cr, UID, 'address', commands, ['name']))
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', commands, ['name'])
self.assertEqual(results, [
{'id': ids[0], 'name': 'foo'},
@ -67,7 +69,8 @@ class TestO2MSerialization(unittest2.TestCase):
self.address.create(self.cr, UID, {'name': 'baz'})
]
results = list(self.partner.resolve_o2m_commands_to_record_dicts(self.cr, UID, 'address', ids, ['name']))
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', ids, ['name'])
self.assertEqual(results, [
{'id': ids[0], 'name': 'foo'},
@ -81,12 +84,12 @@ class TestO2MSerialization(unittest2.TestCase):
id_bar = self.address.create(self.cr, UID, {'name': 'bar'})
id_baz = self.address.create(self.cr, UID, {'name': 'baz', 'city': 'tag'})
results = list(self.partner.resolve_o2m_commands_to_record_dicts(
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [
LINK_TO(id_foo),
UPDATE(id_bar, {'name': 'qux', 'city': 'tagtag'}),
UPDATE(id_baz, {'name': 'quux'})
], ['name', 'city']))
], ['name', 'city'])
self.assertEqual(results, [
{'id': id_foo, 'name': 'foo', 'city': False},
@ -100,7 +103,7 @@ class TestO2MSerialization(unittest2.TestCase):
for name in ['NObar', 'baz', 'qux', 'NOquux', 'NOcorge', 'garply']
]
results = list(self.partner.resolve_o2m_commands_to_record_dicts(
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [
CREATE({'name': 'foo'}),
UPDATE(ids[0], {'name': 'bar'}),
@ -110,7 +113,7 @@ class TestO2MSerialization(unittest2.TestCase):
UPDATE(ids[4], {'name': 'corge'}),
CREATE({'name': 'grault'}),
LINK_TO(ids[5])
], ['name']))
], ['name'])
self.assertEqual(results, [
{'name': 'foo'},
@ -132,8 +135,8 @@ class TestO2MSerialization(unittest2.TestCase):
]
commands = map(lambda id: (4, id), ids)
results = list(self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', commands, ['name']))
results = self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', commands, ['name'])
self.assertEqual(results, [
{'id': ids[0], 'name': 'foo'},
@ -145,8 +148,8 @@ class TestO2MSerialization(unittest2.TestCase):
"DELETE_ALL can appear as a singleton"
try:
list(self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [(5,)], ['name']))
self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [(5,)], ['name'])
except AssertionError:
# 5 should fail with an assert error, but not e.g. a ValueError
pass
@ -155,18 +158,18 @@ class TestO2MSerialization(unittest2.TestCase):
"Commands with uncertain semantics in this context should be forbidden"
with self.assertRaises(AssertionError):
list(self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [DELETE(42)], ['name']))
self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [DELETE(42)], ['name'])
with self.assertRaises(AssertionError):
list(self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [FORGET(42)], ['name']))
self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [FORGET(42)], ['name'])
with self.assertRaises(AssertionError):
list(self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [DELETE_ALL()], ['name']))
self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [DELETE_ALL()], ['name'])
with self.assertRaises(AssertionError):
list(self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [REPLACE_WITH([42])], ['name']))
self.partner.resolve_o2m_commands_to_record_dicts(
self.cr, UID, 'address', [REPLACE_WITH([42])], ['name'])