première release
This commit is contained in:
215
app-version-PC.py
Normal file
215
app-version-PC.py
Normal 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')
|
||||
Reference in New Issue
Block a user