示例#1
0
def configVolo(volo_id):
    updateForm = FlightForm()

    conn = engine.connect()
    volo = conn.execute(
        "SELECT id, aeroportoPartenza, dataOraPartenza, aeroportoArrivo, dataOraArrivo, aereo, prezzo FROM voli WHERE id=%s",
        volo_id).fetchone()
    aeroporti = conn.execute(
        "SELECT id, nome, indirizzo FROM aeroporti").fetchall()
    aerei = conn.execute("SELECT id, nome FROM aerei").fetchall()
    voli = conn.execute("SELECT * FROM voli").fetchall()
    conn.close()

    opzioniAeroporti = [
        (str(choice[0]),
         str(choice[1] + ", " + choice[2] + " #" + str(choice[0])))
        for choice in aeroporti
    ]
    updateForm.aeroportoPartenza.choices = [('', '')] + opzioniAeroporti
    updateForm.aeroportoArrivo.choices = [('', '')] + opzioniAeroporti

    opzioniAerei = [(str(choice[0]), str(choice[1] + " #" + str(choice[0])))
                    for choice in aerei]
    updateForm.aereo.choices = [('', '')] + opzioniAerei

    updateForm.check = True  #Check True -> form per modifica volo

    if updateForm.validate_on_submit():

        conn = engine.connect()

        conn.execute(
            "UPDATE voli SET aeroportoPartenza=%s, dataOraPartenza=%s, aeroportoArrivo=%s, dataOraArrivo=%s, aereo=%s, prezzo=%s WHERE id = %s",
            updateForm.aeroportoPartenza.data, updateForm.timePartenza.data,
            updateForm.aeroportoArrivo.data, updateForm.timeArrivo.data,
            updateForm.aereo.data, updateForm.prezzo.data, volo_id)
        conn.close()
        flash('Aggiornamento volo completato con successo :D', 'success')
        return redirect('dashboardhome')
    elif request.method == 'GET':  #Imposta le informazini del volo in ogni campo
        updateForm.aeroportoPartenza.data = str(volo[1])
        updateForm.timePartenza.data = volo[2]
        updateForm.aeroportoArrivo.data = str(volo[3])
        updateForm.timeArrivo.data = volo[4]
        updateForm.aereo.data = str(volo[5])
        updateForm.prezzo.data = volo[6]

    return render_template('dashboard_volo.html',
                           volo=volo,
                           flightForm=updateForm)
示例#2
0
def review_fly(fly_id, voto, crit):
    # Stabilisco una connessione
    conn = engine.connect()
    # Restituisco la prenotazione che si vuole recensire
    pren = conn.execute("SELECT * FROM prenotazioni WHERE id = %s",
                        fly_id).fetchone()
    # Se la prenotazione non esiste si abortisce
    if pren is None:
        abort(404)
        # Se l'utente che ha richiesto la prenotazione non è lo stesso che l'ha effettuata si abortisce
    if pren[1] != current_user.id:
        abort(403)

    # Se si è già fatta una recensione per quella prenotazione non è più possibile farla
    val = conn.execute("SELECT valutazione FROM prenotazioni WHERE id = %s",
                       fly_id).fetchone()
    if val[0] is None:
        # Inserimento della recensione
        conn.execute(
            "UPDATE prenotazioni SET valutazione = %s , critiche = %s WHERE id = %s",
            voto, crit, fly_id)
        conn.close()
        flash("Recensione inserita con successo", "success")
    else:
        flash("Recensione già inserita con successo", "warning")
    return redirect(url_for('users.user_fly'))
