File size: 8,048 Bytes
d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 d20dd7e f1d2cf1 0629b7c f1d2cf1 0655cb6 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 |
from flask import Flask, render_template, jsonify, request, redirect, url_for, session, flash
from models import User, Lotto, Prenotazione, db
from populate_db import init_db
from settings import DATABASE_PATH
app = Flask(__name__)
app.config.update(
SECRET_KEY='my_very_secret_key123',
SQLALCHEMY_DATABASE_URI='sqlite:///'+DATABASE_PATH,
# SQLALCHEMY_TRACK_MODIFICATIONS=False,
# DEBUG=True
)
db.init_app(app)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/prenotazioni')
def prenotazioni():
if 'user_id' not in session:
return redirect(url_for('login'))
return render_template('prenotazioni.html')
@app.route('/api/dati_lotti')
def get_dati_lotti():
# Esegui la query per ottenere tutti i lotti in ordine di data
lotti = Lotto.query.order_by(Lotto.data_consegna).all()
lotti_data = []
for lotto in lotti: # Model objects
lotti_data.append(lotto.to_dict())
return jsonify(lotti_data)
@app.route('/api/dati_prenotazioni')
def get_dati_prenotazioni():
if 'user_id' not in session:
return redirect(url_for('login'))
# Esegui la query per ottenere tutte le prenotazioni dell'utente loggato
# in ordine di data del lotto
# prenotazioni_user = Prenotazione.query.filter(Prenotazione.user_id == session['user_id'])
# prenotazioni = prenotazioni_user.join(Lotto).order_by(Lotto.data_consegna).all()
# Oppure, sfruttando la relazione tra Utente e Prenotazione con lazy='dynamic':
utente = db.session.get(User, session['user_id'])
prenotazioni = utente.prenotazioni.join(Lotto).order_by(Lotto.data_consegna).all()
prenotazioni_data = []
for prenot in prenotazioni:
# prenotazione_data = {
# 'prenotazione_id': prenot.id,
# 'qta': prenot.qta,
# 'prezzoTotale': prenot.get_prezzo_totale_str(),
# 'lotto': {
# 'lotto_id': prenot.lotto.id,
# 'dataConsegna': prenot.lotto.get_date(),
# 'qtaUnitaMisura': prenot.lotto.qta_unita_misura,
# 'qtaLotto': prenot.lotto.qta_lotto,
# 'qtaDisponibile': prenot.lotto.get_qta_disponibile(),
# 'prezzoUnitario': prenot.lotto.get_prezzo_str(),
# 'sospeso': prenot.lotto.sospeso,
# 'prodotto': {
# 'prodotto_id': prenot.lotto.prodotto.id,
# 'nome': prenot.lotto.prodotto.nome,
# 'produttore': {
# 'produttore_id': prenot.lotto.prodotto.produttore.id,
# 'nome': prenot.lotto.prodotto.produttore.nome,
# 'descrizione': prenot.lotto.prodotto.produttore.descrizione,
# 'indirizzo': prenot.lotto.prodotto.produttore.indirizzo,
# 'telefono': prenot.lotto.prodotto.produttore.telefono,
# 'email': prenot.lotto.prodotto.produttore.email,
# }
# }
# }
# }
# prenotazioni_data.append(prenotazione_data)
prenotazioni_data.append(prenot.to_dict())
return jsonify(prenotazioni_data)
@app.route('/prenotazione/<int:lotto_id>', methods=['GET', 'POST'])
def prenotazione(lotto_id):
if 'user_id' not in session:
return redirect(url_for('login'))
lotto = db.session.get(Lotto, lotto_id)
# Cerca se esiste già una prenotazione per il lotto e l'utente loggato
prenotazione_esistente = Prenotazione.query.filter_by(
lotto_id=lotto_id, user_id=session['user_id']).first()
if request.method == 'POST':
azione = request.form.get('azione')
quantita = int(request.form.get('quantita'), 0)
qta_disponibile = lotto.get_qta_disponibile()
if quantita <= 0:
flash('Quantità non valida. Inserire un numero maggiore di 0.', 'danger')
return render_template('prenotazione.html', azione=azione, lotto=lotto, quantita=1,
prenotazione_esistente=prenotazione_esistente)
if azione == 'aggiornaPrenotazione':
if not prenotazione_esistente:
raise ValueError('Prenotazione non esistente.')
if quantita > qta_disponibile + prenotazione_esistente.qta:
flash('La quantità richiesta supera quella disponibile.', 'danger')
return render_template('prenotazione.html', azione=azione, lotto=lotto, quantita=quantita,
prenotazione_esistente=prenotazione_esistente)
prenotazione_esistente.qta = quantita
db.session.commit()
flash(f'Prenotazione di "{lotto.prodotto.nome}" aggiornata a {quantita} {lotto.qta_unita_misura}.', 'success')
elif azione == 'nuovaPrenotazione':
if quantita > qta_disponibile:
flash('La quantità richiesta supera quella disponibile.', 'danger')
return render_template('prenotazione.html', azione=azione, lotto=lotto, quantita=quantita,
prenotazione_esistente=prenotazione_esistente)
if prenotazione_esistente:
prenotazione_esistente.qta += quantita
db.session.commit()
flash(f'Aggiunti {quantita} {lotto.qta_unita_misura} alla prenotazione preesistente di "{lotto.prodotto.nome}".', 'success')
else:
prenotazione = Prenotazione(
user_id=session['user_id'],
lotto_id=lotto_id,
qta=quantita
)
db.session.add(prenotazione)
db.session.commit()
flash(f'Prenotazione di {quantita} {lotto.qta_unita_misura} di "{lotto.prodotto.nome}" effettuata con successo!', 'success')
elif azione == 'eliminaPrenotazione':
if not prenotazione_esistente:
raise ValueError('Prenotazione non esistente.')
db.session.delete(prenotazione_esistente)
db.session.commit()
flash('Prenotazione eliminata con successo.', 'warning')
else:
raise ValueError('Azione non implementata.')
return redirect(url_for('prenotazioni'))
else: # GET request
# Legge il parametro GET 'action' dalla URL
azione = request.args.get('azione')
if azione == 'aggiornaPrenotazione':
if prenotazione_esistente:
quantita = prenotazione_esistente.qta
else:
raise ValueError('Prenotazione non esistente.')
elif azione == 'nuovaPrenotazione':
quantita = 1
# if prenotazione_esistente:
# azione = 'aggiungiPrenotazione'
elif azione == 'eliminaPrenotazione':
...
raise ValueError('Azione non implementata con GET.')
else:
raise ValueError('Azione non valida.')
return render_template('prenotazione.html',
azione=azione, lotto=lotto, quantita=quantita,
prenotazione_esistente=prenotazione_esistente)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
email = request.form['email']
password = request.form['password']
user = User.query.filter_by(email=email).first()
if user and user.password == password:
session['user_id'] = user.id
flash(f'Login riuscito. Benvenuto {user.nome}!', 'success')
return redirect(url_for('prenotazioni'))
else:
flash('Login non riuscito. Controlla email e password.', 'danger')
return render_template('login.html')
@app.route('/logout')
def logout():
session.pop('user_id', None)
return redirect(url_for('login'))
with app.app_context():
init_db()
if __name__ == '__main__':
app.run(host="0.0.0.0", port=7860)
|