Move two functions to agenda/trip.py
This commit is contained in:
		
							parent
							
								
									f718535624
								
							
						
					
					
						commit
						b4126d04f8
					
				| 
						 | 
				
			
			@ -2,8 +2,8 @@
 | 
			
		|||
 | 
			
		||||
from datetime import date, datetime, timedelta
 | 
			
		||||
 | 
			
		||||
from .trip import depart_datetime
 | 
			
		||||
from .types import SchengenCalculation, SchengenStay, StrDict
 | 
			
		||||
from .utils import depart_datetime
 | 
			
		||||
 | 
			
		||||
# Schengen Area countries as of 2025
 | 
			
		||||
SCHENGEN_COUNTRIES = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,14 +3,14 @@
 | 
			
		|||
import decimal
 | 
			
		||||
import os
 | 
			
		||||
import typing
 | 
			
		||||
from datetime import date, datetime, time
 | 
			
		||||
from zoneinfo import ZoneInfo
 | 
			
		||||
from datetime import date
 | 
			
		||||
 | 
			
		||||
import flask
 | 
			
		||||
import yaml
 | 
			
		||||
 | 
			
		||||
from agenda import travel
 | 
			
		||||
from agenda import travel, trip_schengen
 | 
			
		||||
from agenda.types import StrDict, Trip
 | 
			
		||||
from agenda.utils import depart_datetime
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Airline(typing.TypedDict, total=False):
 | 
			
		||||
