-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathflight_hash.py
More file actions
87 lines (81 loc) · 2.56 KB
/
flight_hash.py
File metadata and controls
87 lines (81 loc) · 2.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from fli.models import (
Airport,
FlightLeg,
FlightResult,
FlightSearchFilters,
FlightSegment,
LayoverRestrictions,
)
def hash_flight_leg(flight_leg: FlightLeg) -> int:
return hash(
(
flight_leg.airline,
flight_leg.flight_number,
flight_leg.departure_airport,
flight_leg.arrival_airport,
flight_leg.departure_datetime,
flight_leg.arrival_datetime,
flight_leg.duration,
)
)
def hash_flight_result(flight_result: FlightResult) -> int:
return hash(
(
tuple(hash_flight_leg(leg) for leg in flight_result.legs),
flight_result.price,
flight_result.duration,
flight_result.stops,
)
)
def hash_flight_segment(flight_segment: FlightSegment) -> int:
return hash(
(
tuple(
sorted(
tuple(a.name if isinstance(a, Airport) else a for a in airport)
for airport in flight_segment.departure_airport
)
),
tuple(
sorted(
tuple(a.name if isinstance(a, Airport) else a for a in airport)
for airport in flight_segment.arrival_airport
)
),
flight_segment.travel_date,
(
flight_segment.time_restrictions.earliest_departure,
flight_segment.time_restrictions.latest_departure,
flight_segment.time_restrictions.earliest_arrival,
flight_segment.time_restrictions.latest_arrival,
) if flight_segment.time_restrictions else None,
hash_flight_result(flight_segment.selected_flight) if flight_segment.selected_flight else None,
)
)
def hash_layover_restrictions(layover_restrictions: LayoverRestrictions) -> int:
return hash(
(
tuple(sorted(airport.name for airport in layover_restrictions.airports)) if layover_restrictions.airports else None,
layover_restrictions.max_duration,
)
)
def hash_flight_query(query: FlightSearchFilters) -> int:
return hash(
(
query.trip_type,
(
query.passenger_info.adults,
query.passenger_info.children,
query.passenger_info.infants_in_seat,
query.passenger_info.infants_on_lap,
),
tuple(hash_flight_segment(flight_segment) for flight_segment in query.flight_segments),
query.stops,
query.seat_type,
(query.price_limit.max_price, query.price_limit.currency) if query.price_limit else None,
tuple(sorted(airline.name for airline in query.airlines)) if query.airlines else None,
query.max_duration,
hash_layover_restrictions(query.layover_restrictions) if query.layover_restrictions else None,
query.sort_by,
)
)