From f2c0f57dedc25bf867d4d786c623a160dd7cb75b Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 16 Jun 2021 00:06:21 +0200 Subject: [PATCH] =?UTF-8?q?feat(GUI):=20Verbesserte=20Oberfl=C3=A4che=20im?= =?UTF-8?q?=20Modus=20CODE=5FGENERIEREN=20=20(#471)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update .gitignore Added venv * Improved Kontaktdateneingabe (CodeGen)) Verbesserung der UX. Felder wurden deaktiviert, Ladefunktion unterstüzt nun CodeGen * select correct tab * typo * added default arguments --- tools/gui/kontaktdaten.ui | 24 +++--- tools/gui/qtkontakt.py | 170 +++++++++++++++++++++++++++++--------- 2 files changed, 144 insertions(+), 50 deletions(-) diff --git a/tools/gui/kontaktdaten.ui b/tools/gui/kontaktdaten.ui index 0f339b19..c8fa61eb 100644 --- a/tools/gui/kontaktdaten.ui +++ b/tools/gui/kontaktdaten.ui @@ -153,7 +153,7 @@ - <html><head/><body><p>Gib hier deinen ersten Vermittlungscode ein.</p></body></html> + <html><head/><body><p>Gib hier deinen ersten Vermittlungscode ein. Solltest du keinen Code haben, kannst du hier eifach XXXX-XXXX-XXXX eintragen.</p></body></html> NNNN-NNNN-NNNN @@ -935,11 +935,11 @@ - - - Pushover Testen - - + + + Pushover Testen + + @@ -949,7 +949,7 @@ - + @@ -994,11 +994,11 @@ - - - Telegram Testen - - + + + Telegram Testen + + diff --git a/tools/gui/qtkontakt.py b/tools/gui/qtkontakt.py index 806a8172..6e8067e9 100644 --- a/tools/gui/qtkontakt.py +++ b/tools/gui/qtkontakt.py @@ -103,8 +103,11 @@ def __init__(self, parent: QtWidgets.QWidget, modus: Modus, standard_speicherpfa # Versuche Kontakdaten zu laden self.__lade_alle_werte() - # Wähle ersten Reiter aus - self.tabWidget.setCurrentIndex(0) + # Wähle passenden Reiter aus + if self.modus == modus.CODE_GENERIEREN: + self.tabWidget.setCurrentIndex(1) + else: + self.tabWidget.setCurrentIndex(0) # Erstelle Events für LineEdits for line_edit in self.vermittlungscodes_tab.findChildren(QtWidgets.QLineEdit): @@ -154,12 +157,16 @@ def setup(self): elif self.modus == Modus.CODE_GENERIEREN: # Benötigt wird: PLZ's der Impfzentren, Telefonnummer, Mail # Alles andere wird daher deaktiviert - # !!!! wir erlauben aktuell alle eingaben, da diese später für die terminsuche benötigt werden. !!! - # self.readonly_alle_line_edits(("i_plz_impfzentren", "i_telefon", "i_mail")) - # self.i_code_impfzentren.setInputMask("") - self.i_code_impfzentren.setText("XXXXXXXXXXXX") - self.i_code_impfzentren.setReadOnly(True) + self.readonly_alle_line_edits(("i_plz_impfzentren", "i_telefon", "i_mail")) + + self.disable_all_dateEdits() + self.disable_all_timeEdits() + self.disable_all_checkBoxes() + self.disable_all_comboBoxes() + # '' sind alle Standard-Buttons e.g. Save, Reset + self.disable_all_buttons(['', 'b_impfzentren_waehlen']) + else: raise RuntimeError("Modus ungueltig!") @@ -266,16 +273,7 @@ def __get_alle_werte(self) -> dict: Returns: dict: User eingaben """ - plz_zentrum_raw = self.i_plz_impfzentren.text() - codes = self.__get_vermittlungscodes() - anrede = self.i_anrede_combo_box.currentText().strip() - vorname = self.i_vorname.text().strip() - nachname = self.i_nachname.text().strip() - strasse = self.i_strasse.text().strip() - hausnummer = self.i_hausnummer.text().strip() - wohnort = self.i_wohnort.text().strip() - plz_wohnort = self.i_plz_wohnort.text().strip() telefon = self.i_telefon.text().strip() mail = self.i_mail.text().strip() notifications = self.__get_notifications() @@ -284,25 +282,47 @@ def __get_alle_werte(self) -> dict: plz_zentren = plz_zentrum_raw.split(",") plz_zentren = [plz.strip() for plz in plz_zentren] + + if self.modus == Modus.TERMIN_SUCHEN: + codes = self.__get_vermittlungscodes() + anrede = self.i_anrede_combo_box.currentText().strip() + vorname = self.i_vorname.text().strip() + nachname = self.i_nachname.text().strip() + strasse = self.i_strasse.text().strip() + hausnummer = self.i_hausnummer.text().strip() + wohnort = self.i_wohnort.text().strip() + plz_wohnort = self.i_plz_wohnort.text().strip() + + kontaktdaten = { + "plz_impfzentren": plz_zentren, + "codes": codes, + "kontakt": { + "anrede": anrede, + "vorname": vorname, + "nachname": nachname, + "strasse": strasse, + "hausnummer": hausnummer, + "plz": plz_wohnort, + "ort": wohnort, + "phone": telefon, + "notificationChannel": "email", + "notificationReceiver": mail + }, + "notifications": notifications, + "zeitrahmen": self.__get_zeitrahmen() + } + + return kontaktdaten + kontaktdaten = { "plz_impfzentren": plz_zentren, - "codes": codes, "kontakt": { - "anrede": anrede, - "vorname": vorname, - "nachname": nachname, - "strasse": strasse, - "hausnummer": hausnummer, - "plz": plz_wohnort, - "ort": wohnort, "phone": telefon, "notificationChannel": "email", "notificationReceiver": mail }, "notifications": notifications, - "zeitrahmen": self.__get_zeitrahmen() } - return kontaktdaten def __check_werte(self, kontaktdaten: dict): @@ -311,7 +331,8 @@ def __check_werte(self, kontaktdaten: dict): Args: kontaktdaten (dict): Kontaktdaten - + modus: Modus der geprüft werden soll + Raises: ValidationError: Daten Fehlerhaft MissingValuesError: Daten Fehlen @@ -333,21 +354,21 @@ def __lade_alle_werte(self): # ToDo: Evtl. Meldung anzeigen return - self.__check_werte(kontaktdaten) + kontakt_tools.check_kontaktdaten(kontaktdaten, Modus.CODE_GENERIEREN) + kontakt_tools.validate_kontaktdaten(kontaktdaten) self.i_plz_impfzentren.setText(self.__get_impfzentren_plz(kontaktdaten["plz_impfzentren"])) self.i_telefon.setText(kontaktdaten["kontakt"]["phone"]) self.i_mail.setText(kontaktdaten["kontakt"]["notificationReceiver"]) - if self.modus == Modus.CODE_GENERIEREN: - # Versuche alle Werte zu laden, wenn möglich - try: - kontakt_tools.check_kontaktdaten(kontaktdaten, Modus.TERMIN_SUCHEN) - kontakt_tools.validate_kontaktdaten(kontaktdaten) - except MissingValuesError as exc: - return - except ValidationError as exc: - return + # Versuche alle Werte zu laden, wenn möglich + try: + kontakt_tools.check_kontaktdaten(kontaktdaten, Modus.TERMIN_SUCHEN) + kontakt_tools.validate_kontaktdaten(kontaktdaten) + except MissingValuesError as exc: + return + except ValidationError as exc: + return # Wird nur bei Terminsuche benötigt self.__set_vermittlungscodes(kontaktdaten["codes"]) @@ -428,7 +449,7 @@ def __set_impzentren_plz(self, plz: str): self.i_plz_impfzentren.setText(plz) - def readonly_alle_line_edits(self, ausgeschlossen: list): + def readonly_alle_line_edits(self, ausgeschlossen: list=list()): """ Setzt alle QLineEdit auf "read only", ausgeschlossen der Widgets in ausgeschlossen. Setzt zudem den PlacholderText auf "Daten werden nicht benötigt" @@ -443,6 +464,79 @@ def readonly_alle_line_edits(self, ausgeschlossen: list): if line_edit.objectName() not in ausgeschlossen: line_edit.setReadOnly(True) line_edit.setPlaceholderText("Daten werden nicht benötigt") + line_edit.setEnabled(False) + + + def disable_all_checkBoxes(self, ausgeschlossen: list=list()): + """ + Setzt alle QCheckBox auf "disabled", ausgeschlossen der Widgets in ausgeschlossen. + + Args: + ausgeschlossen (list): Liste mit den ObjectNamen der Widgets die ausgeschlossen werden sollen + """ + + checkBoxes = self.findChildren(QtWidgets.QCheckBox) + + for checkBox in checkBoxes: + if checkBox.objectName() not in ausgeschlossen: + checkBox.setEnabled(False) + + def disable_all_dateEdits(self, ausgeschlossen: list=list()): + """ + Setzt alle QDateEdit auf "disabled", ausgeschlossen der Widgets in ausgeschlossen. + + Args: + ausgeschlossen (list): Liste mit den ObjectNamen der Widgets die ausgeschlossen werden sollen + """ + + dateEdits = self.findChildren(QtWidgets.QDateEdit) + + for dateEdit in dateEdits: + if dateEdit.objectName() not in ausgeschlossen: + dateEdit.setEnabled(False) + + + def disable_all_timeEdits(self, ausgeschlossen: list=list()): + """ + Setzt alle QTimeEdit auf "disabled", ausgeschlossen der Widgets in ausgeschlossen. + + Args: + ausgeschlossen (list): Liste mit den ObjectNamen der Widgets die ausgeschlossen werden sollen + """ + + timeEdits = self.findChildren(QtWidgets.QTimeEdit) + + for timeEdit in timeEdits: + if timeEdit.objectName() not in ausgeschlossen: + timeEdit.setEnabled(False) + + def disable_all_comboBoxes(self, ausgeschlossen: list=list()): + """ + Setzt alle QComboBox auf "disabled", ausgeschlossen der Widgets in ausgeschlossen. + + Args: + ausgeschlossen (list): Liste mit den ObjectNamen der Widgets die ausgeschlossen werden sollen + """ + + comboBoxes = self.findChildren(QtWidgets.QComboBox) + + for comboBox in comboBoxes: + if comboBox.objectName() not in ausgeschlossen: + comboBox.setEnabled(False) + + def disable_all_buttons(self, ausgeschlossen: list=list()): + """ + Setzt alle QPushButtons auf "disabled", ausgeschlossen der Widgets in ausgeschlossen. + + Args: + ausgeschlossen (list): Liste mit den ObjectNamen der Widgets die ausgeschlossen werden sollen + """ + + pushButtons = self.findChildren(QtWidgets.QPushButton) + + for pushButton in pushButtons: + if pushButton.objectName() not in ausgeschlossen: + pushButton.setEnabled(False) def __reset_kontakdaten(self): """