première release

This commit is contained in:
2026-03-23 20:21:04 +01:00
commit 75c0a127bf
22 changed files with 3933 additions and 0 deletions

215
app-version-PC.py Normal file
View File

@@ -0,0 +1,215 @@
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')