diff options
| author | Christophe Simonis <chs@odoo.com> | 2017-10-17 12:09:58 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2017-10-17 12:09:58 +0200 |
| commit | fbdda5437a8ecb575ffbcac7961aad44c9cf4ff8 (patch) | |
| tree | 239d86ce417811cb4a0d8cbc3b278c81131f22b5 /addons/base_import | |
| parent | f4332118d3156e2ba2408c1d31ab92ee2066ef73 (diff) | |
| parent | cbca27d0052430743fe2c996964d7aca0ca682c9 (diff) | |
[MERGE] forward port branch 10.0 up to cbca27d0052
Diffstat (limited to 'addons/base_import')
| -rw-r--r-- | addons/base_import/models/base_import.py | 17 | ||||
| -rw-r--r-- | addons/base_import/tests/test_base_import.py | 26 |
2 files changed, 41 insertions, 2 deletions
diff --git a/addons/base_import/models/base_import.py b/addons/base_import/models/base_import.py index d700753a934..0be10bf6da8 100644 --- a/addons/base_import/models/base_import.py +++ b/addons/base_import/models/base_import.py @@ -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 diff --git a/addons/base_import/tests/test_base_import.py b/addons/base_import/tests/test_base_import.py index a0031c192e9..55e5c0538c3 100644 --- a/addons/base_import/tests/test_base_import.py +++ b/addons/base_import/tests/test_base_import.py @@ -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, |
