2525import logging
2626import os
2727import shutil
28+ import traceback
2829
2930import psycopg
3031from qgis .PyQt .QtCore import Qt , QUrl
4142)
4243
4344from ..core .module import Module
45+ from ..core .module_version import ModuleVersion
4446from ..core .package_prepare_task import PackagePrepareTask
4547from ..libs import pgserviceparser
4648from ..libs .pum .config import PumConfig
5658
5759class 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 ):
0 commit comments