50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
from flask import render_template, request, g, abort, redirect, url_for
|
|
from .config import db
|
|
from .utils import get_cities
|
|
import pymysql
|
|
import datetime
|
|
|
|
|
|
def search():
|
|
if not g.user:
|
|
return redirect(url_for("login"))
|
|
departure_city = request.args.get('departure')
|
|
destination_city = request.args.get('destination')
|
|
departure_date = request.args.get('departure-date')
|
|
passengers = int(request.args.get('passengers', 1))
|
|
|
|
# Date validation
|
|
try:
|
|
departure_date_obj = datetime.datetime.strptime(departure_date, '%Y-%m-%d').date()
|
|
if departure_date_obj < datetime.date.today():
|
|
abort(400, description="Departure date cannot be in the past.")
|
|
except ValueError:
|
|
abort(400, description="Invalid date format.")
|
|
|
|
conn = pymysql.connect(**db)
|
|
cursor = conn.cursor(pymysql.cursors.DictCursor)
|
|
|
|
search_sql = """
|
|
SELECT f.*, d.Name as Departure_airport_name, a.Name as Arrival_airport_name
|
|
FROM Flights f
|
|
JOIN Airports d ON f.Departure_airport = d.ID
|
|
JOIN Airports a ON f.Arrival_airport = a.ID
|
|
WHERE d.City = %s AND a.City = %s
|
|
AND DATE(f.Departure_time) = %s
|
|
AND (f.First_class_seats_remaining + f.Business_class_seats_remaining + f.Economy_class_seats_remaining) >= %s
|
|
AND f.Status NOT IN ('已起飞', '已降落');
|
|
"""
|
|
|
|
cursor.execute(search_sql, (departure_city, destination_city, departure_date, passengers))
|
|
flights = cursor.fetchall()
|
|
|
|
cursor.close()
|
|
conn.close()
|
|
|
|
return render_template(
|
|
'search.html',
|
|
cities=get_cities(),
|
|
flights=flights,
|
|
username=g.name
|
|
)
|