Skip to content

Commit a7d87e1

Browse files
committed
feat: add page to create versioned biosphere database
1 parent e6fa005 commit a7d87e1

1 file changed

Lines changed: 122 additions & 11 deletions

File tree

activity_browser/ui/wizards/db_import_wizard.py

Lines changed: 122 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,24 @@
1717
from bw2io.extractors import Ecospold2DataExtractor
1818
from PySide2 import QtCore, QtWidgets
1919
from PySide2.QtCore import Signal, Slot
20+
from bw2io.importers import Ecospold2BiosphereImporter
2021
from py7zr import py7zr
2122

22-
from activity_browser import log
23+
from activity_browser import log, project_settings
2324
from activity_browser.bwutils import errors
2425
from 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

2631
from ...bwutils.importers import ABExcelImporter, ABPackage
2732
from ...info import __ei_versions__
2833
from ...utils import sort_semantic_versions
2934
from ..style import style_group_box
3035
from ..threading import ABThread
3136
from ..widgets import DatabaseLinkingDialog
37+
from ..widgets.biosphere_update import UpdateBiosphereThread
3238

3339

3440
class 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+
12051316
class LocalDatabaseImportPage(QtWidgets.QWizardPage):
12061317
def __init__(self, parent=None):
12071318
super().__init__(parent=parent)

0 commit comments

Comments
 (0)