示例#3
0
def delete_volo(volo_id):

    conn = engine.connect()
    #Legge le prenotazioni collegate a quel volo
    usersmail = conn.execute(
        "SELECT u.email FROM users u JOIN prenotazioni p on u.id = p.id_user WHERE p.id_volo = %s",
        volo_id).fetchall()

    #Crea l'array
    listmail = []
    for mail in usersmail:
        listmail.append(mail[0])

    trans = conn.begin()  #Inizia la transazione

    try:
        result = deleteElementByID("id", volo_id, "voli")  #Elimina il volo

        if result:
            if not listmail == []:
                send_mail_deletefly(
                    volo_id, listmail)  #Invia la mail di avviso ai clienti
            trans.commit(
            )  #Esegue la commit confermando le azioni all'interno della transazione
            flash(
                'Il volo ' + str(volo_id) + ' è stato cancellato con successo',
                'success')
    except:
        trans.rollback()
        raise  #Se qualcosa è andato storto la rollback ripristina lo stato precedente della tabella
        flash('Il volo NON ' + str(volo_id) + ' è stato cancellato', 'danger')
    finally:
        conn.close()  #In qualunque caso chiude la connessione
    return redirect(url_for('dashboard.dashboardhome')
                    )  #Ritorna alla pagina principale della dashboard
示例#4
0
 def validate_email(self, email):
     conn = engine.connect()
     u = conn.execute("SELECT * FROM users WHERE email = %s", email.data)
     user = u.fetchone()
     conn.close()
     if user:
         raise ValidationError(
             'Email già in uso. Scegliene una differente.')
示例#5
0
 def validate_email(self, email):
     conn = engine.connect()
     u = conn.execute("SELECT * FROM users WHERE email = %s", email.data)
     user = u.fetchone()
     conn.close()
     if user is None:
         raise ValidationError(
             "Non c'è nessun account con quella mail. Devi prima registrarti"
         )
示例#6
0
 def validate_username(self, username):
     conn = engine.connect()
     u = conn.execute("SELECT * FROM users WHERE username = %s",
                      username.data)
     user = u.fetchone()
     conn.close()
     if user:
         raise ValidationError(
             'Username già in uso. Scegliene uno differente.')
示例#7
0
def home():
    searchForm = SearchFlyForm()  # Richiamo il from

    andata = ritorno = []  # Istanzio andata e ritorno a liste vuote
    is_return = False  # Istanzio il booleno per veriicare se il volo che volgio cercare sia di solo andata oppure di andata e ritorno

    conn = engine.connect()  # Istanzio una connessione
    aeroporti = conn.execute("SELECT id, nome, indirizzo FROM aeroporti"
                             ).fetchall()  # Restituisco tutti gli aeroporti

    # Inserirsco nel SelectField gli aeroporti disponibili
    opzioniAeroporti = [(str(choice[0]), str(choice[1] + ", " + choice[2]))
                        for choice in aeroporti]
    searchForm.aeroportoPartenza.choices = [('', '')] + opzioniAeroporti
    searchForm.aeroportoArrivo.choices = [('', '')] + opzioniAeroporti

    if searchForm.validate_on_submit():
        print("ok")
        # Salvatagglio dei valori inseritinel form su variabili
        aPart = searchForm.aeroportoPartenza.data
        aArr = searchForm.aeroportoArrivo.data
        dPart = searchForm.dataPartenza.data
        dRit = searchForm.dataRitorno.data
        is_return = searchForm.checkAndataRitorno.data

        # Resrituisco le informazioni del volo di andata filtrate per i campi del form
        andata = conn.execute(
            "SELECT v.id , part.nome, v.dataOraPartenza, arr.nome, v.dataOraArrivo, v.prezzo "
            +
            "FROM voli v, aeroporti arr, aeroporti part, aerei a WHERE v.aeroportoArrivo = arr.id AND v.aeroportoPartenza = part.id AND v.aereo = a.id AND part.id = %s AND arr.id = %s AND v.dataOraPartenza BETWEEN %s AND %s ORDER BY v.dataOraPartenza ASC",
            aPart, aArr, (dPart.strftime("%Y-%m-%d") + " 00:00:00"),
            (dPart.strftime("%Y-%m-%d") + " 23:59:59")).fetchall()

        if dRit is not None:
            # Resrituisco le informazioni del volo di ritorno filtrate per i campi del form
            ritorno = conn.execute(
                "SELECT v.id , part.nome, v.dataOraPartenza, arr.nome, v.dataOraArrivo, v.prezzo "
                +
                "FROM voli v, aeroporti arr, aeroporti part, aerei a WHERE v.aeroportoArrivo = arr.id AND v.aeroportoPartenza = part.id AND v.aereo = a.id AND part.id = %s AND arr.id = %s AND v.dataOraPartenza BETWEEN %s AND %s ORDER BY v.dataOraPartenza ASC",
                aArr, aPart, (dRit.strftime("%Y-%m-%d") + " 00:00:00"),
                (dRit.strftime("%Y-%m-%d") + " 23:59:59")).fetchall()

    else:
        # Resrituisco le informazioni del volo di andata filtrate per i campi del form
        andata = conn.execute(
            "SELECT v.id , part.nome, v.dataOraPartenza, arr.nome, v.dataOraArrivo, v.prezzo "
            +
            "FROM voli v, aeroporti arr, aeroporti part, aerei a WHERE v.aeroportoArrivo = arr.id and v.aeroportoPartenza = part.id and v.aereo = a.id and v.dataOraPartenza > %s ORDER BY v.dataOraPartenza ASC",
            datetime.utcnow()).fetchall()

    conn.close()
    return render_template('home.html',
                           voliand=andata,
                           volirit=ritorno,
                           flyForm=searchForm,
                           is_return=is_return)
