from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib import messages from datetime import date, timedelta from .models import Journee, Repas, CompositionRepas, Aliment, TypeJournee, TypeRepas from .forms import JourneeForm, RepasForm, CompositionRepasForm def index(request): """Page d'accueil avec explications du carb-cycling""" return render(request, 'nutrition/index.html') @login_required def tableau_de_bord(request): """Tableau de bord affichant les journées de la semaine""" aujourdhui = date.today() debut_semaine = aujourdhui - timedelta(days=aujourdhui.weekday()) fin_semaine = debut_semaine + timedelta(days=6) journees = Journee.objects.filter( user=request.user, date__gte=debut_semaine, date__lte=fin_semaine ).prefetch_related('repas__compositions__aliment') # Créer un dictionnaire des journées par date journees_dict = {j.date: j for j in journees} # Générer les 7 jours de la semaine semaine = [] for i in range(7): jour = debut_semaine + timedelta(days=i) semaine.append({ 'date': jour, 'journee': journees_dict.get(jour) }) context = { 'semaine': semaine, 'debut_semaine': debut_semaine, 'fin_semaine': fin_semaine, } return render(request, 'nutrition/tableau_de_bord.html', context) @login_required def creer_journee(request, date_str=None): """Créer une nouvelle journée""" if date_str: date_journee = date.fromisoformat(date_str) else: date_journee = date.today() if request.method == 'POST': form = JourneeForm(request.POST) if form.is_valid(): journee = form.save(commit=False) journee.user = request.user journee.date = date_journee journee.save() messages.success(request, 'Journée créée avec succès!') return redirect('detail_journee', pk=journee.pk) else: form = JourneeForm(initial={'date': date_journee}) return render(request, 'nutrition/creer_journee.html', { 'form': form, 'date_journee': date_journee }) @login_required def detail_journee(request, pk): """Détail d'une journée avec ses repas""" journee = get_object_or_404(Journee, pk=pk, user=request.user) repas = journee.repas.all().prefetch_related('compositions__aliment') # Calculer les apports recommandés selon le type de journée recommandations = get_recommandations(journee.type_journee) context = { 'journee': journee, 'repas': repas, 'recommandations': recommandations, } return render(request, 'nutrition/detail_journee.html', context) def get_recommandations(type_journee): """Retourne les recommandations selon le type de journée""" if type_journee == TypeJournee.PAUVRE: return { 'titre': 'Journée pauvre en glucides', 'glucides': '0-1 apport', 'proteines': '3-4 apports', 'lipides': '3-4 apports', 'legumes': 'Sans modération', 'description': 'Privilégiez les protéines et les lipides. Limitez les glucides au maximum.' } elif type_journee == TypeJournee.NORMAL: return { 'titre': 'Journée normale', 'glucides': '2-3 apports', 'proteines': '3-4 apports', 'lipides': '2-3 apports', 'legumes': 'Sans modération', 'description': 'Équilibre entre glucides, protéines et lipides.' } else: # RICHE return { 'titre': 'Journée riche en glucides', 'glucides': '4-5 apports', 'proteines': '3-4 apports', 'lipides': '1-2 apports', 'legumes': 'Sans modération', 'description': 'Rechargez vos batteries! Privilégiez les glucides, réduisez les lipides.' } @login_required def ajouter_repas(request, journee_pk): """Ajouter un repas à une journée""" journee = get_object_or_404(Journee, pk=journee_pk, user=request.user) if request.method == 'POST': form = RepasForm(request.POST) if form.is_valid(): repas = form.save(commit=False) repas.journee = journee repas.save() messages.success(request, 'Repas ajouté avec succès!') return redirect('detail_repas', pk=repas.pk) else: form = RepasForm() return render(request, 'nutrition/ajouter_repas.html', { 'form': form, 'journee': journee }) @login_required def detail_repas(request, pk): """Détail d'un repas avec sa composition""" repas = get_object_or_404(Repas, pk=pk, journee__user=request.user) compositions = repas.compositions.all().select_related('aliment') return render(request, 'nutrition/detail_repas.html', { 'repas': repas, 'compositions': compositions, }) @login_required def ajouter_aliment_repas(request, repas_pk): """Ajouter un aliment à un repas""" repas = get_object_or_404(Repas, pk=repas_pk, journee__user=request.user) if request.method == 'POST': form = CompositionRepasForm(request.POST) if form.is_valid(): composition = form.save(commit=False) composition.repas = repas composition.save() messages.success(request, 'Aliment ajouté!') return redirect('detail_repas', pk=repas.pk) else: form = CompositionRepasForm() return render(request, 'nutrition/ajouter_aliment.html', { 'form': form, 'repas': repas }) def guide_carb_cycling(request): """Page explicative du carb-cycling""" return render(request, 'nutrition/guide.html') def liste_aliments(request): """Liste des aliments par catégorie""" aliments = Aliment.objects.all() # Regrouper par catégorie aliments_par_categorie = {} for aliment in aliments: categorie = aliment.get_categorie_display() if categorie not in aliments_par_categorie: aliments_par_categorie[categorie] = [] aliments_par_categorie[categorie].append(aliment) return render(request, 'nutrition/liste_aliments.html', { 'aliments_par_categorie': aliments_par_categorie })