#Modul zur Prüfung und zum Exception Handling für Dateieingaben #Dateipruefer.py import os from enum import Enum, auto # ------------------------------- # ENUMS # ------------------------------- class LeererPfadModus(Enum):#legt die modi fest, die für Dateipfade möglich sind VERBOTEN = auto() #ein leeres Eingabefeld stellt einen Fehler dar NUTZE_STANDARD = auto() #ein leeres Eingabefeld fordert zur Entscheidung auf: nutze Standard oder brich ab TEMPORAER_ERLAUBT = auto() #ein leeres Eingabefeld fordert zur Entscheidung auf: arbeite temporär oder brich ab. class DateiEntscheidung(Enum):#legt die Modi fest, wie mit bestehenden Dateien umgegangen werden soll (hat das das QGSFile-Objekt schon selbst?) ERSETZEN = auto()#Ergebnis der Nutzerentscheidung: bestehende Datei ersetzen ANHAENGEN = auto()#Ergebnis der Nutzerentscheidung: an bestehende Datei anhängen ABBRECHEN = auto()#bricht den Vorgang ab. (muss das eine definierte Option sein? oder geht das auch mit einem normalen Abbruch-Button) # ------------------------------- # RÜCKGABEOBJEKT # ------------------------------- #Das Dateiprüfergebnis wird an den Prüfmanager übergeben. Alle GUI-Abfragen werden im Prüfmanager behandelt. class DateipruefErgebnis: #Definition der Parameter und Festlegung auf den Parametertyp,bzw den Standardwert def __init__(self, erfolgreich: bool, pfad: str = None, temporär: bool = False, entscheidung: DateiEntscheidung = None, fehler: list = None): self.erfolgreich = erfolgreich self.pfad = pfad self.temporär = temporär self.entscheidung = entscheidung self.fehler = fehler or [] def __repr__(self): return (f"DateipruefErgebnis(erfolgreich={self.erfolgreich}, " f"pfad={repr(self.pfad)}, temporär={self.temporär}, " f"entscheidung={repr(self.entscheidung)}, fehler={repr(self.fehler)})") # ------------------------------- # DATEIPRÜFER # ------------------------------- class Dateipruefer: def pruefe(self, pfad: str, leer_modus: LeererPfadModus, standardname: str = None, plugin_pfad: str = None, vorhandene_datei_entscheidung: DateiEntscheidung = None) -> DateipruefErgebnis: #Rückgabetypannotation; "Die Funktion "pruefe" gibt ein Objekt vom Typ "DateipruefErgebnis" zurück # 1. Prüfe, ob das Eingabefeld leer ist if not pfad or pfad.strip() == "":#wenn der angegebene Pfad leer oder ungültig ist: if leer_modus == LeererPfadModus.VERBOTEN: #wenn der Modus "verboten" vorgegeben ist, gib zurück, dass der Test fehlgeschlagen ist return DateipruefErgebnis( erfolgreich=False, fehler=["Kein Pfad angegeben."] ) elif leer_modus == LeererPfadModus.NUTZE_STANDARD:#wenn der Modus "Nutze_Standard" vorgegeben ist... if not plugin_pfad or not standardname:#wenn kein gültiger Pluginpfad angegeben ist oder die Standarddatei fehlt... return DateipruefErgebnis( erfolgreich=False, fehler=["Standardpfad oder -name fehlen."]#..gib zurück, dass der Test fehlgeschlagen ist ) pfad = os.path.join(plugin_pfad, standardname)#...wenn es Standarddatei und Pluginpfad gibt...setze sie zum Pfad zusammen... elif leer_modus == LeererPfadModus.TEMPORAER_ERLAUBT:#wenn der Modus "temporär" vorgegeben ist,... return DateipruefErgebnis(#...gib zurück, dass das Prüfergebnis erfolgreich ist (Entscheidung, ob temporör gearbeitet werden soll oder nicht, kommt woanders) erfolgreich=True, pfad=None ) # 2. Existiert die Datei bereits? if os.path.exists(pfad):#wenn die Datei vorhanden ist... if not vorhandene_datei_entscheidung:#aber noch keine Entscheidung getroffen ist... return DateipruefErgebnis( erfolgreich=True,#ist die Prüfung erfolgreich, aber es muss noch eine Entscheidung verlangt werden pfad=pfad, entscheidung=None, fehler=["Datei existiert bereits – Entscheidung ausstehend."] ) if vorhandene_datei_entscheidung == DateiEntscheidung.ABBRECHEN: return DateipruefErgebnis(#...der Nutzer aber abgebrochen hat... erfolgreich=False,#ist die Prüfung fehlgeschlagen ISSUE: ergibt das Sinn? pfad=pfad, fehler=["Benutzer hat abgebrochen."] ) return DateipruefErgebnis( erfolgreich=True, pfad=pfad, entscheidung=vorhandene_datei_entscheidung ) # 3. Pfad gültig und Datei nicht vorhanden #wenn alle Varianten NICHT zutreffen, weil ein gültiger Pfad eingegeben wurde und die Datei noch nicht vorhanden ist: return DateipruefErgebnis( erfolgreich=True, pfad=pfad )