|
- #!/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
|