diff --git a/canflood/_pars/WebConnections.ini b/canflood/_pars/WebConnections.ini index c5458000..18bbdc9c 100644 --- a/canflood/_pars/WebConnections.ini +++ b/canflood/_pars/WebConnections.ini @@ -6,7 +6,7 @@ url=http://preview.grid.unep.ch/geoserver/wcs?bbox=-180,-89,180,84&styles=&versi [NPRI] group=connections-arcgisfeatureserver\ECCC_NationalPollutantReleaseInventory_NPRI -url=https://maps-cartes.ec.gc.ca/arcgis/rest/services/NPRI_INRP/NPRI_INRP/MapServer +url=https://maps-cartes.ec.gc.ca/arcgis/rest/services/STB_DGST/NPRI/MapServer [NHSL] group=connections-arcgisfeatureserver\NRCan_NationalHumanSettlementLayer_NHSL diff --git a/canflood/misc/webConnections.py b/canflood/misc/webConnections.py index 9f4fffd1..d36a36d1 100644 --- a/canflood/misc/webConnections.py +++ b/canflood/misc/webConnections.py @@ -13,7 +13,7 @@ #python standards import os, logging, copy -from configparser import ConfigParser, RawConfigParser +from configparser import ConfigParser import numpy as np @@ -43,8 +43,12 @@ class WebConnectAction(QMenuAction): icon_location = 'menu' def launch(self): + + base_dir = os.path.dirname(os.path.dirname(__file__)) + newSettings_fp1=os.path.join(base_dir, r'_pars\WebConnections.ini') + #======================================================================= - # defai;ts + # defaults #======================================================================= log = self.logger.getChild('l') @@ -55,7 +59,7 @@ def launch(self): kwargs = {attn:getattr(self, attn) for attn in self.inherit_fieldNames} with WebConnect(**kwargs) as wrkr: newCons_d = wrkr.addAll() - + wrkr.read_connections(newSettings_fp1) #======================================================================= # wrap #======================================================================= @@ -80,11 +84,7 @@ def __init__(self, **kwargs): - - - - - super().__init__(**kwargs) #initilzie teh baseclass + super().__init__(**kwargs) #initilzie the baseclass #setup @@ -143,7 +143,60 @@ def retrieve_fromFile(self, #pull parameters from CanFlood's file return newCons_d + def read_connections(self, newSettings_fp = None): + config = ConfigParser() + config.read(newSettings_fp) + for section in config.sections(): + name = section + url = config.get(section, 'url', fallback="") + group = config.get(section, 'group', fallback="") + + if "connections-arcgisfeatureserver" in group: + self.add_arcgis_rest_connection(name, url) + elif "connections-wcs" in group: + self.add_wcs_connection(name, url) + elif "connections-wms" in group: + self.add_wms_connection(name, url) + else: + raise ValueError(f"Unknown connection type for '{name}': {url}. Group '{group}' is not recognized.") + + def add_arcgis_rest_connection(self, name, url): + settings = QgsSettings(self.qini_fp, QSettings.IniFormat) + base_key = f"connections/arcgisfeatureserver/items/{name}" + settings.setValue(f"{base_key}/url", url) + settings.setValue(f"{base_key}/username", "") + settings.setValue(f"{base_key}/password", "") + settings.setValue(f"{base_key}/authcfg", "") + settings.setValue(f"{base_key}/http-header", "@Variant(\0\0\0\b\0\0\0\0)") + settings.setValue("connections/arcgisfeatureserver/selected", name) + + settings.sync() + + def add_wcs_connection(self, name, url): + """Adds a Web Coverage Service (WCS) connection to QGIS.""" + settings = QgsSettings(self.qini_fp, QSettings.IniFormat) + base_key = f"connections/ows/items/wcs/connections/items/{name}" + + settings.setValue(f"{base_key}/url", url) + settings.setValue(f"{base_key}/username", "") + settings.setValue(f"{base_key}/password", "") + settings.setValue(f"{base_key}/authcfg", "") + + settings.sync() + + def add_wms_connection(self, name, url): + """Adds a WMS connection to QGIS settings.""" + settings = QgsSettings(self.qini_fp, QSettings.IniFormat) + base_key = f"connections/ows/items/wms/connections/items/{name}" + + settings.setValue(f"{base_key}/url", url) + settings.setValue(f"{base_key}/username", "") + settings.setValue(f"{base_key}/password", "") + settings.setValue(f"{base_key}/authcfg", "") + + settings.sync() + def addAll(self, #add all connections qini_fp = None, #users settings path newCons_d = None, #connections to load @@ -154,15 +207,13 @@ def addAll(self, #add all connections log = self.logger.getChild('addAll') if newCons_d is None: newCons_d = self.newCons_d if qini_fp is None: qini_fp = self.qini_fp - log.debug('addAll on %i'%len(newCons_d)) #======================================================================= # initilize settings #======================================================================= assert os.path.exists(qini_fp), 'bad settings filepath: %s'%qini_fp - usets = QgsSettings(qini_fp, QSettings.IniFormat) - + usets = QSettings(qini_fp, QSettings.IniFormat) #navigate to group1 """all connectins are in the qgis group""" usets.beginGroup('qgis') @@ -329,21 +380,4 @@ def checkSettings(self, return result, msg - - - - - - - -if __name__ =="__main__": - - - wrkr = WebConnect( - newSettings_fp = r'C:\LS\03_TOOLS\CanFlood\_git\canflood\_pars\WebConnections1.ini', - qini_fp = r'C:\Users\cefect\AppData\Roaming\QGIS\QGIS3\profiles\dev\QGIS\QGIS3.ini') #setup worker - - - wrkr.addAll() #add everything - \ No newline at end of file diff --git a/canflood/model/modcom.py b/canflood/model/modcom.py index 84213c09..281a81dc 100644 --- a/canflood/model/modcom.py +++ b/canflood/model/modcom.py @@ -2082,7 +2082,7 @@ def _par_hndl_chk(self, """ if logger is None: logger=self.logger - if absolute_fp= None: absolute_fp=self.aboslute_fp + if absolute_fp is None: absolute_fp=self.aboslute_fp log = logger.getChild('par_hndl_chk') #======================================================================= diff --git a/tests2/misct/test_webconnections.py b/tests2/misct/test_webconnections.py new file mode 100644 index 00000000..d6b2a522 --- /dev/null +++ b/tests2/misct/test_webconnections.py @@ -0,0 +1,60 @@ +import pytest +import configparser +from misc.webConnections import WebConnect +from PyQt5.QtCore import QSettings + +@pytest.fixture(scope="function") +def web_connect(tmpdir): + """Fixture to provide an instance of WebConnect with a temporary QGIS3.ini file.""" + qini_fp = tmpdir.join("QGIS3.ini") + qini_fp.write("[connections]\n") + + web_connect = WebConnect(qini_fp=str(qini_fp)) + + settings = QSettings(str(qini_fp), QSettings.IniFormat) + settings.clear() + settings.sync() + + yield web_connect + +@pytest.fixture(scope="function") +def create_config(tmpdir, config_content): + """Fixture to create a temporary config file with the specified content.""" + config = configparser.ConfigParser() + config.read_dict(config_content) + config_file_path = tmpdir.join("test_config.ini") + + with open(config_file_path, 'w') as configfile: + config.write(configfile) + + return str(config_file_path) + +@pytest.mark.parametrize( + "config_content, expected_key", + [ + ({"AutomaticallyExtractedBuildings": { + "group": "connections-wms\\NRCan_AutomaticallyExtractedBuildings", + "url": "https://maps.geogratis.gc.ca/wms/automatic_extraction_building_footprint_en?request=getcapabilities&service=wms&layers=automatic_extraction_building_footprint_en&version=1.3.0&legend_format=image/png&feature_info_type=text/html" + }}, "connections/ows/items/wms/connections/items/AutomaticallyExtractedBuildings/url"), + + ({"GAR15": { + "group": "connections-wcs\\UNISDR_GAR15_GlobalRiskAssessment", + "url": "http://preview.grid.unep.ch/geoserver/wcs" + }}, "connections/ows/items/wcs/connections/items/GAR15/url"), + + ({"NPRI": { + "group": "connections-arcgisfeatureserver\\ECCC_NationalPollutantReleaseInventory_NPRI", + "url": "http://preview.grid.unep.ch/geoserver/wcs?bbox=-180,-89,180,84&styles=&version=1.0.0&coverage=GAR2015:flood_hazard_1000_yrp&width=640&height=309&crs=EPSG:4326" + }}, "connections/arcgisfeatureserver/items/NPRI/url") + ] +) +def test_read_connections(web_connect, create_config, config_content, expected_key): + """Test the read_connections function and check expected QGIS3.ini structure.""" + config_path = create_config + + web_connect.read_connections(config_path) + + settings = QSettings(web_connect.qini_fp, QSettings.IniFormat) + settings.sync() + + assert expected_key in settings.allKeys(), f"Expected key '{expected_key}' was not found in the updated QGIS3.ini file"