From 2a09614bad30fc66113c0b6c7f857957acae1966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20FRAN=C3=87OIS?= Date: Wed, 28 Feb 2018 11:20:59 +0100 Subject: [PATCH] [ADD] csv2xml4odoo --- csv2xml4odoo/csv2xml4odoo.py | 98 ++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 csv2xml4odoo/csv2xml4odoo.py diff --git a/csv2xml4odoo/csv2xml4odoo.py b/csv2xml4odoo/csv2xml4odoo.py new file mode 100755 index 0000000..9c65dbc --- /dev/null +++ b/csv2xml4odoo/csv2xml4odoo.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# based on this code +# http://code.activestate.com/recipes/577423-convert-csv-to-xml/ + +# convert Odoo csv files in xml files +# csv is easy to maintain but xml data have noupdate feature + +# Limitations: +# - relation field One2many is NOT supported +# - csv should have 'id' as first column +# - ambiguous columns: char type but contains float string, +# should have special suffix on column name '|char' +# - relationnal fields notation in csv should be: +# myfield_id/id for m2o or myfield_ids/id for m2m + +# v0.9 + +import csv +import glob + +NOUPDATE = 1 +BOOLEAN = ('True', 'False') +ERP_HEADER = """ + + """ + +ERP_FOOTER = """ + + +""" + +FILES_WITH_UPDATE = ('product.product.csv') + + +def convert_relationnal_field2xml(tag, value): + mytag = tag + for elm in ['/ids', '/id', ':id']: + mytag = mytag.replace(elm, '') + if tag[-6:] == 'ids/id': + # many2many + line = '%s" eval="[(6, 0, [%s])]"/>\n' % (mytag, value) + else: + # many2one + line = '%s" ref="%s"/>\n' % (mytag, row[i]) + return line + + +for csv_file in glob.glob('*.csv'): + no_update = NOUPDATE + if csv_file in FILES_WITH_UPDATE: + no_update = 0 + xml_file = csv_file.replace('.', '_').replace('_csv', '.xml') + csv_data = csv.reader(open(csv_file)) + xml_data = open(xml_file, 'w') + xml_data.write(ERP_HEADER % NOUPDATE + "\n\n\n") + row_num = 0 + print csv_file + for row in csv_data: + if row_num == 0: + tags = row + for i in range(len(tags)): + tags[i] = tags[i].replace(' ', '_') + else: + for i in range(len(tags)): + char = False + # ambiguous column (char type but contains float string) + # should be mark by suffix |char + if tags[i][-5:] == '|char': + char = True + numeric = False + begin = ' \n' + % (row[i], csv_file[:-4])) + elif '/' in tags[i] or ':' in tags[i]: + # relationnal fields + xml_suffix = convert_relationnal_field2xml(tags[i], row[i]) + line = '%s%s' % (begin, xml_suffix) + elif char: + # numeric ghar field + line = '%s%s">%s\n' % (begin, tags[i][:-5], row[i]) + elif numeric or row[i] in BOOLEAN: + line = '%s%s" eval="%s"/>\n' % (begin, tags[i], row[i]) + else: + # basic fields + line = '%s%s">%s\n' % (begin, tags[i], row[i]) + if row[i] or tags[i] == 'id': + xml_data.write(line) + xml_data.write('' + "\n\n") + row_num += 1 + xml_data.write(ERP_FOOTER) + xml_data.close()