216 lines
6.5 KiB
Python
216 lines
6.5 KiB
Python
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/<int:id>', 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/<int:id>', 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')
|