計算機科学のブログ

ほしい物リスト

Python - Flask - SQL - SQLite - List Comprehensions: Database Integrations - SVG, Jinja2

Head First Python: A Learner’s Guide to the Fundamentals of Python Programming, A Brain-Friendly GuidePaul Barry(著)、 O’Reilly Mediaの Chapter 13.(List Comprehensions: Database Integrations)、EXERCISE(620/682)の解答を求めてみる。

コード

webapp/app.py

from flask import Flask, render_template, request, session

import convert_utils
import data_utils

app = Flask(__name__)
app.secret_key = 'You will never guess...'


@app.get('/')
def index():
    return render_template(
        'index.html.j2',
        title='Welcome to Swimclub',
    )


@app.get('/swims')
def display_swim_sessions():
    data = data_utils.get_swim_sessions()
    dates = [session[0].split()[0] for session in data]
    return render_template(
        'select.html.j2',
        title='Select a swim session',
        select_id='chosen_date',
        url='/swimmers',
        data=dates,
    )


@app.post('/swimmers')
def display_swimmers():
    session['chosen_date'] = request.form['chosen_date']
    swimmers = [
        f'{name}-{age}'
        for name, age in data_utils.get_session_swimmers(
            session['chosen_date']
        )
    ]
    return render_template(
        'select.html.j2',
        title='Select a swimmer',
        url='/showevents',
        select_id='swimmer',
        data=swimmers,
    )


@app.post('/showevents')
def display_swimmer_events():
    session['swimmer'], session['age'] = request.form['swimmer'].split('-')
    data = data_utils.get_swimmers_events(
        session['swimmer'], session['age'], session['chosen_date']
    )
    events = [f'{distance} {stroke}' for distance, stroke in data]
    return render_template(
        'select.html.j2',
        title='Select an event',
        url='/showbarchart',
        select_id='event',
        data=events,
    )


@app.post('/showbarchart')
def show_bar_chart():
    distance, stroke = request.form['event'].split()
    data = data_utils.get_swimmers_times(
        session['swimmer'],
        session['age'],
        distance,
        stroke,
        session['chosen_date'],
    )
    times = [time for time, *_ in data]
    average, time_strs, scaled = convert_utils.perform_conversions(times)
    title = f'{session['swimmer']} (Under {session['age']}) {distance} {stroke} {session['chosen_date']}'
    worlds = convert_utils.get_worlds(distance, stroke)
    return render_template(
        'chart.html.j2',
        title=title,
        data=list(zip(time_strs, scaled)),
        average=average,
        worlds=worlds,
    )


if __name__ == '__main__':
    app.run(debug=True)