from datetime import datetime, date, timedelta import json from urllib import response from dateutil.relativedelta import relativedelta import os from flask import Flask, render_template import jinja_partials from flask_htmx import HTMX import minify_html from urllib.parse import urlparse from flask_socketio import SocketIO import pygal from pygal.style import Style from db import DataBase app = Flask(__name__) # TODO CHANGE SECRET KEY TO ENVIRONMENT VARIABLE app.config['SECRET_KEY'] = 'secret!' jinja_partials.register_extensions(app) htmx = HTMX(app) socketio = SocketIO(app, cors_allowed_origins='*') 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 @socketio.on('message') def handle_message(data): current_time = datetime.now().replace( microsecond=0).isoformat() print('' + current_time + ' ' + json.dumps(data)) db.insert_cadence(data['rpm'], data['id']) @ app.route("/") def home(): return render_template('base.html') @app.route("/overview") def overview(): cadences = db.get_all_cadences() last_cadence = cadences[-1]['rpm'] custom_style = Style( background='transparent', plot_background='transparent', foreground='#53E89B', foreground_strong='#53A0E8', foreground_subtle='#630C0D', opacity='.6', opacity_hover='.9', transition='400ms ease-in', colors=('#E853A0', '#E8537A', '#E95355', '#E87653', '#E89B53')) graph = pygal.Line(show_y_guides=False, show_legend=False, style=custom_style) graph.x_labels = [c['logged_at'] for c in cadences] graph.add('RPM', [c['rpm'] for c in cadences]) graph_data = graph.render_data_uri() return render_template('overview.html', last_cadence=last_cadence, cadences=cadences[-15:], graph_data=graph_data) if __name__ == '__main__': # Bind to PORT if defined, otherwise default to 5000. port = int(os.environ.get('PORT', 5000)) socketio.run(app, host='127.0.0.1', port=port)