Files
cardio/app.py

90 lines
2.6 KiB
Python

from datetime import datetime, date, timedelta
import decimal
import json
from urllib import response
from dateutil.relativedelta import relativedelta
import os
from flask import Flask, render_template, request
import jinja_partials
from flask_htmx import HTMX
import minify_html
from urllib.parse import urlparse
from db import DataBase
from graph import generate_graph, generate_sparkline_graph
app = Flask(__name__)
# TODO CHANGE SECRET KEY TO ENVIRONMENT VARIABLE
app.config['SECRET_KEY'] = 'secret!'
jinja_partials.register_extensions(app)
htmx = HTMX(app)
db = DataBase(app)
@app.after_request
def response_minify(response):
"""
minify html response to decrease site traffic
"""
if response.content_type == u'text/html; charset=utf-8':
response.set_data(
minify_html.minify(response.get_data(
as_text=True), minify_js=True, remove_processing_instructions=True)
)
return response
return response
@ app.route("/")
def home():
return render_template('attemptv2.html')
@ app.route("/devices")
def devices():
devices = db.get_devices()
return render_template('devices.html', devices=devices)
@ app.route("/device/<device_id>")
def device(device_id):
device = db.get_device(device_id)
return render_template('device.html', device=device)
@app.route("/overview/<device_id>")
def overview(device_id):
cadences = db.get_all_cadences(device_id)
last_cadence = cadences[-1]['rpm'] if cadences else 0
if cadences:
first = cadences[0]['logged_at']
last = cadences[-1]['logged_at']
duration = str(timedelta(seconds=(last-first).seconds))
last_cadence = cadences[-1]['rpm']
power = round(decimal.Decimal(0.0011)*last_cadence ** 3 + decimal.Decimal(
0.0026) * last_cadence ** 2 + decimal.Decimal(0.5642)*last_cadence)
graph_data = generate_sparkline_graph(
[c['rpm'] for c in cadences[-100:]])
return render_template('overview.html', last_cadence=last_cadence, power=power, duration=duration, cadences=cadences[-15:], graph_data=graph_data)
return render_template('overview.html', last_cadence=0, power=0, duration=duration, cadences=[], graph_data='')
@ app.route("/cadence", methods=['POST'])
def cadence():
data = request.get_json()
print('' + datetime.now().replace(microsecond=0).isoformat() +
' ' + json.dumps(data))
db.insert_cadence(data['rpm'], data['id'])
return 'ok'
if __name__ == '__main__':
# Bind to PORT if defined, otherwise default to 5000.
port = int(os.environ.get('PORT', 5000))
app.run(host='127.0.0.1', port=port)