From 1f8626d76bb27443e67dca3b815c700d78d11f45 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Sat, 9 Sep 2023 21:50:41 +0300 Subject: [PATCH] Improvements --- show | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100755 show diff --git a/show b/show new file mode 100755 index 0000000..1acc547 --- /dev/null +++ b/show @@ -0,0 +1,85 @@ +#!/usr/bin/python3 + +import csv +from datetime import datetime, timedelta + +# from pprint import pprint + +now = datetime.now() +since_date = now - timedelta(days=365 * 5) + +airlines = { + "British Airways": "BA", + "Iberia Airlines": "IB", + "Qatar Airways": "QR", + "Ryanair": "FR", + "easyJet": "U2", + "SAS": "SK", +} + +Flight = dict[str, str] +Flights = list[tuple[datetime, Flight]] + + +def format_row(dt: datetime, f: Flight) -> str: + """Format flight.""" + d = dt.strftime("%a, %d %b %Y") + days = (dt - now).days + + if days == 0 or days == -1: + delta = "today" + elif days < 0: + delta = f"{-days:>3d} days ago" + else: + delta = f"{days:>3d} days" + + airline = f["Airline"] + if len(airline) > 15: + airline = "".join(t[0] for t in airline.split()) + + flight_number = f["Flight_Number"] + if flight_number.isdigit() and airline in airlines: + flight_number = airlines[airline] + flight_number + + return ( + ("*" if delta == "today" else " ") + + f' {d} {delta:>13s} {f["From"]:4s} -> {f["To"]:4s} ' + + f'{airline:>15s} {flight_number:<7s} {f["Class"]} ' + + f'{f["Seat"]:>4s} {f["Plane"]}' + ) + + +def read_flights(filename: str) -> Flights: + """Read flights from CSV.""" + reader = csv.DictReader(open(filename)) + + flights = [] + + for row in reader: + d = row.pop("\ufeffDate") + if len(d) > 10: + d = datetime.strptime(d, "%Y-%m-%d %H:%M:%S") + else: + d = datetime.strptime(d, "%Y-%m-%d") + row = {k: v for k, v in row.items() if not k.endswith("OID")} + # for key in "Trip", "Seat", "Seat_Type", "Class", "Reason", "Note": + # row.pop(key) + if d < since_date: + continue + flights.append((d, row)) + + flights.sort() + + return flights + + +def show_flights(flights: Flights) -> None: + """Show list of flights.""" + for d, row in flights: + print(format_row(d, row)) + + +if __name__ == "__main__": + filename = "/home/edward/backup/openflights/openflights-backup-2023-09-09.csv" + flights = read_flights(filename) + show_flights(flights)