Source code for svir.thread_worker.download_platform_data_worker
# -*- coding: utf-8 -*-
# /***************************************************************************
# Irmt
# A QGIS plugin
# OpenQuake Integrated Risk Modelling Toolkit
# -------------------
# begin : 2013-10-24
# copyright : (C) 2014-2015 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/>.
import os
import tempfile
from svir.utilities.import_sv_data import PLATFORM_EXPORT_VARIABLES_DATA
from svir.thread_worker.abstract_worker import AbstractWorker
from svir.utilities.utils import SvNetworkError, tr, UserAbortedNotification
[docs]class DownloadPlatformDataWorker(AbstractWorker):
"""
Worker, to download data from a platform
:param sv_downloader:
instance of :class:`svir.utilities.import_sv_data.SvDownloader`
:param sv_variables_ids:
comma-separated indicator codes to be downloaded
:param load_geometries:
indicating if also zonal geometries have to be downloaded
:type load_geometries: bool
:param country_iso_codes:
comma-separated iso codes of the countries for which we want to
download socioeconomic data
"""
def __init__(self,
sv_downloader,
sv_variables_ids,
load_geometries,
country_iso_codes):
AbstractWorker.__init__(self)
self.downloader = sv_downloader
self.sv_variables_ids = sv_variables_ids
self.load_geometries = load_geometries
self.country_iso_codes = country_iso_codes
[docs] def work(self):
"""
:returns:
(fname, msg), where fname is the name of the target csv file that
will store the downloaded data, and msg is a message describing if
the download is performed successfully
:raises: SvNetworkError
"""
self.set_message.emit(
tr('Waiting for the OpenQuake Platform to export the data...'))
self.toggle_show_progress.emit(False)
page = self.downloader.host + PLATFORM_EXPORT_VARIABLES_DATA
data = dict(sv_variables_ids=self.sv_variables_ids,
export_geometries=self.load_geometries,
country_iso_codes=self.country_iso_codes)
result = self.downloader.sess.post(page, data=data, stream=True)
self.set_message.emit(tr('Downloading data from platform'))
self.toggle_show_progress.emit(True)
if result.status_code == 200:
# save csv on a temporary file
fd, fname = tempfile.mkstemp(suffix='.csv')
os.close(fd)
# All the fields of the csv file will be considered as text fields
# unless a .csvt file with the same name as the .csv file is used
# to specify the field types.
# For the type descriptor, use the same name as the csv file
fname_types = fname.split('.')[0] + '.csvt'
# We expect iso, country_name, v1, v2, ... vn
# Count variables ids
sv_variables_count = len(self.sv_variables_ids.split(','))
# build the string that describes data types for the csv
types_string = '"String","String"' + ',"Real"' * sv_variables_count
if self.load_geometries:
types_string += ',"String"'
with open(fname_types, 'w', newline='') as csvt:
csvt.write(types_string)
with open(fname, 'w', newline='') as csv_file:
n_countries_to_download = len(self.country_iso_codes)
n_downloaded_countries = 0
for line in result.iter_lines():
if self.is_killed:
raise UserAbortedNotification(
'Download aborted by user')
csv_file.write(line.decode('utf8') + os.linesep)
n_downloaded_countries += 1
progress = (1.0 * n_downloaded_countries /
n_countries_to_download * 100)
self.progress.emit(progress)
msg = 'The socioeconomic data has been saved into %s' % fname
return fname, msg
else:
raise SvNetworkError(result.content)