doneth.at/app/main.py

81 lines
2.4 KiB
Python

from . import timeutils
from flask import Blueprint, render_template, redirect, url_for
from flask_login import current_user
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired, Length
from .db import db, Accomplishment
from datetime import datetime, timedelta
main = Blueprint('main', __name__)
class NewAccomplishementForm(FlaskForm):
text = StringField(
'Accomplishment',
validators=[
DataRequired(), Length(max=256)])
submit_5 = SubmitField('5 XP')
submit_10 = SubmitField('10 XP')
submit_15 = SubmitField('15 XP')
def handle_accomplishment_submission(form):
accomplishment = Accomplishment()
accomplishment.user_id = current_user.id
accomplishment.text = form.text.data
accomplishment.difficulty = 5
if form.submit_10.data:
accomplishment.difficulty = 10
elif form.submit_15.data:
accomplishment.difficulty = 15
# the timestamp should be set by the database
db.session.add(accomplishment)
db.session.commit()
return redirect(url_for('main.index'))
@main.route('/', defaults={'day': 'today'}, methods=['GET', 'POST'])
@main.route('/day/<day>')
def index(day):
day_datetime = None
day_string = None
is_today = False
if day == "today":
day_datetime = timeutils.today()
day_string = "Today"
is_today = True
else:
day_datetime = timeutils.from_str(day)
if timeutils.is_today(day_datetime):
return redirect('/')
day_string = timeutils.as_fancy_str(day_datetime)
if not current_user.is_authenticated:
return render_template('index.html')
form = NewAccomplishementForm()
if form.validate_on_submit():
return handle_accomplishment_submission(form)
accomplishments = list(reversed(Accomplishment.get_day(
current_user.id, day_datetime)))
total = sum(a.difficulty for a in accomplishments)
tomorrow = timeutils.day_after(day_datetime)
yesterday = timeutils.day_before(day_datetime)
if timeutils.is_future(tomorrow):
tomorrow = None
return render_template(
'main/app.html',
form=form,
day=day_string,
accomplishments=accomplishments,
total=total,
tomorrow=timeutils.as_str(tomorrow),
yesterday=timeutils.as_str(yesterday),
is_today=is_today,
)