示例#8
0
def configAereo(aereo_id):
    updateform = PlaneForm()

    conn = engine.connect()
    aereo = conn.execute(
        "SELECT id, nome, numeroPosti FROM aerei WHERE id = %s",
        aereo_id).fetchone()
    conn.close()

    if updateform.validate_on_submit():
        conn = engine.connect()
        conn.execute("UPDATE aerei SET nome=%s, numeroPosti=%s WHERE id = %s",
                     updateform.nome.data, updateform.nPosti.data, aereo_id)
        conn.close()
        flash('Aggiornamento aereo completato con successo :D', 'success')
        return redirect('dashboardhome')
    elif request.method == 'GET':  #Imposta le informazini dell' aereo in ogni campo
        updateform.nome.data = aereo[1]
        updateform.nPosti.data = aereo[2]

    return render_template('dashboard_aereo.html',
                           aereo=aereo,
                           planeForm=updateform)
示例#9
0
def delete_fly(fly_id):
    # Stabilisco una connessione
    conn = engine.connect()
    # Restituisco la prenotazione che si vuole eliminare
    pren = conn.execute("SELECT * FROM prenotazioni WHERE id = %s",
                        fly_id).fetchone()
    # Se la prenotazione non esiste si abortisce
    if pren is None:
        abort(404)
    # Se l'utente che ha richiesto l'eliminazione non è lo stesso che l'ha effettuata si abortisce
    if pren[1] != current_user.id:
        abort(403)

# Eliminazione effettiva della prenotazione
    conn.execute("DELETE FROM prenotazioni WHERE id = %s", fly_id)
    flash(
        'Il volo ' + str(pren[0]) +
        ' da te prenotato è stato cancellato con successo', 'success')
    conn.close()
    return redirect(url_for('users.user_fly'))
