Пример #1
0
def edit_values():
    """
    Erlaubt die Manuell zu erfassenden WErte inzidenz07_loerrach, inzidenz07_haut_rhin und isoliert_aph_bs
    zu erfassen und speichern.
    """

    sql = qry['edit_values_view']
    st.markdown('### Stand Datenbank')
    df = db.get_recordset(conn,sql)
    st.dataframe(df)

    st.markdown('### Werte editieren')
    #datum = st.date_input('Datum (JJJJ-MM-TT')
    datum = st.text_input('Datum (JJJJ-MM-TT')
    sql = qry['get_manual_edit_fields'].format(datum)
    df = db.get_recordset(conn,sql)
    if len(df)>0 : 
        val_loerrach = df.iloc[0]['inzidenz07_loerrach'] 
        val_haut_rhin = df.iloc[0]['inzidenz07_haut_rhin']
        val_aph = df.iloc[0]['isoliert_aph_bs']
    else:
        val_loerrach = None
        val_haut_rhin = None
        val_aph = None
    inzidenz07_loerrach = st.text_input('7-Tage Inzidenz Landeskreis Lörrach', val_loerrach)
    inzidenz07_haut_rhin = st.text_input('7-Tage Inzidenz Département Haut-Rhin', val_haut_rhin)
    isoliert_aph_bs = st.text_input('Isolierte in APHs', val_aph)
    if st.button('Speichern'):
        inzidenz07_loerrach = db.get_db_value(inzidenz07_loerrach,3)
        inzidenz07_haut_rhin = db.get_db_value(inzidenz07_haut_rhin,3)
        isoliert_aph_bs = db.get_db_value(isoliert_aph_bs,2)
        cmd = qry['manual_update'].format(inzidenz07_loerrach, inzidenz07_haut_rhin, isoliert_aph_bs, datum)
        db.exec_non_query(conn,cmd)
        st.info("Datensatz wurde gespeichert.")
Пример #2
0
def get_steps():
    result = {}
    result['import'] = st.checkbox("Import Excel Datei in Datenbank")
    result['extern'] = st.checkbox("Externe Datenquellen importieren", True)
    result['update'] = st.checkbox("Zeitreihe erstellen", True)
    result['plots'] = st.checkbox("Grafiken erzeugen", True)
    result['test_mail']= st.checkbox("Test Mail verschicken", True)
    result['test_sms']= st.checkbox("Test SMS verschicken", True)
    st.markdown('**Anpassungen in der Mail**')

    meldezeit = db.get_value(conn, qry['meldezeit_today'])

    meldezeit = st.text_input("Meldezeit", meldezeit)
    if meldezeit > '':
        cmd = qry['update_meldezeit'].format(meldezeit)
        if db.exec_non_query(conn,cmd) != 1:
            st.warning('meldezeit konnte nicht gespeichert werden')
    use_yesterday = st.checkbox("Für Hospitialisierte-BS-Werte vom Vortag verwenden.", False)
    if use_yesterday:
        cmd = qry['delete_hosp_data_today']
        if db.exec_non_query(conn,cmd) != 1:
            st.warning('das löschen der heutigen Hospitalisierungsdaten hat leider nicht funktioniert')

    comment_text = db.get_value(conn, qry['mail_comment_today'])
    comment_text = st.text_area("Begleittext für den Mailversand", comment_text)
    try:
        cmd = qry['update_mail_comment'].format(comment_text)
        db.exec_non_query(conn,cmd)
    except Exception as ex:
        st.warning('Kommentar konnte nicht gespeichert werden')
    return result
Пример #3
0
def verteiler_speichern(verteiler_id: int, person_liste:list):
    sql = qry['verteiler_person_empty'].format(verteiler_id)
    if db.exec_non_query(conn, sql) == 1:
        for pers_id in person_liste:
            sql = qry['verteiler_person_insert'].format(pers_id, verteiler_id)
            db.exec_non_query(conn, sql) 
        st.info(f'Der Verteiler wurde gespeichert.')
    else:
        st.warning(f'Der Verteiler wurde gespeichert werden.')
Пример #4
0
def send_test_sms():
    st.info('SMS-Test-Versand wurde gestartet')
    sql = qry['send_test_sms'].format(session_state.email)
    if db.exec_non_query(conn,sql) == 1:
        st.info('Das Test-Lagebericht-SMS wurde an den Verteiler verschickt')
    else:
        st.warning('Beim Versand des Test-Lagebericht-SMS ist ein Problem aufgetreten')
Пример #5
0
def send_sms():
    st.info('sms-Versand wurde gestartet')
    sql = qry['send_sms']
    if db.exec_non_query(conn,sql) == 1:
        st.info('Das Lagebericht-sms wurde an den Verteiler verschickt')
    else:
        st.warning('Beim Versand des Lageberichts-sms ist ein Problem aufgetreten')
