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)
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'))
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
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.')
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" )
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.')
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)
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)
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'))
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)
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
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)
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)