diff --git a/functions/beteiligung_pruefung.py b/functions/beteiligung_pruefung.py index 54152c1..9fff270 100644 --- a/functions/beteiligung_pruefung.py +++ b/functions/beteiligung_pruefung.py @@ -221,15 +221,26 @@ def baue_flurstueck_csv_liste(zeilen: List[dict], laenderkennung: str) -> List[s # --------------------------------------------------------------------------- def _hole_verfahrensgebiet_layer(tab_widget) -> Optional[object]: - """Liefert den aktuell relevanten Verfahrensgebiet-Layer, falls vorhanden.""" + """Liefert den Verfahrensgebiet-Layer, falls vorhanden. + + Der per Name (``VERF_LAYER_NAME``) identifizierte Layer hat Vorrang vor + der Dropdown-Auswahl im Tab: try1/try2/try3 orientieren sich am + tatsächlichen "Verfahrensgebiet"-Bestand im Projekt, nicht an einer + ggf. anderweitig belegten Nutzerauswahl (z.B. für Grenzpunkte/ + Umringstatistik). Die Dropdown-Auswahl dient nur als Fallback, falls + kein so benannter Layer existiert. + """ + treffer = QgsProject.instance().mapLayersByName(VERF_LAYER_NAME) + if treffer: + return treffer[0] + combo = getattr(tab_widget, "verf_layer_combo", None) if combo is not None: layer = combo.currentLayer() if layer is not None and layer.isValid(): return layer - treffer = QgsProject.instance().mapLayersByName(VERF_LAYER_NAME) - return treffer[0] if treffer else None + return None def _hat_verwendbare_kennzeichen(verf_layer) -> bool: @@ -272,6 +283,10 @@ def _try1_listenabgleich( 3, "Beteiligung prüfen", "Verfahrensgebiet-Kennzeichen einlesen …" ) progress.set_value(0) + # Ohne eine dazwischenliegende Nutzerinteraktion (z.B. nach der silent + # durchlaufenen ALKIS-Pipeline in try2/try3) holt sich kein anderer + # Dialog den Fokus zurück – Dialog daher explizit in den Vordergrund holen. + progress.raise_to_front() verf_menge = get_kennzeichen_menge(verf_layer) csv_menge = set(flurstueck_csv_liste) diff --git a/functions/verfahrensgebiet_alkis_komplett.py b/functions/verfahrensgebiet_alkis_komplett.py index e20c1d4..f9ea49d 100644 --- a/functions/verfahrensgebiet_alkis_komplett.py +++ b/functions/verfahrensgebiet_alkis_komplett.py @@ -496,6 +496,10 @@ def verfahrensgebiet_alkis_komplett( "Schritt 1: Grenzpunkte laden …", ) detail_progress.set_value(0) + # Ohne die (im silent-Modus übersprungene) Nachfrage vor diesem Punkt + # holt sich kein anderer Dialog mehr den Fokus zurück – Dialog daher + # explizit in den Vordergrund holen, sonst bleibt er unsichtbar. + detail_progress.raise_to_front() # Schritt 1: PunktortTA gemarkungsweise laden (Hits + 5000er-Batches) punktort_layer = lade_punktort_ta( diff --git a/tests/test_beteiligung_pruefung.py b/tests/test_beteiligung_pruefung.py index ff79402..36352dd 100644 --- a/tests/test_beteiligung_pruefung.py +++ b/tests/test_beteiligung_pruefung.py @@ -55,6 +55,7 @@ from sn_verfahrensgebiet.functions.beteiligung_pruefung import ( CSV_SPALTE_VEF_VKZF, _lade_via_alkis_pipeline_und_vergleiche, _try3_bootstrap_und_try2, + _hole_verfahrensgebiet_layer, ) _MOD = "sn_verfahrensgebiet.functions.beteiligung_pruefung" @@ -125,6 +126,50 @@ class TestBaueFlurstueckCsvListe(unittest.TestCase): self.assertEqual(zeilen[2][FELD_FLURSTUECK_CSV], "145678___00001____01") +class TestHoleVerfahrensgebietLayer(unittest.TestCase): + @patch(f"{_MOD}.QgsProject") + def test_layer_per_name_hat_vorrang_vor_combo_auswahl(self, mock_project_cls): + namens_layer = MagicMock(name="verfahrensgebiet_layer") + mock_project = MagicMock() + mock_project.mapLayersByName.return_value = [namens_layer] + mock_project_cls.instance.return_value = mock_project + + andere_auswahl = MagicMock(name="andere_layer_in_combo") + andere_auswahl.isValid.return_value = True + tab_widget = MagicMock() + tab_widget.verf_layer_combo.currentLayer.return_value = andere_auswahl + + ergebnis = _hole_verfahrensgebiet_layer(tab_widget) + + self.assertIs(ergebnis, namens_layer) + + @patch(f"{_MOD}.QgsProject") + def test_combo_auswahl_als_fallback_ohne_namens_layer(self, mock_project_cls): + mock_project = MagicMock() + mock_project.mapLayersByName.return_value = [] + mock_project_cls.instance.return_value = mock_project + + combo_layer = MagicMock(name="combo_layer") + combo_layer.isValid.return_value = True + tab_widget = MagicMock() + tab_widget.verf_layer_combo.currentLayer.return_value = combo_layer + + ergebnis = _hole_verfahrensgebiet_layer(tab_widget) + + self.assertIs(ergebnis, combo_layer) + + @patch(f"{_MOD}.QgsProject") + def test_kein_layer_gibt_none(self, mock_project_cls): + mock_project = MagicMock() + mock_project.mapLayersByName.return_value = [] + mock_project_cls.instance.return_value = mock_project + + tab_widget = MagicMock() + tab_widget.verf_layer_combo.currentLayer.return_value = None + + self.assertIsNone(_hole_verfahrensgebiet_layer(tab_widget)) + + class TestLadeViaAlkisPipelineUndVergleiche(unittest.TestCase): @patch(f"{_MOD}._try1_listenabgleich") @patch(f"{_MOD}.apply_style")