Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
    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
Example #6
0
    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
Example #7
0
    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)