author | Tero Marttila <terom@fixme.fi> |
Thu, 20 Jan 2011 23:21:14 +0200 | |
changeset 59 | de6abcbd3c03 |
permissions | -rwxr-xr-x |
59
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
2 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
3 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
4 |
Import inventory table from .csv |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
5 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
6 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
7 |
from svv import application |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
8 |
from svv import database as db |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
9 |
from svv.items import Item |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
10 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
11 |
import csv |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
12 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
13 |
import optparse, logging |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
14 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
15 |
log = logging.getLogger('inventory-import') |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
16 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
17 |
def load_csv (path, encoding='utf-8') : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
18 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
19 |
Load CSV data from given fs path, yielding the data as unicode strings. |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
20 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
21 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
22 |
reader = csv.reader(open(path, 'r')) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
23 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
24 |
for row in reader : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
25 |
# decode |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
26 |
yield [cell.decode(encoding) for cell in row] |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
27 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
28 |
def parse_csv (csv, |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
29 |
header_rows=3, |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
30 |
header_columns=[u"Sijainti", u"Artikkeli", u"Lkm", u"Selite"], |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
31 |
column_offset=0, |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
32 |
column_count=4, |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
33 |
normalize_qty=True, |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
34 |
) : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
35 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
36 |
Parse item data from given csv: |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
37 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
38 |
csv - the csv.Reader object |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
39 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
40 |
header_rows - number of column header row |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
41 |
header_columns - set of column headers to detect |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
42 |
column_offset - number of columns to skip |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
43 |
column_count - number of columns to use |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
44 |
normalize_qty - items with qty=1 aren't countable |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
45 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
46 |
Yields a series of |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
47 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
48 |
(row_id, parent_row, name, qty, descr) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
49 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
50 |
tuples. |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
51 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
52 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
53 |
# column def |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
54 |
column_def = ['location', 'name', 'qty', 'descr'] |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
55 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
56 |
# row_id's for loaded items |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
57 |
row_by_name = {} |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
58 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
59 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
60 |
for row, columns in enumerate(csv) : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
61 |
# fix up row number |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
62 |
row += 1 |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
63 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
64 |
# fix up columns |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
65 |
columns = columns[column_offset:column_offset + column_count] |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
66 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
67 |
# header |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
68 |
if row < header_rows : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
69 |
# skip |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
70 |
continue |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
71 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
72 |
elif row == header_rows : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
73 |
# check header |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
74 |
if columns != header_columns : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
75 |
# fail |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
76 |
raise Exception("Header mismatch, excepting %r, got %r on row %r" % (header_columns, columns, row)) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
77 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
78 |
# ok |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
79 |
continue |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
80 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
81 |
elif all(not col.strip() for col in columns) : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
82 |
# empty row |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
83 |
continue |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
84 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
85 |
elif len(columns) != len(column_def) : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
86 |
# bad column count |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
87 |
raise Exception("Column count mismatch, expecting %r, got %r on row %r" % (column_def, columns, row)) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
88 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
89 |
# load column |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
90 |
parent, name, qty, descr = columns |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
91 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
92 |
# normalize |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
93 |
parent = parent.strip() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
94 |
name = name.strip() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
95 |
qty = qty.strip() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
96 |
descr = descr.strip() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
97 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
98 |
# warn on whitespace |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
99 |
if [parent, name, qty, descr] != columns : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
100 |
log.warning("Extra whitespace on row %d", row) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
101 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
102 |
# convert |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
103 |
try : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
104 |
qty = int(qty) if qty else None |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
105 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
106 |
except ValueError : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
107 |
raise Exception("Invalid item quantity, got %r on row %r" % (qty, row)) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
108 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
109 |
# normalize quantity |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
110 |
if qty == 0 : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
111 |
# skip |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
112 |
log.warning("Skipping qty=0 item %r on row %d", name, row) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
113 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
114 |
elif qty == 1 and normalize_qty : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
115 |
# one item is a single item |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
116 |
qty = None |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
117 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
118 |
# map |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
119 |
if not parent : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
120 |
parent = None |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
121 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
122 |
elif parent not in row_by_name : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
123 |
raise Exception("Invalid location, got %r on row %r" % (parent, row)) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
124 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
125 |
else : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
126 |
# lookup row_id |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
127 |
parent = row_by_name[parent] |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
128 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
129 |
# debug |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
130 |
log.debug("Load %d: %s %s x%s -> %d", row, name, descr, qty, parent) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
131 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
132 |
# store |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
133 |
row_by_name[name] = row |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
134 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
135 |
# yield |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
136 |
yield row, parent, name, qty, descr |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
137 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
138 |
def create_items (session, items) : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
139 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
140 |
Create the given items and add them to the session |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
141 |
""" |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
142 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
143 |
# lookup parents |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
144 |
items_by_row = {} |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
145 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
146 |
for row, parent, name, qty, descr in items : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
147 |
# look up parent |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
148 |
if parent : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
149 |
parent = items_by_row[parent] |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
150 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
151 |
# build |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
152 |
item = Item(name, descr, qty, parent) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
153 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
154 |
# store |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
155 |
items_by_row[row] = item |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
156 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
157 |
# add |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
158 |
session.add(item) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
159 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
160 |
# number of items added |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
161 |
return len(items_by_row) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
162 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
163 |
def main () : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
164 |
parser = optparse.OptionParser(usage="Usage: %prog [options] CSV") |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
165 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
166 |
parser.add_option('-q', '--quiet', action='store_true', help='More output') |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
167 |
parser.add_option('-v', '--verbose', action='store_true', help='More output') |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
168 |
parser.add_option('-D', '--debug', action='store_true', help="Even more output (SQL queries)") |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
169 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
170 |
parser.add_option('-d', '--database', help="Database connection URI", metavar='URL') |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
171 |
parser.add_option( '--init-database', action='store_true', help="Initialize database (CREATE)") |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
172 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
173 |
parser.add_option('-C', '--charset', help="CSV charset", metavar='CHARSET', default='utf-8') |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
174 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
175 |
parser.add_option('--dry-run', action='store_true', help="Execute INSERTs but don't actually commit()") |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
176 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
177 |
(options, args) = parser.parse_args() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
178 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
179 |
# CSV from args |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
180 |
csv_path, = args |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
181 |
csv_encoding = options.charset |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
182 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
183 |
# defaults |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
184 |
level = logging.INFO |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
185 |
sql_echo = False |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
186 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
187 |
if options.quiet : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
188 |
level = logging.WARN |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
189 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
190 |
if options.verbose : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
191 |
level = logging.DEBUG |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
192 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
193 |
if options.debug : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
194 |
level = logging.DEBUG |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
195 |
sql_echo = True |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
196 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
197 |
logging.basicConfig(format="[%(levelname)5s] %(funcName)25s : %(message)s", level=level) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
198 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
199 |
if sql_echo : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
200 |
# echo SQL queries |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
201 |
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
202 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
203 |
# app state |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
204 |
app = application.Application( |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
205 |
options.database, |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
206 |
) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
207 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
208 |
# init? |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
209 |
if options.init_database : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
210 |
app.create_tables() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
211 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
212 |
# load CSV data |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
213 |
csv = load_csv(csv_path, encoding=csv_encoding) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
214 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
215 |
# parse info |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
216 |
item_data = list(parse_csv(csv)) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
217 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
218 |
# db session |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
219 |
session = app.session() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
220 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
221 |
# inserts |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
222 |
count = create_items(session, item_data) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
223 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
224 |
if options.dry_run : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
225 |
log.info("Rolling back %d INSERTs for --dry-run...", count) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
226 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
227 |
# revert |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
228 |
session.rollback() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
229 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
230 |
else : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
231 |
log.info("Committing %d new items..", count) |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
232 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
233 |
# ok, commit |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
234 |
session.commit() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
235 |
|
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
236 |
if __name__ == '__main__' : |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
237 |
main() |
de6abcbd3c03
items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents:
diff
changeset
|
238 |