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/', 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)