diff --git a/.github/workflows/deploy-acceptance.yml b/.github/workflows/deploy-acceptance.yml index 9bb88518..18bbf422 100644 --- a/.github/workflows/deploy-acceptance.yml +++ b/.github/workflows/deploy-acceptance.yml @@ -39,6 +39,9 @@ jobs: TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_SECRET }} TWITTER_ACCESS_TOKEN_KEY: ${{ secrets.TWITTER_ACCESS_TOKEN_KEY }} TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} + CFA_USER: ${{ secrets.CFA_USER }} + CFA_PASS: ${{ secrets.CFA_PASS }} + UZIS_TOKEN: ${{ secrets.UZIS_TOKEN }} with: filename: config.ci.py - name: Build release package diff --git a/.github/workflows/deploy-production.yml b/.github/workflows/deploy-production.yml index dd86c20d..2ee823fb 100644 --- a/.github/workflows/deploy-production.yml +++ b/.github/workflows/deploy-production.yml @@ -37,6 +37,9 @@ jobs: TWITTER_CONSUMER_SECRET: ${{ secrets.TWITTER_CONSUMER_SECRET }} TWITTER_ACCESS_TOKEN_KEY: ${{ secrets.TWITTER_ACCESS_TOKEN_KEY }} TWITTER_ACCESS_TOKEN_SECRET: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} + CFA_USER: ${{ secrets.CFA_USER }} + CFA_PASS: ${{ secrets.CFA_PASS }} + UZIS_TOKEN: ${{ secrets.UZIS_TOKEN }} with: filename: config.ci.py - name: Build release package diff --git a/.github/workflows/sync-prd-acc-db.yml b/.github/workflows/sync-prd-acc-db.yml index c4b40889..b233405d 100644 --- a/.github/workflows/sync-prd-acc-db.yml +++ b/.github/workflows/sync-prd-acc-db.yml @@ -25,6 +25,6 @@ jobs: echo "${SSH_KEY}" | tr -d '\r' | ssh-add - echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> $GITHUB_ENV - name: Execute db sync prd -> acc - run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "pg_dump -c ockovani_prd | psql ockovani_acc" + run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} -o ServerAliveInterval=120 "pg_dump -F c ockovani_prd | pg_restore -c -d ockovani_acc" - name: Execute migrations run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "cd ${APP_DIR} && source venv/bin/activate && flask db upgrade" diff --git a/.github/workflows/update-data-daily.yml b/.github/workflows/update-data-daily.yml index b410dc21..e2c5ef3c 100644 --- a/.github/workflows/update-data-daily.yml +++ b/.github/workflows/update-data-daily.yml @@ -49,5 +49,5 @@ jobs: with: inlineScript: | az vm deallocate --resource-group ${AZURE_RESOURCE_GROUP} --name ${AZURE_VM_NAME} - az vm resize --resource-group ${AZURE_RESOURCE_GROUP} --name ${AZURE_VM_NAME} --size Standard_B1s + az vm resize --resource-group ${AZURE_RESOURCE_GROUP} --name ${AZURE_VM_NAME} --size Standard_B2s az vm start --resource-group ${AZURE_RESOURCE_GROUP} --name ${AZURE_VM_NAME} diff --git a/.github/workflows/update-web-offers.yml b/.github/workflows/update-web-offers.yml new file mode 100644 index 00000000..fe10a7cd --- /dev/null +++ b/.github/workflows/update-web-offers.yml @@ -0,0 +1,31 @@ +name: update-web-offers + +on: + workflow_dispatch + +concurrency: production_env + +jobs: + deploy: + name: Update static pages - offers + if: ${{ github.event.workflow_run.conclusion == 'success' }} + environment: production + runs-on: ubuntu-22.04 + env: + APP_DIR: '${HOME}/prd/app' + SSH_HOST: ${{ secrets.SSH_HOST }} + SSH_KEY: ${{ secrets.SSH_KEY }} + SSH_PORT: ${{ secrets.SSH_PORT }} + SSH_USER_WEB: ${{ secrets.SSH_USER_WEB }} + steps: + - name: Setup SSH key + run: | + mkdir -p ~/.ssh/ + ssh-keyscan -H ${SSH_HOST} >> ~/.ssh/known_hosts + eval `ssh-agent -s` + echo "${SSH_KEY}" | tr -d '\r' | ssh-add - + echo "SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> $GITHUB_ENV + - name: Check if webserver is running + run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "systemctl status ockovani-prd.service" + - name: Create static pages + run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "bash ${APP_DIR}/scripts/create_static_pages_offers.sh" diff --git a/.github/workflows/update-web.yml b/.github/workflows/update-web.yml index d8a049fe..e01e9f65 100644 --- a/.github/workflows/update-web.yml +++ b/.github/workflows/update-web.yml @@ -31,4 +31,4 @@ jobs: - name: Check if webserver is running run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "systemctl status ockovani-prd.service" - name: Create static pages - run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "cd ${APP_DIR} && bash scripts/create_static_pages.sh" + run: ssh ${SSH_USER_WEB}@${SSH_HOST} -p ${SSH_PORT} "bash ${APP_DIR}/scripts/create_static_pages.sh" diff --git a/app/commands.py b/app/commands.py index 43e0da83..75e39a78 100644 --- a/app/commands.py +++ b/app/commands.py @@ -2,7 +2,7 @@ from datetime import date, timedelta import click -from psycopg2.extensions import ISOLATION_LEVEL_AUTOCOMMIT +from sqlalchemy import text from app import app, db from app.etl import MetricsEtl @@ -92,15 +92,13 @@ def clean_db_command(): """Deletes older partition than 14 days. Executed weekly via cron""" eng = db.engine - eng.execute( - "DELETE FROM ockovani_registrace WHERE import_id<(SELECT min(id) FROM importy WHERE start>now()-'14 days'::interval)") + with eng.connect() as conn: + conn.execute(text("DELETE FROM ockovani_registrace WHERE import_id<(SELECT min(id) FROM importy WHERE start>now()-'14 days'::interval)")) app.logger.info("Old data deleted.") - connection = eng.raw_connection() - connection.set_isolation_level(ISOLATION_LEVEL_AUTOCOMMIT) - cursor = connection.cursor() - cursor.execute("VACUUM(FULL, ANALYZE) ockovani_registrace") + with eng.connect() as conn: + with conn.execution_options(isolation_level='AUTOCOMMIT'): + conn.execute(text("VACUUM(FULL, ANALYZE) ockovani_registrace")) app.logger.info("Vacuum finished.") - connection.autocommit = False exit(0) diff --git a/app/controllers.py b/app/controllers.py index 07542082..a887721d 100644 --- a/app/controllers.py +++ b/app/controllers.py @@ -3,10 +3,9 @@ from datetime import datetime from flask import session, redirect, request, url_for -from flask.json import dump from app import db, bp -from app.models import ZdravotnickeStredisko, PrakticiLogin, PrakticiKapacity, Vakcina +from app.models import ZdravotnickeStredisko, PrakticiLogin, PrakticiKapacity @bp.route("/praktici_admin/register", methods=['POST']) @@ -33,32 +32,13 @@ def praktici_admin_register(): elif user is not None: session['error'] = 'Zdravotnické zařízení je už registrováno.' else: - random.seed(datetime.now()) + random.seed(datetime.now().timestamp()) characters = string.ascii_letters + string.digits passwd = ''.join(random.choice(characters) for i in range(8)) user = PrakticiLogin(id, passwd) db.session.add(user) - vaccines = db.session.query(Vakcina).all() - - for vaccine in vaccines: - free_vaccine = PrakticiKapacity() - free_vaccine.datum_aktualizace = datetime.now() - free_vaccine.zdravotnicke_zarizeni_kod = id - free_vaccine.typ_vakciny = vaccine.vyrobce - free_vaccine.kraj = zarizeni.kraj - free_vaccine.mesto = zarizeni.obec - free_vaccine.nazev_ordinace = zarizeni.nazev_cely - free_vaccine.adresa = f'{zarizeni.ulice if zarizeni.ulice else zarizeni.obec} {zarizeni.cislo_domu}' - free_vaccine.pocet_davek = 0 - free_vaccine.kontakt_email = zarizeni.email - free_vaccine.kontakt_tel = zarizeni.telefon - free_vaccine.poznamka = '' - free_vaccine.dospeli = zarizeni.druh_zarizeni_kod != 321 - free_vaccine.deti = zarizeni.druh_zarizeni_kod == 321 - db.session.add(free_vaccine) - db.session.commit() session['user_id'] = id @@ -122,31 +102,47 @@ def praktici_admin_edit(): if user is None: session['error'] = 'Neplatné zdravotnické zařízení nebo heslo.' else: + email = request.form.get('email') + user.email = email if email else None + + telefon = request.form.get('telefon') + user.telefon = telefon if telefon else None + + user.neregistrovani = request.form.get('neregistrovani') is not None + + db.session.merge(user) + for i in range(len(request.form.getlist('typ_vakciny[]'))): + nemoc = request.form.getlist('nemoc[]')[i] + typ_vakciny = request.form.getlist('typ_vakciny[]')[i] + vaccine = db.session.query(PrakticiKapacity) \ .filter(PrakticiKapacity.zdravotnicke_zarizeni_kod == id) \ - .filter(PrakticiKapacity.typ_vakciny == request.form.getlist('typ_vakciny[]')[i]) \ + .filter(PrakticiKapacity.nemoc == nemoc) \ + .filter(PrakticiKapacity.typ_vakciny == typ_vakciny) \ .one_or_none() if vaccine is None: - continue + vaccine = PrakticiKapacity() + vaccine.zdravotnicke_zarizeni_kod = id + vaccine.nemoc = nemoc + vaccine.typ_vakciny = typ_vakciny + + aktivni = [int(v) - 1 for v in request.form.getlist('aktivni[]')] + vaccine.aktivni = i in aktivni - pocet_davek = request.form.getlist('pocet_davek[]')[i] - expirace = request.form.getlist('expirace[]')[i] dospeli = [int(v) - 1 for v in request.form.getlist('dospeli[]')] + vaccine.dospeli = i in dospeli + deti = [int(v) - 1 for v in request.form.getlist('deti[]')] + vaccine.deti = i in deti vaccine.datum_aktualizace = datetime.now() - vaccine.pocet_davek = pocet_davek if pocet_davek.isnumeric() else 0 - vaccine.dospeli = i in dospeli - vaccine.deti = i in deti - vaccine.adresa = request.form.getlist('adresa[]')[i] - vaccine.kontakt_tel = request.form.getlist('kontakt_tel[]')[i] - vaccine.kontakt_email = request.form.getlist('kontakt_email[]')[i] - vaccine.expirace = expirace if len(expirace) > 0 else None + vaccine.poznamka = request.form.getlist('poznamka[]')[i] db.session.merge(vaccine) - db.session.commit() + + db.session.commit() return redirect(url_for('view.praktici_admin')) diff --git a/app/fetcher/fetcher_launcher.py b/app/fetcher/fetcher_launcher.py index 60f141fd..1ce6fc62 100644 --- a/app/fetcher/fetcher_launcher.py +++ b/app/fetcher/fetcher_launcher.py @@ -86,8 +86,8 @@ def _init_fetchers(self, dataset: str) -> None: if dataset == 'all': # self._fetchers.append(CentersFetcher()) # replaced by CentersApiFetcher self._fetchers.append(CentersApiFetcher()) - # self._fetchers.append(OpeningHoursFetcher()) - # self._fetchers.append(HealthFacilitiesFetcher()) + self._fetchers.append(OpeningHoursFetcher()) + self._fetchers.append(HealthFacilitiesFetcher()) # self._fetchers.append(DistributedFetcher()) # not updated since 2022-11-29 # self._fetchers.append(UsedFetcher()) # not updated since 2022-02-16 self._fetchers.append(RegistrationsFetcher()) diff --git a/app/fetcher/health_facilities_fetcher.py b/app/fetcher/health_facilities_fetcher.py index 2b1a9bf2..7799b7b8 100644 --- a/app/fetcher/health_facilities_fetcher.py +++ b/app/fetcher/health_facilities_fetcher.py @@ -26,6 +26,7 @@ def fetch(self, import_id: int) -> None: df = df.drop(['id', 'kraj_nuts_kod', 'kraj_nazev', 'okres_nazev'], axis=1) df = df.rename(columns={'zarizeni_kod': 'id', 'okres_lau_kod': 'okres_id'}) + df = df.groupby('id').first().reset_index() self._truncate() diff --git a/app/models.py b/app/models.py index 52731e99..667dec70 100644 --- a/app/models.py +++ b/app/models.py @@ -136,6 +136,7 @@ class Vakcina(db.Model): vakcina_sklad = Column(Unicode, unique=True, nullable=False) davky = Column(Integer, nullable=False) aktivni = Column(Boolean, nullable=False) + nemoc = Column(Unicode, nullable=False) def __repr__(self): return f"" @@ -1026,6 +1027,9 @@ class PrakticiLogin(db.Model): zdravotnicke_zarizeni_kod = Column(Unicode, primary_key=True) heslo = Column(Unicode, nullable=False) + email = Column(Unicode) + telefon = Column(Unicode) + neregistrovani = Column(Boolean, nullable=False) def __init__(self, id, passwd): self.zdravotnicke_zarizeni_kod = id @@ -1041,17 +1045,13 @@ class PrakticiKapacity(db.Model): zdravotnicke_zarizeni_kod = Column(Unicode, primary_key=True) datum_aktualizace = Column(DateTime, nullable=False, default="now()") typ_vakciny = Column(Unicode, primary_key=True) - kraj = Column(Unicode, nullable=False) - mesto = Column(Unicode, nullable=False) - nazev_ordinace = Column(Unicode, nullable=False) - adresa = Column(Unicode) pocet_davek = Column(Integer, nullable=False) - kontakt_email = Column(Unicode) - kontakt_tel = Column(Unicode) poznamka = Column(Unicode) deti = Column(Boolean, nullable=False) dospeli = Column(Boolean, nullable=False) expirace = Column(Date) + nemoc = Column(Unicode, nullable=False) + aktivni = Column(Boolean, nullable=False) def __repr__(self): return f"" diff --git a/app/queries.py b/app/queries.py index 0a5785ab..14599922 100644 --- a/app/queries.py +++ b/app/queries.py @@ -8,7 +8,7 @@ from app import db from app.context import get_import_date, get_import_id from app.models import OckovaciMisto, Okres, Kraj, OckovaciMistoMetriky, CrMetriky, OckovaniRegistrace, Populace, \ - PrakticiKapacity, OckovaniRezervace, Vakcina, ZdravotnickeStredisko + PrakticiKapacity, OckovaniRezervace, Vakcina, ZdravotnickeStredisko, PrakticiLogin def unique_nrpzs_subquery(): @@ -86,15 +86,17 @@ def find_doctor_offices(nrpzs_kod): df = pd.read_sql_query( f""" select coalesce(z.zarizeni_nazev, min(s.nazev_cely)) zarizeni_nazev, o.nazev okres, k.nazev kraj, - k.nazev_kratky kraj_kratky, s.druh_zarizeni, s.obec, s.psc, s.ulice, s.cislo_domu, s.telefon, s.email, - s.web, s.latitude, s.longitude + k.nazev_kratky kraj_kratky, s.druh_zarizeni, s.obec, s.psc, s.ulice, s.cislo_domu, + coalesce(p.telefon, s.telefon) telefon_c, coalesce(p.email, s.email) email_c, s.web, s.latitude, s.longitude, + p.neregistrovani from ockovaci_zarizeni z full join zdravotnicke_stredisko s on s.nrpzs_kod = z.id + left join praktici_login p on substring(p.zdravotnicke_zarizeni_kod from 1 for 11) = s.nrpzs_kod left join okresy o on o.id = coalesce(z.okres_id, s.okres_kod) join kraje k on k.id = o.kraj_id where z.id = '{nrpzs_kod}' or s.nrpzs_kod = '{nrpzs_kod}' group by z.zarizeni_nazev, o.nazev, k.nazev, k.nazev_kratky, s.druh_zarizeni, s.obec, s.psc, s.ulice, - s.cislo_domu, s.telefon, s.email, s.web, s.latitude, s.longitude + s.cislo_domu, telefon_c, email_c, s.web, s.latitude, s.longitude, p.neregistrovani """, db.engine) @@ -120,9 +122,7 @@ def find_doctors(okres_id=None, kraj_id=None): join kraje k on k.id = o.kraj_id left join zarizeni_metriky m on m.zarizeni_id = z.id and m.datum = '{get_import_date()}' left join ( - select left(zdravotnicke_zarizeni_kod, 11) nrpzs_kod - from praktici_kapacity n - where n.pocet_davek > 0 and (n.expirace is null or n.expirace >= '{get_import_date()}') + select left(zdravotnicke_zarizeni_kod, 11) nrpzs_kod from praktici_kapacity n where n.aktivni ) n on n.nrpzs_kod = z.id where prakticky_lekar = True and (z.okres_id = {okres_id_sql} or {okres_id_sql} is null) @@ -154,9 +154,7 @@ def find_doctors_map(): left join zdravotnicke_stredisko s on s.nrpzs_kod = z.id left join zarizeni_metriky m on m.zarizeni_id = z.id and m.datum = '{get_import_date()}' left join ( - select left(zdravotnicke_zarizeni_kod, 11) nrpzs_kod - from praktici_kapacity n - where n.pocet_davek > 0 and (n.expirace is null or n.expirace >= '{get_import_date()}') + select left(zdravotnicke_zarizeni_kod, 11) nrpzs_kod from praktici_kapacity n where n.aktivni ) n on n.nrpzs_kod = z.id where prakticky_lekar = True group by z.id, z.zarizeni_nazev, z.provoz_ukoncen, s.latitude, s.longitude, m.ockovani_pocet_davek, @@ -181,38 +179,47 @@ def find_doctors_map(): def find_doctors_vaccine_options(): return db.session.query(Vakcina.vyrobce) \ .filter(Vakcina.aktivni == True) \ + .filter(Vakcina.nemoc == 'Covid-19') \ .order_by(Vakcina.vyrobce) \ .all() def find_free_vaccines_available(nrpzs_kod=None, okres_id=None, kraj_id=None): - return db.session.query(PrakticiKapacity.datum_aktualizace, PrakticiKapacity.pocet_davek, - PrakticiKapacity.typ_vakciny, PrakticiKapacity.mesto, PrakticiKapacity.nazev_ordinace, - PrakticiKapacity.deti, PrakticiKapacity.dospeli, PrakticiKapacity.kontakt_tel, - PrakticiKapacity.kontakt_email, PrakticiKapacity.expirace, PrakticiKapacity.poznamka, - PrakticiKapacity.kraj, ZdravotnickeStredisko.nrpzs_kod, ZdravotnickeStredisko.latitude, - ZdravotnickeStredisko.longitude) \ + return db.session.query(PrakticiKapacity.datum_aktualizace, PrakticiKapacity.aktivni, PrakticiKapacity.nemoc, + PrakticiKapacity.typ_vakciny, PrakticiKapacity.deti, PrakticiKapacity.dospeli, + PrakticiKapacity.poznamka, PrakticiLogin.email, PrakticiLogin.telefon, + PrakticiLogin.neregistrovani, ZdravotnickeStredisko.nazev_cely, ZdravotnickeStredisko.obec, + ZdravotnickeStredisko.kraj, ZdravotnickeStredisko.nrpzs_kod, ZdravotnickeStredisko.latitude, + ZdravotnickeStredisko.longitude, ZdravotnickeStredisko.email.label('email_nrpzs'), + ZdravotnickeStredisko.telefon.label('telefon_nrpzs')) \ + .join(PrakticiLogin, PrakticiLogin.zdravotnicke_zarizeni_kod == PrakticiKapacity.zdravotnicke_zarizeni_kod) \ .outerjoin(ZdravotnickeStredisko, ZdravotnickeStredisko.zdravotnicke_zarizeni_kod == PrakticiKapacity.zdravotnicke_zarizeni_kod) \ .filter(or_(func.left(PrakticiKapacity.zdravotnicke_zarizeni_kod, 11) == nrpzs_kod, nrpzs_kod is None)) \ .filter(or_(ZdravotnickeStredisko.okres_kod == okres_id, okres_id is None)) \ .filter(or_(ZdravotnickeStredisko.kraj_kod == kraj_id, kraj_id is None)) \ - .filter(PrakticiKapacity.pocet_davek > 0) \ - .filter(or_(PrakticiKapacity.expirace == None, PrakticiKapacity.expirace >= get_import_date())) \ - .order_by(PrakticiKapacity.kraj, PrakticiKapacity.mesto, PrakticiKapacity.nazev_ordinace, + .filter(PrakticiKapacity.aktivni) \ + .order_by(ZdravotnickeStredisko.kraj, ZdravotnickeStredisko.obec, ZdravotnickeStredisko.nazev_cely, PrakticiKapacity.typ_vakciny) \ .all() def find_free_vaccines_vaccine_options(): return db.session.query(PrakticiKapacity.typ_vakciny) \ - .filter(PrakticiKapacity.pocet_davek > 0) \ - .filter(or_(PrakticiKapacity.expirace == None, PrakticiKapacity.expirace >= get_import_date())) \ + .filter(PrakticiKapacity.aktivni) \ .distinct(PrakticiKapacity.typ_vakciny) \ .order_by(PrakticiKapacity.typ_vakciny) \ .all() +def find_free_vaccines_illness_options(): + return db.session.query(PrakticiKapacity.nemoc) \ + .filter(PrakticiKapacity.aktivni) \ + .distinct(PrakticiKapacity.nemoc) \ + .order_by(PrakticiKapacity.nemoc) \ + .all() + + def count_vaccines_center(center_id): mista = pd.read_sql_query( """ diff --git a/app/static/img/Logo MZCR_pod sebou.jfif b/app/static/img/Logo MZCR_pod sebou.jfif new file mode 100644 index 00000000..93d6abfc Binary files /dev/null and b/app/static/img/Logo MZCR_pod sebou.jfif differ diff --git a/app/templates/base.html b/app/templates/base.html index f84bee6a..1e6c3407 100644 --- a/app/templates/base.html +++ b/app/templates/base.html @@ -98,9 +98,13 @@
-
diff --git a/app/templates/index.html b/app/templates/index.html index 2e8abbd8..bc6d34b7 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -115,7 +115,10 @@

