diff --git a/addons/base_import/models.py b/addons/base_import/models.py index 0f1d8c5705e..51fac2af91c 100644 --- a/addons/base_import/models.py +++ b/addons/base_import/models.py @@ -124,10 +124,10 @@ class ir_import(orm.TransientModel): """ csv_iterator = csv.reader( StringIO(record.file), - quotechar=options['quote'], + quotechar=options['quoting'], delimiter=options['separator']) csv_nonempty = itertools.ifilter(None, csv_iterator) - # TODO: guess encoding? + # TODO: guess encoding with chardet? Or https://github.com/aadsm/jschardet encoding = options.get('encoding', 'utf-8') return itertools.imap( lambda row: [item.decode(encoding) for item in row], @@ -206,7 +206,7 @@ class ir_import(orm.TransientModel): :param id: identifier of the import :param int count: number of preview lines to generate :param options: format-specific options. - CSV: {encoding, quote, separator, headers} + CSV: {encoding, quoting, separator, headers} :type options: {str, str, str, bool} :returns: {fields, matches, headers, preview} | {error, preview} :rtype: {dict(str: dict(...)), dict(int, list(str)), list(str), list(list(str))} | {str, str} diff --git a/addons/base_import/static/src/css/import.css b/addons/base_import/static/src/css/import.css index 63b53a9e5c1..207f2aed9c6 100644 --- a/addons/base_import/static/src/css/import.css +++ b/addons/base_import/static/src/css/import.css @@ -33,3 +33,13 @@ .oe_import a.oe_import_toggle:before { content: '> ' } + +.oe_import .oe_import_options p { + margin: 0; + padding: 0; +} +.oe_import .oe_import_options label { + display: inline-block; + width: 10em; + text-align: right; +} diff --git a/addons/base_import/static/src/js/import.js b/addons/base_import/static/src/js/import.js index 99397304d16..2853f36019a 100644 --- a/addons/base_import/static/src/js/import.js +++ b/addons/base_import/static/src/js/import.js @@ -38,10 +38,11 @@ openerp.base_import = function (instance) { instance.web.DataImport = instance.web.Dialog.extend({ template: 'ImportView', dialog_title: _lt("Import Data"), - defaults: { - quoting: '"', - separator: ',', - }, + opts: [ + {name: 'encoding', label: _lt("Encoding:"), value: 'utf-8'}, + {name: 'separator', label: _lt("Separator:"), value: ','}, + {name: 'quoting', label: _lt("Quoting:"), value: '"'} + ], events: { 'change input.oe_import_file': 'file_update', 'change input:not(.oe_import_file)': 'settings_updated', @@ -85,11 +86,15 @@ openerp.base_import = function (instance) { }, import_options: function () { - return { - quote: this.$('input.oe_import_quoting').val(), - separator: this.$('input.oe_import_separator').val(), - headers: this.$('input.oe_import_has_header').prop('checked'), + var self = this; + var options = { + headers: this.$('input.oe_import_has_header').prop('checked') }; + _(this.opts).each(function (opt) { + options[opt.name] = + self.$('input.oe_import_' + opt.name).val(); + }); + return options; }, //- File & settings change section diff --git a/addons/base_import/static/src/xml/import.xml b/addons/base_import/static/src/xml/import.xml index a85f8e960c1..a2844f8d7b9 100644 --- a/addons/base_import/static/src/xml/import.xml +++ b/addons/base_import/static/src/xml/import.xml @@ -29,15 +29,15 @@ File Format Options… -
- - - -
- - +
+

+ + + +

Frequently Asked Questions

diff --git a/addons/base_import/tests/test_cases.py b/addons/base_import/tests/test_cases.py index 420140cd2ac..5479ae94428 100644 --- a/addons/base_import/tests/test_cases.py +++ b/addons/base_import/tests/test_cases.py @@ -179,7 +179,7 @@ class test_preview(TransactionCase): def test_encoding(self): Import, id = self.make_import() result = Import.parse_preview(self.cr, self.uid, id, { - 'quote': '"', + 'quoting': '"', 'separator': ',', }) self.assertTrue('error' in result) @@ -188,7 +188,7 @@ class test_preview(TransactionCase): Import, id = self.make_import() result = Import.parse_preview(self.cr, self.uid, id, { - 'quote': 'foo', + 'quoting': 'foo', 'separator': ',', 'encoding': 'euc_kr', }) @@ -198,7 +198,7 @@ class test_preview(TransactionCase): Import, id = self.make_import() result = Import.parse_preview(self.cr, self.uid, id, { - 'quote': '"', + 'quoting': '"', 'separator': 'bob', 'encoding': 'euc_kr', }) @@ -215,7 +215,7 @@ class test_preview(TransactionCase): }) result = Import.parse_preview(self.cr, self.uid, id, { - 'quote': '"', + 'quoting': '"', 'separator': ',', 'headers': True, }) @@ -253,7 +253,7 @@ class test_convert_import_data(TransactionCase): record = Import.browse(self.cr, self.uid, id) data, fields = Import._convert_import_data( record, ['name', 'somevalue', 'othervalue'], - {'quote': '"', 'separator': ',', 'headers': True,}) + {'quoting': '"', 'separator': ',', 'headers': True,}) self.assertItemsEqual(fields, ['name', 'somevalue', 'othervalue']) self.assertItemsEqual(data, [ @@ -277,7 +277,7 @@ class test_convert_import_data(TransactionCase): record = Import.browse(self.cr, self.uid, id) data, fields = Import._convert_import_data( record, ['name', False, 'othervalue'], - {'quote': '"', 'separator': ',', 'headers': True,}) + {'quoting': '"', 'separator': ',', 'headers': True,}) self.assertItemsEqual(fields, ['name', 'othervalue']) self.assertItemsEqual(data, [ @@ -301,7 +301,7 @@ class test_convert_import_data(TransactionCase): record = Import.browse(self.cr, self.uid, id) data, fields = Import._convert_import_data( record, ['name', False, 'othervalue'], - {'quote': '"', 'separator': ',', 'headers': True,}) + {'quoting': '"', 'separator': ',', 'headers': True,}) self.assertItemsEqual(fields, ['name', 'othervalue']) self.assertItemsEqual(data, [ @@ -323,7 +323,7 @@ class test_convert_import_data(TransactionCase): ValueError, Import._convert_import_data, record, [], - {'quote': '"', 'separator': ',', 'headers': True,}) + {'quoting': '"', 'separator': ',', 'headers': True,}) def test_falsefields(self): Import = self.registry('base_import.import') @@ -339,4 +339,4 @@ class test_convert_import_data(TransactionCase): ValueError, Import._convert_import_data, record, [False, False, False], - {'quote': '"', 'separator': ',', 'headers': True,}) + {'quoting': '"', 'separator': ',', 'headers': True,})