示例#10
0
def statisticsHome():
    statisticsForm = StatisticsForm()

    conn = engine.connect()

    #Read uncommitted non avendo necessità di leggere i dati precisi per le statistiche
    conn = conn.execution_options(isolation_level="READ UNCOMMITTED")

    #Numero totale di passeggeri
    totPasseggeri = conn.execute(
        "SELECT IFNULL(sum(pren),0) FROM pren_volo JOIN voli ON pren_volo.id = voli.id WHERE voli.dataOraArrivo < CURRENT_DATE"
    ).fetchone()

    #Passeggeri totali nell'ultimo mese
    totPasMesePrec = conn.execute(
        "SELECT IFNULL(sum(pren), 0) FROM voli NATURAL JOIN pren_volo WHERE voli.dataOraPartenza BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE()"
    ).fetchone()
    totPasMeseSucc = conn.execute(
        "SELECT IFNULL(sum(pren), 0) FROM voli NATURAL JOIN pren_volo WHERE voli.dataOraPartenza BETWEEN CURRENT_DATE() AND (CURRENT_DATE() + INTERVAL 1 MONTH)"
    ).fetchone()
    #Guadagni totali calcolati sulla somma del prezzo delle prenotazioni
    guadagniTotali = conn.execute(
        "SELECT ROUND(IFNULL(sum(prenotazioni.prezzotot),0),2) FROM prenotazioni"
    ).fetchone()

    #Ritorna la lista di aeroporti con nome e il numero totale di passeggeri arrivati e in partenza
    infoAeroporti = conn.execute(
        "SELECT nomeA, partenze, arrivi " +
        "FROM (SELECT a.nome as nomeA, IFNULL(SUM(pren_volo.pren), 0) AS partenze "
        +
        "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoPartenza LEFT JOIN pren_volo ON voli.id = pren_volo.id "
        + "GROUP BY a.nome) AS t1," +
        "(SELECT a.nome as nomeB, IFNULL(SUM(pren_volo.pren), 0)AS arrivi " +
        "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoArrivo LEFT JOIN pren_volo ON voli.id = pren_volo.id "
        + "GROUP BY a.nome) AS t2 " + "WHERE nomeA = nomeB").fetchall()

    #Ritorna la tratta del volo con il rapporto fra il numero di prenotazioni e posti totali e la media delle valutazioni (0 se non ci sono valutazioni)
    infoVoli = conn.execute(
        "SELECT a1.nome, a2.nome, aerei.nome, (pren_volo.pren/aerei.numeroPosti)*100 AS percentualeCarico, IFNULL(AVG(prenotazioni.valutazione),0) AS valutazioneMedia, voli.dataOraArrivo "
        + "FROM voli JOIN aeroporti AS a1 on voli.aeroportoPartenza = a1.id " +
        "JOIN aeroporti AS a2 ON voli.aeroportoArrivo = a2.id " +
        "JOIN aerei ON voli.aereo = aerei.id JOIN pren_volo ON voli.id = pren_volo.id "
        + "LEFT JOIN prenotazioni on voli.id = prenotazioni.id_volo " +
        "GROUP BY voli.id").fetchall()

    if statisticsForm.validate_on_submit():
        dataDa = statisticsForm.dataA.data
        dataA = statisticsForm.dataB.data

        #Ha inserito un filtro con dataInizio e dataFine per il calcolo delle informazioni
        if dataDa is not None and dataA is not None:
            infoAeroporti = conn.execute(
                "SELECT nomeA, partenze, arrivi " +
                "FROM (SELECT a.nome as nomeA, IFNULL(SUM(pren_volo.pren), 0) AS partenze "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoPartenza LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                +
                "WHERE voli.dataOraPartenza >= %s AND voli.dataOraArrivo <= %s"
                + "GROUP BY a.nome) AS t1," +
                "(SELECT a.nome as nomeB, IFNULL(SUM(pren_volo.pren), 0)AS arrivi "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoArrivo LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                +
                "WHERE voli.dataOraPartenza >= %s AND voli.dataOraArrivo <= %s"
                + "GROUP BY a.nome) AS t2 " + "WHERE nomeA = nomeB", dataDa,
                dataA, dataDa, dataA).fetchall()

            infoVoli = conn.execute(
                "SELECT a1.nome, a2.nome, aerei.nome, (pren_volo.pren/aerei.numeroPosti)*100 AS percentualeCarico, IFNULL(AVG(prenotazioni.valutazione),0) AS valutazioneMedia, voli.dataOraArrivo "
                +
                "FROM voli JOIN aeroporti AS a1 on voli.aeroportoPartenza = a1.id "
                + "JOIN aeroporti AS a2 ON voli.aeroportoArrivo = a2.id " +
                "JOIN aerei ON voli.aereo = aerei.id JOIN pren_volo ON voli.id = pren_volo.id "
                + "LEFT JOIN prenotazioni on voli.id = prenotazioni.id_volo " +
                "WHERE voli.dataOraPartenza >= %s AND voli.dataOraArrivo <= %s"
                + "GROUP BY voli.id", dataDa, dataA).fetchall()

        #Ha inserito solo la data fine, quindi calcola le informazioni sulle tuple con data precendente a quella
        elif dataDa is None and dataA is not None:
            infoAeroporti = conn.execute(
                "SELECT nomeA, partenze, arrivi " +
                "FROM (SELECT a.nome as nomeA, IFNULL(SUM(pren_volo.pren), 0) AS partenze "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoPartenza LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                + "WHERE voli.dataOraArrivo <= %s" +
                "GROUP BY a.nome) AS t1," +
                "(SELECT a.nome as nomeB, IFNULL(SUM(pren_volo.pren), 0)AS arrivi "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoArrivo LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                + "WHERE voli.dataOraArrivo <= %s" +
                "GROUP BY a.nome) AS t2 " + "WHERE nomeA = nomeB", dataA,
                dataA).fetchall()

            infoVoli = conn.execute(
                "SELECT a1.nome, a2.nome, aerei.nome, (pren_volo.pren/aerei.numeroPosti)*100 AS percentualeCarico, IFNULL(AVG(prenotazioni.valutazione),0) AS valutazioneMedia, voli.dataOraArrivo "
                +
                "FROM voli JOIN aeroporti AS a1 on voli.aeroportoPartenza = a1.id "
                + "JOIN aeroporti AS a2 ON voli.aeroportoArrivo = a2.id " +
                "JOIN aerei ON voli.aereo = aerei.id JOIN pren_volo ON voli.id = pren_volo.id "
                + "LEFT JOIN prenotazioni on voli.id = prenotazioni.id_volo " +
                "WHERE voli.dataOraArrivo<= %s" + "GROUP BY voli.id",
                dataA).fetchall()

        #Ha inserito solo la data fine, quindi calcola le informazioni su tutte le tuple con data successiva a quella
        elif dataDa is not None and dataA is None:
            infoAeroporti = conn.execute(
                "SELECT nomeA, partenze, arrivi " +
                "FROM (SELECT a.nome as nomeA, IFNULL(SUM(pren_volo.pren), 0) AS partenze "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoPartenza LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                + "WHERE voli.dataOraPartenza >= %s" +
                "GROUP BY a.nome) AS t1," +
                "(SELECT a.nome as nomeB, IFNULL(SUM(pren_volo.pren), 0)AS arrivi "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoArrivo LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                + "WHERE voli.dataOraPartenza >= %s" +
                "GROUP BY a.nome) AS t2 " + "WHERE nomeA = nomeB", dataDa,
                dataDa).fetchall()

            infoVoli = conn.execute(
                "SELECT a1.nome, a2.nome, aerei.nome, (pren_volo.pren/aerei.numeroPosti)*100 AS percentualeCarico, IFNULL(AVG(prenotazioni.valutazione),0) AS valutazioneMedia, voli.dataOraArrivo "
                +
                "FROM voli JOIN aeroporti AS a1 on voli.aeroportoPartenza = a1.id "
                + "JOIN aeroporti AS a2 ON voli.aeroportoArrivo = a2.id " +
                "JOIN aerei ON voli.aereo = aerei.id JOIN pren_volo ON voli.id = pren_volo.id "
                + "LEFT JOIN prenotazioni on voli.id = prenotazioni.id_volo " +
                "WHERE voli.dataOraPartenza >= %s" + "GROUP BY voli.id ",
                dataDa).fetchall()

        #Non ha inserito alcun filtro quindi calcola le informazioni su tutte le tuple
        else:
            infoAeroporti = conn.execute(
                "SELECT nomeA, partenze, arrivi " +
                "FROM (SELECT a.nome as nomeA, IFNULL(SUM(pren_volo.pren), 0) AS partenze "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoPartenza LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                + "GROUP BY a.nome) AS t1," +
                "(SELECT a.nome as nomeB, IFNULL(SUM(pren_volo.pren), 0)AS arrivi "
                +
                "FROM aeroporti AS a LEFT JOIN voli ON a.id = voli.aeroportoArrivo LEFT JOIN pren_volo ON voli.id = pren_volo.id "
                + "GROUP BY a.nome) AS t2 " +
                "WHERE nomeA = nomeB").fetchall()

            infoVoli = conn.execute(
                "SELECT a1.nome, a2.nome, aerei.nome, (pren_volo.pren/aerei.numeroPosti)*100 AS percentualeCarico, IFNULL(AVG(prenotazioni.valutazione),0) AS valutazioneMedia, voli.dataOraArrivo "
                +
                "FROM voli JOIN aeroporti AS a1 on voli.aeroportoPartenza = a1.id "
                + "JOIN aeroporti AS a2 ON voli.aeroportoArrivo = a2.id " +
                "JOIN aerei ON voli.aereo = aerei.id JOIN pren_volo ON voli.id = pren_volo.id "
                + "LEFT JOIN prenotazioni on voli.id = prenotazioni.id_volo " +
                "GROUP BY voli.id").fetchall()

    #Calcola la tratta (partenza, arrivo) con il guadagno massimo
    trattaGuadagniMax = conn.execute(
        "SELECT IFNULL(aeroportoP, 'None'), IFNULL(aeroportoA, 'None'), ROUND(IFNULL(guadagniTot,0),2) FROM guadagniTratte WHERE guadagniTot = (SELECT MAX(guadagniTot) FROM guadagniTratte)"
    ).fetchone()

    conn.close()
    return render_template('statistiche.html',
                           title='Statistiche',
                           fromStat=statisticsForm,
                           totPasseggeri=totPasseggeri[0],
                           totPasMesePrec=totPasMesePrec[0],
                           totPasMeseSucc=totPasMeseSucc[0],
                           aeroporti=infoAeroporti,
                           guadagniTot=guadagniTotali[0],
                           trattaGuadagniMax=trattaGuadagniMax,
                           voli=infoVoli)
