svv/database.py
author Tero Marttila <terom@fixme.fi>
Thu, 20 Jan 2011 23:21:14 +0200
changeset 59 de6abcbd3c03
parent 56 18e7b78813bd
permissions -rw-r--r--
items: add inventory-import script, and tweak listing
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
# coding: utf-8
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
    Database schema
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
"""
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from sqlalchemy import *
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
     9
#
59
de6abcbd3c03 items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    10
# SQL clauses
de6abcbd3c03 items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    11
#
de6abcbd3c03 items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    12
from sqlalchemy.sql import functions
de6abcbd3c03 items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    13
de6abcbd3c03 items: add inventory-import script, and tweak listing
Tero Marttila <terom@fixme.fi>
parents: 56
diff changeset
    14
#
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    15
# Object Mapping
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    16
# (used externally)
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    17
#
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    18
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    19
# for ORM definitions; outside of this module
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    20
from sqlalchemy.orm import mapper, sessionmaker, relation, backref
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    21
from sqlalchemy.orm import eagerload, eagerload_all
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    22
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    23
# used by Application.session
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    24
session_factory = sessionmaker()
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    25
27
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    26
#
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    27
# Table Schema
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    28
#
1cb8b78101f9 Use Order model for OrdersView table
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
    29
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
# our schema
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
schema = MetaData()
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
# customers are organizations or natural persons who are serving as the renting side of an order
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
customers = Table('customers', schema,
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        Column('id', Integer, primary_key=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
        # organization or person name (may match with contact name)
7
bbac4b0f4320 Further improve order form
Tero Marttila <terom@fixme.fi>
parents: 6
diff changeset
    38
        Column('name', Unicode, nullable=False, unique=True),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
        # free-form internal notes
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        Column('notes', Unicode),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
        # raw CREATE/UPDATE timestamp
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
        Column('created_at', DateTime, nullable=False, default=func.now()),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        Column('updated_at', DateTime, nullable=True, onupdate=func.current_timestamp()),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
)
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
# contacts are phone/email contact details for named persons in organizations who are active in some order
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
contacts = Table('contacts', schema,
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        Column('id', Integer, primary_key=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        # reference to contact being primary for specified customer (organization or themselves)
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    53
        Column('customer_id', None, ForeignKey('customers.id'), nullable=True),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        # person's natural name
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        Column('name', Unicode, nullable=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
        # freeform telephone number
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
        Column('phone', String, nullable=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        # freeform email address
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        Column('email', String, nullable=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        # raw CREATE/UPDATE timestamp
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
        Column('created_at', DateTime, nullable=False, default=func.now()),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
        Column('updated_at', DateTime, nullable=True, onupdate=func.current_timestamp()),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
)
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
# orders are the transactions that some customer/contact makes, and involve checking out some inventory for some
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
# duration
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
orders = Table('orders', schema,
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        Column('id', Integer, primary_key=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        # ordering customer, if entered (i.e. who to bill)
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    75
        Column('customer_id', None, ForeignKey('customers.id'), nullable=True),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
        # active contact at customer side for order (i.e. who to call)
25
cfb55708ee03 db: change ForeignKey columns to use _id suffix; start using SQLAlchemy ORM for Order model
Tero Marttila <terom@fixme.fi>
parents: 9
diff changeset
    78
        Column('contact_id', None, ForeignKey('contacts.id'), nullable=True),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        # short description of customer event where these items are going
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        Column('event_name', Unicode, nullable=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        # longer description of what the event is
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        Column('event_description', Unicode, nullable=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
        # rough duration of event; time interval during which items are reserved
9
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    87
        Column('event_start', DateTime),
0327b83959e9 Implement working NewOrderView, and start restructuring it again right away...
Tero Marttila <terom@fixme.fi>
parents: 7
diff changeset
    88
        Column('event_end', DateTime),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        # raw CREATE/UPDATE timestamp
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        Column('created_at', DateTime, nullable=False, default=func.now()),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        Column('updated_at', DateTime, nullable=True, onupdate=func.current_timestamp()),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
)
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    95
# static inventory items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    96
items = Table('items', schema,
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        Column('id', Integer, primary_key=True),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
    99
        # item is part of a larger collection
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   100
        Column('parent_id', None, ForeignKey('items.id'), nullable=True),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   101
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   102
        # short name
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        Column('name', Unicode, nullable=False),
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   105
        # longer description
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   106
        Column('detail', Unicode, nullable=True),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   107
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   108
        # total quantity, or NULL for uncounted items
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   109
        Column('quantity', Integer, nullable=True),
6
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
)
72c73df76db2 Split wsgi.py into controllers/customers/urls for now; start orders form
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
56
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   112
# items included in order
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   113
order_items = Table('order_items', schema,
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   114
        # order we are part of
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   115
        Column('order_id', None, ForeignKey('orders.id'), primary_key=True),
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   116
        
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   117
        # which item is selected
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   118
        Column('item_id', None, ForeignKey('items.id'), primary_key=True),
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   119
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   120
        # how many out of total quantity
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   121
        Column('quantity', Integer, nullable=True),
18e7b78813bd items: case -> sijainti
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
   122
)
48
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   123
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   124
## editable contract terms for customer order
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   125
## provision for standard terms, or more specific ones for certain customers
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   126
#contract_terms = Table('contract_terms', schema,
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   127
#        Column('id', Integer, primary_key=True),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   128
#
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   129
#        # short description
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   130
#        Column('name', Unicode, nullable=False),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   131
#
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   132
#        # full terms in formatted code
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   133
#        Column('terms', Unicode, nullable=False),
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   134
#)
06fa83c8c0bb items: Inventory management
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   135