From 8b775853c62d142faff73546178898c77515e855 Mon Sep 17 00:00:00 2001 From: Mikael Vaaltola Date: Wed, 21 Jan 2026 15:31:28 +0200 Subject: [PATCH 1/2] Improve error handling on invalid API key --- nlsgpkgloader/nls_geopackage_loader.py | 83 +++++++++++++++++++++++++- 1 file changed, 80 insertions(+), 3 deletions(-) diff --git a/nlsgpkgloader/nls_geopackage_loader.py b/nlsgpkgloader/nls_geopackage_loader.py index ea98a4b..2cbd68a 100644 --- a/nlsgpkgloader/nls_geopackage_loader.py +++ b/nlsgpkgloader/nls_geopackage_loader.py @@ -256,6 +256,17 @@ def run(self): self.product_types = self.download_nls_product_types() + # If product types download failed (invalid key or other error), prompt for settings + if self.product_types is None: + res = self.show_settings_dialog() + if not res: + return + # Try downloading product types again with the new key + self.product_types = self.download_nls_product_types() + if self.product_types is None: + # Still failed, give up + return + self.municipalities_dialog = NLSGeoPackageLoaderMunicipalitySelectionDialog() self.municipalities_dialog.settingsPushButton.clicked.connect( @@ -739,8 +750,58 @@ def download_nls_product_types(self): # TODO: warn user of certification fail self.verify = False r = requests.get(url, verify=self.verify) + except requests.exceptions.RequestException as e: + QgsMessageLog.logMessage( + "Failed to connect to NLS service: " + str(e), "NLSgpkgloader", 2 + ) + QMessageBox.critical( + self.iface.mainWindow(), + self.tr("Connection Error"), + self.tr( + "Failed to connect to NLS service. Please check your internet connection." + ), + ) + return None + + # Check if the request was successful + if r.status_code != 200: + QgsMessageLog.logMessage( + "Invalid API key or service error. Status code: " + str(r.status_code), + "NLSgpkgloader", + 2, + ) + # Clear the invalid key from settings + set_setting("userKey", "") + self.nls_user_key = "" + QMessageBox.critical( + self.iface.mainWindow(), + self.tr("Invalid API Key"), + self.tr( + "The provided API key is invalid or the service is unavailable. " + "Please check your API key and try again." + ), + ) + return None - e = xml.etree.ElementTree.fromstring(r.text) + # Try to parse the XML response + try: + e = xml.etree.ElementTree.fromstring(r.text) + except xml.etree.ElementTree.ParseError as parse_error: + QgsMessageLog.logMessage( + "Failed to parse XML response: " + str(parse_error), "NLSgpkgloader", 2 + ) + # Clear the invalid key from settings + set_setting("userKey", "") + self.nls_user_key = "" + QMessageBox.critical( + self.iface.mainWindow(), + self.tr("Invalid API Response"), + self.tr( + "The API returned an invalid response. Your API key may be incorrect. " + "Please verify your API key and try again." + ), + ) + return None for entry in e.findall("{http://www.w3.org/2005/Atom}entry"): title = entry.find("{http://www.w3.org/2005/Atom}title") @@ -778,8 +839,24 @@ def download_one_file(self): url = self.all_urls[self.download_count][0] # QgsMessageLog.logMessage(url, 'NLSgpkgloader', 0) - r = requests.get(url, stream=True, verify=self.verify) - # TODO check r.status_code & r.ok + try: + r = requests.get(url, stream=True, verify=self.verify) + r.raise_for_status() + except requests.exceptions.RequestException as e: + QgsMessageLog.logMessage( + "Failed to download file: " + str(e), "NLSgpkgloader", 2 + ) + self.progress_dialog.hide() + QMessageBox.critical( + self.iface.mainWindow(), + self.tr("Download Error"), + self.tr( + "Failed to download file from NLS service. " + "This may indicate an invalid API key or network issue.\n\n" + "Error: {}" + ).format(str(e)), + ) + return url_parts = url.split("/") file_name = url_parts[-1].split("?")[0] From 9dc9c804dc4e934ffb81e39796d81a70eadead12 Mon Sep 17 00:00:00 2001 From: Mikael Vaaltola Date: Wed, 21 Jan 2026 15:41:35 +0200 Subject: [PATCH 2/2] Format --- nlsgpkgloader/nls_geopackage_loader.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/nlsgpkgloader/nls_geopackage_loader.py b/nlsgpkgloader/nls_geopackage_loader.py index 2cbd68a..8ac5144 100644 --- a/nlsgpkgloader/nls_geopackage_loader.py +++ b/nlsgpkgloader/nls_geopackage_loader.py @@ -256,7 +256,7 @@ def run(self): self.product_types = self.download_nls_product_types() - # If product types download failed (invalid key or other error), prompt for settings + # If product types download failed, prompt for settings if self.product_types is None: res = self.show_settings_dialog() if not res: @@ -758,7 +758,8 @@ def download_nls_product_types(self): self.iface.mainWindow(), self.tr("Connection Error"), self.tr( - "Failed to connect to NLS service. Please check your internet connection." + "Failed to connect to NLS service. " + "Please check your internet connection." ), ) return None @@ -797,7 +798,8 @@ def download_nls_product_types(self): self.iface.mainWindow(), self.tr("Invalid API Response"), self.tr( - "The API returned an invalid response. Your API key may be incorrect. " + "The API returned an invalid response. " + "Your API key may be incorrect. " "Please verify your API key and try again." ), )