示例#11
0
from aeroporto import bcrypt  #Oggetto utilizzato per criptare la password
from sqlalchemy import *

from aeroporto.table import engine

engine = create_engine('mysql://*****:*****@localhost/takeafly')
metadata = MetaData()
conn = engine.connect()

#Inserimenti iniziali eseguiti la prima volta che si avvia il server
res = conn.execute("SELECT COUNT(*) FROM users").fetchone(
)  #Controlla che non siano già stati inseriti
if res[0] == 0:
    conn.execute(
        "INSERT INTO users (username, email, image_file, password, role) VALUES (%s, %s, %s, %s, %s), (%s, %s, %s, %s, %s), (%s, %s, %s, %s, %s)",
        'Administrator', '*****@*****.**', 'default.jpg',
        bcrypt.generate_password_hash("adminpassword123").decode('utf-8'),
        'admin', 'riccardo', '*****@*****.**', 'default.jpg',
        bcrypt.generate_password_hash("password").decode('utf-8'), 'customer',
        'michele', '*****@*****.**', 'default.jpg',
        bcrypt.generate_password_hash("password2").decode('utf-8'), 'customer')

res = conn.execute("SELECT COUNT(*) FROM aerei").fetchone()
if res[0] == 0:
    conn.execute(
        "INSERT INTO aerei (nome, numeroPosti) VALUES (%s, %s), (%s, %s), (%s, %s), (%s, %s), (%s, %s)",
        'Boeing 742', 40, 'Boeing 777', 60, 'Boeing 142', 100, 'Boeing 777',
        100, 'Boeing 222', 8)

