Skip to content

Commit

Permalink
Merge pull request #52 from msusicky/develop
Browse files Browse the repository at this point in the history
Version 1.0
  • Loading branch information
msusicky authored Feb 25, 2021
2 parents 12e874b + 64eb93b commit bc81486
Show file tree
Hide file tree
Showing 33 changed files with 1,649 additions and 1 deletion.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,7 @@ dmypy.json

# Pyre type checker
.pyre/

.idea
*.ini
*.out
40 changes: 39 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,39 @@
# ockovani-covid
# Volná místa na COVID-19 očkování
Za systémem stojí Jan Staněk (http://jstanek.cz/), Marek Sušický (marek(at)susicky.net) a přátele, kteří poskytli cenné připomínky.

Během marné snahy zajistit očkovací místa pro příbuzné jsme si všimli toho, že neexistuje žádný přehled volných míst. Ještě v lednu jsme začali tvořit aplikaci, ale narazili na neexistenci dat. Pak došly vakcíny a nedávalo smysl systém spouštět. Nyní je situace taková, že mnoho lidí čeká na vakcinaci, ale pokud nejsou na tom správném místě, budou čekat dál. Na jiných místech už ale lidé 80+ "došli". S naší mapou se lidé mohou přeregistrovat, dostat vakcinu rychleji a zefektivnit celý proces očkování. Prosím kohokoliv, kdo může přispět ke zveřejnění oficiálních dat o volných kapacitách a distribuci vakcín, aby tak učinil.

## Napsali o nás
https://denikn.cz/569269/kde-maji-volna-mista-programatori-po-nocich-vymysleli-aplikaci-ktera-muze-zkratit-cekani-na-vakcinu

## Poznámky k fungování
Pro získávání dat využívá metody scrapingu. Vzhledem k tomu, že jsou data zveřejňována na githubu, **prosím scraper nespouštějte na vlastním prostředí a nezpůsobujte tak zbytečnou další zátěž rezervačnímu systému!**

Aplikace se skládá z modulu fetcher, pak samotného webu a skriptu, který web stáhne a publikuje na github pages. Tento krok je realizován proto, že nechceme vystavovat veřejně aplikační server a chceme přenést zátěž na prostředky Githubu. Navíc jde o statické stránky, u kterých není problém obsloužit mnoho tisíc lidí současně.


# How to run it [ENG]

## Installation

### Virtual environment

#### Create venv
`python3 -m venv venv`

#### Activate venv
`source venv/bin/activate`

#### Install requirements
`pip install -r requirements.txt`

###
```
python app.py
```
or
```
export FLASK_APP=app.py
export FLASK_ENV=development
flask run
```
Empty file added __init__.py
Empty file.
49 changes: 49 additions & 0 deletions app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import logging
from logging.handlers import RotatingFileHandler

from flask import Flask
from sqlalchemy.orm import sessionmaker

from models import db
from views import *

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True

some_engine = create_engine('postgresql://ockovani:ockovani2021@localhost:5432/ockovani')
Session = sessionmaker(bind=some_engine)
app.session = Session()
app.logger.info('Connection set up')


def create_app(config):
"""Construct the core application."""
app.config.from_object(config)
db.init_app(app)
with app.app_context():
a = 0
app.logger.info(app.config['SQLALCHEMY_DATABASE_URI'])
app.session = db.session
return app


def register_blueprints(app):
app.register_blueprint(my_view, url_prefix='/ockovani-covid')


if __name__ == '__main__':
app = create_app('config.myConfig')
handler = RotatingFileHandler('ockovani.log', maxBytes=10000, backupCount=1)
handler.setLevel(logging.DEBUG)

# Logging of SQL queries
# logging.basicConfig()
# logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO)

handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
app.logger.addHandler(handler)
# app.logger.setLevel(logging.DEBUG)
register_blueprints(app)

app.run(debug=False, threaded=True, port=5000, host='0.0.0.0')
11 changes: 11 additions & 0 deletions config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
class Config:
SQLALCHEMY_DATABASE_URI = 'sqlite:///database.db'
SEND_FILE_MAX_AGE_DEFAULT = 300

class TestConfig(Config):
SQLALCHEMY_DATABASE_URI = 'sqlite:///:memory:'

class myConfig:
FLASK_APP = 'app.py'
FLASK_DEBUG = 1
SQLALCHEMY_DATABASE_URI = 'postgresql://ockovani:foaeiwfjewfoij@localhost:5432/ockovani'
94 changes: 94 additions & 0 deletions data/db_create.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
CREATE ROLE ockovani WITH
LOGIN
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
INHERIT
NOREPLICATION
CONNECTION LIMIT -1
PASSWORD 'xxxxxx';

CREATE DATABASE ockovani
WITH
OWNER = ockovani
ENCODING = 'UTF8'
CONNECTION LIMIT = -1;

-- Table: public.dny

-- DROP TABLE public.dny;

CREATE TABLE public.dny
(
den_id serial NOT NULL,
datum date NOT NULL,
CONSTRAINT dny_pkey PRIMARY KEY (den_id)
)

TABLESPACE pg_default;

ALTER TABLE public.dny
OWNER to ockovani;

COMMENT ON TABLE public.dny
IS 'Tabulka s jednotlivymi dny ny ockovani';

-- Table: public.import_log

-- DROP TABLE public.import_log;

CREATE TABLE public.import_log
(
import_id bigserial NOT NULL ,
spusteni timestamp without time zone NOT NULL,
status character varying COLLATE pg_catalog."default" NOT NULL DEFAULT 'N/A',
CONSTRAINT import_log_pkey PRIMARY KEY (import_id)
)

TABLESPACE pg_default;

ALTER TABLE public.import_log
OWNER to ockovani;

-- Table: public.kapacita

-- DROP TABLE public.kapacita;

CREATE TABLE public.kapacita
(
misto_id bigint NOT NULL,
datum date NOT NULL,
raw_data json,
pocet_mist integer,
datum_ziskani timestamp without time zone DEFAULT NOW(),
import_id bigint NOT NULL,
CONSTRAINT kapacita_pkey PRIMARY KEY (misto_id, import_id, datum)
);

ALTER TABLE public.kapacita
OWNER to ockovani;

COMMENT ON TABLE public.kapacita
IS 'Tabulka se zjistenymi kapacitami';

-- Table: public.ockovaci_misto

-- DROP TABLE public.ockovaci_misto;

CREATE TABLE public.ockovaci_misto
(
misto_id bigserial NOT NULL,
nazev character varying COLLATE pg_catalog."default" NOT NULL,
service_id integer NOT NULL,
operation_id integer NOT NULL,
place_id integer NOT NULL,
mesto character varying COLLATE pg_catalog."default",
CONSTRAINT ockovaci_misto_pkey PRIMARY KEY (misto_id)
)

TABLESPACE pg_default;

ALTER TABLE public.ockovaci_misto
OWNER to ockovani;


81 changes: 81 additions & 0 deletions data/db_data.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
-- Table: public.dny
INSERT INTO dny (den_id, datum) VALUES (1,'2021-01-17');
INSERT INTO dny (den_id, datum) VALUES (2,'2021-01-18');
INSERT INTO dny (den_id, datum) VALUES (3,'2021-01-19');
INSERT INTO dny (den_id, datum) VALUES (4,'2021-01-20');
INSERT INTO dny (den_id, datum) VALUES (5,'2021-01-21');
INSERT INTO dny (den_id, datum) VALUES (6,'2021-01-22');
INSERT INTO dny (den_id, datum) VALUES (7,'2021-01-23');
INSERT INTO dny (den_id, datum) VALUES (8,'2021-01-24');
INSERT INTO dny (den_id, datum) VALUES (9,'2021-01-25');
INSERT INTO dny (den_id, datum) VALUES (10,'2021-01-26');
INSERT INTO dny (den_id, datum) VALUES (11,'2021-01-27');
INSERT INTO dny (den_id, datum) VALUES (12,'2021-01-28');
INSERT INTO dny (den_id, datum) VALUES (13,'2021-01-29');
INSERT INTO dny (den_id, datum) VALUES (14,'2021-01-30');
INSERT INTO dny (den_id, datum) VALUES (15,'2021-01-31');
INSERT INTO dny (den_id, datum) VALUES (16,'2021-02-01');
INSERT INTO dny (den_id, datum) VALUES (17,'2021-02-02');
INSERT INTO dny (den_id, datum) VALUES (18,'2021-02-03');
INSERT INTO dny (den_id, datum) VALUES (19,'2021-02-04');
INSERT INTO dny (den_id, datum) VALUES (20,'2021-02-05');
INSERT INTO dny (den_id, datum) VALUES (21,'2021-02-06');
INSERT INTO dny (den_id, datum) VALUES (22,'2021-02-07');
INSERT INTO dny (den_id, datum) VALUES (23,'2021-02-08');
INSERT INTO dny (den_id, datum) VALUES (24,'2021-02-09');
INSERT INTO dny (den_id, datum) VALUES (25,'2021-02-10');
INSERT INTO dny (den_id, datum) VALUES (26,'2021-02-11');
INSERT INTO dny (den_id, datum) VALUES (27,'2021-02-12');
INSERT INTO dny (den_id, datum) VALUES (28,'2021-02-13');
INSERT INTO dny (den_id, datum) VALUES (29,'2021-02-14');
INSERT INTO dny (den_id, datum) VALUES (30,'2021-02-15');

-- Table: public.ockovaci_misto
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Krajská nemocnice Liberec a.s.', 411651, 5867, 2905, 'Liberec');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Rudolfa a Stefanie Benešov, a.s.', 411677, 5899, 2981, 'Benešov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Bílovecká nemocnice, a.s.', 411766, 5988, 3186, 'Bílovec');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Zdravotní ústav se sídlem v Ostravě - Brno', 411789, 5889, 3231, 'Brno');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice u sv. Anny v Brně', 411653, 5869, 2911, 'Brno');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice s poliklinikou Česká Lípa a.s.', 411747, 5971, 3134, 'Česká Lípa');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Očkovací centrum Výstaviště České Budějovice (pavilon T1, vstup od Tesca)', 411685, 5910, 2996, 'České Budějovice');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Karlovarská krajská nemocnice a.s. - Cheb', 411828, 5866, 3312, 'Cheb');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('VITA s.r.o', 411802, 6010, 3259, 'Duchcov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice ve Frýdku-Místku, p.o.', 411745, 5969, 3128, 'Frýdek-Místek');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice s poliklinikou Havířov, p.o.', 411820, 6026, 3301, 'Havířov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice Hradec Králové', 411675, 5898, 2976, 'Hradec Králové');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Hranice a.s.', 411721, 5949, 3073, 'Hranice');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Hustopeče, p.o.', 411804, 6013, 3268, 'Hustopeče');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Jablonec nad Nisou, p. o.', 411708, 5936, 3036, 'Jablonec nad Nisou');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Masarykova městská nemocnice a.s. (Jilemnice)', 411819, 5926, 3061, 'Jilemnice');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Karlovarská krajská nemocnice a.s.', 411650, 5866, 2902, 'Karlovy Vary');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice s poliklinikou Karviná-Ráj', 411827, 6030, 3310, 'Karviná');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Karvinská hornická nemocnice a.s.', 411858, 6066, 3389, 'Karviná');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Oblastní nemocnice Kladno', 411661, 5877, 2935, 'Kladno');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Oblastní nemocnice Kolín', 411660, 5876, 2932, 'Kolín');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Kroměřížská nemocnice a.s.', 411816, 6023, 3296, 'Kroměříž');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Kutná Hora', 411720, 5947, 3067, 'Kutná Hora');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Neratovice', 411734, 5958, 3095, 'Neratovice');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice Olomouc', 411652, 5868, 2908, 'Olomouc');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Vojenská nemocnice Olomouc', 411664, 5880, 2944, 'Olomouc');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Slezská nemocnice v Opavě', 411795, 6003, 3243, 'Opava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('EUC Klinika Ostrava', 411697, 5925, 3021, 'Ostrava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Zdravotní ústav se sídlem v Ostravě - Ostrava', 411788, 5889, 3230, 'Ostrava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Městská nemocnice Ostrava, p.o.', 411801, 6009, 3256, 'Ostrava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice Ostrava', 411670, 5893, 2951, 'Ostrava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní Nemocnice Plzeň', 411649, 5865, 2899, 'Plzeň');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice Královské Vinohrady', 411674, 5894, 2969, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní Thomayerova nemocnice', 411518, 5895, 2972, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice v Motole', 411655, 5871, 2917, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice na Homolce', 411657, 5873, 2923, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Ústřední vojenská nemocnice - Očkovací centrum, pavilon L', 411839, 5892, 3341, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Fakultní nemocnice Bulovka', 411671, 5890, 2953, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Ústřední vojenská nemocnice - Ambulance ORT, pavilon A1', 411669, 5892, 2954, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Rokycanská nemocnice', 411758, 5981, 3165, 'Rokycany');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('MEDITERRA - Sedlčany s.r.o.', 411738, 6073, 3405, 'Sedlčany');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Sokolov', 411798, 6007, 3250, 'Sokolov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Stodská nemocnice', 411763, 5986, 3180, 'Stod');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Třinec, p.o.', 411841, 6050, 3350, 'Třinec');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Oblastní nemocnice Trutnov a.s.', 411756, 5979, 3152, 'Trutnov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Uherskohradišťská nemocnice a.s.', 411762, 5985, 3177, 'Uherské Hradiště');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Vsetínská nemocnice', 411768, 5991, 3191, 'Vsetín');

