3
3
from typing import Iterable , Optional
4
4
5
5
import brightway2 as bw
6
- from bw2data .parameters import ActivityParameter
6
+ from bw2data .parameters import ActivityParameter , Group
7
7
from PySide2 import QtWidgets
8
8
from PySide2 .QtCore import QObject , Slot
9
9
from bw2data .backends .peewee import sqlite3_lci_db
@@ -79,6 +79,7 @@ def connect_signals(self):
79
79
signals .parameter_modified .connect (self .modify_parameter )
80
80
signals .parameter_uncertainty_modified .connect (self .modify_parameter_uncertainty )
81
81
signals .parameter_pedigree_modified .connect (self .modify_parameter_pedigree )
82
+ signals .clear_activity_parameter .connect (self .clear_broken_activity_parameter )
82
83
# Calculation Setups
83
84
signals .new_calculation_setup .connect (self .new_calculation_setup )
84
85
signals .rename_calculation_setup .connect (self .rename_calculation_setup )
@@ -267,7 +268,8 @@ def copy_database(self, name, parent):
267
268
except ValueError as e :
268
269
QtWidgets .QMessageBox .information (parent , "Not possible" , str (e ))
269
270
270
- def delete_database (self , name ):
271
+ @Slot (str , name = "deleteDatabase" )
272
+ def delete_database (self , name : str ) -> None :
271
273
ok = QtWidgets .QMessageBox .question (
272
274
None ,
273
275
"Delete database?" ,
@@ -277,6 +279,7 @@ def delete_database(self, name):
277
279
if ok == QtWidgets .QMessageBox .Yes :
278
280
project_settings .remove_db (name )
279
281
del bw .databases [name ]
282
+ Group .delete ().where (Group .name == name ).execute ()
280
283
self .change_project (bw .projects .current , reload = True )
281
284
282
285
@Slot (str , QObject , name = "relinkDatabase" )
@@ -360,7 +363,8 @@ def new_activity(database_name: str) -> None:
360
363
signals .database_changed .emit (database_name )
361
364
signals .databases_changed .emit ()
362
365
363
- def delete_activity (self , key ):
366
+ @Slot (tuple , name = "deleteActivity" )
367
+ def delete_activity (self , key : tuple ) -> None :
364
368
act = bw .get_activity (key )
365
369
nu = len (act .upstream ())
366
370
if nu :
@@ -583,19 +587,27 @@ def modify_parameter(param: ParameterBase, field: str, value: object) -> None:
583
587
else :
584
588
param .data [field ] = value
585
589
param .save ()
590
+ bw .parameters .recalculate ()
586
591
signals .parameters_changed .emit ()
587
592
588
593
@staticmethod
589
594
def delete_activity_parameter (key : tuple ) -> None :
590
595
"""Remove all activity parameters and underlying exchange parameters
591
596
for the given key.
592
597
"""
593
- query = ActivityParameter .select (ActivityParameter .group ).where (
594
- ActivityParameter .database == key [0 ],
595
- ActivityParameter .code == key [1 ],
596
- )
597
- for p in query .iterator ():
598
- bw .parameters .remove_from_group (p .group , key )
598
+ query = (ActivityParameter
599
+ .select (ActivityParameter .group )
600
+ .where (ActivityParameter .database == key [0 ],
601
+ ActivityParameter .code == key [1 ])
602
+ .tuples ())
603
+ groups = set (p [0 ] for p in query .iterator ())
604
+ for group in groups :
605
+ bw .parameters .remove_from_group (group , key )
606
+ exists = (ActivityParameter .select ()
607
+ .where (ActivityParameter .group == group )
608
+ .exists ())
609
+ if not exists :
610
+ Group .delete ().where (Group .name == group ).execute ()
599
611
bw .parameters .recalculate ()
600
612
signals .parameters_changed .emit ()
601
613
@@ -618,6 +630,28 @@ def modify_parameter_pedigree(param: ParameterBase, pedigree: dict) -> None:
618
630
param .save ()
619
631
signals .parameters_changed .emit ()
620
632
633
+ @staticmethod
634
+ @Slot (str , str , str , name = "deleteRemnantParameters" )
635
+ def clear_broken_activity_parameter (database : str , code : str , group : str ) -> None :
636
+ """Take the given information and attempt to remove all of the
637
+ downstream parameter information.
638
+ """
639
+ with bw .parameters .db .atomic () as txn :
640
+ bw .parameters .remove_exchanges_from_group (group , None , False )
641
+ ActivityParameter .delete ().where (
642
+ ActivityParameter .database == database ,
643
+ ActivityParameter .code == code
644
+ ).execute ()
645
+ # Do commit to ensure .exists() call does not include deleted params
646
+ txn .commit ()
647
+ exists = (ActivityParameter .select ()
648
+ .where (ActivityParameter .group == group )
649
+ .exists ())
650
+ if not exists :
651
+ # Also clear Group if it is not in use anymore
652
+ Group .delete ().where (Group .name == group ).execute ()
653
+
654
+ # MetaDataStore
621
655
@staticmethod
622
656
@Slot (name = "triggerMetadataReset" )
623
657
def reset_metadata () -> None :
@@ -633,6 +667,7 @@ def update_metadata(key: tuple) -> None:
633
667
def print_convenience_information (db_name : str ) -> None :
634
668
AB_metadata .print_convenience_information (db_name )
635
669
670
+ # Presamples
636
671
@staticmethod
637
672
@Slot (str , name = "removePresamplesPackage" )
638
673
def remove_presamples_package (name_id : str ) -> None :
0 commit comments