def subcommand_code(args): if args.configure_only: update_kontaktdaten_interactive( get_kontaktdaten(args.file), "code", args.file) elif args.read_only: gen_code(get_kontaktdaten(args.file)) else: gen_code_interactive(args.file)
def subcommand_search(args): if args.configure_only: update_kontaktdaten_interactive( get_kontaktdaten(args.file), "search", args.configure_notifications, args.file) elif args.read_only: run_search(get_kontaktdaten(args.file), check_delay=args.retry_sec) else: run_search_interactive(args.file, args.configure_notifications, check_delay=args.retry_sec)
def gen_code_interactive(kontaktdaten_path): """ Interaktives Setup für die Codegenerierung: 1. Ggf. zuerst Eingabe, ob Kontaktdaten aus kontaktdaten.json geladen werden sollen. 2. Laden der Kontaktdaten aus kontaktdaten.json. 3. Bei unvollständigen Kontaktdaten: Interaktive Eingabe derjenigen fehlenden Kontaktdaten, die für die Codegenerierung benötigt werden. 4. Codegenerierung :param kontaktdaten_path: Pfad zur JSON-Datei mit Kontaktdaten. Default: kontaktdaten.json im aktuellen Ordner """ print( "Du kannst dir jetzt direkt einen Vermittlungscode erstellen.\n" "Dazu benötigst du eine Mailadresse, Telefonnummer und die PLZ deines Impfzentrums.\n" f"Die Daten werden anschließend lokal in der Datei '{os.path.basename(kontaktdaten_path)}' abgelegt.\n" "Du musst sie zukünftig nicht mehr eintragen.\n") kontaktdaten = {} if os.path.isfile(kontaktdaten_path): daten_laden = input( f"> Sollen die vorhandenen Daten aus '{os.path.basename(kontaktdaten_path)}' geladen werden (y/n)?: " ).lower() if daten_laden.lower() != "n": kontaktdaten = get_kontaktdaten(kontaktdaten_path) print() kontaktdaten = update_kontaktdaten_interactive(kontaktdaten, "code", False, kontaktdaten_path) return gen_code(kontaktdaten)
def run_search_interactive(kontaktdaten_path, configure_notifications, check_delay): """ Interaktives Setup für die Terminsuche: 1. Ggf. zuerst Eingabe, ob Kontaktdaten aus kontaktdaten.json geladen werden sollen. 2. Laden der Kontaktdaten aus kontaktdaten.json. 3. Bei unvollständigen Kontaktdaten: Interaktive Eingabe der fehlenden Kontaktdaten. 4. Terminsuche :param kontaktdaten_path: Pfad zur JSON-Datei mit Kontaktdaten. Default: data/kontaktdaten.json im aktuellen Ordner :param configure_notifications: Wird durchgereicht zu update_kontaktdaten_interactive() """ print( "Bitte trage zunächst deinen Impfcode und deine Kontaktdaten ein.\n" f"Die Daten werden anschließend lokal in der Datei '{os.path.basename(kontaktdaten_path)}' abgelegt.\n" "Du musst sie zukünftig nicht mehr eintragen.\n") kontaktdaten = {} if os.path.isfile(kontaktdaten_path): daten_laden = input( f"> Sollen die vorhandenen Daten aus '{os.path.basename(kontaktdaten_path)}' geladen werden? (y/n): " ).lower() if daten_laden.lower() != "n": kontaktdaten = get_kontaktdaten(kontaktdaten_path) print() kontaktdaten = update_kontaktdaten_interactive(kontaktdaten, "search", configure_notifications, kontaktdaten_path) return run_search(kontaktdaten, check_delay)
def __get_kontaktdaten(self, modus: Modus) -> dict: """ Ladet die Kontakdaten aus dem in der GUI hinterlegten Pfad Args: modus (Modus): Abhängig vom Modus werden nicht alle Daten benötigt. Returns: dict: Kontakdaten """ if not os.path.isfile(self.pfad_kontaktdaten): if not self.kontaktdaten_erstellen(modus): return {} kontaktdaten = kontak_tools.get_kontaktdaten(self.pfad_kontaktdaten) kontak_tools.check_kontaktdaten(kontaktdaten, modus) if modus == Modus.TERMIN_SUCHEN: if not self.__check_old_kontakt_version(kontaktdaten): raise ValidationError("\"zeitrahmen\" fehlt -> Alte Version") if "codes" in kontaktdaten: if "XXXX-XXXX-XXXX" in kontaktdaten["codes"]: raise ValidationError( "Der Code is ungültig. Bitte trage einen korrekten Code ein!" ) return kontaktdaten
def __get_kontaktdaten(self, modus: Modus) -> dict: """ Ladet die Kontakdaten aus dem in der GUI hinterlegten Pfad Args: modus (Modus): Abhängig vom Modus werden nicht alle Daten benötigt. Returns: dict: Kontakdaten """ if not os.path.isfile(self.pfad_kontaktdaten): self.kontaktdaten_erstellen(modus) kontaktdaten = kontak_tools.get_kontaktdaten(self.pfad_kontaktdaten) if not self.__check_old_kontakt_version(kontaktdaten): raise ValidationError("\"zeitrahmen\" fehlt -> Alte Version") return kontaktdaten
def __lade_alle_werte(self): """ Lädt alle Kontaktdaten und den Suchzeitraum in das GUI """ try: kontaktdaten = kontakt_tools.get_kontaktdaten(self.standard_speicherpfad) if not kontaktdaten: # ToDo: Evtl. Meldung anzeigen return 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"]) # 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"]) self.i_anrede_combo_box.setEditText(kontaktdaten["kontakt"]["anrede"]) self.i_vorname.setText(kontaktdaten["kontakt"]["vorname"]) self.i_nachname.setText(kontaktdaten["kontakt"]["nachname"]) self.i_strasse.setText(kontaktdaten["kontakt"]["strasse"]) self.i_hausnummer.setText(kontaktdaten["kontakt"]["hausnummer"]) self.i_plz_wohnort.setText(kontaktdaten["kontakt"]["plz"]) self.i_wohnort.setText(kontaktdaten["kontakt"]["ort"]) # Prüfen ob neuer key in kontaktdaten exisitiert if "notifications" in kontaktdaten: self.__set_notifications(kontaktdaten['notifications']) try: self.__set_zeitrahmen(kontaktdaten["zeitrahmen"]) # Subkeys von "zeitrahmen" brauchen nicht gecheckt werden, da # `kontaktdaten["zeitrahmen"] == {}` zulässig ist. except ValueError: self.__reset_zeitrahmen() self.__oeffne_error(title="Kontaktdaten", text="Falscher Suchzeitraum", info= "Der Suchzeitraum Ihrer Kontaktdaten ist fehlerhaft." " Überprüfen Sie die Daten im Reiter Zeitrahmen und" " speichern Sie die Kontaktdaten.") pass except MissingValuesError as exc: 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 " "Datei, indem Sie auf Speichern klicken.") except ValidationError as exc: 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 " "Datei, indem Sie auf Speichern klicken.") # Wechsel auf den ersten Reiter self.tabWidget.setCurrentIndex(0)