Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ffc56f5bc4 | ||
|
|
c01bf241db | ||
|
|
9ec465e276 | ||
|
|
d5b7482ebd | ||
|
|
8e4031a884 | ||
|
|
f1f104a464 | ||
|
|
f34e4ce458 | ||
|
|
30b17e0b83 |
@@ -1,4 +1,8 @@
|
||||
---
|
||||
Version 26.04.1-unstable:
|
||||
---
|
||||
Version 26.3.3-unstable:
|
||||
---
|
||||
Version 26.3.2-unstable:
|
||||
---
|
||||
Version 26.3.1-testing:
|
||||
|
||||
@@ -174,6 +174,7 @@ except Exception:
|
||||
self.project = project
|
||||
self._name = ""
|
||||
self._page = _MockQgsLayoutPage()
|
||||
self.items: list[Any] = []
|
||||
|
||||
def initializeDefaults(self) -> None:
|
||||
pass
|
||||
@@ -188,7 +189,7 @@ except Exception:
|
||||
return self._page
|
||||
|
||||
def addLayoutItem(self, item: Any) -> None:
|
||||
pass
|
||||
self.items.append(item)
|
||||
|
||||
class _MockQgsLayoutPage:
|
||||
def setPageSize(self, size: Any) -> None:
|
||||
@@ -201,15 +202,21 @@ except Exception:
|
||||
class _MockQgsLayoutItemMap:
|
||||
def __init__(self, layout: Any):
|
||||
self.layout = layout
|
||||
self.item_id = ""
|
||||
self.extent = None
|
||||
self.scale = None
|
||||
self.follow_visibility_preset = False
|
||||
self.follow_visibility_preset_name = ""
|
||||
self.keep_layer_set = False
|
||||
|
||||
def setId(self, item_id: str) -> None:
|
||||
pass
|
||||
self.item_id = item_id
|
||||
|
||||
def setExtent(self, extent: Any) -> None:
|
||||
pass
|
||||
self.extent = extent
|
||||
|
||||
def setScale(self, scale: float) -> None:
|
||||
pass
|
||||
self.scale = scale
|
||||
|
||||
def attemptMove(self, point: Any) -> None:
|
||||
pass
|
||||
@@ -218,10 +225,13 @@ except Exception:
|
||||
pass
|
||||
|
||||
def setFollowVisibilityPreset(self, active: bool) -> None:
|
||||
pass
|
||||
self.follow_visibility_preset = active
|
||||
|
||||
def setFollowVisibilityPresetName(self, name: str) -> None:
|
||||
pass
|
||||
self.follow_visibility_preset_name = name
|
||||
|
||||
def setKeepLayerSet(self, enabled: bool) -> None:
|
||||
self.keep_layer_set = enabled
|
||||
|
||||
class _MockQgsLayoutItemLabel:
|
||||
ModeHtml = 1
|
||||
@@ -271,24 +281,30 @@ except Exception:
|
||||
def __init__(self, layout: Any):
|
||||
self.layout = layout
|
||||
self._model = _MockLegendModel()
|
||||
self.item_id = ""
|
||||
self.object_name = ""
|
||||
self.linked_map = None
|
||||
self.auto_update_model = None
|
||||
self.legend_filter_by_map_enabled = None
|
||||
self.title = ""
|
||||
|
||||
def setId(self, item_id: str) -> None:
|
||||
pass
|
||||
self.item_id = item_id
|
||||
|
||||
def setObjectName(self, name: str) -> None:
|
||||
pass
|
||||
self.object_name = name
|
||||
|
||||
def setLinkedMap(self, map_item: Any) -> None:
|
||||
pass
|
||||
self.linked_map = map_item
|
||||
|
||||
def setAutoUpdateModel(self, enabled: bool) -> None:
|
||||
pass
|
||||
self.auto_update_model = enabled
|
||||
|
||||
def setLegendFilterByMapEnabled(self, enabled: bool) -> None:
|
||||
pass
|
||||
self.legend_filter_by_map_enabled = enabled
|
||||
|
||||
def setTitle(self, title: str) -> None:
|
||||
pass
|
||||
self.title = title
|
||||
|
||||
def setReferencePoint(self, point: Any) -> None:
|
||||
pass
|
||||
@@ -329,6 +345,34 @@ except Exception:
|
||||
QgsUnitTypes = _MockQgsUnitTypes
|
||||
QgsLayoutItem = _MockQgsLayoutItem
|
||||
|
||||
class _MockQgsFeature:
|
||||
def __init__(self):
|
||||
self._geometry = None
|
||||
self._attributes = []
|
||||
|
||||
def setGeometry(self, geometry: Any) -> None:
|
||||
self._geometry = geometry
|
||||
|
||||
def setAttributes(self, attributes: list[Any]) -> None:
|
||||
self._attributes = attributes
|
||||
|
||||
class _MockQgsField:
|
||||
def __init__(self, name: str = "", field_type: Any = None):
|
||||
self.name = name
|
||||
self.field_type = field_type
|
||||
|
||||
class _MockQgsGeometry:
|
||||
@staticmethod
|
||||
def unaryUnion(_geometries: list[Any]):
|
||||
return None
|
||||
|
||||
def isEmpty(self) -> bool:
|
||||
return True
|
||||
|
||||
QgsFeature = _MockQgsFeature
|
||||
QgsField = _MockQgsField
|
||||
QgsGeometry = _MockQgsGeometry
|
||||
|
||||
class _MockQgsFeatureRequest:
|
||||
def __init__(self):
|
||||
self._filter_rect = None
|
||||
|
||||
@@ -97,6 +97,10 @@ def set_variable(key: str, value: str, scope: str = "project") -> None:
|
||||
var_name = f"sn_{key}"
|
||||
|
||||
if scope == "project":
|
||||
current_value = get_variable(key, scope="project")
|
||||
if current_value == value:
|
||||
return
|
||||
|
||||
project = QgsProject.instance()
|
||||
QgsExpressionContextUtils.setProjectVariable(
|
||||
project,
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
[general]
|
||||
version=26.3.2-unstable
|
||||
version=26.04.1-unstable
|
||||
name=LNO Sachsen | Plugin Basisfunktionen
|
||||
description=Plugin mit Basisfunktionen
|
||||
author=Daniel Helbig, Michael Otto
|
||||
|
||||
+2
-18
@@ -494,30 +494,14 @@ class PrintLayout:
|
||||
set_auto_update_model = getattr(legend, "setAutoUpdateModel", None)
|
||||
if callable(set_auto_update_model):
|
||||
try:
|
||||
set_auto_update_model(False)
|
||||
set_auto_update_model(True)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
set_filter_by_map = getattr(legend, "setLegendFilterByMapEnabled", None)
|
||||
if callable(set_filter_by_map):
|
||||
try:
|
||||
set_filter_by_map(False)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
model_method = getattr(legend, "model", None)
|
||||
if callable(model_method):
|
||||
try:
|
||||
model = model_method()
|
||||
root_group_method = getattr(model, "rootGroup", None)
|
||||
root_group = root_group_method() if callable(root_group_method) else None
|
||||
clear = getattr(root_group, "clear", None)
|
||||
if callable(clear):
|
||||
clear()
|
||||
add_layer = getattr(root_group, "addLayer", None)
|
||||
if callable(add_layer):
|
||||
for layer in self._resolve_visible_map_layers(linked_map):
|
||||
add_layer(layer)
|
||||
set_filter_by_map(True)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
from sn_basis.functions.qgiscore_wrapper import (
|
||||
QgsLayoutItemLegend,
|
||||
QgsLayoutItemMap,
|
||||
QgsPrintLayout,
|
||||
QgsProject,
|
||||
)
|
||||
from sn_basis.modules.print_layout import PrintLayout
|
||||
|
||||
|
||||
class _FakeExtent:
|
||||
def isNull(self) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
class TestPrintLayout(unittest.TestCase):
|
||||
|
||||
def test_create_legend_item_links_map_and_enables_map_filtering(self):
|
||||
project = QgsProject.instance()
|
||||
print_layout = PrintLayout(project=project)
|
||||
layout = QgsPrintLayout(project)
|
||||
linked_map = QgsLayoutItemMap(layout)
|
||||
|
||||
legend = print_layout._create_legend_item(
|
||||
layout,
|
||||
"legende",
|
||||
linked_map,
|
||||
10.0,
|
||||
20.0,
|
||||
width_mm=50.0,
|
||||
height_mm=30.0,
|
||||
)
|
||||
|
||||
self.assertIs(legend.linked_map, linked_map)
|
||||
self.assertTrue(legend.auto_update_model)
|
||||
self.assertTrue(legend.legend_filter_by_map_enabled)
|
||||
|
||||
def test_create_legend_item_does_not_copy_project_layers_into_legend_model(self):
|
||||
project = QgsProject.instance()
|
||||
print_layout = PrintLayout(project=project)
|
||||
layout = QgsPrintLayout(project)
|
||||
linked_map = QgsLayoutItemMap(layout)
|
||||
|
||||
legend = print_layout._create_legend_item(
|
||||
layout,
|
||||
"legende",
|
||||
linked_map,
|
||||
10.0,
|
||||
20.0,
|
||||
)
|
||||
|
||||
root_group = legend.model().rootGroup()
|
||||
self.assertEqual(root_group.layers, [])
|
||||
|
||||
@patch("sn_basis.modules.print_layout.open_layout_designer")
|
||||
def test_create_single_page_layout_keeps_legend_linked_to_hauptkarte_and_theme(self, _mock_open_designer):
|
||||
project = QgsProject.instance()
|
||||
print_layout = PrintLayout(project=project)
|
||||
|
||||
layout = print_layout.create_single_page_layout(
|
||||
name="Testlayout",
|
||||
page_width_mm=420.0,
|
||||
page_height_mm=297.0,
|
||||
map_width_mm=200.0,
|
||||
map_height_mm=150.0,
|
||||
extent=_FakeExtent(),
|
||||
plotmassstab=5000.0,
|
||||
thema="Thema A",
|
||||
)
|
||||
|
||||
hauptkarte = next(item for item in layout.items if isinstance(item, QgsLayoutItemMap))
|
||||
legende = next(item for item in layout.items if isinstance(item, QgsLayoutItemLegend))
|
||||
|
||||
self.assertTrue(hauptkarte.follow_visibility_preset)
|
||||
self.assertEqual(hauptkarte.follow_visibility_preset_name, "Thema A")
|
||||
self.assertTrue(hauptkarte.keep_layer_set)
|
||||
self.assertIs(legende.linked_map, hauptkarte)
|
||||
self.assertTrue(legende.auto_update_model)
|
||||
self.assertTrue(legende.legend_filter_by_map_enabled)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,56 @@
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
from sn_basis.functions import variable_wrapper
|
||||
|
||||
|
||||
class _Scope:
|
||||
def __init__(self, value: str):
|
||||
self._value = value
|
||||
|
||||
def variable(self, _name: str) -> str:
|
||||
return self._value
|
||||
|
||||
|
||||
class TestVariableWrapper(unittest.TestCase):
|
||||
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsProject.instance")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.setProjectVariable")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.projectScope")
|
||||
def test_set_variable_project_noop_write_is_skipped(
|
||||
self,
|
||||
mock_project_scope,
|
||||
mock_set_project_variable,
|
||||
mock_project_instance,
|
||||
):
|
||||
mock_project_instance.return_value = object()
|
||||
mock_project_scope.return_value = _Scope("layer_1")
|
||||
|
||||
variable_wrapper.set_variable("verfahrensgebiet_layer", "layer_1", scope="project")
|
||||
|
||||
mock_set_project_variable.assert_not_called()
|
||||
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsProject.instance")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.setProjectVariable")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.projectScope")
|
||||
def test_set_variable_project_changed_value_is_written(
|
||||
self,
|
||||
mock_project_scope,
|
||||
mock_set_project_variable,
|
||||
mock_project_instance,
|
||||
):
|
||||
fake_project = object()
|
||||
mock_project_instance.return_value = fake_project
|
||||
mock_project_scope.return_value = _Scope("old_value")
|
||||
|
||||
variable_wrapper.set_variable("verfahrensgebiet_layer", "new_value", scope="project")
|
||||
|
||||
mock_set_project_variable.assert_called_once_with(
|
||||
fake_project,
|
||||
"sn_verfahrensgebiet_layer",
|
||||
"new_value",
|
||||
)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
@@ -0,0 +1,68 @@
|
||||
import unittest
|
||||
from unittest.mock import patch
|
||||
|
||||
from sn_basis.functions import verfahrensgebiet_manager
|
||||
|
||||
|
||||
class _Scope:
|
||||
def __init__(self, value: str):
|
||||
self._value = value
|
||||
|
||||
def variable(self, _name: str) -> str:
|
||||
return self._value
|
||||
|
||||
|
||||
class TestVerfahrensgebietManager(unittest.TestCase):
|
||||
|
||||
@patch("sn_basis.functions.verfahrensgebiet_manager.get_variable", return_value="layer_123")
|
||||
def test_get_verfahrensgebiet_layer_id_returns_value(self, _mock_get_variable):
|
||||
result = verfahrensgebiet_manager.get_verfahrensgebiet_layer_id()
|
||||
|
||||
self.assertEqual(result, "layer_123")
|
||||
|
||||
@patch("sn_basis.functions.verfahrensgebiet_manager.get_variable", return_value="")
|
||||
def test_get_verfahrensgebiet_layer_id_returns_none_for_empty_value(self, _mock_get_variable):
|
||||
result = verfahrensgebiet_manager.get_verfahrensgebiet_layer_id()
|
||||
|
||||
self.assertIsNone(result)
|
||||
|
||||
@patch("sn_basis.functions.verfahrensgebiet_manager.set_variable")
|
||||
def test_set_verfahrensgebiet_layer_id_writes_project_variable(self, mock_set_variable):
|
||||
verfahrensgebiet_manager.set_verfahrensgebiet_layer_id("layer_abc")
|
||||
|
||||
mock_set_variable.assert_called_once_with("verfahrensgebiet_layer", "layer_abc", scope="project")
|
||||
|
||||
@patch("sn_basis.functions.verfahrensgebiet_manager._find_verfahrensgebiet_layer")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsProject.instance")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.setProjectVariable")
|
||||
@patch("sn_basis.functions.variable_wrapper.QgsExpressionContextUtils.projectScope")
|
||||
def test_update_without_layer_does_not_write_when_already_empty(
|
||||
self,
|
||||
mock_project_scope,
|
||||
mock_set_project_variable,
|
||||
mock_project_instance,
|
||||
mock_find_layer,
|
||||
):
|
||||
mock_find_layer.return_value = (None, None)
|
||||
mock_project_instance.return_value = object()
|
||||
mock_project_scope.return_value = _Scope("")
|
||||
|
||||
result = verfahrensgebiet_manager._update_verfahrensgebiet_from_project()
|
||||
|
||||
self.assertFalse(result)
|
||||
mock_set_project_variable.assert_not_called()
|
||||
|
||||
@patch("sn_basis.functions.verfahrensgebiet_manager._find_verfahrensgebiet_layer")
|
||||
@patch("sn_basis.functions.verfahrensgebiet_manager.set_variable")
|
||||
def test_update_with_layer_writes_variable(self, mock_set_variable, mock_find_layer):
|
||||
mock_layer = object()
|
||||
mock_find_layer.return_value = (mock_layer, "layer_99")
|
||||
|
||||
result = verfahrensgebiet_manager._update_verfahrensgebiet_from_project()
|
||||
|
||||
self.assertTrue(result)
|
||||
mock_set_variable.assert_called_once_with("verfahrensgebiet_layer", "layer_99", scope="project")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user