Пример #6
0
def show_upload_personen():
    st.set_option('deprecation.showfileUploaderEncoding', False)
    uploaded_file = BytesIO()
    st.markdown("""Hier können Personen geladen werden. Ziehe eine Excel Datei mit allen Personen in untenstehendes Feld.
Bereits in der Datenbank bestehende Personen werden aktualisiert (Identifikation mittels Emailadresse) neue Personen werden angefügt. Bei 
Personen, die auch ein Benutzerkonto haben sollen, muss das Feld Benutzer-Kürzel gefüllt sein.""")
    uploaded_file = st.file_uploader(f"Personen für Verteiler", type=['xlsx'])
        
    if uploaded_file:
        filename = r'.\data\personen.xlsx'
        with open(filename, 'wb') as f: ## Excel File
            f.write(uploaded_file.read()) 
    if st.button("Personenliste abgleichen") and uploaded_file:
        st.info(f"Personen werden eingelesen")
        try:           
            df = pd.read_excel(filename)   
            s = df.to_json()
            # nach json und zurück um alle typen als string zu konvertieren
            # todo: geht ev. noch eleganter, aber ohne das werden Telnr als 7.98374646+10 geladen 
            df = pd.read_json(s)
            st.info('Import in DB wird gestartet.')
            db.append_pd_table(df, 'person_roh', [])
            sql = qry['synch_person_list']
            if db.exec_non_query(conn,sql) == 1:
                st.info(f"Adressen wurden in DB importiert und abgeglichen: {len(df)} Personen")
            else:
                raise Exception("In der Abgleich-Prozedur ist ein Fehler aufgetreten.") 
        except Exception as ex:
            st.warning(f"Beim Einlesen der Personen ist ein Problem aufgetreten: {ex}")
Пример #7
0
def main():
    conn = db.get_connection(srv=cn.SERVER, db_name=cn.DATABASE)
    info = f"Du wirst über Änderungen in Dateien des Verzeichnis zeitnah informiert (Intervall={cn.INTERVAL}s)"
    msg = f"folder-watch gestartet: {cn.PATH}<br>{info}"
    cmd = SQL_CMD.format(cn.VERTEILER, msg)  #first 500 chars
    db.exec_non_query(conn, cmd)
    files_dic = get_files_dic(os.listdir(cn.PATH))

    while True:
        has_changes, curr_files_dic, msg = check_files(files_dic)
        if has_changes:
            logger.INFO(msg)
            cmd = SQL_CMD.format(cn.VERTEILER, msg[:500])  #first 500 chars
            db.exec_non_query(conn, cmd)
            files_dic = curr_files_dic
        else:
            logger.debug('Files überprüft')
        time.sleep(cn.INTERVAL)
Пример #8
0
def edit_config():
    key = st.selectbox("Wähle Parameter aus",options = df_config.index.to_list())
    value = st.text_input(key, df_config.loc[key]['wert'])
    st.write(df_config.loc[key]['beschreibung'])
    if st.button('Speichern'):
        value = db.get_db_value(value, df_config.loc[key]['typ'])
        cmd = qry['update_config'].format(value, key )
        if db.exec_non_query(conn,cmd) == 1:
            st.info('Der Wert wurde gespeichert')
        else:
            st.warning('Der Wert konnte nicht gespeichert werden')
Пример #9
0
def import_file(config):    
    """
    Ruft die stored procedure auf dem db-server auf und startet den Import
    der Einzeldaten
    """

    filename = config['source_path'] + config['source_filename']
    try:
        st.info(f"{config['source_filename']} wird gelesen")
        df = pd.read_excel(filename)   
        
        sql = qry['db_fields']
        df_fields = db.get_recordset(conn, sql)
        raw_fields = df_fields['field_name'].to_list() 
        db_fields = df_fields['db_field_name'].to_list() 

        st.info('Import in DB wird gestartet, dies kann einige Minuten dauern.')
        db.exec_non_query(conn, qry['truncate_rohdaten'])
        db.append_pd_table(df, 'lagebericht_roh', raw_fields)
        st.info(f"{config['source_filename']} wurde in DB importiert: {len(df)} Zeilen")
        # formatiert die list zu einer comma separierten Text im Format [feld 1], [feld 2]...
        raw_fields_str = '[' + '], ['.join(raw_fields) + ']'
        db_fields_str = '[' + '], ['.join(db_fields) + ']'
        sql_cmd = qry['insert_lagebericht'].format(db_fields_str, raw_fields_str)
        if db.exec_non_query(conn, sql_cmd) == 1:
            st.info('Felder wurden in DB Tabelle formatiert')
        else:
            st.warning('Felder konnten in der DB Tabelle nicht formatiert werden')
        archive_file = f"{config['source_path']}archiv\\{date.today().strftime('%Y-%m-%d')}_{config['source_filename']}"
        sql = qry['rowcount_lagebericht_today']
        rows = db.get_value(conn, sql)
        st.info(f"QS: {rows} Zeilen mit Datum heute in Lagebericht-Tabelle")
        shutil.copyfile(filename, archive_file)
        os.remove(filename)
        csv_file = f"imp_{date.today().strftime('%Y-%m-%d')}.csv"
        archive_file = config['source_path'] + 'archiv\\' + csv_file
        
        df.to_csv(archive_file, index=False)
        st.info('Import Datei wurde gelöscht')
    except Exception as ex:
        st.warning(f'Die Datei konnte nicht importiert werden: {ex}')
