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