Merge lp:~jri-openerp/enapps-csv-import-tool/python_csv_reader into lp:~enapps-london-uk/enapps-csv-import-tool/old_trunk

Proposed by Juan Rial (OpenERP)
Status: Needs review
Proposed branch: lp:~jri-openerp/enapps-csv-import-tool/python_csv_reader
Merge into: lp:~enapps-london-uk/enapps-csv-import-tool/old_trunk
Diff against target: 77 lines (+11/-19)
2 files modified
ea_import/ea_import_chain.py (+4/-16)
ea_import/ea_import_template.py (+7/-3)
To merge this branch: bzr merge lp:~jri-openerp/enapps-csv-import-tool/python_csv_reader
Reviewer Review Type Date Requested Status
Enapps Ltd OpenERP Partner London UK Pending
Review via email: mp+106373@code.launchpad.net

Description of the change

Fixes 2 issues:
1) LP Bug #999180: multiline text fields weren't properly handled since the file was read and parsed line by line
2) When the separator occurs within a text field (enclosed by string delimiters), the field it split in two, resulting in an incorrect line being parsed

To post a comment you must log in.

Unmerged revisions

4. By Juan Rial (OpenERP)

[FIX] LP Bug #999180: inline trivial file_to_list() functionality

3. By Juan Rial (OpenERP)

[FIX] LP Bug #999180: first commit, switching to python's own csv reader.

2. By Enapps Ltd OpenERP Partner London UK

fix invalid model reference

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'ea_import/ea_import_chain.py'
--- ea_import/ea_import_chain.py 2012-04-10 11:00:44 +0000
+++ ea_import/ea_import_chain.py 2012-05-18 13:19:22 +0000
@@ -24,6 +24,7 @@
24import datetime24import datetime
25from cStringIO import StringIO25from cStringIO import StringIO
26import time26import time
27import csv
2728
28class ea_import_chain(osv.osv):29class ea_import_chain(osv.osv):
29 _name='ea_import.chain'30 _name='ea_import.chain'
@@ -58,13 +59,13 @@
58 context['result_ids'] = []59 context['result_ids'] = []
59 result_pool = self.pool.get('ea_import.chain.result')60 result_pool = self.pool.get('ea_import.chain.result')
60 for chain in self.browse(cr, uid, ids, context=context):61 for chain in self.browse(cr, uid, ids, context=context):
61 csv_list = chain.file_to_list()62 csv_reader = csv.reader(StringIO(base64.b64decode(chain.input_file)), delimiter=str(chain.separator), quotechar=str(chain.delimiter))
62 if chain.header:63 if chain.header:
63 csv_list.pop(0)64 csv_reader.next()
64 result_ids = {}65 result_ids = {}
65 for chain_link in chain.link_ids:66 for chain_link in chain.link_ids:
66 result_ids.update({chain_link.template_id.target_model_id.model: set([])})67 result_ids.update({chain_link.template_id.target_model_id.model: set([])})
67 for record_list in csv_list:68 for record_list in csv_reader:
68 for chain_link in sorted(chain.link_ids, key=lambda k: k.sequence):69 for chain_link in sorted(chain.link_ids, key=lambda k: k.sequence):
69 result_id = chain_link.template_id.generate_record(record_list, context=context)70 result_id = chain_link.template_id.generate_record(record_list, context=context)
70 result_ids[chain_link.template_id.target_model_id.model] = result_ids[chain_link.template_id.target_model_id.model] | set(result_id)71 result_ids[chain_link.template_id.target_model_id.model] = result_ids[chain_link.template_id.target_model_id.model] | set(result_id)
@@ -79,19 +80,6 @@
79 context['result_ids'].append(result_ids)80 context['result_ids'].append(result_ids)
80 return True81 return True
8182
82 def file_to_list(self, cr, uid, ids, context={}):
83 result = []
84 for chain in self.browse(cr, uid, ids, context={}):
85 input_file = StringIO(base64.b64decode(chain.input_file))
86 for string_record in input_file:
87 line = []
88 for field_string in string_record.split(chain.separator):
89 delimiter = chain.delimiter and chain.delimiter + "\n\r" or "\n\r"
90 line.append(field_string.strip(delimiter))
91 result.append(line)
92 return result
93
94
95ea_import_chain()83ea_import_chain()
9684
97# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:85# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
9886
=== modified file 'ea_import/ea_import_template.py'
--- ea_import/ea_import_template.py 2012-04-10 11:00:44 +0000
+++ ea_import/ea_import_template.py 2012-05-18 13:19:22 +0000
@@ -24,6 +24,7 @@
24import base6424import base64
25from cStringIO import StringIO25from cStringIO import StringIO
26from types import *26from types import *
27import csv
2728
28class ea_import_template(osv.osv):29class ea_import_template(osv.osv):
29 _name='ea_import.template'30 _name='ea_import.template'
@@ -46,10 +47,13 @@
46 base_model = template.target_model_id.model47 base_model = template.target_model_id.model
47 input_file = StringIO(base64.b64decode(template.test_input_file))48 input_file = StringIO(base64.b64decode(template.test_input_file))
48 result = []49 result = []
50 # Let's hope Python's csv reader is good at guessing delimiter and quotechar since they're stored on chain level.
51 # Then again, this function is never called for the moment. Can be fixed later, when this becomes live code.
52 template_reader = csv.reader(template.test_input_file)
49 if template.header:53 if template.header:
50 header_string = input_file.readline()54 header_row = template_reader.next()
51 for record_string in input_file:55 for row in template_reader:
52 record = template.generate_record(record_string)56 record = template.generate_record(row)
53 if record and record[0] not in result:57 if record and record[0] not in result:
54 result.append(record[0])58 result.append(record[0])
55 return {59 return {

Subscribers

People subscribed via source and target branches