Пример #10
0
def send_test_mail():
    """
    Stellt die Informationen für den Mailversand zusammen und verschickt die Mail an 
    den Testmail Verteiler.
    """

    st.info('Prozess gestartet')
    sql = qry['send_test_mail'].format(session_state.email)
    if db.exec_non_query(conn,sql) == 1:
        st.info('Die Testmail wurde verschickt')
    else:
        st.warning('Beim Versand der Testmail ist ein Problem aufgetreten')
Пример #11
0
def calculate_values():
    """
    Aggregiert die Einzelwerte in die Zeitreihetabelle und berechnet die Inzidenzen.
    """

    st.info('Inzidenzen und Differenzen zu Vortags Werten werden berechnet')
    sql = qry['run_update']
    if db.exec_non_query(conn,sql) == 1:
        st.info('Berechnungen wurden durchgeführt, die wichtigsten Resultate sind in untenstehender Tabelle aufgelistet')
    else:
        st.info('Bei den Berechnungen ist ein Problem aufgetreten')
    sql = qry['inzidenzen_qs']
    df = db.get_recordset(conn,sql)
    st.write(df)
Пример #12
0
def reset_password(session_state):
    sql = qry['user_info'].format(session_state.user_name)
    df = db.get_recordset(conn,sql)
    if len(df) > 0:
        mailadresse = df.iloc[0]['email']
        begruessung = df.iloc[0]['begruessung']
        subject = 'Das Passwort für die Covid-19 Lagebericht App wurde zurückgesetzt'
        pwd_neu = '{:07d}'.format(random.randint(0,999999))
        context = get_crypt_context()
        sql = qry['change_pwd'].format(context.hash(pwd_neu), session_state.user_name)
        if db.exec_non_query(conn, sql) == 1:
            if db.exec_non_query(conn, sql):
                text = f"""{begruessung},<br>dein Passwort wurde zurückgesetzt auf <br><b>{pwd_neu}</b><br>
                Bitte verwende nach dem ersten Login die Option `Passwort zurücksetzen` und setze dein eigenes Passwort.
                """
                sql = qry['send_reset_mail'].format(mailadresse,subject,text)
                if db.exec_non_query(conn, sql) == 1:
                    text = f"""{begruessung},<br>dein neues Passwort wurde an deine Mailadresse ({mailadresse}) geschickt. Bitte verwende nach dem ersten Login die
                    Menuoption `Passwort ändern`."""
                    st.markdown(text, unsafe_allow_html=True)
        else:
            st.warning('Beim reset des Passwortes gab es Probleme, kontaktieren sie den Systemadministrator')
    else:
        st.warning('Achte darauf, dass im Feld Benutzername dein Benutzerkürzel steht, z.B. sghxyz')
Пример #13
0
def change_password(session_state):
    sql = qry['user_info'].format(session_state.user_name)
    df = db.get_recordset(conn, sql)
    row = df.iloc[0]
    st.markdown(f'Benutzer: {row.nachname} {row.vorname}')
    pwd1 = st.text_input('Neues Passwort',type='password')
    pwd2 = st.text_input('Passwort bestätigen',type='password')
    if st.button('Passwort ändern'):
        if pwd1 == pwd2 and len(pwd1) > 0:
            context = get_crypt_context()
            sql = qry['change_pwd'].format(context.hash(pwd1), row['benutzer'])
            if db.exec_non_query(conn, sql) == 1:
                st.info('Passwort wurde erfolgreich geändert')
            else:
                st.warning('Das Passwort konnte leider nicht geändert werden, kontaktieren sie den Systemadministrator')
        else:
            t.warning('Passwörter stimmen nicht überein, versuchen sie es nochmals')
