Source code for svir.dialogs.select_sv_variables_dialog

# -*- coding: utf-8 -*-
# /***************************************************************************
# Irmt
#                                 A QGIS plugin
# OpenQuake Integrated Risk Modelling Toolkit
#                              -------------------
#        begin                : 2013-10-24
#        copyright            : (C) 2014 by GEM Foundation
#        email                : devops@openquake.org
# ***************************************************************************/
#
# OpenQuake is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# OpenQuake is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with OpenQuake.  If not, see <http://www.gnu.org/licenses/>.

from qgis.PyQt.QtCore import pyqtSlot
from qgis.PyQt.QtWidgets import QDialog, QDialogButtonBox

from svir.utilities.utils import (WaitCursorManager,
                                  SvNetworkError,
                                  get_ui_class,
                                  )
from svir.ui.list_multiselect_widget import ListMultiSelectWidget

FORM_CLASS = get_ui_class('ui_select_sv_variables.ui')


[docs]class SelectSvVariablesDialog(QDialog, FORM_CLASS): """ Modal dialog giving to the user the possibility to select social vulnerability variables to import from the oq-platform """ def __init__(self, downloader): QDialog.__init__(self) # Set up the user interface from Designer. self.setupUi(self) self.indicator_multiselect = ListMultiSelectWidget( title='Select Indicators') self.vertical_layout.insertWidget(2, self.indicator_multiselect) self.country_multiselect = ListMultiSelectWidget( title='Select Countries') self.vertical_layout.insertWidget(7, self.country_multiselect) self.ok_button = self.buttonBox.button(QDialogButtonBox.Ok) self.set_ok_button() # login to platform, to be able to retrieve sv indices self.sv_downloader = downloader self.indicators_info_dict = {} with WaitCursorManager('Filling list of indicators...'): self.fill_names() with WaitCursorManager('Filling list of themes...'): self.fill_themes() with WaitCursorManager('Filling list of countries...'): self.fill_countries() self.indicator_multiselect.unselected_widget.itemClicked.connect( self.update_indicator_info) self.indicator_multiselect.selected_widget.itemClicked.connect( self.update_indicator_info) self.indicator_multiselect.selection_changed.connect( self.set_ok_button) self.country_multiselect.selection_changed.connect( self.set_ok_button) @pyqtSlot(str)
[docs] def on_theme_cbx_currentIndexChanged(self): theme = self.theme_cbx.currentText() with WaitCursorManager(): self.fill_subthemes(theme)
@pyqtSlot()
[docs] def on_filter_btn_clicked(self): with WaitCursorManager(): self.fill_names()
[docs] def set_ok_button(self): self.ok_button.setEnabled( self.indicator_multiselect.selected_widget.count() > 0 and self.country_multiselect.selected_widget.count() > 0)
[docs] def fill_themes(self): self.theme_cbx.clear() # load list of themes from the platform self.theme_cbx.addItems([None]) try: themes = self.sv_downloader.get_themes() self.theme_cbx.addItems(themes) except SvNetworkError as e: raise SvNetworkError( "Unable to download social vulnerability themes: %s" % e) # populate the subsequent combo boxes accordingly with the currently # selected item current_theme = self.theme_cbx.currentText() self.fill_subthemes(current_theme)
[docs] def fill_subthemes(self, theme): self.subtheme_cbx.clear() # load list of subthemes from the platform self.subtheme_cbx.addItems([None]) if theme: try: subthemes = self.sv_downloader.get_subthemes_by_theme(theme) self.subtheme_cbx.addItems(subthemes) except SvNetworkError as e: raise SvNetworkError( "Unable to download social vulnerability" " subthemes: %s" % e)
[docs] def fill_names(self): self.indicator_multiselect.set_unselected_items([]) # load list of social vulnerability variable names from the platform name_filter = self.name_filter_le.text() keywords = self.keywords_le.text() theme = self.theme_cbx.currentText() subtheme = self.subtheme_cbx.currentText() try: filter_result_dict = self.sv_downloader.get_indicators_info( name_filter, keywords, theme, subtheme) self.indicators_info_dict.update(filter_result_dict) names = sorted( [code + ': ' + filter_result_dict[code]['name'] for code in filter_result_dict]) self.indicator_multiselect.add_unselected_items(names) except SvNetworkError as e: raise SvNetworkError( "Unable to download social vulnerability names: %s" % e)
[docs] def update_indicator_info(self, item): hint_text = item.text() indicator_code = item.text().split(':')[0] indicator_info_dict = self.indicators_info_dict[indicator_code] hint_text += '\n\n' + 'Description:\n' + indicator_info_dict[ 'description'] hint_text += '\n\n' + 'Source:\n' + indicator_info_dict['source'] hint_text += '\n\n' + 'Aggregation method:\n' + indicator_info_dict[ 'aggregation_method'] self.indicator_details.setText(hint_text)
[docs] def fill_countries(self): # load from platform a list of countries for which socioeconomic data # are available try: countries_dict = self.sv_downloader.get_countries_info() names = sorted( [countries_dict[iso] + ' (' + iso + ')' for iso in countries_dict]) self.country_multiselect.set_unselected_items(names) except SvNetworkError as e: raise SvNetworkError( "Unable to download the list of countries: %s" % e)