From 21d80a6d50b4dc3aed6fcef88bf57c74d438fbb1 Mon Sep 17 00:00:00 2001 From: Stefan Hackenberg Date: Sat, 17 Aug 2024 14:01:26 +0200 Subject: [PATCH] Display stats on coffee.html --- coffeebuddy/__init__.py | 2 +- coffeebuddy/model.py | 66 +++++++++++++++++++------- coffeebuddy/route_coffee.py | 11 +++++ coffeebuddy/templates/coffee.html | 78 +++++++++++++++++++++++++++++-- 4 files changed, 135 insertions(+), 22 deletions(-) diff --git a/coffeebuddy/__init__.py b/coffeebuddy/__init__.py index 646ee62..4800051 100644 --- a/coffeebuddy/__init__.py +++ b/coffeebuddy/__init__.py @@ -13,7 +13,7 @@ from flask_sqlalchemy import SQLAlchemy from sqlalchemy.exc import OperationalError -__version__ = "1.2.1" +__version__ = "1.3.0" db = SQLAlchemy() login_manager = flask_login.LoginManager() diff --git a/coffeebuddy/model.py b/coffeebuddy/model.py index 2af949c..e2659a2 100644 --- a/coffeebuddy/model.py +++ b/coffeebuddy/model.py @@ -9,7 +9,7 @@ from sqlalchemy import text -def db_weekday(column): +def db_weekday(column) -> str: """Helper to extract weekday for different database backends""" if flask.current_app.db.engine.name == "postgresql": return sqlalchemy.func.extract("dow", column) @@ -230,6 +230,7 @@ def drinks_this_week(self) -> Tuple[List[str], List[int]]: def drinks_last_weeks( self, since=timedelta(weeks=12), + group_by="week", ) -> Tuple[List[str], List[int]]: db = flask.current_app.db now = date.today() @@ -238,23 +239,42 @@ def drinks_last_weeks( datetime.combine(now - timedelta(now.weekday()), datetime.min.time()) - since ) - data = tuple( - zip( - *db.session.execute( - db.select( - db_weekday(Drink.timestamp).label("weekday"), - db.func.count(db.func.Date(Drink.timestamp)) / number_of_weeks, - ) - .where( - (Drink.userid == self.id) - & (db.func.Date(Drink.timestamp) >= since) - ) - .group_by("weekday") - .order_by("weekday") - ).all() + if group_by == "week": + data = tuple( + zip( + *db.session.execute( + db.select( + db_weekday(Drink.timestamp).label("weekday"), + db.func.count(db.func.Date(Drink.timestamp)) + / number_of_weeks, + ) + .where( + (Drink.userid == self.id) + & (db.func.Date(Drink.timestamp) >= since) + ) + .group_by("weekday") + .order_by("weekday") + ).all() + ) + ) + return [weekday(int(i)) for i in data[0]], list(data[1]) + elif group_by == "day": + return tuple( + zip( + *db.session.execute( + db.select( + db.func.Date(Drink.timestamp).label("day"), + db.func.count(db.func.Date(Drink.timestamp)), + ) + .where( + (Drink.userid == self.id) + & (db.func.Date(Drink.timestamp) >= since) + ) + .group_by("day") + .order_by("day") + ).all() + ) ) - ) - return [weekday(int(i)) for i in data[0]], list(data[1]) @staticmethod def drinks_last_weeks_all(since=timedelta(weeks=12)) -> Tuple[List[str], List[int]]: @@ -288,6 +308,18 @@ def drinks_last_weeks_all(since=timedelta(weeks=12)) -> Tuple[List[str], List[in ) return [weekday(int(i)) for i in data[0]], list(data[1]) + def drinks_avg_today(self) -> float: + db = flask.current_app.db + today_weekday = str(date.today().weekday()) + + data = db.session.scalars( + db.select(db.func.count("*")) + .where(Drink.userid == self.id) + .where(db_weekday(db.func.Date(Drink.timestamp)) == today_weekday) + .group_by(db.func.Date(Drink.timestamp)) + ).all() + return sum(data) / len(data) if data else 0 + class Drink(flask.current_app.db.Model): id = flask.current_app.db.Column(flask.current_app.db.Integer, primary_key=True) diff --git a/coffeebuddy/route_coffee.py b/coffeebuddy/route_coffee.py index a9e16e0..866c6b9 100644 --- a/coffeebuddy/route_coffee.py +++ b/coffeebuddy/route_coffee.py @@ -1,8 +1,16 @@ +import datetime + import flask from coffeebuddy.model import Drink, User, escapefromhex +def last_mondays(weeks=4): + now = datetime.datetime.now().date() + monday = now - datetime.timedelta(days=now.weekday()) + return [monday - datetime.timedelta(weeks=i) for i in range(weeks)] + + def init(): @flask.current_app.route("/coffee.html", methods=["GET", "POST"]) def coffee(): @@ -41,4 +49,7 @@ def coffee(): "coffee.html", user=user, referer=flask.request.form if flask.request.method == "POST" else [], + today_name=datetime.datetime.now().strftime("%A"), + datetime=datetime, + last_mondays=last_mondays(), ) diff --git a/coffeebuddy/templates/coffee.html b/coffeebuddy/templates/coffee.html index 507a950..68ca9b3 100644 --- a/coffeebuddy/templates/coffee.html +++ b/coffeebuddy/templates/coffee.html @@ -46,6 +46,64 @@ {% endif %} }); + +