Changeset 76

Show
Ignore:
Timestamp:
03/30/08 20:07:49 (5 months ago)
Author:
wriewra2
Message:

more SQLAlchemy stuff

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • sucrose/trunk/python/api/sucrose.py

    r75 r76  
    1313 
    1414class Sucrose(object): 
    15  
    16         def vend(self, location, auth): 
    17                 if not auth.authenticate_purchase(location): 
    18                         return False 
    19  
    20                 self.pic.vendItem(location) 
    21                 #auth.record_purchase(location) 
    22                 return True 
    2315 
    2416        def netid_from_uin(self, uin): 
     
    3729                return self.users.filter_by(uid=uid).first().balance 
    3830 
    39         def item_id_from_location(self, location): 
     31        def tray_from_location(self, location): 
    4032                if not ( ( location[0] in '12345' and location[1] in '1237' ) or 
    4133                         ( location[0] in '0123456789' and location[1] in '46' ) ): 
    42                         raise ValueError('invalid item ID') 
    43                 print "GOOD LOCATION" 
     34                        raise ValueError('invalid location') 
    4435 
    45                 return self.trays.filter_by(machine_tray_id=int(location)) 
     36                return self.trays.filter_by(machine_tray_id=int(location)).first() 
     37                 
     38        def vend(self, location, uin): 
     39                try: 
     40                        self.session.begin() 
     41                        user = self.users.filter_by(uin=uin).first() 
     42                        if not user: 
     43                                raise ValueError('no such user') 
     44                                 
     45                        tray = self.tray_from_location(location) 
     46                        if not tray: 
     47                                raise ValueError('no such tray!?') 
     48                        if not tray.item_id: 
     49                                raise ValueError('no item in tray') 
     50                        if tray.quantity <= 0: 
     51                                raise ValueError('no product in tray') 
     52                         
     53                        # comparing Decimal with float will otherwise behave strangely 
     54                        if tray.cur_price * 100 > int(user.balance * 100): 
     55                                raise ValueError('not enough money') 
     56                         
     57                        tray.num_consumed += 1 
     58                        tray.quantity -= 1 
     59                        txn = self.db.Transaction(user_id=user.uid, item_id=tray.item_id, cost=tray.cur_price) 
     60                        self.session.save(txn) 
     61                        print 'saved', txn 
     62                        if hasattr(self, 'pic'): 
     63                                self.pic.vendItem(location) 
     64                        self.session.commit() 
     65                        print 'committed' 
     66                except: 
     67                        self.session.rollback() 
     68                        raise 
    4669 
    4770        def item_name_from_id(self, id): 
    4871                return self.items.filter_by(item_id=id).first().name 
    4972 
    50 #       def increment_consumed_item(self, item_id) 
    51  
    5273        def __init__(self, db, dbonly=False): 
    53                 session = db.session 
     74                self.db = db 
     75                self.session = session = db.session 
    5476                self.users = session.query(db.User) 
    5577                self.trays = session.query(db.Tray).filter_by(machine='sucrose') 
  • sucrose/trunk/python/cardswipe.py

    r75 r76  
    3535                return self.sucrose.netid_from_uin(self.uin) 
    3636 
    37         def authenticate_purchase(self, location): 
    38                 # We do this for now, since there are no real items in sucrose yet. 
    39                 return True 
    40  
    41                 user_id = self.sucrose.uid_from_uin(self.uin) 
    42                 item_id = self.sucrose.item_id_from_location(location) 
    43                 item_cost = self.sucrose.cost_from_id(item_id) 
    44                  
    45                 if not ( user_id and item_id and item_cost ): 
    46                         return False 
    47  
    48                 try: 
    49                         user_balance = self.sucrose.balance_from_uid(user_id) 
    50  
    51                 except: 
    52                         return False 
    53  
    54                 if quantity <= 0  or user_balance < item_cost: 
    55                         return False 
    56  
    57                 return True 
    58  
    59         def record_purchase(self, location): 
    60                 if not self.authenticate_purchase(self, location): 
    61                         return False 
    62  
    63                 user_id = self.sucrose.uid_from_uin(self.uin) 
    64                 item_id = self.sucrose.item_id_from_location(location) 
    65                 item_cost = self.sucrose.cost_from_id(item_id) 
    66          
    67                 if not ( user_id and item_id and item_cost ): 
    68                         return False 
    69  
    70                 try: 
    71                         increment_sql = "UPDATE items SET num_consumed = num_consumed + 1 WHERE id=" + item_id 
    72                         sucrose.db.sucrose.execute(increment_sql) 
    73  
    74                         transaction_sql = "INSERT INTO vending_transactions (user_id, item_id, cost)" \ 
    75                                 + "VALUES (" + user_id + "," + item_id + "," + item_cost + ")" 
    76                         sucrose.db.integrate.execute(transaction_sql) 
    77  
    78                 except: 
    79                         return False 
    80  
    81                 return True 
    82  
    8337        def __init__(self, sucrose): 
    8438                self.cardreader = serial.Serial('/dev/ttyUSB0') 
  • sucrose/trunk/python/mysql/db.py

    r73 r76  
    88from sqlalchemy.databases.mysql import MSEnum, MSInteger 
    99from sqlalchemy.ext.declarative import declarative_base 
    10 from sqlalchemy.orm import sessionmaker 
     10from sqlalchemy.ext.associationproxy import association_proxy 
     11from sqlalchemy.orm import mapper, relation, sessionmaker 
    1112 
    1213DB_URL = 'mysql://soda:m568EXUFS@db1.acm.uiuc.edu' 
     
    2324 
    2425_vending = Table('vending', _acm_Base.metadata, 
    25                  Column('uid', MSInteger(10, unsigned=True), ForeignKey('users.uid'), primary_key=True), 
     26                 Column('uid', MSInteger(10, unsigned=True), ForeignKey(_users.c.uid), primary_key=True), 
    2627                 Column('balance', Numeric)) 
    2728 
    2829_transactions = Table('vending_transactions', _acm_Base.metadata, 
    2930                      Column('transaction_id', Integer, primary_key=True, autoincrement=True), 
    30                       Column('user_id', MSInteger(unsigned=True), ForeignKey('users.uid')), 
     31                      Column('user_id', MSInteger(unsigned=True), ForeignKey(_users.c.uid)), 
    3132                      Column('item_id', Integer), 
    3233                      Column('cost', Numeric(4, 2))) 
    33  
    34 _trays = Table('trays', _sucrose_Base.metadata, 
    35                Column('tray_id', Integer, primary_key=True, autoincrement=True), 
    36                Column('machine_tray_id', Integer), 
    37                Column('cur_price', Numeric(4, 2)), 
    38                Column('item_id', Integer, ForeignKey('items.item_id')), 
    39                Column('machine', MSEnum("'caffeine'", "'sucrose'"))) 
    4034 
    4135_items = Table('items', _sucrose_Base.metadata, 
     
    4438               Column('name', String(255))) 
    4539 
    46 class User(_acm_Base): __table__ = _users 
     40_trays = Table('trays', _sucrose_Base.metadata, 
     41               Column('tray_id', Integer, primary_key=True, autoincrement=True), 
     42               Column('machine_tray_id', Integer), 
     43               Column('quantity', Integer), 
     44               Column('cur_price', Numeric(4, 2)), 
     45               Column('item_id', Integer, ForeignKey(_items.c.item_id)), 
     46               Column('machine', MSEnum("'caffeine'", "'sucrose'"))) 
     47 
    4748class Vending(_acm_Base): __table__ = _vending 
     49class User(object): balance = association_proxy('vending', 'balance') 
     50mapper(User, _users, properties={'vending': relation(Vending, uselist=False, backref='user')}) 
     51 
    4852class Transaction(_acm_Base): __table__ = _transactions 
    49 class Tray(_sucrose_Base): __table__ = _trays 
    5053class Item(_sucrose_Base): __table__ = _items 
     54class Tray(object): num_consumed = association_proxy('item', 'num_consumed') 
     55mapper(Tray, _trays, properties={'item': relation(Item, uselist=False)}) 
    5156 
    5257_Session = sessionmaker(autoflush=True, twophase=True, transactional=True)