From 7572de7bcfab612f427de3c56dd35caa3b965f54 Mon Sep 17 00:00:00 2001 From: Giuseppe Riccio Date: Sun, 4 Sep 2022 14:03:27 +0200 Subject: [PATCH] Suddivisione pattern MVC --- __pycache__/config.cpython-310.pyc | Bin 0 -> 316 bytes config.py | 5 + ...GestioneDisponibilit\303\240Controller.py" | 164 ++++ controllers/GestioneEsitiTamponiController.py | 23 + controllers/GestioneFarmaciaController.py | 120 +++ .../GestionePazienteRegistratoController.py | 114 +++ controllers/GestionePrenotazioniController.py | 213 +++++ controllers/MLModelController.py | 54 ++ controllers/MainHandlerController.py | 14 + ...nibilit\303\240Controller.cpython-310.pyc" | Bin 0 -> 5547 bytes ...ioneEsitiTamponiController.cpython-310.pyc | Bin 0 -> 1187 bytes ...GestioneFarmaciaController.cpython-310.pyc | Bin 0 -> 3920 bytes ...zienteRegistratoController.cpython-310.pyc | Bin 0 -> 5251 bytes ...ionePrenotazioniController.cpython-310.pyc | Bin 0 -> 9291 bytes .../MLModelController.cpython-310.pyc | Bin 0 -> 2818 bytes .../MainHandlerController.cpython-310.pyc | Bin 0 -> 945 bytes init_db.py | 7 - main.py | 840 ++++-------------- models/DB.py | 13 + models/__pycache__/DB.cpython-310.pyc | Bin 0 -> 745 bytes .../selftestcovid19.db | Bin 40960 -> 53248 bytes models/selftestcovid19.sql | 68 ++ requirements.txt | 2 +- .../GestioneDisponibilit\303\240Routes.py" | 12 + routes/GestioneEsitiTamponiRoutes.py | 7 + routes/GestioneFarmaciaRoutes.py | 14 + routes/GestionePazienteRegistratoRoutes.py | 12 + routes/GestionePrenotazioniRoutes.py | 16 + routes/MLModelRoutes.py | 6 + routes/MainHandlerRoutes.py | 8 + ...isponibilit\303\240Routes.cpython-310.pyc" | Bin 0 -> 1014 bytes ...GestioneEsitiTamponiRoutes.cpython-310.pyc | Bin 0 -> 601 bytes .../GestioneFarmaciaRoutes.cpython-310.pyc | Bin 0 -> 948 bytes .../GestioneFarmacia_bp.cpython-310.pyc | Bin 0 -> 1023 bytes ...nePazienteRegistratoRoutes.cpython-310.pyc | Bin 0 -> 1013 bytes ...GestionePrenotazioniRoutes.cpython-310.pyc | Bin 0 -> 1389 bytes .../__pycache__/MLModelRoutes.cpython-310.pyc | Bin 0 -> 459 bytes routes/__pycache__/MLModel_bp.cpython-310.pyc | Bin 0 -> 462 bytes .../MainHandlerRoutes.cpython-310.pyc | Bin 0 -> 564 bytes .../SelfTestCOVID19_bp.cpython-310.pyc | Bin 0 -> 1022 bytes selftestcovid19.sql | 82 -- .../creazioneDisponibilitaTamponi.html | 12 + .../dashboardPaziente.html | 8 +- 43 files changed, 1031 insertions(+), 783 deletions(-) create mode 100644 __pycache__/config.cpython-310.pyc create mode 100644 config.py create mode 100644 "controllers/GestioneDisponibilit\303\240Controller.py" create mode 100644 controllers/GestioneEsitiTamponiController.py create mode 100644 controllers/GestioneFarmaciaController.py create mode 100644 controllers/GestionePazienteRegistratoController.py create mode 100644 controllers/GestionePrenotazioniController.py create mode 100644 controllers/MLModelController.py create mode 100644 controllers/MainHandlerController.py create mode 100644 "controllers/__pycache__/GestioneDisponibilit\303\240Controller.cpython-310.pyc" create mode 100644 controllers/__pycache__/GestioneEsitiTamponiController.cpython-310.pyc create mode 100644 controllers/__pycache__/GestioneFarmaciaController.cpython-310.pyc create mode 100644 controllers/__pycache__/GestionePazienteRegistratoController.cpython-310.pyc create mode 100644 controllers/__pycache__/GestionePrenotazioniController.cpython-310.pyc create mode 100644 controllers/__pycache__/MLModelController.cpython-310.pyc create mode 100644 controllers/__pycache__/MainHandlerController.cpython-310.pyc delete mode 100644 init_db.py create mode 100644 models/DB.py create mode 100644 models/__pycache__/DB.cpython-310.pyc rename selftestcovid19.db => models/selftestcovid19.db (57%) create mode 100644 models/selftestcovid19.sql create mode 100644 "routes/GestioneDisponibilit\303\240Routes.py" create mode 100644 routes/GestioneEsitiTamponiRoutes.py create mode 100644 routes/GestioneFarmaciaRoutes.py create mode 100644 routes/GestionePazienteRegistratoRoutes.py create mode 100644 routes/GestionePrenotazioniRoutes.py create mode 100644 routes/MLModelRoutes.py create mode 100644 routes/MainHandlerRoutes.py create mode 100644 "routes/__pycache__/GestioneDisponibilit\303\240Routes.cpython-310.pyc" create mode 100644 routes/__pycache__/GestioneEsitiTamponiRoutes.cpython-310.pyc create mode 100644 routes/__pycache__/GestioneFarmaciaRoutes.cpython-310.pyc create mode 100644 routes/__pycache__/GestioneFarmacia_bp.cpython-310.pyc create mode 100644 routes/__pycache__/GestionePazienteRegistratoRoutes.cpython-310.pyc create mode 100644 routes/__pycache__/GestionePrenotazioniRoutes.cpython-310.pyc create mode 100644 routes/__pycache__/MLModelRoutes.cpython-310.pyc create mode 100644 routes/__pycache__/MLModel_bp.cpython-310.pyc create mode 100644 routes/__pycache__/MainHandlerRoutes.cpython-310.pyc create mode 100644 routes/__pycache__/SelfTestCOVID19_bp.cpython-310.pyc delete mode 100644 selftestcovid19.sql diff --git a/__pycache__/config.cpython-310.pyc b/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33da8c51165fd2106f6bac8dc2d8d723e01c20d5 GIT binary patch literal 316 zcmYjL!AiqG5ZxrzhCpwgJnglIip@zy#F%W_pd^yrSPToLX4kUNW<%BreuZ~W_2_r_ z7rA=s2Y7e%E zYxq)ajO1A@qgFjjJi= 60: + minutes1-=60 + hours1+=1 + + ore.append(hours1) + minuti.append(minutes1) + + ora_splittata = [] + for i in range(len(ore)): + if (minuti[i]==0): + ora_splittata.append(str(ore[i])+':'+str(minuti[i])+'0') + else: + ora_splittata.append(str(ore[i])+':'+str(minuti[i])) + + return ora_splittata + +def creaDisponibilitaTamponi(): + msg_error = "" + if 'loggedin' in session: + connection = connectDB() + tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + totaleRapido = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchall() + totaleMolecolare = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchall() + connection.close() + + if request.method == "POST": + NomeTampone = request.form['NomeTampone'] + Tipo= request.form['Tipo'] + N_pezzi = request.form['N_pezzi'] + Giorno = request.form['Giorno'] + OraInizio = request.form['OraInizio'] + OraFine = request.form['OraFine'] + Prezzo = request.form['Prezzo'] + + connection = connectDB() + cursor = connection.cursor() + + try: + cursor.execute('INSERT INTO Tamponi (NomeTampone, Tipo, N_pezzi, Giorno, OraInizio, OraFine, Prezzo, ID_Farmacia) VALUES (?,?,?,?,?,?,?,?)', (NomeTampone,Tipo,N_pezzi,Giorno,OraInizio,OraFine,Prezzo,session['id'],)) + ID_Tampone = cursor.lastrowid + FasceOrarie=splittime(OraInizio,OraFine) + for Orario in FasceOrarie: + connection.execute('INSERT INTO Orari (ID_Tampone, Orario, Giorno) VALUES (?,?,?)', (ID_Tampone,Orario,Giorno,)) + connection.commit() + except: + msg_error = "Tampone già presente nel sistema, se si vuole aggiornare la disponibilità andare in Modifica disponibilità tamponi" + tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + totaleRapido = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchall() + totaleMolecolare = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchall() + connection.close() + return render_template('/FarmaciaView/creazioneDisponibilitaTamponi.html',tamponi=tamponi, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare, msg_error=msg_error) + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/creazioneDisponibilitaTamponi.html',tamponi=tamponi, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare, msg_error=msg_error) + +def modificaDisponibilitaTamponi(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/modificaDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) + +def aggiornaTamponi(ID_tamponi): + msg = "" + if 'loggedin' in session: + if request.method == "POST": + NomeTampone = request.form['NomeTampone'] + Tipo = request.form['Tipo'] + N_pezzi = request.form['N_pezzi'] + Giorno = request.form['Giorno'] + OraInizio = request.form['OraInizio'] + OraFine = request.form['OraFine'] + Prezzo = request.form['Prezzo'] + connection = connectDB() + connection.execute('UPDATE Tamponi SET NomeTampone = ?, Tipo = ?, N_pezzi = ?, Giorno = ?, OraInizio = ?, OraFine = ?, Prezzo = ? WHERE ID = ?', (NomeTampone,Tipo,N_pezzi,Giorno,OraInizio,OraFine,Prezzo,ID_tamponi)) + connection.execute('DELETE FROM Orari WHERE ID_Tampone = ?', (ID_tamponi,)) + FasceOrarie=splittime(OraInizio,OraFine) + for Orario in FasceOrarie: + connection.execute('INSERT INTO Orari (ID_Tampone, Orario, Giorno) VALUES (?,?,?)', (ID_tamponi,Orario,Giorno,)) + connection.commit() + tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + msg = "Aggiornamento del tampone " + NomeTampone + " è avvenuto con successo!" + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/modificaDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) + +def rimozioneTamponi(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/rimozioneDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) + +def rimuoviTamponi(ID_tamponi): + msg = "" + if 'loggedin' in session: + connection = connectDB() + connection.execute('DELETE FROM Tamponi WHERE ID = ?', (ID_tamponi,)) + connection.execute('DELETE FROM Orari WHERE ID_Tampone = ?', (ID_tamponi,)) + connection.commit() + tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + msg = "Rimozione del tampone nr. " + str(ID_tamponi) + " è avvenuto con successo!" + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/rimozioneDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) + +def loginFarmacia(): + msg = "" + if request.method == 'POST': + Email = request.form['Email'] + PWD = request.form['PWD'] + connection = connectDB() + account = connection.execute('SELECT * FROM Farmacie WHERE Email = ? AND PWD = ?', (Email, PWD,)).fetchone() + + if account: + session['loggedin'] = True + session['id'] = account['ID'] + session['username'] = account['Email'] + connection = connectDB() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ? AND Prenotazioni.Giorno >= DATE()',(session['id'],)).fetchall() + totaleRapido = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchone() + totaleMolecolare = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchone() + connection.close() + return render_template('/FarmaciaView/dashboardFarmacia.html', nomefarmacia=account['NomeFarmacia'], prenotazioni=prenotazioni, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare) + else: + msg = 'Credenziali inserite non valide!' + + return render_template('/FarmaciaView/loginFarmacia.html',msg=msg) + +def dashFarmacia(): + if 'loggedin' in session: + connection = connectDB() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ? AND Prenotazioni.Giorno >= DATE()',(session['id'],)).fetchall() + nomefarmacia = connection.execute('SELECT (NomeFarmacia) FROM Farmacie WHERE ID = ?',(session['id'],)).fetchone() + totaleRapido = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE Tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchone() + totaleMolecolare = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE Tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchone() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/dashboardFarmacia.html', nomefarmacia=nomefarmacia['NomeFarmacia'], prenotazioni=prenotazioni, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare) \ No newline at end of file diff --git a/controllers/GestioneEsitiTamponiController.py b/controllers/GestioneEsitiTamponiController.py new file mode 100644 index 0000000..6f34577 --- /dev/null +++ b/controllers/GestioneEsitiTamponiController.py @@ -0,0 +1,23 @@ +from flask import render_template, redirect, request, session +from models.DB import connectDB + +def aggiuntaEsitoTamponi(): + if 'loggedin' in session: + connection = connectDB() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/aggiuntaEsitoTampone.html', prenotazioni=prenotazioni) + +def aggiungiEsitoTamponi(ID): + if 'loggedin' in session: + if request.method == "POST": + EsitoTampone = request.form['EsitoTampone'] + connection = connectDB() + connection.execute('UPDATE Prenotazioni SET EsitoTampone = ? WHERE ID = ?', (EsitoTampone,ID)) + connection.commit() + connection.close() + else: + return redirect('/loginFarmacia') + return redirect('/aggiuntaEsitoTamponi') \ No newline at end of file diff --git a/controllers/GestioneFarmaciaController.py b/controllers/GestioneFarmaciaController.py new file mode 100644 index 0000000..701c796 --- /dev/null +++ b/controllers/GestioneFarmaciaController.py @@ -0,0 +1,120 @@ +from flask import render_template, redirect, request, session +from models.DB import connectDB + +def loginAdmin(): + msg = "" + if request.method == 'POST': + Username = request.form['Username'] + PWD = request.form['PWD'] + connection = connectDB() + account = connection.execute('SELECT * FROM Admin WHERE Username = ? AND PWD = ?', (Username, PWD,)).fetchone() + connection.close() + + if account: + session['loggedin'] = True + session['id'] = account['ID'] + session['id'] = account['Username'] + return redirect('/dashboardAdmin') + else: + msg = 'Credenziali inserite non valide!' + + return render_template('/AdminView/loginAdmin.html',msg=msg) + +def logout(): + session.pop('loggedin', None) + session.pop('id', None) + session.pop('username', None) + return redirect('/') + +def dashAdmin(): + if 'loggedin' in session: + connection = connectDB() + farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() + connection.close() + else: + return redirect('/loginAdmin') + return render_template('/AdminView/dashboardAdmin.html', farmacie=farmacie) + +def creaFarmacia(): + if 'loggedin' in session: + if request.method == "POST": + NomeFarmacia = request.form['NomeFarmacia'] + Citta = request.form['Citta'] + CAP = request.form['CAP'] + Indirizzo = request.form['Indirizzo'] + Email = request.form['Email'] + PWD = request.form['PWD'] + connection = connectDB() + connection.execute('INSERT INTO Farmacie (NomeFarmacia, Citta, CAP, Indirizzo, Email, PWD) VALUES (?,?,?,?,?,?)', (NomeFarmacia,Citta,CAP,Indirizzo,Email,PWD)) + connection.commit() + connection.close() + return redirect('/dashboardAdmin') + else: + return redirect('/loginAdmin') + return render_template('/AdminView/creaFarmacia.html') + +def ricercaFarmacia(): + if 'loggedin' in session: + if request.method == "POST": + NomeFarmacia = request.form['NomeFarmacia'] + Citta = request.form['Citta'] + CAP = request.form['CAP'] + connection = connectDB() + farmacie = connection.execute('SELECT * FROM Farmacie WHERE (NomeFarmacia = ? OR Citta = ? OR CAP = ?)', (NomeFarmacia,Citta,CAP,)).fetchall() + connection.close() + return render_template('/AdminView/listaFarmacie.html', farmacie=farmacie) + else: + return redirect('/loginAdmin') + return render_template('/AdminView/ricercaFarmacia.html') + +def modificaFarmacia(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() + connection.close() + else: + return redirect('/loginAdmin') + return render_template('/AdminView/modificaFarmacia.html', farmacie=farmacie, msg=msg) + +def aggiornaFarmacia(ID): + msg = "" + if 'loggedin' in session: + if request.method == "POST": + NomeFarmacia = request.form['NomeFarmacia'] + Citta = request.form['Citta'] + CAP = request.form['CAP'] + Email = request.form['Email'] + PWD = request.form['PWD'] + connection = connectDB() + connection.execute('UPDATE Farmacie SET NomeFarmacia = ?, Citta = ?, CAP = ?, Email = ?, PWD = ? WHERE ID = ?', (NomeFarmacia,Citta,CAP,Email,PWD,ID)) + connection.commit() + farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() + connection.close() + msg = "Aggiornamento della farmacia " + NomeFarmacia + " è avvenuto con successo!" + else: + return redirect('/loginAdmin') + return render_template('/AdminView/modificaFarmacia.html', farmacie=farmacie, msg=msg) + +def rimozioneFarmacia(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() + connection.close() + else: + return redirect('/loginAdmin') + return render_template('/AdminView/rimozioneFarmacia.html', farmacie=farmacie, msg=msg) + +def rimuoviFarmacia(ID): + msg = "" + if 'loggedin' in session: + connection = connectDB() + connection.execute('DELETE FROM Farmacie WHERE ID = ?', (ID,)) + connection.commit() + farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() + connection.close() + msg = "Rimozione della farmacia nr. " + str(ID) + " è avvenuta con successo!" + else: + return redirect('/loginAdmin') + return render_template('/AdminView/rimozioneFarmacia.html', farmacie=farmacie, msg=msg) \ No newline at end of file diff --git a/controllers/GestionePazienteRegistratoController.py b/controllers/GestionePazienteRegistratoController.py new file mode 100644 index 0000000..b48809a --- /dev/null +++ b/controllers/GestionePazienteRegistratoController.py @@ -0,0 +1,114 @@ +from flask import render_template, redirect, request, session, Response +from fpdf import FPDF +from models.DB import connectDB + +def loginPaziente(): + msg = "" + if request.method == 'POST': + Email = request.form['Email'] + PWD = request.form['PWD'] + connection = connectDB() + account = connection.execute('SELECT * FROM Pazienti WHERE Email = ? AND PWD = ?', (Email, PWD,)).fetchone() + + if account: + session['loggedin'] = True + session['id'] = account['ID'] + session['username'] = account['Email'] + connection = connectDB() + esito = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone, EsitoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID_Paziente = ?',(session['id'],)).fetchall() + connection.close() + return render_template('/PazienteRegistratoView/dashboardPaziente.html', nomePaziente=account['Nome'], esito=esito) + else: + msg = 'Credenziali inserite non valide!' + return render_template('/PazienteRegistratoView/loginPaziente.html',msg=msg) + +def dashPaziente(): + if 'loggedin' in session: + connection = connectDB() + esito = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone, EsitoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email=?',(session['id'],)).fetchall() + nomepaziente = connection.execute('SELECT Nome FROM Pazienti WHERE ID = ?',(session['id'],)).fetchone() + connection.close() + else: + return redirect('/loginPaziente') + return render_template('/PazienteRegistratoView/dashboardPaziente.html', nomePaziente=nomepaziente['Nome'], esito=esito) + +def download_report(ID): + pdf = FPDF() + pdf.add_page() + + page_width = pdf.w - 2 * pdf.l_margin + + pdf.set_font('Arial','B',14.0) + pdf.cell(page_width, 0.0, 'CERTIFICATO TAMPONE', align='C') + pdf.ln(10) + + pdf.set_font('Arial', '', 12) + + connection = connectDB() + infopaziente = connection.execute('SELECT Nome,Cognome,Giorno,TipoTampone,EsitoTampone,NomeFarmacia FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID = ? AND Farmacie.ID = Prenotazioni.ID_Farmacia',(ID,)).fetchone() + connection.close() + + #Non sono riuscito (a volo dopo la partita, non so cosa sto sbagliando) a far passare i dati indicati + pdf.cell(page_width, 0.0, 'GENTILE ' + str(infopaziente['Nome']) + ' ' + str(infopaziente['Cognome']) + ',', align='L') + pdf.ln(7) + pdf.cell(page_width, 0.0, 'Il tampone ' + str(infopaziente['TipoTampone']) + ' somministrato ', align='L') + pdf.ln(7) + pdf.cell(page_width, 0.0, 'nella Farmacia ' + str(infopaziente['NomeFarmacia']) + ' in data ' + str(infopaziente['Giorno']) + ' è risultato ' + str(infopaziente['EsitoTampone']), align='L') + + pdf.ln(10) + + pdf.set_font('Arial','',10.0) + pdf.cell(page_width, 0.0, '- La si ringrazia per aver scelto la nostra farmacia -', align='C') + + return Response(pdf.output(dest='S').encode('latin-1'), mimetype='application/pdf', headers={'Content-Disposition':'attachment;filename=certificato_tampone_selftestCOVID19.pdf'}) + +def modificaPrenotazionePaziente(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email= ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginPaziente') + return render_template('/PazienteRegistratoView/modificaPrenotazionepaziente.html', prenotazioni=prenotazione, msg=msg) + +def aggiornaPrenotazionePaziente(ID): + msg = "" + if 'loggedin' in session: + if request.method == "POST": + Giorno = request.form['Giorno'] + Ora = request.form['Ora'] + connection = connectDB() + connection.execute('UPDATE Prenotazioni SET Giorno = ?, Ora = ? WHERE ID = ?', (Giorno,Ora,ID)) + connection.commit() + prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID_Paziente = ?',(session['id'],)).fetchall() + connection.close() + msg = "Aggiornamento della prenotazione nr. " + str(ID) + " è avvenuta con successo!" + else: + return redirect('/loginPaziente') + return render_template('/PazienteRegistratoView/modificaPrenotazionepaziente.html', prenotazioni=prenotazione, msg=msg) + +def rimozionePrenotazionePaziente(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID_Paziente = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginPaziente') + return render_template('/PazienteRegistratoView/rimozionePrenotazionePaziente.html', prenotazioni=prenotazione, msg=msg) + +def rimuoviPrenotazionePaziente(ID): + msg = "" + if 'loggedin' in session: + connection = connectDB() + ID_tampone = connection.execute('SELECT ID_Tampone FROM Prenotazioni WHERE ID = ?', (ID,)).fetchone() + connection.execute('DELETE FROM Prenotazioni WHERE ID = ?', (ID,)) + connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi + 1 WHERE ID = ?', (ID_tampone['ID_Tampone'],)) + connection.commit() + prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID_Paziente = ?',(session['id'],)).fetchall() + connection.close() + msg = "Rimozione della prenotazione nr. " + str(ID) + " è avvenuta con successo!" + else: + return redirect('/loginPaziente') + return render_template('/PazienteRegistratoView/rimozionePrenotazionePaziente.html', prenotazioni=prenotazione, msg=msg) \ No newline at end of file diff --git a/controllers/GestionePrenotazioniController.py b/controllers/GestionePrenotazioniController.py new file mode 100644 index 0000000..1316284 --- /dev/null +++ b/controllers/GestionePrenotazioniController.py @@ -0,0 +1,213 @@ +from flask import render_template, redirect, request, session +from models.DB import connectDB +import smtplib, ssl, qrcode, os +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from email.mime.image import MIMEImage + +def sendmail(id, receiver_mail,info_prenotazione): + port = 465 + smtp_server = "authsmtp.securemail.pro" + sender_email = "no-reply@selftestcovid19.it" + password = "ProgettoSAD" + + msg = MIMEMultipart() + msg['From'] = 'Prenotazione SelfTestCOVID19 <' + sender_email + '>' + msg['To'] = receiver_mail + msg['Subject'] = 'PRENOTAZIONE EFFETTUATA CON SUCCESSO - SELFTESTCOVID19' + + html1 = """\ + + + +

