Eliminate the use of the 'editing_samples' flag by adding the code needed to add new samples without calling the edit_samples method or mako template. Decoupling the different features makes them much cleaner and easier to maintain.

This commit is contained in:
Greg Von Kuster
2011-01-03 11:11:00 -05:00
parent 04072aa87a
commit 5e2d7e83f1
8 changed files with 265 additions and 173 deletions
+5 -1
View File
@@ -36,8 +36,12 @@ class Requests( BaseController ):
action='edit_basic_request_info',
cntrller='requests',
**kwd ) )
if operation == "add_samples":
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='add_samples',
cntrller='requests',
**kwd ) )
if operation == "edit_samples":
kwd[ 'editing_samples' ] = True
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
cntrller='requests',
+5 -2
View File
@@ -104,8 +104,12 @@ class RequestsAdmin( BaseController, UsesFormDefinitions ):
action='edit_basic_request_info',
cntrller='requests_admin',
**kwd ) )
if operation == "add_samples":
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='add_samples',
cntrller='requests_admin',
**kwd ) )
if operation == "edit_samples":
kwd[ 'editing_samples' ] = True
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
cntrller='requests_admin',
@@ -379,7 +383,6 @@ class RequestsAdmin( BaseController, UsesFormDefinitions ):
action='edit_samples',
cntrller='requests_admin',
id=trans.security.encode_id( request.id ),
editing_samples=True,
status=status,
message=message ) )
# Save the sample datasets
+83 -76
View File
@@ -415,7 +415,7 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
status=status,
message=message ) )
@web.expose
@web.require_login( "manage samples" )
@web.require_login( "edit samples" )
def edit_samples( self, trans, cntrller, **kwd ):
params = util.Params( kwd )
is_admin = cntrller == 'requests_admin' and trans.user_is_admin()
@@ -426,20 +426,11 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
except:
return invalid_id_redirect( trans, cntrller, request_id )
# This method is called when the user is adding new samples as well as
# editing existing samples, so we use the editing_samples flag to keep
# track of what's occurring.
# TODO: CRITICAL: We need another round of code fixes to abstract out
# adding samples vs editing samples. We need to eliminate the need for
# this editing_samples flag since it is not maintainable. Greg will do
# this work as soon as possible.
editing_samples = util.string_as_bool( params.get( 'editing_samples', False ) )
if params.get( 'cancel_changes_button', False ):
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
cntrller=cntrller,
id=request_id,
editing_samples=editing_samples ) )
id=request_id ) )
libraries = trans.app.security_agent.get_accessible_libraries( trans, request.user )
# Build a list of sample widgets (based on the attributes of each sample) for display.
displayable_sample_widgets = self.__get_sample_widgets( trans, request, request.samples, **kwd )
@@ -457,12 +448,7 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
message = 'Select at least one sample before selecting an operation.'
kwd[ 'message' ] = message
handle_error( **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 )
elif params.get( 'add_sample_button', False ):
return self.add_sample( trans, cntrller, request_id, **kwd )
elif params.get( 'save_samples_button', False ):
if params.get( 'save_samples_button', False ):
if encoded_selected_sample_ids:
# We need the list of displayable_sample_widgets to include the same number
# of objects that that request.samples has so that we can enumerate over each
@@ -485,9 +471,9 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
sample_widgets = self.__get_sample_widgets( trans, request, samples, **kwd )
else:
sample_widgets = displayable_sample_widgets
return self.__save_samples( trans, cntrller, request, sample_widgets, **kwd )
return self.__save_samples( trans, cntrller, request, sample_widgets, saving_new_samples=False, **kwd )
request_widgets = self.__get_request_widgets( trans, request.id )
sample_copy = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
sample_copy_select_field = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
libraries_select_field, folders_select_field = self.__build_library_and_folder_select_fields( trans,
request.user,
'sample_operation',
@@ -503,13 +489,12 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
encoded_selected_sample_ids=encoded_selected_sample_ids,
request_widgets=request_widgets,
displayable_sample_widgets=displayable_sample_widgets,
sample_copy=sample_copy,
sample_copy_select_field=sample_copy_select_field,
libraries=libraries,
sample_operation_select_field=sample_operation_select_field,
libraries_select_field=libraries_select_field,
folders_select_field=folders_select_field,
sample_state_id_select_field=sample_state_id_select_field,
editing_samples=editing_samples,
status=status,
message=message )
@web.expose
@@ -697,40 +682,33 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
trans.sa_session.flush()
if cntrller == 'api':
return 200, message
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
cntrller=cntrller,
id=request_id,
editing_samples=True,
status=status,
message=message ) )
final_state = False
request_type_state = request.type.final_sample_state
if common_state.id == request_type_state.id:
# since all the samples are in the final state, change the request state to 'Complete'
comment = "All samples of this sequencing request are in the final sample state (%s). " % request_type_state.name
state = request.states.COMPLETE
final_state = True
else:
comment = "All samples of this sequencing request are in the (%s) sample state. " % common_state.name
state = request.states.SUBMITTED
event = trans.model.RequestEvent( request, state, comment )
trans.sa_session.add( event )
trans.sa_session.flush()
# See if an email notification is configured to be sent when the samples
# are in this state.
retval = request.send_email_notification( trans, common_state, final_state )
if retval:
message = comment + retval
else:
message = comment
if cntrller == 'api':
return 200, message
final_state = False
request_type_state = request.type.final_sample_state
if common_state.id == request_type_state.id:
# since all the samples are in the final state, change the request state to 'Complete'
comment = "All samples of this sequencing request are in the final sample state (%s). " % request_type_state.name
state = request.states.COMPLETE
final_state = True
else:
comment = "All samples of this sequencing request are in the (%s) sample state. " % common_state.name
state = request.states.SUBMITTED
event = trans.model.RequestEvent( request, state, comment )
trans.sa_session.add( event )
trans.sa_session.flush()
# See if an email notification is configured to be sent when the samples
# are in this state.
retval = request.send_email_notification( trans, common_state, final_state )
if retval:
message = comment + retval
else:
message = comment
if cntrller == 'api':
return 200, message
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
cntrller=cntrller,
id=request_id,
editing_samples=True,
status=status,
message=message ) )
@web.expose
@@ -811,6 +789,47 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
cntrller=cntrller,
sample=sample )
@web.expose
@web.require_login( "add samples" )
def add_samples( self, trans, cntrller, **kwd ):
params = util.Params( kwd )
is_admin = cntrller == 'requests_admin' and trans.user_is_admin()
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
request_id = params.get( 'id', None )
try:
request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
except:
return invalid_id_redirect( trans, cntrller, request_id )
libraries = trans.app.security_agent.get_accessible_libraries( trans, request.user )
# Build a list of sample widgets (based on the attributes of each sample) for display.
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 )
elif params.get( 'add_sample_button', False ):
return self.add_sample( trans, cntrller, request_id, **kwd )
elif params.get( 'save_samples_button', False ):
return self.__save_samples( trans, cntrller, request, displayable_sample_widgets, saving_new_samples=True, **kwd )
request_widgets = self.__get_request_widgets( trans, request.id )
sample_copy_select_field = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
libraries_select_field, folders_select_field = self.__build_library_and_folder_select_fields( trans,
request.user,
'sample_operation',
libraries,
None,
**kwd )
return trans.fill_template( '/requests/common/add_samples.mako',
cntrller=cntrller,
request=request,
request_widgets=request_widgets,
displayable_sample_widgets=displayable_sample_widgets,
sample_copy_select_field=sample_copy_select_field,
libraries=libraries,
libraries_select_field=libraries_select_field,
folders_select_field=folders_select_field,
status=status,
message=message )
@web.expose
@web.require_login( "add sample" )
def add_sample( self, trans, cntrller, request_id, **kwd ):
params = util.Params( kwd )
@@ -870,19 +889,13 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
field_values=field_values,
library_select_field=library_select_field,
folder_select_field=folder_select_field ) )
encoded_selected_sample_ids = self.__get_encoded_selected_sample_ids( trans, request, **kwd )
sample_operation = params.get( 'sample_operation', 'none' )
sample_operation_select_field = self.__build_sample_operation_select_field( trans, is_admin, request, sample_operation )
sample_copy = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
return trans.fill_template( '/requests/common/edit_samples.mako',
sample_copy_select_field = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
return trans.fill_template( '/requests/common/add_samples.mako',
cntrller=cntrller,
request=request,
encoded_selected_sample_ids=encoded_selected_sample_ids,
request_widgets=request_widgets,
displayable_sample_widgets=displayable_sample_widgets,
sample_operation_select_field=sample_operation_select_field,
sample_copy=sample_copy,
editing_samples=False,
sample_copy_select_field=sample_copy_select_field,
message=message,
status=status )
@web.expose
@@ -931,7 +944,6 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
action='edit_samples',
cntrller=cntrller,
id=trans.security.encode_id( request.id ),
editing_samples=True,
status=status,
message=message ) )
@web.expose
@@ -957,7 +969,6 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
action='edit_samples',
cntrller=cntrller,
id=trans.security.encode_id( sample.request.id ),
editing_samples=True,
status=status,
message=message ) )
transfer_status = params.get( 'transfer_status', None )
@@ -1042,15 +1053,14 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
status='error',
message=message ) )
request_widgets = self.__get_request_widgets( trans, request.id )
sample_copy = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
return trans.fill_template( '/requests/common/edit_samples.mako',
sample_copy_select_field = self.__build_copy_sample_select_field( trans, displayable_sample_widgets )
return trans.fill_template( '/requests/common/add_samples.mako',
cntrller=cntrller,
request=request,
request_widgets=request_widgets,
displayable_sample_widgets=displayable_sample_widgets,
sample_copy=sample_copy,
editing_samples=False )
def __save_samples( self, trans, cntrller, request, samples, **kwd ):
sample_copy_select_field=sample_copy_select_field )
def __save_samples( self, trans, cntrller, request, samples, saving_new_samples=False, **kwd ):
# Here we handle saving all new samples added by the user as well as saving
# changes to any subset of the request's samples. A sample will not have an
# associated SampleState until the request is submitted, at which time the
@@ -1059,18 +1069,21 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
editing_samples = util.string_as_bool( params.get( 'editing_samples', False ) )
is_admin = cntrller == 'requests_admin' and trans.user_is_admin()
sample_operation = params.get( 'sample_operation', 'none' )
if saving_new_samples:
redirect_action = 'add_samples'
else:
redirect_action = 'edit_samples'
# Check for duplicate sample names within the request
self.__validate_sample_names( trans, cntrller, request, samples, **kwd )
if editing_samples:
if not saving_new_samples:
library = None
folder = None
def handle_error( **kwd ):
kwd[ 'status' ] = 'error'
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
action=redirect_action,
cntrller=cntrller,
**kwd ) )
# Here we handle saving changes to single samples as well as saving changes to
@@ -1156,10 +1169,9 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
trans.sa_session.add( s )
trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests_common',
action='edit_samples',
action=redirect_action,
cntrller=cntrller,
id=trans.security.encode_id( request.id ),
editing_samples=editing_samples,
status=status,
message=message ) )
def __update_samples( self, trans, cntrller, request, sample_widgets, **kwd ):
@@ -1275,10 +1287,6 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
"""
params = util.Params( kwd )
sample_operation = params.get( 'sample_operation', 'none' )
# This method is called when the user is adding new samples as well as
# editing existing samples, so we use the editing_samples flag to keep
# track of what's occurring.
editing_samples = util.string_as_bool( params.get( 'editing_samples', False ) )
sample_widgets = []
if sample_operation != 'none':
# The sample_operatin param has a value other than 'none', and a specified
@@ -1488,7 +1496,6 @@ class RequestsCommon( BaseController, UsesFormDefinitions ):
return None
def __validate_sample_names( self, trans, cntrller, request, displayable_sample_widgets, **kwd ):
# Check for duplicate sample names for all samples of the request.
editing_samples = util.string_as_bool( kwd.get( 'editing_samples', False ) )
message = ''
for index in range( len( displayable_sample_widgets ) - len( request.samples ) ):
sample_index = index + len( request.samples )
+138
View File
@@ -0,0 +1,138 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/requests/common/common.mako" import="common_javascripts" />
<%namespace file="/requests/common/common.mako" import="render_samples_grid" />
<%namespace file="/requests/common/common.mako" import="render_request_type_sample_form_grids" />
<%def name="stylesheets()">
${parent.stylesheets()}
${h.css( "library" )}
</%def>
<%def name="javascripts()">
${parent.javascripts()}
${common_javascripts()}
</%def>
<%
from galaxy.web.framework.helpers import time_ago
is_admin = cntrller == 'requests_admin' and trans.user_is_admin()
is_complete = request.is_complete
is_submitted = request.is_submitted
is_unsubmitted = request.is_unsubmitted
can_add_samples = is_unsubmitted
can_delete_samples = request.samples and not is_complete
can_edit_samples = request.samples and ( is_admin or not is_complete )
can_edit_request = ( is_admin and not request.is_complete ) or request.is_unsubmitted
can_reject = is_admin and is_submitted
can_submit = request.samples and is_unsubmitted
%>
<br/><br/>
<ul class="manage-table-actions">
%if can_edit_samples:
<li><a class="action-button" href="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">Edit samples</a></li>
%endif
%if can_submit:
<li><a class="action-button" confirm="More samples cannot be added to this request after it is submitted. Click OK to submit." href="${h.url_for( controller='requests_common', action='submit_request', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">Submit request</a></li>
%endif
<li><a class="action-button" id="request-${request.id}-popup" class="menubutton">Request Actions</a></li>
<div popupmenu="request-${request.id}-popup">
<a class="action-button" href="${h.url_for( controller='requests_common', action='view_request', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">Browse this request</a>
%if can_edit_request:
<a class="action-button" href="${h.url_for( controller='requests_common', action='edit_basic_request_info', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">Edit this request</a>
%endif
<a class="action-button" href="${h.url_for( controller='requests_common', action='view_request_history', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">View history</a>
%if can_reject:
<a class="action-button" href="${h.url_for( controller='requests_admin', action='reject_request', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">Reject this request</a>
%endif
</div>
</ul>
%if request.is_rejected:
<p>
<font color="red"><b>${request.last_comment}</b></font>
</p>
%endif
%if is_admin and is_submitted and request.samples_without_library_destinations:
<p>
<font color="red"><b><i>Select a target data library and folder for a sample before selecting it's datasets to transfer from the sequencer</i></b></font>
</p>
%endif
%if message:
${render_msg( message, status )}
%endif
<div class="toolFormBody">
<form id="add_samples" name="add_samples" action="${h.url_for( controller='requests_common', action='add_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}" method="post">
%if displayable_sample_widgets:
<%
grid_header = '<h3>Add Samples to Sequencing Request "%s"</h3>' % 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 )}
## Render the other grids
<% trans.sa_session.refresh( request.type.sample_form ) %>
%for grid_index, grid_name in enumerate( request.type.sample_form.layout ):
${render_request_type_sample_form_grids( grid_index, grid_name, request.type.sample_form.grid_fields( grid_index ), displayable_sample_widgets=displayable_sample_widgets, adding_new_samples=True )}
%endfor
%else:
<label>There are no samples.</label>
%endif
%if is_unsubmitted:
## The user is adding a new sample
%if displayable_sample_widgets:
<p/>
<div class="form-row">
<label> Copy <input type="text" name="num_sample_to_copy" value="1" size="3"/> samples from sample ${sample_copy_select_field.get_html()}</label>
<div class="toolParamHelp" style="clear: both;">
Select the sample from which the new sample should be copied or leave selection as <b>None</b> to add a new "generic" sample.
</div>
</div>
%endif
<p/>
<div class="form-row">
## hidden element to make twill work.
## Greg will fix this
<input type="hidden" name="twill" value=""/>
%if ( request.samples or displayable_sample_widgets ) and len( displayable_sample_widgets ) > len( request.samples ):
<input type="submit" name="add_sample_button" value="Add sample" />
<input type="submit" name="save_samples_button" value="Save"/>
<input type="submit" name="cancel_changes_button" value="Cancel"/>
<div class="toolParamHelp" style="clear: both;">
Click the <b>Add sample</b> button for each new sample and click the <b>Save</b> button when you have finished adding samples.
</div>
%else:
<input type="submit" name="add_sample_button" value="Add sample"/>
<div class="toolParamHelp" style="clear: both;">
Click the <b>Add sample</b> button for each new sample.
</div>
%endif
</div>
%endif
</form>
</div>
%if is_unsubmitted:
<p/>
##<div class="toolForm">
##<div class="toolFormTitle">Import samples from csv file</div>
<h4><img src="/static/images/fugue/toggle-expand.png" alt="Hide" onclick="showContent(this);" style="cursor:pointer;"/> Import samples from csv file</h4>
<div style="display:none;">
<div class="toolFormBody">
<form id="import" name="import" action="${h.url_for( controller='requests_common', action='add_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}" enctype="multipart/form-data" method="post" >
<div class="form-row">
<input type="file" name="file_data" />
<input type="submit" name="import_samples_button" value="Import samples"/>
<div class="toolParamHelp" style="clear: both;">
The csv file must be in the following format:<br/>
SampleName,DataLibrary,DataLibraryFolder,FieldValue1,FieldValue2...
</div>
</div>
</form>
</div>
</div>
##</div>
%endif
+12 -12
View File
@@ -181,7 +181,7 @@
%endif
</%def>
<%def name="render_editable_sample_row( cntrller, request, sample, sample_widget_index, sample_widget, encoded_selected_sample_ids )">
<%def name="render_editable_sample_row( cntrller, request, sample, sample_widget_index, sample_widget, encoded_selected_sample_ids, adding_new_samples=False )">
<%
trans.sa_session.refresh( request )
is_admin = cntrller == 'requests_admin' and trans.user_is_admin()
@@ -190,8 +190,8 @@
is_submitted = request.is_submitted
is_unsubmitted = request.is_unsubmitted
if sample:
can_delete_samples = editing_samples and request.samples and ( ( is_admin and not is_complete ) or is_unsubmitted )
display_checkboxes = editing_samples and ( is_complete or is_rejected or is_submitted )
can_delete_samples = not adding_new_samples and request.samples and ( ( is_admin and not is_complete ) or is_unsubmitted )
display_checkboxes = not adding_new_samples and ( is_complete or is_rejected or is_submitted )
display_datasets = request.samples and ( is_complete or is_submitted )
else:
can_delete_samples = False
@@ -288,7 +288,7 @@
%endif
</%def>
<%def name="render_samples_grid( cntrller, request, displayable_sample_widgets, action, editing_samples=False, encoded_selected_sample_ids=[], render_buttons=False, grid_header='<h3>Samples</h3>' )">
<%def name="render_samples_grid( cntrller, request, displayable_sample_widgets, action, adding_new_samples=False, encoded_selected_sample_ids=[], render_buttons=False, grid_header='<h3>Samples</h3>' )">
## Displays the "Samples" grid
<%
trans.sa_session.refresh( request )
@@ -298,11 +298,11 @@
is_submitted = request.is_submitted
is_unsubmitted = request.is_unsubmitted
can_add_samples = request.is_unsubmitted
can_delete_samples = editing_samples and request.samples and ( ( is_admin and not is_complete ) or is_unsubmitted )
can_delete_samples = not adding_new_samples and request.samples and ( ( is_admin and not is_complete ) or is_unsubmitted )
can_edit_samples = request.samples and ( is_admin or not is_complete )
can_select_datasets = is_admin and displayable_sample_widgets and ( is_submitted or is_complete )
can_transfer_datasets = is_admin and request.samples and not request.is_rejected
display_checkboxes = editing_samples and ( is_complete or is_rejected or is_submitted )
display_checkboxes = not adding_new_samples and ( is_complete or is_rejected or is_submitted )
display_bar_code = request.samples and ( is_complete or is_rejected or is_submitted )
display_datasets = request.samples and ( is_complete or is_submitted )
%>
@@ -313,7 +313,7 @@
<li><a class="action-button" href="${h.url_for( controller='requests_common', action='add_sample', cntrller=cntrller, request_id=trans.security.encode_id( request.id ), add_sample_button='Add sample' )}">Add sample</a></li>
%endif
%if can_edit_samples:
<li><a class="action-button" href="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ), editing_samples='True' )}">Edit samples</a></li>
<li><a class="action-button" href="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}">Edit samples</a></li>
%endif
</ul>
%endif
@@ -366,8 +366,8 @@
except:
sample = None
%>
%if editing_samples:
<tr>${render_editable_sample_row( cntrller, request, sample, sample_widget_index, sample_widget, encoded_selected_sample_ids )}</tr>
%if not adding_new_samples:
<tr>${render_editable_sample_row( cntrller, request, sample, sample_widget_index, sample_widget, encoded_selected_sample_ids, adding_new_samples=False )}</tr>
%elif sample:
<tr>
<td>
@@ -463,7 +463,7 @@
</tr>
%else:
## The Add sample button was clicked for this sample_widget
<tr>${render_editable_sample_row( cntrller, request, None, sample_widget_index, sample_widget, encoded_selected_sample_ids )}</tr>
<tr>${render_editable_sample_row( cntrller, request, None, sample_widget_index, sample_widget, encoded_selected_sample_ids, adding_new_samples=True )}</tr>
%endif
%endfor
</tbody>
@@ -552,7 +552,7 @@
</tr>
</%def>
<%def name="render_request_type_sample_form_grids( grid_index, grid_name, fields_dict, displayable_sample_widgets, editing_samples )">
<%def name="render_request_type_sample_form_grids( grid_index, grid_name, fields_dict, displayable_sample_widgets, adding_new_samples )">
<%
if not grid_name:
grid_name = "Sample form layout " + grid_index
@@ -575,7 +575,7 @@
<% trans.sa_session.refresh( request ) %>
%for sample_index, sample in enumerate( displayable_sample_widgets ):
<%
if editing_samples or sample_index >= len( request.samples ):
if not adding_new_samples or sample_index >= len( request.samples ):
display_only = False
else:
display_only = True
+16 -76
View File
@@ -38,7 +38,6 @@
is_unsubmitted = request.is_unsubmitted
can_add_samples = is_unsubmitted
can_delete_samples = request.samples and not is_complete
can_edit_samples = request.samples and ( is_admin or not is_complete )
can_edit_request = ( is_admin and not request.is_complete ) or request.is_unsubmitted
can_reject = is_admin and is_submitted
can_submit = request.samples and is_unsubmitted
@@ -47,10 +46,7 @@
<br/><br/>
<ul class="manage-table-actions">
%if not editing_samples and can_edit_samples:
<li><a class="action-button" href="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ), editing_samples='True' )}">Edit samples</a></li>
%endif
%if editing_samples and can_add_samples:
%if can_add_samples:
<li><a class="action-button" href="${h.url_for( controller='requests_common', action='add_sample', cntrller=cntrller, request_id=trans.security.encode_id( request.id ), add_sample_button='Add sample' )}">Add sample</a></li>
%endif
%if can_submit:
@@ -86,16 +82,13 @@
%endif
<div class="toolFormBody">
<form id="edit_samples" name="edit_samples" action="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ), editing_samples=editing_samples )}" method="post">
<form id="edit_samples" name="edit_samples" action="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ) )}" method="post">
%if displayable_sample_widgets:
<%
if editing_samples:
grid_header = '<h3>Edit Current Samples of Sequencing Request "%s"</h3>' % request.name
else:
grid_header = '<h3>Add Samples to Sequencing Request "%s"</h3>' % request.name
grid_header = '<h3>Edit Current Samples of Sequencing Request "%s"</h3>' % request.name
%>
${render_samples_grid( cntrller, request, displayable_sample_widgets, action='edit_samples', editing_samples=editing_samples, encoded_selected_sample_ids=encoded_selected_sample_ids, render_buttons=False, grid_header=grid_header )}
%if editing_samples and len( sample_operation_select_field.options ) > 1 and not is_unsubmitted:
${render_samples_grid( cntrller, request, displayable_sample_widgets, action='edit_samples', encoded_selected_sample_ids=encoded_selected_sample_ids, render_buttons=False, grid_header=grid_header )}
%if len( sample_operation_select_field.options ) > 1 and not is_unsubmitted:
<div class="form-row" style="background-color:#FAFAFA;">
For selected samples:
${sample_operation_select_field.get_html()}
@@ -133,53 +126,21 @@
## Render the other grids
<% trans.sa_session.refresh( request.type.sample_form ) %>
%for grid_index, grid_name in enumerate( request.type.sample_form.layout ):
${render_request_type_sample_form_grids( grid_index, grid_name, request.type.sample_form.grid_fields( grid_index ), displayable_sample_widgets=displayable_sample_widgets, editing_samples=editing_samples )}
${render_request_type_sample_form_grids( grid_index, grid_name, request.type.sample_form.grid_fields( grid_index ), displayable_sample_widgets=displayable_sample_widgets, adding_new_samples=False )}
%endfor
%else:
<label>There are no samples.</label>
%endif
%if not editing_samples and is_unsubmitted:
## The user is adding a new sample
%if displayable_sample_widgets:
<p/>
<div class="form-row">
<label> Copy <input type="text" name="num_sample_to_copy" value="1" size="3"/> samples from sample ${sample_copy.get_html()}</label>
<div class="toolParamHelp" style="clear: both;">
Select the sample from which the new sample should be copied or leave selection as <b>None</b> to add a new "generic" sample.
</div>
</div>
%endif
<p/>
<div class="form-row">
## hidden element to make twill work.
## Greg will fix this
<input type="hidden" name="twill" value=""/>
%if ( request.samples or displayable_sample_widgets ) and ( editing_samples or len( displayable_sample_widgets ) > len( request.samples ) ):
<input type="submit" name="add_sample_button" value="Add sample" />
<input type="submit" name="save_samples_button" value="Save"/>
<input type="submit" name="cancel_changes_button" value="Cancel"/>
<div class="toolParamHelp" style="clear: both;">
Click the <b>Add sample</b> button for each new sample and click the <b>Save</b> button when you have finished adding samples.
</div>
%else:
<input type="submit" name="add_sample_button" value="Add sample"/>
<div class="toolParamHelp" style="clear: both;">
Click the <b>Add sample</b> button for each new sample.
</div>
%endif
</div>
%elif editing_samples:
<p/>
<div class="form-row">
## hidden element to make twill work.
## Greg will fix this
<input type="hidden" name="twill" value=""/>
<input type="submit" name="save_samples_button" value="Save"/>
<input type="submit" name="cancel_changes_button" value="Cancel"/>
<div class="toolParamHelp" style="clear: both;">
Click the <b>Save</b> button when you have finished editing the samples
</div>
%endif
<p/>
<div class="form-row">
## hidden element to make twill work.
## Greg will fix this
<input type="hidden" name="twill" value=""/>
<input type="submit" name="save_samples_button" value="Save"/>
<input type="submit" name="cancel_changes_button" value="Cancel"/>
<div class="toolParamHelp" style="clear: both;">
Click the <b>Save</b> button when you have finished editing the samples
</div>
%if request.samples and request.is_submitted:
<script type="text/javascript">
// Updater
@@ -188,24 +149,3 @@
%endif
</form>
</div>
%if is_unsubmitted and not editing_samples:
<p/>
##<div class="toolForm">
##<div class="toolFormTitle">Import samples from csv file</div>
<h4><img src="/static/images/fugue/toggle-expand.png" alt="Hide" onclick="showContent(this);" style="cursor:pointer;"/> Import samples from csv file</h4>
<div style="display:none;">
<div class="toolFormBody">
<form id="import" name="import" action="${h.url_for( controller='requests_common', action='edit_samples', cntrller=cntrller, id=trans.security.encode_id( request.id ), editing_samples=editing_samples )}" enctype="multipart/form-data" method="post" >
<div class="form-row">
<input type="file" name="file_data" />
<input type="submit" name="import_samples_button" value="Import samples"/>
<div class="toolParamHelp" style="clear: both;">
The csv file must be in the following format:<br/>
SampleName,DataLibrary,DataLibraryFolder,FieldValue1,FieldValue2...
</div>
</div>
</form>
</div>
</div>
##</div>
%endif
+2 -2
View File
@@ -160,11 +160,11 @@
grid_header = '<h3>Samples</h3>'
render_buttons = can_edit_samples
%>
${render_samples_grid( cntrller, request, displayable_sample_widgets=displayable_sample_widgets, action='view_request', editing_samples=False, encoded_selected_sample_ids=[], render_buttons=render_buttons, grid_header=grid_header )}
${render_samples_grid( cntrller, request, displayable_sample_widgets=displayable_sample_widgets, action='view_request', adding_new_samples=True, encoded_selected_sample_ids=[], render_buttons=render_buttons, grid_header=grid_header )}
## Render the other grids
<% trans.sa_session.refresh( request.type.sample_form ) %>
%for grid_index, grid_name in enumerate( request.type.sample_form.layout ):
${render_request_type_sample_form_grids( grid_index, grid_name, request.type.sample_form.grid_fields( grid_index ), displayable_sample_widgets=displayable_sample_widgets, editing_samples=False )}
${render_request_type_sample_form_grids( grid_index, grid_name, request.type.sample_form.grid_fields( grid_index ), displayable_sample_widgets=displayable_sample_widgets, adding_new_samples=False )}
%endfor
%else:
There are no samples.
+4 -4
View File
@@ -1605,7 +1605,7 @@ class TwillTestCase( unittest.TestCase ):
for check_str in strings_displayed_after_submit:
self.check_page_for_string( check_str )
def edit_samples( self, cntrller, request_id, sample_value_tuples, strings_displayed=[], strings_displayed_after_submit=[] ):
url = "%s/requests_common/edit_samples?cntrller=%s&id=%s&editing_samples=True" % ( self.url, cntrller, request_id )
url = "%s/requests_common/edit_samples?cntrller=%s&id=%s" % ( self.url, cntrller, request_id )
self.visit_url( url )
for check_str in strings_displayed:
self.check_page_for_string( check_str )
@@ -1620,7 +1620,7 @@ class TwillTestCase( unittest.TestCase ):
for check_str in strings_displayed_after_submit:
self.check_page_for_string( check_str )
def add_bar_codes( self, cntrller, request_id, bar_codes, strings_displayed=[], strings_displayed_after_submit=[] ):
url = "%s/requests_common/edit_samples?cntrller=%s&id=%s&editing_samples=True" % ( self.url, cntrller, request_id )
url = "%s/requests_common/edit_samples?cntrller=%s&id=%s" % ( self.url, cntrller, request_id )
self.visit_url( url )
for check_str in strings_displayed:
self.check_page_for_string( check_str )
@@ -1642,7 +1642,7 @@ class TwillTestCase( unittest.TestCase ):
for check_str in strings_displayed_after_submit:
self.check_page_for_string( check_str )
def change_sample_state( self, request_id, sample_ids, new_sample_state_id, comment='', strings_displayed=[], strings_displayed_after_submit=[] ):
url = "%s/requests_common/edit_samples?cntrller=requests_admin&id=%s&editing_samples=True" % ( self.url, request_id )
url = "%s/requests_common/edit_samples?cntrller=requests_admin&id=%s" % ( self.url, request_id )
self.visit_url( url )
for check_str in strings_displayed:
self.check_page_for_string( check_str )
@@ -1658,7 +1658,7 @@ class TwillTestCase( unittest.TestCase ):
for check_str in strings_displayed_after_submit:
self.check_page_for_string( check_str )
def change_sample_target_data_library( self, cntrller, request_id, sample_ids, new_library_id, new_folder_id, folder_options=[], comment='', strings_displayed=[], strings_displayed_after_submit=[] ):
url = "%s/requests_common/edit_samples?cntrller=%s&id=%s&editing_samples=True" % ( self.url, cntrller, request_id )
url = "%s/requests_common/edit_samples?cntrller=%s&id=%s" % ( self.url, cntrller, request_id )
self.visit_url( url )
for check_str in strings_displayed:
self.check_page_for_string( check_str )