From b065817a952a2edea42e2b9cb8a4ec30ce95592b Mon Sep 17 00:00:00 2001 From: Greg Von Kuster Date: Wed, 8 Jun 2011 15:46:20 -0400 Subject: [PATCH] Fix sample tracking to correctly import samples from a csv file. --- lib/galaxy/web/controllers/requests_common.py | 116 +++++++++++++----- .../community/controllers/repository.py | 3 - templates/requests/common/add_samples.mako | 33 +++-- test/functional/test_sample_tracking.py | 6 +- 4 files changed, 103 insertions(+), 55 deletions(-) diff --git a/lib/galaxy/web/controllers/requests_common.py b/lib/galaxy/web/controllers/requests_common.py index 6a32d04e7bd..8635f1cb75f 100644 --- a/lib/galaxy/web/controllers/requests_common.py +++ b/lib/galaxy/web/controllers/requests_common.py @@ -826,7 +826,9 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): displayable_sample_widgets = self.__get_sample_widgets( trans, request, request.samples, **kwd ) if params.get( 'import_samples_button', False ): # Import sample field values from a csv file - return self.__import_samples( trans, cntrller, request, displayable_sample_widgets, libraries, **kwd ) + # TODO: should this be a mapper? + workflows = [ w.latest_workflow for w in trans.user.stored_workflows if not w.deleted ] + return self.__import_samples( trans, cntrller, request, displayable_sample_widgets, libraries, workflows, **kwd ) elif params.get( 'add_sample_button', False ): return self.add_sample( trans, cntrller, request_id, **kwd ) elif params.get( 'save_samples_button', False ): @@ -905,17 +907,17 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): folder_id=folder_id, **kwd ) history_select_field = self.__build_history_select_field( trans=trans, - user=request.user, - sample_index=len( displayable_sample_widgets ), - history_id=history_id, - **kwd) + user=request.user, + sample_index=len( displayable_sample_widgets ), + history_id=history_id, + **kwd ) workflow_select_field = self.__build_workflow_select_field( trans=trans, - user=request.user, - request=request, - sample_index=len( displayable_sample_widgets ), - workflow_id=workflow_id, - history_id=history_id, - **kwd) + user=request.user, + request=request, + sample_index=len( displayable_sample_widgets ), + workflow_id=workflow_id, + history_id=history_id, + **kwd ) # Append the new sample to the current list of samples for the request displayable_sample_widgets.append( dict( id=None, name=name, @@ -1045,47 +1047,99 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): transfer_status=transfer_status, message=message, status=status ) - def __import_samples( self, trans, cntrller, request, displayable_sample_widgets, libraries, **kwd ): + def __import_samples( self, trans, cntrller, request, displayable_sample_widgets, libraries, workflows, **kwd ): """ Reads the samples csv file and imports all the samples. The format of the csv file is: - SampleName,DataLibrary,DataLibraryFolder,Field1,Field2.... + SampleName,DataLibraryName,DataLibraryFolderName,HistoryName,WorkflowName,FieldValue1,FieldValue2... """ params = util.Params( kwd ) + current_user_roles = trans.get_current_user_roles() + is_admin = trans.user_is_admin() and cntrller == 'requests_admin' file_obj = params.get( 'file_data', '' ) try: reader = csv.reader( file_obj.file ) for row in reader: library_id = None + library = None folder_id = None - # FIXME: this is bad - what happens when multiple libraries have the same name?? - lib = trans.sa_session.query( trans.model.Library ) \ - .filter( and_( trans.model.Library.table.c.name==row[1], - trans.model.Library.table.c.deleted==False ) ) \ - .first() - if lib: - folder = trans.sa_session.query( trans.model.LibraryFolder ) \ - .filter( and_( trans.model.LibraryFolder.table.c.name==row[2], - trans.model.LibraryFolder.table.c.deleted==False ) ) \ - .first() + folder = None + history_id = None + history = None + workflow_id = None + workflow = None + # Get the library + library = trans.sa_session.query( trans.model.Library ) \ + .filter( and_( trans.model.Library.table.c.name==row[1], + trans.model.Library.table.c.deleted==False ) ) \ + .first() + if library: + # Get the folder + for folder in trans.sa_session.query( trans.model.LibraryFolder ) \ + .filter( and_( trans.model.LibraryFolder.table.c.name==row[2], + trans.model.LibraryFolder.table.c.deleted==False ) ): + if folder.parent_library == library: + break if folder: - library_id = lib.id - folder_id = folder.id + library_id = trans.security.encode_id( library.id ) + folder_id = trans.security.encode_id( folder.id ) library_select_field, folder_select_field = self.__build_library_and_folder_select_fields( trans, request.user, - len( displayable_sample_widgets ), + len( displayable_sample_widgets ), libraries, None, library_id, folder_id, **kwd ) + # Get the history + history = trans.sa_session.query( trans.model.History ) \ + .filter( and_( trans.model.History.table.c.name==row[3], + trans.model.History.table.c.deleted==False, + trans.model.History.user_id == trans.user.id ) ) \ + .first() + if history: + history_id = trans.security.encode_id( history.id ) + else: + history_id = 'none' + history_select_field = self.__build_history_select_field( trans=trans, + user=request.user, + sample_index=len( displayable_sample_widgets ), + history_id=history_id ) + # Get the workflow + workflow = trans.sa_session.query( trans.model.StoredWorkflow ) \ + .filter( and_( trans.model.StoredWorkflow.table.c.name==row[4], + trans.model.StoredWorkflow.table.c.deleted==False, + trans.model.StoredWorkflow.user_id == trans.user.id ) ) \ + .first() + if workflow: + workflow_id = trans.security.encode_id( workflow.id ) + else: + workflow_id = 'none' + workflow_select_field = self.__build_workflow_select_field( trans=trans, + user=request.user, + request=request, + sample_index=len( displayable_sample_widgets ), + workflow_id=workflow_id, + history_id=history_id ) + field_values = {} + field_names = row[5:] + for field_name in field_names: + field_values[ field_name ] = '' displayable_sample_widgets.append( dict( id=None, - name=row[0], + name=row[0], bar_code='', - library=None, - folder=None, + library=library, + library_id=library_id, library_select_field=library_select_field, + folder=folder, + folder_id=folder_id, folder_select_field=folder_select_field, - field_values=row[3:] ) ) + history=history, + history_id=history_id, + history_select_field=history_select_field, + workflow=workflow, + workflow_id=workflow_id, + workflow_select_field=workflow_select_field, + field_values=field_values ) ) except Exception, e: if str( e ) == "'unicode' object has no attribute 'file'": message = "Select a file" @@ -1488,7 +1542,7 @@ class RequestsCommon( BaseController, UsesFormDefinitions ): library_select_field=library_select_field, folder_select_field=folder_select_field, history_select_field=history_select_field, - workflow_select_field=workflow_select_field, ) ) + workflow_select_field=workflow_select_field ) ) # There may be additional new samples on the form that have not yet been associated with the request. # TODO: factor this code so it is not duplicating what's above. index = len( samples ) diff --git a/lib/galaxy/webapps/community/controllers/repository.py b/lib/galaxy/webapps/community/controllers/repository.py index 00eb6e57760..605f9f920e0 100644 --- a/lib/galaxy/webapps/community/controllers/repository.py +++ b/lib/galaxy/webapps/community/controllers/repository.py @@ -269,9 +269,6 @@ class RepositoryController( BaseController, ItemRatings ): category_ids = util.listify( params.get( 'category_id', '' ) ) selected_categories = [ trans.security.decode_id( id ) for id in category_ids ] if params.get( 'create_repository_button', False ): - # TODOS: - # 1. Make sure we can update the version column in the repository table when new change set are pushed. - # If it's triclky, eliminate the column. error = False message = self.__validate_repository_name( name, trans.user ) if message: diff --git a/templates/requests/common/add_samples.mako b/templates/requests/common/add_samples.mako index 6f7a42aabf5..d68d10646df 100644 --- a/templates/requests/common/add_samples.mako +++ b/templates/requests/common/add_samples.mako @@ -61,7 +61,7 @@ ${render_samples_messages(request, is_admin, is_submitted, message, status)}
%if displayable_sample_widgets: <% - grid_header = '

