views.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. from django.shortcuts import render, redirect, get_object_or_404
  2. from django.contrib.auth.decorators import login_required
  3. from django.contrib import messages
  4. from datetime import date, timedelta
  5. from .models import Journee, Repas, CompositionRepas, Aliment, TypeJournee, TypeRepas
  6. from .forms import JourneeForm, RepasForm, CompositionRepasForm
  7. def index(request):
  8. """Page d'accueil avec explications du carb-cycling"""
  9. return render(request, 'nutrition/index.html')
  10. @login_required
  11. def tableau_de_bord(request):
  12. """Tableau de bord affichant les journées de la semaine"""
  13. aujourdhui = date.today()
  14. debut_semaine = aujourdhui - timedelta(days=aujourdhui.weekday())
  15. fin_semaine = debut_semaine + timedelta(days=6)
  16. journees = Journee.objects.filter(
  17. user=request.user,
  18. date__gte=debut_semaine,
  19. date__lte=fin_semaine
  20. ).prefetch_related('repas__compositions__aliment')
  21. # Créer un dictionnaire des journées par date
  22. journees_dict = {j.date: j for j in journees}
  23. # Générer les 7 jours de la semaine
  24. semaine = []
  25. for i in range(7):
  26. jour = debut_semaine + timedelta(days=i)
  27. semaine.append({
  28. 'date': jour,
  29. 'journee': journees_dict.get(jour)
  30. })
  31. context = {
  32. 'semaine': semaine,
  33. 'debut_semaine': debut_semaine,
  34. 'fin_semaine': fin_semaine,
  35. }
  36. return render(request, 'nutrition/tableau_de_bord.html', context)
  37. @login_required
  38. def creer_journee(request, date_str=None):
  39. """Créer une nouvelle journée"""
  40. if date_str:
  41. date_journee = date.fromisoformat(date_str)
  42. else:
  43. date_journee = date.today()
  44. if request.method == 'POST':
  45. form = JourneeForm(request.POST)
  46. if form.is_valid():
  47. journee = form.save(commit=False)
  48. journee.user = request.user
  49. journee.date = date_journee
  50. journee.save()
  51. messages.success(request, 'Journée créée avec succès!')
  52. return redirect('detail_journee', pk=journee.pk)
  53. else:
  54. form = JourneeForm(initial={'date': date_journee})
  55. return render(request, 'nutrition/creer_journee.html', {
  56. 'form': form,
  57. 'date_journee': date_journee
  58. })
  59. @login_required
  60. def detail_journee(request, pk):
  61. """Détail d'une journée avec ses repas"""
  62. journee = get_object_or_404(Journee, pk=pk, user=request.user)
  63. repas = journee.repas.all().prefetch_related('compositions__aliment')
  64. # Calculer les apports recommandés selon le type de journée
  65. recommandations = get_recommandations(journee.type_journee)
  66. context = {
  67. 'journee': journee,
  68. 'repas': repas,
  69. 'recommandations': recommandations,
  70. }
  71. return render(request, 'nutrition/detail_journee.html', context)
  72. def get_recommandations(type_journee):
  73. """Retourne les recommandations selon le type de journée"""
  74. if type_journee == TypeJournee.PAUVRE:
  75. return {
  76. 'titre': 'Journée pauvre en glucides',
  77. 'glucides': '0-1 apport',
  78. 'proteines': '3-4 apports',
  79. 'lipides': '3-4 apports',
  80. 'legumes': 'Sans modération',
  81. 'description': 'Privilégiez les protéines et les lipides. Limitez les glucides au maximum.'
  82. }
  83. elif type_journee == TypeJournee.NORMAL:
  84. return {
  85. 'titre': 'Journée normale',
  86. 'glucides': '2-3 apports',
  87. 'proteines': '3-4 apports',
  88. 'lipides': '2-3 apports',
  89. 'legumes': 'Sans modération',
  90. 'description': 'Équilibre entre glucides, protéines et lipides.'
  91. }
  92. else: # RICHE
  93. return {
  94. 'titre': 'Journée riche en glucides',
  95. 'glucides': '4-5 apports',
  96. 'proteines': '3-4 apports',
  97. 'lipides': '1-2 apports',
  98. 'legumes': 'Sans modération',
  99. 'description': 'Rechargez vos batteries! Privilégiez les glucides, réduisez les lipides.'
  100. }
  101. @login_required
  102. def ajouter_repas(request, journee_pk):
  103. """Ajouter un repas à une journée"""
  104. journee = get_object_or_404(Journee, pk=journee_pk, user=request.user)
  105. if request.method == 'POST':
  106. form = RepasForm(request.POST)
  107. if form.is_valid():
  108. repas = form.save(commit=False)
  109. repas.journee = journee
  110. repas.save()
  111. messages.success(request, 'Repas ajouté avec succès!')
  112. return redirect('detail_repas', pk=repas.pk)
  113. else:
  114. form = RepasForm()
  115. return render(request, 'nutrition/ajouter_repas.html', {
  116. 'form': form,
  117. 'journee': journee
  118. })
  119. @login_required
  120. def detail_repas(request, pk):
  121. """Détail d'un repas avec sa composition"""
  122. repas = get_object_or_404(Repas, pk=pk, journee__user=request.user)
  123. compositions = repas.compositions.all().select_related('aliment')
  124. return render(request, 'nutrition/detail_repas.html', {
  125. 'repas': repas,
  126. 'compositions': compositions,
  127. })
  128. @login_required
  129. def ajouter_aliment_repas(request, repas_pk):
  130. """Ajouter un aliment à un repas"""
  131. repas = get_object_or_404(Repas, pk=repas_pk, journee__user=request.user)
  132. if request.method == 'POST':
  133. form = CompositionRepasForm(request.POST)
  134. if form.is_valid():
  135. composition = form.save(commit=False)
  136. composition.repas = repas
  137. composition.save()
  138. messages.success(request, 'Aliment ajouté!')
  139. return redirect('detail_repas', pk=repas.pk)
  140. else:
  141. form = CompositionRepasForm()
  142. return render(request, 'nutrition/ajouter_aliment.html', {
  143. 'form': form,
  144. 'repas': repas
  145. })
  146. def guide_carb_cycling(request):
  147. """Page explicative du carb-cycling"""
  148. return render(request, 'nutrition/guide.html')
  149. def liste_aliments(request):
  150. """Liste des aliments par catégorie"""
  151. aliments = Aliment.objects.all()
  152. # Regrouper par catégorie
  153. aliments_par_categorie = {}
  154. for aliment in aliments:
  155. categorie = aliment.get_categorie_display()
  156. if categorie not in aliments_par_categorie:
  157. aliments_par_categorie[categorie] = []
  158. aliments_par_categorie[categorie].append(aliment)
  159. return render(request, 'nutrition/liste_aliments.html', {
  160. 'aliments_par_categorie': aliments_par_categorie
  161. })