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 )