csv2html.py 2.71 KB
import csv
import glob

NOUPDATE = 1
BOOLEAN = ('True', 'False')
ERP_HEADER = """<?xml version="1.0"?>
<odoo>
<data noupdate="%s">"""

ERP_FOOTER = """
</data>
</odoo>
"""

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', '_data.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:
        tags = row
        if row_num == 0:
            for i in range(len(tags)):
                tags[i] = tags[i].replace(' ', '_')
        else:
            for i in range(len(tags)):
                char = False
                numeric = True
                # ambiguous column (char type but contains float string)
                # should be mark by suffix |char
                if tags[i][-5:] == '|char':
                    char = True
                    numeric = False
                begin = ' <field name="'
                try:
                    float(row[i])
                    numeric = True
                except Exception:
                    pass

                if tags[i] == 'id':
                    # 'id' column is supposed to be the first left
                    line = ('<record id="%s" model="%s">\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</field>\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</field>\n' % (begin, tags[i], row[i])
                if row[i] or tags[i] == 'id':
                    xml_data.write(line)
        xml_data.write('</record>' + "\n\n")
        row_num += 1
        xml_data.write(ERP_FOOTER)
        xml_data.close()