csv2xml.py 2.75 KB
import csv
import glob
import os
import sys
import logging

_logger = logging.getLogger(__name__)
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])]"' % (mytag, value)
    else:
        # many2one
        line = '"%s" ref="%s"' % (mytag, value)
    return line


def proses(path, name):
    file_name = os.path.join(path, name)
    for csv_file in glob.glob(file_name):
        no_update = NOUPDATE
        if csv_file in FILES_WITH_UPDATE:
            no_update = 0
        xml_file = csv_file.replace('.', '_').replace('_csv', '_data.xml')
        xml_data = open(xml_file, 'w')
        xml_data.write(ERP_HEADER % NOUPDATE + "\n\n\n")
        with open(csv_file, 'r') as csv_data:
            reader = csv.DictReader(csv_data)
            print(f"reader {reader}")
            model, ext = os.path.splitext(csv_file)
            for row in reader:
                xml_data.write(f'    <record id="{row["id"]}" model={model}>\n')
                for key in row:
                    if key == "id":
                        continue
                    begin = ''
                    if '/' in key or ':' in key:
                        xml_suffix = convert_relationnal_field2xml(key, row[key])
                        line = f'        <field name={xml_suffix}/>\n'
                    else:
                        # basic fields
                        value = row[key]
                        line = f"        <field name='{key}'>{value}</field>\n"

                    xml_data.write(line)
                xml_data.write(f"    </record>\n")
            xml_data.write(ERP_FOOTER)
            xml_data.close()


def usage(argv):
    print(f"{__name__} file_name")


def main(argv=sys.argv):
    if len(argv) != 2:
        return usage(argv)

    file_name = argv[1]
    name, ext = os.path.splitext(file_name)
    if not ext or ext != '.csv':
        print(f"File {file_name} bukan csv")
        sys.exit()
    path = os.path.dirname(file_name)
    name = os.path.basename(file_name)
    if not os.path.exists(path):
        print(f"Path {path} tidak ditemukan")
        sys.exit()
    if name.find('*') < 0:
        if not os.path.exists(file_name):
            print(f"Filename {name} tidak ditemukan")
            sys.exit()

    proses(path, name)


if __name__ == '__main__':
    print("Start Module")
    main(sys.argv)