1717from bw2io .extractors import Ecospold2DataExtractor
1818from PySide2 import QtCore , QtWidgets
1919from PySide2 .QtCore import Signal , Slot
20+ from bw2io .importers import Ecospold2BiosphereImporter
2021from py7zr import py7zr
2122
22- from activity_browser import log
23+ from activity_browser import log , project_settings
2324from activity_browser .bwutils import errors
2425from activity_browser .mod import bw2data as bd
26+ from activity_browser .mod .bw2data import databases
27+ from activity_browser .bwutils .ecoinvent_biosphere_versions .ecospold2biosphereimporter import (
28+ ABEcospold2BiosphereImporter ,
29+ )
2530
2631from ...bwutils .importers import ABExcelImporter , ABPackage
2732from ...info import __ei_versions__
2833from ...utils import sort_semantic_versions
2934from ..style import style_group_box
3035from ..threading import ABThread
3136from ..widgets import DatabaseLinkingDialog
37+ from ..widgets .biosphere_update import UpdateBiosphereThread
3238
3339
3440class DatabaseImportWizard (QtWidgets .QWizard ):
@@ -37,13 +43,14 @@ class DatabaseImportWizard(QtWidgets.QWizard):
3743 LOCAL_TYPE = 3
3844 EI_LOGIN = 4
3945 EI_VERSION = 5
40- ARCHIVE = 6
41- DIR = 7
42- LOCAL = 8
43- EXCEL = 9
44- DB_NAME = 10
45- CONFIRM = 11
46- IMPORT = 12
46+ DB_BIOSPHERE_CREATION = 6
47+ ARCHIVE = 7
48+ DIR = 8
49+ LOCAL = 9
50+ EXCEL = 10
51+ DB_NAME = 11
52+ CONFIRM = 12
53+ IMPORT = 13
4754
4855 def __init__ (self , parent = None ):
4956 super ().__init__ (parent )
@@ -60,6 +67,7 @@ def __init__(self, parent=None):
6067 self .local_page = LocalImportPage (self )
6168 self .ecoinvent_login_page = EcoinventLoginPage (self )
6269 self .ecoinvent_version_page = EcoinventVersionPage (self )
70+ self .biosphere_database_setup = BiosphereDatabaseSetup (self )
6371 self .archive_page = Choose7zArchivePage (self )
6472 self .choose_dir_page = ChooseDirPage (self )
6573 self .local_import_page = LocalDatabaseImportPage (self )
@@ -72,6 +80,7 @@ def __init__(self, parent=None):
7280 self .setPage (self .LOCAL_TYPE , self .local_page )
7381 self .setPage (self .EI_LOGIN , self .ecoinvent_login_page )
7482 self .setPage (self .EI_VERSION , self .ecoinvent_version_page )
83+ self .setPage (self .DB_BIOSPHERE_CREATION , self .biosphere_database_setup )
7584 self .setPage (self .ARCHIVE , self .archive_page )
7685 self .setPage (self .DIR , self .choose_dir_page )
7786 self .setPage (self .LOCAL , self .local_import_page )
@@ -515,8 +524,12 @@ def initializePage(self):
515524 )
516525 else :
517526 self .path_label .setText (
518- "Ecoinvent version: <b>{}</b><br>Ecoinvent system model: <b>{}</b>" .format (
519- self .wizard .version , self .wizard .system_model
527+ "Ecoinvent version: <b>{}</b><br>"
528+ "Ecoinvent system model: <b>{}</b><br>"
529+ "Dependent Database: <b>{}</b>" .format (
530+ self .wizard .version ,
531+ self .wizard .system_model ,
532+ bd .preferences ["biosphere_database" ],
520533 )
521534 )
522535
@@ -1140,7 +1153,7 @@ def __init__(self, parent=None):
11401153 "Choose ecoinvent version and system model:"
11411154 )
11421155 self .db_dict = None
1143- self .system_models = {}
1156+ self .requires_database_creation = False
11441157 self .version_combobox = QtWidgets .QComboBox ()
11451158 self .version_combobox .currentTextChanged .connect (
11461159 self .update_system_model_combobox
@@ -1186,9 +1199,13 @@ def validatePage(self):
11861199 version = self .version_combobox .currentText ()
11871200 bd .preferences ["biosphere_database" ] = "ecoinvent-{}-biosphere" .format (version )
11881201 bd .preferences .flush ()
1202+ if bd .preferences ["biosphere_database" ] not in databases :
1203+ self .requires_database_creation = True
11891204 return True
11901205
11911206 def nextId (self ):
1207+ if self .requires_database_creation :
1208+ return DatabaseImportWizard .DB_BIOSPHERE_CREATION
11921209 return DatabaseImportWizard .DB_NAME
11931210
11941211 @Slot (str )
@@ -1202,6 +1219,100 @@ def update_system_model_combobox(self, version: str) -> None:
12021219 self .system_model_combobox .addItems (items )
12031220
12041221
1222+ class VersionedBiosphereThread (UpdateBiosphereThread ):
1223+ update = Signal (int , str )
1224+
1225+ def __init__ (self , version , parent = None ):
1226+ # reduce biosphere update list up to the selected version
1227+ sorted_versions = sort_semantic_versions (
1228+ __ei_versions__ , highest_to_lowest = False
1229+ )
1230+ ei_versions = sorted_versions [: sorted_versions .index (version ) + 1 ]
1231+ super ().__init__ (ei_versions , parent = parent )
1232+ self .version = version
1233+
1234+ def run_safely (self ):
1235+ project = f"<b>{ bd .projects .current } </b>"
1236+ if bd .preferences ["biosphere_database" ] not in bd .databases :
1237+ self .update .emit (
1238+ 0 ,
1239+ "Creating {} database for {}" .format (
1240+ bd .preferences ["biosphere_database" ], project
1241+ ),
1242+ )
1243+ self .create_biosphere3_database ()
1244+ project_settings .add_db (bd .preferences ["biosphere_database" ])
1245+
1246+ self .update .emit (
1247+ 1 ,
1248+ "Updating biosphere database" ,
1249+ )
1250+ super ().run_safely ()
1251+
1252+ def create_biosphere3_database (self ):
1253+ if self .version == sort_semantic_versions (__ei_versions__ )[0 ][:3 ]:
1254+ eb = Ecospold2BiosphereImporter (
1255+ name = bd .preferences ["biosphere_database" ], version = self .version
1256+ )
1257+ else :
1258+ eb = ABEcospold2BiosphereImporter (
1259+ name = bd .preferences ["biosphere_database" ], version = self .version
1260+ )
1261+ eb .apply_strategies ()
1262+ eb .write_database ()
1263+
1264+
1265+ class BiosphereDatabaseSetup (QtWidgets .QWizardPage ):
1266+ def __init__ (self , parent = None ):
1267+ super ().__init__ (parent = parent )
1268+ self .wizard : "DatabaseImportWizard" = self .parent ()
1269+ self .update_label = QtWidgets .QLabel ()
1270+ self .progressbar = QtWidgets .QProgressBar ()
1271+ self .progressbar .setRange (0 , 2 )
1272+ self .complete = False
1273+
1274+ box = QtWidgets .QGroupBox ("Creating biosphere database" )
1275+ box_layout = QtWidgets .QVBoxLayout ()
1276+ box_layout .addWidget (self .progressbar )
1277+ box_layout .addWidget (self .update_label )
1278+ box .setLayout (box_layout )
1279+ box .setStyleSheet (style_group_box .border_title )
1280+ layout = QtWidgets .QVBoxLayout ()
1281+ layout .addWidget (box )
1282+ self .setLayout (layout )
1283+
1284+ def isComplete (self ):
1285+ return self .complete
1286+
1287+ def initializePage (self ):
1288+ self .biosphere_thread = VersionedBiosphereThread (self .wizard .version , self )
1289+ self .biosphere_thread .update .connect (self .update_progress )
1290+ self .biosphere_thread .finished .connect (self .thread_finished )
1291+ self .biosphere_thread .start ()
1292+
1293+ def validatePage (self ):
1294+ return self .biosphere_thread .isFinished ()
1295+
1296+ @Slot (int , str , name = "updateThread" )
1297+ def update_progress (self , current : int , text : str ) -> None :
1298+ self .progressbar .setValue (current )
1299+ self .update_label .setText (text )
1300+
1301+ @Slot (int , name = "threadFinished" )
1302+ def thread_finished (self , result : int = None ) -> None :
1303+ self .progressbar .setMaximum (1 )
1304+ self .progressbar .setValue (1 )
1305+ if result and result != 0 :
1306+ self .update_label .setText ("Something went wrong..." )
1307+ else :
1308+ self .update_label .setText ("All Done" )
1309+ self .complete = True
1310+ self .completeChanged .emit ()
1311+
1312+ def nextId (self ):
1313+ return DatabaseImportWizard .DB_NAME
1314+
1315+
12051316class LocalDatabaseImportPage (QtWidgets .QWizardPage ):
12061317 def __init__ (self , parent = None ):
12071318 super ().__init__ (parent = parent )
0 commit comments