#!/usr/bin/env python
#
# Bank client.
#
# The client searches the two banks and performs a set of operations.
# (the banks are searched simply by listing the :banks namespace!)
#
import sys
import Pyro.naming, Pyro.core
from banks import BankError
group = ':banks' # the default namespace group
# initialize the client and set the default namespace group
Pyro.core.initClient()
Pyro.config.PYRO_NS_DEFAULTGROUP=group
# locate the NS
locator = Pyro.naming.NameServerLocator()
print 'Searching Naming Service...',
ns = locator.getNS()
print 'Naming Service found at',ns.URI.address,'('+(Pyro.protocol.getHostname(ns.URI.address) or '??')+') port',ns.URI.port
# List the banks.
# This is done by simply looking in the :banks namespace, to see what
# banks have registered. The filter is for removing any groups that could
# be in the namespace (the type of real names is 1).
banknames = filter(lambda x: x[1]==1, ns.list(group))
banknames = map(lambda (x,y): x, banknames) # keep only the object name
if not banknames:
raise RuntimeError('There are no banks to do business with!')
banks={} # banks (proxies)
print
for name in banknames:
print 'Found a bank: ',name
try:
URI=ns.resolve(name)
except Pyro.core.PyroError,x:
print 'Bank can\'t be found:',x
raise SystemExit
# create a proxy for the bank object
banks[name] = Pyro.core.getAttrProxyForURI(URI)
def selectBank():
i = 1
banknames=banks.keys()
for b in banknames:
print i," ",b
i=i+1
b = input("Select a bank: ")
return banks[banknames[b-1]]
def createAccount():
print "\nCreate Account."
bank = selectBank()
name = raw_input("Enter name: ")
a = bank.createAccount(name)
amount = input("Initial deposit: ")
a.deposit(amount)
print "Balance:", a.balance
def removeAccount():
print "\nRemove Account."
bank = selectBank()
name = raw_input("Enter name: ")
bank.deleteAccount(name)
def viewBalance():
print "\nView Balance."
bank = selectBank()
name = raw_input("Enter name: ")
ac = bank.findAccount(name)
print ac.balance
def deposit():
print "\nDeposit."
bank = selectBank()
name = raw_input("Enter name: ")
ac = bank.findAccount(name)
amount = input("Amount: ")
ac.deposit(amount)
print "New balance:", ac.balance
def withdraw():
print "\nWithdraw."
bank = selectBank()
name = raw_input("Enter name: ")
ac = bank.findAccount(name)
amount = input("Amount: ")
ac.withdraw(amount)
print "New balance:", ac.balance
def listAll():
print "\nList all accounts."
for (bankname,bank) in banks.items():
print bank.name
accs = bank.allAccounts()
if not accs:
print " No accounts."
for a in accs:
print " ",a.name, a.balance
going = 1
while going:
print "\n---- menu ----"
print "1: create account"
print "2: remove account"
print "3: view balance"
print "4: list all accounts"
print "5: deposit money"
print "6: withdraw money"
print "0: exit"
print
try:
choice = input("Choice: ")
if choice==0: going=0
elif choice==1: createAccount()
elif choice==2: removeAccount()
elif choice==3: viewBalance()
elif choice==4: listAll()
elif choice==5: deposit()
elif choice==6: withdraw()
except SyntaxError,x:
print "Input problem:",x
except BankError,x:
print 'Problem:',x
except StandardError,x:
print 'Try again (input incorrect?)'
raise
|