res = conn.execute("SELECT COUNT(*) FROM aeroporti").fetchone(
)  #Controlla che non siano già stati inseriti
示例#12
0
def dashboardhome():
    flightForm = FlightForm()  #Per aggiunta volo
    planeForm = PlaneForm()  #Per aggiunta aereo
    airportForm = AirportForm()  #Per aggiunta aeroporto

    conn = engine.connect()
    aeroporti = conn.execute(
        "SELECT id, nome, indirizzo FROM aeroporti").fetchall(
        )  #Informazioni necessarie per aeroporti
    aerei = conn.execute("SELECT id, nome, numeroPosti FROM aerei").fetchall(
    )  #Informazioni necessarie per aerei
    voli = conn.execute(
        "SELECT * FROM voli NATURAL JOIN pren_volo JOIN aeroporti AS aPartenza ON voli.aeroportoPartenza = aPartenza.id JOIN aeroporti AS aArrivo ON voli.aeroportoArrivo = aArrivo.id"
    ).fetchall(
    )  #Informazioni necessarie per voli compreso il numero di prenotazioni
    conn.close()

    #Crea le scelte possibili per i select field visibili nel modal per l'inserimento
    #In questo modo non è possibile inserire un aeroporto o un aereo sbagliato
    #La lista di scelte è composta da coppie (chiave, valore)
    opzioniAeroporti = [
        (str(choice[0]),
         str(choice[1] + ", " + choice[2] + " #" + str(choice[0])))
        for choice in aeroporti
    ]  #Chiave = id aeroporto, Valore = "nome + indirizzo + id"
    flightForm.aeroportoPartenza.choices = [
        ('', '')
    ] + opzioniAeroporti  #Imposta le scelte più una scelta vuota per il placeholder
    flightForm.aeroportoArrivo.choices = [('', '')] + opzioniAeroporti

    opzioniAerei = [(str(choice[0]), str(choice[1] + " #" + str(choice[0])))
                    for choice in aerei
                    ]  #Chiave = id aereo, Valore "nome + id"
    flightForm.aereo.choices = [('', '')] + opzioniAerei

    time = datetime.now()  #Data corrente

    flightForm.check = False
    #Check per definire se il form è per l'inserimento o la modifica (False -> inserimento)

    if flightForm.is_submitted(
    ) and flightForm.submitFlight.data:  #Controlla che sia stato premuto il tasto submit per aggiungere un volo
        if flightForm.validate():  #Valida i dati
            dataOraPartenza = datetime.combine(
                flightForm.dataPartenza.data, flightForm.oraPartenza.data
            )  #Combina la data e l'ora inserite nel form
            if flightForm.oraPartenza.data > flightForm.oraArrivo.data:  #l'ora di arrivo precedente all'ora di partenza
                dataOraArrivo = datetime.combine(
                    flightForm.dataPartenza.data + timedelta(days=1),
                    flightForm.oraArrivo.data
                )  #Aggiunge un giorno per la data di arrivo e combina i due campi
            else:
                dataOraArrivo = datetime.combine(
                    flightForm.dataPartenza.data,
                    flightForm.oraArrivo.data)  #combina i due campi

            conn = engine.connect()

            #Inserisce il volo
            conn.execute(
                "INSERT INTO voli (aeroportoPartenza, dataOraPartenza, aeroportoArrivo, dataOraArrivo, aereo,prezzo) VALUES (%s,%s,%s,%s,%s,%s)",
                flightForm.aeroportoPartenza.data, dataOraPartenza,
                flightForm.aeroportoArrivo.data, dataOraArrivo,
                flightForm.aereo.data, flightForm.prezzo.data)
            conn.close()

            flash('Aggiunta volo completata con successo :D', 'success')
            return redirect('dashboardhome')
        else:
            flash('Qualcosa nell\'inserimento del volo è andato storto :(',
                  'danger')

    if planeForm.is_submitted(
    ) and planeForm.submitPlane.data:  #Controlla che sia stato premuto il tasto submit per aggiungere un aereo
        if planeForm.validate():
            conn = engine.connect()
            conn.execute(
                "INSERT INTO aerei (nome, numeroPosti) VALUES (%s, %s)",
                planeForm.nome.data, planeForm.nPosti.data)

            conn.close()

            flash('Aggiunta aereo completata con successo :)', 'success')
            return redirect('dashboardhome')
        else:
            flash('Qualcosa nell\'inserimento dell\'aereo è andato storto :(',
                  'danger')

    if airportForm.is_submitted(
    ) and airportForm.submitAirport.data:  #Controlla che sia stato premuto il tasto submit per aggiungere un aeroporto
        if airportForm.validate():
            conn = engine.connect()
            conn.execute(
                "INSERT INTO aeroporti (nome, indirizzo) VALUES (%s, %s)",
                airportForm.nome.data, airportForm.indirizzo.data)

            conn.close()

            flash('Aggiunta aeroporto completata con successo :D', 'success')
            return redirect('dashboardhome')
        else:
            flash(
                'Qualcosa nell\'inserimento dell\'aeroporto è andato storto :(',
                'danger')

    return render_template('dashboard.html',
                           title='Dashboard',
                           flightForm=flightForm,
                           planeForm=planeForm,
                           airportForm=airportForm,
                           voli=voli,
                           aeroporti=aeroporti,
                           aerei=aerei,
                           time=time)