Prenotazione avvenuta con successo

+ + + """ + + html2 = """\ + + + +

Accedi con le credenziali inserite durante la prenotazione all'area Il Mio Profilo per modificare o rimuovere la prenotazione

+

Non rispondere a questo messaggio

+ + + """ + + head_msg = MIMEText(html1, 'html') + messaggio = MIMEText(info_prenotazione) + footer_msg = MIMEText(html2, 'html') + msg.attach(head_msg) + msg.attach(messaggio) + msg.attach(footer_msg) + + filename = "qr-code-selftestcovid19.png" + img = qrcode.make(id) + img.save(filename) + with open('qr-code-selftestcovid19.png', 'rb') as fp: + img = MIMEImage(fp.read()) + img.add_header('Content-Disposition', 'attachment', filename="qr-code-selftestcovid19.png") + msg.attach(img) + os.remove("qr-code-selftestcovid19.png") + + context = ssl.create_default_context() + with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: + server.login(sender_email, password) + server.sendmail(sender_email, receiver_mail, msg.as_string()) + +def dispRapido(): + if request.method == "POST": + NomeFarmacia = request.form['NomeFarmacia'] + Citta = request.form['Citta'] + CAP = request.form['CAP'] + connection = connectDB() + tamponi_disponibili = connection.execute('SELECT Tamponi.ID AS ID_tampone,Farmacie.ID AS ID_farmacia,Farmacie.NomeFarmacia,Farmacie.Citta,Farmacie.Indirizzo,Tamponi.NomeTampone,Tamponi.Giorno,Tamponi.OraInizio,Tamponi.OraFine,Tamponi.Prezzo FROM Farmacie INNER JOIN Tamponi ON Farmacie.ID=Tamponi.ID_Farmacia AND Tamponi.Giorno >= DATE() AND N_Pezzi > 0 AND Tipo = ? AND (NomeFarmacia = ? OR Citta = ? OR CAP = ?)', ('Rapido',NomeFarmacia,Citta,CAP,)).fetchall() + connection.close() + return render_template('/PazienteView/prenota.html', tamponi_disponibili=tamponi_disponibili, tipo="rapido") + return render_template('/PazienteView/disponibilitaRapido.html') + +def prenotaNuovo(ID_farmacia,ID_tampone,Giorno): + connection = connectDB() + Orari = connection.execute('SELECT Orario FROM Orari WHERE ID_Tampone = ? AND Giorno = ?',(ID_tampone,Giorno,)).fetchall() + connection.close() + return render_template('/PazienteView/prenotaNuovo.html', ID_farmacia=ID_farmacia, ID_tampone=ID_tampone, Giorno=Giorno, Orari=Orari) + +def confermaPrenotaNuovo(ID_farmacia,ID_tampone,Giorno): + if request.method == 'POST': + Ora = request.form['Ora'] + Nome = request.form['Nome'] + Cognome = request.form['Cognome'] + Email = request.form['Email'] + PWD = request.form['PWD'] + CodiceFiscale = request.form['CodiceFiscale'] + Telefono = request.form['Telefono'] + + connection = connectDB() + tipoTampone = connection.execute('SELECT Tipo FROM Tamponi WHERE ID = ?',(ID_tampone,)).fetchone() + cursor = connection.cursor() + cursor.execute('INSERT INTO Pazienti (Nome, Cognome, Email, PWD, CodiceFiscale, Telefono) VALUES (?,?,?,?,?,?)', (Nome,Cognome,Email,PWD,CodiceFiscale,Telefono,)) + ID_Paziente = cursor.lastrowid + cursor.execute('INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Paziente, ID_Tampone) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)', (Nome,Cognome,Email,CodiceFiscale,Telefono,Giorno,Ora,tipoTampone['Tipo'],'Da effettuare',ID_farmacia,ID_Paziente,ID_tampone,)) + ID_Prenotazione = cursor.lastrowid + connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi - 1 WHERE ID = ?', (ID_tampone,)) + connection.execute('DELETE FROM Orari WHERE ID_Tampone = ? AND Giorno = ? AND Orario = ?', (ID_tampone,Giorno,Ora,)) + infoFarmacia = connection.execute('SELECT NomeFarmacia,Citta,Indirizzo FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID = ?',(ID_Prenotazione,)).fetchone() + connection.commit() + connection.close() + info_prenotazione = "Gentile " + Nome + " " + Cognome + ",\nLe confermiamo che la prenotazione è avvenuta con successo. \nLa prenotazione è il giorno " + Giorno + " alle ore " + Ora + " alla Farmacia " + infoFarmacia['NomeFarmacia'] + " - " + infoFarmacia['Citta'] + " - " + infoFarmacia['Indirizzo'] + "\nLe alleghiamo il QR Code da mostrare in farmacia. \n\nCordiali Saluti, \nSelfTestCOVID19" + sendmail(ID_Prenotazione, Email, info_prenotazione) + return render_template('/PazienteView/riepilogoPrenotazione.html',Nome=Nome,Cognome=Cognome,Email=Email,CodiceFiscale=CodiceFiscale,Telefono=Telefono,Giorno=Giorno,Ora=Ora,Tipo=tipoTampone['Tipo']) + +def prenotaRegistrato(ID_farmacia,ID_tampone,Giorno): + msg = "" + connection = connectDB() + Orari = connection.execute('SELECT Orario FROM Orari WHERE ID_Tampone = ? AND Giorno = ?',(ID_tampone,Giorno,)).fetchall() + connection.close() + return render_template('/PazienteView/prenotaRegistrato.html', ID_farmacia=ID_farmacia, ID_tampone=ID_tampone, Giorno=Giorno, Orari=Orari,msg=msg) + +def confermaPrenotaRegistrato(ID_farmacia,ID_tampone,Giorno): + msg = "" + connection = connectDB() + Orari = connection.execute('SELECT Orario FROM Orari WHERE ID_Tampone = ? AND Giorno = ?',(ID_tampone,Giorno,)).fetchall() + connection.close() + + if request.method == 'POST': + Ora = request.form['Ora'] + Email = request.form['Email'] + PWD = request.form['PWD'] + connection = connectDB() + account = connection.execute('SELECT * FROM Pazienti WHERE Email = ? AND PWD = ?', (Email, PWD,)).fetchone() + + if account: + tipoTampone = connection.execute('SELECT Tipo FROM Tamponi WHERE ID = ?',(ID_tampone,)).fetchone() + cursor = connection.cursor() + cursor.execute('INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Paziente, ID_Tampone) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)', (account['Nome'],account['Cognome'],account['Email'],account['CodiceFiscale'],account['Telefono'],Giorno,Ora,tipoTampone['Tipo'],'Da effettuare',ID_farmacia,account['ID'],ID_tampone,)) + ID_Prenotazione = cursor.lastrowid + connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi - 1 WHERE ID = ?', (ID_tampone,)) + connection.execute('DELETE FROM Orari WHERE ID_Tampone = ? AND Giorno = ? AND Orario = ?', (ID_tampone,Giorno,Ora,)) + info = connection.execute('SELECT Nome, Cognome, NomeFarmacia, Citta, Indirizzo FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID = ?',(ID_Prenotazione,)).fetchone() + connection.commit() + connection.close() + info_prenotazione = "Gentile " + info['Nome'] + " " + info['Cognome'] + ",\nLe confermiamo che la prenotazione è avvenuta con successo. \nLa prenotazione è il giorno " + Giorno + " alle ore " + Ora + " alla Farmacia " + info['NomeFarmacia'] + " - " + info['Citta'] + " - " + info['Indirizzo'] + "\nLe alleghiamo il QR Code da mostrare in farmacia. \n\nCordiali Saluti, \nSelfTestCOVID19" + sendmail(ID_Prenotazione, Email, info_prenotazione) + return render_template('/PazienteView/riepilogoPrenotazione.html',Nome=account['Nome'],Cognome=account['Cognome'],Email=account['Email'],CodiceFiscale=account['CodiceFiscale'],Telefono=account['Telefono'],Giorno=Giorno,Ora=Ora,Tipo=tipoTampone['Tipo']) + else: + msg = 'Credenziali inserite non valide!' + return render_template('/PazienteView/prenotaRegistrato.html', ID_farmacia=ID_farmacia, ID_tampone=ID_tampone, Giorno=Giorno, Orari=Orari, msg=msg) + +def dispMolecolare(): + if request.method == "POST": + NomeFarmacia = request.form['NomeFarmacia'] + Citta = request.form['Citta'] + CAP = request.form['CAP'] + connection = connectDB() + tamponi_disponibili = connection.execute('SELECT Tamponi.ID AS ID_tampone,Farmacie.ID AS ID_farmacia,Farmacie.NomeFarmacia,Farmacie.Citta,Tamponi.NomeTampone,Tamponi.Giorno,Tamponi.OraInizio,Tamponi.OraFine,Tamponi.Prezzo FROM Farmacie INNER JOIN Tamponi ON Farmacie.ID=Tamponi.ID_Farmacia AND Tamponi.Giorno >= DATE() AND N_Pezzi > 0 AND Tipo = ? AND (NomeFarmacia = ? OR Citta = ? OR CAP = ?)', ('Molecolare',NomeFarmacia,Citta,CAP,)).fetchall() + connection.close() + return render_template('/PazienteView/prenota.html', tamponi_disponibili=tamponi_disponibili, tipo="molecolare") + return render_template('/PazienteView/disponibilitaMolecolare.html') + +def checkQRCode(): + if 'loggedin' in session: + connection = connectDB() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/checkQRCode.html', prenotazioni=prenotazioni) + +def modificaPrenotazioni(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/modificaPrenotazioni.html', prenotazioni=prenotazioni, msg=msg) + +def aggiornaPrenotazioni(ID): + msg = "" + if 'loggedin' in session: + if request.method == "POST": + Nome = request.form['Nome'] + Cognome = request.form['Cognome'] + Email = request.form['Email'] + CodiceFiscale = request.form['CodiceFiscale'] + Telefono = request.form['Telefono'] + Giorno = request.form['Giorno'] + Ora = request.form['Ora'] + connection = connectDB() + connection.execute('UPDATE Prenotazioni SET Nome = ?, Cognome = ?, Email = ?, CodiceFiscale = ?, Telefono = ?, Giorno = ?, Ora = ? WHERE ID = ?', (Nome,Cognome,Email,CodiceFiscale,Telefono,Giorno,Ora,ID)) + connection.commit() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + msg = "Aggiornamento della prenotazione nr. " + str(ID) + " è avvenuta con successo!" + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/modificaPrenotazioni.html', prenotazioni=prenotazioni, msg=msg) + +def rimozionePrenotazioni(): + msg = "" + if 'loggedin' in session: + connection = connectDB() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/rimozionePrenotazioni.html', prenotazioni=prenotazioni, msg=msg) + +def rimuoviPrenotazioni(ID): + msg = "" + if 'loggedin' in session: + connection = connectDB() + ID_tampone = connection.execute('SELECT ID_Tampone FROM Prenotazioni WHERE ID = ?', (ID,)).fetchone() + connection.execute('DELETE FROM Prenotazioni WHERE ID = ?', (ID,)) + connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi + 1 WHERE ID = ?', (ID_tampone['ID_Tampone'],)) + connection.commit() + prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() + connection.close() + msg = "Rimozione della prenotazione nr. " + str(ID) + " è avvenuta con successo!" + else: + return redirect('/loginFarmacia') + return render_template('/FarmaciaView/rimozionePrenotazioni.html', prenotazioni=prenotazioni, msg=msg) \ No newline at end of file diff --git a/controllers/MLModelController.py b/controllers/MLModelController.py new file mode 100644 index 0000000..a954372 --- /dev/null +++ b/controllers/MLModelController.py @@ -0,0 +1,54 @@ +from flask import render_template, request +import pickle + +# Apertura del model.pkl per estrarre i dati passati da myTraining.py +file = open('model.pkl', 'rb') +clf = pickle.load(file) +file.close() + +def covid_checker(): + if request.method == "POST": + myDict = request.form + breating = int(myDict['Breathing Problem']) + fever = int(myDict['Fever']) + dry = int(myDict['Dry Cough']) + sore = int(myDict['Sore throat']) + running = int(myDict['Running Nose']) + asthma = int(myDict['Asthma']) + chronic = int(myDict['Chronic Lung Disease']) + headache = int(myDict['Headache']) + heart = int(myDict['Heart Disease']) + diabetes = int(myDict['Diabetes']) + hyper = int(myDict['Hyper Tension']) + fatigue = int(myDict['Fatigue ']) + gastrointestinal = int(myDict['Gastrointestinal ']) + abroad = int(myDict['Abroad travel']) + contact = int(myDict['Contact with COVID Patient']) + attended = int(myDict['Attended Large Gathering']) + visited = int(myDict['Visited Public Exposed Places']) + family = int(myDict['Family working in Public Exposed Places']) + wearing = int(myDict['Wearing Masks']) + sanitization = int(myDict['Sanitization from Market']) + # Inferenza + inputFeatures = [breating, fever, dry, sore, running, asthma, chronic, headache, + heart, diabetes, hyper, fatigue, gastrointestinal, abroad, contact, + attended, visited, family, wearing, sanitization] + infProb =clf.predict_proba([inputFeatures])[0][1] + + # Verifica del risultato + if infProb >= 0 and infProb <= 0.50: + str1 = " Pertanto la tua situazione non desta preoccupazione verso l'infezione al SARS-CoV-2 (COVID-19). \ + Se comunque la preoccupazione sussiste è bene chiamare il proprio medico di fiducia/famiglia per informazioni \ + più dettagliate." + return render_template('/PazienteView/show.html', inf = round((infProb*100), 0), text = str1) + elif infProb > 0.50 and infProb <= 0.75: + str2 = " Pertanto la tua situazione è dubbia, riprova a fare il test oppure chiama il tuo medico di famiglia, \ + il tuo pediatra o la guardia medica per avere informazioni più dettagliate. Prenota un tampone RAPIDO presso una farmacia \ + nei pressi della tua zona." + return render_template('/PazienteView/showRapido.html', inf = round((infProb*100), 0), text = str2) + elif infProb > 0.75 and infProb <= 1: + str3 = " Pertanto la tua situazione suscita preoccupazione e per il test sei stato infettato dal SARS-CoV-2 (COVID-19). \ + Tuttavia, recati SOLO in farmacia per la prenotazione di un tampone MOLECOLARE e/o chiami al telefono il tuo medico di famiglia, \ + il tuo pediatra o la guardia medica. Oppure chiami il Numero Verde regionale oppure ancora al Numero di Pubblica utilità: 1500." + return render_template('/PazienteView/showMolecolare.html', inf = round((infProb*100), 0), text = str3) + return render_template('index.html') \ No newline at end of file diff --git a/controllers/MainHandlerController.py b/controllers/MainHandlerController.py new file mode 100644 index 0000000..bd17231 --- /dev/null +++ b/controllers/MainHandlerController.py @@ -0,0 +1,14 @@ +from flask import render_template, redirect, request, session +from models.DB import connectDB + +def about(): + return render_template('about.html') + +def scopri(): + return render_template('scopri.html') + +def listaFarmacie(): + connection = connectDB() + farmacie = connection.execute('SELECT ID, NomeFarmacia, Citta, Cap, Indirizzo, Email FROM Farmacie').fetchall() + connection.close() + return render_template('/listafarmacie.html', farmacie=farmacie) \ No newline at end of file diff --git "a/controllers/__pycache__/GestioneDisponibilit\303\240Controller.cpython-310.pyc" "b/controllers/__pycache__/GestioneDisponibilit\303\240Controller.cpython-310.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..cc3bebbb763fa3d07d22c11e181c32620008f0c3 GIT binary patch literal 5547 zcmb_g&2!t<5yt~S5ClO=R{W)Wv`FJ7Vj|nJ`jN!7lPDtPXvUUYk+P>8bv!U1B*P{F z<^fU?4mi^p_1Ii`>`A`W|3#<%1A51`hfdC!9IEM|zkL8HQgPhQw8UVsZ{Ne>eeC{r zmtm!1Dfs>E4`(~}TZ-~`YE1rAG(N!{Jp$nhXI-Vo+N`Ix)t=VYdU{)DBv-qIp3yeI zYh3@m(k}7>H}Euhk(+pyc!^thTD;6{Jj=Yot9aUchR@l%zQ>mT(247QZ zdO9P#fP3OW?DhIxH}+Cfc-$9WCr*pP`+VPvz(igY`C(9FX{i$i0XplSc4*?GpADvn zdlh$dmMKc29APO>*-%Yb&S^1ARIbh|his@zUXy$Qyq3!i$!GFnqVKVxnG`@viJllw zv}h?QB*iD1*h&gqe_t6E@GLwjh)?MG0kw6mL9Qp}k(%gF8B>xHxPs)SbVN&g%Fv3n z7-J9FA*(CDy*w-@rKCKM&3>YagTy*g<3eJR7uX%;8%bt}y8)82rJ9izqJGzpQ_TIU$u=#;l7BjwauO%?8hFsOtL(dEVs2#cx^)t@Y@wqAio>C zv70jgnIg_%M&JDfWcB*acI1g@XV2e{yq(R!s|)|Yb1pmE0iGiA zxPTWrxW~U)aAfP!&W~`2oDE?uv2vh@=P^4}h79(uaxGT4KCkSur|OaRRFPhwlEdb5 zHJ590bb%L7$#ux}rwW6`JvO)rYy2y?A}`Iu#wBNgGb9J=92O;KgEJ*p0aub-6`Uox z8F1zC98Jv19xNs{W;+Y7GLj-Jy_8rgLMrMsu~X(A>VWu<@Yp4F-N~ajE9Gk<;32y+~c`_e0X-tZdZ3r`yrUA9I$_rpUaH^SY_`(!M%eSRi9ytYlC+qAFg0%Zp$NjXv?<(m2?1#l>>43} zaaUkc;b5@7(QItBob?Sj(rAGT6G|5yQo88mN*A3>>7p}MDp^vx=wwP4C+A;t?ycP3 zZZw^Rj~Az|+VRcFZ$q8%odxV_z8a}k`1o}8#Z!uE`}=UMe5|wQ16%sSi@YHAoWSck zksl#Sxr+9;Rnv0ko&uS=X)dK%m4;US4Ss* z&-cE#+7X@$e4R!YH{Z-FkK$ezp|hC3oZ4|1yIn6o(b=puajvCawD-UhA{58ft1v}B z7=5f(6$PwW7$9lU`_k(GwNrD~i#w0pZZ|D-x*-sl&?_~1Ui>KJslFSEUTSmz^r1*g zT^C^?{KDrFtsoD3JwFx{orMNcn-%ZT>sB7Qu`01Zoi!rw5^;#UN#rL)-Xd~|$WMv9 zO=KCQZJiutT3&Objwg>8rYE1Fj2sy`kMZe6+QvzI9_=7~E2@L&z+Qu$XBTmqj1YM8 zGE|ePs)G?0de0JKPmG>p>Oaia=9u^Zil$JSmQCBbiu>EoKqgRnevE)GMrnzX6p0Bsar{8~cE(QSmS7$@GLwTw-8@ajqqq&?tm=y2d|25+A89gT9H|JiX54m_llp#vy!qWw+> zWkL9+w0?1&)cp#iW@n~Mm?f5oTq8mVmsvI?RpRGFUSQ+3N=hh`BWq^w4vl>|JV}@M zC5?NZ$cvm~W)vy1P4KrcFrpcdKTM(y@dkUHRdduaflnr|NBy1j7lN%0?(vWObA&eH zLo{BB5~l)<@O$CQ1C88NaT9vQM?_Bf{OnjmzOE-U=o2DqAXA=AM>3jel%O%;**}xG zs3t09uOn}hE#z6`JMbo%%gQHmS$GvZU3wKTbEu)WAib&xA4RuQyb)30%Mi8-3(9O~E<@T|=$f(|6M}KooT5Q-Dpno? zZGo_R;BXc|NhY}rYc=4dmS{&hFC?g^cd3%VzN6yRQMeni!HYK(RKY-8@FmGZ2YBm- z5}&+Xrr!MgfR(76NvF*#xqPJ8$mP{j@*?CwQy_AQ&)|Er^Ga4l@H3Q?Q|6DJS7eT^ zPT(j(Xj*9WT)&%YckkB+%hMToo*8-h;md&%8c;Z_!{-)}BU54M(M0JW3u;(3b zO)CRN21w1w!G0jem$~`muq!$Kest3z2w$j)*D+)929Y0u9ABCa^W2RdJq%sJM=70* z?Ws+0KN3CDQ#(L=H!m(y8+q+`Vke2%z*)r^dcnYVQBC^+R^?Of3$#6egnMreoawJm zC6ifR%B0cOESWUE2!QkS63K1m5+^83Ib+StjGod3u}*}rH7&ZGPPmWi``08oNgYq2 zQDtgEhZq}O0?~7THIT&VNa|$qJx=@1LuRX@g@IG;|Ff1dSAXt^gBehP%M`@d~ i5HW8+*?!mii1OU%EXYO0#!SpN%y&%7oX1_YFZ>%u#W5}b literal 0 HcmV?d00001 diff --git a/controllers/__pycache__/GestioneEsitiTamponiController.cpython-310.pyc b/controllers/__pycache__/GestioneEsitiTamponiController.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30a0cff83565da1207f6a1e40513637a934f827f GIT binary patch literal 1187 zcmZuv%We}f6t$hnWD?Q`Z`chBgn~q05)vR@X=YL)K~rU>REi>1!`Mkp=Mg*(k0@Qi zmVaoM?DzsU{Drry_y9I+;Cj+jLBgZC*Z11KK0f!P3kwwlM-G zvwL7DqBue^?&6qqNnGd_VxwzdohMN-HoGRw3)J|8x+PkqCU}dMJXEuO!f8}9)RJHc zWny2lco+qeDN8WQ1q-Dr3HD~hGMHp6%Xpg9uquaXlE9*~8R`PFp+OblZ@`~zf}vQV zw@6%-_#-+(6Ld@{kpSg7>f;k~TsT2T7_!C*!YDChks2Sdhoni16HLv|1R$2Sl@+Cf z0l-PdYo7buZTR+WyV+^Kuy+7;DuXeA;`ZJ%x8vF^XTKSUI0$)QKeC@F!s+kDRVcud zS$=$LbvAv;*}K(XFyNy^25!b>>Id;KP1wqTj3anxbvSoLtt9m8gb7BK*n1X^G*f*h z!-F7-R56Uwj0tEL5}Jw{QI%7o0HM$g{er|2xL@DEG#>PJVSCnt>oeACC(IH2Ewk^~ zy9sy!aK0bgl-t|EFpap~WY8fVrgp2wob~%qcBj+ca(%yTdv(X&Sld{?v$4_JW3TGN;Xb5#fK`e#iZrGz=s198 zniM`Ig*VRDSB4+drT_584R}{p1!G|oU%?e@kt!DFArWFQv!N+E6G{hyQ=#0H_%%r6 zkcb;FD`=q{VQGMP$b=k&JSHHQJ~<&6L2PQ-fG=q;Eo$cCv1n0y5RNE8Wo7KNJzrJl zyF0$SyW`Y-_g?{du5Zup()u}5l@3H1>Wwe|PcXbzo@zrApv;)bgOnmh6(MeMO|UuJ>1hN`-& F<-htBFya6J literal 0 HcmV?d00001 diff --git a/controllers/__pycache__/GestioneFarmaciaController.cpython-310.pyc b/controllers/__pycache__/GestioneFarmaciaController.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c831f20f301131d42561b8d1f08d9f89b35dbdb GIT binary patch literal 3920 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 H)NB6%)7@x= literal 0 HcmV?d00001 diff --git a/controllers/__pycache__/GestionePrenotazioniController.cpython-310.pyc b/controllers/__pycache__/GestionePrenotazioniController.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..566e019f4b67c888c3fdcb9fefb865ebdb74dda4 GIT binary patch literal 9291 zcmds7O>7%Uc4jx5WV89BU;oH|Q{&m$v1Vn-_Ref(W@U{v`tfLEQyP)Bvs`DjZB|oi zn`CpUTlNgM2?TI%3uA#Ca#|qLExrdxP62|w_#D50@&doeFQL51FY_xXFY$CWHUHM{u%gtw7EB1M!!5DrS?zAi^sGP^7Pp1f z@PeGMzC5&CFs|jgw$qtcf_%g2bntNfvkLA?_qXnE+&^r2cGnahDs-x-Szi&KCw{AK z?puvC4Ho@PqttP&;c_<>$W`g5x!Tuwx}V`%KkKDlrusRa@iXUAJbNzX=Xh>8^Rqj)op!!$F*8b4;$NXp4jYWUU2VT3iVhnFBldmi<9Z)f>ed6%1 zhqu&t`QR3Fy{}u=?W+x^<%mz%J0E=T(T7hy`tjA3W!DoA^&#lg(XELZda}OI0D8IA3L>*u@aeqq(w}!J=UK*VhCOxtg^DFGka9tzMmgV}s z%QCxz)vRJt+#XCu&a`E*229uL^lYP&SKGD&J!#r4=jsaEYO(va!=M&avAkriu&yOoEYG&X?WWy82g6x7gQvo7A3D#i za6xk1u_@5+jYn(SNG+8-FE=b4RzHtNZ}K^9iWY+K-SP!Eqh z-Hgb=l?n1`K{jk2WWN+NR-m=bXP~b69MtJr9g(MI8syH=H|Kk_`<4h)#|^SDR!A*K zyKXBui_L^P-s4u&goE9SMuRVgX}9brb-jAOwzF5Q-U~7hpt*svAwm@n}eQUzBOpX}b+cH@jj&iYgrDbxOR4+i(9K zWbKp34^Znq-nS23>+yESS{Il#oX3L>%^rL5+atzpRx!H{bbJ%)F6@TGwzeLxIe7fI zy1iL@w7R>&R(IDv->Pk_)gItxeWSW{xAJ(*1EJfU-R-+@SKAC;kKMX)>*n=aw;n&T zo~(Aed#HL$LKjY}MRU3f7fAjv;VW#?nDF^x_iJ$(OCT+9mq9co{AJZiMaNH5wY*{I ziV^)ZmAE2)lejMZhoR}}G`Lyi>VL|f8t7#3mjOpwMxgl(2k}x*6|Ou}#UePBt8=M7 z)u}uUPLZ4jPW93N)3gtm;~Ady2}aeXcB~#{07QVGqwFz36d=~uxX$yh5FFsnc&PwV z3Y9?H*{;@tV#R4&o2F=+4ciPdYc`A`NUyE#m@XU}2TEi#JsH@?l6YcGqFI*{Aa6T2czKc6*me84PY#cZi)2vb$#2=FZ85 zr5(UDyp#3Nwq7hnHoZvJS*OxlS10iMc0l5`)I zBK2N{-m8(`r={L&Tn%jk+Mj-vfzE4{ljTUEp(g?mDD^_}?9t~Na3|RCNay6X(4I$o zjjiduH7d|(M=HQWM@kYgcL6=bCJ-1yO9`@JKS4$g2hov$#fL81n&R`P_T=G#_I2v7Wtx84=?YD#$_0_}qhe4_wXP4O~rn;A*si ztI0?%1E+%s9*!srE+@GhI9+l&xV&^phHt@F;^Na>za*a)qNjM~tB9kKA9=BeaUzJ@$x8hHriBQq#fl(Q()D9@mr;AiJj;Ll0^e1e~o{DpHA z^BaB{>zSk+!7K2Kr>@}At9%u?1k~_yMZAwq2-47mKqJ2pV{dhfwTm0kOEVep$j`P-5HhwsehhtpnwgVkt=lhV4$tS0=LcZg8;g$2f!E(0YHn> zH#-SrF?tb_CEEbah7fi;3374{V@*kKPV~FL90bGcL}B0lDKvG#xQ7J9=`=0Tw#~M~ z8VA3hbNu$N*{RvpA~Wudr6*`=x7fbKa&}@cz>38jqy#4u#GCOfO(yZ>B#m%Rf=rMf zNaN%oO^V*!Kag`mk6!>$5t%b?vbKXD8QY3niN)?1GcgcKa+yO_&DNo3FEC>)1wOep z>f?oNb&(|PI|)fyF>J0wIAVhcIbZQPku4(9ZIhQ3_dw>05?}?6p;Cg-Yv}tUU`6a1 zWRcOkjtKHClM>MvHb<4yZrfgn4HSZg05LTV5OSok$=s#p!x<5V1O*BUB0CX3LrtCF zDz>6vf^LTTWz~z6OvC|@VASIn0?kHhVMgysETlENH$Y-&kIO8=U>z`@Rj%PG1Ec6( zS3XB@d_~cICw_sKMi7fYk}ypo7KH_Lq9nmz^EH6KIs*O~)WzVRj=(?Tr@8hj3%{GG z1SvuB`^oo4_qZFbdDq&vNo%|i%mLA3ID7~1ig$>tg3M>fpUX#Y1na5a8>Wd~Tso!H zAPvIoSw&C+Fd_lM>j7r}4KVw=O5kaRr;$Ybi>E!!a!MGok|Pw)Nsdq)*o`D2lx2<( zxk-Uk4p^P{^WvYSjP(e~sTSBx7}_uR1xO!lxG|RkEl7&K!2_@9lnzt{DjK{D{GPyW z;DilzF@_hO<`ECj9!?D~obIM2hG!!Tr4$bomBD+MYL~2B2rtyF{ znQlBJ?h%ncA@Wm@9$P!@kgS7ar{_2}1>vT(gQamO? zSSa)N&<#)g0s9}_;UH%=8qOgO6@EVGbq`#ik&`{uxz3F_*P(-I<3;xtNbETbdE{V7 zKcY!5duPPM?!d#|!a)T*%mH2_5e)v4$(5K#H4Xt-J_HW#GS{BZ_5xj^cY)0K^4=V^%d+(2;*GO7Fd|AdQf^g-ZV$#DktJSEO~3ZNt9r;cz&<>8~)TuQoW0B~PH ztwwITqj~u7Lnlu7^nwo`Jo`!o6z3{|j-YBEC*7Ts8)L3-7=gs@Z#0JeRJ?^*oRpX3 z*=QV|^sX$$tUNA3jM{ki#V!SeVQ#Jjak@<3KJ3>yL905|4W#J-t$SV#lkW~yj7hMN z7~wDR+%1CWu)4E2{L|HU7hY))pPDD8g zab_ZMW`VExqDaSj^Lm6Y&(Nu85g{1~@)IZTjS40{-cLk&b{NpALay^2deZ@UoerZN z8Pc34g4xsh`YXKoO<(L=#J+tcXKYHQ+%8e+6)Kt>Fs4!YX}4bW$2W^AtMpMEp_* zhX@X_iYhsZU(%AJ_(hW(okCqW2BnSLPoTEWm5w9F&ctM^k49_4^O0CspYhzrJY_wZ?)zlV3jb1a!?Q{_l1J5-zAyQ}m$ zM$p%gj^{9LQBoF#ui=Noj#y;hUcjo@oASQ5rSb_uD|bPV1W9`vgIEgi!&5Mcu7jg6 zd@1pSAcF}Fu^=qsrEU(Roi_>c%~m@rzcgWKNfEzB*Y5X0NM++>B`&kdCDfk9HL0k7 zrmIlpuhF!DYw$<&j160SiJSk{Ag_%YB)+IQQmV-*h3=aKCrwd!#Ep5NGpD{uUt7d; zBEJL~u{fGyJWcm6a0CAnTilBDKdO&oRF2$f;Cs@t24B*t25~n%r<@AbH>i=WUOvI8 zAcqagw=)0&4YfG=!&zG%-`hjGF(SLsc|qC@G6tNODZC`@rkt>wUJMNYfG8L^B@m5I zZb_qi?^>gOUk)-& z96~&kmKP2#t(H_L$iwGbEq8JKvk*EjqEgHeq0?n?4x~P7(JAI)+iqKn?f73vywFEoBpjteoGBw?N6v%iaX@#fJ~5O3@alQiLnw|q)|$hmy1Z)inN+* v=pfLSG5N!mwL&oDeh=h)s;Dr;#`M!w{fBx%&*~TSoPGsdUN`hJMdQB!0()KM literal 0 HcmV?d00001 diff --git a/controllers/__pycache__/MLModelController.cpython-310.pyc b/controllers/__pycache__/MLModelController.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d361b8fcfbdbccfe1a8d90116cd9692ea065307f GIT binary patch literal 2818 zcmb_eO>f)C874)2S+Np3QT&lM?d|8l=+>3&tP9&REX4r`1Hp(KNmG#= z?r>81GrJ+|mGL+!4!M%z75&!xa|9ai=ozx=Y~R+w{D zWtCU9TVs{0`YQ`I6~Fph%boK}J!`G@4y#yerRg2XBA?0UiiL4N6`R&1`yyqDI?U!m z;j>^Po&?j99C&)dSJwl87XEGglQ*_yDeE`3Z%<0{El}ywQcez+R;`!zrERcdaLM4Z z!H&TdgUbe24XzkmGq`GS-Qb$Ra|YK9ZWugg@GXNI2G1LO%iyNL^9J8GxM}bmgKrzW zVDKG-7Y$x8_^!c=2H!LIuE8yX?-_jG;8t$urQFHOc_pvrwY;9s<&FGSKA$)9+xeY* zAz#ez=J)c}sC9W?m9HxK{gM63_Lo*Ie|goqT*{aHrAbA8iTldLmS6g-m&>Z^KTtLF ze6MBsOD{|Lvj6?xIX%nRl;s=TAHw#H|AWgF*#7W6+m)|vA5O~hEo_%z`_?CytFZmx zJ=@j77X2T-v_Xy^9Zt(f-CjRi{FP)>jd?U8M^X#|7P^&PcE)5j*O3>bEz;3AyVVnt z5jB>As%-u^jUsJ-C=%vYw-YrEY1V3EG~yoFPchWt38NUTf6k~+y)nz0KvI1((BX8z z6iYC05i?2pEK0bDvidGne3UYhEk2=%l7dIDQaqvo$(q{(xZo2d=@|>M2W=54>M3&0 z)tI!qCwm=ogy}3&*~+$3n)W`~r*g!|69ma5+|C}J@PsQ29HoN*4)45(5eOaw>cO9n zc4^3i3vw>xL`TV^|6tgBhKRJq0Zk@Jw$h^!S3JY}MMQ>Dgcy($rX==`^-eb<{BiyD zv-F?1ks~G*jg%k(B`T!^UZpg{Y(^q1;UjEHV#$Q(rSWV4g-I~sBOVP|VT!!;wvT)3 zZE>=`MSg6uu)g`p+6K9P^%(I)m`2$5`gPx0HA$0%CyJ5Re+2h9>*#|d^b|3=g zi2&?1h07WoYWBk5wYt=w3e#%H)L8h_vfg=m$Ec~}1w*$98ey-h=hy=SDofh7B1Ibc zYY*INc+tU_TOVlQhkm)0q1JoX@#TeEPN4K|O%@XGRw2Pqcemyh>h9LZGeLJNKoZMf z0~jGkhZb_THpHqBaCc$!E&ax7M!vCHq1$eq&O~}zJ1azaTGgTwT)4IKLS5bY- zk#+Jk!d*gmUteiqJEXA)IN4?RT+&*%w|CkW7(VTFcl*yY*S3$_pYQc|+Wn_^=|POdn-M*G7CXZF=I2`_FN3dJ`t+5JU27G!46I&wt0?Lg}{Mu*?5yISWqNUU3%e zZ`!&o?_s&M#fgM7`F4#rd>M@;m zu|O%F;?$TLsW~-MYieO_H-w$mrZtdFYJEo2I<;vHxI^pI0p6gE3Fyo{jGX;WTO7T4F;IfhASq6vRcA^6;FI}Ju`^EuMK!Fz+ z5*foqGd{}a#l~roifb(OwQD3Bz$)_VD@gA1XkRg@q7yz>EE;9Zll(m+>tsIzE)_4n zT@uR4FrMXtlL3R8d6JVLh};~GqseFx9`wgP>5tvrAoSgE9~94@1UtiM;=dY%{v>oq zZvt=g8H9a39_{#HI3kn2M|w|to9n$^bij`Kv)Lh-B51Raxe&Uhy_jdaaYjLL|Cl#s zA4|Jx%!2xFbXN|RE5QB>jI6_{24qDg`AqT(5vkGoi^i>_C!ws}-qKF8rAZseKf!fU zon51@9s?=R1v*D(=n_+Wg)faObdEtYuMkFsMU68|%`XPLiZxug01BW)0' - msg['To'] = receiver_mail - msg['Subject'] = 'PRENOTAZIONE EFFETTUATA CON SUCCESSO - SELFTESTCOVID19' - - html1 = """\ - - - -

