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, )