diff --git a/app.py b/app.py
index 5afaacd..b937434 100644
--- a/app.py
+++ b/app.py
@@ -5,7 +5,6 @@ from flask import (
)
from flask_login import (
login_required,
- logout_user,
current_user,
)
from models import User
diff --git a/application/static/css/macros.css b/application/static/css/macros.css
new file mode 100644
index 0000000..e69de29
diff --git a/application/templates/base.html b/application/templates/base.html
index bd29f84..a6e2fd3 100644
--- a/application/templates/base.html
+++ b/application/templates/base.html
@@ -25,6 +25,9 @@
Daily Log
+
+ Daily Log (new)
+
Dashboard
diff --git a/application/user/routes.py b/application/user/routes.py
index cb7bd20..443c3d9 100644
--- a/application/user/routes.py
+++ b/application/user/routes.py
@@ -13,6 +13,8 @@ from forms import FoodItemForm
from models import FoodItem, FoodLog
from datetime import datetime, timezone, timedelta
from application.utils import login_required
+from typing import cast
+from numpy import array
user_bp = Blueprint(
"user",
@@ -21,6 +23,49 @@ user_bp = Blueprint(
)
+def macro_arr_to_json(data: list[float]):
+ assert len(data) == 4
+ macros = [
+ {
+ "name": "Calories",
+ "current": data[0],
+ "target": 2000,
+ "percent": data[0] / 20,
+ "unit": " kcal",
+ "color": "bg-calories",
+ "overflow_color": "bg-calories-dark",
+ },
+ {
+ "name": "Protein",
+ "current": data[3],
+ "target": 150,
+ "percent": data[3] / 1.5,
+ "unit": "g",
+ "color": "bg-protein",
+ "overflow_color": "bg-protein-dark",
+ },
+ {
+ "name": "Carbs",
+ "current": data[2],
+ "target": 250,
+ "percent": data[2] / 2.5,
+ "unit": "g",
+ "color": "bg-carbs",
+ "overflow_color": "bg-carbs-dark",
+ },
+ {
+ "name": "Fat",
+ "current": data[1],
+ "target": 70,
+ "percent": data[1] / 0.7,
+ "unit": "g",
+ "color": "bg-fat",
+ "overflow_color": "bg-fat-dark",
+ },
+ ]
+ return macros
+
+
user_bp.before_request(login_required)
@@ -100,6 +145,18 @@ def daily_log(offset: int = 0):
)
+@user_bp.route("/daily_log2", methods=["GET"])
+def daily_log2():
+ today = datetime.now(timezone.utc).date()
+ logs_today = current_user.food_logs.filter_by(date_=today).all()
+ macros = array((0.0, 0.0, 0.0, 0.0))
+ for log in logs_today:
+ item = cast(FoodItem, log.food_item)
+ macros += array(item.macros()) / 100 * log.amount
+ macros = macro_arr_to_json(macros.tolist())
+ return render_template("daily_log2.html", macros=macros, logs=logs_today)
+
+
@user_bp.route("/remove_log/", methods=["POST"])
def remove_log(id: int):
log = db.session.get(FoodLog, id)
diff --git a/application/user/templates/daily_log2.html b/application/user/templates/daily_log2.html
new file mode 100644
index 0000000..c8f222c
--- /dev/null
+++ b/application/user/templates/daily_log2.html
@@ -0,0 +1,55 @@
+{% extends 'base.html' %}
+
+{% block title %}Daily Calorie Dashboard{% endblock %}
+
+{% block content %}
+
+
+
+
Daily Calorie Dashboard
+
+
+
+
Macros
+ {% for macro in macros %}
+
+
{{ macro.name }}: {{ macro.current }} / {{ macro.target }}
+
+
+ {{ macro.current }}{{ macro.unit }}
+
+
+ {{ macro.current }}{{ macro.unit }}
+
+
+
+ {% endfor %}
+
+
+
+
+
Items Eaten Today
+
+ {% for log in logs %}
+
+ {{ log.food_item.name }}
+ {{ log.food_item.energy_100 }} kcal, {{ log.food_item.protein_100 }}g P, {{
+ log.food_item.carbs_100 }}g C,
+ {{ log.food_item.fat_100 }}g F
+
+ {% endfor %}
+
+
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/models.py b/models.py
index 22ca4b8..32d27d9 100644
--- a/models.py
+++ b/models.py
@@ -49,17 +49,18 @@ class Unit(db.Model):
class FoodItem(db.Model):
__tablename__ = "food_item"
+
id = db.Column(db.Integer, primary_key=True)
barcode = db.Column(db.String)
owner_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
name = db.Column(db.String(150), nullable=False)
- energy_100 = db.Column(db.Float, nullable=False)
- protein_100 = db.Column(db.Float, nullable=False)
- carbs_100 = db.Column(db.Float, nullable=False)
- sugar_100 = db.Column(db.Float)
- fat_100 = db.Column(db.Float, nullable=False)
- saturated_fat_100 = db.Column(db.Float)
+ energy_100: float = db.Column(db.Float, nullable=False)
+ protein_100: float = db.Column(db.Float, nullable=False)
+ carbs_100: float = db.Column(db.Float, nullable=False)
+ sugar_100: Optional[float] = db.Column(db.Float)
+ fat_100: float = db.Column(db.Float, nullable=False)
+ saturated_fat_100: Optional[float] = db.Column(db.Float)
food_logs = db.relationship(
"FoodLog",
@@ -99,26 +100,20 @@ class FoodItem(db.Model):
def updateFromForm(self, form: FoodItemForm):
self.name = form.name.data
- self.energy_100 = form.energy.data
- self.protein_100 = form.protein.data
- self.carbs_100 = form.carbs.data
+ self.energy_100 = form.energy.data or 0
+ self.protein_100 = form.protein.data or 0
+ self.carbs_100 = form.carbs.data or 0
self.sugar_100 = form.sugar.data
- self.fat_100 = form.fat.data
+ self.fat_100 = form.fat.data or 0
self.saturated_fat_100 = form.saturated_fat.data
- def to_dict(self):
- return {
- "id": self.id,
- "barcode": self.barcode,
- "name": self.name,
- "owner_id": self.owner_id,
- "energy_100": self.energy_100,
- "protein_100": self.protein_100,
- "carbs_100": self.carbs_100,
- "sugar_100": self.sugar_100,
- "fat_100": self.fat_100,
- "saturated_fat_100": self.saturated_fat_100,
- }
+ def macros(self) -> tuple[float, float, float, float]:
+ return (
+ self.energy_100,
+ self.fat_100,
+ self.carbs_100,
+ self.protein_100,
+ )
class FoodLog(db.Model):