diff --git a/app/models.py b/app/models.py index e948f8c..f826a11 100644 --- a/app/models.py +++ b/app/models.py @@ -11,10 +11,10 @@ class User(UserMixin, db.Model): class Profile(db.Model): id = db.Column(db.Integer, primary_key=True) - user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False, index=True) name = db.Column(db.String(100)) email = db.Column(db.String(150), unique=True) - profile_pic = db.Column(db.Text) # Store image as a base64 string + profile_pic = db.deferred(db.Column(db.Text)) # Store image as a base64 string, deferred so it doesn't load on every query systolic_threshold = db.Column(db.Integer, default=140) diastolic_threshold = db.Column(db.Integer, default=90) dark_mode = db.Column(db.Boolean, default=False) diff --git a/app/routes/main.py b/app/routes/main.py index cb31264..c76cda9 100644 --- a/app/routes/main.py +++ b/app/routes/main.py @@ -245,15 +245,21 @@ def prepare_graph_data(readings): def calculate_progress_badges(user_id, user_tz): """Generate badges based on user activity and milestones using optimized queries.""" - now_local = datetime.now(user_tz).date() - badges = [] - total_readings = Reading.query.filter_by(user_id=user_id).count() if total_readings == 0: - return badges + return [] # Fetch only timestamps (highly optimized compared to fetching full objects) timestamps = db.session.query(Reading.timestamp).filter(Reading.user_id == user_id).order_by(Reading.timestamp.desc()).all() + return _compute_badges(total_readings, timestamps, user_tz) + +def _compute_badges(total_readings, timestamps, user_tz, now_local=None): + if now_local is None: + now_local = datetime.now(user_tz).date() + badges = [] + + if total_readings == 0: + return badges streak_count = 0 if timestamps: @@ -285,7 +291,7 @@ def calculate_progress_badges(user_id, user_tz): if streak_count >= 30: badges.append("Monthly Streak") - last_7_readings = db.session.query(Reading.timestamp).filter(Reading.user_id == user_id).order_by(Reading.timestamp.desc()).limit(7).all() + last_7_readings = timestamps[:7] if len(last_7_readings) == 7: if all(5 <= utc.localize(ts).astimezone(user_tz).hour < 12 for (ts,) in last_7_readings): badges.append("Morning Riser: Logged Readings Every Morning for a Week") diff --git a/app/templates/_layout.html b/app/templates/_layout.html index e1534c4..1ffebca 100644 --- a/app/templates/_layout.html +++ b/app/templates/_layout.html @@ -55,20 +55,8 @@
- {% endif %}
+ class="w-44 h-44 rounded-full border object-cover shadow">