#!/usr/bin/env python
# Copyright (c) 2001, actzero, inc.
import sys
sys.path.insert(1,"..")
from SOAPpy import SOAP
#SOAP.Config.debug = 1
serverstring = "SOAP.py (actzero.com) running "+sys.platform
NUMBUYS = 0
NUMSIMPLEBUYS = 0
NUMREQUESTS = 0
NUMPINGS = 0
def SimpleBuy(Address, ProductName, Quantity):
# currently, this type-checks the params, and makes sure
# the strings are of len > 0
global NUMSIMPLEBUYS
NUMSIMPLEBUYS += 1
if Quantity < 1: raise ValueError, "must order at least one"
else: return "Receipt for %d %s(s) bought from %s" % (int(Quantity), ProductName, serverstring)
def RequestForQuote(ProductName, Quantity):
# type-checks and makes sure Quantity >= 1
global NUMREQUESTS
NUMREQUESTS += 1
if Quantity < 1: raise ValueError, "must order at least 1"
else:
import whrandom
mult = whrandom.random()
times = 0
while mult > 0.25:
mult = mult - 0.25
times += 1
mult += 0.5
mult = round(mult, 3)
print mult, times
return SOAP.doubleType(round(mult*int(Quantity),2))
def Buy(**kw):
global NUMBUYS
NUMBUYS += 1
try:
PurchaseOrder = kw["PurchaseOrder"]
except:
PurchaseOrder = kw["PO"]
try:
POkeys = PurchaseOrder['_keyord']
POkeys.sort()
POkeys_expected = ["shipTo","billTo","items","poID","createDate"]
POkeys_expected.sort()
if POkeys != POkeys_expected:
raise ValueError, "struct 'PurchaseOrder' needs %s, %s, %s, %s, and %s" % tuple(POkeys_expected)
except:
raise TypeError, "'PurchaseOrder' missing one or more element(s)"
try:
btkeys = PurchaseOrder["billTo"]["_keyord"]
btkeys.sort()
btkeys_expected = ["address","zipCode","name","state","city"]
btkeys_expected.sort()
except:
raise TypeError, "'billTo' missing one or more elements"
try:
stkeys = PurchaseOrder["shipTo"]["_keyord"]
stkeys.sort()
stkeys_expected = ["address","zipCode","name","state","city"]
stkeys_expected.sort()
except:
raise TypeError, "'shipTo' missing one or more elements"
try:
items = PurchaseOrder["items"].__dict__
data = items["data"]
retstring = ""
for item in data:
itemdict = item["_asdict"]
q = itemdict["quantity"]
p = itemdict["price"]
name = itemdict["name"]
if retstring != "":
retstring += ", "
else:
retstring = "bought "
retstring += "%d %s(s) for %.2f" % (q,name,p)
retstring += " from "+serverstring
return retstring
except:
raise TypeError, "items must be an array of 'item' structs"
def Ping():
global NUMPINGS
NUMPINGS += 1
return
def Monitor(str):
if str=="actzero":
global NUMBUYS
global NUMREQUESTS
global NUMSIMPLEBUYS
global NUMPINGS
return "(Buys, RequestForQuote(s),SimpleBuy(s), Ping(s)) = " + \
repr( (NUMBUYS,NUMREQUESTS,NUMSIMPLEBUYS, NUMPINGS) )
else:
raise ValueError, "not the right string"
def Clear(str):
if str=="actzero":
global NUMBUYS
global NUMREQUESTS
global NUMSIMPLEBUYS
global NUMPINGS
NUMBUYS = 0
NUMREQUESTS = 0
NUMSIMPLEBUYS = 0
NUMPINGS = 0
return "(Buys, RequestForQuote(s),SimpleBuy(s), Ping(s)) = " + \
repr( (NUMBUYS,NUMREQUESTS,NUMSIMPLEBUYS, NUMPINGS) )
else:
raise ValueError, "not the right string"
if __name__ == "__main__":
if len(sys.argv) > 1:
try:
port = int(sys.argv[1])
if port not in range(2000,15000): raise ValueError
except:
print "port must be a number between 2000 and 15000"
sys.exit(1)
else: port = 9000
namespace = "http://www.soapinterop.org/Bid"
server = SOAP.SOAPServer( ('zoo',port) )
server.registerKWFunction(SimpleBuy, namespace )
server.registerKWFunction(RequestForQuote, namespace )
server.registerKWFunction(Buy, namespace )
server.registerKWFunction(Ping, namespace )
server.registerKWFunction(Monitor, namespace )
server.registerKWFunction(Clear, namespace )
try:
server.serve_forever()
except KeyboardInterrupt:
pass
|