admin: voivodeship breakdown

master
informatic 2020-03-30 23:31:21 +02:00
parent 5062e9215f
commit 464e7cf127
2 changed files with 55 additions and 31 deletions

View File

@ -1,7 +1,7 @@
import flask_admin
from formity.extensions import admin, db, ModelView, AdminSecurityMixin
from wtforms import TextAreaField
from formity.models import FaceshieldRequest, RequestChange, Status
from formity.models import FaceshieldRequest, RequestChange, Status, PostalCode
from spaceauth import current_user
import enum
from sqlalchemy import inspect, func
@ -42,12 +42,17 @@ class IndexView(AdminSecurityMixin, flask_admin.AdminIndexView):
func.sum(FaceshieldRequest.faceshield_front_required).label('faceshield_front_required'),
func.sum(FaceshieldRequest.faceshield_front_delivered).label('faceshield_front_delivered'),
).group_by(FaceshieldRequest.status).all()
stats.sort(key=lambda v: v.status.value)
for rec in stats:
print(dir(rec))
vstats = FaceshieldRequest.query.select_from(FaceshieldRequest).with_entities(
PostalCode.voivodeship.label('voivodeship'),
func.count().label('count'),
func.sum(FaceshieldRequest.faceshield_full_required).label('faceshield_full_required'),
func.sum(FaceshieldRequest.faceshield_full_delivered).label('faceshield_full_delivered'),
func.sum(FaceshieldRequest.faceshield_front_required).label('faceshield_front_required'),
func.sum(FaceshieldRequest.faceshield_front_delivered).label('faceshield_front_delivered'),
).join(FaceshieldRequest.postalcode_info).group_by(PostalCode.voivodeship).order_by(func.count().desc()).all()
return self.render('admin_index.html', stats=stats)
return self.render('admin_index.html', stats=stats, vstats=vstats)
class FaceshieldRequestAdmin(ModelView):

View File

@ -1,32 +1,51 @@
{% extends "admin/master.html" %}
{% block body %}
<div class="row">
<div class="col-md-6">
<h1>Fullfillment stats</h1>
<table class="table">
<thead>
<div class="row">
<div class="col-md-4">
<h1>Fullfillment stats</h1>
<table class="table">
<thead>
<tr>
<th>Status</th>
<th>Count</th>
<th>Delivered / Requested (full)</th>
<th>Delivered / Requested (front)</th>
</tr>
</thead>
<tbody>
{% for rec in stats %}
<tr>
<th>Status</th>
<th>Count</th>
<th>Requested (full)</th>
<th>Delivered (full)</th>
<th>Requested (front)</th>
<th>Delivered (front)</th>
<td>{{ rec.status.name }}</td>
<td>{{ rec.count }}</td>
<td>{{ rec.faceshield_full_delivered }} / {{ rec.faceshield_full_required }}</td>
<td>{{ rec.faceshield_front_delivered }} / {{ rec.faceshield_front_required }}</td>
</tr>
</thead>
<tbody>
{% for rec in stats %}
<tr>
<td>{{ rec.status.name }}</td>
<td>{{ rec.count }}</td>
<td>{{ rec.faceshield_full_required }}</td>
<td>{{ rec.faceshield_full_delivered }}</td>
<td>{{ rec.faceshield_front_required }}</td>
<td>{{ rec.faceshield_front_delivered }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endfor %}
</tbody>
</table>
</div>
<div class="col-md-6">
<h1>Voivodeship breakdown</h1>
<table class="table">
<thead>
<tr>
<th>Voivodeship</th>
<th>Count</th>
<th>Delivered / Requested (full)</th>
<th>Delivered / Requested (front)</th>
</tr>
</thead>
<tbody>
{% for rec in vstats %}
<tr>
<td>{{ rec.voivodeship }}</td>
<td>{{ rec.count }}</td>
<td>{{ rec.faceshield_full_delivered }} / {{ rec.faceshield_full_required }}</td>
<td>{{ rec.faceshield_front_delivered }} / {{ rec.faceshield_front_required }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}