Improve support for adding a new currency

This commit is contained in:
Edward Betts 2024-08-04 11:44:44 +08:00
parent fb65b4d6fb
commit 7169d1ba27
2 changed files with 12 additions and 4 deletions

View file

@ -44,10 +44,16 @@ async def get_gbpusd(config: flask.config.Config) -> Decimal:
return typing.cast(Decimal, 1 / data["quotes"]["USDGBP"]) return typing.cast(Decimal, 1 / data["quotes"]["USDGBP"])
def read_cached_rates(filename: str, currencies: list[str]) -> dict[str, Decimal]: def read_cached_rates(
filename: str | None, currencies: list[str]
) -> dict[str, Decimal]:
"""Read FX rates from cache.""" """Read FX rates from cache."""
if filename is None:
return {}
with open(filename) as file: with open(filename) as file:
data = json.load(file, parse_float=Decimal) data = json.load(file, parse_float=Decimal)
return { return {
cur: Decimal(data["quotes"][f"GBP{cur}"]) cur: Decimal(data["quotes"][f"GBP{cur}"])
for cur in currencies for cur in currencies
@ -69,7 +75,9 @@ def get_rates(config: flask.config.Config) -> dict[str, Decimal]:
currency_string = ",".join(sorted(currencies)) currency_string = ",".join(sorted(currencies))
file_suffix = f"{currency_string}_to_GBP.json" file_suffix = f"{currency_string}_to_GBP.json"
existing_data = os.listdir(fx_dir) existing_data = os.listdir(fx_dir)
existing_files = [f for f in existing_data if f.endswith(file_suffix)] existing_files = [f for f in existing_data if f.endswith(".json")]
full_path: str | None = None
if existing_files: if existing_files:
recent_filename = max(existing_files) recent_filename = max(existing_files)
@ -77,7 +85,7 @@ def get_rates(config: flask.config.Config) -> dict[str, Decimal]:
delta = now - recent delta = now - recent
full_path = os.path.join(fx_dir, recent_filename) full_path = os.path.join(fx_dir, recent_filename)
if delta < timedelta(hours=12): if not recent_filename.endswith(file_suffix) or delta < timedelta(hours=12):
return read_cached_rates(full_path, currencies) return read_cached_rates(full_path, currencies)
url = "http://api.exchangerate.host/live" url = "http://api.exchangerate.host/live"

View file

@ -38,7 +38,7 @@
<div class="grid-item text-end"> <div class="grid-item text-end">
{% if item.price and item.currency %} {% if item.price and item.currency %}
<span class="badge bg-info text-nowrap">{{ "{:,d}".format(item.price | int) }} {{ item.currency }}</span> <span class="badge bg-info text-nowrap">{{ "{:,d}".format(item.price | int) }} {{ item.currency }}</span>
{% if item.currency != "GBP" %} {% if item.currency != "GBP" and item.currency in fx_rate %}
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span> <span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
{% endif %} {% endif %}
{% elif item.free %} {% elif item.free %}