2024-01-04 22:55:19 +00:00
|
|
|
{% macro display_datetime(dt) %}{{ dt.strftime("%a, %d, %b %Y %H:%M %z") }}{% endmacro %}
|
2024-05-27 09:57:46 +01:00
|
|
|
{% macro display_time(dt) %}
|
|
|
|
{% if dt %}{{ dt.strftime("%H:%M %z") }}{% endif %}
|
|
|
|
{% endmacro %}
|
2024-01-06 15:39:46 +00:00
|
|
|
{% macro display_date(dt) %}{{ dt.strftime("%a %-d %b %Y") }}{% endmacro %}
|
|
|
|
{% macro display_date_no_year(dt) %}{{ dt.strftime("%a %-d %b") }}{% endmacro %}
|
2024-01-04 22:55:19 +00:00
|
|
|
|
2024-05-27 09:12:58 +01:00
|
|
|
{% macro format_distance(distance) %}
|
|
|
|
{{ "{:,.0f} km / {:,.0f} miles".format(distance, distance / 1.60934) }}
|
|
|
|
{% endmacro %}
|
|
|
|
|
2024-01-14 12:29:39 +00:00
|
|
|
{% macro trip_link(trip) %}
|
|
|
|
<a href="{{ url_for("trip_page", start=trip.start.isoformat()) }}">{{ trip.title }}</a>
|
|
|
|
{% endmacro %}
|
|
|
|
|
2024-01-04 22:55:19 +00:00
|
|
|
{% macro conference_row(item, badge) %}
|
|
|
|
{% set country = get_country(item.country) if item.country else None %}
|
|
|
|
<div class="grid-item text-end">{{ item.start.strftime("%a, %d %b %Y") }}</div>
|
|
|
|
<div class="grid-item text-end">{{ item.end.strftime("%a, %d %b") }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{% if item.url %}
|
|
|
|
<a href="{{ item.url }}">{{ item.name }}</a>
|
|
|
|
{% else %}
|
|
|
|
{{ item.name }}
|
|
|
|
{% endif %}
|
|
|
|
{% if item.going and not (item.accommodation_booked or item.travel_booked) %}
|
|
|
|
<span class="badge text-bg-primary">
|
|
|
|
{{ badge }}
|
|
|
|
</span>
|
|
|
|
{% endif %}
|
|
|
|
{% if item.accommodation_booked %}
|
|
|
|
<span class="badge text-bg-success">accommodation</span>
|
|
|
|
{% endif %}
|
|
|
|
{% if item.transport_booked %}
|
|
|
|
<span class="badge text-bg-success">transport</span>
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-04-17 11:40:13 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% if item.price and item.currency %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,d}".format(item.price | int) }} {{ item.currency }}</span>
|
2024-04-20 07:54:16 +01:00
|
|
|
{% if item.currency != "GBP" %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
|
|
|
{% endif %}
|
2024-04-17 11:49:18 +01:00
|
|
|
{% elif item.free %}
|
|
|
|
<span class="badge bg-success text-nowrap">free to attend</span>
|
2024-04-17 11:40:13 +01:00
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-01-04 22:55:19 +00:00
|
|
|
<div class="grid-item">{{ item.topic }}</div>
|
|
|
|
<div class="grid-item">{{ item.location }}</div>
|
2024-01-16 20:17:05 +00:00
|
|
|
<div class="grid-item text-end">{{ display_date(item.cfp_end) if item.cfp_end else "" }}</div>
|
2024-01-04 22:55:19 +00:00
|
|
|
<div class="grid-item">
|
|
|
|
{% if country %}
|
|
|
|
{{ country.flag }} {{ country.name }}
|
|
|
|
{% elif item.online %}
|
|
|
|
💻 Online
|
|
|
|
{% else %}
|
|
|
|
<span class="text-bg-danger p-2">
|
|
|
|
country code <strong>{{ item.country }}</strong> not found
|
|
|
|
</span>
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{% macro accommodation_row(item, badge) %}
|
|
|
|
{% set country = get_country(item.country) %}
|
|
|
|
|
|
|
|
{% set nights = (item.to.date() - item.from.date()).days %}
|
|
|
|
<div class="grid-item text-end">{{ item.from.strftime("%a, %d %b %Y") }}</div>
|
|
|
|
<div class="grid-item text-end">{{ item.to.strftime("%a, %d %b") }}</div>
|
|
|
|
<div class="grid-item text-end">{% if nights == 1 %}1 night{% else %}{{ nights }} nights{% endif %}</div>
|
|
|
|
<div class="grid-item">{{ item.operator }}</div>
|
|
|
|
<div class="grid-item">{{ item.location }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{% if country %}
|
|
|
|
{{ country.flag }} {{ country.name }}
|
|
|
|
{% else %}
|
|
|
|
<span class="text-bg-danger p-2">
|
|
|
|
country code <strong>{{ item.country }}</strong> not found
|
|
|
|
</span>
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
<div class="grid-item">
|
2024-04-02 10:37:06 +01:00
|
|
|
{% if g.user.is_authenticated and item.url %}
|
2024-01-04 22:55:19 +00:00
|
|
|
<a href="{{ item.url }}">{{ item.name }}</a>
|
|
|
|
{% else %}
|
|
|
|
{{ item.name }}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-04-17 11:40:13 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% 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>
|
2024-04-20 07:54:16 +01:00
|
|
|
{% if item.currency != "GBP" %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
|
|
|
{% endif %}
|
2024-04-17 11:40:13 +01:00
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-01-04 22:55:19 +00:00
|
|
|
{% endmacro %}
|
|
|
|
|
2024-04-20 14:17:32 +01:00
|
|
|
{% macro flight_booking_row(booking) %}
|
2024-04-20 14:39:56 +01:00
|
|
|
<div class="grid-item">
|
|
|
|
{% if g.user.is_authenticated %}
|
|
|
|
{{ booking.booking_reference or "reference missing" }}
|
|
|
|
{% else %}
|
|
|
|
<em>redacted</em>
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
|
2024-04-20 14:17:32 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% if g.user.is_authenticated and booking.price and booking.currency %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,f}".format(booking.price) }} {{ booking.currency }}</span>
|
|
|
|
{% if booking.currency != "GBP" %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(booking.price / fx_rate[booking.currency]) }} GBP</span>
|
|
|
|
{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
{% for i in range(8) %}
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
{% endfor %}
|
|
|
|
|
|
|
|
{% for item in booking.flights %}
|
|
|
|
{% set full_flight_number = item.airline + item.flight_number %}
|
|
|
|
{% set radarbox_url = "https://www.radarbox.com/data/flights/" + full_flight_number %}
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
<div class="grid-item text-end">{{ item.depart.strftime("%a, %d %b %Y") }}</div>
|
|
|
|
<div class="grid-item">{{ item.from }} → {{ item.to }}</div>
|
|
|
|
<div class="grid-item">{{ item.depart.strftime("%H:%M") }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{% if item.arrive %}
|
|
|
|
{{ item.arrive.strftime("%H:%M") }}
|
|
|
|
{% if item.arrive.date() != item.depart.date() %}+1 day{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
<div class="grid-item">{{ item.duration }}</div>
|
|
|
|
<div class="grid-item">{{ full_flight_number }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
<a href="https://www.flightradar24.com/data/flights/{{ full_flight_number | lower }}">flightradar24</a>
|
|
|
|
| <a href="https://uk.flightaware.com/live/flight/{{ full_flight_number | replace("U2", "EZY") }}">FlightAware</a>
|
|
|
|
| <a href="{{ radarbox_url }}">radarbox</a>
|
|
|
|
</div>
|
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% if item.distance %}
|
|
|
|
{{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
{% endfor %}
|
|
|
|
{% endmacro %}
|
|
|
|
|
2024-01-04 22:55:19 +00:00
|
|
|
{% macro flight_row(item) %}
|
2024-01-10 13:26:59 +00:00
|
|
|
{% set full_flight_number = item.airline + item.flight_number %}
|
2024-01-14 18:16:20 +00:00
|
|
|
{% set radarbox_url = "https://www.radarbox.com/data/flights/" + full_flight_number %}
|
2024-01-04 22:55:19 +00:00
|
|
|
<div class="grid-item text-end">{{ item.depart.strftime("%a, %d %b %Y") }}</div>
|
|
|
|
<div class="grid-item">{{ item.from }} → {{ item.to }}</div>
|
|
|
|
<div class="grid-item">{{ item.depart.strftime("%H:%M") }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{% if item.arrive %}
|
|
|
|
{{ item.arrive.strftime("%H:%M") }}
|
|
|
|
{% if item.arrive.date() != item.depart.date() %}+1 day{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
<div class="grid-item">{{ item.duration }}</div>
|
2024-01-14 18:16:20 +00:00
|
|
|
<div class="grid-item">{{ full_flight_number }}</div>
|
2024-02-25 09:08:19 +00:00
|
|
|
<div class="grid-item">
|
|
|
|
{% if g.user.is_authenticated %}
|
|
|
|
{{ item.booking_reference }}
|
|
|
|
{% else %}
|
|
|
|
<em>redacted</em>
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-01-10 13:26:59 +00:00
|
|
|
<div class="grid-item">
|
2024-01-14 18:16:20 +00:00
|
|
|
<a href="https://www.flightradar24.com/data/flights/{{ full_flight_number | lower }}">flightradar24</a>
|
|
|
|
| <a href="https://uk.flightaware.com/live/flight/{{ full_flight_number | replace("U2", "EZY") }}">FlightAware</a>
|
|
|
|
| <a href="{{ radarbox_url }}">radarbox</a>
|
2024-01-10 13:26:59 +00:00
|
|
|
</div>
|
2024-04-06 08:25:58 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% if item.distance %}
|
|
|
|
{{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
|
|
|
|
{% endif %}
|
2024-04-05 14:58:44 +01:00
|
|
|
</div>
|
2024-04-17 11:40:13 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% 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>
|
2024-04-20 07:54:16 +01:00
|
|
|
{% if item.currency != "GBP" %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
|
|
|
{% endif %}
|
2024-04-17 11:40:13 +01:00
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-01-04 22:55:19 +00:00
|
|
|
{% endmacro %}
|
|
|
|
|
|
|
|
{% macro train_row(item) %}
|
2024-04-01 10:36:48 +01:00
|
|
|
{% set url = item.url %}
|
2024-01-04 22:55:19 +00:00
|
|
|
<div class="grid-item text-end">{{ item.depart.strftime("%a, %d %b %Y") }}</div>
|
2024-04-01 10:36:48 +01:00
|
|
|
<div class="grid-item">
|
2024-04-02 10:37:06 +01:00
|
|
|
{% if g.user.is_authenticated and item.url %}<a href="{{ url }}">{% endif %}
|
2024-04-01 10:36:48 +01:00
|
|
|
{{ item.from }} → {{ item.to }}
|
2024-04-02 10:37:06 +01:00
|
|
|
{% if g.user.is_authenticated and item.url %}</a>{% endif %}
|
2024-04-01 10:36:48 +01:00
|
|
|
</div>
|
2024-01-04 22:55:19 +00:00
|
|
|
<div class="grid-item">{{ item.depart.strftime("%H:%M") }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{% if item.arrive %}
|
|
|
|
{{ item.arrive.strftime("%H:%M") }}
|
2024-03-11 09:53:55 +00:00
|
|
|
{% if item.depart != item.arrive and item.arrive.date() != item.depart.date() %}+1 day{% endif %}
|
2024-01-04 22:55:19 +00:00
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
<div class="grid-item">{{ ((item.arrive - item.depart).total_seconds() // 60) | int }} mins</div>
|
|
|
|
<div class="grid-item">{{ item.operator }}</div>
|
2024-02-25 09:08:19 +00:00
|
|
|
<div class="grid-item">
|
|
|
|
{% if g.user.is_authenticated %}
|
|
|
|
{{ item.booking_reference }}
|
|
|
|
{% else %}
|
|
|
|
<em>redacted</em>
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-04-01 10:36:48 +01:00
|
|
|
<div class="grid-item">
|
|
|
|
{% for leg in item.legs %}
|
|
|
|
{% if leg.url %}
|
|
|
|
<a href="{{ leg.url }}">[{{ loop.index }}]</a>
|
|
|
|
{% endif %}
|
|
|
|
{% endfor %}
|
|
|
|
</div>
|
2024-04-05 14:58:44 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% if item.distance %}
|
2024-04-05 15:10:43 +01:00
|
|
|
{{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
|
2024-04-05 14:58:44 +01:00
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-04-17 11:40:13 +01:00
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% 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>
|
2024-04-20 07:54:16 +01:00
|
|
|
{% if item.currency != "GBP" %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
|
|
|
{% endif %}
|
2024-04-17 11:40:13 +01:00
|
|
|
{% endif %}
|
|
|
|
</div>
|
2024-01-04 22:55:19 +00:00
|
|
|
{% endmacro %}
|
2024-05-01 07:32:15 +01:00
|
|
|
|
|
|
|
{% macro ferry_row(item) %}
|
|
|
|
<div class="grid-item text-end">{{ item.depart.strftime("%a, %d %b %Y") }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{{ item.from }} → {{ item.to }}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="grid-item">{{ item.depart.strftime("%H:%M") }}</div>
|
|
|
|
<div class="grid-item">
|
|
|
|
{% if item.arrive %}
|
|
|
|
{{ item.arrive.strftime("%H:%M") }}
|
|
|
|
{% if item.depart != item.arrive and item.arrive.date() != item.depart.date() %}+1 day{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
<div class="grid-item">{{ item.operator }}</div>
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
<div class="grid-item"></div>
|
|
|
|
|
|
|
|
<div class="grid-item text-end">
|
|
|
|
{% 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>
|
|
|
|
{% if item.currency != "GBP" %}
|
|
|
|
<span class="badge bg-info text-nowrap">{{ "{:,.2f}".format(item.price / fx_rate[item.currency]) }} GBP</span>
|
|
|
|
{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
{# <div class="grid-item">{{ item | pprint }}</div> #}
|
|
|
|
{% endmacro %}
|