covid-formity/formity/views.py

68 lines
2.1 KiB
Python

import time
import requests
from sqlalchemy import func
from flask import Blueprint, render_template, flash, request
from formity.extensions import db
from formity.models import FaceshieldRequest, Status
from formity.forms import FaceshieldRequestForm
bp = Blueprint('main', __name__)
@bp.route('/', methods=['GET', 'POST'])
def index():
form = FaceshieldRequestForm()
if form.validate_on_submit():
fr = FaceshieldRequest(**{
k: v
for k, v in form.data.items()
if hasattr(FaceshieldRequest, k)
})
fr.ua = request.headers.get('User-Agent')
fr.ip = request.remote_addr
db.session.add(fr)
db.session.commit()
request_id = 'Z/{:02d}{:02d}/{}'.format(fr.created.month, fr.created.day, fr.id)
return render_template('thanks.html', form=form, request_id=request_id)
return render_template('index.html', form=form)
cache = {}
def cached_metric_fetch(url, ttl=60):
global cache
try:
if url in cache and time.time() < cache[url][0]:
print('cached', url)
return cache[url][1]
print('fetching', url)
resp = requests.get(url)
resp.raise_for_status()
value = resp.json()['data']['result'][0]['value'][1]
cache[url] = (time.time() + ttl, value)
return value
except Exception as exc:
print(exc)
return None
@bp.route('/stats')
def stats():
delivered_data = dict(FaceshieldRequest.query.with_entities(
FaceshieldRequest.status,
func.sum(FaceshieldRequest.faceshield_full_delivered),
).group_by(FaceshieldRequest.status).filter(FaceshieldRequest.handling_orga == 'hswaw'))
delivered = {
group.name: delivered_data.get(group, 0)
for group in [Status.fulfilled, Status.shippingpending, Status.pickuppending, Status.intransit]
}
return render_template(
'stats.html',
sztanca_last_24h=cached_metric_fetch('http://customs.hackerspace.pl/stats/sztancarka-last-24h'),
sztanca_ppm=cached_metric_fetch('http://customs.hackerspace.pl/stats/sztancarka-ppm'),
delivered=delivered,
)