Пример #14
0
def send_mail():
    if st.checkbox(f"QS durchgeführt ({session_state.user_name})", value=False):
        send_mail_sel = st.checkbox("Mail versenden an Mail Verteiler", value=True)
        send_sms_sel = st.checkbox("SMS versenden an SMS Verteiler", value=True)
        ogd_export_sel = st.checkbox("OGD Export durchführen", value=True)
        
        if st.button("Versand starten"):        
            if ogd_export_sel:
                export_ogd(config)
            if send_mail_sel:
                sql = qry['send_mail']
                st.info('Mail-Versand wurde gestartet')
                if db.exec_non_query(conn,sql) == 1:
                    st.info('Das Lagebericht-Mail wurde verschickt')
                else:
                    st.warning('Beim Versand des Lagebericht-Mails ist ein Problem aufgetreten')
            if send_sms_sel:
                send_sms()
Пример #15
0
def get_bl_cases(config):
    url = config['url_covid_faelle_kantone'].format('BL')
    
    s = requests.get(url, proxies=proxy_dict).text
    records = json.loads(s)
    records = records['records']
    df_json = pd.DataFrame(records)
    lst = df_json['fields']
    st.info("Datei mit BL-Fällen wurde geladen")

    for x in lst:
        cmd = qry['update_faelle_bl'].format(x['ncumul_conf'],x['date'])
        if db.exec_non_query(conn,cmd) != 1:
            st.markdown(f'Befehl `{cmd}` konnte nicht ausgeführt werden.')
    st.info("BL Fälle wurden in Datenbank gespeichert")
    sql = qry['show_bl_cases']
    df = db.get_recordset(conn,sql)
    st.dataframe(df, 1000, 1000)
Пример #16
0
def get_ch_cases(config):
    """
    Speichert den BAG lagebericht lokal ab, öffnet die Excel Datei und speichert die CH-Fälle. Da pd.read_excel keinen proxys parameter kennt, muss die 
    Datei zuerst geladen und lokal im Verzeichnis data abgespeichert werden.
    """

    url = config['url_bag_lagebericht']    
    r = requests.get(url,proxies=proxy_dict) # create HTTP response object 
    filename = config['bag_lagebericht_lokal']
    with open(filename,'wb') as f: 
        f.write(r.content) 
    df = pd.read_excel(filename, sheet_name='COVID19 Zahlen',header=6)
    st.info("Excel Datei wurde geladen")
    for i in range(len(df)) : 
        datum = df.loc[i, "Datum"]
        cmd = qry['update_faelle_ch'].format(df.loc[i, "Fallzahlen pro Tag, kumuliert"], datum)
        if db.exec_non_query(conn,cmd) != 1:
            st.markdown(f'Befehl `{cmd}` konnte nicht ausgeführt werden.')
    st.info("CH Fälle wurden in Datenbank gespeichert")
    sql = qry['show_ch_faelle']
    df = db.get_recordset(conn,sql)
    st.dataframe(df, 1000, 1000)
Пример #17
0
def get_bs_cases(config):
    url = config['url_bs_hospitalisierte']
    
    s = requests.get(url, proxies=proxy_dict).text
    records = json.loads(s)
    records = records['records']
    df_json = pd.DataFrame(records)
    lst = df_json['fields']
    st.info("Datei mit BS-Fällen wurde geladen")

    for x in lst:
        if 'current_hosp_resident' in x:
            # st.write(x['current_hosp_resident'],x['current_hosp'],x['current_icu'],x['date'])
            cmd = qry['update_faelle_bs'].format(x['current_hosp_resident'], 
                x['current_hosp'], 
                x['current_icu'], 
                (1 if x['data_from_all_hosp'] == 'True' else 0),
                x['date'] )
            if db.exec_non_query(conn,cmd) != 1:
                st.markdown(f'Befehl `{cmd}` konnte nicht ausgeführt werden.')
    st.info("BS Hospitalisierte wurden in Datenbank gespeichert")
    sql = qry['show_bs_hospitalised']
    df = db.get_recordset(conn,sql)
    st.dataframe(df, 1000, 1000)
Пример #18
0
def log_entry(prozess_typ_id,result_id,fehlermeldung):
    cmd = qry["log_entry"].format(prozess_typ_id, session_state.user,result_id,fehlermeldung)
    db.exec_non_query(conn,cmd)
Пример #19
0
def delete_person(person_id: int):
    sql = qry['person_delete'].format(person_id)
    if db.exec_non_query(conn, sql) == 1:
        st.info('Der Datensatz wurde erfolgreich gelöscht')
    else:
        st.warning(f'Der Datensatz konnte nicht gelöscht werden.')
Пример #20
0
def insert_today_record():
    """
    inserts the today record to the zeitreihe table if missing
    """
    sql = qry['add_today_record']
    return db.exec_non_query(conn, sql)
Пример #21
0
def save_reporting_time(start_time):
    reporting_time = get_rounded_time_string(datetime.now(), const.ROUNDED_MINUTES)
    sql = qry['save_reporting_time'].format(reporting_time)
    if db.exec_non_query(conn,sql) == 0:
        print('Meldezeit konnte nicht gespeichert werden')