mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
LIMS Changes
- Unique sample names within a request is now enforced - minor UI tweaks - show/hide request details
This commit is contained in:
@@ -97,17 +97,18 @@ class Requests( BaseController ):
|
||||
for s in request.samples:
|
||||
self.current_samples.append([s.name, s.values.content])
|
||||
if add_sample:
|
||||
self.current_samples.append(['New Sample',['' for field in request.type.sample_form.fields]])
|
||||
self.current_samples.append(['Sample_%i' % (len(self.current_samples)+1),['' for field in request.type.sample_form.fields]])
|
||||
# selectfield of all samples
|
||||
copy_list = SelectField('copy_sample')
|
||||
copy_list.add_option('None', -1, selected=True)
|
||||
for i, s in enumerate(self.current_samples):
|
||||
copy_list.add_option(i+1, i)
|
||||
copy_list.add_option(i+1, i)
|
||||
self.details_state = 'Show request details'
|
||||
return trans.fill_template( '/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, id),
|
||||
current_samples = self.current_samples,
|
||||
sample_copy=copy_list)
|
||||
sample_copy=copy_list, details_state=self.details_state)
|
||||
def request_details(self, trans, id):
|
||||
'''
|
||||
Shows the request details
|
||||
@@ -141,7 +142,20 @@ class Requests( BaseController ):
|
||||
value=request.values.content[index],
|
||||
helptext=field['helptext']+' ('+req+')'))
|
||||
return request_details
|
||||
|
||||
|
||||
def __update_samples(self, request, **kwd):
|
||||
params = util.Params( kwd )
|
||||
num_samples = len(self.current_samples)
|
||||
self.current_samples = []
|
||||
for s in request.samples:
|
||||
self.current_samples.append([s.name, s.values.content])
|
||||
for index in range(num_samples-len(request.samples)):
|
||||
sample_index = index + len(request.samples)
|
||||
sample_name = util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) )
|
||||
sample_values = []
|
||||
for field_index in range(len(request.type.sample_form.fields)):
|
||||
sample_values.append(util.restore_text( params.get( 'sample_%i_field_%i' % (sample_index, field_index), '' ) ))
|
||||
self.current_samples.append([sample_name, sample_values])
|
||||
@web.expose
|
||||
def show_request(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
@@ -157,26 +171,17 @@ class Requests( BaseController ):
|
||||
**kwd) )
|
||||
if params.get('add_sample_button', False) == 'Add New':
|
||||
# save the all (saved+unsaved) sample info in 'current_samples'
|
||||
num_samples = len(self.current_samples)
|
||||
self.current_samples = []
|
||||
for s in request.samples:
|
||||
self.current_samples.append([s.name, s.values.content])
|
||||
for index in range(num_samples-len(request.samples)):
|
||||
sample_index = index + len(request.samples)
|
||||
sample_name = util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) )
|
||||
sample_values = []
|
||||
for field_index in range(len(request.type.sample_form.fields)):
|
||||
sample_values.append(util.restore_text( params.get( 'sample_%i_field_%i' % (sample_index, field_index), '' ) ))
|
||||
self.current_samples.append([sample_name, sample_values])
|
||||
self.__update_samples(request, **kwd)
|
||||
# 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 ))
|
||||
if src_sample_index == -1:
|
||||
# empty sample
|
||||
self.current_samples.append(['New Sample',['' for field in request.type.sample_form.fields]])
|
||||
self.current_samples.append(['Sample_%i' % (len(self.current_samples)+1),['' for field in request.type.sample_form.fields]])
|
||||
else:
|
||||
self.current_samples.append([self.current_samples[src_sample_index][0]+'_copy',[val for val in self.current_samples[src_sample_index][1]]])
|
||||
self.current_samples.append([self.current_samples[src_sample_index][0]+'_%i' % (len(self.current_samples)+1),
|
||||
[val for val in self.current_samples[src_sample_index][1]]])
|
||||
# selectfield of all samples
|
||||
copy_list = SelectField('copy_sample')
|
||||
copy_list.add_option('None', -1, selected=True)
|
||||
@@ -186,11 +191,38 @@ class Requests( BaseController ):
|
||||
request=request,
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = self.current_samples,
|
||||
sample_copy=copy_list)
|
||||
sample_copy=copy_list, details_state=self.details_state)
|
||||
if params.get('save_samples_button', False) == 'Save':
|
||||
num_samples = len(self.current_samples)
|
||||
# update current_samples
|
||||
self.__update_samples(request, **kwd)
|
||||
# check for duplicate sample names
|
||||
msg = ''
|
||||
for index in range(len(self.current_samples)-len(request.samples)):
|
||||
sample_index = index + len(request.samples)
|
||||
sample_name = self.current_samples[sample_index][0]
|
||||
if not sample_name.strip():
|
||||
msg = 'Please enter the name of sample number %i' % sample_index
|
||||
break
|
||||
count = 0
|
||||
for i in range(len(self.current_samples)):
|
||||
if sample_name == self.current_samples[i][0]:
|
||||
count = count + 1
|
||||
if count > 1:
|
||||
msg = "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 msg:
|
||||
copy_list = SelectField('copy_sample')
|
||||
copy_list.add_option('None', -1, selected=True)
|
||||
for i, s in enumerate(self.current_samples):
|
||||
copy_list.add_option(i+1, i)
|
||||
return trans.fill_template( '/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = self.current_samples,
|
||||
sample_copy=copy_list, details_state=self.details_state,
|
||||
messagetype='error', msg=msg)
|
||||
# save all the new/unsaved samples entered by the user
|
||||
for index in range(num_samples-len(request.samples)):
|
||||
for index in range(len(self.current_samples)-len(request.samples)):
|
||||
sample_index = index + len(request.samples)
|
||||
sample_name = util.restore_text( params.get( 'sample_%i_name' % sample_index, '' ) )
|
||||
sample_values = []
|
||||
@@ -208,7 +240,6 @@ class Requests( BaseController ):
|
||||
action='list',
|
||||
operation='show_request',
|
||||
id=trans.security.encode_id(request.id)) )
|
||||
|
||||
@web.expose
|
||||
def delete_sample(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
@@ -221,6 +252,7 @@ class Requests( BaseController ):
|
||||
if s:
|
||||
s.delete()
|
||||
s.flush()
|
||||
request.flush()
|
||||
del self.current_samples[sample_index]
|
||||
copy_list = SelectField('copy_sample')
|
||||
copy_list.add_option('None', -1, selected=True)
|
||||
@@ -230,7 +262,26 @@ class Requests( BaseController ):
|
||||
request=request,
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = self.current_samples,
|
||||
sample_copy=copy_list)
|
||||
sample_copy=copy_list, details_state=self.details_state)
|
||||
@web.expose
|
||||
def toggle_request_details(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
request = trans.app.model.Request.get(int(params.get('request_id', 0)))
|
||||
if self.details_state == 'Show request details':
|
||||
self.details_state = 'Hide request details'
|
||||
elif self.details_state == 'Hide request details':
|
||||
self.details_state = 'Show request details'
|
||||
copy_list = SelectField('copy_sample')
|
||||
copy_list.add_option('None', -1, selected=True)
|
||||
for i, s in enumerate(self.current_samples):
|
||||
copy_list.add_option(i+1, i)
|
||||
return trans.fill_template( '/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = self.current_samples,
|
||||
sample_copy=copy_list, details_state=self.details_state)
|
||||
@web.expose
|
||||
def new(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
@@ -248,7 +299,7 @@ class Requests( BaseController ):
|
||||
elif params.get('save', False) == 'True':
|
||||
request_type = trans.app.model.RequestType.get(int(params.request_type_id))
|
||||
msg = self.__validate(trans,
|
||||
[('name','Name'), ('library_id','Library')],
|
||||
[('name','Name')],
|
||||
request_type.request_form.fields,
|
||||
**kwd)
|
||||
if msg:
|
||||
@@ -283,7 +334,7 @@ class Requests( BaseController ):
|
||||
'''
|
||||
params = util.Params( kwd )
|
||||
for field, field_name in main_fields:
|
||||
if not util.restore_text(params.get(field, None)):
|
||||
if not util.restore_text(params.get(field, '')):
|
||||
return 'Please enter the <b>%s</b> of the request' % field_name
|
||||
# check rest of the fields of the form
|
||||
for index, field in enumerate(form_fields):
|
||||
@@ -303,7 +354,15 @@ class Requests( BaseController ):
|
||||
pass
|
||||
name = util.restore_text(params.get('name', ''))
|
||||
desc = util.restore_text(params.get('desc', ''))
|
||||
library_id = int(util.restore_text(params.get('library_id', 0)))
|
||||
try:
|
||||
library_id = int(util.restore_text(params.get('library_id', None)))
|
||||
except:
|
||||
msg = "Sequencing request could not be saved. Invalid library"
|
||||
return trans.response.send_redirect( web.url_for( controller='requests',
|
||||
action='list',
|
||||
status='error',
|
||||
message=msg,
|
||||
**kwd) )
|
||||
values = []
|
||||
for index, field in enumerate(request_type.request_form.fields):
|
||||
values.append(util.restore_text(params.get('field_%i' % index, '')))
|
||||
|
||||
@@ -92,10 +92,31 @@ class Requests( BaseController ):
|
||||
self.current_samples = []
|
||||
for s in request.samples:
|
||||
self.current_samples.append([s.name, s.values.content])
|
||||
self.details_state = 'Show request details'
|
||||
return trans.fill_template( '/admin/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, id),
|
||||
current_samples = self.current_samples)
|
||||
current_samples = self.current_samples,
|
||||
details_state=self.details_state)
|
||||
@web.expose
|
||||
def toggle_request_details(self, trans, **kwd):
|
||||
params = util.Params( kwd )
|
||||
msg = util.restore_text( params.get( 'msg', '' ) )
|
||||
messagetype = params.get( 'messagetype', 'done' )
|
||||
request = trans.app.model.Request.get(int(params.get('request_id', 0)))
|
||||
if self.details_state == 'Show request details':
|
||||
self.details_state = 'Hide request details'
|
||||
elif self.details_state == 'Hide request details':
|
||||
self.details_state = 'Show request details'
|
||||
copy_list = SelectField('copy_sample')
|
||||
copy_list.add_option('None', -1, selected=True)
|
||||
for i, s in enumerate(self.current_samples):
|
||||
copy_list.add_option(i+1, i)
|
||||
return trans.fill_template( '/admin/requests/show_request.mako',
|
||||
request=request,
|
||||
request_details=self.request_details(trans, request.id),
|
||||
current_samples = self.current_samples,
|
||||
sample_copy=copy_list, details_state=self.details_state)
|
||||
def request_details(self, trans, id):
|
||||
'''
|
||||
Shows the request details
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
</div>
|
||||
<div class="toolSectionPad"></div>
|
||||
<div class="toolSectionTitle">
|
||||
<span>Requests</span>
|
||||
<span>Sequencing Requests</span>
|
||||
</div>
|
||||
<div class="toolSectionBody">
|
||||
<div class="toolSectionBg">
|
||||
|
||||
@@ -76,9 +76,6 @@
|
||||
|
||||
<div class="grid-header">
|
||||
<h2>${grid.title}</h2>
|
||||
%if len(query.all()):
|
||||
<h3>All Users</h3>
|
||||
%endif
|
||||
## %if len(query.all()):
|
||||
## <span class="title">Filter:</span>
|
||||
## %for i, filter in enumerate( grid.standard_filters ):
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
|
||||
<div class="grid-header">
|
||||
<h2>Request: ${request.name}</h2>
|
||||
<h2>Sequencing Request "${request.name}"</h2>
|
||||
</div>
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
@@ -38,21 +38,26 @@
|
||||
|
||||
<div class="toolForm">
|
||||
##<div class="toolFormTitle">Request Details: '${request_details[0]['value']}'</div>
|
||||
%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'] == 'Library':
|
||||
<a href="${h.url_for( controller='admin', action='browse_library', id=request.library.id )}">${rd['value']}</a>
|
||||
%else:
|
||||
${rd['value']}
|
||||
<div class="form-row">
|
||||
<a href="${h.url_for( controller='requests_admin', action='toggle_request_details', request_id=request.id )}">${details_state}</a>
|
||||
</div>
|
||||
%if details_state == "Hide request details":
|
||||
%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'] == 'Library':
|
||||
<a href="${h.url_for( controller='admin', action='browse_library', id=request.library.id )}">${rd['value']}</a>
|
||||
%else:
|
||||
${rd['value']}
|
||||
%endif
|
||||
%endif
|
||||
%endif
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
%endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,13 +1,20 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
|
||||
<h2>Bar codes for Samples of Request: ${request.name}</h2>
|
||||
<h2>Bar codes for Samples of Request "${request.name}"</h2>
|
||||
<h3>User: ${user.email}</h3>
|
||||
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<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">
|
||||
|
||||
@@ -3,7 +3,13 @@
|
||||
|
||||
<%def name="title()">Events for Sample ${sample.name}</%def>
|
||||
|
||||
<h2>Events for Sample "${sample.name}" of Request: <a href="${h.url_for( controller='requests_admin', action='list', operation='show_request', id=trans.security.encode_id(sample.request.id))}">${sample.request.name}</a></h2>
|
||||
<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 msg:
|
||||
|
||||
@@ -5,6 +5,14 @@
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
<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">${title}</div>
|
||||
|
||||
@@ -5,7 +5,14 @@
|
||||
%if msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
%endif
|
||||
|
||||
<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>
|
||||
|
||||
@@ -8,17 +8,23 @@
|
||||
|
||||
|
||||
<div class="grid-header">
|
||||
<h2>Request: ${request.name}</h2>
|
||||
<h2>Sequencing Request "${request.name}"</h2>
|
||||
</div>
|
||||
|
||||
%if not request.submitted and request.samples:
|
||||
|
||||
<ul class="manage-table-actions">
|
||||
%if not request.submitted 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='submit_request', id=request.id)}">
|
||||
<span>Submit request</span></a>
|
||||
</li>
|
||||
%endif
|
||||
<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='submit_request', id=request.id)}">
|
||||
<span>Submit request</span></a>
|
||||
<a class="action-button" href="${h.url_for( controller='requests', action='list')}">
|
||||
<span>Browse requests</span></a>
|
||||
</li>
|
||||
</ul>
|
||||
%endif
|
||||
|
||||
|
||||
|
||||
<%def name="render_sample_form( index, sample_name, sample_values )">
|
||||
@@ -60,21 +66,26 @@
|
||||
|
||||
<div class="toolForm">
|
||||
##<div class="toolFormTitle">Request Details: '${request_details[0]['value']}'</div>
|
||||
%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'] == 'Library':
|
||||
<a href="${h.url_for( controller='library', action='browse_library', id=request.library.id )}">${rd['value']}</a>
|
||||
%else:
|
||||
${rd['value']}
|
||||
<div class="form-row">
|
||||
<a href="${h.url_for( controller='requests', action='toggle_request_details', request_id=request.id )}">${details_state}</a>
|
||||
</div>
|
||||
%if details_state == "Hide request details":
|
||||
%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'] == 'Library':
|
||||
<a href="${h.url_for( controller='library', action='browse_library', id=request.library.id )}">${rd['value']}</a>
|
||||
%else:
|
||||
${rd['value']}
|
||||
%endif
|
||||
%endif
|
||||
%endif
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endfor
|
||||
%endif
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -101,10 +112,13 @@
|
||||
</tr>
|
||||
<thead>
|
||||
<tbody>
|
||||
<%
|
||||
request.refresh()
|
||||
%>
|
||||
%for sample_index, sample in enumerate(current_samples):
|
||||
<tr>
|
||||
<td>${sample_index+1}</td>
|
||||
%if sample[0] in [s.name for s in request.samples]:
|
||||
%if sample_index in range(len(request.samples)):
|
||||
${render_sample( sample_index, request.samples[sample_index] )}
|
||||
%else:
|
||||
${render_sample_form( sample_index, sample[0], sample[1])}
|
||||
|
||||
@@ -3,7 +3,19 @@
|
||||
|
||||
<%def name="title()">Events for Sample ${sample_name}</%def>
|
||||
|
||||
<h2>Events for Sample "${sample_name}" of Request: <a href="${h.url_for( controller='requests', action='list', operation='show_request', id=trans.security.encode_id(request.id))}">${request.name}</a></h2>
|
||||
|
||||
<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 msg:
|
||||
${render_msg( msg, messagetype )}
|
||||
|
||||
Reference in New Issue
Block a user