Add daily overview and part_of_day to food logs

Introduces 'overview' and 'test' routes and templates for daily nutrition summaries. Updates FoodLog model to include 'part_of_day' and 'date_' fields for better log categorization. Adjusts log creation and seed data to support new fields. Removes SSL context from app run for local development.
This commit is contained in:
2025-07-07 14:44:50 +02:00
parent 74ce42c578
commit 30e5e959cd
6 changed files with 182 additions and 5 deletions

3
app.py
View File

@@ -81,4 +81,5 @@ def scan():
# Run
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True, ssl_context=("cert.pem", "key.pem"))
# app.run(host="0.0.0.0", debug=True, ssl_context=("cert.pem", "key.pem"))
app.run(host="0.0.0.0", debug=True)

View File

@@ -3,6 +3,7 @@ from flask_login import current_user
from application import db
from forms import FoodItemForm, FoodLogForm
from models import FoodItem, FoodLog
from datetime import datetime, timezone
user_bp = Blueprint(
"user",
@@ -163,8 +164,27 @@ def log_food(item_id):
item_id,
current_user.id,
form.amount.data,
part_of_day=0,
)
)
db.session.commit()
return redirect(url_for("user.dashboard"))
return render_template("log_food.html", item_id=item_id, form=form)
@user_bp.route("/overview", methods=["GET"])
def overview():
return render_template("overview.html")
@user_bp.route("/", methods=["GET"])
def test():
today = datetime.now(timezone.utc).date()
logs_today = current_user.food_logs.filter_by(date_=today).all()
logs = {0: [], 1: [], 2: [], 3: []}
for log in logs_today:
logs[log.part_of_day].append(log)
print(logs)
return render_template(
"test.html", date=(today.strftime("%d/%m/%y")), logs=logs
)

View File

@@ -0,0 +1,69 @@
{% extends "base.html" %}
{% block title %}
Food Nutritional Info
{% endblock %}
{% block content %}
<div class="container my-4">
<div class="d-flex justify-content-center mb-4">
<h1>Daily Nutrition Overview</h1>
</div>
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-4 g-4">
<!-- Calories -->
<div class="col">
<div class="card text-bg-primary h-100">
<div class="card-body">
<h5 class="card-title">Calories</h5>
<h2>1,850 / 2,000 kcal</h2>
<div class="progress mt-3" style="height: 10px;">
<div class="progress-bar bg-warning" style="width: 92%;"></div>
</div>
</div>
</div>
</div>
<!-- Protein -->
<div class="col">
<div class="card text-bg-success h-100">
<div class="card-body">
<h5 class="card-title">Protein</h5>
<h2>120g / 150g</h2>
<div class="progress mt-3" style="height: 10px;">
<div class="progress-bar bg-light" style="width: 80%;"></div>
</div>
</div>
</div>
</div>
<!-- Carbs -->
<div class="col">
<div class="card text-bg-info h-100">
<div class="card-body">
<h5 class="card-title">Carbs</h5>
<h2>200g / 250g</h2>
<div class="progress mt-3" style="height: 10px;">
<div class="progress-bar bg-dark" style="width: 80%;"></div>
</div>
</div>
</div>
</div>
<!-- Fat -->
<div class="col">
<div class="card text-bg-danger h-100">
<div class="card-body">
<h5 class="card-title">Fat</h5>
<h2>60g / 70g</h2>
<div class="progress mt-3" style="height: 10px;">
<div class="progress-bar bg-light" style="width: 86%;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock%}

View File

@@ -0,0 +1,69 @@
{% extends "base.html" %}
{% block title %}
Food Nutritional Info
{% endblock %}
{% block content %}
<!-- Daily Overview Section -->
<div class="container">
<div class="mb-4 p-3 border rounded">
<div class="text-center">
<h2>Daily Overview ({{date}})</h2>
<p>Summary info here...</p>
</div>
</div>
<div class="p-3 border rounded">
<div class="text-center">
<h2>Detailed Information</h2>
<p>More content here...</p>
</div>
<div class="p-3 mb-2 border rounded">
<h4>Breakfast</h4>
{% for log in logs[0] %}
<p>{{log.food_item.name}}</p>
{% endfor %}
</div>
<div class="p-3 mb-2 border rounded">
<h4>Lunch</h4>
{% for log in logs[1] %}
<p>{{log.food_item.name}}</p>
{% endfor %}
</div>
<div class="p-3 mb-2 border rounded">
<h4>Dinner</h4>
{% for log in logs[2] %}
<p>{{log.food_item.name}}</p>
{% endfor %}
</div>
<div class="p-3 mb-2 border rounded">
<h4>Snacks</h4>
{% for log in logs[3] %}
<p>{{log.food_item.name}}</p>
{% endfor %}
</div>
</div>
</div>
<div class="container-fluid my-4">
<div class="d-flex justify-content-center">
<h1>Overview {{date}}</h1>
</div>
<div class="d-flex justify-content-center">
<div class="mx-2">ENERGY</div>
<div class="mx-2">PROTEIN</div>
<div class="mx-2">CARBS</div>
<div class="mx-2">FATS</div>
</div>
<div class="m-5"></div>
<div class="d-flex justify-content-center">
<div> Breakfast </div>
</div>
</div>
{% endblock%}

View File

@@ -3,7 +3,7 @@ from werkzeug.security import generate_password_hash, check_password_hash
from application import db
from typing import Optional
from forms import FoodItemForm
from datetime import datetime, timezone
from datetime import datetime, timezone, date
class User(UserMixin, db.Model):
@@ -107,17 +107,31 @@ class FoodItem(db.Model):
class FoodLog(db.Model):
__tablename__ = "food_log"
id = db.Column(db.Integer, primary_key=True)
datetime = db.Column(
datetime_created = db.Column(
db.DateTime, default=datetime.now(timezone.utc), nullable=False
)
date_ = db.Column(
db.Date, default=datetime.now(timezone.utc).date, nullable=False
)
food_item_id = db.Column(
db.Integer, db.ForeignKey("food_item.id"), nullable=False
)
part_of_day = db.Column(db.Integer, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
amount = db.Column(db.Integer, nullable=False)
def __init__(self, food_item_id: int, user_id: int, amount: int):
def __init__(
self,
food_item_id: int,
user_id: int,
amount: int,
part_of_day: int,
date_: Optional[date] = None,
):
super().__init__()
self.food_item_id = food_item_id
self.user_id = user_id
self.amount = amount
if date_ is not None:
self.date_ = date_
self.part_of_day = part_of_day

View File

@@ -22,6 +22,10 @@ with app.app_context():
)
FoodLog.query.delete()
db.session.add(FoodLog(1, 1, 200))
db.session.add(FoodLog(1, 1, 200, 0))
db.session.add(FoodLog(1, 1, 200, 1))
db.session.add(FoodLog(1, 1, 200, 2))
db.session.add(FoodLog(1, 1, 200, 3))
db.session.add(FoodLog(1, 1, 100, 1))
db.session.commit()