From 2a6d0738fd56275ab41ffd7cffb7c6e33fb490af Mon Sep 17 00:00:00 2001 From: signedav Date: Thu, 22 Oct 2026 10:53:24 +0200 Subject: [PATCH 1/2] Model refresh functionality. To trigger the signal on every derivate of Cache. We don't assign the model directory, but take it from the base configuration, to be able to update base configuration and refresh. --- modelbaker/iliwrapper/ilicache.py | 55 ++++++++++++++++--------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/modelbaker/iliwrapper/ilicache.py b/modelbaker/iliwrapper/ilicache.py index 26eecb0..a73448a 100644 --- a/modelbaker/iliwrapper/ilicache.py +++ b/modelbaker/iliwrapper/ilicache.py @@ -56,6 +56,7 @@ class IliCache(QObject): ns = {"ili23": "http://www.interlis.ch/INTERLIS2.3"} new_message = pyqtSignal(int, str) + model_refreshed = pyqtSignal(int) CACHE_PATH = os.path.expanduser("~/.ilicache") @@ -67,13 +68,13 @@ def __init__( self.repositories = dict() self.base_configuration = configuration self.single_ili_file = single_ili_file - self.model = IliModelItemModel() + self.model = self.get_model() + self.model.modelReset.connect( + lambda: self.model_refreshed.emit(self.model.rowCount()) + ) self.sorted_model = QSortFilterProxyModel() self.sorted_model.setSourceModel(self.model) self.sorted_model.sort(0, Qt.SortOrder.AscendingOrder) - self.directories = None - if self.base_configuration: - self.directories = self.base_configuration.model_directories # refresh the models on changing values but avoid massive db connects by timer self.modelReposTimer = QTimer() @@ -82,13 +83,17 @@ def __init__( lambda: self.model.set_repositories(self.repositories) ) + def get_model(self): + return IliModelItemModel() + def set_repositories_to_model(self) -> None: # hold refresh back self.modelReposTimer.start(500) def refresh(self) -> None: - if not self.directories is None: - for directory in self.directories: + self.repositories = dict() + if not self.base_configuration.model_directories is None: + for directory in self.base_configuration.model_directories: self.process_model_directory(directory) if not self.single_ili_file is None: @@ -144,18 +149,24 @@ def download_repository(self, url: str) -> None: if os.path.isdir(url): # continue with the local file + found_anything = False if os.path.exists(information_file_url): self._process_informationfile(information_file_url, netloc, url) + found_anything = True else: logger.warning( self.tr("Could not find local file {}").format(information_file_url) ) if os.path.exists(ilisite_url): self._process_ilisite(ilisite_url) + found_anything = True else: logger.warning( self.tr("Could not find local file {}").format(ilisite_url) ) + if not found_anything: + # update repositories on dead end (when nothing has been found, then update with empty) + self.set_repositories_to_model() else: netloc_dir = os.path.join(self.CACHE_PATH, netloc) os.makedirs(netloc_dir, exist_ok=True) @@ -313,7 +324,6 @@ def process_local_ili_folder(self, path: str) -> None: self.repositories[path] = sorted( models, key=lambda m: m["version"], reverse=True ) - self.set_repositories_to_model() def process_ili_file(self, ilifile: str) -> list: @@ -413,6 +423,7 @@ def __init__(self, parent=None): super().__init__(0, 1, parent) def set_repositories(self, repositories: dict) -> None: + self.beginResetModel() self.clear() names = list() @@ -441,6 +452,7 @@ def set_repositories(self, repositories: dict) -> None: item.setData(model.get("file", ""), int(IliModelItemModel.Roles.FILE)) names.append(name) self.appendRow(item) + self.endResetModel() class ModelCompleterDelegate(QItemDelegate): @@ -502,7 +514,6 @@ class IliDataCache(IliCache): file_download_succeeded = pyqtSignal(str, str) file_download_failed = pyqtSignal(str, str) - model_refreshed = pyqtSignal(int) CACHE_PATH = os.path.expanduser("~/.ilidatacache") @@ -516,21 +527,13 @@ def __init__( IliCache.__init__(self, configuration) self.information_file = "ilidata.xml" - self.model = IliDataItemModel() - self.model.modelReset.connect( - lambda: self.model_refreshed.emit(self.model.rowCount()) - ) - self.sorted_model.setSourceModel(self.model) - self.sorted_model.sort(0, Qt.SortOrder.AscendingOrder) self.filter_models = models.split(";") if models else [] self.type = type - self.directories = ( - self.base_configuration.ilidata_directories - if self.base_configuration - else [] - ) self.datasources = datasources + def get_model(self): + return IliDataItemModel() + def process_model_directory(self, path: str) -> None: # download remote and local repositories self.download_repository(path) @@ -738,7 +741,6 @@ def _process_informationfile(self, file: str, netloc: str, url: str) -> None: key=lambda m: m["version"] if m["version"] else "0", reverse=True, ) - self.set_repositories_to_model() def download_file( @@ -930,9 +932,6 @@ def __init__( tool_dir: Optional[str] = None, ): IliDataCache.__init__(self, configuration) - self.model = IliToppingFileItemModel() - self.sorted_model.setSourceModel(self.model) - self.sorted_model.sort(0, Qt.SortOrder.AscendingOrder) self.file_ids = file_ids self.tool_dir = ( tool_dir @@ -948,9 +947,12 @@ def __init__( ) self.model.rowsInserted.connect(lambda: self.on_download_status(None)) + def get_model(self): + return IliToppingFileItemModel() + def refresh(self) -> None: - if not self.directories is None: - for directory in self.directories: + if not self.base_configuration.model_directories is None: + for directory in self.base_configuration.model_directories: self.process_model_directory(directory) # collect local files @@ -1063,7 +1065,6 @@ def _process_informationfile(self, file: str, netloc: str, url: str) -> None: key=lambda m: m["version"] if m["version"] else "0", reverse=True, ) - self.set_repositories_to_model() @@ -1083,6 +1084,7 @@ def __init__(self, parent=None): super().__init__(0, 1, parent) def set_repositories(self, repositories: dict) -> None: + self.beginResetModel() self.clear() ids = list() @@ -1116,3 +1118,4 @@ def set_repositories(self, repositories: dict) -> None: ids.append(toppingfile["id"]) self.appendRow(item) + self.endResetModel() From 887166d674aac13a5630a44d77dbce260948f67b Mon Sep 17 00:00:00 2001 From: signedav Date: Fri, 23 Oct 2026 08:44:34 +0200 Subject: [PATCH 2/2] Fix to use ilidata_directories on topping scan (like it did before) Change strange Yoda-like not is none if statement. Add comment to the ilidata_direcotries --- modelbaker/iliwrapper/ili2dbconfig.py | 2 ++ modelbaker/iliwrapper/ilicache.py | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/modelbaker/iliwrapper/ili2dbconfig.py b/modelbaker/iliwrapper/ili2dbconfig.py index 160da25..44513ef 100644 --- a/modelbaker/iliwrapper/ili2dbconfig.py +++ b/modelbaker/iliwrapper/ili2dbconfig.py @@ -111,6 +111,8 @@ def ilidata_directories(self) -> list: if self.custom_model_directories_enabled and self.custom_model_directories: dirs = self.custom_model_directories.split(";") else: + # this is adds model.opengis.ch to the repo scan (is linking to http://models.interlis.ch) + # this could be removed in future, when everyone uses their own data-repo and everywhere the models_directory can be used dirs = ["https://models.opengis.ch/"] return dirs diff --git a/modelbaker/iliwrapper/ilicache.py b/modelbaker/iliwrapper/ilicache.py index a73448a..64c4f30 100644 --- a/modelbaker/iliwrapper/ilicache.py +++ b/modelbaker/iliwrapper/ilicache.py @@ -92,11 +92,11 @@ def set_repositories_to_model(self) -> None: def refresh(self) -> None: self.repositories = dict() - if not self.base_configuration.model_directories is None: + if self.base_configuration.model_directories is not None: for directory in self.base_configuration.model_directories: self.process_model_directory(directory) - if not self.single_ili_file is None: + if self.single_ili_file is not None: if os.path.exists(self.single_ili_file): self.process_single_ili_file() @@ -951,8 +951,8 @@ def get_model(self): return IliToppingFileItemModel() def refresh(self) -> None: - if not self.base_configuration.model_directories is None: - for directory in self.base_configuration.model_directories: + if self.base_configuration.ilidata_directories is not None: + for directory in self.base_configuration.ilidata_directories: self.process_model_directory(directory) # collect local files