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 @@ + 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):