{% macro display_datetime(dt) %}{{ dt.strftime("%a, %d, %b %Y %H:%M %z") }}{% endmacro %} {% macro display_time(dt) %}{{ dt.strftime("%H:%M %z") }}{% endmacro %} {% macro display_date(dt) %}{{ dt.strftime("%a %-d %b %Y") }}{% endmacro %} {% macro display_date_no_year(dt) %}{{ dt.strftime("%a %-d %b") }}{% endmacro %} {% macro trip_link(trip) %} <a href="{{ url_for("trip_page", start=trip.start.isoformat()) }}">{{ trip.title }}</a> {% endmacro %} {% 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> <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> {% 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 %} <span class="badge bg-success text-nowrap">free to attend</span> {% endif %} </div> <div class="grid-item">{{ item.topic }}</div> <div class="grid-item">{{ item.location }}</div> <div class="grid-item text-end">{{ display_date(item.cfp_end) if item.cfp_end else "" }}</div> <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"> {% if g.user.is_authenticated and item.url %} <a href="{{ item.url }}">{{ item.name }}</a> {% else %} {{ item.name }} {% endif %} </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> {% endmacro %} {% macro flight_booking_row(booking) %} <div class="grid-item"> {% if g.user.is_authenticated %} {{ booking.booking_reference or "reference missing" }} {% else %} <em>redacted</em> {% endif %} </div> <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 %} {% macro flight_row(item) %} {% 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 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"> {% if g.user.is_authenticated %} {{ item.booking_reference }} {% else %} <em>redacted</em> {% endif %} </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> <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> {% endmacro %} {% macro train_row(item) %} {% set url = item.url %} <div class="grid-item text-end">{{ item.depart.strftime("%a, %d %b %Y") }}</div> <div class="grid-item"> {% if g.user.is_authenticated and item.url %}<a href="{{ url }}">{% endif %} {{ item.from }} → {{ item.to }} {% if g.user.is_authenticated and item.url %}</a>{% endif %} </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">{{ ((item.arrive - item.depart).total_seconds() // 60) | int }} mins</div> <div class="grid-item">{{ item.operator }}</div> <div class="grid-item"> {% if g.user.is_authenticated %} {{ item.booking_reference }} {% else %} <em>redacted</em> {% endif %} </div> <div class="grid-item"> {% for leg in item.legs %} {% if leg.url %} <a href="{{ leg.url }}">[{{ loop.index }}]</a> {% endif %} {% endfor %} </div> <div class="grid-item text-end"> {% if item.distance %} {{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }} {% endif %} </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> {% endmacro %} {% 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 %}