[FIX] base_import: parse date and float for relational fields
Use case to reproduce: -> Import a file with a float using a coma related to the model (for example the product.supplierinfo/price) It happens because the method that parse the date and float field only compare them to the main imported model. This commit complete the method by using a recursion on relational model in order to also parse the relational subfields.
This commit is contained in:
@@ -605,9 +605,18 @@ class Import(models.TransientModel):
|
||||
|
||||
@api.multi
|
||||
def _parse_import_data(self, data, import_fields, options):
|
||||
""" Lauch first call to _parse_import_data_recursive with an
|
||||
empty prefix. _parse_import_data_recursive will be run
|
||||
recursively for each relational field.
|
||||
"""
|
||||
return self._parse_import_data_recursive(self.res_model, '', data, import_fields, options)
|
||||
|
||||
@api.multi
|
||||
def _parse_import_data_recursive(self, model, prefix, data, import_fields, options):
|
||||
# Get fields of type date/datetime
|
||||
all_fields = self.env[self.res_model].fields_get()
|
||||
all_fields = self.env[model].fields_get()
|
||||
for name, field in all_fields.iteritems():
|
||||
name = prefix + name
|
||||
if field['type'] in ('date', 'datetime') and name in import_fields:
|
||||
# Parse date
|
||||
index = import_fields.index(name)
|
||||
@@ -624,7 +633,11 @@ class Import(models.TransientModel):
|
||||
raise ValueError(_("Column %s contains incorrect values. Error in line %d: %s") % (name, num + 1, ustr(e.message)))
|
||||
except Exception, e:
|
||||
raise ValueError(_("Error Parsing Date [%s:L%d]: %s") % (name, num + 1, ustr(e.message)))
|
||||
|
||||
# Check if the field is in import_field and is a relational (followed by /)
|
||||
# Also verify that the field name exactly match the import_field at the correct level.
|
||||
elif any(name + '/' in import_field and name == import_field.split('/')[prefix.count('/')] for import_field in import_fields):
|
||||
# Recursive call with the relational as new model and add the field name to the prefix
|
||||
self._parse_import_data_recursive(field['relation'], name + '/', data, import_fields, options)
|
||||
elif field['type'] in ('float', 'monetary') and name in import_fields:
|
||||
# Parse float, sometimes float values from file have currency symbol or () to denote a negative value
|
||||
# We should be able to manage both case
|
||||
|
||||
@@ -402,7 +402,33 @@ class test_convert_import_data(TransactionCase):
|
||||
# if results empty, no errors
|
||||
self.assertItemsEqual(results, [])
|
||||
|
||||
def test_parse_relational_fields(self):
|
||||
""" Ensure that relational fields float and date are correctly
|
||||
parsed during the import call.
|
||||
"""
|
||||
import_wizard = self.env['base_import.import'].create({
|
||||
'res_model': 'res.partner',
|
||||
'file': 'name,parent_id/id,parent_id/date,parent_id/credit_limit\n'
|
||||
'"foo","__export__.res_partner_1","2017年10月12日","5,69"\n',
|
||||
'file_type': 'text/csv'
|
||||
|
||||
})
|
||||
options = {
|
||||
'date_format': '%Y年%m月%d日',
|
||||
'quoting': '"',
|
||||
'separator': ',',
|
||||
'float_decimal_separator': ',',
|
||||
'float_thousand_separator': '.',
|
||||
'headers': True
|
||||
}
|
||||
data, import_fields = import_wizard._convert_import_data(
|
||||
['name', 'parent_id/.id', 'parent_id/date', 'parent_id/credit_limit'],
|
||||
options
|
||||
)
|
||||
result = import_wizard._parse_import_data(data, import_fields, options)
|
||||
# Check if the data 5,69 as been correctly parsed.
|
||||
self.assertEqual(float(result[0][-1]), 5.69)
|
||||
self.assertEqual(str(result[0][-2]), '2017-10-12')
|
||||
|
||||
def test_filtered(self):
|
||||
""" If ``False`` is provided as field mapping for a column,
|
||||
|
||||
Reference in New Issue
Block a user