brmbar/brmbar3/brmbar/Currency.py

83 lines
2.6 KiB
Python

# vim: set fileencoding=utf8
class Currency:
"""Currency
Each account has a currency (1 Kč, 1 Club Maté, ...), pairs of
currencies have (asymmetric) exchange rates."""
def __init__(self, db, id, name):
self.db = db
self.id = id
self.name = name
@classmethod
def default(cls, db):
"""Default wallet currency"""
return cls.load(db, name="")
@classmethod
def load(cls, db, id=None):
"""Constructor for existing currency"""
if id is None:
raise NameError("Currency.load(): Specify id")
name = db.execute_and_fetch("SELECT name FROM currencies WHERE id = %s", [id])
name = name[0]
return cls(db, id=id, name=name)
@classmethod
def create(cls, db, name):
"""Constructor for new currency"""
id = db.execute_and_fetch("SELECT public.create_currency(%s)", [name])
return cls(db, id=id, name=name)
def rates(self, other):
"""Return tuple ($buy, $sell) of rates of $self in relation to $other (brmbar.Currency):
$buy is the price of $self in means of $other when buying it (into brmbar)
$sell is the price of $self in means of $other when selling it (from brmbar)"""
# buy rate
res = self.db.execute_and_fetch(
"SELECT public.find_buy_rate(%s, %s)", [self.id, other.id]
)
if res is None:
raise NameError("Something fishy in find_buy_rate.")
buy = res[0]
if buy < 0:
raise NameError(
"Currency.rate(): Unknown conversion "
+ other.name()
+ " to "
+ self.name()
)
# sell rate
res = self.db.execute_and_fetch(
"SELECT public.find_sell_rate(%s, %s)", [self.id, other.id]
)
if res is None:
raise NameError("Something fishy in find_sell_rate.")
sell = res[0]
if sell < 0:
raise NameError(
"Currency.rate(): Unknown conversion "
+ self.name()
+ " to "
+ other.name()
)
return (buy, sell)
def str(self, amount):
return "{:.2f} {}".format(amount, self.name)
def update_sell_rate(self, target, rate):
self.db.execute(
"SELECT public.update_currency_sell_rate(%s, %s, %s)",
[self.id, target.id, rate],
)
def update_buy_rate(self, source, rate):
self.db.execute(
"SELECT public.update_currency_buy_rate(%s, %s, %s)",
[self.id, source.id, rate],
)