Anzeige für den Eigentümer und Korrekturen im Tab „Eigentümer“ (#56)

„Daten anzeigen“ in der Trefferliste zeigt Name, Anschrift und E-Mail der
gewählten Einträge in einem eigenen Fenster: auf einem zweiten Bildschirm
im Vollbild, auf dem QGIS-Bildschirm als normales Fenster. Die Sitzung
wird von Hand begonnen und beendet; „Anzeige leeren“ entfernt die Daten,
ohne das Fenster zu schließen. Konten, IDs und Kennzeichen erscheinen dort
nicht, alle Werte werden maskiert.

„Korrigieren …“ ändert angezeigte Daten. Die Eigentümerdatei bleibt
unverändert; jede Änderung wird mit Zeitpunkt, Konto, Personen-ID, altem
und neuem Wert an <Eigentümerdatei>_korrekturen.csv angehängt und sofort
angezeigt. Ohne beschreibbaren Ordner wird nach dem Speicherort gefragt.

In test_eigentuemer_tab.py sind die beim letzten Mal zusammengezogenen
with-Zeilen wieder umbrochen; die Trefferliste bekommt jetzt den
Anzeige-Rückruf, der Test dazu ist angepasst.

Dritter und letzter Schritt von #56.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-06 13:27:15 +02:00
co-authored by Claude Opus 5.5
parent d88efac0ec
commit e547cb90c5
9 changed files with 1063 additions and 13 deletions
+79
View File
@@ -0,0 +1,79 @@
"""sn_verfahrensgebiet/ui/eigentuemer_korrektur_dialog.py – Korrekturdialog für den Bearbeiter (#56).
Zeigt die Felder eines angezeigten Eintrags zum Bearbeiten. Sind mehrere
Einträge angezeigt, wählt der Bearbeiter oben, welchen er korrigiert. Der
Dialog speichert nichts selbst; das übernimmt der Tab über
:mod:`sn_verfahrensgebiet.functions.eigentuemer_korrektur`.
"""
from typing import Dict, Optional, Sequence, Tuple
from sn_basis.functions.qt_wrapper import (
QT_VERSION, exec_dialog, DialogAccepted,
QDialog, QDialogButtonBox, QVBoxLayout, QGridLayout, QLabel, QLineEdit, QComboBox,
)
from sn_verfahrensgebiet.functions.eigentuemer_suche import Eigentuemer
from sn_verfahrensgebiet.functions.eigentuemer_korrektur import FELDER, feldwerte
def frage_korrektur(
parent,
eintraege: Sequence[Eigentuemer],
) -> Optional[Tuple[int, Dict[str, str]]]:
"""Fragt die korrigierten Werte ab.
Returns
-------
Optional[Tuple[int, Dict[str, str]]]
Index des gewählten Eintrags und die Werte aller Felder, oder ``None``
bei Abbruch (und im Mock-Modus).
"""
if not eintraege or QT_VERSION == 0:
return None
dialog = QDialog(parent)
dialog.setWindowTitle("Daten korrigieren")
layout = QVBoxLayout(dialog)
auswahl = QComboBox()
for eintrag in eintraege:
auswahl.addItem(f"{eintrag.name} – {eintrag.anschrift}")
if len(eintraege) > 1:
layout.addWidget(QLabel("Eintrag:"))
layout.addWidget(auswahl)
raster = QGridLayout()
felder: Dict[str, QLineEdit] = {}
for zeile, (schluessel, beschriftung) in enumerate(FELDER):
raster.addWidget(QLabel(f"{beschriftung}:"), zeile, 0)
feld = QLineEdit()
raster.addWidget(feld, zeile, 1)
felder[schluessel] = feld
layout.addLayout(raster)
def _fuellen(index: int) -> None:
if 0 <= index < len(eintraege):
for schluessel, wert in feldwerte(eintraege[index]).items():
felder[schluessel].setText(wert)
auswahl.currentIndexChanged.connect(_fuellen)
_fuellen(0)
hinweis = QLabel(
"<small>Die Eigentümerdatei bleibt unverändert. Jede Änderung wird in der "
"Korrektur-CSV festgehalten und sofort im Anzeigefenster gezeigt. "
"Mehrere E-Mail-Adressen mit Komma trennen.</small>"
)
hinweis.setWordWrap(True)
layout.addWidget(hinweis)
knoepfe = QDialogButtonBox(QDialogButtonBox.StandardButton.Save | QDialogButtonBox.StandardButton.Cancel)
knoepfe.accepted.connect(dialog.accept)
knoepfe.rejected.connect(dialog.reject)
layout.addWidget(knoepfe)
dialog.resize(520, dialog.sizeHint().height())
if exec_dialog(dialog) != DialogAccepted:
return None
return auswahl.currentIndex(), {schluessel: feld.text() for schluessel, feld in felder.items()}