|
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, |
|
|
|
|
|
) |
|
|
|
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(): |
|
|
|
lotti = Lotto.query.order_by(Lotto.data_consegna).all() |
|
lotti_data = [] |
|
for lotto in lotti: |
|
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')) |
|
|
|
|
|
|
|
|
|
|
|
|
|
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: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) |
|
|
|
|
|
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: |
|
|
|
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 |
|
|
|
|
|
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) |
|
|