from flask import Blueprint, render_template, redirect, request, url_for, flash from pytz import timezone, utc from app.models import Reading, db from app.forms import ReadingForm from flask_login import login_required, current_user from datetime import datetime reading = Blueprint('reading', __name__) def get_user_timezone(): """Fetch the user's timezone, defaulting to UTC.""" return timezone(current_user.profile.timezone if current_user.profile and current_user.profile.timezone else 'UTC') def localize_timestamp(timestamp, user_tz): """Convert a UTC timestamp to the user's local timezone.""" return utc.localize(timestamp).astimezone(user_tz) def save_reading_from_form(reading, form, user_tz): """Update a reading with form data and convert the timestamp to UTC.""" local_timestamp = form.timestamp.data reading.timestamp = user_tz.localize(local_timestamp.replace(tzinfo=None)).astimezone(utc) reading.systolic = form.systolic.data reading.diastolic = form.diastolic.data reading.heart_rate = form.heart_rate.data db.session.commit() @reading.route('/add', methods=['GET', 'POST']) @login_required def add_reading(): form = ReadingForm() user_tz = get_user_timezone() if form.validate_on_submit(): new_reading = Reading( user_id=current_user.id, timestamp=user_tz.localize(form.timestamp.data.replace(tzinfo=None)).astimezone(utc), systolic=form.systolic.data, diastolic=form.diastolic.data, heart_rate=form.heart_rate.data, ) db.session.add(new_reading) db.session.commit() flash("Reading added successfully.", "success") return redirect(url_for('main.dashboard')) form.timestamp.data = localize_timestamp(datetime.utcnow(), user_tz) return render_template('reading/add_reading.html', form=form) @reading.route('//edit', methods=['GET', 'POST']) @login_required def edit_reading(reading_id): reading = Reading.query.filter_by(id=reading_id, user_id=current_user.id).first_or_404() user_tz = get_user_timezone() form = ReadingForm(obj=reading) form.timestamp.data = localize_timestamp(reading.timestamp, user_tz) if form.validate_on_submit(): save_reading_from_form(reading, form, user_tz) flash('Reading updated successfully!', 'success') return redirect(url_for('main.dashboard')) return render_template('reading/edit_reading.html', form=form, reading=reading) @reading.route('//confirm_delete', methods=['GET']) @login_required def confirm_delete(reading_id): reading = Reading.query.filter_by(id=reading_id, user_id=current_user.id).first_or_404() return render_template('reading/confirm_delete.html', reading=reading) @reading.route('//delete', methods=['POST']) @login_required def delete_reading(reading_id): reading = Reading.query.filter_by(id=reading_id, user_id=current_user.id).first_or_404() db.session.delete(reading) db.session.commit() flash('Reading deleted successfully!', 'success') return redirect(url_for('main.dashboard'))