[IMP] return fields_get-style translated field strings (if available) in user-readable warning and error messages from import, rather than logical field names

bzr revid: xmo@openerp.com-20120924105230-1b7157xbruy2e5zr
This commit is contained in:
Xavier Morel
2012-09-24 12:52:30 +02:00
parent 449a86a51f
commit 877e21ffde
2 changed files with 29 additions and 16 deletions
+16 -3
View File
@@ -1585,8 +1585,15 @@ class BaseModel(object):
:returns: a list of triplets of (id, xid, record)
:rtype: list((int|None, str|None, dict))
"""
if context is None: context = {}
Converter = self.pool['ir.fields.converter']
columns = dict((k, v.column) for k, v in self._all_columns.iteritems())
Translation = self.pool['ir.translation']
field_names = dict(
(f, (Translation._get_source(cr, uid, self._name + ',' + f, 'field',
context.get('lang', False) or 'en_US')
or column.string or f))
for f, column in columns.iteritems())
converters = dict(
(k, Converter.to_field(cr, uid, self, column, context=context))
for k, column in columns.iteritems())
@@ -1619,18 +1626,24 @@ class BaseModel(object):
for field, strvalue in record.iteritems():
if field in (None, 'id', '.id'): continue
message_base = dict(extras, record=stream.index, field=field)
# In warnings and error messages, use translated string as
# field name
message_base = dict(
extras, record=stream.index, field=field_names[field])
with warnings.catch_warnings(record=True) as w:
try:
converted[field] = converters[field](strvalue)
# In warning and error returned, use logical field name
# as field so client can reverse
for warning in w:
log(dict(message_base, type='warning',
log(dict(message_base, type='warning', field=field,
message=unicode(warning.message) % message_base))
except ValueError, e:
log(dict(message_base,
type='error',
message=unicode(e) % message_base
field=field,
message=unicode(e) % message_base,
))
yield dbid, xid, converted, dict(extras, record=stream.index)
@@ -186,7 +186,7 @@ class test_boolean_field(ImporterCase):
ids, messages = self.import_(['value'], trues)
self.assertEqual(len(ids), 10)
self.assertEqual(messages, [
message(u"Unknown value '%s' for boolean field 'value', assuming 'yes'" % v[0],
message(u"Unknown value '%s' for boolean field 'unknown', assuming 'yes'" % v[0],
type='warning', from_=i, to_=i, record=i)
for i, v in enumerate(trues)
if v[0] != 'true' if v[0] != 'yes' if v[0] != '1'
@@ -460,7 +460,7 @@ class test_selection(ImporterCase):
'rows': {'from': 0, 'to': 0},
'record': 0,
'field': 'value',
'message': "Value 'Baz' not found in selection field 'value'",
'message': "Value 'Baz' not found in selection field 'unknown'",
}])
ids, messages = self.import_(['value'], [[42]])
@@ -470,7 +470,7 @@ class test_selection(ImporterCase):
'rows': {'from': 0, 'to': 0},
'record': 0,
'field': 'value',
'message': "Value '42' not found in selection field 'value'",
'message': "Value '42' not found in selection field 'unknown'",
}])
class test_selection_function(ImporterCase):
@@ -583,7 +583,7 @@ class test_m2o(ImporterCase):
ids, messages = self.import_(['value'], [[name2]])
self.assertEqual(
messages,
[message(u"Found multiple matches for field 'value' (2 matches)",
[message(u"Found multiple matches for field 'unknown' (2 matches)",
type='warning')])
self.assertEqual(len(ids), 1)
self.assertEqual([
@@ -607,7 +607,7 @@ class test_m2o(ImporterCase):
[integer_id1],
])
self.assertEqual(messages, [
message(u"No matching record found for name '%s' in field 'value'" % id,
message(u"No matching record found for name '%s' in field 'unknown'" % id,
from_=index, to_=index, record=index)
for index, id in enumerate([integer_id1, integer_id2, integer_id1])])
self.assertIs(ids, False)
@@ -626,19 +626,19 @@ class test_m2o(ImporterCase):
ids, messages = self.import_(['value'], [['nameisnoexist:3']])
self.assertEqual(messages, [message(
u"No matching record found for name 'nameisnoexist:3' "
u"in field 'value'")])
u"in field 'unknown'")])
self.assertIs(ids, False)
ids, messages = self.import_(['value/id'], [['noxidhere']])
self.assertEqual(messages, [message(
u"No matching record found for external id 'noxidhere' "
u"in field 'value'")])
u"in field 'unknown'")])
self.assertIs(ids, False)
ids, messages = self.import_(['value/.id'], [['66']])
self.assertEqual(messages, [message(
u"No matching record found for database id '66' "
u"in field 'value'")])
u"in field 'unknown'")])
self.assertIs(ids, False)
def test_fail_multiple(self):
@@ -646,7 +646,7 @@ class test_m2o(ImporterCase):
['value', 'value/id'],
[['somename', 'somexid']])
self.assertEqual(messages, [message(
u"Ambiguous specification for field 'value', only provide one of "
u"Ambiguous specification for field 'unknown', only provide one of "
u"name, external id or database id")])
self.assertIs(ids, False)
@@ -690,7 +690,7 @@ class test_m2m(ImporterCase):
ids, messages = self.import_(['value/.id'], [['42']])
self.assertEqual(messages, [message(
u"No matching record found for database id '42' in field "
u"'value'")])
u"'unknown'")])
self.assertIs(ids, False)
def test_xids(self):
@@ -716,7 +716,7 @@ class test_m2m(ImporterCase):
ids, messages = self.import_(['value/id'], [['noxidforthat']])
self.assertEqual(messages, [message(
u"No matching record found for external id 'noxidforthat' "
u"in field 'value'")])
u"in field 'unknown'")])
self.assertIs(ids, False)
def test_names(self):
@@ -745,7 +745,7 @@ class test_m2m(ImporterCase):
ids, messages = self.import_(['value'], [['wherethem2mhavenonames']])
self.assertEqual(messages, [message(
u"No matching record found for name 'wherethem2mhavenonames' in "
u"field 'value'")])
u"field 'unknown'")])
self.assertIs(ids, False)
def test_import_to_existing(self):
@@ -778,7 +778,7 @@ class test_o2m(ImporterCase):
['const', 'value'],
[['5', s]])
self.assertEqual(messages, [message(
u"No matching record found for name '%s' in field 'value'" % s)])
u"No matching record found for name '%s' in field 'unknown'" % s)])
self.assertIs(ids, False)
def test_single(self):