Add Samples to Sequencing Request "%s"

' % request.name + grid_header = '

Add samples to sequencing request "%s"

' % request.name %> ${render_samples_grid( cntrller, request, displayable_sample_widgets, action='edit_samples', adding_new_samples=True, encoded_selected_sample_ids=[], render_buttons=False, grid_header=grid_header )}
@@ -89,8 +89,6 @@ ${render_samples_messages(request, is_admin, is_submitted, message, status)} %endif

- ## hidden element to make twill work. - ## Greg will fix this %if ( request.samples or displayable_sample_widgets ) and len( displayable_sample_widgets ) > len( request.samples ): @@ -111,22 +109,19 @@ ${render_samples_messages(request, is_admin, is_submitted, message, status)}
%if is_unsubmitted:

- ##

- ##
Import samples from csv file
-

Hide Import samples from csv file

-
-
- -
- - -
- The csv file must be in the following format:
- SampleName,DataLibrary,DataLibraryFolder,FieldValue1,FieldValue2... -
+

HideImport samples from csv file

+
+
+ +
+ + +
+ The csv file must be in the following format:
+ SampleName,DataLibraryName,DataLibraryFolderName,HistoryName,WorkflowName,FieldValue1,FieldValue2...
- -
+
+
- ##
+
%endif diff --git a/test/functional/test_sample_tracking.py b/test/functional/test_sample_tracking.py index ba35a857a65..15e9f825a80 100644 --- a/test/functional/test_sample_tracking.py +++ b/test/functional/test_sample_tracking.py @@ -465,7 +465,7 @@ class TestFormsAndSampleTracking( TwillTestCase ): request_id=self.security.encode_id( request1.id ), sample_value_tuples=sample_value_tuples, folder_options=folder_options, - strings_displayed=[ 'Add Samples to Sequencing Request "%s"' % request1.name, + strings_displayed=[ 'Add samples to sequencing request "%s"' % request1.name, '' ], # sample name input field strings_displayed_after_submit=strings_displayed_after_submit ) # check the new sample field values on the request page @@ -704,7 +704,7 @@ class TestFormsAndSampleTracking( TwillTestCase ): self.add_samples( cntrller='requests_admin', request_id=self.security.encode_id( request2.id ), sample_value_tuples=sample_value_tuples, - strings_displayed=[ 'Add Samples to Sequencing Request "%s"' % request2.name, + strings_displayed=[ 'Add samples to sequencing request "%s"' % request2.name, '' ], # sample name input field strings_displayed_after_submit=strings_displayed_after_submit ) # Submit the request @@ -869,6 +869,7 @@ class TestFormsAndSampleTracking( TwillTestCase ): sample1_dataset.transfer_status.NOT_STARTED ] self.view_sample_dataset( sample_dataset_id=self.security.encode_id( sample1_dataset.id ), strings_displayed=strings_displayed ) + ''' def test_999_reset_data_for_later_test_runs( self ): """Reseting data to enable later test runs to pass""" # Logged in as admin_user @@ -934,3 +935,4 @@ class TestFormsAndSampleTracking( TwillTestCase ): # Manually delete the group from the database refresh( group ) delete_obj( group ) + '''