From 04bdbe291aaf974c17063304dc93fabfbbae46ee Mon Sep 17 00:00:00 2001 From: Marco Rombach <36333308+marcorombach@users.noreply.github.com> Date: Tue, 15 Jun 2021 01:13:19 +0200 Subject: [PATCH] feat(notify): added notification configuration to GUI (#463) * added notifications to GUI * added tabstops * Update tools/gui/qtkontakt.py Co-authored-by: Florian Glaser <58706771+Floskinner@users.noreply.github.com> Co-authored-by: Florian Glaser <58706771+Floskinner@users.noreply.github.com> --- tools/gui/kontaktdaten.ui | 117 ++++++++++++++++++++++++++++++++++++++ tools/gui/qtkontakt.py | 110 +++++++++++++++++++++++++++++++++-- 2 files changed, 222 insertions(+), 5 deletions(-) diff --git a/tools/gui/kontaktdaten.ui b/tools/gui/kontaktdaten.ui index a0630ab8..0f339b19 100644 --- a/tools/gui/kontaktdaten.ui +++ b/tools/gui/kontaktdaten.ui @@ -889,6 +889,119 @@ + + + Benachrichtigungen + + + + + + + 12 + + + + PushOver + + + + + + + App-Token: + + + + + + + false + + + + + + + User-Key: + + + + + + + false + + + + + + + Pushover Testen + + + + + + + + 12 + + + + + + + + + + + + 12 + + + + Telegram + + + + + + + Api-Token: + + + + + + + false + + + + + + + Chat-ID: + + + + + + + false + + + + + + + Telegram Testen + + + + + @@ -938,6 +1051,10 @@ i_start_datum_qdate i_start_time_qtime i_end_time_qtime + i_app_token + i_user_key + i_api_token + i_chat_id diff --git a/tools/gui/qtkontakt.py b/tools/gui/qtkontakt.py index 473216e8..55b00f2f 100644 --- a/tools/gui/qtkontakt.py +++ b/tools/gui/qtkontakt.py @@ -8,7 +8,8 @@ from tools.gui.qtimpfzentren import QtImpfzentren from tools import kontaktdaten as kontakt_tools from tools import Modus -from tools.exceptions import ValidationError, MissingValuesError +from tools.exceptions import ValidationError, MissingValuesError, PushoverNotificationError, TelegramNotificationError +from tools.utils import pushover_notification, telegram_notification # Folgende Widgets stehen zur Verfügung: @@ -27,6 +28,10 @@ # i_plz_wohnort # i_telefon # i_mail +# i_app_token +# i_user_key +# i_api_token +# i_chat_id ### Checkboxes ### # i_mo_check_box @@ -59,9 +64,12 @@ # kontaktdaten_tab # zeitrahmen_tab # vermittlungscodes_tab +# notifications_tab ### Buttons ### # b_impfzentren_waehlen +# b_test_pushover +# b_test_telegram PATH = os.path.dirname(os.path.realpath(__file__)) @@ -89,6 +97,8 @@ def __init__(self, parent: QtWidgets.QWidget, modus: Modus, standard_speicherpfa # Funktion vom Button zuordnen self.b_impfzentren_waehlen.clicked.connect(self.__open_impfzentren) + self.b_test_pushover.clicked.connect(self.__test_pushover) + self.b_test_telegram.clicked.connect(self.__test_telegram) # Versuche Kontakdaten zu laden self.__lade_alle_werte() @@ -165,7 +175,7 @@ def bestaetigt(self): # Daten speichern speicherpfad = self.speicher_einstellungen(data) - QtWidgets.QMessageBox.information(self, "Gepseichert", "Daten erfolgreich gespeichert") + QtWidgets.QMessageBox.information(self, "Gespeichert", "Daten erfolgreich gespeichert") # Neuer Pfad in der Main GUI übernehmen self.update_path.emit(speicherpfad) @@ -239,10 +249,12 @@ def __button_box_clicked(self, button: QtWidgets.QPushButton): self.__reset_vermittlungscodes() self.__reset_kontakdaten() self.__reset_zeitrahmen() + self.__reset_notifications() elif clicked_button == QtWidgets.QDialogButtonBox.Open: self.__reset_vermittlungscodes() self.__reset_kontakdaten() self.__reset_zeitrahmen() + self.__reset_notifications() self.__lade_einstellungen() elif clicked_button == QtWidgets.QDialogButtonBox.Cancel: self.reject() @@ -266,6 +278,7 @@ def __get_alle_werte(self) -> dict: plz_wohnort = self.i_plz_wohnort.text().strip() telefon = self.i_telefon.text().strip() mail = self.i_mail.text().strip() + notifications = self.__get_notifications() # PLZ der Zentren in Liste und "strippen" plz_zentren = plz_zentrum_raw.split(",") @@ -286,6 +299,7 @@ def __get_alle_werte(self) -> dict: "notificationChannel": "email", "notificationReceiver": mail }, + "notifications": notifications, "zeitrahmen": self.__get_zeitrahmen() } @@ -345,6 +359,8 @@ def __lade_alle_werte(self): self.i_plz_wohnort.setText(kontaktdaten["kontakt"]["plz"]) self.i_wohnort.setText(kontaktdaten["kontakt"]["ort"]) + self.__set_notifications(kontaktdaten['notifications']) + try: self.__set_zeitrahmen(kontaktdaten["zeitrahmen"]) # Subkeys von "zeitrahmen" brauchen nicht gecheckt werden, da @@ -362,6 +378,7 @@ def __lade_alle_werte(self): self.__reset_vermittlungscodes() self.__reset_kontakdaten() self.__reset_zeitrahmen() + self.__reset_notifications() self.__oeffne_error(title="Kontaktdaten", text="Falsches Format", info= "Die von Ihnen gewählte Datei hat ein falsches Format. " "Laden Sie eine andere Datei oder überschreiben Sie die " @@ -371,6 +388,7 @@ def __lade_alle_werte(self): self.__reset_vermittlungscodes() self.__reset_kontakdaten() self.__reset_zeitrahmen() + self.__reset_notifications() self.__oeffne_error(title="Kontaktdaten", text="Falsches Format", info= "Die von Ihnen gewählte Datei hat ein falsches Format. " "Laden Sie eine andere Datei oder überschreiben Sie die " @@ -707,8 +725,6 @@ def __set_start_datum(self, von_datum: str): assert(QDate.isValid(datum)) self.i_start_datum_qdate.setDate(datum) - - def __set_uhrzeit_datum(self, uhrzeit: str, widget: QtWidgets.QTimeEdit): """ Setzt die Uhrzeit in einem QTimeEdit in der GUI. @@ -725,6 +741,90 @@ def __set_uhrzeit_datum(self, uhrzeit: str, widget: QtWidgets.QTimeEdit): assert(QTime.isValid(time)) widget.setTime(time) + ############################## + # Notifications # + ############################## + + def __get_notifications(self) -> dict: + """ + Ruft Werte für die Benachrichtigungen aus der GUI ab + und gibt diese als Dict zurück. + + Returns: + Dict mit den notifications Werten + """ + + # Pushover + app_token = self.i_app_token.text().strip() + user_key = self.i_user_key.text().strip() + + # Telegram + api_token = self.i_api_token.text().strip() + chat_id = self.i_chat_id.text().strip() + + notifications = {} + + if app_token != "" and user_key != "": + notifications['pushover'] = {} + notifications['pushover']['app_token'] = app_token + notifications['pushover']['user_key'] = user_key + + if api_token != "" and chat_id != "": + notifications['telegram'] = {} + notifications['telegram']['api_token'] = api_token + notifications['telegram']['chat_id'] = chat_id + + return notifications + + def __set_notifications(self, notifications: dict): + """ + Werte aus übergebenem Dict werden in die passenden QLineEdits geschrieben + + Args: + notifications (dict): Enthält pushover und telegram spezifische Werte + """ + + if 'pushover' in notifications: + self.i_app_token.setText(notifications['pushover']['app_token']) + self.i_user_key.setText(notifications['pushover']['user_key']) + + if 'telegram' in notifications: + self.i_api_token.setText(notifications['telegram']['api_token']) + self.i_chat_id.setText(notifications['telegram']['chat_id']) + + def __reset_notifications(self): + """ + Setzt alle Werte für die Benachrichtigungen (notifications) in der GUI zurück + """ + + for line_edit in self.notifications_tab.findChildren(QtWidgets.QLineEdit): + line_edit.setText("") + + def __test_pushover(self): + """ + Benutzt die Werte aus der GUI um eine Test-Benachrichtigung mit Pushover zu senden + """ + + notifications = {'app_token': self.i_app_token.text().strip(), 'user_key': self.i_user_key.text().strip()} + try: + pushover_notification(notifications, "Vaccipy", "Die Benachrichtigungsfunktion funktioniert!") + except PushoverNotificationError as error: + self.__oeffne_error("Pushover Fehler", + "Vermutlich sind die Daten nicht korrekt, versuchen Sie es erneut.", + str(error)) + + def __test_telegram(self): + """ + Benutzt die Werte aus der GUI um eine Test-Benachrichtigung mit Telegram zu senden + """ + + notifications = {'api_token': self.i_api_token.text().strip(), 'chat_id': self.i_chat_id.text().strip()} + try: + telegram_notification(notifications, "Vaccipy - Die Benachrichtigungsfunktion funktioniert!") + except TelegramNotificationError as error: + self.__oeffne_error("Telegram Fehler", + "Vermutlich sind die Daten nicht korrekt, versuchen Sie es erneut.", + str(error)) def __oeffne_error(self, title: str, text: str, info: str): """ @@ -744,4 +844,4 @@ def __oeffne_error(self, title: str, text: str, info: str): msg.addButton(msg.Close) msg.exec_() except Exception as error: - pass \ No newline at end of file + pass