parent
dbc12adb3d
commit
5ab9d93484
10
agenda/fx.py
10
agenda/fx.py
|
@ -44,11 +44,11 @@ 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 get_exchange_rates(config) -> dict[str, Decimal]:
|
def get_rates(config: flask.config.Config) -> dict[str, Decimal]:
|
||||||
"""Get current values of exchange rates for a list of currencies against GBP."""
|
"""Get current values of exchange rates for a list of currencies against GBP."""
|
||||||
currencies = config.CURRENCIES
|
currencies = config["CURRENCIES"]
|
||||||
access_key = config.EXCHANGERATE_ACCESS_KEY
|
access_key = config["EXCHANGERATE_ACCESS_KEY"]
|
||||||
data_dir = config.DATA_DIR
|
data_dir = config["DATA_DIR"]
|
||||||
|
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
now_str = now.strftime("%Y-%m-%d_%H:%M")
|
now_str = now.strftime("%Y-%m-%d_%H:%M")
|
||||||
|
@ -65,7 +65,7 @@ def get_exchange_rates(config) -> dict[str, Decimal]:
|
||||||
recent = datetime.strptime(recent_filename[:16], "%Y-%m-%d_%H:%M")
|
recent = datetime.strptime(recent_filename[:16], "%Y-%m-%d_%H:%M")
|
||||||
delta = now - recent
|
delta = now - recent
|
||||||
|
|
||||||
if delta < timedelta(hours=6):
|
if delta < timedelta(hours=12):
|
||||||
full_path = os.path.join(fx_dir, recent_filename)
|
full_path = os.path.join(fx_dir, recent_filename)
|
||||||
with open(full_path) as file:
|
with open(full_path) as file:
|
||||||
data = json.load(file, parse_float=Decimal)
|
data = json.load(file, parse_float=Decimal)
|
||||||
|
|
|
@ -32,6 +32,9 @@
|
||||||
<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" %}
|
||||||
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
||||||
|
{% endif %}
|
||||||
{% elif item.free %}
|
{% elif item.free %}
|
||||||
<span class="badge bg-success text-nowrap">free to attend</span>
|
<span class="badge bg-success text-nowrap">free to attend</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -80,6 +83,9 @@
|
||||||
<div class="grid-item text-end">
|
<div class="grid-item text-end">
|
||||||
{% if g.user.is_authenticated and item.price and item.currency %}
|
{% if g.user.is_authenticated and item.price and item.currency %}
|
||||||
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(item.price) }} {{ item.currency }}</span>
|
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(item.price) }} {{ item.currency }}</span>
|
||||||
|
{% if item.currency != "GBP" %}
|
||||||
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
@ -118,6 +124,9 @@
|
||||||
<div class="grid-item text-end">
|
<div class="grid-item text-end">
|
||||||
{% if g.user.is_authenticated and item.price and item.currency %}
|
{% if g.user.is_authenticated and item.price and item.currency %}
|
||||||
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(item.price) }} {{ item.currency }}</span>
|
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(item.price) }} {{ item.currency }}</span>
|
||||||
|
{% if item.currency != "GBP" %}
|
||||||
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
@ -161,6 +170,9 @@
|
||||||
<div class="grid-item text-end">
|
<div class="grid-item text-end">
|
||||||
{% if g.user.is_authenticated and item.price and item.currency %}
|
{% if g.user.is_authenticated and item.price and item.currency %}
|
||||||
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(item.price) }} {{ item.currency }}</span>
|
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(item.price) }} {{ item.currency }}</span>
|
||||||
|
{% if item.currency != "GBP" %}
|
||||||
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
||||||
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
16
web_view.py
16
web_view.py
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
"""Web page to show upcoming events."""
|
"""Web page to show upcoming events."""
|
||||||
|
|
||||||
|
import decimal
|
||||||
import inspect
|
import inspect
|
||||||
import operator
|
import operator
|
||||||
import os.path
|
import os.path
|
||||||
|
@ -17,6 +18,7 @@ import yaml
|
||||||
|
|
||||||
import agenda.data
|
import agenda.data
|
||||||
import agenda.error_mail
|
import agenda.error_mail
|
||||||
|
import agenda.fx
|
||||||
import agenda.holidays
|
import agenda.holidays
|
||||||
import agenda.thespacedevs
|
import agenda.thespacedevs
|
||||||
import agenda.trip
|
import agenda.trip
|
||||||
|
@ -125,7 +127,12 @@ def travel_list() -> str:
|
||||||
if all("distance" in leg for leg in train["legs"]):
|
if all("distance" in leg for leg in train["legs"]):
|
||||||
train["distance"] = sum(leg["distance"] for leg in train["legs"])
|
train["distance"] = sum(leg["distance"] for leg in train["legs"])
|
||||||
|
|
||||||
return flask.render_template("travel.html", flights=flights, trains=trains)
|
return flask.render_template(
|
||||||
|
"travel.html",
|
||||||
|
flights=flights,
|
||||||
|
trains=trains,
|
||||||
|
fx_rate=agenda.fx.get_rates(app.config),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def as_date(d: date | datetime) -> date:
|
def as_date(d: date | datetime) -> date:
|
||||||
|
@ -151,6 +158,10 @@ def conference_list() -> str:
|
||||||
conf["start_date"] = as_date(conf["start"])
|
conf["start_date"] = as_date(conf["start"])
|
||||||
conf["end_date"] = as_date(conf["end"])
|
conf["end_date"] = as_date(conf["end"])
|
||||||
|
|
||||||
|
price = conf.get("price")
|
||||||
|
if price:
|
||||||
|
conf["price"] = decimal.Decimal(price)
|
||||||
|
|
||||||
key = (conf["start"], conf["name"])
|
key = (conf["start"], conf["name"])
|
||||||
if this_trip := conference_trip_lookup.get(key):
|
if this_trip := conference_trip_lookup.get(key):
|
||||||
conf["linked_trip"] = this_trip
|
conf["linked_trip"] = this_trip
|
||||||
|
@ -172,6 +183,7 @@ def conference_list() -> str:
|
||||||
future=future,
|
future=future,
|
||||||
today=today,
|
today=today,
|
||||||
get_country=agenda.get_country,
|
get_country=agenda.get_country,
|
||||||
|
fx_rate=agenda.fx.get_rates(app.config),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -218,6 +230,7 @@ def accommodation_list() -> str:
|
||||||
total_nights_2024=total_nights_2024,
|
total_nights_2024=total_nights_2024,
|
||||||
nights_abroad_2024=nights_abroad_2024,
|
nights_abroad_2024=nights_abroad_2024,
|
||||||
get_country=agenda.get_country,
|
get_country=agenda.get_country,
|
||||||
|
fx_rate=agenda.fx.get_rates(app.config),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -263,6 +276,7 @@ def trip_list() -> str:
|
||||||
today=today,
|
today=today,
|
||||||
get_country=agenda.get_country,
|
get_country=agenda.get_country,
|
||||||
format_list_with_ampersand=format_list_with_ampersand,
|
format_list_with_ampersand=format_list_with_ampersand,
|
||||||
|
fx_rate=agenda.fx.get_rates(app.config),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue