„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>
80 lines
2.8 KiB
Python
80 lines
2.8 KiB
Python
"""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()}
|