From f0b5317fc53035e2ce796a3c5f3ec7313171003f Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 21 May 2025 14:08:56 +0200 Subject: [PATCH 01/70] moved processing to initProcessing (for qgis_process) --- ORStools/ORStoolsPlugin.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/ORStools/ORStoolsPlugin.py b/ORStools/ORStoolsPlugin.py index 2156bf8a..c1fab7f0 100644 --- a/ORStools/ORStoolsPlugin.py +++ b/ORStools/ORStoolsPlugin.py @@ -50,7 +50,8 @@ def __init__(self, iface: QgisInterface) -> None: :type iface: QgsInterface """ self.dialog = ORStoolsDialog.ORStoolsDialogMain(iface) - self.provider = provider.ORStoolsProvider() + # should be done in initProcessing, so that qgis_process can skip GUI. + # self.provider = provider.ORStoolsProvider() # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) @@ -75,10 +76,16 @@ def __init__(self, iface: QgisInterface) -> None: self.add_default_provider_to_settings() + def initProcessing(self): + self.provider = provider.ORStoolsProvider() + QgsApplication.processingRegistry().addProvider(self.provider) + def initGui(self) -> None: """Create the menu entries and toolbar icons inside the QGIS GUI.""" - QgsApplication.processingRegistry().addProvider(self.provider) + #QgsApplication.processingRegistry().addProvider(self.provider) + self.initProcessing() + self.dialog.initGui() def unload(self) -> None: From b1d0ae855dc39faf7b9f0a3bf8a48978d66b503f Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Thu, 22 May 2025 11:55:19 +0200 Subject: [PATCH 02/70] force-use int as an index to parameters (since qgis_process interprets a integer parameter as string) --- ORStools/proc/base_processing_algorithm.py | 4 ++-- ORStools/proc/directions_lines_proc.py | 2 +- ORStools/proc/directions_points_layer_proc.py | 2 +- ORStools/proc/directions_points_layers_proc.py | 2 +- ORStools/proc/export_proc.py | 2 +- ORStools/proc/isochrones_layer_proc.py | 8 ++++---- ORStools/proc/isochrones_point_proc.py | 7 +++---- ORStools/proc/matrix_proc.py | 2 +- ORStools/proc/snap_layer_proc.py | 2 +- ORStools/proc/snap_point_proc.py | 2 +- 10 files changed, 16 insertions(+), 17 deletions(-) diff --git a/ORStools/proc/base_processing_algorithm.py b/ORStools/proc/base_processing_algorithm.py index 05092610..88c57b08 100644 --- a/ORStools/proc/base_processing_algorithm.py +++ b/ORStools/proc/base_processing_algorithm.py @@ -186,7 +186,7 @@ def get_endpoint_names_from_provider(self, provider: str) -> dict: @classmethod def _get_ors_client_from_provider( - cls, provider: str, feedback: QgsProcessingFeedback + cls, provider: str | int, feedback: QgsProcessingFeedback ) -> client.Client: """ Connects client to provider and returns a client instance for requests to the ors API @@ -196,7 +196,7 @@ def _get_ors_client_from_provider( agent = f"QGIS_{name}" providers = configmanager.read_config()["providers"] - ors_provider = providers[provider] + ors_provider = providers[int(provider)] ors_client = client.Client(ors_provider, agent) ors_client.overQueryLimit.connect( lambda: feedback.reportError("OverQueryLimit: Retrying...") diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index 4d30c8a4..d2b8a6bb 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -129,7 +129,7 @@ def processAlgorithm( ) -> Dict[str, str]: ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] preference = dict(enumerate(PREFERENCES))[parameters[self.IN_PREFERENCE]] diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index 88a92f86..92dcb096 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -137,7 +137,7 @@ def processAlgorithm( ) -> Dict[str, str]: ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] preference = dict(enumerate(PREFERENCES))[parameters[self.IN_PREFERENCE]] diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index 36263cdf..a6ce5349 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -148,7 +148,7 @@ def processAlgorithm( ) -> Dict[str, str]: ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] preference = dict(enumerate(PREFERENCES))[parameters[self.IN_PREFERENCE]] diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 8b2df52c..fec51908 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -76,7 +76,7 @@ def processAlgorithm( ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) # Get profile value - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] target_crs = QgsCoordinateReferenceSystem("EPSG:4326") rect = self.parameterAsExtent(parameters, self.IN_EXPORT, context, crs=target_crs) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 6db28764..ba8abf0d 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -121,10 +121,10 @@ def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) - - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] - dimension = dict(enumerate(DIMENSIONS))[parameters[self.IN_METRIC]] - location_type = dict(enumerate(LOCATION_TYPES))[parameters[self.LOCATION_TYPE]] + + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] + dimension = dict(enumerate(DIMENSIONS))[int(parameters[self.IN_METRIC])] + location_type = dict(enumerate(LOCATION_TYPES))[int(parameters[self.LOCATION_TYPE])] factor = 60 if dimension == "time" else 1 ranges_raw = parameters[self.IN_RANGES] diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index 331f00b1..e458c978 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -107,10 +107,9 @@ def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) - - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] - dimension = dict(enumerate(DIMENSIONS))[parameters[self.IN_METRIC]] - location_type = dict(enumerate(LOCATION_TYPES))[parameters[self.LOCATION_TYPE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] + dimension = dict(enumerate(DIMENSIONS))[int(parameters[self.IN_METRIC])] + location_type = dict(enumerate(LOCATION_TYPES))[int(parameters[self.LOCATION_TYPE])] factor = 60 if dimension == "time" else 1 ranges_raw = parameters[self.IN_RANGES] diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 94002cd8..6f645afe 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -93,7 +93,7 @@ def processAlgorithm( ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) # Get profile value - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] # TODO: enable once core matrix is available # options = self.parseOptions(parameters, context) diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index e0d53936..88d1497f 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -76,7 +76,7 @@ def processAlgorithm( ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) # Get profile value - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] # Get parameter values source = self.parameterAsSource(parameters, self.IN_POINTS, context) diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index 110e844e..212ddd0e 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -79,7 +79,7 @@ def processAlgorithm( ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) # Get profile value - profile = dict(enumerate(PROFILES))[parameters[self.IN_PROFILE]] + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] # Get parameter values point = self.parameterAsPoint(parameters, self.IN_POINT, context, self.crs_out) From 49837bfd7aa51c003a0a7ca1bc94e3308d2f8fa5 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Thu, 22 May 2025 12:09:42 +0200 Subject: [PATCH 03/70] forcing int-index for qgis_process --- ORStools/proc/base_processing_algorithm.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ORStools/proc/base_processing_algorithm.py b/ORStools/proc/base_processing_algorithm.py index 88c57b08..0a58eb1c 100644 --- a/ORStools/proc/base_processing_algorithm.py +++ b/ORStools/proc/base_processing_algorithm.py @@ -179,9 +179,9 @@ def option_parameters(self) -> [QgsProcessingParameterDefinition]: ), ] - def get_endpoint_names_from_provider(self, provider: str) -> dict: + def get_endpoint_names_from_provider(self, provider: str | int ) -> dict: providers = configmanager.read_config()["providers"] - ors_provider = providers[provider] + ors_provider = providers[int(provider)] return ors_provider["endpoints"] @classmethod From 84d15759d00c234608b92f89bdf8e78ce8d549f4 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Thu, 22 May 2025 14:18:00 +0200 Subject: [PATCH 04/70] Added an processing toolbox algorithm that sets a new configure for use with qgis_process in an headless environment. --- ORStools/proc/add_provider_conf.py | 184 +++++++++++++++++++++++++++++ ORStools/proc/provider.py | 2 + tests/test_proc.py | 31 +++++ 3 files changed, 217 insertions(+) create mode 100644 ORStools/proc/add_provider_conf.py diff --git a/ORStools/proc/add_provider_conf.py b/ORStools/proc/add_provider_conf.py new file mode 100644 index 00000000..f2956027 --- /dev/null +++ b/ORStools/proc/add_provider_conf.py @@ -0,0 +1,184 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + ORStools + A QGIS plugin + QGIS client to query openrouteservice + ------------------- + begin : 2017-02-01 + git sha : $Format:%H$ + copyright : (C) 2021 by HeiGIT gGmbH + email : support@openrouteservice.heigit.org + ***************************************************************************/ + + This plugin provides access to openrouteservice API functionalities + (https://openrouteservice.org), developed and + maintained by the openrouteservice team of HeiGIT gGmbH, Germany. By using + this plugin you agree to the ORS terms of service + (https://openrouteservice.org/terms-of-service/). + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" + +from typing import Dict + +from qgis.PyQt.QtCore import QCoreApplication + +from qgis.core import ( + QgsSettings, + QgsProcessingAlgorithm, + QgsProcessingParameterString, + QgsProcessingParameterNumber, + QgsProcessingParameterBoolean, + QgsProcessingContext, + QgsProcessingFeedback, +) + +from ORStools.utils import logger +from ..proc import ENDPOINTS + +class ORSProviderAddAlgo(QgsProcessingAlgorithm): + def __init__(self): + super().__init__() + self.PARAMETERS: list = [ + QgsProcessingParameterString( + name="ors_provider_name", + description=self.tr( + "Set unique name for your ors provider" + ), + ), + QgsProcessingParameterString( + name="ors_provider_api_key", + description=self.tr( + "Set api key for your ors provider" + ), + optional=True + ), + QgsProcessingParameterString( + name="ors_provider_url", + description=self.tr( + "Set url to ors api" + ), + ), + QgsProcessingParameterNumber( + name="ors_provider_timeout", + description=self.tr( + "Set custom timeout (in seconds)" + ), + defaultValue=60 + ), + QgsProcessingParameterBoolean( + name="ors_provider_overwrite", + description=self.tr( + "If True, existing provider is overwritten" + ), + defaultValue=False + ), + #TODO: Service Endpoints + # QgsProcessingParameterString( + # name="otp_endpoint_directions", + # description=self.tr("Endpoint for directions on your provider"), + # defaultValue="directions", + # optional=True + # ), + ] + + def group(self): + return "Configuration" + + def groupId(self): + return "configuration" + + def initAlgorithm(self, config={}): + for parameter in self.PARAMETERS: + self.addParameter(parameter) + + def processAlgorithm( + self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback + ) -> Dict[str, str]: + s = QgsSettings() + provider_name = self.parameterAsString( + parameters, + "ors_provider_name", + context + ) + provider_url = self.parameterAsString( + parameters, + "ors_provider_url", + context + ) + provider_api_key = self.parameterAsString( + parameters, + "ors_provider_api_key", + context + ) + provider_timeout = self.parameterAsInt( + parameters, + "ors_provider_timeout", + context + ) + provider_overwrite = self.parameterAsBoolean( + parameters, + "ors_provider_timeout", + context + ) + + current_config = s.value("ORStools/config") + feedback.pushInfo(str(ENDPOINTS)) + logger.log(str(ENDPOINTS), 2) + if (provider_name in [x['name'] for x in current_config['providers']]): + if (provider_overwrite): + msg = f"A provider with the name '{provider_name}' already exists. Replacement not yet implemented." + else: + #ignoring reset of settings for now. + msg = f"A provider with the name '{provider_name}' already exists. Please mark overwrite checkbox." + feedback.pushInfo(msg) + logger.log(msg, 2) + return { + "OUTPUT": msg + } + else: + existing_config = s.value("ORStools/config") + s.setValue( + "ORStools/config", + { + 'providers': existing_config['providers'] + [ + { + 'base_url': provider_url, + 'key': provider_api_key, + 'name': provider_name, + 'timeout': provider_timeout, + 'endpoints': ENDPOINTS #TODO: customize"new config added: " + } + ] + } + ) + + return { + "OUTPUT": f"new config added: {provider_name}" + } + + def createInstance(self): + return self.__class__() + + def name(self): + return "set_provider_config_to_ors_via_algorithm" + + def displayName(self) -> str: + """ + Algorithm name shown in QGIS toolbox + :return: + """ + return self.tr("Set Provider Config via Algorithm (e.g. headless)") + + def tr(self, string: str, context=None) -> str: + context = context or self.__class__.__name__ + return QCoreApplication.translate(context, string) + #return string #disabling QCoreApplication.translate due to Qt \ No newline at end of file diff --git a/ORStools/proc/provider.py b/ORStools/proc/provider.py index 2307e22a..1b9c31f9 100644 --- a/ORStools/proc/provider.py +++ b/ORStools/proc/provider.py @@ -38,6 +38,7 @@ from .isochrones_layer_proc import ORSIsochronesLayerAlgo from .isochrones_point_proc import ORSIsochronesPointAlgo from .matrix_proc import ORSMatrixAlgo +from .add_provider_conf import ORSProviderAddAlgo from ORStools.utils.gui import GuiUtils from .snap_layer_proc import ORSSnapLayerAlgo @@ -70,6 +71,7 @@ def loadAlgorithms(self) -> None: self.addAlgorithm(ORSExportAlgo()) self.addAlgorithm(ORSSnapLayerAlgo()) self.addAlgorithm(ORSSnapPointAlgo()) + self.addAlgorithm(ORSProviderAddAlgo()) @staticmethod def icon(): diff --git a/tests/test_proc.py b/tests/test_proc.py index c13fc807..0fa6eb84 100644 --- a/tests/test_proc.py +++ b/tests/test_proc.py @@ -7,6 +7,7 @@ QgsFeature, QgsGeometry, QgsRectangle, + QgsSettings, ) from qgis.testing import unittest from qgis.PyQt.QtCore import QMetaType @@ -20,6 +21,7 @@ from ORStools.proc.matrix_proc import ORSMatrixAlgo from ORStools.proc.snap_layer_proc import ORSSnapLayerAlgo from ORStools.proc.snap_point_proc import ORSSnapPointAlgo +from ORStools.proc.add_provider_conf import ORSProviderAddAlgo class TestProc(unittest.TestCase): @@ -277,3 +279,32 @@ def test_snapping(self): self.assertRaises( Exception, lambda: snap_points.processAlgorithm(parameters, self.context, self.feedback) ) + + def test_add_provider(self): + parameters = { + "ors_provider_name": "TestProvider", + "ors_provider_api_key": "test_api_key", + "ors_provider_url": "https://test.example.org", + "ors_provider_timeout": 120, + "ors_provider_overwrite": False, + } + + # Create an instance of the algorithm + add_provider_algo = ORSProviderAddAlgo().create() + + # Run the algorithm + result = add_provider_algo.processAlgorithm(parameters, self.context, self.feedback) + + # Validate the result + self.assertIn("OUTPUT", result) + self.assertEqual(result["OUTPUT"], "new config added: TestProvider") + + # Verify the provider was added to the settings + settings = QgsSettings() + config = settings.value("ORStools/config") + providers = config["providers"] + self.assertTrue(any(provider["name"] == "TestProvider" for provider in providers)) + + # Clean up by removing the test provider + config["providers"] = [provider for provider in providers if provider["name"] != "TestProvider"] + settings.setValue("ORStools/config", config) \ No newline at end of file From 022df4d584087b22b2a6fb7e038b66bd4eea996c Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 26 May 2025 10:52:24 +0200 Subject: [PATCH 05/70] cleanup:removing old, commented out code. --- ORStools/ORStoolsPlugin.py | 3 --- ORStools/proc/isochrones_layer_proc.py | 1 - 2 files changed, 4 deletions(-) diff --git a/ORStools/ORStoolsPlugin.py b/ORStools/ORStoolsPlugin.py index c1fab7f0..b1f62ff1 100644 --- a/ORStools/ORStoolsPlugin.py +++ b/ORStools/ORStoolsPlugin.py @@ -50,8 +50,6 @@ def __init__(self, iface: QgisInterface) -> None: :type iface: QgsInterface """ self.dialog = ORStoolsDialog.ORStoolsDialogMain(iface) - # should be done in initProcessing, so that qgis_process can skip GUI. - # self.provider = provider.ORStoolsProvider() # initialize plugin directory self.plugin_dir = os.path.dirname(__file__) @@ -83,7 +81,6 @@ def initProcessing(self): def initGui(self) -> None: """Create the menu entries and toolbar icons inside the QGIS GUI.""" - #QgsApplication.processingRegistry().addProvider(self.provider) self.initProcessing() self.dialog.initGui() diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index ba8abf0d..675e2364 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -125,7 +125,6 @@ def processAlgorithm( profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] dimension = dict(enumerate(DIMENSIONS))[int(parameters[self.IN_METRIC])] location_type = dict(enumerate(LOCATION_TYPES))[int(parameters[self.LOCATION_TYPE])] - factor = 60 if dimension == "time" else 1 ranges_raw = parameters[self.IN_RANGES] ranges_proc = [x * factor for x in map(float, ranges_raw.split(","))] From 933b1caba6b5f74b41f8a55d0d9dd56ac7038663 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 26 May 2025 11:09:40 +0200 Subject: [PATCH 06/70] modified typing, so it is more compatible with oler python versions (and hopefully test for 3.16 runs...). --- ORStools/proc/base_processing_algorithm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ORStools/proc/base_processing_algorithm.py b/ORStools/proc/base_processing_algorithm.py index 0a58eb1c..247dec1d 100644 --- a/ORStools/proc/base_processing_algorithm.py +++ b/ORStools/proc/base_processing_algorithm.py @@ -40,7 +40,7 @@ QgsProcessingFeedback, QgsSettings, ) -from typing import Any, Dict +from typing import Any, Dict, Union from qgis.PyQt.QtGui import QIcon @@ -179,14 +179,14 @@ def option_parameters(self) -> [QgsProcessingParameterDefinition]: ), ] - def get_endpoint_names_from_provider(self, provider: str | int ) -> dict: + def get_endpoint_names_from_provider(self, provider: Union[str,int] ) -> dict: providers = configmanager.read_config()["providers"] ors_provider = providers[int(provider)] return ors_provider["endpoints"] @classmethod def _get_ors_client_from_provider( - cls, provider: str | int, feedback: QgsProcessingFeedback + cls, provider: Union[str, int], feedback: QgsProcessingFeedback ) -> client.Client: """ Connects client to provider and returns a client instance for requests to the ors API From 11b26cb0eb9d68beee3b10733c124c813de3037a Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 26 May 2025 11:40:42 +0200 Subject: [PATCH 07/70] renamed file for better conformity with convention and add a conf removal algorithm --- ORStools/proc/provider.py | 4 +- ..._provider_conf.py => provider_add_conf.py} | 0 ORStools/proc/provider_rm_conf.py | 112 ++++++++++++++++++ 3 files changed, 115 insertions(+), 1 deletion(-) rename ORStools/proc/{add_provider_conf.py => provider_add_conf.py} (100%) create mode 100644 ORStools/proc/provider_rm_conf.py diff --git a/ORStools/proc/provider.py b/ORStools/proc/provider.py index 1b9c31f9..8770946f 100644 --- a/ORStools/proc/provider.py +++ b/ORStools/proc/provider.py @@ -38,7 +38,8 @@ from .isochrones_layer_proc import ORSIsochronesLayerAlgo from .isochrones_point_proc import ORSIsochronesPointAlgo from .matrix_proc import ORSMatrixAlgo -from .add_provider_conf import ORSProviderAddAlgo +from .provider_add_conf import ORSProviderAddAlgo +from .provider_rm_conf import ORSProviderRmAlgo from ORStools.utils.gui import GuiUtils from .snap_layer_proc import ORSSnapLayerAlgo @@ -72,6 +73,7 @@ def loadAlgorithms(self) -> None: self.addAlgorithm(ORSSnapLayerAlgo()) self.addAlgorithm(ORSSnapPointAlgo()) self.addAlgorithm(ORSProviderAddAlgo()) + self.addAlgorithm(ORSProviderRmAlgo()) @staticmethod def icon(): diff --git a/ORStools/proc/add_provider_conf.py b/ORStools/proc/provider_add_conf.py similarity index 100% rename from ORStools/proc/add_provider_conf.py rename to ORStools/proc/provider_add_conf.py diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py new file mode 100644 index 00000000..3e1cd246 --- /dev/null +++ b/ORStools/proc/provider_rm_conf.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + ORStools + A QGIS plugin + QGIS client to query openrouteservice + ------------------- + begin : 2017-02-01 + git sha : $Format:%H$ + copyright : (C) 2021 by HeiGIT gGmbH + email : support@openrouteservice.heigit.org + ***************************************************************************/ + + This plugin provides access to openrouteservice API functionalities + (https://openrouteservice.org), developed and + maintained by the openrouteservice team of HeiGIT gGmbH, Germany. By using + this plugin you agree to the ORS terms of service + (https://openrouteservice.org/terms-of-service/). + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" + +from typing import Dict + +from qgis.PyQt.QtCore import QCoreApplication + +from qgis.core import ( + QgsSettings, + QgsProcessingAlgorithm, + QgsProcessingParameterString, + QgsProcessingContext, + QgsProcessingFeedback, +) + +from ORStools.utils import logger + +class ORSProviderRmAlgo(QgsProcessingAlgorithm): + def __init__(self): + super().__init__() + self.PARAMETERS: list = [ + QgsProcessingParameterString( + name="ors_provider_name", + description=self.tr( + "Set unique name for your ors provider" + ), + ), + ] + + def group(self): + return "Configuration" + + def groupId(self): + return "configuration" + + def initAlgorithm(self, config={}): + for parameter in self.PARAMETERS: + self.addParameter(parameter) + + def processAlgorithm( + self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback + ) -> Dict[str, str]: + s = QgsSettings() + provider_name = self.parameterAsString( + parameters, + "ors_provider_name", + context + ) + current_config = s.value("ORStools/config") + if (provider_name in [x['name'] for x in current_config['providers']]): + found = [int(j) for j, y in {str(i): x for i, x in enumerate(current_config['providers'])}.items() if y['name']==provider_name] + if len(found)>0: + del current_config['providers'][found[0]] + s.setValue( + "ORStools/config", + { + 'providers': current_config['providers'] + } + ) + msg = self.tr(f"Old config deleted: {provider_name}") + else: + msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") + + # + feedback.pushInfo(msg) + logger.log(msg, 2) + return { + "OUTPUT": msg + } + + def createInstance(self): + return self.__class__() + + def name(self): + return "remove_provider_config_via_algorithm" + + def displayName(self) -> str: + """ + Algorithm name shown in QGIS toolbox + :return: + """ + return self.tr("Remove Provider Config via Algorithm (e.g. headless)") + + def tr(self, string: str, context=None) -> str: + context = context or self.__class__.__name__ + return QCoreApplication.translate(context, string) \ No newline at end of file From abf0c3e8dc8b812a5e6861e326d83f948698a3aa Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 26 May 2025 11:44:45 +0200 Subject: [PATCH 08/70] ran ruff, so formatting os ok. --- ORStools/ORStoolsPlugin.py | 2 +- ORStools/proc/base_processing_algorithm.py | 2 +- ORStools/proc/isochrones_layer_proc.py | 2 +- ORStools/proc/provider_add_conf.py | 98 ++++++++-------------- ORStools/proc/provider_rm_conf.py | 46 +++++----- tests/test_proc.py | 6 +- 6 files changed, 60 insertions(+), 96 deletions(-) diff --git a/ORStools/ORStoolsPlugin.py b/ORStools/ORStoolsPlugin.py index b1f62ff1..7913a0e4 100644 --- a/ORStools/ORStoolsPlugin.py +++ b/ORStools/ORStoolsPlugin.py @@ -82,7 +82,7 @@ def initGui(self) -> None: """Create the menu entries and toolbar icons inside the QGIS GUI.""" self.initProcessing() - + self.dialog.initGui() def unload(self) -> None: diff --git a/ORStools/proc/base_processing_algorithm.py b/ORStools/proc/base_processing_algorithm.py index 247dec1d..ca7eebb1 100644 --- a/ORStools/proc/base_processing_algorithm.py +++ b/ORStools/proc/base_processing_algorithm.py @@ -179,7 +179,7 @@ def option_parameters(self) -> [QgsProcessingParameterDefinition]: ), ] - def get_endpoint_names_from_provider(self, provider: Union[str,int] ) -> dict: + def get_endpoint_names_from_provider(self, provider: Union[str, int]) -> dict: providers = configmanager.read_config()["providers"] ors_provider = providers[int(provider)] return ors_provider["endpoints"] diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 675e2364..6d352438 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -121,7 +121,7 @@ def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: ors_client = self._get_ors_client_from_provider(parameters[self.IN_PROVIDER], feedback) - + profile = dict(enumerate(PROFILES))[int(parameters[self.IN_PROFILE])] dimension = dict(enumerate(DIMENSIONS))[int(parameters[self.IN_METRIC])] location_type = dict(enumerate(LOCATION_TYPES))[int(parameters[self.LOCATION_TYPE])] diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index f2956027..5cfdb5f8 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -44,44 +44,35 @@ from ORStools.utils import logger from ..proc import ENDPOINTS + class ORSProviderAddAlgo(QgsProcessingAlgorithm): def __init__(self): super().__init__() self.PARAMETERS: list = [ QgsProcessingParameterString( name="ors_provider_name", - description=self.tr( - "Set unique name for your ors provider" - ), + description=self.tr("Set unique name for your ors provider"), ), QgsProcessingParameterString( name="ors_provider_api_key", - description=self.tr( - "Set api key for your ors provider" - ), - optional=True + description=self.tr("Set api key for your ors provider"), + optional=True, ), QgsProcessingParameterString( name="ors_provider_url", - description=self.tr( - "Set url to ors api" - ), + description=self.tr("Set url to ors api"), ), QgsProcessingParameterNumber( name="ors_provider_timeout", - description=self.tr( - "Set custom timeout (in seconds)" - ), - defaultValue=60 + description=self.tr("Set custom timeout (in seconds)"), + defaultValue=60, ), QgsProcessingParameterBoolean( name="ors_provider_overwrite", - description=self.tr( - "If True, existing provider is overwritten" - ), - defaultValue=False + description=self.tr("If True, existing provider is overwritten"), + defaultValue=False, ), - #TODO: Service Endpoints + # TODO: Service Endpoints # QgsProcessingParameterString( # name="otp_endpoint_directions", # description=self.tr("Endpoint for directions on your provider"), @@ -99,71 +90,48 @@ def groupId(self): def initAlgorithm(self, config={}): for parameter in self.PARAMETERS: self.addParameter(parameter) - + def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: s = QgsSettings() - provider_name = self.parameterAsString( - parameters, - "ors_provider_name", - context - ) - provider_url = self.parameterAsString( - parameters, - "ors_provider_url", - context - ) - provider_api_key = self.parameterAsString( - parameters, - "ors_provider_api_key", - context - ) - provider_timeout = self.parameterAsInt( - parameters, - "ors_provider_timeout", - context - ) - provider_overwrite = self.parameterAsBoolean( - parameters, - "ors_provider_timeout", - context - ) + provider_name = self.parameterAsString(parameters, "ors_provider_name", context) + provider_url = self.parameterAsString(parameters, "ors_provider_url", context) + provider_api_key = self.parameterAsString(parameters, "ors_provider_api_key", context) + provider_timeout = self.parameterAsInt(parameters, "ors_provider_timeout", context) + provider_overwrite = self.parameterAsBoolean(parameters, "ors_provider_timeout", context) current_config = s.value("ORStools/config") feedback.pushInfo(str(ENDPOINTS)) logger.log(str(ENDPOINTS), 2) - if (provider_name in [x['name'] for x in current_config['providers']]): - if (provider_overwrite): + if provider_name in [x["name"] for x in current_config["providers"]]: + if provider_overwrite: msg = f"A provider with the name '{provider_name}' already exists. Replacement not yet implemented." else: - #ignoring reset of settings for now. + # ignoring reset of settings for now. msg = f"A provider with the name '{provider_name}' already exists. Please mark overwrite checkbox." feedback.pushInfo(msg) logger.log(msg, 2) - return { - "OUTPUT": msg - } + return {"OUTPUT": msg} else: existing_config = s.value("ORStools/config") s.setValue( - "ORStools/config", + "ORStools/config", { - 'providers': existing_config['providers'] + [ - { - 'base_url': provider_url, - 'key': provider_api_key, - 'name': provider_name, - 'timeout': provider_timeout, - 'endpoints': ENDPOINTS #TODO: customize"new config added: " + "providers": existing_config["providers"] + + [ + { + "base_url": provider_url, + "key": provider_api_key, + "name": provider_name, + "timeout": provider_timeout, + "endpoints": ENDPOINTS, # TODO: customize"new config added: " } ] - } + }, ) - return { - "OUTPUT": f"new config added: {provider_name}" - } + return {"OUTPUT": f"new config added: {provider_name}"} def createInstance(self): return self.__class__() @@ -177,8 +145,8 @@ def displayName(self) -> str: :return: """ return self.tr("Set Provider Config via Algorithm (e.g. headless)") - + def tr(self, string: str, context=None) -> str: context = context or self.__class__.__name__ return QCoreApplication.translate(context, string) - #return string #disabling QCoreApplication.translate due to Qt \ No newline at end of file + # return string #disabling QCoreApplication.translate due to Qt diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 3e1cd246..34d07f01 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -41,15 +41,14 @@ from ORStools.utils import logger + class ORSProviderRmAlgo(QgsProcessingAlgorithm): def __init__(self): super().__init__() self.PARAMETERS: list = [ QgsProcessingParameterString( name="ors_provider_name", - description=self.tr( - "Set unique name for your ors provider" - ), + description=self.tr("Set unique name for your ors provider"), ), ] @@ -62,37 +61,32 @@ def groupId(self): def initAlgorithm(self, config={}): for parameter in self.PARAMETERS: self.addParameter(parameter) - + def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: s = QgsSettings() - provider_name = self.parameterAsString( - parameters, - "ors_provider_name", - context - ) + provider_name = self.parameterAsString(parameters, "ors_provider_name", context) current_config = s.value("ORStools/config") - if (provider_name in [x['name'] for x in current_config['providers']]): - found = [int(j) for j, y in {str(i): x for i, x in enumerate(current_config['providers'])}.items() if y['name']==provider_name] - if len(found)>0: - del current_config['providers'][found[0]] - s.setValue( - "ORStools/config", - { - 'providers': current_config['providers'] - } - ) + if provider_name in [x["name"] for x in current_config["providers"]]: + found = [ + int(j) + for j, y in {str(i): x for i, x in enumerate(current_config["providers"])}.items() + if y["name"] == provider_name + ] + if len(found) > 0: + del current_config["providers"][found[0]] + s.setValue("ORStools/config", {"providers": current_config["providers"]}) msg = self.tr(f"Old config deleted: {provider_name}") else: - msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") - + msg = self.tr( + f"Old config not found! - {provider_name} - and is therfore not deleted." + ) + # feedback.pushInfo(msg) logger.log(msg, 2) - return { - "OUTPUT": msg - } + return {"OUTPUT": msg} def createInstance(self): return self.__class__() @@ -106,7 +100,7 @@ def displayName(self) -> str: :return: """ return self.tr("Remove Provider Config via Algorithm (e.g. headless)") - + def tr(self, string: str, context=None) -> str: context = context or self.__class__.__name__ - return QCoreApplication.translate(context, string) \ No newline at end of file + return QCoreApplication.translate(context, string) diff --git a/tests/test_proc.py b/tests/test_proc.py index 0fa6eb84..b82b71e8 100644 --- a/tests/test_proc.py +++ b/tests/test_proc.py @@ -306,5 +306,7 @@ def test_add_provider(self): self.assertTrue(any(provider["name"] == "TestProvider" for provider in providers)) # Clean up by removing the test provider - config["providers"] = [provider for provider in providers if provider["name"] != "TestProvider"] - settings.setValue("ORStools/config", config) \ No newline at end of file + config["providers"] = [ + provider for provider in providers if provider["name"] != "TestProvider" + ] + settings.setValue("ORStools/config", config) From ae050df480e86b7db79d15c7a8d73b654ebffe44 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 26 May 2025 11:50:38 +0200 Subject: [PATCH 09/70] fixed test for creation of algorithm --- tests/test_proc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_proc.py b/tests/test_proc.py index b82b71e8..be0fd447 100644 --- a/tests/test_proc.py +++ b/tests/test_proc.py @@ -21,7 +21,7 @@ from ORStools.proc.matrix_proc import ORSMatrixAlgo from ORStools.proc.snap_layer_proc import ORSSnapLayerAlgo from ORStools.proc.snap_point_proc import ORSSnapPointAlgo -from ORStools.proc.add_provider_conf import ORSProviderAddAlgo +from ORStools.proc.provider_add_conf import ORSProviderAddAlgo class TestProc(unittest.TestCase): From f37e5d51a7b1f1738bc998e417b606f00b24b3a9 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 26 May 2025 11:50:38 +0200 Subject: [PATCH 10/70] fixed test for conf-creation --- tests/test_proc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_proc.py b/tests/test_proc.py index b82b71e8..be0fd447 100644 --- a/tests/test_proc.py +++ b/tests/test_proc.py @@ -21,7 +21,7 @@ from ORStools.proc.matrix_proc import ORSMatrixAlgo from ORStools.proc.snap_layer_proc import ORSSnapLayerAlgo from ORStools.proc.snap_point_proc import ORSSnapPointAlgo -from ORStools.proc.add_provider_conf import ORSProviderAddAlgo +from ORStools.proc.provider_add_conf import ORSProviderAddAlgo class TestProc(unittest.TestCase): From 8a2ba73eb3dbf8b9499e171b4c9ea5ea9c307ae7 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:01:48 +0200 Subject: [PATCH 11/70] disable feedback, again. dull. --- ORStools/proc/isochrones_layer_proc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 6d352438..09bfbd91 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -197,6 +197,7 @@ def processAlgorithm( "isochrones" ] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) + #feedback.pushInfo(f"{str(response.json())}") for isochrone in self.isochrones.get_features(response, params["id"]): sink.addFeature(isochrone) From d7d6ccb6f7cb46f78543455feadac7f4c1845c2f Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:02:53 +0200 Subject: [PATCH 12/70] delete comment. gnah. --- ORStools/proc/isochrones_layer_proc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 56476b86..ac05e939 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -198,7 +198,6 @@ def processAlgorithm( "isochrones" ] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - #feedback.pushInfo(f"{str(response.json())}") for isochrone in self.isochrones.get_features(response, params["id"]): sink.addFeature(isochrone) From 50bd819d5cddbcfbf6d802260426d2d47c7a78dd Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:07:10 +0200 Subject: [PATCH 13/70] added feedback on right branch --- ORStools/proc/isochrones_layer_proc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index ac05e939..40a222aa 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -198,6 +198,7 @@ def processAlgorithm( "isochrones" ] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) + feedback.pushInfo(f"{str(response)}") for isochrone in self.isochrones.get_features(response, params["id"]): sink.addFeature(isochrone) From 6e40a13da5c5c6b3a5b258b18a811d6e5fdca33d Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:17:51 +0200 Subject: [PATCH 14/70] added algorithm that return the number of provider (for use from external plugins (especially headless)) --- ORStools/proc/provider.py | 2 + ORStools/proc/provider_get_confid_by_name.py | 106 +++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 ORStools/proc/provider_get_confid_by_name.py diff --git a/ORStools/proc/provider.py b/ORStools/proc/provider.py index 8770946f..c08279c3 100644 --- a/ORStools/proc/provider.py +++ b/ORStools/proc/provider.py @@ -40,6 +40,7 @@ from .matrix_proc import ORSMatrixAlgo from .provider_add_conf import ORSProviderAddAlgo from .provider_rm_conf import ORSProviderRmAlgo +from .provider_get_confid_by_name import ORSProviderGetConfIdAlgo from ORStools.utils.gui import GuiUtils from .snap_layer_proc import ORSSnapLayerAlgo @@ -74,6 +75,7 @@ def loadAlgorithms(self) -> None: self.addAlgorithm(ORSSnapPointAlgo()) self.addAlgorithm(ORSProviderAddAlgo()) self.addAlgorithm(ORSProviderRmAlgo()) + self.addAlgorithm(ORSProviderGetConfIdAlgo()) @staticmethod def icon(): diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py new file mode 100644 index 00000000..f251ac57 --- /dev/null +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + ORStools + A QGIS plugin + QGIS client to query openrouteservice + ------------------- + begin : 2017-02-01 + git sha : $Format:%H$ + copyright : (C) 2021 by HeiGIT gGmbH + email : support@openrouteservice.heigit.org + ***************************************************************************/ + + This plugin provides access to openrouteservice API functionalities + (https://openrouteservice.org), developed and + maintained by the openrouteservice team of HeiGIT gGmbH, Germany. By using + this plugin you agree to the ORS terms of service + (https://openrouteservice.org/terms-of-service/). + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" + +from typing import Dict + +from qgis.PyQt.QtCore import QCoreApplication + +from qgis.core import ( + QgsSettings, + QgsProcessingAlgorithm, + QgsProcessingParameterString, + QgsProcessingContext, + QgsProcessingFeedback, +) + +from ORStools.utils import logger + + +class ORSProviderGetConfIdAlgo(QgsProcessingAlgorithm): + def __init__(self): + super().__init__() + self.PARAMETERS: list = [ + QgsProcessingParameterString( + name="ors_provider_name", + description=self.tr("Specify unique name for your ors provider"), + ), + ] + + def group(self): + return "Configuration" + + def groupId(self): + return "configuration" + + def initAlgorithm(self, config={}): + for parameter in self.PARAMETERS: + self.addParameter(parameter) + + def processAlgorithm( + self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback + ) -> Dict[str, str]: + s = QgsSettings() + provider_name = self.parameterAsString(parameters, "ors_provider_name", context) + current_config = s.value("ORStools/config") + if provider_name in [x["name"] for x in current_config["providers"]]: + found = [ + int(j) + for j, y in {str(i): x for i, x in enumerate(current_config["providers"])}.items() + if y["name"] == provider_name + ] + if len(found) > 0: + result = found[0] + msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") + else: + msg = self.tr( + f"Config with specified name not found! - {provider_name}" + ) + result = -1 + + # + feedback.pushInfo(msg) + logger.log(msg, 2) + return {"OUTPUT": result} + + def createInstance(self): + return self.__class__() + + def name(self): + return "get_provider_confid_by_name_algorithm" + + def displayName(self) -> str: + """ + Algorithm name shown in QGIS toolbox + :return: + """ + return self.tr("Get Provider Config ID via Algorithm (e.g. headless)") + + def tr(self, string: str, context=None) -> str: + context = context or self.__class__.__name__ + return QCoreApplication.translate(context, string) From b79286a8e8938dc4abe991a1ff4025d7512b52c7 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:23:28 +0200 Subject: [PATCH 15/70] added feedback on different location --- ORStools/proc/isochrones_layer_proc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 40a222aa..dc644ef7 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -198,7 +198,6 @@ def processAlgorithm( "isochrones" ] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - feedback.pushInfo(f"{str(response)}") for isochrone in self.isochrones.get_features(response, params["id"]): sink.addFeature(isochrone) @@ -208,6 +207,7 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) continue + feedback.pushDebug(f"{str(isochrone)}") feedback.setProgress(int(100.0 / source.featureCount() * num)) return {self.OUT: self.dest_id} From dfd01df1a6328869737c8bc04f65c159ac45e686 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:24:42 +0200 Subject: [PATCH 16/70] pushdebuginfo not pushdebug... --- ORStools/proc/isochrones_layer_proc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index dc644ef7..233ceb96 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -207,7 +207,7 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) continue - feedback.pushDebug(f"{str(isochrone)}") + feedback.pushDebugInfo(f"{str(isochrone)}") feedback.setProgress(int(100.0 / source.featureCount() * num)) return {self.OUT: self.dest_id} From aa9070ee179a5a5d3d23cf65a9ebd88e318a402e Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 27 May 2025 10:42:26 +0200 Subject: [PATCH 17/70] moved feedback to different location. --- ORStools/proc/isochrones_layer_proc.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 233ceb96..040d136a 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -207,8 +207,9 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) continue - feedback.pushDebugInfo(f"{str(isochrone)}") feedback.setProgress(int(100.0 / source.featureCount() * num)) + if int(100.0 / source.featureCount() * num)==100: + feedback.pushDebugInfo(str(self.dest_id)) return {self.OUT: self.dest_id} From b1839101c1fd7224fd8e1043d67ad71acb162c03 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 2 Jun 2025 15:53:10 +0200 Subject: [PATCH 18/70] Added sink commitment following qgis-pull-request #59241 --- ORStools/proc/directions_lines_proc.py | 6 ++++++ ORStools/proc/directions_points_layer_proc.py | 6 ++++++ ORStools/proc/directions_points_layers_proc.py | 6 ++++++ ORStools/proc/export_proc.py | 11 +++++++++++ ORStools/proc/isochrones_layer_proc.py | 6 ++++++ ORStools/proc/isochrones_point_proc.py | 6 ++++++ ORStools/proc/matrix_proc.py | 6 ++++++ ORStools/proc/snap_layer_proc.py | 6 ++++++ ORStools/proc/snap_point_proc.py | 6 ++++++ 9 files changed, 59 insertions(+) diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index 4d6436cb..c7eebabb 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -252,6 +252,12 @@ def processAlgorithm( feedback.setProgress(int(100.0 / count * num)) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index 41c8d5cf..79a5dbef 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -293,6 +293,12 @@ def sort(f): feedback.setProgress(int(100.0 / count * num)) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index 024e05ef..fd28f2ab 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -267,6 +267,12 @@ def sort_end(f): counter += 1 feedback.setProgress(int(100.0 / route_count * counter)) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 279d9f3a..64b4ec53 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -154,6 +154,17 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) + sink_line.flushBuffer() + if hasattr(sink_line, 'finalize'): + sink_line.finalize() + else: + del sink_line + + sink_point.flushBuffer() + if hasattr(sink_point, 'finalize'): + sink_point.finalize() + else: + del sink_point return {self.OUT: dest_id_line, self.OUT_POINT: dest_id_point} @staticmethod diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 0a4b60e0..b291b92f 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -212,6 +212,12 @@ def processAlgorithm( continue feedback.setProgress(int(100.0 / source.featureCount() * num)) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index b6b29c16..3bf7c6d7 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -168,6 +168,12 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 089347d3..87d47ceb 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -216,6 +216,12 @@ def processAlgorithm( sink.addFeature(feat) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: dest_id} # TODO working source_type and destination_type differ in both name and type from get_fields in directions_core. diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index edd07be5..8fcf46fe 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -135,6 +135,12 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index 94fd2db1..8a602c3d 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -120,6 +120,12 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) + sink.flushBuffer() + if hasattr(sink, 'finalize'): + sink.finalize() + else: + del sink + return {self.OUT: dest_id} def displayName(self) -> str: From 333f53eccaf32a6df450bb7916189812c9623444 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 2 Jun 2025 16:26:15 +0200 Subject: [PATCH 19/70] ruff changes --- ORStools/proc/directions_lines_proc.py | 4 ++-- ORStools/proc/directions_points_layer_proc.py | 4 ++-- ORStools/proc/directions_points_layers_proc.py | 4 ++-- ORStools/proc/export_proc.py | 4 ++-- ORStools/proc/isochrones_layer_proc.py | 4 ++-- ORStools/proc/isochrones_point_proc.py | 4 ++-- ORStools/proc/matrix_proc.py | 4 ++-- ORStools/proc/provider_get_confid_by_name.py | 4 +--- ORStools/proc/snap_layer_proc.py | 4 ++-- ORStools/proc/snap_point_proc.py | 4 ++-- 10 files changed, 19 insertions(+), 21 deletions(-) diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index b592c52c..2797ffa0 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -253,11 +253,11 @@ def processAlgorithm( feedback.setProgress(int(100.0 / count * num)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index 48e970ac..f4460fb0 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -294,11 +294,11 @@ def sort(f): feedback.setProgress(int(100.0 / count * num)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index a30a52cb..61cbd04c 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -268,11 +268,11 @@ def sort_end(f): feedback.setProgress(int(100.0 / route_count * counter)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 6db29b5e..564b640a 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -155,13 +155,13 @@ def processAlgorithm( logger.log(msg) sink_line.flushBuffer() - if hasattr(sink_line, 'finalize'): + if hasattr(sink_line, "finalize"): sink_line.finalize() else: del sink_line sink_point.flushBuffer() - if hasattr(sink_point, 'finalize'): + if hasattr(sink_point, "finalize"): sink_point.finalize() else: del sink_point diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 948846c6..c1291f6c 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -210,11 +210,11 @@ def processAlgorithm( logger.log(msg, 2) continue feedback.setProgress(int(100.0 / source.featureCount() * num)) - if int(100.0 / source.featureCount() * num)==100: + if int(100.0 / source.featureCount() * num) == 100: feedback.pushDebugInfo(str(self.dest_id)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index 065237b7..1595bf5f 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -168,11 +168,11 @@ def processAlgorithm( logger.log(msg, 2) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 5dbeaf4c..1d254c38 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -217,11 +217,11 @@ def processAlgorithm( sink.addFeature(feat) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} # TODO working source_type and destination_type differ in both name and type from get_fields in directions_core. diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index f251ac57..80621d61 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -78,9 +78,7 @@ def processAlgorithm( result = found[0] msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") else: - msg = self.tr( - f"Config with specified name not found! - {provider_name}" - ) + msg = self.tr(f"Config with specified name not found! - {provider_name}") result = -1 # diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index 54c5269a..d4f17a26 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -136,11 +136,11 @@ def processAlgorithm( logger.log(msg) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index caf0106e..1a0a74c9 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -121,11 +121,11 @@ def processAlgorithm( logger.log(msg) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: From 89ad098b3e52ada272fb959675503397744775b3 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 2 Jun 2025 16:35:20 +0200 Subject: [PATCH 20/70] ruff changes --- ORStools/proc/directions_lines_proc.py | 4 ++-- ORStools/proc/directions_points_layer_proc.py | 4 ++-- ORStools/proc/directions_points_layers_proc.py | 4 ++-- ORStools/proc/export_proc.py | 4 ++-- ORStools/proc/isochrones_layer_proc.py | 2 +- ORStools/proc/isochrones_point_proc.py | 4 ++-- ORStools/proc/matrix_proc.py | 4 ++-- ORStools/proc/snap_layer_proc.py | 4 ++-- ORStools/proc/snap_point_proc.py | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index b592c52c..2797ffa0 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -253,11 +253,11 @@ def processAlgorithm( feedback.setProgress(int(100.0 / count * num)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index 48e970ac..f4460fb0 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -294,11 +294,11 @@ def sort(f): feedback.setProgress(int(100.0 / count * num)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index a30a52cb..61cbd04c 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -268,11 +268,11 @@ def sort_end(f): feedback.setProgress(int(100.0 / route_count * counter)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 6db29b5e..564b640a 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -155,13 +155,13 @@ def processAlgorithm( logger.log(msg) sink_line.flushBuffer() - if hasattr(sink_line, 'finalize'): + if hasattr(sink_line, "finalize"): sink_line.finalize() else: del sink_line sink_point.flushBuffer() - if hasattr(sink_point, 'finalize'): + if hasattr(sink_point, "finalize"): sink_point.finalize() else: del sink_point diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 02e7346e..6034cd88 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -212,7 +212,7 @@ def processAlgorithm( feedback.setProgress(int(100.0 / source.featureCount() * num)) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index 065237b7..1595bf5f 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -168,11 +168,11 @@ def processAlgorithm( logger.log(msg, 2) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 5dbeaf4c..1d254c38 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -217,11 +217,11 @@ def processAlgorithm( sink.addFeature(feat) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} # TODO working source_type and destination_type differ in both name and type from get_fields in directions_core. diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index 54c5269a..d4f17a26 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -136,11 +136,11 @@ def processAlgorithm( logger.log(msg) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index caf0106e..1a0a74c9 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -121,11 +121,11 @@ def processAlgorithm( logger.log(msg) sink.flushBuffer() - if hasattr(sink, 'finalize'): + if hasattr(sink, "finalize"): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: From 0e09cc1d915428755c2cd94d222da8f6e0e08fd6 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 2 Jun 2025 16:36:46 +0200 Subject: [PATCH 21/70] Revert "ruff changes" This reverts commit 89ad098b3e52ada272fb959675503397744775b3. --- ORStools/proc/directions_lines_proc.py | 4 ++-- ORStools/proc/directions_points_layer_proc.py | 4 ++-- ORStools/proc/directions_points_layers_proc.py | 4 ++-- ORStools/proc/export_proc.py | 4 ++-- ORStools/proc/isochrones_layer_proc.py | 2 +- ORStools/proc/isochrones_point_proc.py | 4 ++-- ORStools/proc/matrix_proc.py | 4 ++-- ORStools/proc/snap_layer_proc.py | 4 ++-- ORStools/proc/snap_point_proc.py | 4 ++-- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index 2797ffa0..b592c52c 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -253,11 +253,11 @@ def processAlgorithm( feedback.setProgress(int(100.0 / count * num)) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index f4460fb0..48e970ac 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -294,11 +294,11 @@ def sort(f): feedback.setProgress(int(100.0 / count * num)) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index 61cbd04c..a30a52cb 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -268,11 +268,11 @@ def sort_end(f): feedback.setProgress(int(100.0 / route_count * counter)) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 564b640a..6db29b5e 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -155,13 +155,13 @@ def processAlgorithm( logger.log(msg) sink_line.flushBuffer() - if hasattr(sink_line, "finalize"): + if hasattr(sink_line, 'finalize'): sink_line.finalize() else: del sink_line sink_point.flushBuffer() - if hasattr(sink_point, "finalize"): + if hasattr(sink_point, 'finalize'): sink_point.finalize() else: del sink_point diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 6034cd88..02e7346e 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -212,7 +212,7 @@ def processAlgorithm( feedback.setProgress(int(100.0 / source.featureCount() * num)) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index 1595bf5f..065237b7 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -168,11 +168,11 @@ def processAlgorithm( logger.log(msg, 2) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 1d254c38..5dbeaf4c 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -217,11 +217,11 @@ def processAlgorithm( sink.addFeature(feat) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: dest_id} # TODO working source_type and destination_type differ in both name and type from get_fields in directions_core. diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index d4f17a26..54c5269a 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -136,11 +136,11 @@ def processAlgorithm( logger.log(msg) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index 1a0a74c9..caf0106e 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -121,11 +121,11 @@ def processAlgorithm( logger.log(msg) sink.flushBuffer() - if hasattr(sink, "finalize"): + if hasattr(sink, 'finalize'): sink.finalize() else: del sink - + return {self.OUT: dest_id} def displayName(self) -> str: From 85c332f516a775151bd41e5f829752317ae5fbc2 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 2 Jun 2025 16:38:49 +0200 Subject: [PATCH 22/70] Revert "Merge pull request #1 from jannefleischer/master" This reverts commit cbc1f296779cc755dbf98d90df9df251a6113b93, reversing changes made to 6fc21906c464f1ffb186b64c12e4411e993856d1. --- ORStools/proc/directions_lines_proc.py | 6 ------ ORStools/proc/directions_points_layer_proc.py | 6 ------ ORStools/proc/directions_points_layers_proc.py | 6 ------ ORStools/proc/export_proc.py | 11 ----------- ORStools/proc/isochrones_layer_proc.py | 6 ------ ORStools/proc/isochrones_point_proc.py | 6 ------ ORStools/proc/matrix_proc.py | 6 ------ ORStools/proc/snap_layer_proc.py | 6 ------ ORStools/proc/snap_point_proc.py | 6 ------ 9 files changed, 59 deletions(-) diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index b592c52c..07034d8c 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -252,12 +252,6 @@ def processAlgorithm( feedback.setProgress(int(100.0 / count * num)) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index 48e970ac..e548c2f8 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -293,12 +293,6 @@ def sort(f): feedback.setProgress(int(100.0 / count * num)) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index a30a52cb..185e83cb 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -267,12 +267,6 @@ def sort_end(f): counter += 1 feedback.setProgress(int(100.0 / route_count * counter)) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 6db29b5e..d45d2713 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -154,17 +154,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) - sink_line.flushBuffer() - if hasattr(sink_line, 'finalize'): - sink_line.finalize() - else: - del sink_line - - sink_point.flushBuffer() - if hasattr(sink_point, 'finalize'): - sink_point.finalize() - else: - del sink_point return {self.OUT: dest_id_line, self.OUT_POINT: dest_id_point} @staticmethod diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 02e7346e..dd538218 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -211,12 +211,6 @@ def processAlgorithm( continue feedback.setProgress(int(100.0 / source.featureCount() * num)) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index 065237b7..41e85973 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -167,12 +167,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 5dbeaf4c..347d7088 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -216,12 +216,6 @@ def processAlgorithm( sink.addFeature(feat) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} # TODO working source_type and destination_type differ in both name and type from get_fields in directions_core. diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index 54c5269a..9e606ba0 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -135,12 +135,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index caf0106e..039feb95 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -120,12 +120,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) - sink.flushBuffer() - if hasattr(sink, 'finalize'): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} def displayName(self) -> str: From 7a9787cea033e81bbf3e35f4812c9ff8e38dd958 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 2 Jun 2025 16:53:00 +0200 Subject: [PATCH 23/70] Added additional algorithm that returns the index of a named provider (for messy setups ;) ) --- ORStools/proc/provider.py | 2 + ORStools/proc/provider_get_confid_by_name.py | 104 +++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 ORStools/proc/provider_get_confid_by_name.py diff --git a/ORStools/proc/provider.py b/ORStools/proc/provider.py index 8770946f..c08279c3 100644 --- a/ORStools/proc/provider.py +++ b/ORStools/proc/provider.py @@ -40,6 +40,7 @@ from .matrix_proc import ORSMatrixAlgo from .provider_add_conf import ORSProviderAddAlgo from .provider_rm_conf import ORSProviderRmAlgo +from .provider_get_confid_by_name import ORSProviderGetConfIdAlgo from ORStools.utils.gui import GuiUtils from .snap_layer_proc import ORSSnapLayerAlgo @@ -74,6 +75,7 @@ def loadAlgorithms(self) -> None: self.addAlgorithm(ORSSnapPointAlgo()) self.addAlgorithm(ORSProviderAddAlgo()) self.addAlgorithm(ORSProviderRmAlgo()) + self.addAlgorithm(ORSProviderGetConfIdAlgo()) @staticmethod def icon(): diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py new file mode 100644 index 00000000..80621d61 --- /dev/null +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + ORStools + A QGIS plugin + QGIS client to query openrouteservice + ------------------- + begin : 2017-02-01 + git sha : $Format:%H$ + copyright : (C) 2021 by HeiGIT gGmbH + email : support@openrouteservice.heigit.org + ***************************************************************************/ + + This plugin provides access to openrouteservice API functionalities + (https://openrouteservice.org), developed and + maintained by the openrouteservice team of HeiGIT gGmbH, Germany. By using + this plugin you agree to the ORS terms of service + (https://openrouteservice.org/terms-of-service/). + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" + +from typing import Dict + +from qgis.PyQt.QtCore import QCoreApplication + +from qgis.core import ( + QgsSettings, + QgsProcessingAlgorithm, + QgsProcessingParameterString, + QgsProcessingContext, + QgsProcessingFeedback, +) + +from ORStools.utils import logger + + +class ORSProviderGetConfIdAlgo(QgsProcessingAlgorithm): + def __init__(self): + super().__init__() + self.PARAMETERS: list = [ + QgsProcessingParameterString( + name="ors_provider_name", + description=self.tr("Specify unique name for your ors provider"), + ), + ] + + def group(self): + return "Configuration" + + def groupId(self): + return "configuration" + + def initAlgorithm(self, config={}): + for parameter in self.PARAMETERS: + self.addParameter(parameter) + + def processAlgorithm( + self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback + ) -> Dict[str, str]: + s = QgsSettings() + provider_name = self.parameterAsString(parameters, "ors_provider_name", context) + current_config = s.value("ORStools/config") + if provider_name in [x["name"] for x in current_config["providers"]]: + found = [ + int(j) + for j, y in {str(i): x for i, x in enumerate(current_config["providers"])}.items() + if y["name"] == provider_name + ] + if len(found) > 0: + result = found[0] + msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") + else: + msg = self.tr(f"Config with specified name not found! - {provider_name}") + result = -1 + + # + feedback.pushInfo(msg) + logger.log(msg, 2) + return {"OUTPUT": result} + + def createInstance(self): + return self.__class__() + + def name(self): + return "get_provider_confid_by_name_algorithm" + + def displayName(self) -> str: + """ + Algorithm name shown in QGIS toolbox + :return: + """ + return self.tr("Get Provider Config ID via Algorithm (e.g. headless)") + + def tr(self, string: str, context=None) -> str: + context = context or self.__class__.__name__ + return QCoreApplication.translate(context, string) From 9b61a3f2a97fd17746a2c17e2f4cd050357f656a Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 3 Jun 2025 09:56:57 +0200 Subject: [PATCH 24/70] fixed indentation. returned None which is invalid. --- ORStools/proc/provider_rm_conf.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 34d07f01..27de506d 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -78,15 +78,15 @@ def processAlgorithm( del current_config["providers"][found[0]] s.setValue("ORStools/config", {"providers": current_config["providers"]}) msg = self.tr(f"Old config deleted: {provider_name}") - else: - msg = self.tr( - f"Old config not found! - {provider_name} - and is therfore not deleted." - ) - - # - feedback.pushInfo(msg) - logger.log(msg, 2) - return {"OUTPUT": msg} + else: + msg = self.tr( + f"Old config not found! - {provider_name} - and is therfore not deleted." + ) + + # + feedback.pushInfo(msg) + logger.log(msg, 2) + return {"OUTPUT": msg} def createInstance(self): return self.__class__() From 32522834beedfd11a0b2c5b0eef788a127f36a2e Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 08:30:52 +0200 Subject: [PATCH 25/70] added minimal feedback on cli to isochrone creation. --- ORStools/proc/base_processing_algorithm.py | 8 ++++++++ ORStools/proc/isochrones_layer_proc.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/ORStools/proc/base_processing_algorithm.py b/ORStools/proc/base_processing_algorithm.py index 6bd70a2f..befef232 100644 --- a/ORStools/proc/base_processing_algorithm.py +++ b/ORStools/proc/base_processing_algorithm.py @@ -73,6 +73,14 @@ def __init__(self) -> None: self.OUT = "OUTPUT" self.OUT_NAME = "ORSTOOLS_OUTPUT" self.PARAMETERS = None + + try: + if hasattr(iface, "mainWindow") and iface.mainWindow() is not None: + self.IS_CLI = False + else: + self.IS_CLI = True + except NameError: + self.IS_CLI = True def createInstance(self) -> Any: """ diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index dd538218..9fe3757e 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -209,6 +209,8 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) continue + if self.IS_CLI and num%100==0: + print(f"Done {num} from {source.featureCount()}", flush=True) feedback.setProgress(int(100.0 / source.featureCount() * num)) return {self.OUT: self.dest_id} From b49eba83593b73611f74de6cbacf972416542b46 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 08:31:38 +0200 Subject: [PATCH 26/70] ran ruff. --- ORStools/proc/base_processing_algorithm.py | 2 +- ORStools/proc/isochrones_layer_proc.py | 2 +- ORStools/proc/provider_rm_conf.py | 4 +--- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/ORStools/proc/base_processing_algorithm.py b/ORStools/proc/base_processing_algorithm.py index befef232..55fbc13d 100644 --- a/ORStools/proc/base_processing_algorithm.py +++ b/ORStools/proc/base_processing_algorithm.py @@ -73,7 +73,7 @@ def __init__(self) -> None: self.OUT = "OUTPUT" self.OUT_NAME = "ORSTOOLS_OUTPUT" self.PARAMETERS = None - + try: if hasattr(iface, "mainWindow") and iface.mainWindow() is not None: self.IS_CLI = False diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 9fe3757e..4bccbd9d 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -209,7 +209,7 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) continue - if self.IS_CLI and num%100==0: + if self.IS_CLI and num % 100 == 0: print(f"Done {num} from {source.featureCount()}", flush=True) feedback.setProgress(int(100.0 / source.featureCount() * num)) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 27de506d..89797c9c 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -79,9 +79,7 @@ def processAlgorithm( s.setValue("ORStools/config", {"providers": current_config["providers"]}) msg = self.tr(f"Old config deleted: {provider_name}") else: - msg = self.tr( - f"Old config not found! - {provider_name} - and is therfore not deleted." - ) + msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") # feedback.pushInfo(msg) From 5f0795c1a11c81bed8b23eb0b2a118d40174cefd Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 08:45:27 +0200 Subject: [PATCH 27/70] fixing a bytes/str issue --- ORStools/common/networkaccessmanager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index 5641e6da..828bc36e 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -315,7 +315,11 @@ def replyFinished(self) -> None: # check if errorString is empty, if so, then set err string as # reply dump if re.match("(.)*server replied: $", self.reply.errorString()): - errString = self.reply.errorString() + self.http_call_result.content + try: + content_str = self.http_call_result.content.decode('utf-8', errors='replace') + errString = self.reply.errorString() + content_str + except ValueError: + errString = self.reply.errorString() + str(self.http_call_result.content) else: errString = self.reply.errorString() # check if self.http_call_result.status_code is available (client abort From f5669671d8b13137c07f4ab6240a0ecd379aa4d5 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 09:24:05 +0200 Subject: [PATCH 28/70] first try on parallel calls to ors --- ORStools/proc/isochrones_layer_proc.py | 101 ++++++++++++++++++++----- 1 file changed, 83 insertions(+), 18 deletions(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 1e373317..b8e6e6d1 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -50,6 +50,8 @@ from ORStools.utils import transform, exceptions, logger from ORStools.utils.gui import GuiUtils +#import concurrent.futures +from concurrent.futures import ThreadPoolExecutor, as_completed # noinspection PyPep8Naming class ORSIsochronesLayerAlgo(ORSBaseProcessingAlgorithm): @@ -67,6 +69,7 @@ def __init__(self): self.USE_SMOOTHING: str = "USE_SMOOTHING" self.IN_SMOOTHING: str = "INPUT_SMOOTHING" self.LOCATION_TYPE: str = "LOCATION_TYPE" + self.MAX_WORKERS: str = "MAX_WORKERS" self.OUT_NAME: str = "Isochrones_Layer" self.PARAMETERS: list = [ QgsProcessingParameterFeatureSource( @@ -109,6 +112,15 @@ def __init__(self): options=LOCATION_TYPES, defaultValue=LOCATION_TYPES[0], ), + QgsProcessingParameterNumber( + name=self.MAX_WORKERS, + description=self.tr("Number of parallel requests (1-8) | ONLY FOR CUSTOM ORS DEPLOYMENT!"), + defaultValue=1, + minValue=1, + maxValue=8, + optional=True, + ), + ] # Save some important references @@ -135,6 +147,11 @@ def processAlgorithm( ranges_proc = list(map(int, ranges_proc)) smoothing = parameters[self.IN_SMOOTHING] + max_workers = self.parameterAsInt(parameters, self.MAX_WORKERS, context) + if max_workers is None or max_workers < 1: + max_workers = 1 # Fallback default + feedback.pushDebugInfo(f"Using {max_workers} parallel workers") + # self.difference = self.parameterAsBool(parameters, self.IN_DIFFERENCE, context) source = self.parameterAsSource(parameters, self.IN_POINTS, context) @@ -189,31 +206,79 @@ def processAlgorithm( self.crs_out, ) - for num, params in enumerate(requests): + def process_single_request(request_data): + """Verarbeitet eine einzelne ORS-Anfrage""" + num, params = request_data if feedback.isCanceled(): - break - - # If feature causes error, report and continue with next + return None, None + try: - # Populate features from response - endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ - "isochrones" - ] + endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])["isochrones"] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - - for isochrone in self.isochrones.get_features(response, params["id"]): - sink.addFeature(isochrone) - + + features = list(self.isochrones.get_features(response, params["id"])) + return num, features + except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" feedback.reportError(msg) logger.log(msg, 2) - continue - if self.IS_CLI and num % 100 == 0: - print(f"Done {num} from {source.featureCount()}", flush=True) - feedback.setProgress(int(100.0 / source.featureCount() * num)) - if int(100.0 / source.featureCount() * num) == 100: - feedback.pushDebugInfo(str(self.dest_id)) + return num, None + + # Parallele Verarbeitung + completed_requests = 0 + total_requests = len(requests) + + with ThreadPoolExecutor(max_workers=max_workers) as executor: + # Alle Anfragen als Future-Objekte einreichen + future_to_request = { + executor.submit(process_single_request, (num, params)): num + for num, params in enumerate(requests) + } + + # Ergebnisse sammeln sobald sie verfügbar sind + for future in as_completed(future_to_request): + if feedback.isCanceled(): + break + + num, features = future.result() + + if features: + for feature in features: + sink.addFeature(feature) + + completed_requests += 1 + + # Progress aktualisieren + feedback.setProgress(int(100.0 * completed_requests / total_requests)) + + if self.IS_CLI and completed_requests % 100 == 0: + print(f"Done {completed_requests} from {total_requests}", flush=True) + # for num, params in enumerate(requests): + # if feedback.isCanceled(): + # break + + # # If feature causes error, report and continue with next + # try: + # # Populate features from response + # endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ + # "isochrones" + # ] + # response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) + + # for isochrone in self.isochrones.get_features(response, params["id"]): + # sink.addFeature(isochrone) + + # except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: + # msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" + # feedback.reportError(msg) + # logger.log(msg, 2) + # continue + # if self.IS_CLI and num % 100 == 0: + # print(f"Done {num} from {source.featureCount()}", flush=True) + # feedback.setProgress(int(100.0 / source.featureCount() * num)) + # if int(100.0 / source.featureCount() * num) == 100: + # feedback.pushDebugInfo(str(self.dest_id)) sink.flushBuffer() if hasattr(sink, "finalize"): From f739f7f3a3164501849c6c13fb9d21f0ede59936 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 09:34:22 +0200 Subject: [PATCH 29/70] added worker-feedback on cli --- ORStools/proc/isochrones_layer_proc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index b8e6e6d1..a0b767b4 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -151,6 +151,7 @@ def processAlgorithm( if max_workers is None or max_workers < 1: max_workers = 1 # Fallback default feedback.pushDebugInfo(f"Using {max_workers} parallel workers") + if self.IS_CLI: print(f"Using {max_workers} parallel workers", flush=True) # self.difference = self.parameterAsBool(parameters, self.IN_DIFFERENCE, context) source = self.parameterAsSource(parameters, self.IN_POINTS, context) From 83e069642e355e47f045a2e43b0fd337d9cc9b85 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 09:56:54 +0200 Subject: [PATCH 30/70] added suggested changes from Claude. --- ORStools/common/networkaccessmanager.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index 828bc36e..c5938a54 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -161,6 +161,7 @@ def __init__( self.exception_class = exception_class self.on_abort = False self.blocking_mode = False + self._connections_made = [] self.http_call_result = Response( { "status": 0, @@ -250,6 +251,12 @@ def request( # calling QgsNetworkAccessManager::abortRequest QgsNetworkAccessManager.instance().requestTimedOut.connect(self.requestTimedOut) + self._connections_made = [ + (self.reply.sslErrors, self.sslErrors), + (self.reply.finished, self.replyFinished), + (self.reply.downloadProgress, self.downloadProgress) + ] + self.reply.sslErrors.connect(self.sslErrors) self.reply.finished.connect(self.replyFinished) self.reply.downloadProgress.connect(self.downloadProgress) @@ -403,9 +410,13 @@ def replyFinished(self) -> None: self.reply.close() self.msg_log("Deleting reply ...") # Disconnect all slots - self.reply.sslErrors.disconnect(self.sslErrors) - self.reply.finished.disconnect(self.replyFinished) - self.reply.downloadProgress.disconnect(self.downloadProgress) + try: self.reply.sslErrors.disconnect(self.sslErrors) + except TypeError: pass + try: self.reply.finished.disconnect(self.replyFinished) + except: TypeError: pass + try: self.reply.downloadProgress.disconnect(self.downloadProgress) + except TypeError: pass + self._connections_made = [] self.reply.deleteLater() self.reply = None else: From 8ac950d8327d74f89b88ce73a1852ebfd531c694 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 09:58:20 +0200 Subject: [PATCH 31/70] ruff changes. --- ORStools/proc/isochrones_layer_proc.py | 39 +++++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index a0b767b4..bc850758 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -50,9 +50,10 @@ from ORStools.utils import transform, exceptions, logger from ORStools.utils.gui import GuiUtils -#import concurrent.futures +# import concurrent.futures from concurrent.futures import ThreadPoolExecutor, as_completed + # noinspection PyPep8Naming class ORSIsochronesLayerAlgo(ORSBaseProcessingAlgorithm): def __init__(self): @@ -69,7 +70,7 @@ def __init__(self): self.USE_SMOOTHING: str = "USE_SMOOTHING" self.IN_SMOOTHING: str = "INPUT_SMOOTHING" self.LOCATION_TYPE: str = "LOCATION_TYPE" - self.MAX_WORKERS: str = "MAX_WORKERS" + self.MAX_WORKERS: str = "MAX_WORKERS" self.OUT_NAME: str = "Isochrones_Layer" self.PARAMETERS: list = [ QgsProcessingParameterFeatureSource( @@ -114,13 +115,14 @@ def __init__(self): ), QgsProcessingParameterNumber( name=self.MAX_WORKERS, - description=self.tr("Number of parallel requests (1-8) | ONLY FOR CUSTOM ORS DEPLOYMENT!"), + description=self.tr( + "Number of parallel requests (1-8) | ONLY FOR CUSTOM ORS DEPLOYMENT!" + ), defaultValue=1, minValue=1, maxValue=8, optional=True, ), - ] # Save some important references @@ -151,7 +153,8 @@ def processAlgorithm( if max_workers is None or max_workers < 1: max_workers = 1 # Fallback default feedback.pushDebugInfo(f"Using {max_workers} parallel workers") - if self.IS_CLI: print(f"Using {max_workers} parallel workers", flush=True) + if self.IS_CLI: + print(f"Using {max_workers} parallel workers", flush=True) # self.difference = self.parameterAsBool(parameters, self.IN_DIFFERENCE, context) source = self.parameterAsSource(parameters, self.IN_POINTS, context) @@ -212,14 +215,16 @@ def process_single_request(request_data): num, params = request_data if feedback.isCanceled(): return None, None - + try: - endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])["isochrones"] + endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ + "isochrones" + ] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - + features = list(self.isochrones.get_features(response, params["id"])) return num, features - + except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" feedback.reportError(msg) @@ -229,30 +234,30 @@ def process_single_request(request_data): # Parallele Verarbeitung completed_requests = 0 total_requests = len(requests) - + with ThreadPoolExecutor(max_workers=max_workers) as executor: # Alle Anfragen als Future-Objekte einreichen future_to_request = { - executor.submit(process_single_request, (num, params)): num + executor.submit(process_single_request, (num, params)): num for num, params in enumerate(requests) } - + # Ergebnisse sammeln sobald sie verfügbar sind for future in as_completed(future_to_request): if feedback.isCanceled(): break - + num, features = future.result() - + if features: for feature in features: sink.addFeature(feature) - + completed_requests += 1 - + # Progress aktualisieren feedback.setProgress(int(100.0 * completed_requests / total_requests)) - + if self.IS_CLI and completed_requests % 100 == 0: print(f"Done {completed_requests} from {total_requests}", flush=True) # for num, params in enumerate(requests): From 396dde69ea73415e0fca1d8a93cc7ea0a787cd58 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 10:00:04 +0200 Subject: [PATCH 32/70] additional ruff --- ORStools/common/networkaccessmanager.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index c5938a54..02880843 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -254,7 +254,7 @@ def request( self._connections_made = [ (self.reply.sslErrors, self.sslErrors), (self.reply.finished, self.replyFinished), - (self.reply.downloadProgress, self.downloadProgress) + (self.reply.downloadProgress, self.downloadProgress), ] self.reply.sslErrors.connect(self.sslErrors) @@ -323,7 +323,7 @@ def replyFinished(self) -> None: # reply dump if re.match("(.)*server replied: $", self.reply.errorString()): try: - content_str = self.http_call_result.content.decode('utf-8', errors='replace') + content_str = self.http_call_result.content.decode("utf-8", errors="replace") errString = self.reply.errorString() + content_str except ValueError: errString = self.reply.errorString() + str(self.http_call_result.content) @@ -410,12 +410,18 @@ def replyFinished(self) -> None: self.reply.close() self.msg_log("Deleting reply ...") # Disconnect all slots - try: self.reply.sslErrors.disconnect(self.sslErrors) - except TypeError: pass - try: self.reply.finished.disconnect(self.replyFinished) - except: TypeError: pass - try: self.reply.downloadProgress.disconnect(self.downloadProgress) - except TypeError: pass + try: + self.reply.sslErrors.disconnect(self.sslErrors) + except TypeError: + pass + try: + self.reply.finished.disconnect(self.replyFinished) + except TypeError: + pass + try: + self.reply.downloadProgress.disconnect(self.downloadProgress) + except TypeError: + pass self._connections_made = [] self.reply.deleteLater() self.reply = None From 6cc7f695bc3fe6e5059da3d5850f7aaba3439e97 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 10:03:14 +0200 Subject: [PATCH 33/70] Revert "additional ruff" This reverts commit 396dde69ea73415e0fca1d8a93cc7ea0a787cd58. --- ORStools/common/networkaccessmanager.py | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index 02880843..c5938a54 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -254,7 +254,7 @@ def request( self._connections_made = [ (self.reply.sslErrors, self.sslErrors), (self.reply.finished, self.replyFinished), - (self.reply.downloadProgress, self.downloadProgress), + (self.reply.downloadProgress, self.downloadProgress) ] self.reply.sslErrors.connect(self.sslErrors) @@ -323,7 +323,7 @@ def replyFinished(self) -> None: # reply dump if re.match("(.)*server replied: $", self.reply.errorString()): try: - content_str = self.http_call_result.content.decode("utf-8", errors="replace") + content_str = self.http_call_result.content.decode('utf-8', errors='replace') errString = self.reply.errorString() + content_str except ValueError: errString = self.reply.errorString() + str(self.http_call_result.content) @@ -410,18 +410,12 @@ def replyFinished(self) -> None: self.reply.close() self.msg_log("Deleting reply ...") # Disconnect all slots - try: - self.reply.sslErrors.disconnect(self.sslErrors) - except TypeError: - pass - try: - self.reply.finished.disconnect(self.replyFinished) - except TypeError: - pass - try: - self.reply.downloadProgress.disconnect(self.downloadProgress) - except TypeError: - pass + try: self.reply.sslErrors.disconnect(self.sslErrors) + except TypeError: pass + try: self.reply.finished.disconnect(self.replyFinished) + except: TypeError: pass + try: self.reply.downloadProgress.disconnect(self.downloadProgress) + except TypeError: pass self._connections_made = [] self.reply.deleteLater() self.reply = None From 9f23c859094ab2f7312af1e97a69615d0b010ca0 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 10:03:20 +0200 Subject: [PATCH 34/70] Revert "ruff changes." This reverts commit 8ac950d8327d74f89b88ce73a1852ebfd531c694. --- ORStools/proc/isochrones_layer_proc.py | 39 +++++++++++--------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index bc850758..a0b767b4 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -50,10 +50,9 @@ from ORStools.utils import transform, exceptions, logger from ORStools.utils.gui import GuiUtils -# import concurrent.futures +#import concurrent.futures from concurrent.futures import ThreadPoolExecutor, as_completed - # noinspection PyPep8Naming class ORSIsochronesLayerAlgo(ORSBaseProcessingAlgorithm): def __init__(self): @@ -70,7 +69,7 @@ def __init__(self): self.USE_SMOOTHING: str = "USE_SMOOTHING" self.IN_SMOOTHING: str = "INPUT_SMOOTHING" self.LOCATION_TYPE: str = "LOCATION_TYPE" - self.MAX_WORKERS: str = "MAX_WORKERS" + self.MAX_WORKERS: str = "MAX_WORKERS" self.OUT_NAME: str = "Isochrones_Layer" self.PARAMETERS: list = [ QgsProcessingParameterFeatureSource( @@ -115,14 +114,13 @@ def __init__(self): ), QgsProcessingParameterNumber( name=self.MAX_WORKERS, - description=self.tr( - "Number of parallel requests (1-8) | ONLY FOR CUSTOM ORS DEPLOYMENT!" - ), + description=self.tr("Number of parallel requests (1-8) | ONLY FOR CUSTOM ORS DEPLOYMENT!"), defaultValue=1, minValue=1, maxValue=8, optional=True, ), + ] # Save some important references @@ -153,8 +151,7 @@ def processAlgorithm( if max_workers is None or max_workers < 1: max_workers = 1 # Fallback default feedback.pushDebugInfo(f"Using {max_workers} parallel workers") - if self.IS_CLI: - print(f"Using {max_workers} parallel workers", flush=True) + if self.IS_CLI: print(f"Using {max_workers} parallel workers", flush=True) # self.difference = self.parameterAsBool(parameters, self.IN_DIFFERENCE, context) source = self.parameterAsSource(parameters, self.IN_POINTS, context) @@ -215,16 +212,14 @@ def process_single_request(request_data): num, params = request_data if feedback.isCanceled(): return None, None - + try: - endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ - "isochrones" - ] + endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])["isochrones"] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - + features = list(self.isochrones.get_features(response, params["id"])) return num, features - + except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" feedback.reportError(msg) @@ -234,30 +229,30 @@ def process_single_request(request_data): # Parallele Verarbeitung completed_requests = 0 total_requests = len(requests) - + with ThreadPoolExecutor(max_workers=max_workers) as executor: # Alle Anfragen als Future-Objekte einreichen future_to_request = { - executor.submit(process_single_request, (num, params)): num + executor.submit(process_single_request, (num, params)): num for num, params in enumerate(requests) } - + # Ergebnisse sammeln sobald sie verfügbar sind for future in as_completed(future_to_request): if feedback.isCanceled(): break - + num, features = future.result() - + if features: for feature in features: sink.addFeature(feature) - + completed_requests += 1 - + # Progress aktualisieren feedback.setProgress(int(100.0 * completed_requests / total_requests)) - + if self.IS_CLI and completed_requests % 100 == 0: print(f"Done {completed_requests} from {total_requests}", flush=True) # for num, params in enumerate(requests): From b21639872495ff37b3e560783a563c912d84f988 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 10:03:23 +0200 Subject: [PATCH 35/70] Revert "added suggested changes from Claude." This reverts commit 83e069642e355e47f045a2e43b0fd337d9cc9b85. --- ORStools/common/networkaccessmanager.py | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index c5938a54..828bc36e 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -161,7 +161,6 @@ def __init__( self.exception_class = exception_class self.on_abort = False self.blocking_mode = False - self._connections_made = [] self.http_call_result = Response( { "status": 0, @@ -251,12 +250,6 @@ def request( # calling QgsNetworkAccessManager::abortRequest QgsNetworkAccessManager.instance().requestTimedOut.connect(self.requestTimedOut) - self._connections_made = [ - (self.reply.sslErrors, self.sslErrors), - (self.reply.finished, self.replyFinished), - (self.reply.downloadProgress, self.downloadProgress) - ] - self.reply.sslErrors.connect(self.sslErrors) self.reply.finished.connect(self.replyFinished) self.reply.downloadProgress.connect(self.downloadProgress) @@ -410,13 +403,9 @@ def replyFinished(self) -> None: self.reply.close() self.msg_log("Deleting reply ...") # Disconnect all slots - try: self.reply.sslErrors.disconnect(self.sslErrors) - except TypeError: pass - try: self.reply.finished.disconnect(self.replyFinished) - except: TypeError: pass - try: self.reply.downloadProgress.disconnect(self.downloadProgress) - except TypeError: pass - self._connections_made = [] + self.reply.sslErrors.disconnect(self.sslErrors) + self.reply.finished.disconnect(self.replyFinished) + self.reply.downloadProgress.disconnect(self.downloadProgress) self.reply.deleteLater() self.reply = None else: From b0c73bc23e539d53dead1926878686a0086392bd Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 10:03:26 +0200 Subject: [PATCH 36/70] Revert "added worker-feedback on cli" This reverts commit f739f7f3a3164501849c6c13fb9d21f0ede59936. --- ORStools/proc/isochrones_layer_proc.py | 1 - 1 file changed, 1 deletion(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index a0b767b4..b8e6e6d1 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -151,7 +151,6 @@ def processAlgorithm( if max_workers is None or max_workers < 1: max_workers = 1 # Fallback default feedback.pushDebugInfo(f"Using {max_workers} parallel workers") - if self.IS_CLI: print(f"Using {max_workers} parallel workers", flush=True) # self.difference = self.parameterAsBool(parameters, self.IN_DIFFERENCE, context) source = self.parameterAsSource(parameters, self.IN_POINTS, context) From ed0c4b4cbaab997d240ebe04c39685988b7e77f6 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 4 Jun 2025 10:03:29 +0200 Subject: [PATCH 37/70] Revert "first try on parallel calls to ors" This reverts commit f5669671d8b13137c07f4ab6240a0ecd379aa4d5. --- ORStools/proc/isochrones_layer_proc.py | 101 +++++-------------------- 1 file changed, 18 insertions(+), 83 deletions(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index b8e6e6d1..1e373317 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -50,8 +50,6 @@ from ORStools.utils import transform, exceptions, logger from ORStools.utils.gui import GuiUtils -#import concurrent.futures -from concurrent.futures import ThreadPoolExecutor, as_completed # noinspection PyPep8Naming class ORSIsochronesLayerAlgo(ORSBaseProcessingAlgorithm): @@ -69,7 +67,6 @@ def __init__(self): self.USE_SMOOTHING: str = "USE_SMOOTHING" self.IN_SMOOTHING: str = "INPUT_SMOOTHING" self.LOCATION_TYPE: str = "LOCATION_TYPE" - self.MAX_WORKERS: str = "MAX_WORKERS" self.OUT_NAME: str = "Isochrones_Layer" self.PARAMETERS: list = [ QgsProcessingParameterFeatureSource( @@ -112,15 +109,6 @@ def __init__(self): options=LOCATION_TYPES, defaultValue=LOCATION_TYPES[0], ), - QgsProcessingParameterNumber( - name=self.MAX_WORKERS, - description=self.tr("Number of parallel requests (1-8) | ONLY FOR CUSTOM ORS DEPLOYMENT!"), - defaultValue=1, - minValue=1, - maxValue=8, - optional=True, - ), - ] # Save some important references @@ -147,11 +135,6 @@ def processAlgorithm( ranges_proc = list(map(int, ranges_proc)) smoothing = parameters[self.IN_SMOOTHING] - max_workers = self.parameterAsInt(parameters, self.MAX_WORKERS, context) - if max_workers is None or max_workers < 1: - max_workers = 1 # Fallback default - feedback.pushDebugInfo(f"Using {max_workers} parallel workers") - # self.difference = self.parameterAsBool(parameters, self.IN_DIFFERENCE, context) source = self.parameterAsSource(parameters, self.IN_POINTS, context) @@ -206,79 +189,31 @@ def processAlgorithm( self.crs_out, ) - def process_single_request(request_data): - """Verarbeitet eine einzelne ORS-Anfrage""" - num, params = request_data + for num, params in enumerate(requests): if feedback.isCanceled(): - return None, None - + break + + # If feature causes error, report and continue with next try: - endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])["isochrones"] + # Populate features from response + endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ + "isochrones" + ] response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - - features = list(self.isochrones.get_features(response, params["id"])) - return num, features - + + for isochrone in self.isochrones.get_features(response, params["id"]): + sink.addFeature(isochrone) + except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" feedback.reportError(msg) logger.log(msg, 2) - return num, None - - # Parallele Verarbeitung - completed_requests = 0 - total_requests = len(requests) - - with ThreadPoolExecutor(max_workers=max_workers) as executor: - # Alle Anfragen als Future-Objekte einreichen - future_to_request = { - executor.submit(process_single_request, (num, params)): num - for num, params in enumerate(requests) - } - - # Ergebnisse sammeln sobald sie verfügbar sind - for future in as_completed(future_to_request): - if feedback.isCanceled(): - break - - num, features = future.result() - - if features: - for feature in features: - sink.addFeature(feature) - - completed_requests += 1 - - # Progress aktualisieren - feedback.setProgress(int(100.0 * completed_requests / total_requests)) - - if self.IS_CLI and completed_requests % 100 == 0: - print(f"Done {completed_requests} from {total_requests}", flush=True) - # for num, params in enumerate(requests): - # if feedback.isCanceled(): - # break - - # # If feature causes error, report and continue with next - # try: - # # Populate features from response - # endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ - # "isochrones" - # ] - # response = ors_client.request(f"/v2/{endpoint}/{profile}", {}, post_json=params) - - # for isochrone in self.isochrones.get_features(response, params["id"]): - # sink.addFeature(isochrone) - - # except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: - # msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" - # feedback.reportError(msg) - # logger.log(msg, 2) - # continue - # if self.IS_CLI and num % 100 == 0: - # print(f"Done {num} from {source.featureCount()}", flush=True) - # feedback.setProgress(int(100.0 / source.featureCount() * num)) - # if int(100.0 / source.featureCount() * num) == 100: - # feedback.pushDebugInfo(str(self.dest_id)) + continue + if self.IS_CLI and num % 100 == 0: + print(f"Done {num} from {source.featureCount()}", flush=True) + feedback.setProgress(int(100.0 / source.featureCount() * num)) + if int(100.0 / source.featureCount() * num) == 100: + feedback.pushDebugInfo(str(self.dest_id)) sink.flushBuffer() if hasattr(sink, "finalize"): From 7ec3200df9930da5a79fd12bdc7ee2dace750a7b Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Fri, 6 Jun 2025 15:19:17 +0200 Subject: [PATCH 38/70] fixed indentation --- ORStools/common/networkaccessmanager.py | 2 +- ORStools/proc/provider_get_confid_by_name.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index 828bc36e..8b22226b 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -316,7 +316,7 @@ def replyFinished(self) -> None: # reply dump if re.match("(.)*server replied: $", self.reply.errorString()): try: - content_str = self.http_call_result.content.decode('utf-8', errors='replace') + content_str = self.http_call_result.content.decode("utf-8", errors="replace") errString = self.reply.errorString() + content_str except ValueError: errString = self.reply.errorString() + str(self.http_call_result.content) diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 80621d61..c579d134 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -68,6 +68,10 @@ def processAlgorithm( s = QgsSettings() provider_name = self.parameterAsString(parameters, "ors_provider_name", context) current_config = s.value("ORStools/config") + + msg = self.tr(f"Config with specified name not found! - {provider_name}") + result = -1 + if provider_name in [x["name"] for x in current_config["providers"]]: found = [ int(j) @@ -77,14 +81,10 @@ def processAlgorithm( if len(found) > 0: result = found[0] msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") - else: - msg = self.tr(f"Config with specified name not found! - {provider_name}") - result = -1 - - # - feedback.pushInfo(msg) - logger.log(msg, 2) - return {"OUTPUT": result} + + feedback.pushInfo(msg) + logger.log(msg, 2) + return {"OUTPUT": result} def createInstance(self): return self.__class__() From 71d3b27de50a7a4204a73da1bf0cbfda85175f4b Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Fri, 6 Jun 2025 16:38:02 +0200 Subject: [PATCH 39/70] added sync to config. for savekeeping. --- ORStools/proc/provider_add_conf.py | 2 ++ ORStools/proc/provider_rm_conf.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 5cfdb5f8..218bd44c 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -130,6 +130,8 @@ def processAlgorithm( ] }, ) + saved = s.sync() + logger.log(f"saved config: {saved}", 2) return {"OUTPUT": f"new config added: {provider_name}"} diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 89797c9c..e67e800e 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -77,7 +77,9 @@ def processAlgorithm( if len(found) > 0: del current_config["providers"][found[0]] s.setValue("ORStools/config", {"providers": current_config["providers"]}) + s.sync() msg = self.tr(f"Old config deleted: {provider_name}") + else: msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") From ba723e7f39943a9bedc8a2eda2b5fe84559d98ed Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Fri, 6 Jun 2025 16:43:11 +0200 Subject: [PATCH 40/70] edgecases seems to need an explicit .sync() --- ORStools/proc/provider_add_conf.py | 1 + ORStools/proc/provider_rm_conf.py | 1 + 2 files changed, 2 insertions(+) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 5cfdb5f8..21710ae2 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -130,6 +130,7 @@ def processAlgorithm( ] }, ) + s.sync() return {"OUTPUT": f"new config added: {provider_name}"} diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 89797c9c..310cf8ff 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -77,6 +77,7 @@ def processAlgorithm( if len(found) > 0: del current_config["providers"][found[0]] s.setValue("ORStools/config", {"providers": current_config["providers"]}) + s.sync() msg = self.tr(f"Old config deleted: {provider_name}") else: msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") From bcd49c6386b858cc28b8e9c4c678a1c93f0a0d79 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 10 Jun 2025 12:23:57 +0200 Subject: [PATCH 41/70] fixing trouble with encoding of error texts. --- ORStools/common/networkaccessmanager.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ORStools/common/networkaccessmanager.py b/ORStools/common/networkaccessmanager.py index 5641e6da..8b22226b 100644 --- a/ORStools/common/networkaccessmanager.py +++ b/ORStools/common/networkaccessmanager.py @@ -315,7 +315,11 @@ def replyFinished(self) -> None: # check if errorString is empty, if so, then set err string as # reply dump if re.match("(.)*server replied: $", self.reply.errorString()): - errString = self.reply.errorString() + self.http_call_result.content + try: + content_str = self.http_call_result.content.decode("utf-8", errors="replace") + errString = self.reply.errorString() + content_str + except ValueError: + errString = self.reply.errorString() + str(self.http_call_result.content) else: errString = self.reply.errorString() # check if self.http_call_result.status_code is available (client abort From 497a59aa06685a55af9ec4a82d5e83197b907ab5 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 11 Jun 2025 11:33:38 +0200 Subject: [PATCH 42/70] add errorids to return of ORSIsochronesLayerAlgo --- ORStools/proc/isochrones_layer_proc.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 4bccbd9d..7144501c 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -194,6 +194,7 @@ def processAlgorithm( break # If feature causes error, report and continue with next + errorids = [] try: # Populate features from response endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ @@ -206,6 +207,7 @@ def processAlgorithm( except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" + errorids.append(params['id']) feedback.reportError(msg) logger.log(msg, 2) continue @@ -213,7 +215,10 @@ def processAlgorithm( print(f"Done {num} from {source.featureCount()}", flush=True) feedback.setProgress(int(100.0 / source.featureCount() * num)) - return {self.OUT: self.dest_id} + return { + self.OUT: self.dest_id, + "no_isochrones_for": errorids, + } # noinspection PyUnusedLocal def postProcessAlgorithm( From 006cafb73c410592deffe376c0e779aedc63d912 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 11 Jun 2025 11:34:07 +0200 Subject: [PATCH 43/70] Revert "add errorids to return of ORSIsochronesLayerAlgo" This reverts commit 497a59aa06685a55af9ec4a82d5e83197b907ab5. --- ORStools/proc/isochrones_layer_proc.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 7144501c..4bccbd9d 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -194,7 +194,6 @@ def processAlgorithm( break # If feature causes error, report and continue with next - errorids = [] try: # Populate features from response endpoint = self.get_endpoint_names_from_provider(parameters[self.IN_PROVIDER])[ @@ -207,7 +206,6 @@ def processAlgorithm( except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" - errorids.append(params['id']) feedback.reportError(msg) logger.log(msg, 2) continue @@ -215,10 +213,7 @@ def processAlgorithm( print(f"Done {num} from {source.featureCount()}", flush=True) feedback.setProgress(int(100.0 / source.featureCount() * num)) - return { - self.OUT: self.dest_id, - "no_isochrones_for": errorids, - } + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal def postProcessAlgorithm( From 51ad1d7d1fe6c009ec5b34ea485e10b4c1db41af Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 11 Jun 2025 11:38:42 +0200 Subject: [PATCH 44/70] additional output: errorids to ORSBaseProcessingAlgorithm --- ORStools/proc/isochrones_layer_proc.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index 1e373317..b2bae85c 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -188,7 +188,7 @@ def processAlgorithm( # reactivated self.crs_out, ) - + errorids = [] for num, params in enumerate(requests): if feedback.isCanceled(): break @@ -206,6 +206,7 @@ def processAlgorithm( except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" + errorids.append(params['id']) feedback.reportError(msg) logger.log(msg, 2) continue @@ -221,7 +222,10 @@ def processAlgorithm( else: del sink - return {self.OUT: self.dest_id} + return { + self.OUT: self.dest_id, + "no_isochrones_for": errorids, + } # noinspection PyUnusedLocal def postProcessAlgorithm( From 32b412ead2faee7d974b62019cfe206167e79197 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 10:52:36 +0200 Subject: [PATCH 45/70] renamed algorithm following conventions --- ORStools/proc/provider_add_conf.py | 2 +- ORStools/proc/provider_get_confid_by_name.py | 2 +- ORStools/proc/provider_rm_conf.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 218bd44c..1303146b 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -139,7 +139,7 @@ def createInstance(self): return self.__class__() def name(self): - return "set_provider_config_to_ors_via_algorithm" + return "config_add_provider" def displayName(self) -> str: """ diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index c579d134..6f7e869e 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -90,7 +90,7 @@ def createInstance(self): return self.__class__() def name(self): - return "get_provider_confid_by_name_algorithm" + return "config_get_provider_id_by_name" def displayName(self) -> str: """ diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index e67e800e..7cdadeae 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -92,7 +92,7 @@ def createInstance(self): return self.__class__() def name(self): - return "remove_provider_config_via_algorithm" + return "config_remove_provider" def displayName(self) -> str: """ From 5afb25600199e2a3a9d3b4e9cfaaaac9c517b017 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 10:52:36 +0200 Subject: [PATCH 46/70] renamed algorithm following conventions --- ORStools/proc/provider_add_conf.py | 2 +- ORStools/proc/provider_get_confid_by_name.py | 2 +- ORStools/proc/provider_rm_conf.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 21710ae2..80e52193 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -138,7 +138,7 @@ def createInstance(self): return self.__class__() def name(self): - return "set_provider_config_to_ors_via_algorithm" + return "config_add_provider" def displayName(self) -> str: """ diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 80621d61..6ea85d83 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -90,7 +90,7 @@ def createInstance(self): return self.__class__() def name(self): - return "get_provider_confid_by_name_algorithm" + return "config_get_provider_id_by_name" def displayName(self) -> str: """ diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 310cf8ff..1e93a83d 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -91,7 +91,7 @@ def createInstance(self): return self.__class__() def name(self): - return "remove_provider_config_via_algorithm" + return "config_remove_provider" def displayName(self) -> str: """ From 3d654ad21cd3d2837fd479d00d50f5ed66bd5f15 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 11:08:48 +0200 Subject: [PATCH 47/70] don't return None... --- ORStools/proc/provider_get_confid_by_name.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 6ea85d83..6f7e869e 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -68,6 +68,10 @@ def processAlgorithm( s = QgsSettings() provider_name = self.parameterAsString(parameters, "ors_provider_name", context) current_config = s.value("ORStools/config") + + msg = self.tr(f"Config with specified name not found! - {provider_name}") + result = -1 + if provider_name in [x["name"] for x in current_config["providers"]]: found = [ int(j) @@ -77,14 +81,10 @@ def processAlgorithm( if len(found) > 0: result = found[0] msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") - else: - msg = self.tr(f"Config with specified name not found! - {provider_name}") - result = -1 - - # - feedback.pushInfo(msg) - logger.log(msg, 2) - return {"OUTPUT": result} + + feedback.pushInfo(msg) + logger.log(msg, 2) + return {"OUTPUT": result} def createInstance(self): return self.__class__() From 6d4a6b35a7d21568007842eab33e4ebacdd82642 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 14:10:01 +0200 Subject: [PATCH 48/70] fiving feedback --- ORStools/proc/provider_add_conf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 1303146b..bb1f14cf 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -95,6 +95,7 @@ def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: s = QgsSettings() + feedback.pushInfo(f"Settingsfile: {s.fileName()}") provider_name = self.parameterAsString(parameters, "ors_provider_name", context) provider_url = self.parameterAsString(parameters, "ors_provider_url", context) provider_api_key = self.parameterAsString(parameters, "ors_provider_api_key", context) From 40fe0df52b51c9cc9174b428af2cad50c3797d45 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 14:16:10 +0200 Subject: [PATCH 49/70] more feedback! --- ORStools/proc/provider_add_conf.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index bb1f14cf..a06b2b70 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -116,7 +116,7 @@ def processAlgorithm( return {"OUTPUT": msg} else: existing_config = s.value("ORStools/config") - s.setValue( + save_feedback1 = s.setValue( "ORStools/config", { "providers": existing_config["providers"] @@ -131,8 +131,9 @@ def processAlgorithm( ] }, ) - saved = s.sync() - logger.log(f"saved config: {saved}", 2) + save_feedback2 = s.sync() + saved_config = s.value("ORStools/config")['providers'] + logger.log(f"saved config: {saved_config, save_feedback1, save_feedback2}", 2) return {"OUTPUT": f"new config added: {provider_name}"} From e1022aaac2c40c263f4945f24b41dac2da1e73fd Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 14:17:57 +0200 Subject: [PATCH 50/70] more feedback! --- ORStools/proc/provider_get_confid_by_name.py | 1 + 1 file changed, 1 insertion(+) diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 6f7e869e..269a05fa 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -83,6 +83,7 @@ def processAlgorithm( msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") feedback.pushInfo(msg) + feedback.pushDebug(f"This is the full list of providers: {current_config["providers"]}") logger.log(msg, 2) return {"OUTPUT": result} From d727b1887cf8a39b1832463cafe99e581c24af34 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 14:18:33 +0200 Subject: [PATCH 51/70] aascac --- ORStools/proc/provider_get_confid_by_name.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 269a05fa..0deb469e 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -83,7 +83,7 @@ def processAlgorithm( msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") feedback.pushInfo(msg) - feedback.pushDebug(f"This is the full list of providers: {current_config["providers"]}") + feedback.pushInfo(f"This is the full list of providers: {current_config["providers"]}") logger.log(msg, 2) return {"OUTPUT": result} From e1849d21b3a14eaf479faa8bbe99b8e3d4c69e15 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 14:27:12 +0200 Subject: [PATCH 52/70] feedback. Yeah! --- ORStools/proc/provider_add_conf.py | 1 + ORStools/proc/provider_get_confid_by_name.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index a06b2b70..65eba53b 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -96,6 +96,7 @@ def processAlgorithm( ) -> Dict[str, str]: s = QgsSettings() feedback.pushInfo(f"Settingsfile: {s.fileName()}") + logger.log(f"Settingsfile: {s.fileName()}", 2) provider_name = self.parameterAsString(parameters, "ors_provider_name", context) provider_url = self.parameterAsString(parameters, "ors_provider_url", context) provider_api_key = self.parameterAsString(parameters, "ors_provider_api_key", context) diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 0deb469e..f9b2be6f 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -83,8 +83,9 @@ def processAlgorithm( msg = self.tr(f"The provider with name: {provider_name} has the ID {str(result)}") feedback.pushInfo(msg) - feedback.pushInfo(f"This is the full list of providers: {current_config["providers"]}") logger.log(msg, 2) + logger.log(f"This is the full list of providers: {current_config["providers"]}") + return {"OUTPUT": result} def createInstance(self): From cd9e4db915257f85e91cd0656cd549d7b330bbec Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Mon, 16 Jun 2025 14:41:47 +0200 Subject: [PATCH 53/70] check writability of config file. --- ORStools/proc/provider_add_conf.py | 20 +++++++++++--------- ORStools/proc/provider_rm_conf.py | 15 +++++++++------ 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 65eba53b..109bb670 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -95,8 +95,6 @@ def processAlgorithm( self, parameters: dict, context: QgsProcessingContext, feedback: QgsProcessingFeedback ) -> Dict[str, str]: s = QgsSettings() - feedback.pushInfo(f"Settingsfile: {s.fileName()}") - logger.log(f"Settingsfile: {s.fileName()}", 2) provider_name = self.parameterAsString(parameters, "ors_provider_name", context) provider_url = self.parameterAsString(parameters, "ors_provider_url", context) provider_api_key = self.parameterAsString(parameters, "ors_provider_api_key", context) @@ -104,8 +102,6 @@ def processAlgorithm( provider_overwrite = self.parameterAsBoolean(parameters, "ors_provider_timeout", context) current_config = s.value("ORStools/config") - feedback.pushInfo(str(ENDPOINTS)) - logger.log(str(ENDPOINTS), 2) if provider_name in [x["name"] for x in current_config["providers"]]: if provider_overwrite: msg = f"A provider with the name '{provider_name}' already exists. Replacement not yet implemented." @@ -117,7 +113,7 @@ def processAlgorithm( return {"OUTPUT": msg} else: existing_config = s.value("ORStools/config") - save_feedback1 = s.setValue( + s.setValue( "ORStools/config", { "providers": existing_config["providers"] @@ -132,11 +128,17 @@ def processAlgorithm( ] }, ) - save_feedback2 = s.sync() - saved_config = s.value("ORStools/config")['providers'] - logger.log(f"saved config: {saved_config, save_feedback1, save_feedback2}", 2) + s.sync() # this gives no feedback whatsover, so checking manually necessary: - return {"OUTPUT": f"new config added: {provider_name}"} + #testing writability of Config. + try: + with open(s.fileName(), 'a'): + pass + return {"OUTPUT": f"new config added: {provider_name}"} + except IOError as e: + return {"OUTPUT": f"new config has not been added: {e} | {s.fileName()}"} + + def createInstance(self): return self.__class__() diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 7cdadeae..5d1db924 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -77,15 +77,18 @@ def processAlgorithm( if len(found) > 0: del current_config["providers"][found[0]] s.setValue("ORStools/config", {"providers": current_config["providers"]}) - s.sync() - msg = self.tr(f"Old config deleted: {provider_name}") - + s.sync() # this gives no feedback whatsover, so checking manually necessary: + + #testing writability of Config. + try: + with open(s.fileName(), 'a'): + pass + msg = f"config deleted: {provider_name}" + except IOError as e: + msg = f"config couldn't been deleted: {e} | {s.fileName()}" else: msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") - # - feedback.pushInfo(msg) - logger.log(msg, 2) return {"OUTPUT": msg} def createInstance(self): From 826aaaa48d9c10eff1298e26258182623ad5ac25 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 12:36:32 +0200 Subject: [PATCH 54/70] hardeining config-algorithms (failed silently(!) on read-only locations) --- ORStools/proc/provider_add_conf.py | 15 ++++++++++++--- ORStools/proc/provider_get_confid_by_name.py | 5 ++++- ORStools/proc/provider_rm_conf.py | 18 +++++++++++++++++- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 80e52193..1e1f5aa3 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -130,9 +130,18 @@ def processAlgorithm( ] }, ) - s.sync() - - return {"OUTPUT": f"new config added: {provider_name}"} + s.sync() # this gives no feedback whatsover, so checking manually is necessary: + try: + with open(s.fileName(), 'a'): + pass + msg = f"config has been added: {provider_name}" + except IOError as e: + msg = f"config couldn't be added: {e} | {s.fileName()}" + + return { + "OUTPUT": msg, + "CONFIG": s.value("ORStools/config", {'providers': []})['providers'] + } def createInstance(self): return self.__class__() diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 6f7e869e..7ec6abde 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -84,7 +84,10 @@ def processAlgorithm( feedback.pushInfo(msg) logger.log(msg, 2) - return {"OUTPUT": result} + return { + "OUTPUT": result, + "CONFIG": s.value("ORStools/config", {'providers': []})['providers'] + } def createInstance(self): return self.__class__() diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 1e93a83d..8fededa9 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -38,6 +38,10 @@ QgsProcessingContext, QgsProcessingFeedback, ) +try: + from qgis.core import ProcessingAlgorithmFlags #only available >=3.36 +except: + pass from ORStools.utils import logger @@ -85,7 +89,10 @@ def processAlgorithm( # feedback.pushInfo(msg) logger.log(msg, 2) - return {"OUTPUT": msg} + return { + "OUTPUT": msg, + "CONFIG": s.value("ORStools/config", {'providers': []})['providers'] + } def createInstance(self): return self.__class__() @@ -103,3 +110,12 @@ def displayName(self) -> str: def tr(self, string: str, context=None) -> str: context = context or self.__class__.__name__ return QCoreApplication.translate(context, string) + + def flags(self): + base_flags = super.flags() + if Qgis.QGIS_VERSION_INT >= 33600: + return ProcessingAlgorithmFlags( + base_flags | ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox + ) + else: + return base_flags | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 From 8a7715e71460786e911daf4fe36b2fac4a1b295d Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 12:37:04 +0200 Subject: [PATCH 55/70] missed one... --- ORStools/proc/provider_rm_conf.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 8fededa9..b1a8a32b 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -81,8 +81,13 @@ def processAlgorithm( if len(found) > 0: del current_config["providers"][found[0]] s.setValue("ORStools/config", {"providers": current_config["providers"]}) - s.sync() - msg = self.tr(f"Old config deleted: {provider_name}") + s.sync() # this gives no feedback whatsover, so checking manually is necessary: + try: + with open(s.fileName(), 'a'): + pass + msg = f"config deleted: {provider_name}" + except IOError as e: + msg = f"config couldn't been deleted: {e} | {s.fileName()}" else: msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") From d78215875e01df9a2bb069826ab424678c8e0d5d Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 12:40:17 +0200 Subject: [PATCH 56/70] missed () --- ORStools/proc/provider_rm_conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index b1a8a32b..c35eabed 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -117,7 +117,7 @@ def tr(self, string: str, context=None) -> str: return QCoreApplication.translate(context, string) def flags(self): - base_flags = super.flags() + base_flags = super().flags() if Qgis.QGIS_VERSION_INT >= 33600: return ProcessingAlgorithmFlags( base_flags | ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox From e4fe05119b59cb3e4808499aeb24874e5bdf7aa1 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 12:43:56 +0200 Subject: [PATCH 57/70] Version check needs another import --- ORStools/proc/provider_rm_conf.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index c35eabed..33b8c510 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -37,6 +37,7 @@ QgsProcessingParameterString, QgsProcessingContext, QgsProcessingFeedback, + QGis ) try: from qgis.core import ProcessingAlgorithmFlags #only available >=3.36 @@ -118,7 +119,7 @@ def tr(self, string: str, context=None) -> str: def flags(self): base_flags = super().flags() - if Qgis.QGIS_VERSION_INT >= 33600: + if QGis.QGIS_VERSION_INT >= 33600: return ProcessingAlgorithmFlags( base_flags | ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox ) From c8e4da0a54e67c0d9f4e1f8adc1c9b6d723a90a1 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 12:45:51 +0200 Subject: [PATCH 58/70] small? --- ORStools/proc/provider_rm_conf.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 33b8c510..c6bd17dc 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -37,7 +37,7 @@ QgsProcessingParameterString, QgsProcessingContext, QgsProcessingFeedback, - QGis + Qgis ) try: from qgis.core import ProcessingAlgorithmFlags #only available >=3.36 @@ -119,7 +119,7 @@ def tr(self, string: str, context=None) -> str: def flags(self): base_flags = super().flags() - if QGis.QGIS_VERSION_INT >= 33600: + if Qgis.QGIS_VERSION_INT >= 33600: return ProcessingAlgorithmFlags( base_flags | ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox ) From 372ebbc6ba4c2f7bdf48c63792c0c5366b5ba777 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:00:03 +0200 Subject: [PATCH 59/70] bitwise addition is not working anymore... --- ORStools/proc/provider_rm_conf.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index c6bd17dc..67498685 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -119,9 +119,9 @@ def tr(self, string: str, context=None) -> str: def flags(self): base_flags = super().flags() - if Qgis.QGIS_VERSION_INT >= 33600: - return ProcessingAlgorithmFlags( - base_flags | ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox - ) + if Qgis.QGIS_VERSION_INT > 33600: + flags = ProcessingAlgorithmFlags(base_flags) + flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) + return flags else: return base_flags | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 From 68b90d7ae93832ca134b785ea00be7ac4ef65857 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:03:01 +0200 Subject: [PATCH 60/70] almost...? --- ORStools/proc/provider_rm_conf.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 67498685..34b723eb 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -118,10 +118,9 @@ def tr(self, string: str, context=None) -> str: return QCoreApplication.translate(context, string) def flags(self): - base_flags = super().flags() if Qgis.QGIS_VERSION_INT > 33600: - flags = ProcessingAlgorithmFlags(base_flags) + flags = ProcessingAlgorithmFlags(set(super().flags)) flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) return flags else: - return base_flags | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 + return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 From 0cc6cd6ebee6441b3becd5f273b52f580f5a7add Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:04:25 +0200 Subject: [PATCH 61/70] missed () --- ORStools/proc/provider_rm_conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 34b723eb..796dfd3a 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -119,7 +119,7 @@ def tr(self, string: str, context=None) -> str: def flags(self): if Qgis.QGIS_VERSION_INT > 33600: - flags = ProcessingAlgorithmFlags(set(super().flags)) + flags = ProcessingAlgorithmFlags(set(super().flags())) flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) return flags else: From d5a726632b04a2682b47ac64e5daa16ee293e951 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:05:32 +0200 Subject: [PATCH 62/70] odd. --- ORStools/proc/provider_rm_conf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 796dfd3a..93a7120d 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -119,7 +119,7 @@ def tr(self, string: str, context=None) -> str: def flags(self): if Qgis.QGIS_VERSION_INT > 33600: - flags = ProcessingAlgorithmFlags(set(super().flags())) + flags = ProcessingAlgorithmFlags() flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) return flags else: From 801e4e56e71cfca49200643c92926179c73ecd32 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:06:19 +0200 Subject: [PATCH 63/70] only old version... --- ORStools/proc/provider_rm_conf.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 93a7120d..c99af367 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -118,9 +118,9 @@ def tr(self, string: str, context=None) -> str: return QCoreApplication.translate(context, string) def flags(self): - if Qgis.QGIS_VERSION_INT > 33600: - flags = ProcessingAlgorithmFlags() - flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) - return flags - else: - return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 + # if Qgis.QGIS_VERSION_INT > 33600: + # flags = ProcessingAlgorithmFlags() + # flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) + # return flags + # else: + return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 From 0111a3a68ceb5d9230476f8c831d438d570e4497 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:07:48 +0200 Subject: [PATCH 64/70] old handling seems to work in new version too...I use that until it doesnt... --- ORStools/proc/provider_rm_conf.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index c99af367..b2d64ef8 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -118,9 +118,4 @@ def tr(self, string: str, context=None) -> str: return QCoreApplication.translate(context, string) def flags(self): - # if Qgis.QGIS_VERSION_INT > 33600: - # flags = ProcessingAlgorithmFlags() - # flags.addFlag(ProcessingAlgorithmFlags.ProcessingAlgorithmFlag.HideFromToolbox) - # return flags - # else: - return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 + return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 but seems to work in 3.42, too From 84b070870d1648e72a6a4665b54a5b30bc8337d6 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:08:43 +0200 Subject: [PATCH 65/70] and to other algorithms too --- ORStools/proc/provider_add_conf.py | 3 +++ ORStools/proc/provider_get_confid_by_name.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 1e1f5aa3..f34e33f3 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -160,3 +160,6 @@ def tr(self, string: str, context=None) -> str: context = context or self.__class__.__name__ return QCoreApplication.translate(context, string) # return string #disabling QCoreApplication.translate due to Qt + + def flags(self): + return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 but seems to work in 3.42, too diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index 7ec6abde..acc5b505 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -105,3 +105,6 @@ def displayName(self) -> str: def tr(self, string: str, context=None) -> str: context = context or self.__class__.__name__ return QCoreApplication.translate(context, string) + + def flags(self): + return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 but seems to work in 3.42, too From 1f319edf04a2732fdcb8a61d08634d65ab48157a Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:16:49 +0200 Subject: [PATCH 66/70] ran ruff --- ORStools/proc/provider_rm_conf.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index b2d64ef8..edfcf34f 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -36,13 +36,8 @@ QgsProcessingAlgorithm, QgsProcessingParameterString, QgsProcessingContext, - QgsProcessingFeedback, - Qgis + QgsProcessingFeedback ) -try: - from qgis.core import ProcessingAlgorithmFlags #only available >=3.36 -except: - pass from ORStools.utils import logger From 0f14fc26e4c88a3fa105cf6f4e183978f207d434 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Tue, 1 Jul 2025 13:19:23 +0200 Subject: [PATCH 67/70] ran ruff 2 --- ORStools/proc/provider_add_conf.py | 8 +++++--- ORStools/proc/provider_get_confid_by_name.py | 6 ++++-- ORStools/proc/provider_rm_conf.py | 17 ++++++++--------- 3 files changed, 17 insertions(+), 14 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index f34e33f3..91f8b0c1 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -132,7 +132,7 @@ def processAlgorithm( ) s.sync() # this gives no feedback whatsover, so checking manually is necessary: try: - with open(s.fileName(), 'a'): + with open(s.fileName(), "a"): pass msg = f"config has been added: {provider_name}" except IOError as e: @@ -140,7 +140,7 @@ def processAlgorithm( return { "OUTPUT": msg, - "CONFIG": s.value("ORStools/config", {'providers': []})['providers'] + "CONFIG": s.value("ORStools/config", {"providers": []})["providers"], } def createInstance(self): @@ -162,4 +162,6 @@ def tr(self, string: str, context=None) -> str: # return string #disabling QCoreApplication.translate due to Qt def flags(self): - return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 but seems to work in 3.42, too + return ( + super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox + ) # prior 3.36 but seems to work in 3.42, too diff --git a/ORStools/proc/provider_get_confid_by_name.py b/ORStools/proc/provider_get_confid_by_name.py index acc5b505..fd55b7c2 100644 --- a/ORStools/proc/provider_get_confid_by_name.py +++ b/ORStools/proc/provider_get_confid_by_name.py @@ -86,7 +86,7 @@ def processAlgorithm( logger.log(msg, 2) return { "OUTPUT": result, - "CONFIG": s.value("ORStools/config", {'providers': []})['providers'] + "CONFIG": s.value("ORStools/config", {"providers": []})["providers"], } def createInstance(self): @@ -107,4 +107,6 @@ def tr(self, string: str, context=None) -> str: return QCoreApplication.translate(context, string) def flags(self): - return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 but seems to work in 3.42, too + return ( + super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox + ) # prior 3.36 but seems to work in 3.42, too diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index edfcf34f..79aebd81 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -36,7 +36,7 @@ QgsProcessingAlgorithm, QgsProcessingParameterString, QgsProcessingContext, - QgsProcessingFeedback + QgsProcessingFeedback, ) from ORStools.utils import logger @@ -77,9 +77,9 @@ def processAlgorithm( if len(found) > 0: del current_config["providers"][found[0]] s.setValue("ORStools/config", {"providers": current_config["providers"]}) - s.sync() # this gives no feedback whatsover, so checking manually is necessary: + s.sync() # this gives no feedback whatsover, so checking manually is necessary: try: - with open(s.fileName(), 'a'): + with open(s.fileName(), "a"): pass msg = f"config deleted: {provider_name}" except IOError as e: @@ -90,10 +90,7 @@ def processAlgorithm( # feedback.pushInfo(msg) logger.log(msg, 2) - return { - "OUTPUT": msg, - "CONFIG": s.value("ORStools/config", {'providers': []})['providers'] - } + return {"OUTPUT": msg, "CONFIG": s.value("ORStools/config", {"providers": []})["providers"]} def createInstance(self): return self.__class__() @@ -111,6 +108,8 @@ def displayName(self) -> str: def tr(self, string: str, context=None) -> str: context = context or self.__class__.__name__ return QCoreApplication.translate(context, string) - + def flags(self): - return super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox #prior 3.36 but seems to work in 3.42, too + return ( + super().flags() | QgsProcessingAlgorithm.FlagHideFromToolbox + ) # prior 3.36 but seems to work in 3.42, too From e63a4d66dd3321e2093a2442dda6b84d4e6540cf Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 2 Jul 2025 09:55:40 +0200 Subject: [PATCH 68/70] Revert "Merge branch 'qgis_process_ready_bigfileisochrones' into qgis_process_ready" This reverts commit ac8b692282599c78bee98ef9d615ede7c6f4141e, reversing changes made to 0f14fc26e4c88a3fa105cf6f4e183978f207d434. --- ORStools/proc/directions_lines_proc.py | 6 ------ ORStools/proc/directions_points_layer_proc.py | 6 ------ ORStools/proc/directions_points_layers_proc.py | 6 ------ ORStools/proc/export_proc.py | 11 ----------- ORStools/proc/isochrones_layer_proc.py | 18 +++--------------- ORStools/proc/isochrones_point_proc.py | 6 ------ ORStools/proc/matrix_proc.py | 6 ------ ORStools/proc/provider_add_conf.py | 2 ++ ORStools/proc/provider_rm_conf.py | 3 ++- ORStools/proc/snap_layer_proc.py | 6 ------ ORStools/proc/snap_point_proc.py | 6 ------ 11 files changed, 7 insertions(+), 69 deletions(-) diff --git a/ORStools/proc/directions_lines_proc.py b/ORStools/proc/directions_lines_proc.py index 2797ffa0..07034d8c 100644 --- a/ORStools/proc/directions_lines_proc.py +++ b/ORStools/proc/directions_lines_proc.py @@ -252,12 +252,6 @@ def processAlgorithm( feedback.setProgress(int(100.0 / count * num)) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/directions_points_layer_proc.py b/ORStools/proc/directions_points_layer_proc.py index f4460fb0..e548c2f8 100644 --- a/ORStools/proc/directions_points_layer_proc.py +++ b/ORStools/proc/directions_points_layer_proc.py @@ -293,12 +293,6 @@ def sort(f): feedback.setProgress(int(100.0 / count * num)) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/directions_points_layers_proc.py b/ORStools/proc/directions_points_layers_proc.py index 61cbd04c..185e83cb 100644 --- a/ORStools/proc/directions_points_layers_proc.py +++ b/ORStools/proc/directions_points_layers_proc.py @@ -267,12 +267,6 @@ def sort_end(f): counter += 1 feedback.setProgress(int(100.0 / route_count * counter)) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} @staticmethod diff --git a/ORStools/proc/export_proc.py b/ORStools/proc/export_proc.py index 564b640a..d45d2713 100644 --- a/ORStools/proc/export_proc.py +++ b/ORStools/proc/export_proc.py @@ -154,17 +154,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) - sink_line.flushBuffer() - if hasattr(sink_line, "finalize"): - sink_line.finalize() - else: - del sink_line - - sink_point.flushBuffer() - if hasattr(sink_point, "finalize"): - sink_point.finalize() - else: - del sink_point return {self.OUT: dest_id_line, self.OUT_POINT: dest_id_point} @staticmethod diff --git a/ORStools/proc/isochrones_layer_proc.py b/ORStools/proc/isochrones_layer_proc.py index b2bae85c..4bccbd9d 100644 --- a/ORStools/proc/isochrones_layer_proc.py +++ b/ORStools/proc/isochrones_layer_proc.py @@ -188,7 +188,7 @@ def processAlgorithm( # reactivated self.crs_out, ) - errorids = [] + for num, params in enumerate(requests): if feedback.isCanceled(): break @@ -206,26 +206,14 @@ def processAlgorithm( except (exceptions.ApiError, exceptions.InvalidKey, exceptions.GenericServerError) as e: msg = f"Feature ID {params['id']} caused a {e.__class__.__name__}:\n{str(e)}" - errorids.append(params['id']) feedback.reportError(msg) logger.log(msg, 2) continue if self.IS_CLI and num % 100 == 0: print(f"Done {num} from {source.featureCount()}", flush=True) feedback.setProgress(int(100.0 / source.featureCount() * num)) - if int(100.0 / source.featureCount() * num) == 100: - feedback.pushDebugInfo(str(self.dest_id)) - - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - - return { - self.OUT: self.dest_id, - "no_isochrones_for": errorids, - } + + return {self.OUT: self.dest_id} # noinspection PyUnusedLocal def postProcessAlgorithm( diff --git a/ORStools/proc/isochrones_point_proc.py b/ORStools/proc/isochrones_point_proc.py index 1595bf5f..41e85973 100644 --- a/ORStools/proc/isochrones_point_proc.py +++ b/ORStools/proc/isochrones_point_proc.py @@ -167,12 +167,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg, 2) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: self.dest_id} # noinspection PyUnusedLocal diff --git a/ORStools/proc/matrix_proc.py b/ORStools/proc/matrix_proc.py index 1d254c38..347d7088 100644 --- a/ORStools/proc/matrix_proc.py +++ b/ORStools/proc/matrix_proc.py @@ -216,12 +216,6 @@ def processAlgorithm( sink.addFeature(feat) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} # TODO working source_type and destination_type differ in both name and type from get_fields in directions_core. diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 1b0a339d..91f8b0c1 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -102,6 +102,8 @@ def processAlgorithm( provider_overwrite = self.parameterAsBoolean(parameters, "ors_provider_timeout", context) current_config = s.value("ORStools/config") + feedback.pushInfo(str(ENDPOINTS)) + logger.log(str(ENDPOINTS), 2) if provider_name in [x["name"] for x in current_config["providers"]]: if provider_overwrite: msg = f"A provider with the name '{provider_name}' already exists. Replacement not yet implemented." diff --git a/ORStools/proc/provider_rm_conf.py b/ORStools/proc/provider_rm_conf.py index 97d5beb6..79aebd81 100644 --- a/ORStools/proc/provider_rm_conf.py +++ b/ORStools/proc/provider_rm_conf.py @@ -86,7 +86,8 @@ def processAlgorithm( msg = f"config couldn't been deleted: {e} | {s.fileName()}" else: msg = self.tr(f"Old config not found! - {provider_name} - and is therfore not deleted.") - + + # feedback.pushInfo(msg) logger.log(msg, 2) return {"OUTPUT": msg, "CONFIG": s.value("ORStools/config", {"providers": []})["providers"]} diff --git a/ORStools/proc/snap_layer_proc.py b/ORStools/proc/snap_layer_proc.py index d4f17a26..9e606ba0 100644 --- a/ORStools/proc/snap_layer_proc.py +++ b/ORStools/proc/snap_layer_proc.py @@ -135,12 +135,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} def displayName(self) -> str: diff --git a/ORStools/proc/snap_point_proc.py b/ORStools/proc/snap_point_proc.py index 1a0a74c9..039feb95 100644 --- a/ORStools/proc/snap_point_proc.py +++ b/ORStools/proc/snap_point_proc.py @@ -120,12 +120,6 @@ def processAlgorithm( feedback.reportError(msg) logger.log(msg) - sink.flushBuffer() - if hasattr(sink, "finalize"): - sink.finalize() - else: - del sink - return {self.OUT: dest_id} def displayName(self) -> str: From bef22ee463a74d362c77382edd38d5762d42a225 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 2 Jul 2025 10:07:46 +0200 Subject: [PATCH 69/70] cleanup missed debug-feedback --- ORStools/proc/provider_add_conf.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ORStools/proc/provider_add_conf.py b/ORStools/proc/provider_add_conf.py index 91f8b0c1..1b0a339d 100644 --- a/ORStools/proc/provider_add_conf.py +++ b/ORStools/proc/provider_add_conf.py @@ -102,8 +102,6 @@ def processAlgorithm( provider_overwrite = self.parameterAsBoolean(parameters, "ors_provider_timeout", context) current_config = s.value("ORStools/config") - feedback.pushInfo(str(ENDPOINTS)) - logger.log(str(ENDPOINTS), 2) if provider_name in [x["name"] for x in current_config["providers"]]: if provider_overwrite: msg = f"A provider with the name '{provider_name}' already exists. Replacement not yet implemented." From 7ed7b26dce0a815f6bc476c29b7fee0724ac8457 Mon Sep 17 00:00:00 2001 From: Janne Jakob Fleischer Date: Wed, 2 Jul 2025 10:32:57 +0200 Subject: [PATCH 70/70] hopefully fixing test for adding a provider --- tests/test_proc.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_proc.py b/tests/test_proc.py index be0fd447..4b5c5a68 100644 --- a/tests/test_proc.py +++ b/tests/test_proc.py @@ -297,7 +297,7 @@ def test_add_provider(self): # Validate the result self.assertIn("OUTPUT", result) - self.assertEqual(result["OUTPUT"], "new config added: TestProvider") + self.assertEqual(result["OUTPUT"], "config has been added: TestProvider") # Verify the provider was added to the settings settings = QgsSettings() @@ -310,3 +310,4 @@ def test_add_provider(self): provider for provider in providers if provider["name"] != "TestProvider" ] settings.setValue("ORStools/config", config) + settings.sync()