pippotest / app.py
Walter Mantovani
nuova app caricata per test
d20dd7e
raw
history blame
8.06 kB
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())
print(lotti_data)
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'))
if __name__ == '__main__':
with app.app_context():
init_db()
app.run(debug=True)