lims: requests/request_admin controller refactor

A new controller called requests_common now handles all common tasks like create/edit/delete requests & samples. The requests controller has only the grid definition and requests_admin controller has the request_type code and the sequencer data transfer code.
Also fixed a form importer bug in forms.py
This commit is contained in:
Ramkrishna Chakrabarty
2010-06-30 10:46:50 -04:00
parent 8bb1bd4774
commit 45cb09579f
30 changed files with 1900 additions and 3501 deletions
+1 -2
View File
@@ -474,8 +474,7 @@ class Forms( BaseController ):
return trans.response.send_redirect( web.url_for( controller='forms',
action='new',
status='error',
message='Error in importing <b>%s</b> file' % csv_file,
**kwd))
message='Error in importing <b>%s</b> file' % csv_file.file))
self.__imported_from_file = True
return fields, list(layouts)
def __validate_form(self, **kwd):
+30 -922
View File
@@ -84,7 +84,7 @@ class RequestsGrid( grids.Grid ):
NameColumn( "Name",
key="name",
model_class=model.Request,
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ),
link=( lambda item: iff( item.deleted, None, dict( operation="show", id=item.id ) ) ),
attach_popup=True,
filterable="advanced" ),
DescriptionColumn( "Description",
@@ -92,7 +92,7 @@ class RequestsGrid( grids.Grid ):
model_class=model.Request,
filterable="advanced" ),
SamplesColumn( "Sample(s)",
link=( lambda item: iff( item.deleted, None, dict( operation="show_request", id=item.id ) ) ), ),
link=( lambda item: iff( item.deleted, None, dict( operation="show", id=item.id ) ) ), ),
TypeColumn( "Type" ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
grids.DeletedColumn( "Deleted",
@@ -120,7 +120,8 @@ class RequestsGrid( grids.Grid ):
]
global_actions = [
grids.GridAction( "Create new request", dict( controller='requests',
grids.GridAction( "Create new request", dict( controller='requests_common',
cntrller='requests',
action='new',
select_request_type='True' ) )
]
@@ -149,18 +150,36 @@ class Requests( BaseController ):
action='list',
status='error',
message="Invalid request ID") )
if operation == "show_request":
return self.__show_request( trans, **kwd )
if operation == "show":
return trans.response.send_redirect( web.url_for( controller='requests_common',
cntrller='requests',
action='show',
**kwd ) )
elif operation == "submit":
return self.__submit_request( trans, **kwd )
return trans.response.send_redirect( web.url_for( controller='requests_common',
cntrller='requests',
action='submit',
**kwd ) )
elif operation == "delete":
return self.__delete_request( trans, **kwd )
return trans.response.send_redirect( web.url_for( controller='requests_common',
cntrller='requests',
action='delete',
**kwd ) )
elif operation == "undelete":
return self.__undelete_request( trans, **kwd )
return trans.response.send_redirect( web.url_for( controller='requests_common',
cntrller='requests',
action='undelete',
**kwd ) )
elif operation == "edit":
return self.__edit_request( trans, **kwd )
return trans.response.send_redirect( web.url_for( controller='requests_common',
cntrller='requests',
action='edit',
show=True, **kwd ) )
elif operation == "events":
return self.__request_events( trans, **kwd )
return trans.response.send_redirect( web.url_for( controller='requests_common',
cntrller='requests',
action='events',
**kwd ) )
# if there are one or more requests that has been rejected by the admin
# recently, then show a message as a reminder to the user
rlist = trans.sa_session.query( trans.app.model.Request ) \
@@ -176,915 +195,4 @@ class Requests( BaseController ):
% rejected
# Render the list view
return self.request_grid( trans, **kwd )
def __request_events(self, trans, **kwd):
try:
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
message = "Invalid request ID"
log.warn( message )
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message=message,
**kwd) )
events_list = []
all_events = request.events
for event in all_events:
events_list.append((event.state, time_ago(event.update_time), event.comment))
return trans.fill_template( '/requests/events.mako',
events_list=events_list, request=request)
def request_details(self, trans, id):
'''
Shows the request details
'''
request = trans.sa_session.query( trans.app.model.Request ).get( id )
# list of widgets to be rendered on the request form
request_details = []
# main details
request_details.append(dict(label='Description',
value=request.desc,
helptext=''))
request_details.append(dict(label='Type',
value=request.type.name,
helptext=''))
request_details.append(dict(label='State',
value=request.state(),
helptext=''))
request_details.append(dict(label='Date created',
value=request.create_time,
helptext=''))
# form fields
for index, field in enumerate(request.type.request_form.fields):
if field['required']:
req = 'Required'
else:
req = 'Optional'
if field['type'] == 'AddressField':
if request.values.content[index]:
request_details.append(dict(label=field['label'],
value=trans.sa_session.query( trans.app.model.UserAddress ).get( int( request.values.content[index] ) ).get_html(),
helptext=field['helptext']+' ('+req+')'))
else:
request_details.append(dict(label=field['label'],
value=None,
helptext=field['helptext']+' ('+req+')'))
else:
request_details.append(dict(label=field['label'],
value=request.values.content[index],
helptext=field['helptext']+' ('+req+')'))
if request.notify:
notify = 'Yes'
else:
notify = 'No'
request_details.append(dict(label='Send email notification once the sequencing request is complete',
value=notify,
helptext=''))
return request_details
def __show_request(self, trans, **kwd):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
add_sample = params.get('add_sample', False)
try:
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message="Invalid request ID") )
# get all data libraries accessible to this user
libraries = request.user.accessible_libraries( trans, [ trans.app.security_agent.permitted_actions.LIBRARY_ADD ] )
current_samples = []
for i, s in enumerate(request.samples):
lib_widget, folder_widget = self.__library_widgets(trans, request.user, i, libraries, s, **kwd)
current_samples.append(dict(name=s.name,
barcode=s.bar_code,
library=s.library,
folder=s.folder,
dataset_files=s.dataset_files,
field_values=s.values.content,
lib_widget=lib_widget,
folder_widget=folder_widget))
if add_sample:
lib_widget, folder_widget = self.__library_widgets(trans, request.user,
len(current_samples)+1,
libraries, None, **kwd)
current_samples.append(dict(name='Sample_%i' % (len(current_samples)+1),
barcode='',
library=None,
folder=None,
dataset_files=[],
field_values=['' for field in request.type.sample_form.fields],
lib_widget=lib_widget,
folder_widget=folder_widget))
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples=current_samples,
sample_copy=self.__copy_sample(current_samples),
details='hide', edit_mode=util.restore_text( params.get( 'edit_mode', 'False' ) ),
message=message, status=status )
def __library_widgets(self, trans, user, sample_index, libraries, sample=None, lib_id=None, folder_id=None, **kwd):
'''
This method creates the data library & folder selectbox for creating &
editing samples. First we get a list of all the libraries accessible to
the current user and display it in a selectbox. If the user has selected an
existing library then display all the accessible sub folders of the selected
data library.
'''
params = util.Params( kwd )
# data library selectbox
if not lib_id:
lib_id = params.get( "sample_%i_library_id" % sample_index, 'none' )
selected_lib = None
if sample and lib_id == 'none':
if sample.library:
lib_id = str(sample.library.id)
selected_lib = sample.library
# create data library selectbox with refresh on change enabled
lib_id_list = ['new'] + [str(lib.id) for lib in libraries.keys()]
lib_widget = SelectField( "sample_%i_library_id" % sample_index,
refresh_on_change=True,
refresh_on_change_values=lib_id_list )
# fill up the options in the Library selectbox
# first option 'none' is the value for "Select one" option
if lib_id == 'none':
lib_widget.add_option('Select one', 'none', selected=True)
else:
lib_widget.add_option('Select one', 'none')
# all the libraries available to the selected user
for lib, hidden_folder_ids in libraries.items():
if str(lib.id) == str(lib_id):
lib_widget.add_option(lib.name, lib.id, selected=True)
selected_lib, selected_hidden_folder_ids = lib, hidden_folder_ids.split(',')
else:
lib_widget.add_option(lib.name, lib.id)
lib_widget.refresh_on_change_values.append(lib.id)
# create the folder selectbox
folder_widget = SelectField( "sample_%i_folder_id" % sample_index )
# when editing a request, either the user has already selected a subfolder or not
if sample:
if sample.folder:
current_fid = sample.folder.id
else:
# when a folder not yet associated with the request then the
# the current folder is set to the root_folder of the
# parent data library if present.
if sample.library:
current_fid = sample.library.root_folder.id
else:
current_fid = params.get( "sample_%i_folder_id" % sample_index, 'none' )
else:
if folder_id:
current_fid = folder_id
else:
current_fid = 'none'
# first option
if lib_id == 'none':
folder_widget.add_option('Select one', 'none', selected=True)
else:
folder_widget.add_option('Select one', 'none')
if selected_lib:
# get all show-able folders for the selected library
showable_folders = trans.app.security_agent.get_showable_folders( user, user.all_roles(),
selected_lib,
[ trans.app.security_agent.permitted_actions.LIBRARY_ADD ],
selected_hidden_folder_ids )
for f in showable_folders:
if str(f.id) == str(current_fid):
folder_widget.add_option(f.name, f.id, selected=True)
else:
folder_widget.add_option(f.name, f.id)
return lib_widget, folder_widget
def __update_samples(self, trans, request, **kwd):
'''
This method retrieves all the user entered sample information and
returns an list of all the samples and their field values
'''
params = util.Params( kwd )
details = params.get( 'details', 'hide' )
edit_mode = params.get( 'edit_mode', 'False' )
# get all data libraries accessible to this user
libraries = request.user.accessible_libraries( trans, [ trans.app.security_agent.permitted_actions.LIBRARY_ADD ] )
current_samples = []
for i, s in enumerate(request.samples):
lib_widget, folder_widget = self.__library_widgets(trans, request.user, i, libraries, s, **kwd)
current_samples.append(dict(name=s.name,
barcode=s.bar_code,
library=s.library,
folder=s.folder,
field_values=s.values.content,
lib_widget=lib_widget,
folder_widget=folder_widget))
if edit_mode == 'False':
sample_index = len(request.samples)
else:
sample_index = 0
while True:
lib_id = None
folder_id = None
if params.get( 'sample_%i_name' % sample_index, '' ):
# data library
try:
library = trans.sa_session.query( trans.app.model.Library ).get( int( params.get( 'sample_%i_library_id' % sample_index, None ) ) )
lib_id = library.id
except:
library = None
# folder
try:
folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( int( params.get( 'sample_%i_folder_id' % sample_index, None ) ) )
folder_id = folder.id
except:
if library:
folder = library.root_folder
else:
folder = None
sample_info = dict( name=util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) ),
barcode=util.restore_text( params.get( 'sample_%i_barcode' % sample_index, '' ) ),
library=library,
folder=folder)
sample_info['field_values'] = []
for field_index in range(len(request.type.sample_form.fields)):
sample_info['field_values'].append(util.restore_text( params.get( 'sample_%i_field_%i' % (sample_index, field_index), '' ) ))
if edit_mode == 'False':
sample_info['lib_widget'], sample_info['folder_widget'] = self.__library_widgets(trans,
request.user,
sample_index,
libraries,
None, lib_id, folder_id, **kwd)
current_samples.append(sample_info)
else:
sample_info['lib_widget'], sample_info['folder_widget'] = self.__library_widgets(trans,
request.user,
sample_index,
libraries,
request.samples[sample_index],
**kwd)
current_samples[sample_index] = sample_info
sample_index = sample_index + 1
else:
break
return current_samples, details, edit_mode, libraries
def __copy_sample(self, current_samples):
copy_list = SelectField('copy_sample')
copy_list.add_option('None', -1, selected=True)
for i, s in enumerate(current_samples):
copy_list.add_option(s['name'], i)
return copy_list
def __import_samples(self, trans, request, current_samples, details, libraries, **kwd):
'''
This method reads the samples csv file and imports all the samples
The format of the csv file is:
SampleName,DataLibrary,DataLibraryFolder,Field1,Field2....
'''
try:
params = util.Params( kwd )
edit_mode = params.get( 'edit_mode', 'False' )
file_obj = params.get('file_data', '')
reader = csv.reader(file_obj.file)
for row in reader:
lib_id = None
folder_id = None
lib = trans.sa_session.query( trans.app.model.Library ) \
.filter( and_( trans.app.model.Library.table.c.name==row[1], \
trans.app.model.Library.table.c.deleted==False ) )\
.first()
if lib:
folder = trans.sa_session.query( trans.app.model.LibraryFolder ) \
.filter( and_( trans.app.model.LibraryFolder.table.c.name==row[2], \
trans.app.model.LibraryFolder.table.c.deleted==False ) )\
.first()
if folder:
lib_id = lib.id
folder_id = folder.id
lib_widget, folder_widget = self.__library_widgets(trans, request.user, len(current_samples),
libraries, None, lib_id, folder_id, **kwd)
current_samples.append(dict(name=row[0],
barcode='',
library=None,
folder=None,
lib_widget=lib_widget,
folder_widget=folder_widget,
field_values=row[3:]))
return trans.fill_template( '/admin/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples=current_samples,
sample_copy=self.__copy_sample(current_samples),
details=details,
edit_mode=edit_mode)
except:
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
operation='show_request',
id=trans.security.encode_id(request.id),
status='error',
message='Error in importing samples file' ))
@web.expose
@web.require_login( "create/submit sequencing requests" )
def show_request(self, trans, **kwd):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
try:
request = trans.sa_session.query( trans.app.model.Request ).get( int( params.get( 'request_id', None ) ) )
except:
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message="Invalid request ID",
**kwd) )
# get the user entered sample details
current_samples, details, edit_mode, libraries = self.__update_samples( trans, request, **kwd )
if params.get('import_samples_button', False) == 'Import samples':
return self.__import_samples(trans, request, current_samples, details, libraries, **kwd)
elif params.get('add_sample_button', False) == 'Add New':
# add an empty or filled sample
# if the user has selected a sample no. to copy then copy the contents
# of the src sample to the new sample else an empty sample
src_sample_index = int(params.get( 'copy_sample', -1 ))
# get the number of new copies of the src sample
num_sample_to_copy = int(params.get( 'num_sample_to_copy', 1 ))
if src_sample_index == -1:
for ns in range(num_sample_to_copy):
# empty sample
lib_widget, folder_widget = self.__library_widgets(trans, request.user,
len(current_samples),
libraries, None, **kwd)
current_samples.append(dict(name='Sample_%i' % (len(current_samples)+1),
barcode='',
library=None,
folder=None,
field_values=['' for field in request.type.sample_form.fields],
lib_widget=lib_widget,
folder_widget=folder_widget))
else:
src_library_id = current_samples[src_sample_index]['lib_widget'].get_selected()[1]
src_folder_id = current_samples[src_sample_index]['folder_widget'].get_selected()[1]
for ns in range(num_sample_to_copy):
lib_widget, folder_widget = self.__library_widgets(trans, request.user,
len(current_samples),
libraries, sample=None,
lib_id=src_library_id,
folder_id=src_folder_id,
**kwd)
current_samples.append(dict(name=current_samples[src_sample_index]['name']+'_%i' % (len(current_samples)+1),
barcode='',
library_id='none',
folder_id='none',
field_values=[val for val in current_samples[src_sample_index]['field_values']],
lib_widget=lib_widget,
folder_widget=folder_widget))
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples=current_samples,
sample_copy=self.__copy_sample(current_samples),
details=details,
edit_mode=edit_mode)
elif params.get('save_samples_button', False) == 'Save':
# check for duplicate sample names
message = ''
for index in range(len(current_samples)-len(request.samples)):
sample_index = index + len(request.samples)
sample_name = current_samples[sample_index]['name']
if not sample_name.strip():
message = 'Please enter the name of sample number %i' % sample_index
break
count = 0
for i in range(len(current_samples)):
if sample_name == current_samples[i]['name']:
count = count + 1
if count > 1:
message = "This request has <b>%i</b> samples with the name <b>%s</b>.\nSamples belonging to a request must have unique names." % (count, sample_name)
break
if message:
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples = current_samples,
sample_copy=self.__copy_sample(current_samples),
details=details, edit_mode=edit_mode,
status='error', message=message)
# save all the new/unsaved samples entered by the user
if edit_mode == 'False':
for index in range(len(current_samples)-len(request.samples)):
sample_index = len(request.samples)
form_values = trans.app.model.FormValues(request.type.sample_form,
current_samples[sample_index]['field_values'])
trans.sa_session.add( form_values )
trans.sa_session.flush()
s = trans.app.model.Sample(current_samples[sample_index]['name'], '',
request, form_values,
current_samples[sample_index]['barcode'],
current_samples[sample_index]['library'],
current_samples[sample_index]['folder'],
dataset_files=[])
trans.sa_session.add( s )
trans.sa_session.flush()
else:
status = 'done'
message = 'Changes made to the sample(s) are saved. '
for sample_index in range(len(current_samples)):
sample = request.samples[sample_index]
sample.name = current_samples[sample_index]['name']
sample.library = current_samples[sample_index]['library']
sample.folder = current_samples[sample_index]['folder']
if request.submitted():
bc_message = self.__validate_barcode(trans, sample, current_samples[sample_index]['barcode'])
if bc_message:
status = 'error'
message += bc_message
else:
sample.bar_code = current_samples[sample_index]['barcode']
trans.sa_session.add( sample )
trans.sa_session.flush()
form_values = trans.sa_session.query( trans.app.model.FormValues ).get( sample.values.id )
form_values.content = current_samples[sample_index]['field_values']
trans.sa_session.add( form_values )
trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
operation='show_request',
id=trans.security.encode_id(request.id),
status=status,
message=message ))
elif params.get('edit_samples_button', False) == 'Edit samples':
edit_mode = 'True'
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples=current_samples,
sample_copy=self.__copy_sample(current_samples),
details=details, libraries=libraries,
edit_mode=edit_mode)
elif params.get('cancel_changes_button', False) == 'Cancel':
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
operation='show_request',
id=trans.security.encode_id(request.id)) )
else:
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples=current_samples,
sample_copy=self.__copy_sample(current_samples),
details=details, libraries=libraries,
edit_mode=edit_mode, status=status, message=message)
@web.expose
@web.require_login( "create/submit sequencing requests" )
def delete_sample(self, trans, **kwd):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
request = trans.sa_session.query( trans.app.model.Request ).get( int( params.get( 'request_id', 0 ) ) )
current_samples, details, edit_mode = self.__update_samples( request, **kwd )
sample_index = int(params.get('sample_id', 0))
sample_name = current_samples[sample_index]['name']
s = request.has_sample(sample_name)
if s:
trans.sa_session.delete( s.values )
trans.sa_session.delete( s )
trans.sa_session.flush()
del current_samples[sample_index]
return trans.fill_template( '/requests/show_request.mako',
request=request,
request_details=self.request_details(trans, request.id),
current_samples = current_samples,
sample_copy=self.__copy_sample(current_samples),
details=details,
edit_mode=edit_mode)
def __select_request_type(self, trans, rtid):
requesttype_list = trans.user.accessible_request_types(trans)
rt_ids = ['none']
for rt in requesttype_list:
if not rt.deleted:
rt_ids.append(str(rt.id))
select_reqtype = SelectField('select_request_type',
refresh_on_change=True,
refresh_on_change_values=rt_ids[1:])
if rtid == 'none':
select_reqtype.add_option('Select one', 'none', selected=True)
else:
select_reqtype.add_option('Select one', 'none')
for rt in requesttype_list:
if not rt.deleted:
if rtid == rt.id:
select_reqtype.add_option(rt.name, rt.id, selected=True)
else:
select_reqtype.add_option(rt.name, rt.id)
return select_reqtype
@web.expose
@web.require_login( "create/submit sequencing requests" )
def new(self, trans, **kwd):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
if params.get('select_request_type', False) == 'True':
return trans.fill_template( '/requests/new_request.mako',
select_request_type=self.__select_request_type(trans, 'none'),
widgets=[],
message=message,
status=status)
elif params.get('create', False) == 'True':
if params.get('create_request_button', False) == 'Save' \
or params.get('create_request_samples_button', False) == 'Add samples':
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( int( params.select_request_type ) )
if not util.restore_text(params.get('name', '')):
message = 'Please enter the <b>Name</b> of the request'
kwd['create'] = 'True'
kwd['status'] = 'error'
kwd['message'] = message
kwd['create_request_button'] = None
kwd['create_request_samples_button'] = None
return trans.response.send_redirect( web.url_for( controller='requests',
action='new',
**kwd) )
request = self.__save_request(trans, None, **kwd)
message = 'The new request named <b>%s</b> has been created' % request.name
if params.get('create_request_button', False) == 'Save':
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
message=message ,
status='done') )
elif params.get('create_request_samples_button', False) == 'Add samples':
new_kwd = {}
new_kwd['id'] = trans.security.encode_id(request.id)
new_kwd['operation'] = 'show_request'
new_kwd['add_sample'] = True
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
message=message ,
status='done',
**new_kwd) )
else:
return self.__show_request_form(trans, **kwd)
elif params.get('refresh', False) == 'true':
return self.__show_request_form(trans, **kwd)
def __show_request_form(self, trans, **kwd):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
try:
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( int( params.select_request_type ) )
except:
return trans.fill_template( '/requests/new_request.mako',
select_request_type=self.__select_request_type(trans, 'none'),
widgets=[],
message=message,
status=status)
form_values = None
select_request_type = self.__select_request_type(trans, request_type.id)
# list of widgets to be rendered on the request form
widgets = []
widgets.append(dict(label='Name of the Experiment',
widget=TextField('name', 40,
util.restore_text( params.get( 'name', '' ) )),
helptext='(Required)'))
widgets.append(dict(label='Description',
widget=TextField('desc', 40,
util.restore_text( params.get( 'desc', '' ) )),
helptext='(Optional)'))
widgets = widgets + request_type.request_form.get_widgets( trans.user, **kwd )
widgets.append(dict(label='Send email notification once the sequencing request is complete',
widget=CheckboxField('email_notify', False),
helptext=''))
return trans.fill_template( '/requests/new_request.mako',
select_request_type=select_request_type,
request_type=request_type,
widgets=widgets,
message=message,
status=status)
def __validate(self, trans, request):
'''
Validates the request entered by the user
'''
empty_fields = []
# check rest of the fields of the form
for index, field in enumerate(request.type.request_form.fields):
if field['required'] == 'required' and request.values.content[index] in ['', None]:
empty_fields.append(field['label'])
if empty_fields:
message = 'Fill the following fields of the request <b>%s</b> before submitting<br/>' % request.name
for ef in empty_fields:
message = message + '<b>' +ef + '</b><br/>'
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
operation='edit',
status = 'error',
message=message,
id=trans.security.encode_id(request.id) ))
# now check the required fields of all the samples of this request
for s in request.samples:
for index, field in enumerate(request.type.sample_form.fields):
if field['required'] == 'required' and s.values.content[index] in ['', None]:
empty_fields.append((s.name, field['label']))
if empty_fields:
message = 'Fill the following fields of the request <b>%s</b> before submitting<br/>' % request.name
for sname, ef in empty_fields:
message = message + '<b>%s</b> field of sample <b>%s</b><br/>' % (ef, sname)
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
operation='show_request',
status = 'error',
message=message,
id=trans.security.encode_id(request.id) ))
def __save_request(self, trans, request=None, **kwd):
'''
This method saves a new request if request_id is None.
'''
params = util.Params( kwd )
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( int( params.select_request_type ) )
name = util.restore_text(params.get('name', ''))
desc = util.restore_text(params.get('desc', ''))
notify = CheckboxField.is_checked( params.get('email_notify', '') )
# library
try:
library = trans.sa_session.query( trans.app.model.Library ).get( int( params.get( 'library_id', None ) ) )
except:
library = None
try:
folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( int( params.get( 'folder_id', None ) ) )
except:
if library:
folder = library.root_folder
else:
folder = None
# fields
values = []
for index, field in enumerate(request_type.request_form.fields):
if field['type'] == 'AddressField':
value = util.restore_text(params.get('field_%i' % index, ''))
if value == 'new':
# save this new address in the list of this user's addresses
user_address = trans.app.model.UserAddress( user=trans.user )
user_address.desc = util.restore_text(params.get('field_%i_short_desc' % index, ''))
user_address.name = util.restore_text(params.get('field_%i_name' % index, ''))
user_address.institution = util.restore_text(params.get('field_%i_institution' % index, ''))
user_address.address = util.restore_text(params.get('field_%i_address1' % index, ''))+' '+util.restore_text(params.get('field_%i_address2' % index, ''))
user_address.city = util.restore_text(params.get('field_%i_city' % index, ''))
user_address.state = util.restore_text(params.get('field_%i_state' % index, ''))
user_address.postal_code = util.restore_text(params.get('field_%i_postal_code' % index, ''))
user_address.country = util.restore_text(params.get('field_%i_country' % index, ''))
user_address.phone = util.restore_text(params.get('field_%i_phone' % index, ''))
trans.sa_session.add( user_address )
trans.sa_session.flush()
trans.sa_session.refresh( trans.user )
values.append(int(user_address.id))
elif value == unicode('none'):
values.append('')
else:
values.append(int(value))
elif field['type'] == 'CheckboxField':
values.append(CheckboxField.is_checked( params.get('field_%i' % index, '') ))
else:
values.append(util.restore_text(params.get('field_%i' % index, '')))
form_values = trans.app.model.FormValues(request_type.request_form, values)
trans.sa_session.add( form_values )
trans.sa_session.flush()
if not request:
request = trans.app.model.Request(name, desc, request_type,
trans.user, form_values, notify)
trans.sa_session.add( request )
trans.sa_session.flush()
trans.sa_session.refresh( request )
# create an event with state 'New' for this new request
comments = "Request created."
event = trans.app.model.RequestEvent(request, request.states.NEW, comments)
trans.sa_session.add( event )
trans.sa_session.flush()
else:
request.name = name
request.desc = desc
request.type = request_type
request.user = trans.user
request.values = form_values
request.notify = notify
trans.sa_session.add( request )
trans.sa_session.flush()
return request
@web.expose
@web.require_login( "create/submit sequencing requests" )
def edit(self, trans, **kwd):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
try:
request = trans.sa_session.query( trans.app.model.Request ).get( int( params.get( 'request_id', None ) ) )
except:
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message="Invalid request ID",
**kwd) )
if params.get('show', False) == 'True':
return self.__edit_request(trans, id=trans.security.encode_id(request.id), **kwd)
elif params.get('save_changes_request_button', False) == 'Save changes' \
or params.get('edit_samples_button', False) == 'Edit samples':
request_type = trans.sa_session.query( trans.app.model.RequestType ).get( int( params.select_request_type ) )
if not util.restore_text(params.get('name', '')):
message = 'Please enter the <b>Name</b> of the request'
kwd['status'] = 'error'
kwd['message'] = message
kwd['show'] = 'True'
return trans.response.send_redirect( web.url_for( controller='requests',
action='edit',
**kwd) )
request = self.__save_request(trans, request, **kwd)
message = 'The changes made to the request named %s has been saved' % request.name
if params.get('save_changes_request_button', False) == 'Save changes':
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
message=message ,
status='done') )
elif params.get('edit_samples_button', False) == 'Edit samples':
new_kwd = {}
new_kwd['request_id'] = request.id
new_kwd['edit_samples_button'] = 'Edit samples'
return trans.response.send_redirect( web.url_for( controller='requests',
action='show_request',
message=message ,
status='done',
**new_kwd) )
elif params.get('refresh', False) == 'true':
return self.__edit_request(trans, id=trans.security.encode_id(request.id), **kwd)
def __edit_request(self, trans, **kwd):
try:
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
message = "Invalid request ID"
log.warn( message )
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message=message) )
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
select_request_type = self.__select_request_type(trans, request.type.id)
# list of widgets to be rendered on the request form
widgets = []
if util.restore_text( params.get( 'name', '' ) ):
name = util.restore_text( params.get( 'name', '' ) )
else:
name = request.name
widgets.append(dict(label='Name',
widget=TextField('name', 40, name),
helptext='(Required)'))
if util.restore_text( params.get( 'desc', '' ) ):
desc = util.restore_text( params.get( 'desc', '' ) )
else:
desc = request.desc
widgets.append(dict(label='Description',
widget=TextField('desc', 40, desc),
helptext='(Optional)'))
widgets = widgets + request.type.request_form.get_widgets( trans.user, request.values.content, **kwd )
widgets.append(dict(label='Send email notification once the sequencing request is complete',
widget=CheckboxField('email_notify', request.notify),
helptext=''))
return trans.fill_template( '/requests/edit_request.mako',
select_request_type=select_request_type,
request_type=request.type,
request=request,
widgets=widgets,
message=message,
status=status)
return self.__show_request_form(trans)
def __delete_request(self, trans, **kwd):
id_list = util.listify( kwd['id'] )
delete_failed = []
for id in id_list:
try:
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
except:
message = "Invalid request ID"
log.warn( message )
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message=message,
**kwd) )
# a request cannot be deleted once its submitted
if not request.new():
delete_failed.append(request.name)
else:
request.deleted = True
trans.sa_session.add( request )
# delete all the samples belonging to this request
for s in request.samples:
s.deleted = True
trans.sa_session.add( s )
trans.sa_session.flush()
if not len(delete_failed):
message = '%i request(s) has been deleted.' % len(id_list)
status = 'done'
else:
message = '%i request(s) has been deleted. %i request %s could not be deleted as they have been submitted.' % (len(id_list)-len(delete_failed),
len(delete_failed), str(delete_failed))
status = 'warning'
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status=status,
message=message) )
def __undelete_request(self, trans, **kwd):
id_list = util.listify( kwd['id'] )
for id in id_list:
try:
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(id) )
except:
message = "Invalid request ID"
log.warn( message )
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message=message,
**kwd) )
request.deleted = False
trans.sa_session.add( request )
# undelete all the samples belonging to this request
for s in request.samples:
s.deleted = False
trans.sa_session.add( s )
trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='done',
message='%i request(s) has been undeleted.' % len(id_list) ) )
def __submit_request(self, trans, **kwd):
try:
request = trans.sa_session.query( trans.app.model.Request ).get( trans.security.decode_id(kwd['id']) )
except:
message = "Invalid request ID"
log.warn( message )
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message=message,
**kwd) )
# check if all the required request and its sample fields have been filled
self.__validate(trans, request)
# change the request state to 'Submitted'
comments = "Sequencing request is in progress."
event = trans.app.model.RequestEvent(request, request.states.SUBMITTED, comments)
trans.sa_session.add( event )
trans.sa_session.flush()
# get the new state
new_state = request.type.states[0]
for s in request.samples:
event = trans.app.model.SampleEvent(s, new_state, 'Samples submitted to the system')
trans.sa_session.add( event )
trans.sa_session.flush()
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
id=trans.security.encode_id(request.id),
status='done',
message='The request <b>%s</b> has been submitted.' % request.name
) )
@web.expose
@web.require_login( "create/submit sequencing requests" )
def show_events(self, trans, **kwd):
params = util.Params( kwd )
try:
sample_id = int(params.get('sample_id', False))
sample = trans.sa_session.query( trans.app.model.Sample ).get( sample_id )
except:
message = "Invalid sample ID"
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message=message,
**kwd) )
events_list = []
all_events = sample.events
for event in all_events:
events_list.append((event.state.name, event.state.desc, time_ago(event.update_time), event.comment))
return trans.fill_template( '/sample/sample_events.mako',
events_list=events_list,
sample_name=sample.name,
request=sample.request)
#
# Data transfer from sequencer
#
@web.expose
@web.require_login( "create/submit sequencing requests" )
def show_datatx_page( self, trans, **kwd ):
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
try:
sample = trans.sa_session.query( trans.app.model.Sample ).get( trans.security.decode_id( kwd['sample_id'] ) )
except:
return trans.response.send_redirect( web.url_for( controller='requests',
action='list',
status='error',
message="Invalid sample ID",
**kwd) )
return trans.fill_template( '/requests/show_data.mako',
sample=sample, dataset_files=sample.dataset_files )
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -194,7 +194,7 @@ class DataTransfer(object):
Update the data transfer status for this dataset in the database
'''
try:
log.debug('Setting status "%s" for dataset "%s"' % ( status, str(dataset_index) ) )
log.debug('Setting status "%s" for dataset "%s" of sample "%s"' % ( status, str(dataset_index), str(self.sample_id) ) )
df = from_json_string(self.galaxydb.get_sample_dataset_files(self.sample_id))
if dataset_index == 'All':
for dataset in self.dataset_files:
@@ -28,7 +28,7 @@ class GalaxyDbInterface(object):
def __init__(self, dbstr):
self.dbstr = dbstr
self.db_engine = create_engine(self.dbstr)
# self.db_engine.echo = True
self.db_engine.echo = True
self.metadata = MetaData(self.db_engine)
self.session = sessionmaker(bind=self.db_engine)
self.event_table = Table('sample_event', self.metadata, autoload=True )
-26
View File
@@ -1,26 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<div class="toolForm">
<div class="toolFormTitle">Create ${num_states} states for the '${request_type_name}' request type</div>
<form name="new_form_fields" action="${h.url_for( controller='requests_admin', action='request_type', name=request_type_name, description=desc, num_states=num_states, request_form_id=request_form_id, sample_form_id=sample_form_id)}" method="post" >
<div class="toolFormBody">
%for element_count in range( num_states ):
<div class="form-row">
<label>${1+element_count}) State name:</label>
<input type="text" name="state_name_${element_count}" value="" size="40"/>
<label>State help text (optional):</label>
<input type="text" name="state_desc_${element_count}" value="" size="40"/>
</div>
<div style="clear: both"></div>
%endfor
</div>
<div class="form-row">
<input type="submit" name="save_request_type" value="Save"/>
</div>
</form>
</div>
+1 -1
View File
@@ -11,7 +11,7 @@
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">
<a class="action-button" href="${h.url_for( controller='requests_common', action='show_datatx_page', cntrller='requests_admin', sample_id=trans.security.encode_id(sample.id) )}">
<span>Dataset transfer page</span></a>
</li>
</ul>
@@ -1,88 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$( function() {
$( "select[refresh_on_change='true']").change( function() {
var refresh = false;
var refresh_on_change_values = $( this )[0].attributes.getNamedItem( 'refresh_on_change_values' )
if ( refresh_on_change_values ) {
refresh_on_change_values = refresh_on_change_values.value.split( ',' );
var last_selected_value = $( this )[0].attributes.getNamedItem( 'last_selected_value' );
for( i= 0; i < refresh_on_change_values.length; i++ ) {
if ( $( this )[0].value == refresh_on_change_values[i] || ( last_selected_value && last_selected_value.value == refresh_on_change_values[i] ) ){
refresh = true;
break;
}
}
}
else {
refresh = true;
}
if ( refresh ){
$( "#edit_request" ).submit();
}
});
});
</script>
<br/>
<br/>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
<span>Browse this request</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
<div class="toolForm">
<div class="toolFormTitle">Edit request "${request.name}" from ${request.user.email}</div>
%if len(select_request_type.options) == 1:
There are no request types created for a new request.
%else:
<div class="toolFormBody">
<form name="edit_request" id="edit_request" action="${h.url_for( controller='requests_admin', action='edit', request_id=request.id)}" method="post" >
<div class="form-row">
<label>
Select Request Type:
</label>
${select_request_type.get_html()}
</div>
%if select_request_type.get_selected() != ('Select one', 'none'):
%for i, field in enumerate(widgets):
<div class="form-row">
<label>${field['label']}</label>
${field['widget'].get_html()}
%if field['label'] == 'Library' and new_library:
${new_library.get_html()}
%endif
<div class="toolParamHelp" style="clear: both;">
${field['helptext']}
</div>
<div style="clear: both"></div>
</div>
%endfor
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="refresh" value="true" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<input type="submit" name="save_changes_request_button" value="Save changes"/>
##<input type="submit" name="edit_samples_button" value="Edit samples"/>
</div>
%endif
</form>
</div>
</div>
%endif
-36
View File
@@ -1,36 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<h2>History of Sequencing Request "${request.name}"</h2>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<h3>User: ${request.user.email}</h3>
%if message:
${render_msg( message, status )}
%endif
<div class="toolForm">
<table class="grid">
<thead>
<tr>
<th>State</th>
<th>Last Update</th>
<th>Comments</th>
</tr>
</thead>
<tbody>
%for state, updated, comments in events_list:
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
<td><b><a>${state}</a></b></td>
<td><a>${updated}</a></td>
<td><a>${comments}</a></td>
</tr>
%endfor
</tbody>
</table>
</div>
-227
View File
@@ -1,227 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$(document).ready(function(){
//hide the all of the element with class msg_body
$(".msg_body").hide();
//toggle the componenet with class msg_body
$(".msg_head").click(function(){
$(this).next(".msg_body").slideToggle(450);
});
});
</script>
<script type="text/javascript">
function display_file_details(sample_id, folder_path)
{
var w = document.get_data.files_list.selectedIndex;
var selected_value = document.get_data.files_list.options[w].value;
var cell = $("#file_details");
if(selected_value.charAt(selected_value.length-1) != '/')
{
// Make ajax call
$.ajax( {
type: "POST",
url: "${h.url_for( controller='requests_admin', action='get_file_details' )}",
dataType: "json",
data: { id: sample_id, folder_path: document.get_data.folder_path.value+selected_value },
success : function ( data ) {
cell.html( '<label>'+data+'</label>' )
}
});
}
else
{
cell.html( '' )
}
}
</script>
<script type="text/javascript">
function open_folder1(sample_id, folder_path)
{
var w = document.get_data.files_list.selectedIndex;
var selected_value = document.get_data.files_list.options[w].value;
var cell = $("#file_details");
if(selected_value.charAt(selected_value.length-1) == '/')
{
document.get_data.folder_path.value = document.get_data.folder_path.value+selected_value
// Make ajax call
$.ajax( {
type: "POST",
url: "${h.url_for( controller='requests_admin', action='open_folder' )}",
dataType: "json",
data: { id: sample_id, folder_path: document.get_data.folder_path.value },
success : function ( data ) {
document.get_data.files_list.options.length = 0
for(i=0; i<data.length; i++)
{
var newOpt = new Option(data[i], data[i]);
document.get_data.files_list.options[i] = newOpt;
}
//cell.html( '<label>'+data+'</label>' )
}
});
}
else
{
cell.html( '' )
}
}
</script>
<style type="text/css">
.msg_head {
padding: 0px 0px;
cursor: pointer;
}
}
</style>
<h2>Data transfer from Sequencer</h2>
<h3>Sample "${sample.name}" of Request "${sample.request.name}"</h3>
<br/>
<br/>
<ul class="manage-table-actions">
%if sample.request.submitted() and sample.inprogress_dataset_files():
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">
<span>Refresh this page</span></a>
</li>
%endif
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='manage_request_types', operation='view', id=trans.security.encode_id(sample.request.type.id) )}">
<span>Sequencer information</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='library_common', action='browse_library', cntrller='library_admin', id=trans.security.encode_id( sample.library.id ) )}">
<span>${sample.library.name} Data Library</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(sample.request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<div class="toolForm">
%if len(dataset_files):
## <form name="get_data" action="${h.url_for( controller='requests_admin', action='get_data', sample_id=sample.id)}" method="post" >
<div class="form-row">
<h4>Sample Dataset(s)</h4>
%if sample.untransferred_dataset_files():
<div class="form-row">
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='get_data', start_transfer_button=True, sample_id=sample.id )}">
<span>Start transfer</span></a>
</li>
</ul>
</div>
%endif
<div class="form-row">
<table class="grid">
<thead>
<tr>
<th>Dataset File</th>
<th>Transfer Status</th>
<th></th>
</tr>
<thead>
<tbody>
%for dataset_index, dataset_file in enumerate(dataset_files):
${sample_dataset_files( dataset_index, dataset_file['name'], dataset_file['status'] )}
%endfor
</tbody>
</table>
</div>
</div>
## </form>
##</div>
<br/>
<br/>
%endif
##<div class="toolForm">
<form name="get_data" id="get_data" action="${h.url_for( controller='requests_admin', action='get_data', sample_id=sample.id)}" method="post" >
<div class="form-row">
##<div class="toolFormTitle">Select files for transfer</div>
<h4>Select files for transfer</h4>
<div style="width: 60%;">
<div class="form-row">
<label>Folder path on the sequencer:</label>
<input type="text" name="folder_path" value="${folder_path}" size="100"/>
<input type="submit" name="browse_button" value="List contents"/>
##<input type="submit" name="open_folder" value="Open folder"/>
<input type="submit" name="folder_up" value="Up"/>
</div>
<div class="form-row">
<select name="files_list" id="files_list" style="max-width: 98%; width: 98%; height: 150px; font-size: 100%;" ondblclick="open_folder1(${sample.id}, '${folder_path}')" onChange="display_file_details(${sample.id}, '${folder_path}')" multiple>
%for index, f in enumerate(files):
<option value="${f}">${f}</option>
%endfor
</select>
<br/>
<div id="file_details" class="toolParamHelp" style="clear: both;">
</div>
</div>
<div class="form-row">
<div class="toolParamHelp" style="clear: both;">
After selecting dataset(s), be sure to click on the <b>Start transfer</b> button.
Once the transfer is complete the dataset(s) will show up on this page.
</div>
<input type="submit" name="select_files_button" value="Select"/>
</div>
</div>
</div>
</form>
</div>
<%def name="sample_dataset_files( dataset_index, dataset_name, status )">
<tr>
<td>
<label class="msg_head"><a href="${h.url_for( controller='requests_admin', action='dataset_details', sample_id=trans.security.encode_id(sample.id), dataset_index=dataset_index )}">${dataset_name}</a></label>
## <div class="msg_head"><u>${dataset_file.split('/')[-1]}</u></div>
## <div class="msg_body">
## ${dataset_file}
## </div>
</td>
<td>
%if status not in [sample.transfer_status.NOT_STARTED, sample.transfer_status.COMPLETE]:
<i>${status}</i>
%else:
${status}
%endif
</td>
##<td></td>
%if status == sample.transfer_status.NOT_STARTED:
<td>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='get_data', sample_id=sample.id, remove_dataset_button=True, dataset_index=dataset_index )}">
<img src="${h.url_for('/static/images/delete_icon.png')}" />
<span></span></a>
</td>
%else:
<td></td>
%endif
</tr>
</%def>
-46
View File
@@ -1,46 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<h2>Bar codes for Samples of Request "${request.name}"</h2>
<h3>User: ${user.email}</h3>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<div class="toolForm">
<form name="bar_codes" action="${h.url_for( controller='requests_admin', action='save_bar_codes', request_id=request.id)}" method="post" >
<table class="grid">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Bar code</th>
</tr>
</thead>
<tbody>
%for index, sample in enumerate(samples_list):
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
<td><b><a>${sample.name}</a></b></td>
<td><a>${sample.desc}</a></td>
<td>
${widgets[index].get_html()}
</td>
</tr>
%endfor
</tbody>
</table>
<div class="form-row">
<input type="submit" name="save_bar_codes" value="Save"/>
</div>
</form>
</div>
-63
View File
@@ -1,63 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%def name="title()">Events for Sample ${sample.name}</%def>
<h2>Events for Sample "${sample.name}"</h2>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(sample.request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<h3>User: ${sample.request.user.email}</h3>
%if message:
${render_msg( message, status )}
%endif
<div class="toolForm">
<table class="grid">
<thead>
<tr>
<th>State</th>
<th>Description</th>
<th>Last Update</th>
<th>Comments</th>
</tr>
</thead>
<tbody>
%for state, desc, updated, comments in events_list:
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
<td><b><a>${state}</a></b></td>
<td><a>${desc}</a></td>
<td><a>${updated}</a></td>
<td><a>${comments}</a></td>
</tr>
%endfor
</tbody>
</table>
</div>
<div class="toolForm">
<div class="toolFormTitle">Change current state</div>
<div class="toolFormBody">
<form name="event" action="${h.url_for( controller='requests_admin', action='save_state', new=True, sample_id=sample.id)}" method="post" >
%for w in widgets:
<div class="form-row">
<label>
${w[0]}
</label>
${w[1].get_html()}
%if w[0] == 'Comments':
<div class="toolParamHelp" style="clear: both;">
Optional
</div>
%endif
</div>
%endfor
<div class="form-row">
<input type="submit" name="add_event_button" value="Save"/>
</div>
</form>
</div>
</div>
@@ -34,7 +34,7 @@ $( function() {
<br/>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list')}">
<a class="action-button" href="${h.url_for( controller=cntrller, cntrller=cntrller, action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
@@ -45,7 +45,7 @@ $( function() {
There are no request types created for a new request.
%else:
<div class="toolFormBody">
<form name="edit_request" id="edit_request" action="${h.url_for( controller='requests', action='edit', request_id=request.id)}" method="post" >
<form name="edit_request" id="edit_request" action="${h.url_for( controller='requests_common', cntrller=cntrller, action='edit', id=trans.security.encode_id(request.id))}" method="post" >
<div class="form-row">
<label>
Select Request Type:
@@ -4,11 +4,11 @@
<h2>History of Sequencing Request "${request.name}"</h2>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
<a class="action-button" href="${h.url_for( controller=cntrller, action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
<span>Browse this request</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list')}">
<a class="action-button" href="${h.url_for( controller=cntrller, action='list')}">
<span>Browse all requests</span></a>
</li>
</ul>
+239
View File
@@ -0,0 +1,239 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$(document).ready(function(){
//hide the all of the element with class msg_body
$(".msg_body").hide();
//toggle the componenet with class msg_body
$(".msg_head").click(function(){
$(this).next(".msg_body").slideToggle(450);
});
});
</script>
<script type="text/javascript">
function display_file_details(sample_id, folder_path)
{
var w = document.get_data.files_list.selectedIndex;
var selected_value = document.get_data.files_list.options[w].value;
var cell = $("#file_details");
if(selected_value.charAt(selected_value.length-1) != '/')
{
// Make ajax call
$.ajax( {
type: "POST",
url: "${h.url_for( controller='requests_admin', action='get_file_details' )}",
dataType: "json",
data: { id: sample_id, folder_path: document.get_data.folder_path.value+selected_value },
success : function ( data ) {
cell.html( '<label>'+data+'</label>' )
}
});
}
else
{
cell.html( '' )
}
}
</script>
<script type="text/javascript">
function open_folder1(sample_id, folder_path)
{
var w = document.get_data.files_list.selectedIndex;
var selected_value = document.get_data.files_list.options[w].value;
var cell = $("#file_details");
if(selected_value.charAt(selected_value.length-1) == '/')
{
document.get_data.folder_path.value = document.get_data.folder_path.value+selected_value
// Make ajax call
$.ajax( {
type: "POST",
url: "${h.url_for( controller='requests_admin', action='open_folder' )}",
dataType: "json",
data: { id: sample_id, folder_path: document.get_data.folder_path.value },
success : function ( data ) {
document.get_data.files_list.options.length = 0
for(i=0; i<data.length; i++)
{
var newOpt = new Option(data[i], data[i]);
document.get_data.files_list.options[i] = newOpt;
}
//cell.html( '<label>'+data+'</label>' )
}
});
}
else
{
cell.html( '' )
}
}
</script>
<style type="text/css">
.msg_head {
padding: 0px 0px;
cursor: pointer;
}
}
</style>
<h2>Data transfer from Sequencer</h2>
<h3>Sample "${sample.name}" of Request "${sample.request.name}"</h3>
<br/>
<br/>
<ul class="manage-table-actions">
%if sample.request.submitted() and sample.inprogress_dataset_files():
<li>
<a class="action-button" href="${h.url_for( controller='requests_common', cntrller=cntrller, action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">
<span>Refresh this page</span></a>
</li>
%endif
%if cntrller == 'requests_admin' and trans.user_is_admin():
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='manage_request_types', operation='view', id=trans.security.encode_id(sample.request.type.id) )}">
<span>Sequencer information</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='library_common', action='browse_library', cntrller='library_admin', id=trans.security.encode_id( sample.library.id ) )}">
<span>${sample.library.name} Data Library</span></a>
</li>
%else:
<li>
<a class="action-button" href="${h.url_for( controller='library_common', action='browse_library', cntrller='library', id=trans.security.encode_id( sample.library.id ) )}">
<span>${sample.library.name} Data Library</span></a>
</li>
%endif
<li>
<a class="action-button" href="${h.url_for( controller=cntrller, action='list', operation='show', id=trans.security.encode_id(sample.request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<div class="toolForm">
%if len(dataset_files):
<div class="form-row">
<h4>Sample Dataset(s)</h4>
%if sample.untransferred_dataset_files() and cntrller == 'requests_admin':
<div class="form-row">
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='get_data', start_transfer_button=True, sample_id=sample.id )}">
<span>Start transfer</span></a>
</li>
</ul>
</div>
%endif
<div class="form-row">
<table class="grid">
<thead>
<tr>
<th>Dataset File</th>
<th>Transfer Status</th>
<th></th>
</tr>
<thead>
<tbody>
%for dataset_index, dataset_file in enumerate(dataset_files):
${sample_dataset_files( dataset_index, dataset_file['name'], dataset_file['status'] )}
%endfor
</tbody>
</table>
</div>
</div>
%else:
<div class="form-row">
There are no dataset files associated with this sample.
</div>
%endif
<br/>
<br/>
%if cntrller == 'requests_admin' and trans.user_is_admin():
<form name="get_data" id="get_data" action="${h.url_for( controller='requests_admin', cntrller=cntrller, action='get_data', sample_id=sample.id)}" method="post" >
<div class="form-row">
##<div class="toolFormTitle">Select files for transfer</div>
<h4>Select files for transfer</h4>
<div style="width: 60%;">
<div class="form-row">
<label>Folder path on the sequencer:</label>
<input type="text" name="folder_path" value="${folder_path}" size="100"/>
<input type="submit" name="browse_button" value="List contents"/>
##<input type="submit" name="open_folder" value="Open folder"/>
<input type="submit" name="folder_up" value="Up"/>
</div>
<div class="form-row">
<select name="files_list" id="files_list" style="max-width: 98%; width: 98%; height: 150px; font-size: 100%;" ondblclick="open_folder1(${sample.id}, '${folder_path}')" onChange="display_file_details(${sample.id}, '${folder_path}')" multiple>
%for index, f in enumerate(files):
<option value="${f}">${f}</option>
%endfor
</select>
<br/>
<div id="file_details" class="toolParamHelp" style="clear: both;">
</div>
</div>
<div class="form-row">
<div class="toolParamHelp" style="clear: both;">
After selecting dataset(s), be sure to click on the <b>Start transfer</b> button.
Once the transfer is complete the dataset(s) will show up on this page.
</div>
<input type="submit" name="select_files_button" value="Select"/>
</div>
</div>
</div>
</form>
%endif
</div>
<%def name="sample_dataset_files( dataset_index, dataset_name, status )">
<tr>
<td>
%if cntrller == 'requests_admin' and trans.user_is_admin():
<label class="msg_head"><a href="${h.url_for( controller='requests_admin', action='dataset_details', sample_id=trans.security.encode_id(sample.id), dataset_index=dataset_index )}">${dataset_name}</a></label>
%else:
${dataset_name}
%endif
</td>
<td>
%if status not in [sample.transfer_status.NOT_STARTED, sample.transfer_status.COMPLETE]:
<i>${status}</i>
%else:
${status}
%endif
</td>
##<td></td>
%if status == sample.transfer_status.NOT_STARTED and cntrller == 'requests_admin' and trans.user_is_admin():
<td>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='get_data', sample_id=sample.id, remove_dataset_button=True, dataset_index=dataset_index )}">
<img src="${h.url_for('/static/images/delete_icon.png')}" />
<span></span></a>
</td>
%else:
<td></td>
%endif
</tr>
</%def>
@@ -5,12 +5,12 @@
self.has_left_panel=False
self.has_right_panel=False
self.active_view="requests"
self.message_box_visible=False
%>
</%def>
<%def name="center_panel()">
<iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="sample", action="list", request_id=request_id )}"> </iframe>
<iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="requests", action="list" )}"> </iframe>
</%def>
</%def>
@@ -44,7 +44,7 @@ $( function() {
<br/>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list')}">
<a class="action-button" href="${h.url_for( controller=cntrller, cntrller=cntrller, action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
@@ -55,10 +55,10 @@ $( function() {
There are no request types created for a new request.
%else:
<div class="toolFormBody">
<form name="new_request" id="new_request" action="${h.url_for( controller='requests_admin', action='new', create=True )}" method="post" >
<form name="new_request" id="new_request" action="${h.url_for( controller='requests_common', action='new', cntrller=cntrller)}" method="post" >
<div class="form-row">
<label>
Select Request Type
Select request type
</label>
${select_request_type.get_html()}
</div>
@@ -68,26 +68,23 @@ $( function() {
<div class="form-row">
<label>${field['label']}</label>
${field['widget'].get_html()}
%if field['label'] == 'Library' and new_library:
${new_library.get_html()}
%endif
<div class="toolParamHelp" style="clear: both;">
${field['helptext']}
</div>
<div style="clear: both"></div>
</div>
%endfor
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="refresh" value="true" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<input type="submit" name="create_request_button" value="Save"/>
<input type="submit" name="create_request_samples_button" value="Add samples"/>
</div>
%endif
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="refresh" value="true" size="40"/>
</div>
<div style="clear: both"></div>
</div>
</form>
</div>
</div>
@@ -0,0 +1,7 @@
<%def name="render_sample_datasets( cntrller, sample )">
<a href="${h.url_for(controller='requests_common', cntrller=cntrller, action='show_datatx_page', sample_id=trans.security.encode_id(sample.id))}">${sample.transferred_dataset_files()}/${len(sample.dataset_files)}</a>
</%def>
${render_sample_datasets( cntrller, sample )}
@@ -0,0 +1,65 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%def name="title()">Events for Sample ${sample.name}</%def>
<h2>Events for Sample "${sample.name}"</h2>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller=cntrller, action='list', operation='show', id=trans.security.encode_id(sample.request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<h3>User: ${sample.request.user.email}</h3>
%if message:
${render_msg( message, status )}
%endif
<div class="toolForm">
<table class="grid">
<thead>
<tr>
<th>State</th>
<th>Description</th>
<th>Last Update</th>
<th>Comments</th>
</tr>
</thead>
<tbody>
%for state, desc, updated, comments in events_list:
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
<td><b><a>${state}</a></b></td>
<td><a>${desc}</a></td>
<td><a>${updated}</a></td>
<td><a>${comments}</a></td>
</tr>
%endfor
</tbody>
</table>
</div>
%if cntrller == 'requests_admin' and trans.user_is_admin():
<div class="toolForm">
<div class="toolFormTitle">Change current state</div>
<div class="toolFormBody">
<form name="event" action="${h.url_for( controller='requests_admin', action='save_state', new=True, sample_id=sample.id)}" method="post" >
%for w in widgets:
<div class="form-row">
<label>
${w[0]}
</label>
${w[1].get_html()}
%if w[0] == 'Comments':
<div class="toolParamHelp" style="clear: both;">
Optional
</div>
%endif
</div>
%endfor
<div class="form-row">
<input type="submit" name="add_event_button" value="Save"/>
</div>
</form>
</div>
</div>
%endif
@@ -0,0 +1,5 @@
<%def name="render_sample_state( cntrller, sample )">
<a href="${h.url_for( controller='requests_common', cntrller=cntrller, action='sample_events', sample_id=sample.id)}">${sample.current_state().name}</a>
</%def>
${render_sample_state( cntrller, sample )}
@@ -1,11 +1,9 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/requests/sample_state.mako" import="render_sample_state" />
<%namespace file="/requests/sample_datasets.mako" import="render_sample_datasets" />
<%namespace file="/requests/common/sample_state.mako" import="render_sample_state" />
<%namespace file="/requests/common/sample_datasets.mako" import="render_sample_datasets" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$( function() {
@@ -70,11 +68,11 @@ $(document).ready(function(){
// Make ajax call
$.ajax( {
type: "POST",
url: "${h.url_for( controller='requests_admin', action='sample_state_updates' )}",
url: "${h.url_for( controller='requests_common', action='sample_state_updates' )}",
dataType: "json",
data: { ids: ids.join( "," ), states: states.join( "," ) },
success : function ( data ) {
$.each( data, function( id, val ) {
$.each( data, function( id, val, cntrller ) {
// Replace HTML
var cell1 = $("#sampleState-" + id);
cell1.html( val.html_state );
@@ -127,217 +125,36 @@ $(document).ready(function(){
%if request.unsubmitted() and request.samples:
<li>
<a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${h.url_for( controller='requests_admin', action='list', operation='Submit', id=trans.security.encode_id(request.id) )}">
<a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${h.url_for( controller=cntrller, action='list', operation='Submit', id=trans.security.encode_id(request.id) )}">
<span>Submit request</span></a>
</li>
%endif
%if request.submitted():
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='Reject', id=trans.security.encode_id(request.id))}">
<span>Reject request</span></a>
</li>
%if cntrller == 'requests_admin' and trans.user_is_admin():
%if request.submitted():
<li>
<a class="action-button" href="${h.url_for( controller=cntrller, action='list', operation='reject', id=trans.security.encode_id(request.id))}">
<span>Reject request</span></a>
</li>
%endif
%endif
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='events', id=trans.security.encode_id(request.id) )}">
<a class="action-button" href="${h.url_for( controller=cntrller, action='list', operation='events', id=trans.security.encode_id(request.id) )}">
<span>History</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller=cntrller, action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
<%def name="show_basic_info_form( sample_index, sample, info )">
<td>
<input type="text" name=sample_${sample_index}_name value="${info['name']}" size="10"/>
<div class="toolParamHelp" style="clear: both;">
<i>${' (required)' }</i>
</div>
</td>
%if sample:
%if sample.request.unsubmitted():
<td></td>
%else:
<td><input type="text" name=sample_${sample_index}_barcode value="${info['barcode']}" size="10"/></td>
%endif
%else:
<td></td>
%endif
%if sample:
%if sample.request.unsubmitted():
<td>Unsubmitted</td>
%else:
<td><a href="${h.url_for( controller='requests_admin', action='show_events', sample_id=sample.id)}">${sample.current_state().name}</a></td>
%endif
%else:
<td></td>
%endif
<td>${info['lib_widget'].get_html()}</td>
<td>${info['folder_widget'].get_html()}</td>
%if request.submitted() or request.complete():
%if sample:
<td><a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">${len(sample.dataset_files)}</a></td>
%else:
<td><a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">Add</a></td>
%endif
%endif
</%def>
## This function displays the "Basic Information" grid
<%def name="render_basic_info_grid()">
<h4>Sample Information</h4>
<table class="grid">
<thead>
<tr>
<th>Name</th>
<th>Barcode</th>
<th>State</th>
<th>Data Library</th>
<th>Folder</th>
%if request.submitted() or request.complete():
<th>Dataset(s) Transferred</th>
%endif
<th></th>
</tr>
<thead>
<tbody>
<%
trans.sa_session.refresh( request )
%>
%for sample_index, info in enumerate(current_samples):
<%
if sample_index in range(len(request.samples)):
sample = request.samples[sample_index]
else:
sample = None
%>
%if edit_mode == 'True':
<tr>
${show_basic_info_form( sample_index, sample, info )}
</tr>
%else:
<tr>
%if sample_index in range(len(request.samples)):
<td>${info['name']}</td>
<td>${info['barcode']}</td>
%if sample.request.unsubmitted():
<td>Unsubmitted</td>
%else:
<td id="sampleState-${sample.id}">${render_sample_state( sample )}</td>
%endif
## <td>
## %if sample:
## %if sample.request.unsubmitted():
## Unsubmitted
## %else:
## <a href="${h.url_for( controller='requests_admin', action='show_events', sample_id=sample.id)}">${sample.current_state().name}</a>
## %endif
## %endif
## </td>
%if info['library']:
<td><a href="${h.url_for( controller='library_common', action='browse_library', cntrller='library', id=trans.security.encode_id( info['library'].id ) )}">${info['library'].name}</a></td>
%else:
<td></td>
%endif
%if info['folder']:
<td>${info['folder'].name}</td>
%else:
<td></td>
%endif
%if request.submitted() or request.complete():
<td id="sampleDatasets-${sample.id}">
${render_sample_datasets( sample )}
## <a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">${len(sample.dataset_files)}</a>
</td>
%endif
%else:
${show_basic_info_form( sample_index, sample, info )}
%endif
%if request.unsubmitted() or request.rejected():
<td>
%if sample:
%if sample.request.unsubmitted():
<a class="action-button" href="${h.url_for( controller='requests_admin', action='delete_sample', request_id=request.id, sample_id=sample_index )}">
<img src="${h.url_for('/static/images/delete_icon.png')}" />
<span></span></a>
%endif
%endif
</td>
%endif
</tr>
%endif
%endfor
</tbody>
</table>
</%def>
%if message:
${render_msg( message, status )}
%endif
<%def name="render_sample_form( index, sample_name, sample_values, fields_dict )">
<td>
${sample_name}
</td>
%for field_index, field in fields_dict.items():
<td>
%if field['type'] == 'TextField':
<input type="text" name="sample_${index}_field_${field_index}" value="${sample_values[field_index]}" size="7"/>
%elif field['type'] == 'SelectField':
<select name="sample_${index}_field_${field_index}" last_selected_value="2">
%for option_index, option in enumerate(field['selectlist']):
%if option == sample_values[field_index]:
<option value="${option}" selected>${option}</option>
%else:
<option value="${option}">${option}</option>
%endif
%endfor
</select>
%elif field['type'] == 'WorkflowField':
<select name="sample_${index}_field_${field_index}">
%if str(sample_values[field_index]) == 'none':
<option value="none" selected>Select one</option>
%else:
<option value="none">Select one</option>
%endif
%for option_index, option in enumerate(request.user.stored_workflows):
%if not option.deleted:
%if str(option.id) == str(sample_values[field_index]):
<option value="${option.id}" selected>${option.name}</option>
%else:
<option value="${option.id}">${option.name}</option>
%endif
%endif
%endfor
</select>
%elif field['type'] == 'CheckboxField':
<input type="checkbox" name="sample_${index}_field_${field_index}" value="Yes"/>
%endif
<div class="toolParamHelp" style="clear: both;">
<i>${'('+field['required']+')' }</i>
</div>
</td>
%endfor
</%def>
<%def name="render_sample( index, sample_name, sample_values, fields_dict )">
<td>
${sample_name}
</td>
%for field_index, field in fields_dict.items():
<td>
%if sample_values[field_index]:
%if field['type'] == 'WorkflowField':
%if str(sample_values[field_index]) != 'none':
<% workflow = trans.sa_session.query( trans.app.model.StoredWorkflow ).get( int(sample_values[field_index]) ) %>
<a href="${h.url_for( controller='workflow', action='run', id=trans.security.encode_id(workflow.id) )}">${workflow.name}</a>
%endif
%else:
${sample_values[field_index]}
%endif
%else:
<i>None</i>
%endif
</td>
%endfor
</%def>
<div class="toolForm">
<div class="form-row">
@@ -351,7 +168,7 @@ $(document).ready(function(){
<i>None</i>
%else:
%if rd['label'] == 'State':
<a href="${h.url_for( controller='requests_admin', action='list', operation='events', id=trans.security.encode_id(request.id) )}">${rd['value']}</a>
<a href="${h.url_for( controller=cntrller, action='list', operation='events', id=trans.security.encode_id(request.id) )}">${rd['value']}</a>
%else:
${rd['value']}
%endif
@@ -374,63 +191,8 @@ $(document).ready(function(){
<br/>
<%def name="render_grid( grid_index, grid_name, fields_dict )">
<br/>
<div class="msg_list">
%if grid_name:
<h4 class="msg_head"><u>${grid_name}</u></h4>
%else:
<h4>Grid ${grid_index}</h4>
%endif
%if edit_mode == 'False' or len(current_samples) <= len(request.samples):
<div class="msg_body">
%else:
<div class="msg_body2">
%endif
<table class="grid">
<thead>
<tr>
<th>Name</th>
%for index, field in fields_dict.items():
<th>
${field['label']}
<div class="toolParamHelp" style="clear: both;">
<i>${field['helptext']}</i>
</div>
</th>
%endfor
<th></th>
</tr>
<thead>
<tbody>
<%
trans.sa_session.refresh( request )
%>
%for sample_index, sample in enumerate(current_samples):
%if edit_mode == 'True':
<tr>
${render_sample_form( sample_index, sample['name'], sample['field_values'], fields_dict)}
</tr>
%else:
<tr>
%if sample_index in range(len(request.samples)):
${render_sample( sample_index, sample['name'], sample['field_values'], fields_dict )}
%else:
${render_sample_form( sample_index, sample['name'], sample['field_values'], fields_dict)}
%endif
</tr>
%endif
%endfor
</tbody>
</table>
</div>
</div>
</%def>
<div class="toolForm">
##<div class="toolFormTitle">Samples (${len(request.samples)})</div>
<form id="show_request" name="show_request" action="${h.url_for( controller='requests_admin', action='show_request', edit_mode=edit_mode )}" enctype="multipart/form-data" method="post" >
<form id="show_request" name="show_request" action="${h.url_for( controller='requests_common', cntrller=cntrller, action='request_page', edit_mode=edit_mode )}" method="post" >
<div class="form-row">
%if current_samples:
## first render the basic info grid
@@ -498,7 +260,7 @@ $(document).ready(function(){
%endif
%endif
<input type="hidden" name="request_id" value="${request.id}" />
<input type="hidden" name="id" value="${trans.security.encode_id(request.id)}" />
</form>
</div>
@@ -506,7 +268,7 @@ $(document).ready(function(){
%if request.unsubmitted():
<div class="toolForm">
<form id="show_request" name="show_request" action="${h.url_for( controller='requests_admin', action='show_request', edit_mode=edit_mode )}" enctype="multipart/form-data" method="post" >
<form id="import" name="import" action="${h.url_for( controller='requests_common', action='request_page', edit_mode=edit_mode, request_id=trans.security.encode_id(request.id) )}" enctype="multipart/form-data" method="post" >
<div class="form-row">
<div class="msg_list">
<h4 class="msg_head"><u>Import samples from csv file</u></h4>
@@ -521,8 +283,265 @@ $(document).ready(function(){
</div>
</div>
</div>
<input type="hidden" name="request_id" value="${request.id}" />
## <input type="hidden" name="request_id" value="${request.id}" />
</form>
</div>
%endif
<%def name="render_grid( grid_index, grid_name, fields_dict )">
<br/>
<div class="msg_list">
%if grid_name:
<h4 class="msg_head"><u>${grid_name}</u></h4>
%else:
<h4>Grid ${grid_index}</h4>
%endif
%if edit_mode == 'False' or len(current_samples) <= len(request.samples):
<div class="msg_body">
%else:
<div class="msg_body2">
%endif
<table class="grid">
<thead>
<tr>
<th>Name</th>
%for index, field in fields_dict.items():
<th>
${field['label']}
<div class="toolParamHelp" style="clear: both;">
<i>${field['helptext']}</i>
</div>
</th>
%endfor
<th></th>
</tr>
<thead>
<tbody>
<%
trans.sa_session.refresh( request )
%>
%for sample_index, sample in enumerate(current_samples):
%if edit_mode == 'True':
<tr>
${render_sample_form( sample_index, sample['name'], sample['field_values'], fields_dict)}
</tr>
%else:
<tr>
%if sample_index in range(len(request.samples)):
${render_sample( sample_index, sample['name'], sample['field_values'], fields_dict )}
%else:
${render_sample_form( sample_index, sample['name'], sample['field_values'], fields_dict)}
%endif
</tr>
%endif
%endfor
</tbody>
</table>
</div>
</div>
</%def>
## This function displays the "Basic Information" grid
<%def name="render_basic_info_grid()">
<h4>Sample Information</h4>
<table class="grid">
<thead>
<tr>
<th>Name</th>
<th>Barcode</th>
<th>State</th>
<th>Data Library</th>
<th>Folder</th>
%if request.submitted() or request.complete():
<th>Dataset(s) Transferred</th>
%endif
<th></th>
</tr>
<thead>
<tbody>
<%
trans.sa_session.refresh( request )
%>
%for sample_index, info in enumerate(current_samples):
<%
if sample_index in range(len(request.samples)):
sample = request.samples[sample_index]
else:
sample = None
%>
%if edit_mode == 'True':
<tr>
${show_basic_info_form( sample_index, sample, info )}
</tr>
%else:
<tr>
%if sample_index in range(len(request.samples)):
<td>${info['name']}</td>
<td>${info['barcode']}</td>
%if sample.request.unsubmitted():
<td>Unsubmitted</td>
%else:
<td id="sampleState-${sample.id}">${render_sample_state( cntrller, sample )}</td>
%endif
%if info['library']:
<td><a href="${h.url_for( controller='library_common', action='browse_library', cntrller='library', id=trans.security.encode_id( info['library'].id ) )}">${info['library'].name}</a></td>
%else:
<td></td>
%endif
%if info['folder']:
<td>${info['folder'].name}</td>
%else:
<td></td>
%endif
%if request.submitted() or request.complete():
<td id="sampleDatasets-${sample.id}">
${render_sample_datasets( cntrller, sample )}
</td>
%endif
%else:
${show_basic_info_form( sample_index, sample, info )}
%endif
%if request.unsubmitted() or request.rejected():
<td>
%if sample:
%if sample.request.unsubmitted():
<a class="action-button" href="${h.url_for( controller='requests_common', cntrller=cntrller, action='delete_sample', request_id=request.id, sample_id=sample_index )}">
<img src="${h.url_for('/static/images/delete_icon.png')}" />
<span></span></a>
%endif
%endif
</td>
%endif
</tr>
%endif
%endfor
</tbody>
</table>
</%def>
<%def name="show_basic_info_form( sample_index, sample, info )">
<td>
<input type="text" name=sample_${sample_index}_name value="${info['name']}" size="10"/>
<div class="toolParamHelp" style="clear: both;">
<i>${' (required)' }</i>
</div>
</td>
%if cntrller == 'requests':
%if sample:
%if sample.request.unsubmitted():
<td></td>
%else:
<td><input type="text" name=sample_${sample_index}_barcode value="${info['barcode']}" size="10"/></td>
%endif
%else:
<td></td>
%endif
%elif cntrller == 'requests_admin':
%if sample:
%if sample.request.unsubmitted():
<td></td>
%else:
<td><input type="text" name=sample_${sample_index}_barcode value="${info['barcode']}" size="10"/></td>
%endif
%else:
<td></td>
%endif
%endif
%if sample:
%if sample.request.unsubmitted():
<td>Unsubmitted</td>
%else:
<td><a href="${h.url_for( controller='requests_admin', action='sample_events', sample_id=sample.id)}">${sample.current_state().name}</a></td>
%endif
%else:
<td></td>
%endif
<td>${info['lib_widget'].get_html()}</td>
<td>${info['folder_widget'].get_html()}</td>
%if request.submitted() or request.complete():
%if sample:
<td><a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">${len(sample.dataset_files)}</a></td>
%else:
<td><a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">Add</a></td>
%endif
%endif
</%def>
<%def name="render_sample( index, sample_name, sample_values, fields_dict )">
<td>
${sample_name}
</td>
%for field_index, field in fields_dict.items():
<td>
%if sample_values[field_index]:
%if field['type'] == 'WorkflowField':
%if str(sample_values[field_index]) != 'none':
<% workflow = trans.sa_session.query( trans.app.model.StoredWorkflow ).get( int(sample_values[field_index]) ) %>
<a href="${h.url_for( controller='workflow', action='run', id=trans.security.encode_id(workflow.id) )}">${workflow.name}</a>
%endif
%else:
${sample_values[field_index]}
%endif
%else:
<i>None</i>
%endif
</td>
%endfor
</%def>
<%def name="render_sample_form( index, sample_name, sample_values, fields_dict )">
<td>
${sample_name}
</td>
%for field_index, field in fields_dict.items():
<td>
%if field['type'] == 'TextField':
<input type="text" name="sample_${index}_field_${field_index}" value="${sample_values[field_index]}" size="7"/>
%elif field['type'] == 'SelectField':
<select name="sample_${index}_field_${field_index}" last_selected_value="2">
%for option_index, option in enumerate(field['selectlist']):
%if option == sample_values[field_index]:
<option value="${option}" selected>${option}</option>
%else:
<option value="${option}">${option}</option>
%endif
%endfor
</select>
%elif field['type'] == 'WorkflowField':
<select name="sample_${index}_field_${field_index}">
%if str(sample_values[field_index]) == 'none':
<option value="none" selected>Select one</option>
%else:
<option value="none">Select one</option>
%endif
%for option_index, option in enumerate(request.user.stored_workflows):
%if not option.deleted:
%if str(option.id) == str(sample_values[field_index]):
<option value="${option.id}" selected>${option.name}</option>
%else:
<option value="${option.id}">${option.name}</option>
%endif
%endif
%endfor
</select>
%elif field['type'] == 'CheckboxField':
<input type="checkbox" name="sample_${index}_field_${field_index}" value="Yes"/>
%endif
<div class="toolParamHelp" style="clear: both;">
<i>${'('+field['required']+')' }</i>
</div>
</td>
%endfor
</%def>
-94
View File
@@ -1,94 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$( function() {
$( "select[refresh_on_change='true']").change( function() {
var refresh = false;
var refresh_on_change_values = $( this )[0].attributes.getNamedItem( 'refresh_on_change_values' )
if ( refresh_on_change_values ) {
refresh_on_change_values = refresh_on_change_values.value.split( ',' );
var last_selected_value = $( this )[0].attributes.getNamedItem( 'last_selected_value' );
for( i= 0; i < refresh_on_change_values.length; i++ ) {
if ( $( this )[0].value == refresh_on_change_values[i] || ( last_selected_value && last_selected_value.value == refresh_on_change_values[i] ) ){
refresh = true;
break;
}
}
}
else {
refresh = true;
}
if ( refresh ){
$( "#new_request" ).submit();
}
});
});
</script>
<%def name="javascripts()">
${parent.javascripts()}
${h.js("jquery.autocomplete", "autocomplete_tagging" )}
</%def>
<%def name="stylesheets()">
${parent.stylesheets()}
${h.css( "autocomplete_tagging" )}
</%def>
<br/>
<br/>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
<div class="toolForm">
<div class="toolFormTitle">Add a new request</div>
%if len(select_request_type.options) == 1:
There are no request types created for a new request.
%else:
<div class="toolFormBody">
<form name="new_request" id="new_request" action="${h.url_for( controller='requests', action='new', create=True )}" method="post" >
<div class="form-row">
<label>
Select Request Type:
</label>
${select_request_type.get_html()}
</div>
%if select_request_type.get_selected() != ('Select one', 'none'):
%for i, field in enumerate(widgets):
<div class="form-row">
<label>${field['label']}</label>
${field['widget'].get_html()}
##%if field['label'] == 'Data library' and new_library:
## ${new_library.get_html()}
##%endif
<div class="toolParamHelp" style="clear: both;">
${field['helptext']}
</div>
<div style="clear: both"></div>
</div>
%endfor
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="refresh" value="true" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<input type="submit" name="create_request_button" value="Save"/>
<input type="submit" name="create_request_samples_button" value="Add samples"/>
</div>
%endif
</form>
</div>
</div>
%endif
-7
View File
@@ -1,7 +0,0 @@
<%def name="render_sample_datasets( sample )">
<a href="${h.url_for(controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id))}">${sample.transferred_dataset_files()}/${len(sample.dataset_files)}</a>
</%def>
${render_sample_datasets( sample )}
-5
View File
@@ -1,5 +0,0 @@
<%def name="render_sample_state( sample )">
<a href="${h.url_for( controller='requests_admin', action='show_events', sample_id=sample.id)}">${sample.current_state().name}</a>
</%def>
${render_sample_state( sample )}
-86
View File
@@ -1,86 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$(document).ready(function(){
//hide the all of the element with class msg_body
$(".msg_body").hide();
//toggle the componenet with class msg_body
$(".msg_head").click(function(){
$(this).next(".msg_body").slideToggle(450);
});
});
</script>
<style type="text/css">
.msg_head {
padding: 0px 0px;
cursor: pointer;
}
}
</style>
<h2>Data transfer from Sequencer</h2>
<h3>Sample "${sample.name}" of Request "${sample.request.name}"</h3>
<ul class="manage-table-actions">
%if sample.request.submitted() and sample.inprogress_dataset_files():
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">
<span>Refresh this page</span></a>
</li>
%endif
%if sample.library:
<li>
<a class="action-button" href="${h.url_for( controller='library_common', action='browse_library', cntrller='library', id=trans.security.encode_id( sample.library.id ) )}">
<span>${sample.library.name} Data Library</span></a>
</li>
%endif
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list', operation='show_request', id=trans.security.encode_id(sample.request.id) )}">
<span>Browse this request</span></a>
</li>
</ul>
<div class="toolForm">
<form name="get_data" action="${h.url_for( controller='requests_admin', action='get_data', sample_id=sample.id)}" method="post" >
<div class="form-row">
%if len(dataset_files):
<table class="grid">
<thead>
<tr>
<th>Dataset File</th>
<th>Transfer Status</th>
</tr>
<thead>
<tbody>
%for dataset_index, dataset_file in enumerate(dataset_files):
${sample_dataset_files( dataset_index, dataset_file[0], dataset_file[1] )}
%endfor
</tbody>
</table>
%else:
There are no dataset files.
%endif
</div>
</form>
</div>
<%def name="sample_dataset_files( dataset_index, dataset_file, status )">
<tr>
<td>${dataset_file.split('/')[-1]}</td>
<td>
%if status == sample.transfer_status.IN_PROGRESS:
<i>${status}</i>
%else:
${status}
%endif
</td>
</tr>
</%def>
-430
View File
@@ -1,430 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
%if message:
${render_msg( message, status )}
%endif
<script type="text/javascript">
$( function() {
$( "select[refresh_on_change='true']").change( function() {
var refresh = false;
var refresh_on_change_values = $( this )[0].attributes.getNamedItem( 'refresh_on_change_values' )
if ( refresh_on_change_values ) {
refresh_on_change_values = refresh_on_change_values.value.split( ',' );
var last_selected_value = $( this )[0].attributes.getNamedItem( 'last_selected_value' );
for( i= 0; i < refresh_on_change_values.length; i++ ) {
if ( $( this )[0].value == refresh_on_change_values[i] || ( last_selected_value && last_selected_value.value == refresh_on_change_values[i] ) ){
refresh = true;
break;
}
}
}
else {
refresh = true;
}
if ( refresh ){
$( "#show_request" ).submit();
}
});
});
</script>
<script type="text/javascript">
$(document).ready(function(){
//hide the all of the element with class msg_body
$(".msg_body").hide();
//toggle the componenet with class msg_body
$(".msg_head").click(function(){
$(this).next(".msg_body").slideToggle(450);
});
});
</script>
<style type="text/css">
.msg_head {
padding: 0px 0px;
cursor: pointer;
}
}
</style>
%if request.rejected():
${render_msg( "Reason for rejection: "+request.last_comment(), "warning" )}
%endif
<div class="grid-header">
<h2>Sequencing Request "${request.name}"</h2>
</div>
<ul class="manage-table-actions">
%if request.unsubmitted() and request.samples:
<li>
<a class="action-button" confirm="More samples cannot be added to this request once it is submitted. Click OK to submit." href="${h.url_for( controller='requests', action='list', operation='Submit', id=trans.security.encode_id(request.id) )}">
<span>Submit request</span></a>
</li>
%endif
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list', operation='events', id=trans.security.encode_id(request.id) )}">
<span>History</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
<%def name="show_basic_info_form( sample_index, sample, info )">
<td>
<input type="text" name=sample_${sample_index}_name value="${info['name']}" size="10"/>
<div class="toolParamHelp" style="clear: both;">
<i>${' (required)' }</i>
</div>
</td>
%if sample:
%if sample.request.unsubmitted():
<td></td>
%else:
<td><input type="text" name=sample_${sample_index}_barcode value="${info['barcode']}" size="10"/></td>
%endif
%else:
<td></td>
%endif
%if sample:
%if not sample.current_state():
<td>Unsubmitted</td>
%else:
<td><a href="${h.url_for( controller='requests_admin', action='show_events', sample_id=sample.id)}">${sample.current_state().name}</a></td>
%endif
%else:
<td></td>
%endif
<td>${info['lib_widget'].get_html()}</td>
<td>${info['folder_widget'].get_html()}</td>
%if request.submitted() or request.complete():
%if sample:
<td><a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">${len(sample.dataset_files)}</a></td>
%else:
<td><a href="${h.url_for( controller='requests_admin', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">Add</a></td>
%endif
%endif
</%def>
## This function displays the "Basic Information" grid
<%def name="render_basic_info_grid()">
<h4>Sample Information</h4>
<table class="grid">
<thead>
<tr>
<th>Name</th>
<th>Barcode</th>
<th>State</th>
<th>Data Library</th>
<th>Folder</th>
%if request.submitted() or request.complete():
<th>Dataset(s) Transferred</th>
%endif
<th></th>
</tr>
<thead>
<tbody>
<%
trans.sa_session.refresh( request )
%>
%for sample_index, info in enumerate(current_samples):
<%
if sample_index in range(len(request.samples)):
sample = request.samples[sample_index]
else:
sample = None
%>
%if edit_mode == 'True':
<tr>
${show_basic_info_form( sample_index, sample, info )}
</tr>
%else:
<tr>
%if sample_index in range(len(request.samples)):
<td>${info['name']}</td>
<td>${info['barcode']}</td>
<td>
%if sample.current_state():
<a href="${h.url_for( controller='requests', action='show_events', sample_id=sample.id)}">${sample.current_state().name}</a>
%else:
Unsubmitted
%endif
</td>
%if info['library']:
<td><a href="${h.url_for( controller='library_common', action='browse_library', cntrller='library', id=trans.security.encode_id( info['library'].id ) )}">${info['library'].name}</a></td>
%else:
<td></td>
%endif
%if info['folder']:
<td>${info['folder'].name}</td>
%else:
<td></td>
%endif
%if request.submitted() or request.complete():
<td>
<a href="${h.url_for( controller='requests', action='show_datatx_page', sample_id=trans.security.encode_id(sample.id) )}">${len(sample.dataset_files)}</a>
</td>
%endif
%else:
${show_basic_info_form( sample_index, sample, info )}
%endif
%if request.unsubmitted() or request.rejected():
<td>
%if sample:
%if sample.request.unsubmitted():
<a class="action-button" href="${h.url_for( controller='requests_admin', action='delete_sample', request_id=request.id, sample_id=sample_index )}">
<img src="${h.url_for('/static/images/delete_icon.png')}" />
<span></span></a>
%endif
%endif
</td>
%endif
</tr>
%endif
%endfor
</tbody>
</table>
</%def>
<%def name="render_sample_form( index, sample_name, sample_values, fields_dict )">
<td>
${sample_name}
</td>
%for field_index, field in fields_dict.items():
<td>
%if field['type'] == 'TextField':
<input type="text" name="sample_${index}_field_${field_index}" value="${sample_values[field_index]}" size="7"/>
%elif field['type'] == 'SelectField':
<select name="sample_${index}_field_${field_index}" last_selected_value="2">
%for option_index, option in enumerate(field['selectlist']):
%if option == sample_values[field_index]:
<option value="${option}" selected>${option}</option>
%else:
<option value="${option}">${option}</option>
%endif
%endfor
</select>
%elif field['type'] == 'WorkflowField':
<select name="sample_${index}_field_${field_index}">
%if str(sample_values[field_index]) == 'none':
<option value="none" selected>Select one</option>
%else:
<option value="none">Select one</option>
%endif
%for option_index, option in enumerate(request.user.stored_workflows):
%if not option.deleted:
%if str(option.id) == str(sample_values[field_index]):
<option value="${option.id}" selected>${option.name}</option>
%else:
<option value="${option.id}">${option.name}</option>
%endif
%endif
%endfor
</select>
%elif field['type'] == 'CheckboxField':
<input type="checkbox" name="sample_${index}_field_${field_index}" value="Yes"/>
%endif
<div class="toolParamHelp" style="clear: both;">
<i>${'('+field['required']+')' }</i>
</div>
</td>
%endfor
</%def>
<%def name="render_sample( index, sample_name, sample_values, fields_dict )">
<td>
${sample_name}
</td>
%for field_index, field in fields_dict.items():
<td>
%if sample_values[field_index]:
%if field['type'] == 'WorkflowField':
%if str(sample_values[field_index]) != 'none':
<% workflow = trans.sa_session.query( trans.app.model.StoredWorkflow ).get( int(sample_values[field_index]) ) %>
<a href="${h.url_for( controller='workflow', action='run', id=trans.security.encode_id(workflow.id) )}">${workflow.name}</a>
%endif
%else:
${sample_values[field_index]}
%endif
%else:
<i>None</i>
%endif
</td>
%endfor
</%def>
<%def name="render_grid( grid_index, grid_name, fields_dict )">
<br/>
<div class="msg_list">
%if grid_name:
<h4 class="msg_head"><u>${grid_name}</u></h4>
%else:
<h4>Grid ${grid_index}</h4>
%endif
%if edit_mode == 'False' or len(current_samples) <= len(request.samples):
<div class="msg_body">
%else:
<div class="msg_body2">
%endif
<table class="grid">
<thead>
<tr>
<th>Name</th>
%for index, field in fields_dict.items():
<th>
${field['label']}
<div class="toolParamHelp" style="clear: both;">
<i>${field['helptext']}</i>
</div>
</th>
%endfor
<th></th>
</tr>
<thead>
<tbody>
<%
trans.sa_session.refresh( request )
%>
%for sample_index, sample in enumerate(current_samples):
%if edit_mode == 'True':
<tr>
${render_sample_form( sample_index, sample['name'], sample['field_values'], fields_dict)}
</tr>
%else:
<tr>
%if sample_index in range(len(request.samples)):
${render_sample( sample_index, sample['name'], sample['field_values'], fields_dict )}
%else:
${render_sample_form( sample_index, sample['name'], sample['field_values'], fields_dict)}
%endif
</tr>
%endif
%endfor
</tbody>
</table>
</div>
</div>
</%def>
<div class="toolForm">
<form id="request_details" name="request_details" >
<div class="form-row">
<div class="msg_list">
<h4 class="msg_head"><u>Request Information</u></h4>
<div class="msg_body">
%for index, rd in enumerate(request_details):
<div class="form-row">
<label>${rd['label']}</label>
%if not rd['value']:
<i>None</i>
%else:
%if rd['label'] == 'State':
<a href="${h.url_for( controller='requests_admin', action='list', operation='events', id=trans.security.encode_id(request.id) )}">${rd['value']}</a>
%else:
${rd['value']}
%endif
%endif
</div>
<div style="clear: both"></div>
%endfor
<div class="form-row">
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests_admin', action='list', operation='Edit', id=trans.security.encode_id(request.id))}">
<span>Edit request details</span></a>
</li>
</ul>
</div>
</div>
</div>
</div>
</form>
<form id="show_request" name="show_request" action="${h.url_for( controller='requests', action='show_request', edit_mode=edit_mode )}" enctype="multipart/form-data" method="post" >
<div class="form-row">
%if current_samples:
## first render the basic info grid
${render_basic_info_grid()}
## then render the other grid(s)
<% trans.sa_session.refresh( request.type.sample_form ) %>
%for grid_index, grid_name in enumerate(request.type.sample_form.layout):
${render_grid( grid_index, grid_name, request.type.sample_form.fields_of_grid( grid_index ) )}
<br/>
%endfor
%else:
<label>There are no samples.</label>
%endif
</div>
%if request.unsubmitted() and edit_mode == 'False':
<table class="grid">
<tbody>
<tr>
<div class="form-row">
<td>
%if current_samples:
<label>Copy </label>
<input type="integer" name="num_sample_to_copy" value="1" size="3"/>
<label>sample(s) from sample</label>
${sample_copy.get_html()}
%endif
<input type="submit" name="add_sample_button" value="Add New"/>
</td>
<td>
%if len(current_samples) and len(current_samples) <= len(request.samples):
<input type="submit" name="edit_samples_button" value="Edit samples"/>
%endif
</td>
</div>
</tr>
</tbody>
</table>
%endif
%if request.unsubmitted() and (request.samples or current_samples):
<div class="form-row">
<div style="float: left; width: 250px; margin-right: 10px;">
<input type="hidden" name="refresh" value="true" size="40"/>
</div>
<div style="clear: both"></div>
</div>
<div class="form-row">
<input type="submit" name="save_samples_button" value="Save"/>
%if edit_mode == 'True':
<input type="submit" name="cancel_changes_button" value="Cancel"/>
%endif
</div>
%endif
<input type="hidden" name="request_id" value="${request.id}" />
</form>
</div>
<br/>
%if request.unsubmitted():
<div class="toolForm">
<form id="show_request" name="show_request" action="${h.url_for( controller='requests', action='show_request', edit_mode=edit_mode )}" enctype="multipart/form-data" method="post" >
<div class="form-row">
<div class="msg_list">
<h4 class="msg_head"><u>Import samples from csv file</u></h4>
<div class="msg_body">
<input type="file" name="file_data" />
<input type="submit" name="import_samples_button" value="Import samples"/>
<br/>
<div class="toolParamHelp" style="clear: both;">
The csv file must be in the following format:<br/>
SampleName,DataLibrary,DataLibraryFolder,FieldValue1,FieldValue2...
</div>
</div>
</div>
</div>
<input type="hidden" name="request_id" value="${request.id}" />
</form>
</div>
%endif
-45
View File
@@ -1,45 +0,0 @@
<%inherit file="/base.mako"/>
<%namespace file="/message.mako" import="render_msg" />
<%def name="title()">Events for Sample ${sample_name}</%def>
<h2>Events for Sample "${sample_name}"</h2>
<ul class="manage-table-actions">
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list', operation='show_request', id=trans.security.encode_id(request.id) )}">
<span>Browse this request</span></a>
</li>
<li>
<a class="action-button" href="${h.url_for( controller='requests', action='list')}">
<span>Browse requests</span></a>
</li>
</ul>
%if message:
${render_msg( message, status )}
%endif
<div class="toolForm">
<table class="grid">
<thead>
<tr>
<th>State</th>
<th>Description</th>
<th>Updated</th>
<th>Comments</th>
</tr>
</thead>
<tbody>
%for state, desc, updated, comments in events_list:
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
<td><b><a>${state}</a></b></td>
<td><a>${desc}</a></td>
<td><a>${updated}</a></td>
<td><a>${comments}</a></td>
</tr>
%endfor
</tbody>
</table>
</div>
+21 -18
View File
@@ -1485,14 +1485,13 @@ class TwillTestCase( unittest.TestCase ):
url ="%s&%s=%s" % ( url, key, role_ids_str )
self.home()
self.visit_url( "%s/%s" % ( self.url, url ) )
print url
check_str = "Permissions updated for request type '%s'" % request_type_name
self.check_page_for_string( check_str )
self.home()
def create_request( self, request_type_id, name, desc, fields ):
self.home()
self.visit_url( "%s/requests/new?create=True&select_request_type=%i" % ( self.url,
request_type_id ) )
self.visit_url( "%s/requests_common/new?select_request_type=%i&refresh=true&cntrller=requests" % ( self.url,
request_type_id ) )
self.check_page_for_string( 'Add a new request' )
tc.fv( "1", "name", name )
tc.fv( "1", "desc", desc )
@@ -1514,21 +1513,20 @@ class TwillTestCase( unittest.TestCase ):
self.check_page_for_string( new_desc )
def add_samples( self, request_id, request_name, samples ):
self.home()
url = "%s/requests/list?sort=-create_time&operation=show_request&id=%s" % ( self.url, self.security.encode_id( request_id ) )
url = "%s/requests/list?operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) )
self.visit_url( url )
self.check_page_for_string( 'Sequencing Request "%s"' % request_name )
self.check_page_for_string( 'There are no samples.' )
# this redundant stmt below is add so that the second form in
# the page gets selected
tc.fv( "3", "request_id", request_id )
url = ["%s/requests_common/request_page?cntrller=requests&edit_mode=False&id=%s" % ( self.url, self.security.encode_id( request_id ) )]
for sample_index, sample in enumerate(samples):
tc.submit( "add_sample_button" )
self.check_page_for_string( 'Sequencing Request "%s"' % request_name )
sample_name, fields = sample
tc.fv( "3", "sample_%i_name" % sample_index, sample_name )
url.append("sample_%i_name=%s" % (sample_index, sample_name.replace(' ', '+')))
for field_index, field_value in enumerate(fields):
tc.fv( "3", "sample_%i_field_%i" % ( sample_index, field_index ), field_value )
tc.submit( "save_samples_button" )
url.append("sample_%i_field_%i=%s" % ( sample_index, field_index , field_value.replace(' ', '+') ))
url.append("save_samples_button=Save")
self.visit_url('&'.join(url))
for sample_name, fields in samples:
self.check_page_for_string( sample_name )
self.check_page_for_string( 'Unsubmitted' )
@@ -1549,19 +1547,24 @@ class TwillTestCase( unittest.TestCase ):
tc.fv( "1", "comment", comment )
tc.submit( "reject_button" )
self.check_page_for_string( 'Request <b>%s</b> has been rejected.' % request_name )
self.visit_url( "%s/requests/list?sort=-create_time&operation=show_request&id=%s" % ( self.url, self.security.encode_id( request_id ) ))
self.visit_url( "%s/requests/list?&operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) ))
self.check_page_for_string( comment )
def add_bar_codes( self, request_id, request_name, bar_codes ):
def add_bar_codes( self, request_id, request_name, bar_codes, samples ):
self.home()
self.visit_url( "%s/requests_admin/bar_codes?request_id=%i" % (self.url, request_id) )
self.check_page_for_string( 'Bar codes for Samples of Request "%s"' % request_name )
url = "%s/requests/list?operation=show&id=%s" % ( self.url, self.security.encode_id( request_id ) )
self.visit_url( url )
self.check_page_for_string( 'Sequencing Request "%s"' % request_name )
url = ["%s/requests_common/request_page?save_samples_button=Save&cntrller=requests&edit_mode=True&id=%s" % ( self.url, self.security.encode_id( request_id ) )]
for index, bar_code in enumerate(bar_codes):
tc.fv( "1", "sample_%i_bar_code" % index, bar_code )
tc.submit( "save_bar_codes" )
self.check_page_for_string( 'Bar codes have been saved for this request' )
url.append("sample_%i_barcode=%s" % (index, bar_code ))
url.append("sample_%i_name=%s" % (index, samples[index].name.replace(' ', '+') ))
self.visit_url('&'.join(url))
self.check_page_for_string( 'Changes made to the sample(s) are saved.' )
for index, bar_code in enumerate(bar_codes):
self.check_page_for_string( bar_code )
def change_sample_state( self, sample_name, sample_id, new_state_id, new_state_name, comment='' ):
self.home()
self.visit_url( "%s/requests_admin/show_events?sample_id=%i" % (self.url, sample_id) )
self.visit_url( "%s/requests_common/sample_events?cntrller=requests_admin&sample_id=%i" % (self.url, sample_id) )
self.check_page_for_string( 'Events for Sample "%s"' % sample_name )
tc.fv( "1", "select_state", str(new_state_id) )
tc.fv( "1", "comment", comment )
+48 -47
View File
@@ -189,7 +189,7 @@ class TestFormsAndRequests( TwillTestCase ):
# Make sure the request_type is not accessible by regular_user2 since regular_user2 does not have Role1.
self.logout()
self.login( email=regular_user2.email )
self.visit_url( '%s/requests/new?create=True&select_request_type=%i' % (self.url, request_type.id) )
self.visit_url( '%s/requests_common/new?cntrller=requests&select_request_type=True' % self.url )
try:
self.check_page_for_string( 'There are no request types created for a new request.' )
raise AssertionError, 'The request_type %s is accessible by %s when it should be restricted' % ( request_type.name, regular_user2.email )
@@ -304,12 +304,12 @@ class TestFormsAndRequests( TwillTestCase ):
self.logout()
self.login( email='test@bx.psu.edu' )
self.check_request_admin_grid(state=request_one.states.SUBMITTED, request_name=request_one.name)
self.visit_url( "%s/requests_admin/list?sort=-create_time&operation=show_request&id=%s" \
self.visit_url( "%s/requests_admin/list?operation=show&id=%s" \
% ( self.url, self.security.encode_id( request_one.id ) ))
self.check_page_for_string( 'Sequencing Request "%s"' % request_one.name )
# set bar codes for the samples
bar_codes = [ '1234567890', '0987654321' ]
self.add_bar_codes( request_one.id, request_one.name, bar_codes )
self.add_bar_codes( request_one.id, request_one.name, bar_codes, request_one.samples )
# change the states of all the samples of this request
for sample in request_one.samples:
self.change_sample_state( sample.name, sample.id, request_type.states[1].id, request_type.states[1].name )
@@ -328,11 +328,12 @@ class TestFormsAndRequests( TwillTestCase ):
self.login( email='test@bx.psu.edu' )
request_name = "RequestTwo"
# simulate request creation
url_str = '%s/requests_admin/new?create=True&create_request_button=Save&select_request_type=%i&select_user=%i&name=%s&library_id=%i&folder_id=%i&refresh=True&field_2=%s&field_0=%s&field_1=%i' \
% ( self.url, request_type.id, regular_user.id, request_name, library_one.id, library_one.root_folder.id, "field_2_value", 'option1', user_address.id )
url_str = '%s/requests_common/new?cntrller=requests_admin&create_request_button=Save&select_request_type=%i&select_user=%i&name=%s&refresh=True&field_2=%s&field_0=%s&field_1=%i' \
% ( self.url, request_type.id, regular_user.id, request_name, "field_2_value", 'option1', user_address.id )
print url_str
self.home()
self.visit_url( url_str )
self.check_page_for_string( "The new request named %s has been created" % request_name )
self.check_page_for_string( "The new request named <b>%s</b> has been created" % request_name )
global request_two
request_two = sa_session.query( galaxy.model.Request ) \
.filter( and_( galaxy.model.Request.table.c.name==request_name,
@@ -370,44 +371,44 @@ class TestFormsAndRequests( TwillTestCase ):
# check if the request's state is now set to 'submitted'
assert request_two.state is not request_two.states.REJECTED, "The state of the request '%s' should be set to '%s'" \
% ( request_two.name, request_two.states.REJECTED )
def test_055_reset_data_for_later_test_runs( self ):
"""Reseting data to enable later test runs to pass"""
# Logged in as admin_user
# remove the request_type permissions
rt_actions = sa_session.query( galaxy.model.RequestTypePermissions ) \
.filter(and_(galaxy.model.RequestTypePermissions.table.c.request_type_id==request_type.id) ) \
.order_by( desc( galaxy.model.RequestTypePermissions.table.c.create_time ) ) \
.all()
for a in rt_actions:
sa_session.delete( a )
sa_session.flush()
##################
# Purge all libraries
##################
for library in [ library_one ]:
self.delete_library_item( 'library_admin',
self.security.encode_id( library.id ),
self.security.encode_id( library.id ),
library.name,
item_type='library' )
self.purge_library( self.security.encode_id( library.id ), library.name )
##################
# Eliminate all non-private roles
##################
for role in [ role_one, role_two ]:
self.mark_role_deleted( self.security.encode_id( role.id ), role.name )
self.purge_role( self.security.encode_id( role.id ), role.name )
# Manually delete the role from the database
sa_session.refresh( role )
sa_session.delete( role )
sa_session.flush()
##################
# Eliminate all groups
##################
for group in [ group_one ]:
self.mark_group_deleted( self.security.encode_id( group.id ), group.name )
self.purge_group( self.security.encode_id( group.id ), group.name )
# Manually delete the group from the database
refresh( group )
sa_session.delete( group )
sa_session.flush()
# def test_055_reset_data_for_later_test_runs( self ):
# """Reseting data to enable later test runs to pass"""
# # Logged in as admin_user
# # remove the request_type permissions
# rt_actions = sa_session.query( galaxy.model.RequestTypePermissions ) \
# .filter(and_(galaxy.model.RequestTypePermissions.table.c.request_type_id==request_type.id) ) \
# .order_by( desc( galaxy.model.RequestTypePermissions.table.c.create_time ) ) \
# .all()
# for a in rt_actions:
# sa_session.delete( a )
# sa_session.flush()
# ##################
# # Purge all libraries
# ##################
# for library in [ library_one ]:
# self.delete_library_item( 'library_admin',
# self.security.encode_id( library.id ),
# self.security.encode_id( library.id ),
# library.name,
# item_type='library' )
# self.purge_library( self.security.encode_id( library.id ), library.name )
# ##################
# # Eliminate all non-private roles
# ##################
# for role in [ role_one, role_two ]:
# self.mark_role_deleted( self.security.encode_id( role.id ), role.name )
# self.purge_role( self.security.encode_id( role.id ), role.name )
# # Manually delete the role from the database
# sa_session.refresh( role )
# sa_session.delete( role )
# sa_session.flush()
# ##################
# # Eliminate all groups
# ##################
# for group in [ group_one ]:
# self.mark_group_deleted( self.security.encode_id( group.id ), group.name )
# self.purge_group( self.security.encode_id( group.id ), group.name )
# # Manually delete the group from the database
# refresh( group )
# sa_session.delete( group )
# sa_session.flush()