[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)] return [(6, 0, ids)]
def _str_to_one2many(self, cr, uid, model, column, value, context=None): def _str_to_one2many(self, cr, uid, model, column, value, context=None):
commands = [] commands = []
for subfield, record in zip((self._referencing_subfield(
only_ref_fields(record)) for record in value:
for record in value), id = None
value): refs = only_ref_fields(record)
id, subfield_type = self.db_id_for( # there are ref fields in the record
cr, uid, model, column, subfield, record[subfield], context=context) 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) writable = exclude_ref_fields(record)
if id: if id:
commands.append(LINK_TO(id)) commands.append(LINK_TO(id))
commands.append(UPDATE(id, writable)) commands.append(UPDATE(id, writable))
else: else:
commands.append(CREATE(writable)) commands.append(CREATE(writable))
return commands return commands

View File

@ -67,6 +67,12 @@ class One2ManyChild(orm.Model):
def name_get(self, cr, uid, ids, context=None): def name_get(self, cr, uid, ids, context=None):
return [(record.id, "%s:%s" % (self._name, record.value)) return [(record.id, "%s:%s" % (self._name, record.value))
for record in self.browse(cr, uid, ids, context=context)] 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): class One2ManyMultiple(orm.Model):
_name = 'export.one2many.multiple' _name = 'export.one2many.multiple'

View File

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