COVID-19 data o očkování

Aktuality a důležité informace

    - {{ zprava('Znovuspuštění aktualizace webu', '13. 10. 2023', + {{ zprava('Černý kašel', '22. 4. 2024', + 'Přidáváme možnost pro praktiky inzerovat očkování proti černému kašli. Do budoucna bude možné snadno přidat i další očkovací látky.') }} + + {{ zprava('Znovuspuštění aktualizace webu', '13. 10. 2023', 'Aktualizace webu byla 13. 10. 2023 znovu zahájena, zatím v pilotním režimu.') }} {{ zprava('Ukončení aktualizace webu', '1. 7. 2023', diff --git a/app/templates/kraj.html b/app/templates/kraj.html index 3d8dd6e1..76157b8f 100644 --- a/app/templates/kraj.html +++ b/app/templates/kraj.html @@ -60,7 +60,7 @@

    Kraj: {{ kraj.nazev_kratky }}

    {{ prehled_praktici(doctors, doctors_vaccine_options, kraj_mode=True) }}
- {{ volne_vakciny(free_vaccines, free_vaccines_vaccine_options, filtered_mode=True) }} + {{ volne_vakciny(free_vaccines, free_vaccines_illness_options, filtered_mode=True) }}
diff --git a/app/templates/macros/tables/volne_vakciny.html b/app/templates/macros/tables/volne_vakciny.html index 9cba2766..8d9309e7 100644 --- a/app/templates/macros/tables/volne_vakciny.html +++ b/app/templates/macros/tables/volne_vakciny.html @@ -1,4 +1,4 @@ -{% macro volne_vakciny(free_vaccines, vaccine_options, kraj_options=None, filtered_mode=False, detail_mode=False, admin_mode=False) -%} +{% macro volne_vakciny(free_vaccines, illness_options, kraj_options=None, filtered_mode=False, detail_mode=False, admin_mode=False) -%} {% if not admin_mode %}