# -*- 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()