Source code for pyticketswitch.currency
import six
from pyticketswitch.mixins import JSONMixin
[docs]class Currency(JSONMixin, object):
"""Information about the currency prices are described in.
This information can be used to create human readable prices.
Attributes:
code (str): ISO 4217 currency code.
places (int): precision of decimal numbers.
pre_symbol (str): a symbol to place before the digits of a price.
post_symbol (str): a symbol to place after the digits of a price.
factor (int): arbitary scale factor, can be used to roughly convert
from one currency to another.
number (int): internal identifier.
"""
def __init__(self, code, factor=None, places=None, number=None,
pre_symbol=None, post_symbol=None):
self.factor = factor
self.places = places
self.pre_symbol = pre_symbol
self.post_symbol = post_symbol
self.code = code
self.number = number
def __eq__(self, other):
"""
FIXME: do we need this anywhere other than tests?
"""
if not other:
return False
if not self.code == other.code:
return False
if not self.number == other.number:
return False
if not self.factor == other.factor:
return False
if not self.places == other.places:
return False
if not self.pre_symbol == other.pre_symbol:
return False
if not self.post_symbol == other.post_symbol:
return False
return True
def __ne__(self, other):
return not self == other
[docs] @classmethod
def from_api_data(cls, data):
"""Convert data from the API into a native object.
Args:
data (dict): API data describing a currency.
Returns:
:class:`Currency <pyticketswitch.currency.Currency>`: the currency.
"""
kwargs = {
'factor': data.get('currency_factor'),
'places': data.get('currency_places'),
'number': data.get('currency_number'),
'pre_symbol': data.get('currency_pre_symbol'),
'post_symbol': data.get('currency_post_symbol'),
}
return cls(data.get('currency_code'), **kwargs)
[docs] def price_as_string(self, price):
"""Generates a human readble string for a price.
Args:
price (float): a price
Returns:
str: the price with the correct number of places with pre and post
symbols attached
Example:
>>> from pyticketswitch.currency import Currency
>>> usd = Currency('usd', pre_symbol='$', places=2)
>>> usd.price_as_string(5)
u'$5.00'
>>> usd.price_as_string(12.34567)
u'$12.34'
"""
price = price if price else 0
format_string = six.text_type('{pre}{price:.' + str(self.places) + 'f}{post}')
return format_string.format(
pre=self.pre_symbol or '',
price=price,
post=self.post_symbol or '',
)
def __repr__(self):
return u'<Currency {}>'.format(self.code)
[docs]class CurrencyMeta(JSONMixin, object):
"""Currency information for another object.
Attributes:
currencies (dict) dictionary of
:class:`Currency <pytickectswitch.currency.Currency>`) objects
indexed on currency code.
default_currency_code (str): unless other wise specified all prices in
the related response will be in this currency.
desired_currency_code (str):
the currency that the user account is expecting. Useful for
conversions.
"""
def __init__(self, currencies, default_currency_code=None,
desired_currency_code=None):
self.currencies = currencies
self.default_currency_code = default_currency_code
self.desired_currency_code = desired_currency_code
[docs] @classmethod
def from_api_data(cls, data):
"""Convert data from the API into a native object.
Args:
data (dict): API data describing the currencies of a related
object.
Returns:
:class:`CurrencyMeta <pyticketswitch.currency.CurrencyMeta>`: the
currency meta data.
"""
currency_data = data.get('currency_details')
if not currency_data:
return cls(currencies={})
currencies = {
code: Currency.from_api_data(value)
for code, value in currency_data.items()
}
default_currency_code = data.get('currency_code')
desired_currency_code = data.get('desired_currency_code')
return cls(
currencies=currencies,
default_currency_code=default_currency_code,
desired_currency_code=desired_currency_code,
)
[docs] def get_currency(self, code=None):
"""Get the :class:`Currency <pyticketswitch.currency.Currency>` object for the given code.
Args:
code (str, optional): ISO 4217 currency code.
Returns:
:class:`Currency <pyticketswitch.currency.Currency>`: The currency
for the given code.
If no code is specified, return the default currency as specified
by :attr:`CurrencyMeta.default_currency_code <pyticketswitch.currency.CurrencyMeta.default_currency_code>`.
If no default currency is specified return :obj:`None`.
"""
if not code:
code = self.default_currency_code
if not code:
return None
return self.currencies.get(code)
[docs] def get_desired_currency(self):
"""Get the :class:`Currency <pyticketswitch.currency.Currency>` object for the desired currency.
Returns:
:class:`Currency <pyticketswitch.currency.Currency>`: The currency
for the desired currency.
If no desired currency is specified return :obj:`None`.
"""
if not self.desired_currency_code:
return None
return self.currencies.get(self.desired_currency_code)