LIMS Changes

- Unique sample names within a request is now enforced
 - minor UI tweaks
 - show/hide request details
This commit is contained in:
Ramkrishna Chakrabarty
2009-07-24 12:16:32 -04:00
parent 97070efddf
commit efb51d173f
11 changed files with 205 additions and 69 deletions
+84 -25
View File
@@ -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, '')))
+22 -1
View File
@@ -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
+1 -1
View File
@@ -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">
-3
View File
@@ -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 ):
+20 -15
View File
@@ -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>
+8 -1
View File
@@ -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">
+7 -1
View File
@@ -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:
+8
View File
@@ -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>
+8 -1
View File
@@ -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>
+34 -20
View File
@@ -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])}
+13 -1
View File
@@ -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 )}