Files
Plugin_SN_Basis/modules/linkpruefer.py

142 lines
4.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
sn_basis/modules/linkpruefer.py Prüfung von URLs und lokalen Links.
Verwendet syswrapper und qgisqt_wrapper.
Gibt pruef_ergebnis an den Pruefmanager zurück.
"""
from sn_basis.functions.syswrapper import (
file_exists,
is_file,
join_path,
)
from sn_basis.functions.qgisqt_wrapper import (
network_head,
)
from sn_basis.modules.Pruefmanager import pruef_ergebnis
class Linkpruefer:
"""
Prüft URLs und lokale Pfade.
Die eigentliche Nutzerinteraktion übernimmt der Pruefmanager.
"""
def __init__(self, basis_pfad: str | None = None):
"""
basis_pfad: optionaler Basisordner für relative Pfade.
"""
self.basis = basis_pfad
# ---------------------------------------------------------
# Hilfsfunktionen
# ---------------------------------------------------------
def _pfad(self, relativer_pfad: str) -> str:
"""Erzeugt einen OS-unabhängigen Pfad relativ zum Basisverzeichnis."""
if not self.basis:
return relativer_pfad
return join_path(self.basis, relativer_pfad)
def _ist_url(self, text: str) -> bool:
"""Einfache URL-Erkennung."""
return text.startswith("http://") or text.startswith("https://")
# ---------------------------------------------------------
# Hauptfunktion
# ---------------------------------------------------------
def pruefe(self, eingabe: str) -> pruef_ergebnis:
"""
Prüft einen Link (URL oder lokalen Pfad).
Rückgabe: pruef_ergebnis
"""
if not eingabe:
return pruef_ergebnis(
ok=False,
meldung="Es wurde kein Link angegeben.",
aktion="leer",
pfad=None,
)
# -----------------------------------------------------
# 1. Fall: URL
# -----------------------------------------------------
if self._ist_url(eingabe):
return self._pruefe_url(eingabe)
# -----------------------------------------------------
# 2. Fall: lokaler Pfad
# -----------------------------------------------------
return self._pruefe_dateipfad(eingabe)
# ---------------------------------------------------------
# URLPrüfung
# ---------------------------------------------------------
def _pruefe_url(self, url: str) -> pruef_ergebnis:
"""
Prüft eine URL über einen HEADRequest.
"""
reply = network_head(url)
if reply is None:
return pruef_ergebnis(
ok=False,
meldung=f"Die URL '{url}' konnte nicht geprüft werden.",
aktion="netzwerkfehler",
pfad=url,
)
if reply.error != 0:
return pruef_ergebnis(
ok=False,
meldung=f"Die URL '{url}' ist nicht erreichbar.",
aktion="url_nicht_erreichbar",
pfad=url,
)
return pruef_ergebnis(
ok=True,
meldung="URL ist erreichbar.",
aktion="ok",
pfad=url,
)
# ---------------------------------------------------------
# Lokale Datei/Pfadprüfung
# ---------------------------------------------------------
def _pruefe_dateipfad(self, eingabe: str) -> pruef_ergebnis:
"""
Prüft einen lokalen Pfad.
"""
pfad = self._pfad(eingabe)
if not file_exists(pfad):
return pruef_ergebnis(
ok=False,
meldung=f"Der Pfad '{eingabe}' wurde nicht gefunden.",
aktion="pfad_nicht_gefunden",
pfad=pfad,
)
if not is_file(pfad):
return pruef_ergebnis(
ok=False,
meldung=f"Der Pfad '{eingabe}' ist keine Datei.",
aktion="kein_dateipfad",
pfad=pfad,
)
return pruef_ergebnis(
ok=True,
meldung="Dateipfad ist gültig.",
aktion="ok",
pfad=pfad,
)