Redesign BP tracker with lightweight views and unobtrusive save confirmations
This commit is contained in:
+86
-79
@@ -1,79 +1,86 @@
|
||||
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('/<int:reading_id>/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('/<int:reading_id>/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('/<int:reading_id>/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'))
|
||||
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, DeleteForm
|
||||
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")
|
||||
destination = 'reading.add_reading' if request.form.get('action') == 'another' else 'main.dashboard'
|
||||
return redirect(url_for(destination))
|
||||
|
||||
if request.method == 'GET':
|
||||
form.timestamp.data = localize_timestamp(datetime.utcnow(), user_tz)
|
||||
return render_template('reading/add_reading.html', form=form)
|
||||
|
||||
@reading.route('/<int:reading_id>/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)
|
||||
if request.method == 'GET':
|
||||
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('/<int:reading_id>/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()
|
||||
|
||||
reading.local_timestamp = localize_timestamp(reading.timestamp, get_user_timezone())
|
||||
return render_template('reading/confirm_delete.html', reading=reading, form=DeleteForm())
|
||||
|
||||
@reading.route('/<int:reading_id>/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()
|
||||
if not DeleteForm().validate_on_submit():
|
||||
flash('Please try deleting the reading again.', 'danger')
|
||||
return redirect(url_for('reading.confirm_delete', reading_id=reading.id))
|
||||
db.session.delete(reading)
|
||||
db.session.commit()
|
||||
flash('Reading deleted successfully!', 'success')
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
Reference in New Issue
Block a user