| 
						 | 
				
			
			@ -122,18 +122,6 @@ def load_coaches(
 | 
			
		|||
    return coaches
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def depart_datetime(item: StrDict) -> datetime:
 | 
			
		||||
    """Return a datetime for this travel item.
 | 
			
		||||
 | 
			
		||||
    If the travel item already has a datetime return that, otherwise if the
 | 
			
		||||
    departure time is just a date return midnight UTC for that date.
 | 
			
		||||
    """
 | 
			
		||||
    depart = item["depart"]
 | 
			
		||||
    if isinstance(depart, datetime):
 | 
			
		||||
        return depart
 | 
			
		||||
    return datetime.combine(depart, time.min).replace(tzinfo=ZoneInfo("UTC"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def process_flight(
 | 
			
		||||
    flight: StrDict, by_iata: dict[str, Airline], airports: list[StrDict]
 | 
			
		||||
) -> None:
 | 
			
		||||
| 
						 | 
				
			
			@ -502,3 +490,33 @@ def get_coordinates_and_routes(
 | 
			
		|||
            route["geojson"] = read_geojson(data_dir, route.pop("geojson_filename"))
 | 
			
		||||
 | 
			
		||||
    return (coordinates, routes)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_trip_list(
 | 
			
		||||
    route_distances: travel.RouteDistances | None = None,
 | 
			
		||||
) -> list[Trip]:
 | 
			
		||||
    """Get list of trips respecting current authentication status."""
 | 
			
		||||
    trips = [
 | 
			
		||||
        trip
 | 
			
		||||
        for trip in build_trip_list(route_distances=route_distances)
 | 
			
		||||
        if flask.g.user.is_authenticated or not trip.private
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    # Add Schengen compliance information to each trip
 | 
			
		||||
    for trip in trips:
 | 
			
		||||
        trip_schengen.add_schengen_compliance_to_trip(trip)
 | 
			
		||||
 | 
			
		||||
    return trips
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_trip(today: date) -> Trip | None:
 | 
			
		||||
    """Get current trip."""
 | 
			
		||||
    trip_list = get_trip_list(route_distances=None)
 | 
			
		||||
 | 
			
		||||
    current = [
 | 
			
		||||
        item
 | 
			
		||||
        for item in trip_list
 | 
			
		||||
        if item.start <= today and (item.end or item.start) >= today
 | 
			
		||||
    ]
 | 
			
		||||
    assert len(current) < 2
 | 
			
		||||
    return current[0] if current else None
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,8 +2,10 @@
 | 
			
		|||
 | 
			
		||||
import os
 | 
			
		||||
import typing
 | 
			
		||||
from datetime import date, datetime, timedelta, timezone
 | 
			
		||||
from time import time
 | 
			
		||||
from datetime import date, datetime, time, timedelta, timezone
 | 
			
		||||
from zoneinfo import ZoneInfo
 | 
			
		||||
 | 
			
		||||
from .types import StrDict
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def as_date(d: datetime | date) -> date:
 | 
			
		||||
| 
						 | 
				
			
			@ -118,3 +120,15 @@ async def time_function(
 | 
			
		|||
        exception = e
 | 
			
		||||
    end_time = time()
 | 
			
		||||
    return name, result, end_time - start_time, exception
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def depart_datetime(item: StrDict) -> datetime:
 | 
			
		||||
    """Return a datetime for this travel item.
 | 
			
		||||
 | 
			
		||||
    If the travel item already has a datetime return that, otherwise if the
 | 
			
		||||
    departure time is just a date return midnight UTC for that date.
 | 
			
		||||
    """
 | 
			
		||||
    depart = item["depart"]
 | 
			
		||||
    if isinstance(depart, datetime):
 | 
			
		||||
        return depart
 | 
			
		||||
    return datetime.combine(depart, time.min).replace(tzinfo=ZoneInfo("UTC"))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										59
									
								
								web_view.py
									
									
									
									
									
								
							
							
						
						
									
										59
									
								
								web_view.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -57,6 +57,7 @@ def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str,
 | 
			
		|||
 | 
			
		||||
    last_frame = list(traceback.walk_tb(current_traceback))[-1][0]
 | 
			
		||||
    last_frame_args = inspect.getargs(last_frame.f_code)
 | 
			
		||||
    assert tb._te.exc_type
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
        flask.render_template(
 | 
			
		||||
| 
						 | 
				
			
			@ -72,19 +73,6 @@ def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str,
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_current_trip(today: date) -> Trip | None:
 | 
			
		||||
    """Get current trip."""
 | 
			
		||||
    trip_list = get_trip_list(route_distances=None)
 | 
			
		||||
 | 
			
		||||
    current = [
 | 
			
		||||
        item
 | 
			
		||||
        for item in trip_list
 | 
			
		||||
        if item.start <= today and (item.end or item.start) >= today
 | 
			
		||||
    ]
 | 
			
		||||
    assert len(current) < 2
 | 
			
		||||
    return current[0] if current else None
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/")
 | 
			
		||||
async def index() -> str:
 | 
			
		||||
    """Index page."""
 | 
			
		||||
| 
						 | 
				
			
			@ -106,7 +94,7 @@ async def index() -> str:
 | 
			
		|||
        today=today,
 | 
			
		||||
        events=events,
 | 
			
		||||
        get_country=agenda.get_country,
 | 
			
		||||
        current_trip=get_current_trip(today),
 | 
			
		||||
        current_trip=agenda.trip.get_current_trip(today),
 | 
			
		||||
        start_event_list=date.today() - timedelta(days=1),
 | 
			
		||||
        end_event_list=date.today() + timedelta(days=365 * 2),
 | 
			
		||||
        render_time=(time.time() - t0),
 | 
			
		||||
| 
						 | 
				
			
			@ -429,23 +417,6 @@ def accommodation_list() -> str:
 | 
			
		|||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_trip_list(
 | 
			
		||||
    route_distances: agenda.travel.RouteDistances | None = None,
 | 
			
		||||
) -> list[Trip]:
 | 
			
		||||
    """Get list of trips respecting current authentication status."""
 | 
			
		||||
    trips = [
 | 
			
		||||
        trip
 | 
			
		||||
        for trip in agenda.trip.build_trip_list(route_distances=route_distances)
 | 
			
		||||
        if flask.g.user.is_authenticated or not trip.private
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    # Add Schengen compliance information to each trip
 | 
			
		||||
    for trip in trips:
 | 
			
		||||
        agenda.trip_schengen.add_schengen_compliance_to_trip(trip)
 | 
			
		||||
 | 
			
		||||
    return trips
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/trip")
 | 
			
		||||
def trip_list() -> werkzeug.Response:
 | 
			
		||||
    """Trip list to redirect to future trip list."""
 | 
			
		||||
| 
						 | 
				
			
			@ -477,15 +448,17 @@ def sum_distances_by_transport_type(trips: list[Trip]) -> list[tuple[str, float]
 | 
			
		|||
    return list(distances_by_transport_type.items())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_trip_list() -> list[Trip]:
 | 
			
		||||
    """Get trip list with route distances."""
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(app.config["DATA_DIR"])
 | 
			
		||||
    return agenda.trip.get_trip_list(route_distances)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@app.route("/trip/past")
 | 
			
		||||
def trip_past_list() -> str:
 | 
			
		||||
    """Page showing a list of past trips."""
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(app.config["DATA_DIR"])
 | 
			
		||||
    trip_list = get_trip_list(route_distances)
 | 
			
		||||
    today = date.today()
 | 
			
		||||
 | 
			
		||||
    past = [item for item in trip_list if (item.end or item.start) < today]
 | 
			
		||||
 | 
			
		||||
    past = [item for item in get_trip_list() if (item.end or item.start) < today]
 | 
			
		||||
    coordinates, routes = agenda.trip.get_coordinates_and_routes(past)
 | 
			
		||||
 | 
			
		||||
    return flask.render_template(
 | 
			
		||||
| 
						 | 
				
			
			@ -507,8 +480,7 @@ def trip_past_list() -> str:
 | 
			
		|||
@app.route("/trip/future")
 | 
			
		||||
def trip_future_list() -> str:
 | 
			
		||||
    """Page showing a list of future trips."""
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(app.config["DATA_DIR"])
 | 
			
		||||
    trip_list = get_trip_list(route_distances)
 | 
			
		||||
    trip_list = get_trip_list()
 | 
			
		||||
    today = date.today()
 | 
			
		||||
 | 
			
		||||
    current = [
 | 
			
		||||
| 
						 | 
				
			
			@ -540,7 +512,7 @@ def trip_future_list() -> str:
 | 
			
		|||
@app.route("/trip/text")
 | 
			
		||||
def trip_list_text() -> str:
 | 
			
		||||
    """Page showing a list of trips."""
 | 
			
		||||
    trip_list = get_trip_list()
 | 
			
		||||
    trip_list = agenda.trip.get_trip_list()
 | 
			
		||||
    today = date.today()
 | 
			
		||||
    future = [item for item in trip_list if item.start > today]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -573,8 +545,7 @@ def get_prev_current_and_next_trip(
 | 
			
		|||
@app.route("/trip/<start>")
 | 
			
		||||
def trip_page(start: str) -> str:
 | 
			
		||||
    """Individual trip page."""
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(app.config["DATA_DIR"])
 | 
			
		||||
    trip_list = get_trip_list(route_distances)
 | 
			
		||||
    trip_list = get_trip_list()
 | 
			
		||||
 | 
			
		||||
    prev_trip, trip, next_trip = get_prev_current_and_next_trip(start, trip_list)
 | 
			
		||||
    if not trip:
 | 
			
		||||
| 
						 | 
				
			
			@ -616,8 +587,7 @@ def trip_debug_page(start: str) -> str:
 | 
			
		|||
    if not flask.g.user.is_authenticated:
 | 
			
		||||
        flask.abort(401)
 | 
			
		||||
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(app.config["DATA_DIR"])
 | 
			
		||||
    trip_list = get_trip_list(route_distances)
 | 
			
		||||
    trip_list = get_trip_list()
 | 
			
		||||
 | 
			
		||||
    prev_trip, trip, next_trip = get_prev_current_and_next_trip(start, trip_list)
 | 
			
		||||
    if not trip:
 | 
			
		||||
| 
						 | 
				
			
			@ -713,8 +683,7 @@ def birthday_list() -> str:
 | 
			
		|||
@app.route("/trip/stats")
 | 
			
		||||
def trip_stats() -> str:
 | 
			
		||||
    """Travel stats: distance and price by year and travel type."""
 | 
			
		||||
    route_distances = agenda.travel.load_route_distances(app.config["DATA_DIR"])
 | 
			
		||||
    trip_list = get_trip_list(route_distances)
 | 
			
		||||
    trip_list = get_trip_list()
 | 
			
		||||
 | 
			
		||||
    conferences = sum(len(item.conferences) for item in trip_list)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue