{% extends "base.html" %} {% block title %}{{ trip.title }} ({{ display_date(trip.start) }}) - Edward Betts{% endblock %} {% from "macros.html" import trip_link, display_datetime, display_date_no_year, display_date, conference_row, accommodation_row, flight_row, train_row with context %} {% set row = { "flight": flight_row, "train": train_row } %} {% macro next_and_previous() %} <p> {% if prev_trip %} previous: {{ trip_link(prev_trip) }} ({{ (trip.start - prev_trip.end).days }} days) {% endif %} {% if next_trip %} next: {{ trip_link(next_trip) }} ({{ (next_trip.start - trip.end).days }} days) {% endif %} </p> {% endmacro %} {% block style %} {% if coordinates %} <link rel="stylesheet" href="{{ url_for("static", filename="leaflet/leaflet.css") }}"> {% endif %} {% set conference_column_count = 7 %} {% set accommodation_column_count = 7 %} {% set travel_column_count = 9 %} <style> .conferences { display: grid; grid-template-columns: repeat({{ conference_column_count }}, auto); /* 7 columns for each piece of information */ gap: 10px; justify-content: start; } .accommodation { display: grid; grid-template-columns: repeat({{ accommodation_column_count }}, auto); gap: 10px; justify-content: start; } .travel { display: grid; grid-template-columns: repeat({{ travel_column_count }}, auto); gap: 10px; justify-content: start; } .grid-item { /* Additional styling for grid items can go here */ } #map { height: 90vh; } </style> {% endblock %} {% set end = trip.end %} {% set total_distance = trip.total_distance() %} {% set distances_by_transport_type = trip.distances_by_transport_type() %} {% block content %} <div class="row"> <div class="col-md-6 col-sm-12"> <div class="m-3"> {{ next_and_previous() }} <h1>{{ trip.title }}</h1> <p class="lead"> {% if end %} {{ display_date_no_year(trip.start) }} to {{ display_date_no_year(end) }} ({{ (end - trip.start).days }} nights) {% else %} {{ display_date_no_year(trip.start) }} (end date missing) {% endif %} </p> <div class="mb-3"> {# <div>Countries: {{ trip.countries_str }}</div> #} <div>Locations: {{ trip.locations_str }}</div> {% if total_distance %} <div>Total distance: {{ "{:,.0f} km / {:,.0f} miles".format(total_distance, total_distance / 1.60934) }} </div> {% endif %} {% if distances_by_transport_type %} {% for transport_type, distance in distances_by_transport_type %} <div>{{ transport_type | title }} distance: {{ "{:,.0f} km / {:,.0f} miles".format(distance, distance / 1.60934) }} </div> {% endfor %} {% endif %} {% set delta = human_readable_delta(trip.start) %} {% if delta %} <div>How long until trip: {{ delta }}</div> {% endif %} </div> {% for item in trip.conferences %} {% set country = get_country(item.country) if item.country else None %} <div class="card my-1"> <div class="card-body"> <h5 class="card-title"> <a href="{{ item.url }}">{{ item.name }}</a> <small class="text-muted"> {{ display_date_no_year(item.start) }} to {{ display_date_no_year(item.end) }} </small> </h5> <p class="card-text"> <strong>Topic:</strong> {{ item.topic }} <strong>Venue:</strong> {{ item.venue }} <strong>Location:</strong> {{ item.location }} {% if country %} {{ country.flag }} {% elif item.online %} π» Online {% else %} <span class="text-bg-danger p-2"> country code <strong>{{ item.country }}</strong> not found </span> {% endif %} {% if item.free %} <span class="badge bg-success text-nowrap">free to attend</span> {% elif item.price and item.currency %} <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span> {% endif %} </p> </div> </div> {% endfor %} {% for item in trip.accommodation %} {% set country = get_country(item.country) if item.country else None %} {% set nights = (item.to.date() - item.from.date()).days %} <div class="card my-1"> <div class="card-body"> <h5 class="card-title"> {% if item.operator %}{{ item.operator }}: {% endif %} <a href="{{ item.url }}">{{ item.name }}</a> <small class="text-muted"> {{ display_date_no_year(item.from) }} to {{ display_date_no_year(item.to) }} ({% if nights == 1 %}1 night{% else %}{{ nights }} nights{% endif %}) </small> </h5> <p class="card-text"> <strong>Address:</strong> {{ item.address }} <strong>Location:</strong> {{ item.location }} {% if country %} {{ country.flag }} {% else %} <span class="text-bg-danger p-2"> country code <strong>{{ item.country }}</strong> not found </span> {% endif %} {% if g.user.is_authenticated and item.price and item.currency %} <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span> {% endif %} </p> </div> </div> {% endfor %} {% if trip.flight_bookings %} <h3>Flight bookings</h3> {% for item in trip.flight_bookings %} <div> {{ item.flights | map(attribute="airline_name") | unique | join(" + ") }} {% if g.user.is_authenticated and item.booking_reference %} <strong>booking reference:</strong> {{ item.booking_reference }} {% endif %} {% if g.user.is_authenticated and item.price and item.currency %} <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span> {% endif %} </div> {% endfor %} {% endif %} {% for item in trip.events %} {% set country = get_country(item.country) if item.country else None %} <div class="card my-1"> <div class="card-body"> <h5 class="card-title"> <a href="{{ item.url }}">{{ item.title }}</a> <small class="text-muted">{{ display_date_no_year(item.date) }}</small> </h5> <p class="card-text"> Address: {{ item.address }} | Location: {{ item.location }} {% if country %} {{ country.flag }} {% else %} <span class="text-bg-danger p-2"> country code <strong>{{ item.country }}</strong> not found </span> {% endif %} {% if g.user.is_authenticated and item.price and item.currency %} | <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span> {% endif %} </p> </div> </div> {% endfor %} {% for item in trip.travel %} <div class="card my-1"> <div class="card-body"> <h5 class="card-title"> {% if item.type == "flight" %} βοΈ {{ item.from_airport.name }} ({{ item.from_airport.iata}}) → {{ item.to_airport.name }} ({{item.to_airport.iata}}) {% elif item.type == "train" %} π {{ item.from }} → {{ item.to }} {% endif %} </h5> <p class="card-text"> {% if item.type == "flight" %} <div> <span>{{ item.airline_name }} ({{ item.airline }})</span> β¨ {{ display_datetime(item.depart) }} {% if item.arrive %} → {{ item.arrive.strftime("%H:%M %z") }} <span>π{{ ((item.arrive - item.depart).total_seconds() // 60) | int }} mins</span> {% endif %} β¨ <span>{{ item.airline }}{{ item.flight_number }}</span> {% if item.distance %} <span> πdistance: {{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }} </span> {% endif %} </div> {% elif item.type == "train" %} <div> {{ display_datetime(item.depart) }} → {{ item.arrive.strftime("%H:%M %z") }} {% if item.class %} <span class="badge bg-info text-nowrap">{{ item.class }}</span> {% endif %} <span>π{{ ((item.arrive - item.depart).total_seconds() // 60) | int }} mins</span> {% if item.distance %} <span> π€οΈ {{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }} </span> {% endif %} </div> {% endif %} </p> </div> </div> {% endfor %} <div class="mt-3"> <h4>Holidays</h4> {% if holidays %} <table class="table table-hover w-auto"> {% for item in holidays %} {% set country = get_country(item.country) %} <tr> {% if loop.first or item.date != loop.previtem.date %} <td class="text-end">{{ display_date(item.date) }}</td> {% else %} <td></td> {% endif %} <td>{{ country.flag }} {{ country.name }}</td> <td>{{ item.display_name }}</td> </tr> {% endfor %} </table> {% else %} <p>No public holidays during trip.</p> {% endif %} </div> {{ next_and_previous() }} </div> </div> <div class="col-md-6 col-sm-12"> <div id="map"></div> </div> </div> {% endblock %} {% block scripts %} <script src="{{ url_for("static", filename="leaflet/leaflet.js") }}"></script> <script src="{{ url_for("static", filename="leaflet-geodesic/leaflet.geodesic.umd.min.js") }}"></script> <script src="{{ url_for("static", filename="js/map.js") }}"></script> <script> var coordinates = {{ coordinates | tojson }}; var routes = {{ routes | tojson }}; build_map("map", coordinates, routes); </script> {% endblock %}