csv2xml.py
2.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
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)