from flask import Flask, render_template, request, redirect, url_for import sqlite3 from datetime import datetime, timedelta app = Flask(__name__) # Configuration base de données def get_connection(): conn = sqlite3.connect('menu_miam.db') conn.row_factory = sqlite3.Row return conn # Initialisation base de données def init_db(): conn = get_connection() conn.execute(''' CREATE TABLE IF NOT EXISTS recettes ( id INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT NOT NULL, ingredients TEXT, instructions TEXT, lien TEXT ) ''') conn.execute(''' CREATE TABLE IF NOT EXISTS menu ( id INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, jour TEXT NOT NULL, repas TEXT NOT NULL, recette_id INTEGER, FOREIGN KEY (recette_id) REFERENCES recettes (id) ) ''') conn.commit() conn.close() # Route principale - Menu @app.route('/') @app.route('/menu') def menu(): offset = int(request.args.get('offset', 0)) # Calcul des dates today = datetime.now().date() start_of_week = today - timedelta(days=today.weekday()) + timedelta(weeks=offset) days = [] jours_fr = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'] for i in range(7): day_date = start_of_week + timedelta(days=i) days.append({ 'name': jours_fr[i], 'date': day_date.strftime('%d/%m/%Y'), 'date_obj': day_date }) # Récupération menu conn = get_connection() menu_items = conn.execute(''' SELECT menu.*, recettes.nom, recettes.ingredients, recettes.lien FROM menu JOIN recettes ON menu.recette_id = recettes.id WHERE date BETWEEN ? AND ? ''', (days[0]['date_obj'].isoformat(), days[6]['date_obj'].isoformat())).fetchall() recettes = conn.execute('SELECT * FROM recettes ORDER BY nom').fetchall() conn.close() # Organisation menu menu_dict = {} for item in menu_items: key = f"{item['jour']}_{item['repas']}" menu_dict[key] = { 'nom': item['nom'], 'id': item['id'], 'ingredients': item['ingredients'], 'lien': item['lien'] } return render_template('menu.html', days=days, menu=menu_dict, recettes=recettes, offset=offset, start_date=days[0]['date'], end_date=days[6]['date']) # Ajouter au menu @app.route('/add_to_menu', methods=['POST']) def add_to_menu(): day = request.form['day'] meal = request.form['meal'] recette_id = request.form['recette_id'] offset = int(request.form.get('offset', 0)) # Calcul date today = datetime.now().date() start_of_week = today - timedelta(days=today.weekday()) + timedelta(weeks=offset) jours_fr = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'] day_index = jours_fr.index(day) target_date = start_of_week + timedelta(days=day_index) conn = get_connection() conn.execute(''' INSERT INTO menu (date, jour, repas, recette_id) VALUES (?, ?, ?, ?) ''', (target_date.isoformat(), day, meal, recette_id)) conn.commit() conn.close() return redirect(url_for('menu', offset=offset)) # Retirer du menu @app.route('/remove_from_menu', methods=['POST']) def remove_from_menu(): day = request.form['day'] meal = request.form['meal'] offset = int(request.form.get('offset', 0)) conn = get_connection() conn.execute('DELETE FROM menu WHERE jour = ? AND repas = ?', (day, meal)) conn.commit() conn.close() return redirect(url_for('menu', offset=offset)) # Changer de semaine @app.route('/change_week', methods=['POST']) def change_week(): offset = int(request.form['offset']) return redirect(url_for('menu', offset=offset)) # 🔍 Liste recettes avec RECHERCHE @app.route('/recettes') def recettes(): conn = get_connection() # Récupération du terme de recherche search = request.args.get('search', '').strip() # Recherche dans nom ET ingrédients if search: recettes = conn.execute(''' SELECT * FROM recettes WHERE nom LIKE ? OR ingredients LIKE ? ORDER BY nom ''', (f'%{search}%', f'%{search}%')).fetchall() else: recettes = conn.execute('SELECT * FROM recettes ORDER BY nom').fetchall() conn.close() return render_template('recettes.html', recettes=recettes, search=search) # Ajouter recette @app.route('/recettes/add', methods=['GET', 'POST']) def add_recette(): if request.method == 'POST': nom = request.form['nom'] ingredients = request.form.get('ingredients', '') instructions = request.form.get('instructions', '') lien = request.form.get('lien', '') conn = get_connection() conn.execute(''' INSERT INTO recettes (nom, ingredients, instructions, lien) VALUES (?, ?, ?, ?) ''', (nom, ingredients, instructions, lien)) conn.commit() conn.close() return redirect(url_for('recettes')) return render_template('add_recette.html') # Modifier recette @app.route('/recettes/edit/', methods=['GET', 'POST']) def edit_recette(id): conn = get_connection() if request.method == 'POST': nom = request.form['nom'] ingredients = request.form.get('ingredients', '') instructions = request.form.get('instructions', '') lien = request.form.get('lien', '') conn.execute(''' UPDATE recettes SET nom = ?, ingredients = ?, instructions = ?, lien = ? WHERE id = ? ''', (nom, ingredients, instructions, lien, id)) conn.commit() conn.close() return redirect(url_for('recettes')) recette = conn.execute('SELECT * FROM recettes WHERE id = ?', (id,)).fetchone() conn.close() return render_template('edit_recette.html', recette=recette) # Supprimer recette @app.route('/recettes/delete/', methods=['POST']) def delete_recette(id): conn = get_connection() conn.execute('DELETE FROM recettes WHERE id = ?', (id,)) conn.commit() conn.close() return redirect(url_for('recettes')) if __name__ == '__main__': init_db() app.run(debug=True, host='0.0.0.0')