# Bank and accounts code. # NOTE that the Account and Bank classes are directly derived # from the Pyro.core.ObjBase base class. This is required to # support the 1.2+ attribute access feature. # Note that an account object is not returned as-is, # rather, a PROXY for it is returned. # Also note that the proxy must support attribute access, so # we use getAttrProxy(). import Pyro.core # the bank uses this exception to say there's something wrong: class BankError(Exception): pass # Unrestricted account. class Account(Pyro.core.ObjBase): def __init__(self,name,owner): Pyro.core.ObjBase.__init__(self) self.balance=0.0 self.name=name self.bank=owner def _gotReaped(self): print 'Account reaped, sorry your cash is lost:',self.name,self.balance self.bank._gotReaped(self) def withdraw(self, amount): self.balance-=amount def deposit(self,amount): self.balance+=amount # Restricted withdrawal account. class RestrictedAccount(Account): def withdraw(s, amount): if amount<=s.balance: s.balance=s.balance-amount else: raise BankError('insufficent balance') # Abstract bank. class Bank(Pyro.core.ObjBase): def __init__(s): Pyro.core.ObjBase.__init__(s) s.accounts={} def createAccount(s, name): pass # must override this! def _gotReaped(self, account): del self.accounts[account.name] print 'Bank removed reaped account',account.name def deleteAccount(s, name): try: # find account, disconnect from daemon, delete it acc = s.accounts[name] s.getDaemon().disconnect(acc) del s.accounts[name] except KeyError: raise BankError('unknown account') def findAccount(s, name): try: # find account, return proxy for it return s.accounts[name].getAttrProxy() except KeyError: raise BankError('unknown account') def allAccounts(s): # list all accounts, return list of proxies for them accs = s.accounts.values() proxies = [] for a in accs: proxies.append(a.getAttrProxy()) return proxies # Special bank: Rabobank. It has unrestricted accounts. class Rabobank(Bank): def __init__(s): Bank.__init__(s) s.name = 'Rabobank' def createAccount(s,name): if s.accounts.has_key(name): raise BankError('Account already exists') # create account object, connect to daemon, return proxy for it acc = Account(name,s) acc_URI = s.getDaemon().connect(acc) s.accounts[name]=acc print 'created account',name return acc.getAttrProxy() # Special bank: VSB. It has restricted accounts. class VSB(Bank): def __init__(s): Bank.__init__(s) s.name = 'VSB bank' def createAccount(s,name): if s.accounts.has_key(name): raise BankError('Account already exists') # create account object, connect to daemon, return proxy for it acc = RestrictedAccount(name,s) acc_URI = s.getDaemon().connect(acc) s.accounts[name]=acc print 'created account',name return acc.getAttrProxy()