Skip to content

Commit 116228d

Browse files
committed
log filter
1 parent 8783d2f commit 116228d

File tree

5 files changed

+125
-59
lines changed

5 files changed

+125
-59
lines changed

.github/workflows/plugin-package.yml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ jobs:
3737
- name: Install qgis-plugin-ci
3838
run: pip install qgis-plugin-ci>=2.8.6
3939

40-
- name: 🌍 Push translations
41-
if: ${{ github.event_name == 'push' }}
42-
run: qgis-plugin-ci push-translation ${{ secrets.TX_TOKEN }}
43-
4440
- name: Package PyPI Packages
4541
run: ./scripts/package-pip-packages.sh
4642

@@ -50,7 +46,6 @@ jobs:
5046
qgis-plugin-ci -v package ${VERSION} \
5147
--allow-uncommitted-changes \
5248
--asset-path plugin/teksi_module_management_tool/libs \
53-
# --transifex-token "${{ secrets.TX_TOKEN }}"
5449
5550
- uses: actions/upload-artifact@v4
5651
with:

oqtopus/core/module_version.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class Type:
1111
RELEASE = "release"
1212
BRANCH = "branch"
1313
PULL_REQUEST = "pull_request"
14+
FROM_ZIP = "from_zip"
1415

1516
def __init__(
1617
self,
@@ -39,6 +40,8 @@ def __init__(
3940
pass
4041
elif self.type == ModuleVersion.Type.PULL_REQUEST:
4142
self.__parse_pull_request(json_payload)
43+
elif self.type == ModuleVersion.Type.FROM_ZIP:
44+
return
4245
else:
4346
raise ValueError(f"Unknown type '{type}'")
4447

oqtopus/core/package_prepare_task.py

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ def run(self):
5757
"""
5858

5959
try:
60-
if self.module_version is not None:
61-
self.__download_module_assets(self.module_version)
60+
if self.module_version is None:
61+
raise Exception(self.tr("No module version provided."))
6262

63-
self.__extract_zip_file(self.zip_file)
63+
self.__download_module_assets(self.module_version)
6464

6565
except Exception as e:
6666
# Handle any exceptions that occur during processing
@@ -69,27 +69,46 @@ def run(self):
6969

7070
def __download_module_assets(self, module_version):
7171

72+
# Download the source
73+
zip_file = self.__download_module_asset(module_version.download_url, "source.zip")
74+
package_dir = self.__extract_zip_file(zip_file)
75+
module_version.package_dir = package_dir
76+
77+
# Download the release assets
78+
self.__checkForCanceled()
7279
if module_version.asset_datamodel is not None:
73-
self.__download_module_asset(module_version.asset_datamodel)
80+
zip_file = self.__download_module_asset(
81+
module_version.asset_datamodel.download_url,
82+
module_version.asset_datamodel.type.value + ".zip",
83+
)
84+
package_dir = self.__extract_zip_file(zip_file)
85+
module_version.asset_datamodel.package_dir = package_dir
7486

7587
self.__checkForCanceled()
7688
if module_version.asset_project is not None:
77-
self.__download_module_asset(module_version.asset_project)
89+
zip_file = self.__download_module_asset(
90+
module_version.asset_project.download_url,
91+
module_version.asset_project.type.value + ".zip",
92+
)
93+
package_dir = self.__extract_zip_file(zip_file)
94+
module_version.asset_project.package_dir = package_dir
7895

7996
self.__checkForCanceled()
8097
if module_version.asset_plugin is not None:
81-
self.__download_module_asset(module_version.asset_plugin)
82-
83-
def __download_module_asset(self, module_asset):
98+
zip_file = self.__download_module_asset(
99+
module_version.asset_plugin.download_url,
100+
module_version.asset_plugin.type.value + ".zip",
101+
)
102+
package_dir = self.__extract_zip_file(zip_file)
103+
module_version.asset_plugin.package_dir = package_dir
84104

85-
url = module_asset.download_url
86-
filename = module_asset.type.value + ".zip"
105+
def __download_module_asset(self, url: str, filename: str):
87106

88107
temp_dir = PluginUtils.plugin_temp_path()
89108
destination_directory = os.path.join(temp_dir, "Downloads")
90109
os.makedirs(destination_directory, exist_ok=True)
91110

92-
self.zip_file = os.path.join(destination_directory, filename)
111+
zip_file = os.path.join(destination_directory, filename)
93112

94113
# Streaming, so we can iterate over the response.
95114
response = requests.get(url, allow_redirects=True, stream=True)
@@ -99,9 +118,9 @@ def __download_module_asset(self, module_asset):
99118

100119
self.__checkForCanceled()
101120

102-
logger.info(f"Downloading from '{url}' to '{self.zip_file}'")
121+
logger.info(f"Downloading from '{url}' to '{zip_file}'")
103122
data_size = 0
104-
with open(self.zip_file, "wb") as file:
123+
with open(zip_file, "wb") as file:
105124
next_emit_threshold = 10 * 1024 * 1024 # 10MB threshold
106125
for data in response.iter_content(chunk_size=None):
107126
file.write(data)
@@ -113,6 +132,8 @@ def __download_module_asset(self, module_asset):
113132
self.signalPackagingProgress.emit(data_size)
114133
next_emit_threshold += 10 * 1024 * 1024 # Update to the next threshold
115134

135+
return zip_file
136+
116137
def __extract_zip_file(self, zip_file):
117138
temp_dir = PluginUtils.plugin_temp_path()
118139

@@ -121,16 +142,18 @@ def __extract_zip_file(self, zip_file):
121142
with zipfile.ZipFile(zip_file, "r") as zip_ref:
122143
# Find the top-level directory
123144
zip_dirname = zip_ref.namelist()[0].split("/")[0]
124-
self.package_dir = os.path.join(temp_dir, zip_dirname)
145+
package_dir = os.path.join(temp_dir, zip_dirname)
125146

126-
if os.path.exists(self.package_dir):
127-
shutil.rmtree(self.package_dir)
147+
if os.path.exists(package_dir):
148+
shutil.rmtree(package_dir)
128149

129150
zip_ref.extractall(temp_dir)
130151

131152
except zipfile.BadZipFile:
132153
raise Exception(self.tr(f"The selected file '{zip_file}' is not a valid zip archive."))
133154

155+
return package_dir
156+
134157
def __checkForCanceled(self):
135158
"""
136159
Check if the task has been canceled.

oqtopus/gui/main_dialog.py

Lines changed: 77 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import logging
2626
import os
2727
import shutil
28+
import traceback
2829

2930
import psycopg
3031
from qgis.PyQt.QtCore import Qt, QUrl
@@ -41,6 +42,7 @@
4142
)
4243

4344
from ..core.module import Module
45+
from ..core.module_version import ModuleVersion
4446
from ..core.package_prepare_task import PackagePrepareTask
4547
from ..libs import pgserviceparser
4648
from ..libs.pum.config import PumConfig
@@ -56,7 +58,6 @@
5658

5759
class MainDialog(QDialog, DIALOG_UI):
5860

59-
MODULE_VERSION_SPECIAL_LOAD_FROM_ZIP = "Load from ZIP"
6061
MODULE_VERSION_SPECIAL_LOAD_DEVELOPMENT = "Load development versions"
6162

6263
COLOR_GREEN = QColor(12, 167, 137)
@@ -66,7 +67,9 @@ def __init__(self, modules_config, parent=None):
6667
QDialog.__init__(self, parent)
6768
self.setupUi(self)
6869

69-
self.loggingBridge = LoggingBridge()
70+
self.loggingBridge = LoggingBridge(
71+
level=logging.NOTSET, excluded_modules=["urllib3.connectionpool"]
72+
)
7073
self.loggingBridge.loggedLine.connect(self.__logged_line)
7174
logging.getLogger().addHandler(self.loggingBridge)
7275

@@ -78,7 +81,6 @@ def __init__(self, modules_config, parent=None):
7881

7982
self.__database_connection = None
8083

81-
self.__package_dir = None
8284
self.__data_model_dir = None
8385
self.__pum_config = None
8486
self.__project_file = None
@@ -234,21 +236,42 @@ def __moduleChanged(self, index):
234236
logger.info(f"Loading versions for module '{self.__current_module.name}'...")
235237
QApplication.processEvents()
236238

237-
with OverrideCursor(Qt.WaitCursor):
238-
if self.__current_module.versions == list():
239-
self.__current_module.load_versions()
239+
try:
240+
with OverrideCursor(Qt.WaitCursor):
241+
if self.__current_module.versions == list():
242+
self.__current_module.load_versions()
240243

241-
for module_version in self.__current_module.versions:
242-
self.module_version_comboBox.addItem(module_version.display_name(), module_version)
244+
for module_version in self.__current_module.versions:
245+
self.module_version_comboBox.addItem(
246+
module_version.display_name(), module_version
247+
)
243248

244-
if self.__current_module.latest_version is not None:
245-
self.module_latestVersion_label.setText(
246-
f"Latest: {self.__current_module.latest_version.name}"
247-
)
249+
if self.__current_module.latest_version is not None:
250+
self.module_latestVersion_label.setText(
251+
f"Latest: {self.__current_module.latest_version.name}"
252+
)
253+
254+
except Exception as exception:
255+
msg_box = QMessageBox(self)
256+
msg_box.setIcon(QMessageBox.Critical)
257+
msg_box.setWindowTitle(self.tr("Error"))
258+
msg_box.setText(self.tr(f"Can't load module versions:\n{exception}"))
259+
details = "".join(
260+
traceback.format_exception(type(exception), exception, exception.__traceback__)
261+
)
262+
msg_box.setDetailedText(details)
263+
msg_box.exec_()
264+
return
248265

249266
self.module_version_comboBox.insertSeparator(self.module_version_comboBox.count())
250267
self.module_version_comboBox.addItem(
251-
self.tr("Load from ZIP file"), self.MODULE_VERSION_SPECIAL_LOAD_FROM_ZIP
268+
self.tr("Load from ZIP file"),
269+
ModuleVersion(
270+
organisation=self.__current_module.organisation,
271+
repository=self.__current_module.repository,
272+
json_payload=None,
273+
type=ModuleVersion.Type.FROM_ZIP,
274+
),
252275
)
253276

254277
self.module_version_comboBox.insertSeparator(self.module_version_comboBox.count())
@@ -258,12 +281,6 @@ def __moduleChanged(self, index):
258281

259282
def __moduleVersionChanged(self, index):
260283

261-
if self.module_version_comboBox.currentData() == self.MODULE_VERSION_SPECIAL_LOAD_FROM_ZIP:
262-
self.module_zipPackage_groupBox.setVisible(True)
263-
return
264-
else:
265-
self.module_zipPackage_groupBox.setVisible(False)
266-
267284
if (
268285
self.module_version_comboBox.currentData()
269286
== self.MODULE_VERSION_SPECIAL_LOAD_DEVELOPMENT
@@ -275,7 +292,12 @@ def __moduleVersionChanged(self, index):
275292
if current_module_version is None:
276293
return
277294

278-
self.__package_dir = None
295+
if current_module_version.type == current_module_version.Type.FROM_ZIP:
296+
self.module_zippackage_groupBox.setVisible(True)
297+
return
298+
else:
299+
self.module_zipPackage_groupBox.setVisible(False)
300+
279301
self.__data_model_dir = None
280302
self.__pum_config = None
281303
self.__project_file = None
@@ -336,7 +358,6 @@ def __moduleBrowseZipClicked(self):
336358

337359
def __loadModuleFromZip(self, filename):
338360

339-
self.__package_dir = None
340361
self.__data_model_dir = None
341362
self.__pum_config = None
342363
self.__project_file = None
@@ -352,27 +373,36 @@ def __packagePrepareTaskFinished(self):
352373

353374
if self.__packagePrepareTask.lastError is not None:
354375
error_text = f"Can't load module package:\n{self.__packagePrepareTask.lastError}"
376+
# Get the stack trace as a string
377+
details = "".join(
378+
traceback.format_exception(
379+
type(self.__packagePrepareTask.lastError),
380+
self.__packagePrepareTask.lastError,
381+
self.__packagePrepareTask.lastError.__traceback__,
382+
)
383+
)
384+
msg_box = QMessageBox(self)
385+
msg_box.setIcon(QMessageBox.Critical)
386+
msg_box.setWindowTitle(self.tr("Error"))
387+
msg_box.setText(self.tr(error_text))
388+
msg_box.setDetailedText(details)
389+
msg_box.exec_()
355390
self.module_information_label.setText(error_text)
356391
QtUtils.setForegroundColor(self.module_information_label, self.COLOR_WARNING)
357-
QMessageBox.critical(
358-
self,
359-
self.tr("Error"),
360-
self.tr(error_text),
361-
)
362392
return
363393

364-
self.__package_dir = self.__packagePrepareTask.package_dir
365-
logger.info(f"Package loaded into '{self.__package_dir}'")
366-
self.module_information_label.setText(self.__package_dir)
394+
package_dir = self.module_version_comboBox.currentData().package_dir
395+
logger.info(f"Package loaded into '{package_dir}'")
396+
self.module_information_label.setText(package_dir)
367397
QtUtils.resetForegroundColor(self.module_information_label)
368398

369399
self.__packagePrepareGetPUMConfig()
370400

371401
self.__packagePrepareGetProjectFilename()
372402

373403
def __packagePrepareGetPUMConfig(self):
374-
375-
self.__data_model_dir = os.path.join(self.__package_dir, "datamodel")
404+
package_dir = self.module_version_comboBox.currentData().package_dir
405+
self.__data_model_dir = os.path.join(package_dir, "datamodel")
376406
pumConfigFilename = os.path.join(self.__data_model_dir, ".pum.yaml")
377407
if not os.path.exists(pumConfigFilename):
378408
QMessageBox.critical(
@@ -416,7 +446,8 @@ def __packagePrepareGetPUMConfig(self):
416446

417447
def __packagePrepareGetProjectFilename(self):
418448
# Search for QGIS project file in self.__package_dir
419-
project_file_dir = os.path.join(self.__package_dir, "project")
449+
package_dir = self.module_version_comboBox.currentData().asset_project.package_dir
450+
project_file_dir = os.path.join(package_dir, "project")
420451

421452
# Check if the directory exists
422453
if not os.path.exists(project_file_dir):
@@ -678,25 +709,34 @@ def __projectInstallClicked(self):
678709
)
679710
return
680711

681-
current_module_version = self.module_version_comboBox.currentData()
682-
if current_module_version is None:
712+
if self.module_version_comboBox.currentData() is None:
683713
QMessageBox.warning(
684714
self,
685715
self.tr("Error"),
686716
self.tr("Please select a module version first."),
687717
)
688718
return
689719

690-
if self.__package_dir is None:
720+
asset_project = self.module_version_comboBox.currentData().asset_project
721+
if asset_project is None:
722+
QMessageBox.warning(
723+
self,
724+
self.tr("Error"),
725+
self.tr("No project asset available for this module version."),
726+
)
727+
return
728+
729+
package_dir = asset_project.package_dir
730+
if package_dir is None:
691731
QMessageBox.critical(
692732
self,
693733
self.tr("Error"),
694734
self.tr("No valid package directory available."),
695735
)
696736
return
697737

698-
# Search for QGIS project file in self.__package_dir
699-
project_file_dir = os.path.join(self.__package_dir, "project")
738+
# Search for QGIS project file in package_dir
739+
project_file_dir = os.path.join(package_dir, "project")
700740

701741
# Check if the directory exists
702742
if not os.path.exists(project_file_dir):

oqtopus/utils/plugin_utils.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,17 @@ class LoggingBridge(logging.Handler, QObject):
133133

134134
loggedLine = pyqtSignal(LogRecord, str)
135135

136-
def __init__(self, level=logging.NOTSET):
136+
def __init__(self, level=logging.NOTSET, excluded_modules=[]):
137137
QObject.__init__(self)
138138
logging.Handler.__init__(self, level)
139139

140140
self.formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s")
141141

142+
self.excluded_modules = excluded_modules
143+
144+
def filter(self, record):
145+
return record.name not in self.excluded_modules
146+
142147
def emit(self, record):
143148
log_entry = self.format(record)
144149
self.loggedLine.emit(record, log_entry)

0 commit comments

Comments
 (0)