Source code for galaxy.tools.actions.metadata

import logging

from __init__ import ToolAction
from galaxy.datatypes.metadata import JobExternalOutputMetadataWrapper
from galaxy.util.odict import odict
from galaxy.util.json import dumps
from galaxy.jobs.datasets import DatasetPath


log = logging.getLogger( __name__ )


[docs]class SetMetadataToolAction( ToolAction ): """Tool action used for setting external metadata on an existing dataset"""
[docs] def execute( self, tool, trans, incoming={}, set_output_hid=False, overwrite=True, history=None, job_params=None, **kwargs ): """ Execute using a web transaction. """ job, odict = self.execute_via_app( tool, trans.app, trans.get_galaxy_session().id, trans.history.id, trans.user, incoming, set_output_hid, overwrite, history, job_params ) # FIXME: can remove this when logging in execute_via_app method. trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id ) return job, odict
[docs] def execute_via_app( self, tool, app, session_id, history_id, user=None, incoming = {}, set_output_hid = False, overwrite = True, history=None, job_params=None ): """ Execute using application. """ for name, value in incoming.iteritems(): if isinstance( value, app.model.HistoryDatasetAssociation ): dataset = value dataset_name = name type = 'hda' break elif isinstance( value, app.model.LibraryDatasetDatasetAssociation ): dataset = value dataset_name = name type = 'ldda' break else: raise Exception( 'The dataset to set metadata on could not be determined.' ) sa_session = app.model.context # Create the job object job = app.model.Job() job.session_id = session_id job.history_id = history_id job.tool_id = tool.id if user: job.user_id = user.id if job_params: job.params = dumps( job_params ) start_job_state = job.state #should be job.states.NEW try: # For backward compatibility, some tools may not have versions yet. job.tool_version = tool.version except: job.tool_version = "1.0.1" job.state = job.states.WAITING #we need to set job state to something other than NEW, or else when tracking jobs in db it will be picked up before we have added input / output parameters job.set_handler(tool.get_job_handler( job_params )) sa_session.add( job ) sa_session.flush() #ensure job.id is available #add parameters to job_parameter table # Store original dataset state, so we can restore it. A separate table might be better (no chance of 'losing' the original state)? incoming[ '__ORIGINAL_DATASET_STATE__' ] = dataset.state input_paths = [DatasetPath( dataset.id, real_path=dataset.file_name, mutable=False )] app.object_store.create(job, base_dir='job_work', dir_only=True, extra_dir=str(job.id)) job_working_dir = app.object_store.get_filename(job, base_dir='job_work', dir_only=True, extra_dir=str(job.id)) external_metadata_wrapper = JobExternalOutputMetadataWrapper( job ) cmd_line = external_metadata_wrapper.setup_external_metadata( dataset, sa_session, exec_dir = None, tmp_dir = job_working_dir, dataset_files_path = app.model.Dataset.file_path, output_fnames = input_paths, config_root = app.config.root, config_file = app.config.config_file, datatypes_config = app.datatypes_registry.integrated_datatypes_configs, job_metadata = None, include_command = False, kwds = { 'overwrite' : overwrite } ) incoming[ '__SET_EXTERNAL_METADATA_COMMAND_LINE__' ] = cmd_line for name, value in tool.params_to_strings( incoming, app ).iteritems(): job.add_parameter( name, value ) #add the dataset to job_to_input_dataset table if type == 'hda': job.add_input_dataset( dataset_name, dataset ) elif type == 'ldda': job.add_input_library_dataset( dataset_name, dataset ) #Need a special state here to show that metadata is being set and also allow the job to run # i.e. if state was set to 'running' the set metadata job would never run, as it would wait for input (the dataset to set metadata on) to be in a ready state dataset._state = dataset.states.SETTING_METADATA job.state = start_job_state #job inputs have been configured, restore initial job state sa_session.flush() # Queue the job for execution app.job_queue.put( job.id, tool.id ) # FIXME: need to add event logging to app and log events there rather than trans. #trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id ) #clear e.g. converted files dataset.datatype.before_setting_metadata( dataset ) return job, odict()