Prenotazione avvenuta con successo

- - - """ - - html2 = """\ - - - -

Accedi con le credenziali inserite durante la prenotazione all'area Il Mio Profilo per modificare o rimuovere la prenotazione

-

Non rispondere a questo messaggio

- - - """ - - head_msg = MIMEText(html1, 'html') - messaggio = MIMEText(info_prenotazione) - footer_msg = MIMEText(html2, 'html') - msg.attach(head_msg) - msg.attach(messaggio) - msg.attach(footer_msg) - - filename = "qr-code-selftestcovid19.png" - img = qrcode.make(id) - img.save(filename) - with open('qr-code-selftestcovid19.png', 'rb') as fp: - img = MIMEImage(fp.read()) - img.add_header('Content-Disposition', 'attachment', filename="qr-code-selftestcovid19.png") - msg.attach(img) - os.remove("qr-code-selftestcovid19.png") - - context = ssl.create_default_context() - with smtplib.SMTP_SSL(smtp_server, port, context=context) as server: - server.login(sender_email, password) - server.sendmail(sender_email, receiver_mail, msg.as_string()) - - -def splittime(ora_inizio,ora_fine): - x = ora_inizio.split(':') - y = ora_fine.split(':') - - hours1 = int(x[0]) - minutes1 = int(x[1]) - hours2 = int(y[0]) - minutes2 = int(y[1]) - - ore = [hours1] - minuti = [minutes1] - while hours1!=hours2 or minutes1!=minutes2: - minutes1+=15 - if minutes1 >= 60: - minutes1-=60 - hours1+=1 - - ore.append(hours1) - minuti.append(minutes1) - - ora_splittata = [] - for i in range(len(ore)): - if (minuti[i]==0): - ora_splittata.append(str(ore[i])+':'+str(minuti[i])+'0') - else: - ora_splittata.append(str(ore[i])+':'+str(minuti[i])) - - return ora_splittata - -# Applicazione FLASK -@app.route('/', methods=["GET", "POST"]) -def covid_checker(): - if request.method == "POST": - myDict = request.form - breating = int(myDict['Breathing Problem']) - fever = int(myDict['Fever']) - dry = int(myDict['Dry Cough']) - sore = int(myDict['Sore throat']) - running = int(myDict['Running Nose']) - asthma = int(myDict['Asthma']) - chronic = int(myDict['Chronic Lung Disease']) - headache = int(myDict['Headache']) - heart = int(myDict['Heart Disease']) - diabetes = int(myDict['Diabetes']) - hyper = int(myDict['Hyper Tension']) - fatigue = int(myDict['Fatigue ']) - gastrointestinal = int(myDict['Gastrointestinal ']) - abroad = int(myDict['Abroad travel']) - contact = int(myDict['Contact with COVID Patient']) - attended = int(myDict['Attended Large Gathering']) - visited = int(myDict['Visited Public Exposed Places']) - family = int(myDict['Family working in Public Exposed Places']) - wearing = int(myDict['Wearing Masks']) - sanitization = int(myDict['Sanitization from Market']) - # Inferenza - inputFeatures = [breating, fever, dry, sore, running, asthma, chronic, headache, - heart, diabetes, hyper, fatigue, gastrointestinal, abroad, contact, - attended, visited, family, wearing, sanitization] - infProb =clf.predict_proba([inputFeatures])[0][1] - - # Verifica del risultato - if infProb >= 0 and infProb <= 0.50: - str1 = " Pertanto la tua situazione non desta preoccupazione verso l'infezione al SARS-CoV-2 (COVID-19). \ - Se comunque la preoccupazione sussiste è bene chiamare il proprio medico di fiducia/famiglia per informazioni \ - più dettagliate." - return render_template('/PazienteView/show.html', inf = round((infProb*100), 0), text = str1) - elif infProb > 0.50 and infProb <= 0.75: - str2 = " Pertanto la tua situazione è dubbia, riprova a fare il test oppure chiama il tuo medico di famiglia, \ - il tuo pediatra o la guardia medica per avere informazioni più dettagliate. Prenota un tampone RAPIDO presso una farmacia \ - nei pressi della tua zona." - return render_template('/PazienteView/showRapido.html', inf = round((infProb*100), 0), text = str2) - elif infProb > 0.75 and infProb <= 1: - str3 = " Pertanto la tua situazione suscita preoccupazione e per il test sei stato infettato dal SARS-CoV-2 (COVID-19). \ - Tuttavia, recati SOLO in farmacia per la prenotazione di un tampone MOLECOLARE e/o chiami al telefono il tuo medico di famiglia, \ - il tuo pediatra o la guardia medica. Oppure chiami il Numero Verde regionale oppure ancora al Numero di Pubblica utilità: 1500." - return render_template('/PazienteView/showMolecolare.html', inf = round((infProb*100), 0), text = str3) - return render_template('index.html') - -@app.route('/About', methods=["GET", "POST"]) -def About(): - return render_template('about.html') +from models.DB import initDB -@app.route('/download/report/pdf/', methods=["GET", "POST"]) -def download_report(ID): - pdf = FPDF() - pdf.add_page() - - page_width = pdf.w - 2 * pdf.l_margin - - pdf.set_font('Arial','B',14.0) - pdf.cell(page_width, 0.0, 'CERTIFICATO TAMPONE', align='C') - pdf.ln(10) +app = Flask(__name__) +app.config.from_object('config') - pdf.set_font('Arial', '', 12) - - col_width = page_width/4 +app.register_blueprint(MainHandler_bp, url_prefix='/') +app.register_blueprint(GestioneFarmacia_bp, url_prefix='/') +app.register_blueprint(MLModel_bp, url_prefix='/') +app.register_blueprint(GestioneDisponibilità_bp, url_prefix='/') +app.register_blueprint(GestioneEsitiTamponi_bp, url_prefix='/') +app.register_blueprint(GestionePrenotazioni_bp, url_prefix='/') +app.register_blueprint(GestionePazienteRegistrato_bp, url_prefix='/') - connection = connectDB() - nomepaziente = connection.execute('SELECT Nome FROM Pazienti WHERE ID = ?',(ID,)).fetchone() - connection.close() +initDB() - #Non sono riuscito (a volo dopo la partita, non so cosa sto sbagliando) a far passare i dati indicati - pdf.cell(page_width, 0.0, 'GENTILE ' + str(nomepaziente) + ' Cognome', align='L') - pdf.ln(7) - pdf.cell(page_width, 0.0, 'Il tampone MOLECOLARE/RAPIDO somministrato ', align='L') - pdf.ln(7) - pdf.cell(page_width, 0.0, 'nella Farmacia XYZ in data XXYYZZ è risultato NEGATIVO', align='L') - #pdf.cell(page_width, 0.0, 'Il tampone' + str(tipoTampone) + ' effettuato nella Farmacia ' + str(nomefarmacia) + 'in data ' + str(data) +' è risultato ' + str(esitoTampone), align='L') +# Web Application FLASK - th = pdf.font_size +# ----------------------- MLMODEL ----------------------- +@app.route('/') +def covid_checker(): + return render_template('index.html') - pdf.ln(10) - - pdf.set_font('Arial','',10.0) - pdf.cell(page_width, 0.0, '- La si ringrazia per aver scelto la nostra farmacia -', align='C') - - return Response(pdf.output(dest='S').encode('latin-1'), mimetype='application/pdf', headers={'Content-Disposition':'attachment;filename=certificato_tampone_selftestCOVID19.pdf'}) +# ----------------------- MAIN HANDLER ----------------------- +@app.route('/about') +def about(): + return render_template('about.html') -@app.route('/scopri', methods=["GET", "POST"]) +@app.route('/scopri') def scopri(): return render_template('scopri.html') -@app.route('/listaFarmacie', methods=["GET", "POST"]) +@app.route('/listaFarmacie') def listaFarmacie(): - connection = connectDB() - farmacie = connection.execute('SELECT ID, NomeFarmacia, Citta, Cap, Indirizzo, Email FROM Farmacie').fetchall() - connection.close() - return render_template('/listafarmacie.html', farmacie=farmacie) + return render_template('/listafarmacie.html') -@app.route('/disponibilitaRapido', methods=["GET", "POST"]) + +# ----------------------- GESTIONE PRENOTAZIONI ----------------------- +@app.route('/disponibilitaRapido') def dispRapido(): - if request.method == "POST": - NomeFarmacia = request.form['NomeFarmacia'] - Citta = request.form['Citta'] - CAP = request.form['CAP'] - connection = connectDB() - tamponi_disponibili = connection.execute('SELECT Tamponi.ID AS ID_tampone,Farmacie.ID AS ID_farmacia,Farmacie.NomeFarmacia,Farmacie.Citta,Farmacie.Indirizzo,Tamponi.NomeTampone,Tamponi.Giorno,Tamponi.OraInizio,Tamponi.OraFine,Tamponi.Prezzo FROM Farmacie INNER JOIN Tamponi ON Farmacie.ID=Tamponi.ID_Farmacia AND Tamponi.Giorno >= DATE() AND N_Pezzi > 0 AND Tipo = ? AND (NomeFarmacia = ? OR Citta = ? OR CAP = ?)', ('Rapido',NomeFarmacia,Citta,CAP,)).fetchall() - connection.close() - return render_template('/PazienteView/prenota.html', tamponi_disponibili=tamponi_disponibili, tipo="rapido") return render_template('/PazienteView/disponibilitaRapido.html') -@app.route('////prenotaNuovo', methods=["GET","POST"]) -def prenotaNuovo(ID_farmacia,ID_tampone,Giorno): - connection = connectDB() - Orari = connection.execute('SELECT Orario FROM Orari WHERE ID_Tampone = ? AND Giorno = ?',(ID_tampone,Giorno,)).fetchall() - connection.close() - return render_template('/PazienteView/prenotaNuovo.html', ID_farmacia=ID_farmacia, ID_tampone=ID_tampone, Giorno=Giorno, Orari=Orari) - -@app.route('////confermaPrenotaNuovo', methods=["GET","POST"]) -def confermaPrenotaNuovo(ID_farmacia,ID_tampone,Giorno): - if request.method == 'POST': - Ora = request.form['Ora'] - Nome = request.form['Nome'] - Cognome = request.form['Cognome'] - Email = request.form['Email'] - PWD = request.form['PWD'] - CodiceFiscale = request.form['CodiceFiscale'] - Telefono = request.form['Telefono'] - - connection = connectDB() - tipoTampone = connection.execute('SELECT Tipo FROM Tamponi WHERE ID = ?',(ID_tampone,)).fetchone() - connection.execute('INSERT INTO Pazienti (Nome, Cognome, Email, PWD, CodiceFiscale, Telefono) VALUES (?,?,?,?,?,?)', (Nome,Cognome,Email,PWD,CodiceFiscale,Telefono,)) - connection.execute('INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Tampone) VALUES (?,?,?,?,?,?,?,?,?,?,?)', (Nome,Cognome,Email,CodiceFiscale,Telefono,Giorno,Ora,tipoTampone['Tipo'],'Da effettuare',ID_farmacia,ID_tampone,)) - connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi - 1 WHERE ID = ?', (ID_tampone,)) - connection.execute('DELETE FROM Orari WHERE ID_Tampone = ? AND Giorno = ? AND Orario = ?', (ID_tampone,Giorno,Ora,)) - ID_Prenotazione = connection.execute('SELECT ID FROM Prenotazioni ORDER BY ID DESC LIMIT 1').fetchone() - infoFarmacia = connection.execute('SELECT NomeFarmacia,Citta,Indirizzo FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID = ?',(ID_Prenotazione['ID'],)).fetchone() - connection.commit() - connection.close() - info_prenotazione = "Gentile " + Nome + " " + Cognome + ",\nLe confermiamo che la prenotazione è avvenuta con successo. \nLa prenotazione è il giorno " + Giorno + " alle ore " + Ora + " alla Farmacia " + infoFarmacia['NomeFarmacia'] + " - " + infoFarmacia['Citta'] + " - " + infoFarmacia['Indirizzo'] + "\nLe alleghiamo il QR Code da mostrare in farmacia. \n\nCordiali Saluti, \nSelfTestCOVID19" - sendmail(ID_Prenotazione['ID'], Email, info_prenotazione) - return render_template('/PazienteView/riepilogoPrenotazione.html',Nome=Nome,Cognome=Cognome,Email=Email,CodiceFiscale=CodiceFiscale,Telefono=Telefono,Giorno=Giorno,Ora=Ora,Tipo=tipoTampone['Tipo']) - -@app.route('////prenotaRegistrato', methods=["GET","POST"]) -def prenotaRegistrato(ID_farmacia,ID_tampone,Giorno): - msg = "" - connection = connectDB() - Orari = connection.execute('SELECT Orario FROM Orari WHERE ID_Tampone = ? AND Giorno = ?',(ID_tampone,Giorno,)).fetchall() - connection.close() - return render_template('/PazienteView/prenotaRegistrato.html', ID_farmacia=ID_farmacia, ID_tampone=ID_tampone, Giorno=Giorno, Orari=Orari,msg=msg) - -@app.route('////confermaPrenotaRegistrato', methods=["GET","POST"]) -def confermaPrenotaRegistrato(ID_farmacia,ID_tampone,Giorno): - msg = "" - connection = connectDB() - Orari = connection.execute('SELECT Orario FROM Orari WHERE ID_Tampone = ? AND Giorno = ?',(ID_tampone,Giorno,)).fetchall() - connection.close() - - if request.method == 'POST': - Ora = request.form['Ora'] - Email = request.form['Email'] - PWD = request.form['PWD'] - connection = connectDB() - account = connection.execute('SELECT * FROM Pazienti WHERE Email = ? AND PWD = ?', (Email, PWD,)).fetchone() - - if account: - tipoTampone = connection.execute('SELECT Tipo FROM Tamponi WHERE ID = ?',(ID_tampone,)).fetchone() - connection.execute('INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Tampone) VALUES (?,?,?,?,?,?,?,?,?,?,?)', (account['Nome'],account['Cognome'],account['Email'],account['CodiceFiscale'],account['Telefono'],Giorno,Ora,tipoTampone['Tipo'],'Da effettuare',ID_farmacia,ID_tampone,)) - connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi - 1 WHERE ID = ?', (ID_tampone,)) - connection.execute('DELETE FROM Orari WHERE ID_Tampone = ? AND Giorno = ? AND Orario = ?', (ID_tampone,Giorno,Ora,)) - ID_Prenotazione = connection.execute('SELECT ID FROM Prenotazioni ORDER BY ID DESC LIMIT 1').fetchone() - info = connection.execute('SELECT Nome, Cognome, NomeFarmacia, Citta, Indirizzo FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.ID = ?',(ID_Prenotazione['ID'],)).fetchone() - connection.commit() - connection.close() - info_prenotazione = "Gentile " + info['Nome'] + " " + info['Cognome'] + ",\nLe confermiamo che la prenotazione è avvenuta con successo. \nLa prenotazione è il giorno " + Giorno + " alle ore " + Ora + " alla Farmacia " + info['NomeFarmacia'] + " - " + info['Citta'] + " - " + info['Indirizzo'] + "\nLe alleghiamo il QR Code da mostrare in farmacia. \n\nCordiali Saluti, \nSelfTestCOVID19" - sendmail(ID_Prenotazione['ID'], Email, info_prenotazione) - return render_template('/PazienteView/riepilogoPrenotazione.html',Nome=account['Nome'],Cognome=account['Cognome'],Email=account['Email'],CodiceFiscale=account['CodiceFiscale'],Telefono=account['Telefono'],Giorno=Giorno,Ora=Ora,Tipo=tipoTampone['Tipo']) - else: - msg = 'Credenziali inserite non valide!' - return render_template('/PazienteView/prenotaRegistrato.html', ID_farmacia=ID_farmacia, ID_tampone=ID_tampone, Giorno=Giorno, Orari=Orari, msg=msg) - -@app.route('/disponibilitaMolecolare', methods=["GET", "POST"]) +@app.route('////prenotaNuovo') +def prenotaNuovo(): + return render_template('/PazienteView/prenotaNuovo.html') + +@app.route('////confermaPrenotaNuovo') +def confermaPrenotaNuovo(): + return render_template('/PazienteView/riepilogoPrenotazione.html') + +@app.route('////prenotaRegistrato') +def prenotaRegistrato(): + return render_template('/PazienteView/prenotaRegistrato.html') + +@app.route('////confermaPrenotaRegistrato') +def confermaPrenotaRegistrato(): + return render_template('/PazienteView/prenotaRegistrato.html') + +@app.route('/disponibilitaMolecolare') def dispMolecolare(): - if request.method == "POST": - NomeFarmacia = request.form['NomeFarmacia'] - Citta = request.form['Citta'] - CAP = request.form['CAP'] - connection = connectDB() - tamponi_disponibili = connection.execute('SELECT Tamponi.ID AS ID_tampone,Farmacie.ID AS ID_farmacia,Farmacie.NomeFarmacia,Farmacie.Citta,Tamponi.NomeTampone,Tamponi.Giorno,Tamponi.OraInizio,Tamponi.OraFine,Tamponi.Prezzo FROM Farmacie INNER JOIN Tamponi ON Farmacie.ID=Tamponi.ID_Farmacia AND Tamponi.Giorno >= DATE() AND N_Pezzi > 0 AND Tipo = ? AND (NomeFarmacia = ? OR Citta = ? OR CAP = ?)', ('Molecolare',NomeFarmacia,Citta,CAP,)).fetchall() - connection.close() - return render_template('/PazienteView/prenota.html', tamponi_disponibili=tamponi_disponibili, tipo="molecolare") return render_template('/PazienteView/disponibilitaMolecolare.html') +@app.route('/checkQRCode') +def checkQRCode(): + return render_template('/FarmaciaView/checkQRCode.html') + +@app.route('/modificaPrenotazioni') +def modificaPrenotazioni(): + return render_template('/FarmaciaView/modificaPrenotazioni.html') + +@app.route('//aggiornaPrenotazioni') +def aggiornaPrenotazioni(): + return render_template('/FarmaciaView/modificaPrenotazioni.html') -# ----- PAZIENTE REGISTRATO ----------------------- -@app.route('/loginPaziente', methods=["GET", "POST"]) +@app.route('/rimozionePrenotazioni') +def rimozionePrenotazioni(): + return render_template('/FarmaciaView/rimozionePrenotazioni.html') + +@app.route('//rimuoviPrenotazioni') +def rimuoviPrenotazioni(): + return render_template('/FarmaciaView/rimozionePrenotazioni.html') + + +# ----------------------- GESTIONE PAZIENTE REGISTRATO ----------------------- +@app.route('/loginPaziente') def loginPaziente(): - msg = "" - if request.method == 'POST': - Email = request.form['Email'] - PWD = request.form['PWD'] - connection = connectDB() - account = connection.execute('SELECT * FROM Pazienti WHERE Email = ? AND PWD = ?', (Email, PWD,)).fetchone() - - if account: - session['loggedin'] = True - session['id'] = account['ID'] - session['username'] = account['Email'] - connection = connectDB() - esito = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone, EsitoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email=?',(session['username'],)).fetchall() - connection.close() - return render_template('/PazienteRegistratoView/dashboardPaziente.html', nomePaziente=account['Nome'], esito=esito) - else: - msg = 'Credenziali inserite non valide!' - return render_template('/PazienteRegistratoView/loginPaziente.html',msg=msg) - -@app.route('/dashboardPaziente', methods=["GET", "POST"]) + return render_template('/PazienteRegistratoView/loginPaziente.html') + +@app.route('/dashboardPaziente') def dashPaziente(): - if 'loggedin' in session: - connection = connectDB() - esito = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone, EsitoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email=?',(session['username'],)).fetchall() - nomepaziente = connection.execute('SELECT Nome FROM Pazienti WHERE ID = ?',(session['id'],)).fetchone() - connection.close() - else: - return redirect('/loginPaziente') - return render_template('/PazienteRegistratoView/dashboardPaziente.html', nomePaziente=nomepaziente['Nome'], esito=esito) - -@app.route('/modificaPrenotazionePaziente', methods=["GET", "POST"]) + return render_template('/PazienteRegistratoView/dashboardPaziente.html') + +@app.route('/download/report/pdf/') +def download_report(): + return render_template('/PazienteRegistratoView/dashboardPaziente.html') + +@app.route('/modificaPrenotazionePaziente') def modificaPrenotazionePaziente(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email= ?',(session['username'],)).fetchall() - connection.close() - else: - return redirect('/loginPaziente') - return render_template('/PazienteRegistratoView/modificaPrenotazionepaziente.html', prenotazioni=prenotazione, msg=msg) - -@app.route('//aggiornaPrenotazionePaziente', methods=["POST"]) -def aggiornaPrenotazionePaziente(ID): - msg = "" - if 'loggedin' in session: - if request.method == "POST": - Giorno = request.form['Giorno'] - Ora = request.form['Ora'] - connection = connectDB() - connection.execute('UPDATE Prenotazioni SET Giorno = ?, Ora = ? WHERE ID = ?', (Giorno,Ora,ID)) - connection.commit() - prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email= ?',(session['username'],)).fetchall() - connection.close() - msg = "Aggiornamento della prenotazione nr. " + str(ID) + " è avvenuta con successo!" - else: - return redirect('/loginPaziente') - return render_template('/PazienteRegistratoView/modificaPrenotazionepaziente.html', prenotazioni=prenotazione, msg=msg) - -@app.route('/rimozionePrenotazionePaziente', methods=["GET", "POST"]) + return render_template('/PazienteRegistratoView/modificaPrenotazionepaziente.html') + +@app.route('//aggiornaPrenotazionePaziente') +def aggiornaPrenotazionePaziente(): + return render_template('/PazienteRegistratoView/modificaPrenotazionepaziente.html') + +@app.route('/rimozionePrenotazionePaziente') def rimozionePrenotazionePaziente(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email= ?',(session['username'],)).fetchall() - connection.close() - else: - return redirect('/loginPaziente') - return render_template('/PazienteRegistratoView/rimozionePrenotazionePaziente.html', prenotazioni=prenotazione, msg=msg) - -@app.route('//rimuoviPrenotazionePaziente', methods=["POST"]) -def rimuoviPrenotazionePaziente(ID): - msg = "" - if 'loggedin' in session: - connection = connectDB() - ID_tampone = connection.execute('SELECT ID_Tampone FROM Prenotazioni WHERE ID = ?', (ID,)).fetchone() - connection.execute('DELETE FROM Prenotazioni WHERE ID = ?', (ID,)) - connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi + 1 WHERE ID = ?', (ID_tampone['ID_Tampone'],)) - connection.commit() - prenotazione = connection.execute('SELECT Prenotazioni.ID, NomeFarmacia, Citta, Indirizzo, Giorno, Ora, TipoTampone FROM Prenotazioni INNER JOIN Farmacie ON Prenotazioni.ID_Farmacia = Farmacie.ID AND Prenotazioni.Email= ?',(session['username'],)).fetchall() - connection.close() - msg = "Rimozione della prenotazione nr. " + str(ID) + " è avvenuta con successo!" - else: - return redirect('/loginPaziente') - return render_template('/PazienteRegistratoView/rimozionePrenotazionePaziente.html', prenotazioni=prenotazione, msg=msg) - -# ----- DASHBOARD ADMIN --------------------------- -@app.route('/loginAdmin', methods=["GET", "POST"]) + return render_template('/PazienteRegistratoView/rimozionePrenotazionePaziente.html') + +@app.route('//rimuoviPrenotazionePaziente') +def rimuoviPrenotazionePaziente(): + return render_template('/PazienteRegistratoView/rimozionePrenotazionePaziente.html') + + +# ----------------------- GESTIONE FARMACIA ----------------------- +@app.route('/loginAdmin') def loginAdmin(): - msg = "" - if request.method == 'POST': - Username = request.form['Username'] - PWD = request.form['PWD'] - connection = connectDB() - account = connection.execute('SELECT * FROM Admin WHERE Username = ? AND PWD = ?', (Username, PWD,)).fetchone() - connection.close() - - if account: - session['loggedin'] = True - session['id'] = account['ID'] - session['username'] = account['Username'] - return redirect('/dashboardAdmin') - else: - msg = 'Credenziali inserite non valide!' - - return render_template('/AdminView/loginAdmin.html',msg=msg) + return render_template('/AdminView/loginAdmin.html') @app.route('/logout') def logout(): - # Remove session data, this will log the user out - session.pop('loggedin', None) - session.pop('id', None) - session.pop('username', None) - # Redirect to login page return render_template('index.html') -@app.route('/dashboardAdmin', methods=["GET", "POST"]) +@app.route('/dashboardAdmin') def dashAdmin(): - if 'loggedin' in session: - connection = connectDB() - farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() - connection.close() - else: - return redirect('/loginAdmin') - return render_template('/AdminView/dashboardAdmin.html', farmacie=farmacie) - -@app.route('/creaFarmacia', methods=["GET", "POST"]) + return render_template('/AdminView/dashboardAdmin.html') + +@app.route('/creaFarmacia') def creaFarmacia(): - if 'loggedin' in session: - if request.method == "POST": - NomeFarmacia = request.form['NomeFarmacia'] - Citta = request.form['Citta'] - CAP = request.form['CAP'] - Indirizzo = request.form['Indirizzo'] - Email = request.form['Email'] - PWD = request.form['PWD'] - connection = connectDB() - connection.execute('INSERT INTO Farmacie (NomeFarmacia, Citta, CAP, Indirizzo, Email, PWD) VALUES (?,?,?,?,?,?)', (NomeFarmacia,Citta,CAP,Indirizzo,Email,PWD)) - connection.commit() - connection.close() - else: - return redirect('/loginAdmin') return render_template('/AdminView/creaFarmacia.html') -@app.route('/ricercaFarmacia', methods=["GET", "POST"]) +@app.route('/ricercaFarmacia') def ricercaFarmacia(): - if 'loggedin' in session: - if request.method == "POST": - NomeFarmacia = request.form['NomeFarmacia'] - Citta = request.form['Citta'] - CAP = request.form['CAP'] - connection = connectDB() - farmacie = connection.execute('SELECT * FROM Farmacie WHERE (NomeFarmacia = ? OR Citta = ? OR CAP = ?)', (NomeFarmacia,Citta,CAP,)).fetchall() - connection.close() - return render_template('/AdminView/listaFarmacie.html', farmacie=farmacie) - else: - return redirect('/loginAdmin') return render_template('/AdminView/ricercaFarmacia.html') -@app.route('/modificaFarmacia', methods=["GET", "POST"]) +@app.route('/modificaFarmacia') def modificaFarmacia(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() - connection.close() - else: - return redirect('/loginAdmin') - return render_template('/AdminView/modificaFarmacia.html', farmacie=farmacie, msg=msg) - -@app.route('//aggiornaFarmacia', methods=["POST"]) + return render_template('/AdminView/modificaFarmacia.html') + +@app.route('//aggiornaFarmacia') def aggiornaFarmacia(ID): - msg = "" - if 'loggedin' in session: - if request.method == "POST": - NomeFarmacia = request.form['NomeFarmacia'] - Citta = request.form['Citta'] - CAP = request.form['CAP'] - Email = request.form['Email'] - PWD = request.form['PWD'] - connection = connectDB() - connection.execute('UPDATE Farmacie SET NomeFarmacia = ?, Citta = ?, CAP = ?, Email = ?, PWD = ? WHERE ID = ?', (NomeFarmacia,Citta,CAP,Email,PWD,ID)) - connection.commit() - farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() - connection.close() - msg = "Aggiornamento della farmacia " + NomeFarmacia + " è avvenuto con successo!" - else: - return redirect('/loginAdmin') - return render_template('/AdminView/modificaFarmacia.html', farmacie=farmacie, msg=msg) - -@app.route('/rimozioneFarmacia', methods=["GET", "POST"]) + return render_template('/AdminView/modificaFarmacia.html') + +@app.route('/rimozioneFarmacia') def rimozioneFarmacia(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() - connection.close() - else: - return redirect('/loginAdmin') - return render_template('/AdminView/rimozioneFarmacia.html', farmacie=farmacie, msg=msg) - -@app.route('//rimuoviFarmacia', methods=["POST"]) + return render_template('/AdminView/rimozioneFarmacia.html') + +@app.route('//rimuoviFarmacia') def rimuoviFarmacia(ID): - msg = "" - if 'loggedin' in session: - connection = connectDB() - connection.execute('DELETE FROM Farmacie WHERE ID = ?', (ID,)) - connection.commit() - farmacie = connection.execute('SELECT * FROM Farmacie').fetchall() - connection.close() - msg = "Rimozione della farmacia nr. " + str(ID) + " è avvenuta con successo!" - else: - return redirect('/loginAdmin') - return render_template('/AdminView/rimozioneFarmacia.html', farmacie=farmacie, msg=msg) - - -# ------ DASHBOARD FARMACIA ------- -@app.route('/loginFarmacia', methods=["GET", "POST"]) + return render_template('/AdminView/rimozioneFarmacia.html') + + +# ----------------------- GESTIONE DISPONIBILITA' TAMPONI ----------------------- +@app.route('/loginFarmacia') def loginFarmacia(): - msg = "" - if request.method == 'POST': - Email = request.form['Email'] - PWD = request.form['PWD'] - connection = connectDB() - account = connection.execute('SELECT * FROM Farmacie WHERE Email = ? AND PWD = ?', (Email, PWD,)).fetchone() - - if account: - session['loggedin'] = True - session['id'] = account['ID'] - session['username'] = account['Email'] - connection = connectDB() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ? AND Prenotazioni.Giorno >= DATE()',(session['id'],)).fetchall() - totaleRapido = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchone() - totaleMolecolare = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchone() - connection.close() - return render_template('/FarmaciaView/dashboardFarmacia.html', nomefarmacia=account['NomeFarmacia'], prenotazioni=prenotazioni, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare) - else: - msg = 'Credenziali inserite non valide!' - - return render_template('/FarmaciaView/loginFarmacia.html',msg=msg) - -@app.route('/dashboardFarmacia', methods=["GET", "POST"]) + return render_template('/FarmaciaView/loginFarmacia.html') + +@app.route('/dashboardFarmacia') def dashFarmacia(): - if 'loggedin' in session: - connection = connectDB() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ? AND Prenotazioni.Giorno >= DATE()',(session['id'],)).fetchall() - nomefarmacia = connection.execute('SELECT (NomeFarmacia) FROM Farmacie WHERE ID = ?',(session['id'],)).fetchone() - totaleRapido = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE Tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchone() - totaleMolecolare = connection.execute('SELECT COALESCE(SUM(N_pezzi),0) as TOT FROM Tamponi WHERE Tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchone() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/dashboardFarmacia.html', nomefarmacia=nomefarmacia['NomeFarmacia'], prenotazioni=prenotazioni, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare) - -@app.route('/checkQRCode', methods=["GET", "POST"]) -def checkQRCode(): - if 'loggedin' in session: - connection = connectDB() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/checkQRCode.html', prenotazioni=prenotazioni) - -@app.route('/modificaPrenotazioni', methods=["GET", "POST"]) -def modificaPrenotazioni(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/modificaPrenotazioni.html', prenotazioni=prenotazioni, msg=msg) - -@app.route('//aggiornaPrenotazioni', methods=["POST"]) -def aggiornaPrenotazioni(ID): - msg = "" - if 'loggedin' in session: - if request.method == "POST": - Nome = request.form['Nome'] - Cognome = request.form['Cognome'] - Email = request.form['Email'] - CodiceFiscale = request.form['CodiceFiscale'] - Telefono = request.form['Telefono'] - Giorno = request.form['Giorno'] - Ora = request.form['Ora'] - connection = connectDB() - connection.execute('UPDATE Prenotazioni SET Nome = ?, Cognome = ?, Email = ?, CodiceFiscale = ?, Telefono = ?, Giorno = ?, Ora = ? WHERE ID = ?', (Nome,Cognome,Email,CodiceFiscale,Telefono,Giorno,Ora,ID)) - connection.commit() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - msg = "Aggiornamento della prenotazione nr. " + str(ID) + " è avvenuta con successo!" - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/modificaPrenotazioni.html', prenotazioni=prenotazioni, msg=msg) - -@app.route('/rimozionePrenotazioni', methods=["GET", "POST"]) -def rimozionePrenotazioni(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/rimozionePrenotazioni.html', prenotazioni=prenotazioni, msg=msg) - -@app.route('//rimuoviPrenotazioni', methods=["POST"]) -def rimuoviPrenotazioni(ID): - msg = "" - if 'loggedin' in session: - connection = connectDB() - ID_tampone = connection.execute('SELECT ID_Tampone FROM Prenotazioni WHERE ID = ?', (ID,)).fetchone() - connection.execute('DELETE FROM Prenotazioni WHERE ID = ?', (ID,)) - connection.execute('UPDATE Tamponi SET N_pezzi = N_pezzi + 1 WHERE ID = ?', (ID_tampone['ID_Tampone'],)) - connection.commit() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - msg = "Rimozione della prenotazione nr. " + str(ID) + " è avvenuta con successo!" - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/rimozionePrenotazioni.html', prenotazioni=prenotazioni, msg=msg) - -@app.route('/creazioneDisponibilitaTamponi', methods=["GET", "POST"]) + return render_template('/FarmaciaView/dashboardFarmacia.html') + +@app.route('/creazioneDisponibilitaTamponi') def creaDisponibilitaTamponi(): - if 'loggedin' in session: - connection = connectDB() - tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - totaleRapido = connection.execute('SELECT SUM(N_pezzi) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Rapido',session['id'],)).fetchall() - totaleMolecolare = connection.execute('SELECT SUM(N_pezzi) as TOT FROM Tamponi WHERE tipo = ? AND ID_Farmacia = ?',('Molecolare',session['id'],)).fetchall() - connection.close() - - if request.method == "POST": - NomeTampone = request.form['NomeTampone'] - Tipo= request.form['Tipo'] - N_pezzi = request.form['N_pezzi'] - Giorno = request.form['Giorno'] - OraInizio = request.form['OraInizio'] - OraFine = request.form['OraFine'] - Prezzo = request.form['Prezzo'] - connection = connectDB() - connection.execute('INSERT INTO Tamponi (NomeTampone, Tipo, N_pezzi, Giorno, OraInizio, OraFine, Prezzo, ID_Farmacia) VALUES (?,?,?,?,?,?,?,?)', (NomeTampone,Tipo,N_pezzi,Giorno,OraInizio,OraFine,Prezzo,session['id'],)) - ID_Tampone = connection.execute('SELECT ID FROM Tamponi ORDER BY ID DESC LIMIT 1').fetchone() - FasceOrarie=splittime(OraInizio,OraFine) - for Orario in FasceOrarie: - connection.execute('INSERT INTO Orari (ID_Tampone, Orario, Giorno) VALUES (?,?,?)', (ID_Tampone['ID'],Orario,Giorno,)) - connection.commit() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/creazioneDisponibilitaTamponi.html',tamponi=tamponi, totaleRapido=totaleRapido, totaleMolecolare=totaleMolecolare) - -@app.route('/rimuoviDisponibilitaTamponi', methods=["GET", "POST"]) + return render_template('/FarmaciaView/creazioneDisponibilitaTamponi.html') + +@app.route('/rimuoviDisponibilitaTamponi') def rimozioneTamponi(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/rimozioneDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) - -@app.route('//rimuoviDisponibilitaTamponi', methods=["POST"]) -def rimuoviTamponi(ID_tamponi): - msg = "" - if 'loggedin' in session: - connection = connectDB() - connection.execute('DELETE FROM Tamponi WHERE ID = ?', (ID_tamponi,)) - connection.execute('DELETE FROM Orari WHERE ID_Tampone = ?', (ID_tamponi,)) - connection.commit() - tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - msg = "Rimozione del tampone nr. " + str(ID_tamponi) + " è avvenuto con successo!" - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/rimozioneDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) - -@app.route('/modificaDisponibilitaTamponi', methods=["GET", "POST"]) + return render_template('/FarmaciaView/rimozioneDisponibilitaTamponi.html') + +@app.route('//rimuoviDisponibilitaTamponi') +def rimuoviTamponi(): + return render_template('/FarmaciaView/rimozioneDisponibilitaTamponi.html') + +@app.route('/modificaDisponibilitaTamponi') def modificaDisponibilitaTamponi(): - msg = "" - if 'loggedin' in session: - connection = connectDB() - tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/modificaDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) - -@app.route('//modificaDisponibilitaTamponi', methods=["POST"]) -def aggiornaTamponi(ID_tamponi): - msg = "" - if 'loggedin' in session: - if request.method == "POST": - NomeTampone = request.form['NomeTampone'] - Tipo = request.form['Tipo'] - N_pezzi = request.form['N_pezzi'] - Giorno = request.form['Giorno'] - OraInizio = request.form['OraInizio'] - OraFine = request.form['OraFine'] - Prezzo = request.form['Prezzo'] - connection = connectDB() - connection.execute('UPDATE Tamponi SET NomeTampone = ?, Tipo = ?, N_pezzi = ?, Giorno = ?, OraInizio = ?, OraFine = ?, Prezzo = ? WHERE ID = ?', (NomeTampone,Tipo,N_pezzi,Giorno,OraInizio,OraFine,Prezzo,ID_tamponi)) - connection.execute('DELETE FROM Orari WHERE ID_Tampone = ?', (ID_tamponi,)) - FasceOrarie=splittime(OraInizio,OraFine) - for Orario in FasceOrarie: - connection.execute('INSERT INTO Orari (ID_Tampone, Orario, Giorno) VALUES (?,?,?)', (ID_tamponi,Orario,Giorno,)) - connection.commit() - tamponi = connection.execute('SELECT * FROM Tamponi WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - msg = "Aggiornamento del tampone " + NomeTampone + " è avvenuto con successo!" - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/modificaDisponibilitaTamponi.html', tamponi=tamponi, msg=msg) - -@app.route('/aggiuntaEsitoTamponi', methods=["GET", "POST"]) + return render_template('/FarmaciaView/modificaDisponibilitaTamponi.html') + +@app.route('//modificaDisponibilitaTamponi') +def aggiornaTamponi(): + return render_template('/FarmaciaView/modificaDisponibilitaTamponi.html') + + +# ----------------------- GESTIONE ESITI TAMPONI ----------------------- +@app.route('/aggiuntaEsitoTamponi') def aggiuntaEsitoTamponi(): - if 'loggedin' in session: - connection = connectDB() - prenotazioni = connection.execute('SELECT * FROM Prenotazioni WHERE ID_Farmacia = ?',(session['id'],)).fetchall() - connection.close() - else: - return redirect('/loginFarmacia') - return render_template('/FarmaciaView/aggiuntaEsitoTampone.html', prenotazioni=prenotazioni) - -@app.route('//aggiuntaEsitoTamponi', methods=["POST"]) -def aggiungiEsitoTamponi(ID): - if 'loggedin' in session: - if request.method == "POST": - EsitoTampone = request.form['EsitoTampone'] - connection = connectDB() - connection.execute('UPDATE Prenotazioni SET EsitoTampone = ? WHERE ID = ?', (EsitoTampone,ID)) - connection.commit() - connection.close() - else: - return redirect('/loginFarmacia') + return render_template('/FarmaciaView/aggiuntaEsitoTampone.html') + +@app.route('//aggiuntaEsitoTamponi') +def aggiungiEsitoTamponi(): return redirect('/aggiuntaEsitoTamponi') # main -if __name__=="__main__": +if __name__ == "__main__": app.run(debug=True) \ No newline at end of file diff --git a/models/DB.py b/models/DB.py new file mode 100644 index 0000000..4ad03ae --- /dev/null +++ b/models/DB.py @@ -0,0 +1,13 @@ +import sqlite3 + +def initDB(): + connection = sqlite3.connect('./models/selftestcovid19.db') + with open('./models/selftestcovid19.sql') as f: + connection.executescript(f.read()) + connection.commit() + connection.close() + +def connectDB(): + connection = sqlite3.connect('./models/selftestcovid19.db') + connection.row_factory = sqlite3.Row + return connection \ No newline at end of file diff --git a/models/__pycache__/DB.cpython-310.pyc b/models/__pycache__/DB.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d54aebd42bed7e407cdce948727b82b4117cdc9 GIT binary patch literal 745 zcmZ`%v5wO~5Z$$%#N;l50?}Lww=OP6LUjlslGr&Sp%}#u0n1X9^KQ^0$7^<-3x{&m zQP3ei04XW?4*tR|6(2xD1GC8?g@Relo1NL2*`1l?wOSPcz5IMP{)iF!u9SV!KzRZz z>i`51oS+a9jp!dxh>1Z;AT@%0WS4({2O7i*|B{L}fxEym0LalA6THD!DA$N~jX&MK z!Yj1aS9on~&<0~PhFc6+*E&Y2*+lYa30AdU0fTR8vy){d34)vT!LOsn$($3K$P-DE zSx#jh^9x3rrwwxczW(1s`8KgDMFj-Q>4TyY^E9P#UKl*1X;`E0XuN=Av0xb(1)Y+x z9P{~{kGGecBJ)ZZHDHasB?;AoAU3y}gAfA)11}K60N+F%BQ>C?Ubq)8{|^QpPE7{B$Gp4vHu3mz^YX}Z z1#&&&)Z|j&H|0OOSx{gp2UlYWH@mp3EMv3v#N zU0ht8v9Y=&F)1h2zbLUN6HIVT4(2Xr(&U=#&#xiR-Net%E-o$2*jx%$7Lu4-ke`XIQYU}pRgf=bfdrc^SU1!esW6&# zvH{=DAXHbwoT>v3Q&4!a;tNlhQSpW_7Fz)G(fpky)G*Y#KQE2|y$!NV9>=V?c1xWYM_z I6_X+h04n3yJpcdz literal 40960 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 SOL-9hC@gakfaS#i^?w3Ew174M diff --git a/models/selftestcovid19.sql b/models/selftestcovid19.sql new file mode 100644 index 0000000..059ac37 --- /dev/null +++ b/models/selftestcovid19.sql @@ -0,0 +1,68 @@ +DROP TABLE IF EXISTS Admin; + +CREATE TABLE `Admin` ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, + Username VARCHAR(50), + PWD VARCHAR(50), + UNIQUE(Username,PWD) +); + +CREATE TABLE IF NOT EXISTS `Farmacie` ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, + NomeFarmacia VARCHAR(50), + Citta VARCHAR(50), + CAP INT(5), + Indirizzo VARCHAR(50), + Email VARCHAR(50), + PWD VARCHAR(50), + UNIQUE(NomeFarmacia,Email) +); + +CREATE TABLE IF NOT EXISTS `Prenotazioni` ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, + Nome VARCHAR(50), + Cognome VARCHAR(50), + Email VARCHAR(50), + CodiceFiscale VARCHAR(36), + Telefono VARCHAR(10), + Giorno DATE, + Ora TIME, + TipoTampone VARCHAR(10), + EsitoTampone VARCHAR(20), + ID_Farmacia INTEGER, + ID_Paziente INTEGER, + ID_Tampone INTEGER +); + +CREATE TABLE IF NOT EXISTS `Tamponi` ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, + NomeTampone VARCHAR(50), + Tipo VARCHAR(10), + N_pezzi INTEGER, + Giorno DATE, + OraInizio TIME, + OraFine TIME, + Prezzo FLOAT, + ID_Farmacia INTEGER, + UNIQUE(NomeTampone,ID_Farmacia) +); + +CREATE TABLE IF NOT EXISTS `Orari` ( + ID_Tampone INTEGER, + Giorno DATE, + Orario TIME, + PRIMARY KEY ("ID_Tampone","Giorno","Orario") +); + +CREATE TABLE IF NOT EXISTS `Pazienti` ( + ID INTEGER PRIMARY KEY AUTOINCREMENT, + Nome VARCHAR(50), + Cognome VARCHAR(50), + Email VARCHAR(50), + PWD VARCHAR(50), + CodiceFiscale VARCHAR(36), + Telefono VARCHAR(10), + UNIQUE(Email,PWD) +); + +INSERT INTO Admin (Username,PWD) VALUES ('admin','admin'); \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index c412f1b..56245bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,5 +12,5 @@ scikit-learn seaborn Werkzeug yellowbrick -sqlite3 qrcode +fpdf diff --git "a/routes/GestioneDisponibilit\303\240Routes.py" "b/routes/GestioneDisponibilit\303\240Routes.py" new file mode 100644 index 0000000..d9079db --- /dev/null +++ "b/routes/GestioneDisponibilit\303\240Routes.py" @@ -0,0 +1,12 @@ +from flask import Blueprint +from controllers.GestioneDisponibilitàController import * + +GestioneDisponibilità_bp = Blueprint('GestioneDisponibilità_bp', __name__) + +GestioneDisponibilità_bp.route('/creazioneDisponibilitaTamponi', methods=["GET", "POST"])(creaDisponibilitaTamponi) +GestioneDisponibilità_bp.route('/rimuoviDisponibilitaTamponi')(rimozioneTamponi) +GestioneDisponibilità_bp.route('///rimuoviDisponibilitaTamponi', methods=["GET", "POST"])(rimuoviTamponi) +GestioneDisponibilità_bp.route('/modificaDisponibilitaTamponi', methods=["GET", "POST"])(modificaDisponibilitaTamponi) +GestioneDisponibilità_bp.route('//modificaDisponibilitaTamponi', methods=["GET", "POST"])(aggiornaTamponi) +GestioneDisponibilità_bp.route('/loginFarmacia', methods=["GET", "POST"])(loginFarmacia) +GestioneDisponibilità_bp.route('/dashboardFarmacia', methods=["GET", "POST"])(dashFarmacia) \ No newline at end of file diff --git a/routes/GestioneEsitiTamponiRoutes.py b/routes/GestioneEsitiTamponiRoutes.py new file mode 100644 index 0000000..e798eeb --- /dev/null +++ b/routes/GestioneEsitiTamponiRoutes.py @@ -0,0 +1,7 @@ +from flask import Blueprint +from controllers.GestioneEsitiTamponiController import * + +GestioneEsitiTamponi_bp = Blueprint('GestioneEsitiTamponi_bp', __name__) + +GestioneEsitiTamponi_bp.route('/aggiuntaEsitoTamponi', methods=["GET", "POST"])(aggiuntaEsitoTamponi) +GestioneEsitiTamponi_bp.route('//aggiuntaEsitoTamponi', methods=["POST"])(aggiungiEsitoTamponi) \ No newline at end of file diff --git a/routes/GestioneFarmaciaRoutes.py b/routes/GestioneFarmaciaRoutes.py new file mode 100644 index 0000000..3b4ef4d --- /dev/null +++ b/routes/GestioneFarmaciaRoutes.py @@ -0,0 +1,14 @@ +from flask import Blueprint +from controllers.GestioneFarmaciaController import * + +GestioneFarmacia_bp = Blueprint('GestioneFarmacia_bp', __name__) + +GestioneFarmacia_bp.route('/loginAdmin', methods=["GET", "POST"])(loginAdmin) +GestioneFarmacia_bp.route('/logout')(logout) +GestioneFarmacia_bp.route('/dashboardAdmin', methods=["GET", "POST"])(dashAdmin) +GestioneFarmacia_bp.route('/creaFarmacia', methods=["GET", "POST"])(creaFarmacia) +GestioneFarmacia_bp.route('/ricercaFarmacia', methods=["GET", "POST"])(ricercaFarmacia) +GestioneFarmacia_bp.route('/modificaFarmacia', methods=["GET", "POST"])(modificaFarmacia) +GestioneFarmacia_bp.route('//aggiornaFarmacia', methods=["POST"])(aggiornaFarmacia) +GestioneFarmacia_bp.route('/rimozioneFarmacia', methods=["GET", "POST"])(rimozioneFarmacia) +GestioneFarmacia_bp.route('//rimuoviFarmacia', methods=["POST"])(rimuoviFarmacia) \ No newline at end of file diff --git a/routes/GestionePazienteRegistratoRoutes.py b/routes/GestionePazienteRegistratoRoutes.py new file mode 100644 index 0000000..b50905e --- /dev/null +++ b/routes/GestionePazienteRegistratoRoutes.py @@ -0,0 +1,12 @@ +from flask import Blueprint +from controllers.GestionePazienteRegistratoController import * + +GestionePazienteRegistrato_bp = Blueprint('GestionePazienteRegistrato_bp', __name__) + +GestionePazienteRegistrato_bp.route('/loginPaziente', methods=["GET", "POST"])(loginPaziente) +GestionePazienteRegistrato_bp.route('/dashboardPaziente', methods=["GET", "POST"])(dashPaziente) +GestionePazienteRegistrato_bp.route('/download/report/pdf/', methods=["GET", "POST"])(download_report) +GestionePazienteRegistrato_bp.route('/modificaPrenotazionePaziente', methods=["GET", "POST"])(modificaPrenotazionePaziente) +GestionePazienteRegistrato_bp.route('//aggiornaPrenotazionePaziente', methods=["POST"])(aggiornaPrenotazionePaziente) +GestionePazienteRegistrato_bp.route('/rimozionePrenotazionePaziente', methods=["GET", "POST"])(rimozionePrenotazionePaziente) +GestionePazienteRegistrato_bp.route('//rimuoviPrenotazionePaziente', methods=["POST"])(rimuoviPrenotazionePaziente) \ No newline at end of file diff --git a/routes/GestionePrenotazioniRoutes.py b/routes/GestionePrenotazioniRoutes.py new file mode 100644 index 0000000..1c38cca --- /dev/null +++ b/routes/GestionePrenotazioniRoutes.py @@ -0,0 +1,16 @@ +from flask import Blueprint +from controllers.GestionePrenotazioniController import * + +GestionePrenotazioni_bp = Blueprint('GestionePrenotazioni_bp', __name__) + +GestionePrenotazioni_bp.route('/disponibilitaRapido', methods=["GET", "POST"])(dispRapido) +GestionePrenotazioni_bp.route('////prenotaNuovo', methods=["GET","POST"])(prenotaNuovo) +GestionePrenotazioni_bp.route('////confermaPrenotaNuovo', methods=["GET","POST"])(confermaPrenotaNuovo) +GestionePrenotazioni_bp.route('////prenotaRegistrato', methods=["GET","POST"])(prenotaRegistrato) +GestionePrenotazioni_bp.route('////confermaPrenotaRegistrato', methods=["GET","POST"])(confermaPrenotaRegistrato) +GestionePrenotazioni_bp.route('/disponibilitaMolecolare', methods=["GET", "POST"])(dispMolecolare) +GestionePrenotazioni_bp.route('/checkQRCode', methods=["GET", "POST"])(checkQRCode) +GestionePrenotazioni_bp.route('/modificaPrenotazioni', methods=["GET", "POST"])(modificaPrenotazioni) +GestionePrenotazioni_bp.route('//aggiornaPrenotazioni', methods=["POST"])(aggiornaPrenotazioni) +GestionePrenotazioni_bp.route('/rimozionePrenotazioni', methods=["GET", "POST"])(rimozionePrenotazioni) +GestionePrenotazioni_bp.route('//rimuoviPrenotazioni', methods=["POST"])(rimuoviPrenotazioni) \ No newline at end of file diff --git a/routes/MLModelRoutes.py b/routes/MLModelRoutes.py new file mode 100644 index 0000000..c1bfee1 --- /dev/null +++ b/routes/MLModelRoutes.py @@ -0,0 +1,6 @@ +from flask import Blueprint +from controllers.MLModelController import * + +MLModel_bp = Blueprint('MLModel_bp', __name__) + +MLModel_bp.route('/', methods=["GET", "POST"])(covid_checker) \ No newline at end of file diff --git a/routes/MainHandlerRoutes.py b/routes/MainHandlerRoutes.py new file mode 100644 index 0000000..818ae5b --- /dev/null +++ b/routes/MainHandlerRoutes.py @@ -0,0 +1,8 @@ +from flask import Blueprint +from controllers.MainHandlerController import * + +MainHandler_bp = Blueprint('MainHandler_bp', __name__) + +MainHandler_bp.route('/about', methods=["GET", "POST"])(about) +MainHandler_bp.route('/scopri', methods=["GET", "POST"])(scopri) +MainHandler_bp.route('/listaFarmacie', methods=["GET", "POST"])(listaFarmacie) \ No newline at end of file diff --git "a/routes/__pycache__/GestioneDisponibilit\303\240Routes.cpython-310.pyc" "b/routes/__pycache__/GestioneDisponibilit\303\240Routes.cpython-310.pyc" new file mode 100644 index 0000000000000000000000000000000000000000..1b557b8cb17ce4dead1a019df69a5512e1efa9c3 GIT binary patch literal 1014 zcmaJ<%Wl&^6tx|vc{E8;RaJlr@-~RZG&`!QBIJc7lvJ@prOJ|-c&6!q?XhN@N@Ux0 zKLM#M*(31*{Drry*u$Rdw2lmfjOFXOXO543jxMWK%Mz@&*E{aVoFsiun(R`cc>%Zh z0tHK0_9S0EljUTuc#0(v8RtmuN;y-B`Yw-EoW~ne1sARrvT+4GqTb|j@smsnw;gaw z8BTGDmNRH+iEd`l@)E6N(9I=U&7hS8#Who^Z~cHjm+Ep{dg;wb$Y~HkBR`ov0Ju*? zL|H&ORD>*`6YA0E+l?~`=Z|%l6Ey$(5Lw7im~pP(wPN*TXj-6F@JV#Ru$b@Zocc3% zNwb3KJM)IFAHnAjjgAxD${erdKhk}M={a@Lf8_pATg$KM9-Gpjhq#YiissuoM&e?^ z5XUJts8{3sxrfAiu0TA|Qz$MABF;RIaM4(uS9{5bi;fc@pE%CXweiMz&Snvb?;n zdrD`5*h82QPA`eJuZ;tEa*>RQhN(6{A@iu#BbadNGR-jTHiKi^9QLf!)~KtsM(tOI z)ooj2XgXcf=nrhO`?_a!O{+b8V{{IlgY3y@2m@seHM7;xn$MaC`^~0(N+zu^bO5p! paS3~M{-Y#I(Fi}p#Ulu1=827^99d3k%VGL(?tt@Bu1bl&1Im#730 zv>+v2Qrg;1;cx;}bf9zZEM0IvcZDmuVsGt;-ZuyK?(y9g^$??5tk+^HR#Yo`+N$fk*b2w$VT$KtW_nmoBHnQNxojoP1WQrqaGOBnTFiDS8>8I zzE?u?NeOfJ>f{_Vo<+gM&ZybYv)zwHZoX&-%UB++RMluz6rj!Vt^)l3y!EoI%1g*H z-A>1Lwc0db4|W#!fUf1^l7A3Az{suo`x7nyEL|A^k_6nui<7~*BL_Twk4D98pOQq)*RQj);lki*c5Pqi$hGi OM^A`H`_41x1^oy01ho4A literal 0 HcmV?d00001 diff --git a/routes/__pycache__/GestioneFarmaciaRoutes.cpython-310.pyc b/routes/__pycache__/GestioneFarmaciaRoutes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8275e4aa56bd906b2aac6716e42d40a6e77f9197 GIT binary patch literal 948 zcmZXS%Wl&^6ox&{{hmNn6;>7tq#(7X*-=#$A#p+^6j!lBrN~m`WTxqW?Xkv5rFu!% zyhB;CX=~5GjqQAedhc}!zz`c1kbbE=HgRIl72=(@<~JR8ouBM z3|PX*kz6!IC|b*oY)S;-6iMC5(=@j3NY z5TF<0@qh#?$~@Ayxoa<|J)8SsNp;wgdL8UiPoxH#Dbg3ZVZt9dm#nTC4#Hd{Ve3^` zQ?VUf&za5fMjuwx1t<1Hy0ETtx*&Y9BMsGMm|oEYda9m5MW@5wxoR($lyPq-e*_6! z7A9*9pX~Ioxn?)?;k;3+CNfu!9em_6IG#RVFmJ_~;}9Mk?|bdWdm=xZdA3VtGag+E zk>TKth+?7-*{xwwi2QC_Q%*V+wLPPvzVB1i_uYxcf99e*|5*Ae@g~%?8Ge6*Rrl1I z1mMS7(se*A-6K6tZ-{cFOgxx*Kv&=I6-N422483n&cE+00 z8F$|fO|5HAAn0kva4@nA?Oos04701hANEdOLE4M44wt~x6{FKr+ArHDNA0$CN#-5j wp8>Kq%?hmj_Ku?-2FL!b$e%$g)($yGP=0U-Ls`nBqI@7%(ZS!h3G*TP18RmE*Z=?k literal 0 HcmV?d00001 diff --git a/routes/__pycache__/GestioneFarmacia_bp.cpython-310.pyc b/routes/__pycache__/GestioneFarmacia_bp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..26f6e50b5c20adb3c9f4ac0e7f6b22360dd8fda1 GIT binary patch literal 1023 zcmZ8g%TC)s6dgNp{79TYL5OzcRi#J;m+U|YHO+%YstCfSNS39@WQH)U$778Xqt=C*Aicn;I;xmHK$w+yNeaOfR;8B!3! z2rDsSN}womuEr{>1vOR=>P!nX)(9F*4|HY(1~UVbS%JlxK~q6Q!8OvlR|A{apWC>O zHQZRJSpTMy+CAhV_Cp&R-xX4Sia=vlG+N186}C~b%?hiRY^%Z=C2PaZ%Hz&v$+as= zt7JQ+vMD*d;i2y4AK9C(Qkd`K6-fn6mR+;3V!ohBA2XU14Vd%QvM_O!-9AyRxggOv z5-gh2sOShfCu06gY%q@L4XrZKVnMk`o;90-GM-bOkZK;b;&-$pwoXa5tV(9rY2I`z z-fE{Kzo?&2Js&F28Cl+PoaMTdfaSd7O3&9k68O=0Zo5_I`G&h@J>PWKz2~poV`$3J zWO(APSCPMf1Z!pFFQ4_WSS{$R+bOi0ILf{V6`CHrp7UfWcpMXv?XTB5DAz;{#6n(M zp-E^+&?OiWObPPJizYx}%w|c%$ZRHBGSmb#g8V>YODZJ%{RuEQ3NJI*HeAqEM#5=A zhJxM^XV1AzU=$f${(5jQbp&oOitjJMcFPu3%yY+bw_P0JOAHp7vj7MyY3qdcHFnnVV9lu0e0W(lz1Mbk&&$T(W6(=PokAdNrLk6Q+4t)BT2vFAYHN$ zyoAcXL4zbD`_fz<$#UFRe8rZqj50WLr;M^Vdy_+1ltVi+1?4|0c;^m$E47eP^NCta zsf9!>rPN}g?m||1m9>;;<&<+bQ7ehF9BXLLlIr`vVfRv97R6Wo0*8zQ5d`vcQR`qH z5gOpWwLHEckg`Y%(Nw#Dh0o2_B@E9gB2zN)`V0p&g4I)-SUyXfnm3yf%7V?l zCmJJjdOvqlo~QrvfN?=@$)@GH^@_+%eUHCm3Sb(YPG}G@>id}SlZOH6iAxk*H}K}z zby@sgM2^u#ghl0lc;%SV8j#pu^KtL_h@)*p#L+emqP7)-c)aECUnO<`dtNnvzC%wx zcZM8J?##%7W2YD379+Pn2`xpP1DgS3_Dh@ZC^D9 zhT0tHuT9&~?I8p$!!kQv$1>iuZNswl-dnSE_5#xO2R(RJc2BjMEwyplI6H1MoGUzT whM^0Rvx3Q;hc99f)8;4P2T`~HhzlQI%5V@~g{CYO;M1& literal 0 HcmV?d00001 diff --git a/routes/__pycache__/GestionePrenotazioniRoutes.cpython-310.pyc b/routes/__pycache__/GestionePrenotazioniRoutes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7490c02a5efcbfea71e333031cd8faa8ba1c4633 GIT binary patch literal 1389 zcmbW1&raJw5XNnjln@gBl#o)Xt$YOuTyiTy5vgNBq>@m_6bV_fjCT{Z*j{VxAk|mS zeTQCq>!mNyzQta9>I3xNaR9T>T#79_JHH)&JN{-JTCJ8PIDVux?^{uler17p6d>4x zD_)W%2}wxyr9eKF$%Cy8si5kZvCbPS6Z zj`{-&9-j?xa!yg4?rFOqxYKPrLze}vN8Dyk5;p)93?NQm+0jmiP!`gr7F{pc8`Ddg z9_0D|q2SSQh+(~((yx__$0*&@V&V~jD&2&phmVnYP>>+EcHhlI>SK@kF2iX>^Ukq% z@!r%a!s)6OP(+5ryM3uiKhjsX)igDCG|CLTKVR1v322skuaD`=yXPPQoF-zMd+W=* zIP~54f+?^&PB)OO!{6XTKiF_ebzq5|d3(oP{G~;+}nq7Q#s#|BI6j_{Sdbqxy0(GdK|(pi%IhHi;9Tab0g{#bsrcW* zTg&=sTFjS_rnX@8}MSFYtJWRq&lp4esL?`N{x~3mEA9 z8t68i7MQiktADptUkjQ07TIWM}AiU#}NaP8?NMz1WUNq<0ld%gYbUXP!_dA}@EZ1I`tQ`44h|+2b#f9X0*s7NHnV9M;WuoI`C6-yC zq!6I=+RuCEx1}u9l(i_zrYS^`nlDt^O3n&+HdF)IH+(!{~%M{(DrELXzs zsK6VH8{ZOEf*7V9*15GdHnTrC)TR#YUR$*H)neUS$UCTROYPmO{g&!BDjmdV{NOi` z&={NkYq4XM;$;m1equ&%2`?{5Nd;5cw%T_mWGi>I>6{0Nu`i=IfxKS9>KjS*zBkdi zgxCAgL~vb`1yKdbIa`kV#(6J@{-`YAY#!&btd$f{RG+p8{=ID6EGtRDvP?D8FpdH$ zGtM2odxtT@|0v&)8bR*C{QUu*|2$o5K&01vr&$`6Y_9kx=AC%!5>BOg{qvhgxwj;h z6x>@d$`sF~7lx@X;W~|@MRGM;1>S7sUxZ2ECu<1iK^&eh(>QpuNP;-=qj%x_>=~53 zTtzUKB=X|f+?zg~o}Emm=@r|~swx91Jv5=yR>!NREqz*jHtvf;(w$&0;YT2S1m+02 Mcwik{$M_Nc2a&Cy@Bjb+ literal 0 HcmV?d00001 diff --git a/routes/__pycache__/SelfTestCOVID19_bp.cpython-310.pyc b/routes/__pycache__/SelfTestCOVID19_bp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3db65d96d220aca1f73ea4a6de4374838a2bbc7 GIT binary patch literal 1022 zcmZ8g%TC)s6dl`f{KyLmLbNNdDy3?1$*u^Yrg_jv6+ze($+8rg%n+vac&u@PRBu`L zALz1+entPn+phWn-S-Y4V`VI#nS18=&V7t|t7Rh?uhQ+gRYT~HG^ztQ^d8;}DF|VN zl^8K4P!zdVW0h%v#%e*0>4DDbL7f?a!OXy9R$wtZuvsH$D2OOnBh6biXpz>JHm+eE z*B2@_zN(^a!CD&m^CvxQRuekub_)F}jo9>+vvd+WIl$~~chSjcND zbP06{h6GcBB|%>Nj@k!{7K8^j6=MSczC&T@B;P&)v3cd2Dj@KVLy|=ynH@#kXK`#4gIs+=a4>Jor t5?}ey^~VpP;d|+~!aRhotYUHme=N#&0h;KwYHK@cTiJPhwqf2?{sSZOA{hVx literal 0 HcmV?d00001 diff --git a/selftestcovid19.sql b/selftestcovid19.sql deleted file mode 100644 index 52e7a93..0000000 --- a/selftestcovid19.sql +++ /dev/null @@ -1,82 +0,0 @@ -DROP TABLE IF EXISTS Admin; -DROP TABLE IF EXISTS Farmacie; -DROP TABLE IF EXISTS Prenotazioni; -DROP TABLE IF EXISTS Tamponi; -DROP TABLE IF EXISTS Orari; -DROP TABLE IF EXISTS Pazienti; - -CREATE TABLE `Admin` ( - ID INTEGER PRIMARY KEY AUTOINCREMENT, - Username VARCHAR(50), - PWD VARCHAR(50) -); - -CREATE TABLE `Farmacie` ( - ID INTEGER PRIMARY KEY AUTOINCREMENT, - NomeFarmacia VARCHAR(50), - Citta VARCHAR(50), - CAP INT(5), - Indirizzo VARCHAR(50), - Email VARCHAR(50), - PWD VARCHAR(50) -); - -CREATE TABLE `Prenotazioni` ( - ID INTEGER PRIMARY KEY AUTOINCREMENT, - Nome VARCHAR(50), - Cognome VARCHAR(50), - Email VARCHAR(50), - CodiceFiscale VARCHAR(36), - Telefono VARCHAR(10), - Giorno DATE, - Ora TIME, - TipoTampone VARCHAR(10), - EsitoTampone VARCHAR(20), - ID_Farmacia INTEGER, - ID_Tampone INTEGER -); - -CREATE TABLE `Tamponi` ( - ID INTEGER PRIMARY KEY AUTOINCREMENT, - NomeTampone VARCHAR(50), - Tipo VARCHAR(10), - N_pezzi INTEGER, - Giorno DATE, - OraInizio TIME, - OraFine TIME, - Prezzo FLOAT, - ID_Farmacia INTEGER -); - -CREATE TABLE `Orari` ( - ID_Tampone INTEGER, - Giorno DATE, - Orario TIME, - PRIMARY KEY ("ID_Tampone","Giorno","Orario") -); - -CREATE TABLE `Pazienti` ( - ID INTEGER PRIMARY KEY AUTOINCREMENT, - Nome VARCHAR(50), - Cognome VARCHAR(50), - Email VARCHAR(50), - PWD VARCHAR(50), - CodiceFiscale VARCHAR(36), - Telefono VARCHAR(10) -); - -INSERT INTO Admin (Username,PWD) VALUES ('admin','admin'); - -INSERT INTO Tamponi (NomeTampone, Tipo, N_pezzi, Giorno, OraInizio, OraFine, Prezzo, ID_Farmacia) VALUES ('Tamporum', 'Rapido', 20,'2022-08-26','11:00', '11:15',15.0, 1); -INSERT INTO Tamponi (NomeTampone, Tipo, N_pezzi, Giorno, OraInizio, OraFine, Prezzo, ID_Farmacia) VALUES ('DazTamp', 'Molecolare', 20,'2022-08-26','11:15', '11:30',15.0, 1); - -INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Tampone) VALUES ('Gino', 'Pino', 'gino@gmail.com','GNOPNOLX12HJ', '3333233212','2022-08-26','11:00','Rapido','Negativo',1,1); -INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Tampone) VALUES ('Ciccio', 'Verde', 'cicc@gmail.com','GMOVRELX13HJ', '3332355789','2022-08-26','11:15','Molecolare','Negativo',2,1); -INSERT INTO Prenotazioni (Nome, Cognome, Email, CodiceFiscale, Telefono, Giorno, Ora, TipoTampone, EsitoTampone, ID_Farmacia, ID_Tampone) VALUES ('Giacomino', 'Pilopino', 'giacc@gmail.com','GNOPNOLX12HJ', '3334566654','2022-08-26','11:30','Rapido','Negativo',1,2); - -INSERT INTO Farmacie (NomeFarmacia, Citta, CAP, Indirizzo, Email, PWD) VALUES ('Don Bosco','Napoli','80001','Via Roma 1','donbosco@farmacia.it','prova1'); -INSERT INTO Farmacie (NomeFarmacia, Citta, CAP, Indirizzo, Email, PWD) VALUES ('Mastrelia','Napoli','80001','Corso Garibaldi 56','mastrelia@farmacia.it','prova2'); - -INSERT INTO Pazienti (Nome, Cognome, Email, PWD, CodiceFiscale, Telefono) VALUES ('Gino', 'Pino', 'gino@gmail.com', 'prova1','GNOPNOLX12HJ', '3333233212'); -INSERT INTO Pazienti (Nome, Cognome, Email, PWD, CodiceFiscale, Telefono) VALUES ('Ciccio', 'Verde', 'cicc@gmail.com', 'prova2','GMOVRELX13HJ', '3332355789'); -INSERT INTO Pazienti (Nome, Cognome, Email, PWD, CodiceFiscale, Telefono) VALUES ('Giacomino', 'Pilopino', 'giacc@gmail.com', 'prova3','GNOPNOLX12HJ', '3334566654'); diff --git a/templates/FarmaciaView/creazioneDisponibilitaTamponi.html b/templates/FarmaciaView/creazioneDisponibilitaTamponi.html index 277245e..da45dc4 100644 --- a/templates/FarmaciaView/creazioneDisponibilitaTamponi.html +++ b/templates/FarmaciaView/creazioneDisponibilitaTamponi.html @@ -83,6 +83,18 @@
Disponibilità tampone molecolare +
+ {% if msg_error != "" %} + {% block content %} + + {% endblock content %} + {% endif %} +
diff --git a/templates/PazienteRegistratoView/dashboardPaziente.html b/templates/PazienteRegistratoView/dashboardPaziente.html index ffeec8d..f1060d2 100644 --- a/templates/PazienteRegistratoView/dashboardPaziente.html +++ b/templates/PazienteRegistratoView/dashboardPaziente.html @@ -120,9 +120,7 @@

{{ esiti.TipoTampone }} {% if esiti.EsitoTampone == "Negativo" %} - {% block content %} Negativo - {% endblock content %} {% elif esiti.EsitoTampone == "Positivo" %} Positivo {% elif esiti.EsitoTampone == "Da effettuare" %} @@ -132,7 +130,11 @@

{% endif %} - Certificato disponibile + {% if (esiti.EsitoTampone == "Negativo") or (esiti.EsitoTampone == "Positivo") %} + Certificato disponibile + {% else %} + Certificato non disponibile + {% endif %}