19 changes: 19 additions & 0 deletions data/migrations/202101181852.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
ALTER TABLE public.ockovaci_misto ADD CONSTRAINT ockovaci_misto_service_id_unique UNIQUE (service_id);

INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Hornická nemocnice s poliklinikou spol. s.r.o.', 411812, 6020, 3287, 'Bílina');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Bohumínská městská nemocnice a.s.', 411840, 6049, 3345, 'Bohumín');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('BVV velkokapacitní očkovací centrum', 411667, 5885, 2948, 'Brno');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Moje Ambulance a.s. Frýdek - Místek', 411884, 6104, 3440, 'Frýdek-Místek');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Havlíčkův Brod', 411803, 6012, 3262, 'Havlíčkův Brod');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Krajská zdravotní, a.s. - Nemocnice Chomutov, o.z.', 411847, 6056, 3368, 'Chomutov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Jihlava', 411659, 5875, 2929, 'Jihlava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('SZZ Krnov', 411878, 6093, 3432, 'Krnov');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Litoměřice a.s.', 411722, 5948, 3070, 'Litoměřice');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Krajská zdravotní, a.s. - Nemocnice Most, o.z.', 411845, 6054, 3362, 'Most');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice Nové Město na Moravě', 411728, 5953, 3080, 'Nové Město na Moravě');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Nemocnice AGEL Nový Jičín a.s.', 411774, 5993, 3199, 'Nový Jičín');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Moje Ambulance a.s. Ostrava - Poruba', 411885, 6103, 3441, 'Ostrava');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Vakcinační centrum IKEM', 411654, 5870, 2914, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Státní zdravotní ústav', 411760, 5983, 3171, 'Praha');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Sušická nemocnice', 411761, 5984, 3174, 'Sušice');
INSERT INTO public.ockovaci_misto (nazev, service_id, operation_id, place_id, mesto) VALUES ('Masarykova nemocnice Ústí nad Labem', 411656, 5872, 2920, 'Ústí nad Labem');
Loading

0 comments on commit bc81486

Please sign in to comment.