Changeset 76
- Timestamp:
- 03/30/08 20:07:49 (5 months ago)
- Files:
-
- sucrose/trunk/python/api/sucrose.py (modified) (2 diffs)
- sucrose/trunk/python/cardswipe.py (modified) (1 diff)
- sucrose/trunk/python/mysql/db.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
sucrose/trunk/python/api/sucrose.py
r75 r76 13 13 14 14 class Sucrose(object): 15 16 def vend(self, location, auth):17 if not auth.authenticate_purchase(location):18 return False19 20 self.pic.vendItem(location)21 #auth.record_purchase(location)22 return True23 15 24 16 def netid_from_uin(self, uin): … … 37 29 return self.users.filter_by(uid=uid).first().balance 38 30 39 def item_id_from_location(self, location):31 def tray_from_location(self, location): 40 32 if not ( ( location[0] in '12345' and location[1] in '1237' ) or 41 33 ( location[0] in '0123456789' and location[1] in '46' ) ): 42 raise ValueError('invalid item ID') 43 print "GOOD LOCATION" 34 raise ValueError('invalid location') 44 35 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 46 69 47 70 def item_name_from_id(self, id): 48 71 return self.items.filter_by(item_id=id).first().name 49 72 50 # def increment_consumed_item(self, item_id)51 52 73 def __init__(self, db, dbonly=False): 53 session = db.session 74 self.db = db 75 self.session = session = db.session 54 76 self.users = session.query(db.User) 55 77 self.trays = session.query(db.Tray).filter_by(machine='sucrose') sucrose/trunk/python/cardswipe.py
r75 r76 35 35 return self.sucrose.netid_from_uin(self.uin) 36 36 37 def authenticate_purchase(self, location):38 # We do this for now, since there are no real items in sucrose yet.39 return True40 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 False47 48 try:49 user_balance = self.sucrose.balance_from_uid(user_id)50 51 except:52 return False53 54 if quantity <= 0 or user_balance < item_cost:55 return False56 57 return True58 59 def record_purchase(self, location):60 if not self.authenticate_purchase(self, location):61 return False62 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 False69 70 try:71 increment_sql = "UPDATE items SET num_consumed = num_consumed + 1 WHERE id=" + item_id72 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 False80 81 return True82 83 37 def __init__(self, sucrose): 84 38 self.cardreader = serial.Serial('/dev/ttyUSB0') sucrose/trunk/python/mysql/db.py
r73 r76 8 8 from sqlalchemy.databases.mysql import MSEnum, MSInteger 9 9 from sqlalchemy.ext.declarative import declarative_base 10 from sqlalchemy.orm import sessionmaker 10 from sqlalchemy.ext.associationproxy import association_proxy 11 from sqlalchemy.orm import mapper, relation, sessionmaker 11 12 12 13 DB_URL = 'mysql://soda:m568EXUFS@db1.acm.uiuc.edu' … … 23 24 24 25 _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), 26 27 Column('balance', Numeric)) 27 28 28 29 _transactions = Table('vending_transactions', _acm_Base.metadata, 29 30 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)), 31 32 Column('item_id', Integer), 32 33 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'")))40 34 41 35 _items = Table('items', _sucrose_Base.metadata, … … 44 38 Column('name', String(255))) 45 39 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 47 48 class Vending(_acm_Base): __table__ = _vending 49 class User(object): balance = association_proxy('vending', 'balance') 50 mapper(User, _users, properties={'vending': relation(Vending, uselist=False, backref='user')}) 51 48 52 class Transaction(_acm_Base): __table__ = _transactions 49 class Tray(_sucrose_Base): __table__ = _trays50 53 class Item(_sucrose_Base): __table__ = _items 54 class Tray(object): num_consumed = association_proxy('item', 'num_consumed') 55 mapper(Tray, _trays, properties={'item': relation(Item, uselist=False)}) 51 56 52 57 _Session = sessionmaker(autoflush=True, twophase=True, transactional=True)
