You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
6.1 KiB
Python
176 lines
6.1 KiB
Python
12 years ago
|
from decimal import Decimal
|
||
|
|
||
|
|
||
|
def ResponseFactory(action):
|
||
|
class FPSResponse(Response):
|
||
|
_action = action
|
||
|
_Result = globals().get(action + 'Result', ResponseElement)
|
||
|
|
||
|
# due to nodes receiving their closing tags
|
||
|
def endElement(self, name, value, connection):
|
||
|
if name != action + 'Response':
|
||
|
Response.endElement(self, name, value, connection)
|
||
|
return FPSResponse
|
||
|
|
||
|
|
||
|
class ResponseElement(object):
|
||
|
def __init__(self, connection=None, name=None):
|
||
|
if connection is not None:
|
||
|
self._connection = connection
|
||
|
self._name = name or self.__class__.__name__
|
||
|
|
||
|
@property
|
||
|
def connection(self):
|
||
|
return self._connection
|
||
|
|
||
|
def __repr__(self):
|
||
|
render = lambda pair: '{!s}: {!r}'.format(*pair)
|
||
|
do_show = lambda pair: not pair[0].startswith('_')
|
||
|
attrs = filter(do_show, self.__dict__.items())
|
||
|
return '{0}({1})'.format(self.__class__.__name__,
|
||
|
', '.join(map(render, attrs)))
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
return None
|
||
|
|
||
|
# due to nodes receiving their closing tags
|
||
|
def endElement(self, name, value, connection):
|
||
|
if name != self._name:
|
||
|
setattr(self, name, value)
|
||
|
|
||
|
|
||
|
class Response(ResponseElement):
|
||
|
_action = 'Undefined'
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'ResponseMetadata':
|
||
|
setattr(self, name, ResponseElement(name=name))
|
||
|
elif name == self._action + 'Result':
|
||
|
setattr(self, name, self._Result(name=name))
|
||
|
else:
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|
||
|
return getattr(self, name)
|
||
|
|
||
|
|
||
|
class ComplexAmount(ResponseElement):
|
||
|
def __repr__(self):
|
||
|
return '{0} {1}'.format(self.CurrencyCode, self.Value)
|
||
|
|
||
|
def __float__(self):
|
||
|
return float(self.Value)
|
||
|
|
||
|
def __str__(self):
|
||
|
return str(self.Value)
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name not in ('CurrencyCode', 'Value'):
|
||
|
message = 'Unrecognized tag {0} in ComplexAmount'.format(name)
|
||
|
raise AssertionError(message)
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|
||
|
|
||
|
def endElement(self, name, value, connection):
|
||
|
if name == 'Value':
|
||
|
value = Decimal(value)
|
||
|
ResponseElement.endElement(self, name, value, connection)
|
||
|
|
||
|
|
||
|
class AmountCollection(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
setattr(self, name, ComplexAmount(name=name))
|
||
|
return getattr(self, name)
|
||
|
|
||
|
|
||
|
class AccountBalance(AmountCollection):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'AvailableBalances':
|
||
|
setattr(self, name, AmountCollection(name=name))
|
||
|
return getattr(self, name)
|
||
|
return AmountCollection.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetAccountBalanceResult(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'AccountBalance':
|
||
|
setattr(self, name, AccountBalance(name=name))
|
||
|
return getattr(self, name)
|
||
|
return Response.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetTotalPrepaidLiabilityResult(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'OutstandingPrepaidLiability':
|
||
|
setattr(self, name, AmountCollection(name=name))
|
||
|
return getattr(self, name)
|
||
|
return Response.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetPrepaidBalanceResult(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'PrepaidBalance':
|
||
|
setattr(self, name, AmountCollection(name=name))
|
||
|
return getattr(self, name)
|
||
|
return Response.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetOutstandingDebtBalanceResult(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'OutstandingDebt':
|
||
|
setattr(self, name, AmountCollection(name=name))
|
||
|
return getattr(self, name)
|
||
|
return Response.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class TransactionPart(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'FeesPaid':
|
||
|
setattr(self, name, ComplexAmount(name=name))
|
||
|
return getattr(self, name)
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class Transaction(ResponseElement):
|
||
|
def __init__(self, *args, **kw):
|
||
|
self.TransactionPart = []
|
||
|
ResponseElement.__init__(self, *args, **kw)
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'TransactionPart':
|
||
|
getattr(self, name).append(TransactionPart(name=name))
|
||
|
return getattr(self, name)[-1]
|
||
|
if name in ('TransactionAmount', 'FPSFees', 'Balance'):
|
||
|
setattr(self, name, ComplexAmount(name=name))
|
||
|
return getattr(self, name)
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetAccountActivityResult(ResponseElement):
|
||
|
def __init__(self, *args, **kw):
|
||
|
self.Transaction = []
|
||
|
ResponseElement.__init__(self, *args, **kw)
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'Transaction':
|
||
|
getattr(self, name).append(Transaction(name=name))
|
||
|
return getattr(self, name)[-1]
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetTransactionResult(ResponseElement):
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'Transaction':
|
||
|
setattr(self, name, Transaction(name=name))
|
||
|
return getattr(self, name)
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|
||
|
|
||
|
|
||
|
class GetTokensResult(ResponseElement):
|
||
|
def __init__(self, *args, **kw):
|
||
|
self.Token = []
|
||
|
ResponseElement.__init__(self, *args, **kw)
|
||
|
|
||
|
def startElement(self, name, attrs, connection):
|
||
|
if name == 'Token':
|
||
|
getattr(self, name).append(ResponseElement(name=name))
|
||
|
return getattr(self, name)[-1]
|
||
|
return ResponseElement.startElement(self, name, attrs, connection)
|