示例#13
0
def gone(volopart):
    formGone = AddBookingGone()  # Richiamo il from
    conn = engine.connect()

    # Restituisco tutte le particolari informazioni per il volo
    volo = conn.execute(
        "SELECT v.id , part.nome, v.dataOraPartenza, arr.nome, v.dataOraArrivo, v.prezzo, a.numeroPosti, a.numeroPosti-pv.pren as postdisp "
        +
        "FROM voli v JOIN aeroporti arr ON v.aeroportoArrivo = arr.id JOIN aeroporti part ON v.aeroportoPartenza = part.id JOIN aerei a ON v.aereo = a.id "
        "JOIN pren_volo pv ON pv.id = v.id WHERE v.id = %s",
        volopart).fetchone()
    # Restituisco i posti occupati per il volo che voglio prenotare
    pocc = conn.execute(
        "SELECT p.numeroPosto FROM voli v JOIN prenotazioni p ON v.id = p.id_volo WHERE v.id = %s",
        volopart).fetchall()

    # Richiamo la funzione get_available_sit che mi restituisce la lista dei posti disponibili per il volo che voglio acquistare
    available_sits = get_available_sit(pocc, volo)

    # Restituisco i bagagli disponibili e li inserisco nel SelectField  del from fromGone
    bagagli = conn.execute(
        "SELECT prezzo, descrizione FROM bagagli").fetchall()
    formGone.bagaglioAndata.choices = [(str(bag[0]), str(bag[1]))
                                       for bag in bagagli]
    conn.close()

    if formGone.validate_on_submit():
        # Se l'utente è autenticato
        if current_user.is_authenticated:
            # Se l'utente è un cliente
            if load_user(current_user.id).get_urole() == "customer":
                # Creo una connessione ed una transazione
                conn = engine.connect()

                # Imposto il livello di isolamento pe rla transazione
                conn = conn.execution_options(isolation_level="SERIALIZABLE")

                # Inizializzo la transazione
                trans = conn.begin()
                try:
                    # Inserisco la prenotazione nella tabella prenotazioni con i suoli campi necessari
                    conn.execute(
                        "INSERT INTO prenotazioni (id_user, id_volo, numeroPosto, prezzo_bagaglio, prezzotot) VALUES (%s, %s, %s, %s, %s)",
                        current_user.id, volopart, formGone.postoAndata.data,
                        formGone.bagaglioAndata.data,
                        float(volo[5]) + float(formGone.bagaglioAndata.data))

                    # Restituisco la descrizione del bagaglio che l'utente ha scelto
                    bagAndata = conn.execute(
                        "SELECT * FROM bagagli WHERE prezzo = %s",
                        formGone.bagaglioAndata.data).fetchone()

                    # Richiamo la funzione send_ticket_notify per invisare una mail all'utente di avvenuta prenotazione del tocket con tutte le informazioni necessarie per l'imbarco
                    send_ticket_notify(volo, formGone.postoAndata.data,
                                       bagAndata, 0, 0, 0)

                    # Committo la transazione
                    trans.commit()
                    flash(
                        'Acquisto completato. Ti abbiamo inviato una mail con tutte le informazioni del biglietto',
                        'success')
                    return redirect(url_for('users.user_fly'))
                except:
                    # Se la transazione ha restituito un errore esegui una rollback
                    trans.rollback()
                    flash(
                        "Posto da sedere appena acquistato, scegliene un altro",
                        'warning')
                finally:
                    conn.close()
            else:
                # Solo i clienti possono acquistare biglietti
                flash("Devi essere un cliente acquistare il biglietto",
                      'warning')
        else:
            flash("Devi accedere al tuo account per acquistare il biglietto",
                  'danger')
            return redirect(url_for('users.login'))
    return render_template('volo.html',
                           title=volopart,
                           volo=volo,
                           form=formGone,
                           free=available_sits)