[FIX] non-linking o2m tests, corresponding code

bzr revid: xmo@openerp.com-20120920105612-03ifizt2iv08tdhz
This commit is contained in:
Xavier Morel 2012-09-20 12:56:12 +02:00
parent c9e0cfd64a
commit 8e841cd8f7
3 changed files with 45 additions and 36 deletions

View File

@ -206,16 +206,26 @@ class ir_fields_converter(orm.Model):
return [(6, 0, ids)]
def _str_to_one2many(self, cr, uid, model, column, value, context=None):
commands = []
for subfield, record in zip((self._referencing_subfield(
only_ref_fields(record))
for record in value),
value):
id, subfield_type = self.db_id_for(
cr, uid, model, column, subfield, record[subfield], context=context)
for record in value:
id = None
refs = only_ref_fields(record)
# there are ref fields in the record
if refs:
subfield = self._referencing_subfield(refs)
reference = record[subfield]
id, subfield_type = self.db_id_for(
cr, uid, model, column, subfield, reference, context=context)
if id is None:
raise ValueError(
_(u"No matching record found for %(field_type)s '%(value)s' in field '%%(field)s'")
% {'field_type': subfield_type, 'value': reference})
writable = exclude_ref_fields(record)
if id:
commands.append(LINK_TO(id))
commands.append(UPDATE(id, writable))
else:
commands.append(CREATE(writable))
return commands

View File

@ -67,6 +67,12 @@ class One2ManyChild(orm.Model):
def name_get(self, cr, uid, ids, context=None):
return [(record.id, "%s:%s" % (self._name, record.value))
for record in self.browse(cr, uid, ids, context=context)]
def name_search(self, cr, user, name='', args=None, operator='ilike', context=None, limit=100):
return (self.name_get(cr, user,
self.search(cr, user, [['value', operator, int(name.split(':')[1])]])
, context=context)
if isinstance(name, basestring) and name.split(':')[0] == self._name
else [])
class One2ManyMultiple(orm.Model):
_name = 'export.one2many.multiple'

View File

@ -786,20 +786,21 @@ class test_o2m(ImporterCase):
model_name = 'export.one2many'
def test_name_get(self):
# FIXME: bloody hell why can't this just name_create the record?
self.assertRaises(
IndexError,
self.import_,
s = u'Java is a DSL for taking large XML files and converting them ' \
u'to stack traces'
ids, messages = self.import_(
['const', 'value'],
[['5', u'Java is a DSL for taking large XML files'
u' and converting them to stack traces']])
[['5', s]])
self.assertEqual(messages, [message(
u"No matching record found for name '%s' in field 'value'" % s)])
self.assertIs(ids, False)
def test_single(self):
ids, messages = self.import_(['const', 'value/value'], [
['5', '63']
])
self.assertEqual(len(ids), 1)
self.assertFalse(messages)
self.assertEqual(len(ids), 1)
(b,) = self.browse()
self.assertEqual(b.const, 5)
@ -810,8 +811,8 @@ class test_o2m(ImporterCase):
['5', '63'],
['6', '64'],
])
self.assertEqual(len(ids), 2)
self.assertFalse(messages)
self.assertEqual(len(ids), 2)
b1, b2 = self.browse()
self.assertEqual(b1.const, 5)
@ -826,8 +827,8 @@ class test_o2m(ImporterCase):
['', '65'],
['', '66'],
])
self.assertEqual(len(ids), 4)
self.assertFalse(messages)
self.assertEqual(len(ids), 1)
(b,) = self.browse()
self.assertEqual(values(b.value), [63, 64, 65, 66])
@ -839,8 +840,8 @@ class test_o2m(ImporterCase):
['the', '', '65'],
['rhythm', '', '66'],
])
self.assertEqual(len(ids), 4)
self.assertFalse(messages)
self.assertEqual(len(ids), 1)
(b,) = self.browse()
self.assertEqual(values(b.value), [63, 64, 65, 66])
@ -923,18 +924,12 @@ class test_o2m_multiple(ImporterCase):
['', '13', '23'],
['', '14', ''],
])
self.assertEqual(len(ids), 4)
self.assertFalse(messages)
self.assertEqual(len(ids), 1)
# Oh yeah, that's the stuff
(b, b1, b2) = self.browse()
self.assertEqual(values(b.child1), [11])
self.assertEqual(values(b.child2), [21])
self.assertEqual(values(b1.child1), [12])
self.assertEqual(values(b1.child2), [22])
self.assertEqual(values(b2.child1), [13, 14])
self.assertEqual(values(b2.child2), [23])
[b] = self.browse()
self.assertEqual(values(b.child1), [11, 12, 13, 14])
self.assertEqual(values(b.child2), [21, 22, 23])
def test_multi(self):
ids, messages = self.import_(['const', 'child1/value', 'child2/value'], [
@ -945,13 +940,12 @@ class test_o2m_multiple(ImporterCase):
['', '', '22'],
['', '', '23'],
])
self.assertEqual(len(ids), 6)
self.assertFalse(messages)
# What the actual fuck?
(b, b1) = self.browse()
self.assertEqual(len(ids), 1)
[b] = self.browse()
self.assertEqual(values(b.child1), [11, 12, 13, 14])
self.assertEqual(values(b.child2), [21])
self.assertEqual(values(b1.child2), [22, 23])
self.assertEqual(values(b.child2), [21, 22, 23])
def test_multi_fullsplit(self):
ids, messages = self.import_(['const', 'child1/value', 'child2/value'], [
@ -963,14 +957,13 @@ class test_o2m_multiple(ImporterCase):
['', '', '22'],
['', '', '23'],
])
self.assertEqual(len(ids), 7)
self.assertFalse(messages)
# oh wow
(b, b1) = self.browse()
self.assertEqual(len(ids), 1)
[b] = self.browse()
self.assertEqual(b.const, 5)
self.assertEqual(values(b.child1), [11, 12, 13, 14])
self.assertEqual(b1.const, 36)
self.assertEqual(values(b1.child2), [21, 22, 23])
self.assertEqual(values(b.child2), [21, 22, 23])
# function, related, reference: written to db as-is...
# => function uses @type for value coercion/conversion