Skip to content
This repository has been archived by the owner on Jul 9, 2024. It is now read-only.

Commit

Permalink
verbesserte Datenabfrage
Browse files Browse the repository at this point in the history
  • Loading branch information
Floskinner committed May 27, 2021
1 parent 300d2cd commit f7f515b
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 9 deletions.
28 changes: 21 additions & 7 deletions gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(self, pfad_fenster_layout: str = os.path.join(PATH, "tools/gui/main
self.b_code_generieren.clicked.connect(self.__code_generieren)
self.b_dateien_kontaktdaten.clicked.connect(self.__update_kontaktdaten_pfad)
self.b_dateien_zeitspanne.clicked.connect(self.__update_zeitspanne_pfad)
self.b_neue_kontaktdaten.clicked.connect(self.kontaktdaten_erstellen)
self.b_neue_kontaktdaten.clicked.connect(lambda: self.kontaktdaten_erstellen(Modus.TERMIN_SUCHEN))
self.b_neue_zeitspanne.clicked.connect(self.zeitspanne_erstellen)

# Standard Pfade
Expand Down Expand Up @@ -84,12 +84,15 @@ def start_gui():
window = HauptGUI()
app.exec_()

def kontaktdaten_erstellen(self):
def kontaktdaten_erstellen(self, modus: Modus = Modus.TERMIN_SUCHEN):
"""
Ruft den Dialog für die Kontaktdaten auf
Args:
modus (Modus): Abhängig vom Modus werden nicht alle Daten benötigt. Defalut TERMIN_SUCHEN
"""

dialog = QtKontakt(self.pfad_kontaktdaten)
dialog = QtKontakt(modus, self.pfad_kontaktdaten)
dialog.show()
dialog.exec_()

Expand All @@ -109,9 +112,15 @@ def __termin_suchen(self):
Alle Threads sind deamon Thread (Sofort töten sobald der Bot beendet wird)
"""

kontaktdaten = self.__get_kontaktdaten()
kontaktdaten = self.__get_kontaktdaten(Modus.TERMIN_SUCHEN)
zeitspanne = self.__get_zeitspanne()

try:
check_alle_kontakt_daten_da(Modus.TERMIN_SUCHEN, kontaktdaten)
except FehlendeDatenException as error:
QtWidgets.QMessageBox.critical(self, "Daten unvollständig!", f"Es fehlen Daten in der JSON Datei\n\n{error}")
return

terminsuche_thread = threading.Thread(target=self.__start_terminsuche, args=(kontaktdaten, zeitspanne), daemon=True)
terminsuche_thread.setName(kontaktdaten["code"])

Expand Down Expand Up @@ -151,18 +160,21 @@ def __code_generieren(self):
"""

# TODO: code generierung implementieren
pass
QtWidgets.QMessageBox.information(self, "Noch nicht verfügbar", "Funktion nur über Konsole verfügbar")

def __get_kontaktdaten(self) -> dict:
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()
self.kontaktdaten_erstellen(modus)

with open(self.pfad_kontaktdaten, "r", encoding='utf-8') as f:
kontaktdaten = json.load(f)
Expand All @@ -183,6 +195,8 @@ def __get_zeitspanne(self) -> dict:
with open(self.pfad_zeitspanne, "r", encoding='utf-8') as f:
zeitspanne = json.load(f)

#TODO: Prüfen ob Daten vollständig

return zeitspanne

def __update_kontaktdaten_pfad(self):
Expand Down
69 changes: 69 additions & 0 deletions tools/gui/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,76 @@
import json
from enum import Enum, auto
from PyQt5 import QtWidgets


class Modus(Enum):
CODE_GENERIEREN = auto()
TERMIN_SUCHEN = auto()


class FehlendeDatenException(Exception):
pass


def check_alle_kontakt_daten_da(modus: Modus, data: dict):
"""
Nur für Kontaktdaten!
Überprüft ob alle Key vorhanden sind und ob die Values kein leeren String enthalten
Args:
modus (Modus): Entsprechend werden Daten überprüft
data (dict): Inhalt der JSON
Raises:
FehlendeDatenException: Es wird ein Key oder Value vermisst
"""

if modus == Modus.TERMIN_SUCHEN:
try:
# Daten vorhanden
data["plz_impfzentren"]
data["code"]
data["kontakt"]["anrede"]
data["kontakt"]["vorname"]
data["kontakt"]["nachname"]
data["kontakt"]["strasse"]
data["kontakt"]["hausnummer"]
data["kontakt"]["plz"]
data["kontakt"]["ort"]
data["kontakt"]["phone"]
data["kontakt"]["notificationChannel"]
data["kontakt"]["notificationReceiver"]

# Daten enthalten kein leerer String
# PLZ
for plz in data["plz_impfzentren"]:
if not plz.strip():
raise FehlendeDatenException("Wert fuer \"plz_impfzentren\" fehlerhaft!")
if not data["code"].strip():
raise FehlendeDatenException("Wert fuer \"code\" fehlt!")
# 2. Ebene
for key, value in data["kontakt"].items():
if not value.strip():
raise FehlendeDatenException(f"Wert fuer \"{key}\" fehlt!")
except KeyError as error:
raise FehlendeDatenException("Schluesselwort Fehlt!") from error

elif modus == Modus.CODE_GENERIEREN:
try:
# Daten vorhanden
data["plz_impfzentren"]
data["kontakt"]["phone"]
data["kontakt"]["notificationChannel"]
data["kontakt"]["notificationReceiver"]

# Daten enthalten kein leerer String
for key, values in data.items():
if values.strip() == "":
raise FehlendeDatenException(f"Wert fuer \"{key}\" fehlt!")
except KeyError as error:
raise FehlendeDatenException("Schluesselwort Fehlt!") from error


def oeffne_file_dialog_save(parent_widged: QtWidgets.QWidget, titel: str, standard_speicherpfad: str, dateityp="JSON Files (*.json)") -> str:
"""
Öffnet ein File Dialog, der entsprechend einen Pfad zurück gibt, wohin gespeichert werden soll
Expand Down
31 changes: 29 additions & 2 deletions tools/gui/qtkontakt.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,29 @@


class QtKontakt(QtWidgets.QDialog):
def __init__(self, standard_speicherpfad: str, pfad_fenster_layout=os.path.join(PATH, "kontaktdaten.ui")):
def __init__(self, modus: Modus, standard_speicherpfad: str, pfad_fenster_layout=os.path.join(PATH, "kontaktdaten.ui")):
super().__init__()

self.standard_speicherpfad = standard_speicherpfad

# Laden der .ui Datei
uic.loadUi(pfad_fenster_layout, self)
self.setup(modus)

# Funktionen für Buttonbox zuweisen
self.buttonBox.clicked.connect(self.__button_clicked)

def setup(self, modus: Modus):
if modus == Modus.TERMIN_SUCHEN:
# Default - Alle Felder aktiv
pass
elif modus == Modus.CODE_GENERIEREN:
# Benötig wird: PLZ's der Impfzentren, Telefonnummer, Mail
# Alles andere wird daher deaktiviert
self.readonly_alle_line_edits(("i_plz_impfzentren", "i_telefon", "i_mail"))
else:
raise RuntimeError("Modus ungueltig!")

def bestaetigt(self):
"""
Versucht die Daten zu speichern und schließt sich anschließend selbst
Expand All @@ -58,7 +70,6 @@ def bestaetigt(self):
self.close()
except (TypeError, IOError, FileNotFoundError) as error:
QtWidgets.QMessageBox.critical(self, "Fehler beim Speichern!", "Bitte erneut versuchen!")
print(error)

def speicher_einstellungen(self):
"""
Expand Down Expand Up @@ -129,6 +140,22 @@ def __get_alle_werte(self) -> dict:
}
return kontaktdaten

def readonly_alle_line_edits(self, ausgeschlossen: list):
"""
Setzt alle QLineEdit auf "read only", ausgeschlossen der Widgets in ausgeschlossen.
Setzt zudem den PlacholderText auf "Daten werden nicht benötigt"
Args:
ausgeschlossen (list): Liste mit den ObjectNamen der Widgets die ausgeschlossen werden sollen
"""

line_edits = self.findChildren(QtWidgets.QLineEdit)

for line_edit in line_edits:
if line_edit.objectName() not in ausgeschlossen:
line_edit.setReadOnly(True)
line_edit.setPlaceholderText("Daten werden nicht benötigt")

def __reset(self):
"""
Setzt alle Werte in der GUI zurück
Expand Down

0 comments on commit f7f515b

Please sign in to comment.