54 lines
1.9 KiB
Python

from flask import render_template, request, g, abort, redirect, url_for, flash
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))
if not departure_city or not destination_city or not departure_date or not passengers:
flash("请填写所有查询条件", "error")
return render_template('search.html', cities=get_cities(), flights=[], username=g.name)
# 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
)