From 99cd8a01a37f24445d618f30242eac0e21b572f5 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 23 Sep 2011 10:59:24 +0200 Subject: [PATCH] [REM] most of the fields-manipulation crapola of Import.detect_data, have headers be a simple list(str) bzr revid: xmo@openerp.com-20110923085924-4gq1g660mcmb8bus --- addons/web/controllers/main.py | 86 ++++++------------------------ addons/web/static/src/xml/base.xml | 3 +- 2 files changed, 17 insertions(+), 72 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 85f13a9f9f1..94fed949c72 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1421,80 +1421,24 @@ class Import(View): @openerpweb.httprequest def detect_data(self, req, model, csvfile, csvsep, csvdel, csvcode, csvskip, file_has_headers, jsonp): - - _fields = {} - _fields_invert = {} - error = None - fields = req.session.model(model).fields_get(False, req.session.eval_context(req.context)) - fields.update({'id': {'string': 'ID'}, '.id': {'string': 'Database ID'}}) - - def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2): - def str_comp(x,y): - if xy: return -1 - else: return 0 - - fields_order = fields.keys() - fields_order.sort(lambda x,y: str_comp(fields[x].get('string', ''), fields[y].get('string', ''))) - for field in fields_order: - if (fields[field].get('type','') not in ('reference',))\ - and (not fields[field].get('readonly')\ - or not dict(fields[field].get('states', {}).get( - 'draft', [('readonly', True)])).get('readonly',True)): - - st_name = prefix_value+fields[field]['string'] or field - _fields[prefix_node+field] = st_name - _fields_invert[st_name] = prefix_node+field - - if fields[field].get('type')=='one2many' and level>0: - fields2 = self.fields_get(req, fields[field]['relation']) - model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1) - - if fields[field].get('relation',False) and level>0: - model_populate({'/id': {'type': 'char', 'string': 'ID'}, '.id': {'type': 'char', 'string': 'Database ID'}}, - prefix_node+field, None, st_name+'/', level-1) - fields.update({'id':{'string':'ID'},'.id':{'string':'Database ID'}}) - model_populate(fields) - try: - data = csv.reader(csvfile, quotechar=str(csvdel), delimiter=str(csvsep)) - except: - error={'message': 'error opening .CSV file. Input Error.'} - return '' % ( - jsonp, simplejson.dumps({'error':error})) - - records = [] - count = 0 - header_fields = [] - word='' - - try: - for rec in itertools.islice(data,0,4): - records.append(rec) - - headers = itertools.islice(records,1) - line = headers.next() - - for word in line: - word = str(word.decode(csvcode)) - if word in _fields: - header_fields.append((word, _fields[word])) - elif word in _fields_invert.keys(): - header_fields.append((_fields_invert[word], word)) - else: - count = count + 1 - header_fields.append((word, word)) - - if len(line) == count: - error = {'message':"File has not any column header."} - except: - error = {'message':('Error processing the first line of the file. Field "%s" is unknown') % (word,)} - - if error: + data = list(csv.reader( + csvfile, quotechar=str(csvdel), delimiter=str(csvsep))) + except csv.Error, e: csvfile.seek(0) - error=dict(error, preview=csvfile.read(200)) return '' % ( - jsonp, simplejson.dumps({'error':error})) + jsonp, simplejson.dumps({'error': { + 'message': 'Error parsing CSV file: %s' % e, + # decodes each byte to a unicode character, which may or + # may not be printable, but decoding will succeed. + # Otherwise simplejson will try to decode the `str` using + # utf-8, which is very likely to blow up on characters out + # of the ascii range (in range [128, 256)) + 'preview': csvfile.read(200).decode('iso-8859-1')}})) + + records = data[:5] + + header_fields = [word.decode(csvcode) for word in records[0]] return '' % ( jsonp, simplejson.dumps({ diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 273c0b53d1c..19f8078554f 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -1443,7 +1443,8 @@ - +
+