Monitoraggio COVID-19 Italia | #IoRestoACasa
English Version here
Una semplice dashboard per la visualizzazione e il monitoraggio dei dati ufficiali sulla pandemia da COVID-19 rilasciati giornalmente dal Dipartimento della Protezione Civile
La WebApp è pubblicata su Heroku qui
Dati ufficiali sulla pandemia: repository ufficiale della proezione civile
Dati ufficiali sui vaccini: repository ufficiale Developers Italia
La WebApp gira su Python3.8+, legge i dati da mongoDB e usa un server
Flask e gunicorn
davanti.
Viene usato Flask-babel per la traduzione italiana dell'app, poiché l'inglese è scelto come lingua di default.
Lo script make_pot.sh
crea i file necessari a babel per le traduzioni.
Una versione Batch
è fornita per gli utenti Windows.
La lingua di visualizzazione dipenderà dalla richiesta effettuata dal client (lingua del browser o del sistema operativo).
Il front-end sta in covidashit/templates
e usa JavaScript per costruire la chart che è
creata con HighCharts.
Perché l'app funzioni è necessario popolare un database mongo
(qui per documentazione mongoDB su creazione cluster Atlas).
Inoltre, le collezioni del DB devono essere aggiornate giornalmente. Per questo motivo, l'app contiene delle API che vengono chiamate da un GitHub Webhook che viene lanciato quando il branch master
della repository della PC viene aggiornato (vedi GitHub workflow nel mio fork della repo della PC qui).
Infine, bisogna settare i vari webhooks sul fork della repo della PC per le seguenti API:
POST /update/national
POST /update/national/series
POST /update/national/trends
POST /update/regional
POST /update/regional/breakdown
POST /update/regional/series
POST /update/regional/trends
POST /update/provincial
POST /update/provincial/breakdown
POST /update/provincial/series
POST /update/provincial/trends
POST /update/vax/
POST /update/vax/summary
- creazione e attivazione di un virtual environment (seguire questi passaggi)
- installazione dei requisiti in
requirements.txt
Il file .env
contiene una serie di variabile d'ambiente necessarie al funzionamento della webapp.
Prima di avviare il server Flask, ma dopo aver attivato il virtual environment e settato le variabili nel
.env
file, come ad esempio il MONGO_URI
e i vari nomi delle collezioni (a discrezione dello sviluppatore),
sarà necessario popolare il DB tramite la Flask CLI inclusa.
Dopo aver clonato la repo e attivato il virtual environment:
flask create-collections
Questa, tramite una semplicissima procedura ETL, creerà e popolerà le collezioni su DB con i dati ufficiali del Dipartimento della Protezione Civile. Successivamente, avviare il worker:
celery -A celery_worker.celery worker
Infine, lanciare l'application server in una nuova shell:
flask run
Flask sarà in ascolto all'url http://127.0.0.1:5000
Nel .env
file settare il valore di APPLICATION_ENV
con production
.
Per testare la corretta configurazione del Procfile
usare la CLI fornita da
heroku tramite
heroku local
Flask sarà in ascolto all'url http://127.0.0.1:5000
Per avviare il container:
docker-compose up -d
Flask sarà in ascolto all'url [http://127.0.0.1:PORT] dove PORT
viene
settata in .env
.
L'app puo' essere pubblicata su Heroku sia come docker container che semplicemente utilizzando il Procfile.
L'app fornisce delle API per produrre i plot delle variabili con matplotlib
.
Puo' tornare un JSON response con l'immagine codificata in base64 oppure il
contenuto in byte per scaricare il file.
https://www.covidash.it/api/plot
data_type = [national, regional, provincial]
varname = [nuovi_positivi, ingressi_terapia_intensiva, deceduti_g, tamponi_g,
totale_ospedalizzati_g, nuovi_positivi_ma, deceduti_g_ma,
ingressi_terapia_intensiva_ma, tamponi_g_ma, totale_ospedalizzati_g_ma,
totale_positivi, terapia_intensiva, ricoverati_con_sintomi,
totale_ospedalizzati, isolamento_domiciliare, totale_casi, deceduti,
tamponi, dimessi_guariti]
se data_type = [national, regional]
varname = [nuovi_positivi, nuovi_positivi_ma, totale_casi]
se data_type = [provincial]
area = [Abruzzo, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli Venezia Giulia,
Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Puglia, Sardegna,
Sicilia, Toscana, P.A. Bolzano, P.A. Trento, Umbria, Valle d'Aosta, Veneto]
area = [Chieti, L'Aquila, Pescara, Teramo, Matera, Potenza, Catanzaro, Cosenza,
Crotone, Reggio di Calabria, Vibo Valentia, Avellino, Benevento, Caserta,
Napoli, Salerno, Bologna, Ferrara, Forlì-Cesena, Modena, Parma, Piacenza,
Ravenna, Reggio nell'Emilia, Rimini, Gorizia, Pordenone, Trieste, Udine,
Frosinone, Latina, Rieti, Roma, Viterbo, Genova, Imperia, La Spezia, Savona,
Bergamo, Brescia, Como, Cremona, Lecco, Lodi, Mantova, Milano,
Monza e della Brianza, Pavia, Sondrio, Varese, Ancona, Ascoli Piceno, Fermo,
Macerata, Pesaro e Urbino, Campobasso, Isernia, Alessandria, Asti, Biella,
Cuneo, Novara, Torino, Verbano-Cusio-Ossola, Vercelli, Bari,
Barletta-Andria-Trani, Brindisi, Lecce, Foggia, Taranto, Cagliari, Nuoro,
Sassari, Sud Sardegna, Agrigento, Caltanissetta, Catania, Enna, Messina,
Palermo, Ragusa, Siracusa, Trapani, Arezzo, Firenze, Grosseto, Livorno, Lucca,
Massa Carrara, Pisa, Pistoia, Prato, Siena, Perugia, Terni, Aosta, Belluno,
Padova, Rovigo, Treviso, Venezia, Verona, Vicenza]
GET /api/plot?data_type=national&varname=<varname>
GET /api/plot?data_type=regional&area=<region>&varname=<varname>
GET /api/plot?data_type=provincial&area=<province>&varname=[nuovi_positivi,nuovi_positivi_ma,totale_casi]>
curl --request GET \
--url 'https://www.covidash.it/api/plot?data_type=national&varname=totale_casi'
{
"errors":[],
"img":"iVBORw0KGgoAA...",
"status":"ok"
}
curl --request GET \
--url 'https://www.covidash.it/api/plot?data_type=national&varname=totale_casi&download=true' \
--output plot.png
Il plot verrà salvato in ./plot.png
Se il progetto ti piace o se ti ho fatto risparmiare qualche linea di codice, sentiti libero di offrirmi un caffé. Grazie!