def request_type_permissions( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) request_type_id = kwd.get( 'id', '' ) try: request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'request type', action='browse_request_types' ) roles = trans.sa_session.query( trans.model.Role ) \ .filter( trans.model.Role.table.c.deleted==False ) \ .order_by( trans.model.Role.table.c.name ) if params.get( 'update_roles_button', False ): permissions = {} for k, v in trans.model.RequestType.permitted_actions.items(): in_roles = [ trans.sa_session.query( trans.model.Role ).get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ] permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles trans.app.security_agent.set_request_type_permissions( request_type, permissions ) trans.sa_session.refresh( request_type ) message = "Permissions updated for request type '%s'" % request_type.name return trans.fill_template( '/admin/request_type/request_type_permissions.mako', request_type=request_type, roles=roles, status=status, message=message )
def view_editable_request_type( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) request_type_id = params.get( 'id', None ) try: request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'request type', action='browse_request_types' ) # See if we have any associated templates widgets = request_type.get_template_widgets( trans ) widget_fields_have_contents = self.widget_fields_have_contents( widgets ) # get all the external services selected till now external_service_select_fields_list = [] for index, external_service in enumerate( request_type.external_services ): external_service_select_field = self.__build_external_service_select_field( trans, 'external_service_id_%i' % index, external_service ) external_service_select_fields_list.append( external_service_select_field ) return trans.fill_template( '/admin/request_type/edit_request_type.mako', request_type=request_type, widgets=widgets, widget_fields_have_contents=widget_fields_have_contents, external_service_select_fields_list=external_service_select_fields_list, message=message, status=status )
def reject_request( self, trans, **kwd ): params = util.Params( kwd ) request_id = params.get( 'id', '' ) status = params.get( 'status', 'done' ) message = params.get( 'message', 'done' ) if params.get( 'cancel_reject_button', False ): return trans.response.send_redirect( web.url_for( controller='requests_common', action='view_request', cntrller='requests_admin', id=request_id ) ) try: request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) ) except: return invalid_id_redirect( trans, 'requests_admin', request_id ) # Validate comment = util.restore_text( params.get( 'comment', '' ) ) if not comment: status='error' message='A reason for rejecting the request is required.' return trans.fill_template( '/admin/requests/reject.mako', cntrller='requests_admin', request=request, status=status, message=message ) # Create an event with state 'Rejected' for this request event_comment = "Sequencing request marked rejected by %s. Reason: %s " % ( trans.user.email, comment ) event = trans.model.RequestEvent( request, request.states.REJECTED, event_comment ) trans.sa_session.add( event ) trans.sa_session.flush() message='Sequencing request (%s) has been rejected.' % request.name return trans.response.send_redirect( web.url_for( controller='requests_admin', action='browse_requests', status=status, message=message, **kwd ) )
def view_form_definition( self, trans, **kwd ): form_definition_id = kwd.get( 'id', None ) try: form_definition = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( form_definition_id ) ) except: return invalid_id_redirect( trans, 'request_type', form_definition_id, 'form definition', action='browse_request_types' ) return trans.fill_template( '/admin/forms/view_form_definition.mako', form_definition=form_definition )
def view_external_service( self, trans, **kwd ): external_service_id = kwd.get( 'id', None ) try: external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) ) except: return invalid_id_redirect( trans, 'external_service', external_service_id, 'external_service', action='browse_external_services' ) external_service_type = self.get_external_service_type( trans, external_service.external_service_type_id ) return trans.fill_template( '/admin/external_service/view_external_service.mako', external_service=external_service, external_service_type=external_service_type )
def edit_external_service_form_definition( self, trans, **kwd ): params = util.Params( kwd ) external_service_id = kwd.get( 'id', None ) try: external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) ) except: return invalid_id_redirect( trans, 'external_service', external_service_id, 'external_service', action='browse_external_services' ) vars = dict( id=trans.security.encode_id( external_service.form_definition.form_definition_current_id ), response_redirect=web.url_for( controller='external_service', action='update_external_service_form_definition', **kwd ) ) return trans.response.send_redirect( web.url_for( controller='forms', action='edit_form_definition', **vars ) )
def rename_datasets( self, trans, **kwd ): # This method is called from the DataTransferGrid when a user is renaming 1 or more # SampleDatasets. params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) sample_id = kwd.get( 'sample_id', None ) try: sample = trans.sa_session.query( trans.model.Sample ).get( trans.security.decode_id( sample_id ) ) except: return invalid_id_redirect( trans, 'requests_admin', sample_id, 'sample' ) # id_list is list of SampleDataset ids, which is a subset of all # of the SampleDatasets associated with the Sample. The user may # or may not have selected all of the SampleDatasets for renaming. id_list = util.listify( kwd.get( 'id_list', [] ) ) # Get all of the SampleDatasets sample_datasets = [] for sample_dataset_id in id_list: sample_dataset = trans.sa_session.query( trans.app.model.SampleDataset ).get( trans.security.decode_id( sample_dataset_id ) ) sample_datasets.append( sample_dataset ) if params.get( 'rename_datasets_button', False ): incorrect_dataset_names = [] for sample_dataset in sample_datasets: encoded_id = trans.security.encode_id( sample_dataset.id ) selected_option = util.restore_text( params.get( 'rename_datasets_for_sample_%s' % encoded_id, '' ) ) new_name = util.restore_text( params.get( 'new_name_%s' % encoded_id, '' ) ) if not new_name: incorrect_dataset_names.append( sample_dataset.name ) continue new_name = util.sanitize_for_filename( new_name ) if selected_option == 'none': sample_dataset.name = new_name else: sample_dataset.name = '%s_%s' % ( selected_option, new_name ) trans.sa_session.add( sample_dataset ) trans.sa_session.flush() if len( sample_datasets ) == len( incorrect_dataset_names ): status = 'error' message = 'All datasets renamed incorrectly.' elif len( incorrect_dataset_names ): status = 'done' message = 'Changes saved successfully. The following datasets were renamed incorrectly: %s.' % str( incorrect_dataset_names ) else: message = 'Changes saved successfully.' return trans.fill_template( '/admin/requests/rename_datasets.mako', sample=sample, id_list=id_list, message=message, status=status ) return trans.response.send_redirect( web.url_for( controller='requests_admin', action='manage_datasets', sample_id=sample_id ) )
def __get_external_services(self, trans, request_type=None, **kwd): params = util.Params( kwd ) external_services_list = [] i = 0 while True: if kwd.has_key( 'external_service_id_%i' % i ): id = params.get( 'external_service_id_%i' % i, '' ) try: external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( id ) ) except: return invalid_id_redirect( trans, 'request_type', id, 'external service', action='browse_request_types' ) external_services_list.append( external_service ) i += 1 else: break return external_services_list
def update_external_service_form_definition( self, trans, **kwd ): params = util.Params( kwd ) external_service_id = kwd.get( 'id', None ) try: external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) ) except: return invalid_id_redirect( trans, 'external_service', external_service_id, 'external_service', action='browse_external_services' ) external_service.form_definition = external_service.form_definition.current.latest_form trans.sa_session.add( external_service ) trans.sa_session.flush() message = "The form definition for the '%s' external service has been updated with your changes." % external_service.name return trans.response.send_redirect( web.url_for( controller='external_service', action='edit_external_service', message=message, status='done', **kwd ) )
def undelete_external_service( self, trans, **kwd ): external_service_id = kwd.get( 'id', '' ) external_service_id_list = util.listify( external_service_id ) for external_service_id in external_service_id_list: try: external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) ) except: return invalid_id_redirect( trans, 'external_service', external_service_id, 'external_service', action='browse_external_services' ) external_service.deleted = False trans.sa_session.add( external_service ) trans.sa_session.flush() status = 'done' message = '%i external services have been undeleted' % len( external_service_id_list ) return trans.response.send_redirect( web.url_for( controller='external_service', action='browse_external_services', message=message, status=status ) )
def undelete_request_type( self, trans, **kwd ): request_type_id = kwd.get( 'id', '' ) request_type_id_list = util.listify( request_type_id ) for request_type_id in request_type_id_list: try: request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'request type', action='browse_request_types' ) request_type.deleted = False trans.sa_session.add( request_type ) trans.sa_session.flush() status = 'done' message = '%i request types have been undeleted' % len( request_type_id_list ) return trans.response.send_redirect( web.url_for( controller='request_type', action='browse_request_types', message=message, status=status ) )
def view_request_type( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) request_type_id = kwd.get( 'id', None ) try: request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'request type', action='browse_request_types' ) # See if we have any associated templates widgets = request_type.get_template_widgets( trans ) widget_fields_have_contents = self.widget_fields_have_contents( widgets ) return trans.fill_template( '/admin/request_type/view_request_type.mako', request_type=request_type, widgets=widgets, widget_fields_have_contents=widget_fields_have_contents, message=message, status=status )
def reject_request(self, trans, **kwd): params = util.Params(kwd) request_id = params.get('id', '') status = params.get('status', 'done') message = params.get('message', 'done') if params.get('cancel_reject_button', False): return trans.response.send_redirect( web.url_for(controller='requests_common', action='view_request', cntrller='requests_admin', id=request_id)) try: request = trans.sa_session.query(trans.model.Request).get( trans.security.decode_id(request_id)) except: return invalid_id_redirect(trans, 'requests_admin', request_id) # Validate comment = util.restore_text(params.get('comment', '')) if not comment: status = 'error' message = 'A reason for rejecting the request is required.' return trans.fill_template('/admin/requests/reject.mako', cntrller='requests_admin', request=request, status=status, message=message) # Create an event with state 'Rejected' for this request event_comment = "Sequencing request marked rejected by %s. Reason: %s " % ( trans.user.email, comment) event = trans.model.RequestEvent(request, request.states.REJECTED, event_comment) trans.sa_session.add(event) trans.sa_session.flush() message = 'Sequencing request (%s) has been rejected.' % request.name return trans.response.send_redirect( web.url_for(controller='requests_admin', action='browse_requests', status=status, message=message, **kwd))
def edit_external_service( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) external_service_id = params.get( 'id', None ) try: external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) ) except: return invalid_id_redirect( trans, 'external_service', external_service_id, 'external_service', action='browse_external_services' ) if params.get( 'edit_external_service_button', False ): external_service = self.__save_external_service( trans, **kwd ) trans.sa_session.refresh( external_service ) message = 'Changes made to external service (%s) have been saved' % external_service.name widgets = self.__build_external_service_widgets( trans, external_service, **kwd ) widgets.extend( external_service.form_definition.get_widgets( trans.user, external_service.form_values.content, **kwd ) ) external_service_type = self.get_external_service_type( trans, external_service.external_service_type_id ) return trans.fill_template( '/admin/external_service/edit_external_service.mako', external_service=external_service, widgets=widgets, message=message, status=status, external_service_type=external_service_type )
def edit_request_type( self, trans, **kwd ): params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) request_type_id = params.get( 'id', None ) try: request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'request type', action='browse_request_types' ) # See if we have any associated templates widgets = request_type.get_template_widgets( trans ) widget_fields_have_contents = self.widget_fields_have_contents( widgets ) # get all the external services selected till now external_service_select_fields_list = [] external_services_list = self.__get_external_services( trans, request_type, **kwd ) if params.get( 'edit_request_type_button', False ): request_type = self.__save_request_type( trans, action='edit_request_type', **kwd ) message = 'Changes made to request type (%s) have been saved' % request_type.name elif params.get( 'add_external_service_button', False ): external_services_list.append( None ) elif params.get( 'remove_external_service_button', False ): index = int( kwd[ 'remove_external_service_button' ].split(' ')[3] ) - 1 del external_services_list[index] #if external_services_list for index, external_service in enumerate( external_services_list ): external_service_select_field = self.__build_external_service_select_field( trans, 'external_service_id_%i' % index, external_service ) external_service_select_fields_list.append( external_service_select_field ) return trans.fill_template( '/admin/request_type/edit_request_type.mako', request_type=request_type, widgets=widgets, widget_fields_have_contents=widget_fields_have_contents, external_service_select_fields_list=external_service_select_fields_list, message=message, status=status )
def __save_request_type( self, trans, action, **kwd ): # Here we save a newly created request_type or save changed # attributes of an existing request_type. params = util.Params( kwd ) request_type_id = params.get( 'id', None ) name = util.restore_text( params.get( 'name', '' ) ) desc = util.restore_text( params.get( 'desc', '' ) ) request_form_id = params.get( 'request_form_id', 'none' ) sample_form_id = params.get( 'sample_form_id', 'none' ) external_service_id = params.get( 'external_service_id', 'none' ) # validate if not name or request_form_id == 'none' or sample_form_id == 'none': message = 'Enter the name, request form, sample form and at least one sample state associated with this request type.' return trans.response.send_redirect( web.url_for( controller='request_type', action=action, message=message, status='error' ) ) try: request_form = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( request_form_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'form definition', action='browse_request_types' ) try: sample_form = trans.sa_session.query( trans.model.FormDefinition ).get( trans.security.decode_id( sample_form_id ) ) except: return invalid_id_redirect( trans, 'request_type', request_type_id, 'form definition', action='browse_request_types' ) if request_type_id: # We're saving changed attributes of an existing request_type. request_type = trans.sa_session.query( trans.model.RequestType ).get( trans.security.decode_id( request_type_id ) ) request_type.name = name request_type.desc = desc request_type.request_form = request_form request_type.sample_form = sample_form for sample_state in request_type.states: sample_state_id = trans.security.encode_id( sample_state.id ) name = util.restore_text( params.get( 'state_name_%s' % sample_state_id, '' ) ) desc = util.restore_text( params.get( 'state_desc_%s' % sample_state_id, '' ) ) sample_state.name = name sample_state.desc = desc trans.sa_session.add( sample_state ) trans.sa_session.flush() trans.sa_session.add( request_type ) trans.sa_session.flush() else: # We're saving a newly created request_type request_type = trans.model.RequestType( name=name, desc=desc, request_form=request_form, sample_form=sample_form ) trans.sa_session.add( request_type ) trans.sa_session.flush() i = 0 while True: if kwd.has_key( 'state_name_%i' % i ): name = util.restore_text( params.get( 'state_name_%i' % i, '' ) ) desc = util.restore_text( params.get( 'state_desc_%i' % i, '' ) ) sample_state = trans.model.SampleState( name, desc, request_type ) trans.sa_session.add( sample_state ) trans.sa_session.flush() i += 1 else: break # delete existing associations request_type.delete_external_service_associations( trans ) # save the external services associated with this request_type external_services_list = self.__get_external_services( trans, **kwd ) for external_service in external_services_list: request_type.add_external_service_association( trans, external_service ) return request_type
def initiate_data_transfer(self, trans, sample_id, sample_datasets=[], sample_dataset_id=''): # Initiate the transfer of the datasets from the external service to the target Galaxy data library. # The admin user must have LIBRARY_ADD permission for the target library and folder try: sample = trans.sa_session.query(trans.model.Sample).get( trans.security.decode_id(sample_id)) except: return invalid_id_redirect(trans, 'requests_admin', sample_id, 'sample') message = "" status = "done" # Make sure the current admin user has LIBRARY_ADD permission on the target data library and folder. self.__ensure_library_add_permission(trans, sample.library, sample.folder) if sample_dataset_id and not sample_datasets: # Either a list of SampleDataset objects or a comma-separated string of # encoded SampleDataset ids can be received. If the latter, parse the # sample_dataset_id string to build the list of sample_datasets. id_list = util.listify(sample_dataset_id) for sample_dataset_id in id_list: sample_dataset = trans.sa_session.query( trans.model.SampleDataset).get( trans.security.decode_id(sample_dataset_id)) sample_datasets.append(sample_dataset) if trans.app.config.enable_beta_job_managers: # For now, assume that all SampleDatasets use the same external service ( this may not be optimal ). if sample_datasets: external_service_type_id = sample_datasets[ 0].external_service.external_service_type_id # Here external_service_type_id will be something like '454_life_sciences' external_service = sample.request.type.get_external_service( external_service_type_id) external_service_type = external_service.get_external_service_type( trans) external_service.load_data_transfer_settings(trans) # For now only scp is supported. scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP] if not scp_configs['automatic_transfer']: deferred_plugin = 'ManualDataTransferPlugin' else: raise Exception( "Automatic data transfer using scp is not yet supported." ) trans.app.job_manager.deferred_job_queue.plugins[ deferred_plugin].create_job( trans, sample=sample, sample_datasets=sample_datasets, external_service=external_service, external_service_type=external_service_type) else: # TODO: Using RabbitMq for now, but eliminate this entire block when we replace RabbitMq with Galaxy's # own messaging engine. We're holding off on using the new way to transfer files manually until we # implement a Galaxy-proprietary messaging engine because the deferred job plugins currently perform # constant db hits to check for deferred jobs that are not in a finished state. # Create the message messages = self.__create_data_transfer_messages( trans, sample, sample_datasets) # Send the messages for rmq_msg in messages: try: conn = amqp.Connection( host=trans.app.config.amqp['host'] + ":" + trans.app.config.amqp['port'], userid=trans.app.config.amqp['userid'], password=trans.app.config.amqp['password'], virtual_host=trans.app.config.amqp['virtual_host'], insist=False) chan = conn.channel() msg = amqp.Message( rmq_msg, content_type='text/plain', application_headers={'msg_type': 'data_transfer'}) msg.properties["delivery_mode"] = 2 chan.basic_publish( msg, exchange=trans.app.config.amqp['exchange'], routing_key=trans.app.config.amqp['routing_key']) chan.close() conn.close() except Exception, e: message = "Error sending the data transfer message to the Galaxy AMQP message queue:<br/>%s" % str( e) status = "error" if not message: message = "%i datasets have been queued for transfer from the external service." % len( sample_datasets) status = "done"
def rename_datasets(self, trans, **kwd): # This method is called from the DataTransferGrid when a user is renaming 1 or more # SampleDatasets. params = util.Params(kwd) message = util.restore_text(params.get('message', '')) status = params.get('status', 'done') sample_id = kwd.get('sample_id', None) try: sample = trans.sa_session.query(trans.model.Sample).get( trans.security.decode_id(sample_id)) except: return invalid_id_redirect(trans, 'requests_admin', sample_id, 'sample') # id_list is list of SampleDataset ids, which is a subset of all # of the SampleDatasets associated with the Sample. The user may # or may not have selected all of the SampleDatasets for renaming. id_list = util.listify(kwd.get('id_list', [])) # Get all of the SampleDatasets sample_datasets = [] for sample_dataset_id in id_list: sample_dataset = trans.sa_session.query( trans.app.model.SampleDataset).get( trans.security.decode_id(sample_dataset_id)) sample_datasets.append(sample_dataset) if params.get('rename_datasets_button', False): incorrect_dataset_names = [] for sample_dataset in sample_datasets: encoded_id = trans.security.encode_id(sample_dataset.id) selected_option = util.restore_text( params.get('rename_datasets_for_sample_%s' % encoded_id, '')) new_name = util.restore_text( params.get('new_name_%s' % encoded_id, '')) if not new_name: incorrect_dataset_names.append(sample_dataset.name) continue new_name = util.sanitize_for_filename(new_name) if selected_option == 'none': sample_dataset.name = new_name else: sample_dataset.name = '%s_%s' % (selected_option, new_name) trans.sa_session.add(sample_dataset) trans.sa_session.flush() if len(sample_datasets) == len(incorrect_dataset_names): status = 'error' message = 'All datasets renamed incorrectly.' elif len(incorrect_dataset_names): status = 'done' message = 'Changes saved successfully. The following datasets were renamed incorrectly: %s.' % str( incorrect_dataset_names) else: message = 'Changes saved successfully.' return trans.fill_template('/admin/requests/rename_datasets.mako', sample=sample, id_list=id_list, message=message, status=status) return trans.response.send_redirect( web.url_for(controller='requests_admin', action='manage_datasets', sample_id=sample_id))
def manage_datasets(self, trans, **kwd): def handle_error(**kwd): kwd['status'] = 'error' return trans.response.send_redirect( web.url_for(controller='requests_admin', action='manage_datasets', **kwd)) params = util.Params(kwd) message = util.restore_text(params.get('message', '')) status = params.get('status', 'done') sample_id = params.get('sample_id', None) try: sample = trans.sa_session.query(trans.model.Sample).get( trans.security.decode_id(sample_id)) except: return invalid_id_redirect(trans, 'requests_admin', sample_id, 'sample') if 'operation' in kwd: operation = kwd['operation'].lower() sample_dataset_id = params.get('id', None) if not sample_dataset_id: message = 'Select at least 1 dataset to %s.' % operation kwd['message'] = message del kwd['operation'] handle_error(**kwd) id_list = util.listify(sample_dataset_id) selected_sample_datasets = [] for sample_dataset_id in id_list: try: sample_dataset = trans.sa_session.query( trans.model.SampleDataset).get( trans.security.decode_id(sample_dataset_id)) except: return invalid_id_redirect(trans, 'requests_admin', sample_dataset_id, 'sample dataset') selected_sample_datasets.append(sample_dataset) if operation == "view": return trans.fill_template( '/admin/requests/view_sample_dataset.mako', cntrller='requests_admin', sample_dataset=selected_sample_datasets[0]) elif operation == "delete": not_deleted = [] for sample_dataset in selected_sample_datasets: # Make sure the dataset has been transferred before deleting it. if sample_dataset in sample_dataset.sample.untransferred_dataset_files: # Save the sample dataset sample = sample_dataset.sample trans.sa_session.delete(sample_dataset) trans.sa_session.flush() else: not_deleted.append(sample_dataset.name) message = '%i datasets have been deleted.' % (len(id_list) - len(not_deleted)) if not_deleted: status = 'warning' message = message + ' %s could not be deleted because their transfer status is not "Not Started". ' % str( not_deleted) return trans.response.send_redirect( web.url_for(controller='requests_admin', action='manage_datasets', sample_id=trans.security.encode_id(sample.id), status=status, message=message)) elif operation == "rename": # If one of the selected sample datasets is in the NOT_STARTED state, # then display an error message. A NOT_STARTED state implies the dataset # has not yet been transferred. no_datasets_transferred = True for selected_sample_dataset in selected_sample_datasets: if selected_sample_dataset in selected_sample_dataset.sample.untransferred_dataset_files: no_datasets_transferred = False break if no_datasets_transferred: status = 'error' message = 'A dataset can be renamed only if it has been transferred.' return trans.response.send_redirect( web.url_for(controller='requests_admin', action='manage_datasets', sample_id=trans.security.encode_id( selected_sample_datasets[0].sample.id), status=status, message=message)) return trans.fill_template( '/admin/requests/rename_datasets.mako', sample=selected_sample_datasets[0].sample, id_list=id_list) elif operation == "transfer": self.initiate_data_transfer( trans, trans.security.encode_id( selected_sample_datasets[0].sample.id), sample_datasets=selected_sample_datasets) elif operation == "view_external_service": return trans.response.send_redirect( web.url_for(controller='external_service', action='view_external_service', **kwd)) # Render the grid view request_id = trans.security.encode_id(sample.request.id) library_id = trans.security.encode_id(sample.library.id) self.datatx_grid.title = 'Manage "%s" datasets' % sample.name self.datatx_grid.global_actions = [ grids.GridAction( "Browse target data library", dict(controller='library_common', action='browse_library', cntrller='library_admin', id=library_id)), grids.GridAction( "Browse this request", dict(controller='requests_common', action='view_request', cntrller='requests_admin', id=request_id)) ] return self.datatx_grid(trans, **kwd)
def initiate_data_transfer( self, trans, sample_id, sample_datasets=[], sample_dataset_id='' ): # Initiate the transfer of the datasets from the external service to the target Galaxy data library. # The admin user must have LIBRARY_ADD permission for the target library and folder try: sample = trans.sa_session.query( trans.model.Sample ).get( trans.security.decode_id( sample_id ) ) except: return invalid_id_redirect( trans, 'requests_admin', sample_id, 'sample' ) message = "" status = "done" # Make sure the current admin user has LIBRARY_ADD permission on the target data library and folder. self.__ensure_library_add_permission( trans, sample.library, sample.folder ) if sample_dataset_id and not sample_datasets: # Either a list of SampleDataset objects or a comma-separated string of # encoded SampleDataset ids can be received. If the latter, parse the # sample_dataset_id string to build the list of sample_datasets. id_list = util.listify( sample_dataset_id ) for sample_dataset_id in id_list: sample_dataset = trans.sa_session.query( trans.model.SampleDataset ).get( trans.security.decode_id( sample_dataset_id ) ) sample_datasets.append( sample_dataset ) if trans.app.config.enable_beta_job_managers: # For now, assume that all SampleDatasets use the same external service ( this may not be optimal ). if sample_datasets: external_service_type_id = sample_datasets[0].external_service.external_service_type_id # Here external_service_type_id will be something like '454_life_sciences' external_service = sample.request.type.get_external_service( external_service_type_id ) external_service_type = external_service.get_external_service_type( trans ) external_service.load_data_transfer_settings( trans ) # For now only scp is supported. scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ] if not scp_configs[ 'automatic_transfer' ]: deferred_plugin = 'ManualDataTransferPlugin' else: raise Exception( "Automatic data transfer using scp is not yet supported." ) trans.app.job_manager.deferred_job_queue.plugins[ deferred_plugin ].create_job( trans, sample=sample, sample_datasets=sample_datasets, external_service=external_service, external_service_type=external_service_type ) else: # TODO: Using RabbitMq for now, but eliminate this entire block when we replace RabbitMq with Galaxy's # own messaging engine. We're holding off on using the new way to transfer files manually until we # implement a Galaxy-proprietary messaging engine because the deferred job plugins currently perform # constant db hits to check for deferred jobs that are not in a finished state. # Create the message messages = self.__create_data_transfer_messages( trans, sample, sample_datasets ) # Send the messages for rmq_msg in messages: try: conn = amqp.Connection( host=trans.app.config.amqp[ 'host' ] + ":" + trans.app.config.amqp[ 'port' ], userid=trans.app.config.amqp[ 'userid' ], password=trans.app.config.amqp[ 'password' ], virtual_host=trans.app.config.amqp[ 'virtual_host' ], insist=False ) chan = conn.channel() msg = amqp.Message( rmq_msg, content_type='text/plain', application_headers={ 'msg_type': 'data_transfer' } ) msg.properties[ "delivery_mode" ] = 2 chan.basic_publish( msg, exchange=trans.app.config.amqp[ 'exchange' ], routing_key=trans.app.config.amqp[ 'routing_key' ] ) chan.close() conn.close() except Exception, e: message = "Error sending the data transfer message to the Galaxy AMQP message queue:<br/>%s" % str(e) status = "error" if not message: message = "%i datasets have been queued for transfer from the external service." % len( sample_datasets ) status = "done"
def manage_datasets( self, trans, **kwd ): def handle_error( **kwd ): kwd[ 'status' ] = 'error' return trans.response.send_redirect( web.url_for( controller='requests_admin', action='manage_datasets', **kwd ) ) params = util.Params( kwd ) message = util.restore_text( params.get( 'message', '' ) ) status = params.get( 'status', 'done' ) sample_id = params.get( 'sample_id', None ) try: sample = trans.sa_session.query( trans.model.Sample ).get( trans.security.decode_id ( sample_id ) ) except: return invalid_id_redirect( trans, 'requests_admin', sample_id, 'sample' ) if 'operation' in kwd: operation = kwd[ 'operation' ].lower() sample_dataset_id = params.get( 'id', None ) if not sample_dataset_id: message = 'Select at least 1 dataset to %s.' % operation kwd[ 'message' ] = message del kwd[ 'operation' ] handle_error( **kwd ) id_list = util.listify( sample_dataset_id ) selected_sample_datasets = [] for sample_dataset_id in id_list: try: sample_dataset = trans.sa_session.query( trans.model.SampleDataset ).get( trans.security.decode_id( sample_dataset_id ) ) except: return invalid_id_redirect( trans, 'requests_admin', sample_dataset_id, 'sample dataset' ) selected_sample_datasets.append( sample_dataset ) if operation == "view": return trans.fill_template( '/admin/requests/view_sample_dataset.mako', cntrller='requests_admin', sample_dataset=selected_sample_datasets[0] ) elif operation == "delete": not_deleted = [] for sample_dataset in selected_sample_datasets: # Make sure the dataset has been transferred before deleting it. if sample_dataset in sample_dataset.sample.untransferred_dataset_files: # Save the sample dataset sample = sample_dataset.sample trans.sa_session.delete( sample_dataset ) trans.sa_session.flush() else: not_deleted.append( sample_dataset.name ) message = '%i datasets have been deleted.' % ( len( id_list ) - len( not_deleted ) ) if not_deleted: status = 'warning' message = message + ' %s could not be deleted because their transfer status is not "Not Started". ' % str( not_deleted ) return trans.response.send_redirect( web.url_for( controller='requests_admin', action='manage_datasets', sample_id=trans.security.encode_id( sample.id ), status=status, message=message ) ) elif operation == "rename": # If one of the selected sample datasets is in the NOT_STARTED state, # then display an error message. A NOT_STARTED state implies the dataset # has not yet been transferred. no_datasets_transferred = True for selected_sample_dataset in selected_sample_datasets: if selected_sample_dataset in selected_sample_dataset.sample.untransferred_dataset_files: no_datasets_transferred = False break if no_datasets_transferred: status = 'error' message = 'A dataset can be renamed only if it has been transferred.' return trans.response.send_redirect( web.url_for( controller='requests_admin', action='manage_datasets', sample_id=trans.security.encode_id( selected_sample_datasets[0].sample.id ), status=status, message=message ) ) return trans.fill_template( '/admin/requests/rename_datasets.mako', sample=selected_sample_datasets[0].sample, id_list=id_list ) elif operation == "transfer": self.initiate_data_transfer( trans, trans.security.encode_id( selected_sample_datasets[0].sample.id ), sample_datasets=selected_sample_datasets ) elif operation == "view_external_service": return trans.response.send_redirect( web.url_for( controller='external_service', action='view_external_service', **kwd ) ) # Render the grid view request_id = trans.security.encode_id( sample.request.id ) library_id = trans.security.encode_id( sample.library.id ) self.datatx_grid.title = 'Manage "%s" datasets' % sample.name self.datatx_grid.global_actions = [ grids.GridAction( "Browse target data library", dict( controller='library_common', action='browse_library', cntrller='library_admin', id=library_id ) ), grids.GridAction( "Browse this request", dict( controller='requests_common', action='view_request', cntrller='requests_admin', id=request_id ) ) ] return self.datatx_grid( trans, **kwd )