bin/inventory-import.py
author Tero Marttila <terom@fixme.fi>
Thu, 20 Jan 2011 23:21:14 +0200
changeset 59 de6abcbd3c03
permissions -rwxr-xr-x
items: add inventory-import script, and tweak listing
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