# -*- coding: utf-8 -*-# vim: tabstop=4 shiftwidth=4 softtabstop=4## Copyright (C) 2010-2025 GEM Foundation## 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 Affero 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/>."""Functions for getting information about completed jobs andcalculation outputs, as well as exporting outputs from the database to variousfile formats."""importosimportsysimporttracebackfromopenquake.calculators.exportimportexportfromopenquake.commonlibimportlogs,datastore,__version__
[docs]defcheck_version(dstore):""" :param dstore: a DataStore instance :returns: a message if the stored version is different from the current version """ds_version=dstore.hdf5.attrs['engine_version']ifds_version!=__version__:return(': the datastore is at version %s, but the exporter at ''version %s'%(ds_version,__version__))else:return''
[docs]defexport_from_db(output_key,calc_id,datadir,target):""" :param output_key: a pair (ds_key, fmt) :param calc_id: calculation ID :param datadir: directory containing the datastore :param target: directory, temporary when called from the engine server :returns: the list of exported path names """makedirs(target)export.from_db=Truewithdatastore.read(calc_id,datadir=datadir)asdstore:dstore.export_dir=targettry:exported=export(output_key,dstore)exceptException:_etype,err,tb=sys.exc_info()tb_str=''.join(traceback.format_tb(tb))version=check_version(dstore)raiseDataStoreExportError('Could not export %s in %s%s\n%s%s'%(output_key+(version,tb_str,err)))returnexported
#: Used to separate node labels in a logic tree pathLT_PATH_JOIN_TOKEN='_'
[docs]defmakedirs(path):""" Make all of the directories in the ``path`` using `os.makedirs`. """ifos.path.exists(path):ifnotos.path.isdir(path):# If it's not a directory, we can't do anything.# This is a problemraiseRuntimeError('%s already exists and is not a directory.'%path)else:os.makedirs(path)
[docs]defexport_outputs(job_id,target_dir,export_types):# make it possible commands like `oq engine --eos -1 /tmp`datadir,dskeys=logs.dbcmd('get_results',job_id)ifnotdskeys:yield'Found nothing to export for job %s'%job_idfordskeyindskeys:yield'Exporting %s...'%dskeyforlineinexport_output(dskey,job_id,datadir,target_dir,export_types):yieldline
[docs]defget_outkey(dskey,export_types):""" Extract the first pair (dskey, exptype) found in export """forexptypeinexport_types:if(dskey,exptype)inexport:return(dskey,exptype)
[docs]defexport_output(dskey,calc_id,datadir,target_dir,export_types):""" Simple UI wrapper around :func:`openquake.engine.export.core.export_from_db` yielding a summary of files exported, if any. """outkey=get_outkey(dskey,export_types.split(','))ifexport_typesandnotoutkey:yield'There is no exporter for %s, %s'%(dskey,export_types)returnyield fromexport_from_db(outkey,calc_id,datadir,target_dir)