From fe9aeea44809fbfc8aefca8f361ab2ad2842d68a Mon Sep 17 00:00:00 2001
From: cramakri <cramakri>
Date: Mon, 4 Feb 2013 15:42:55 +0000
Subject: [PATCH] CCS-30 SP-488 : Incorproated changes from server

SVN: 28282
---
 .../ipad-read-service-v1/ipad_read.py         | 665 +++++++-----------
 1 file changed, 242 insertions(+), 423 deletions(-)

diff --git a/openbis-ipad/ipad-example-data/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py b/openbis-ipad/ipad-example-data/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py
index 5e91b595cf0..25fba2d911b 100644
--- a/openbis-ipad/ipad-example-data/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py
+++ b/openbis-ipad/ipad-example-data/ipad-ui-ylab/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py
@@ -42,7 +42,7 @@ class RequestHandler(object):
 	  """A helper method to get the value of the entities parameter. Returns an empty list if no entities were specified"""
 	  entities = self.parameters.get('entities')
 	  if entities is None:
-	    return []
+		return []
 	  return entities
 
 
@@ -198,17 +198,77 @@ class NavigationRequestHandler(RequestHandler):
 #
 # END Infrastructure
 #
-#
-# END Infrastructure
-#
 
 #
 # Helper Methods
 # 
-def image_url_for_compound(material):
-	"""Given a material (compound) return the image url"""
-	chemblId =  material.getCode()
-	return 'https://www.ebi.ac.uk/chemblws/compounds/%s/image' % chemblId
+
+def sort_samples_by_type(self, allSamples):
+
+	self.oligos = []
+	self.antibodies = []
+	self.chemicals = []
+	self.protocols = []
+	self.medias = []
+	self.pcrs = []
+	self.buffers = []
+	self.plasmids = []
+	self.yeasts = []
+	self.bacterias = []
+	self.enzymes = []
+	self.westernBlottings = []
+
+	for sample in allSamples:
+		if 'OLIGO' == sample.getSampleType():
+			self.oligos.append(sample)
+		elif 'ANTIBODY' == sample.getSampleType():
+			self.antibodies.append(sample)
+		elif 'CHEMICAL' == sample.getSampleType():
+			self.chemicals.append(sample)
+		elif 'GENERAL_PROTOCOL' == sample.getSampleType():
+			self.protocols.append(sample)
+		elif 'MEDIA' == sample.getSampleType():
+			self.medias.append(sample)
+		elif 'PCR' == sample.getSampleType():
+			self.pcrs.append(sample)
+		elif 'SOLUTIONS_BUFFERS' == sample.getSampleType():
+			self.buffers.append(sample)
+		elif 'PLASMID' == sample.getSampleType():
+			self.plasmids.append(sample)
+		elif 'YEAST' == sample.getSampleType():
+			self.yeasts.append(sample)
+		elif 'BACTERIA' == sample.getSampleType():
+			self.bacterias.append(sample)
+		elif 'ENZYME' == sample.getSampleType():
+			self.enzymes.append(sample)
+		elif 'WESTERN_BLOTTING' == sample.getSampleType():
+			self.westernBlottings.append(sample)
+
+def retrieve_sample_type_properties_definitions(sample_type):
+	"""Return the property definitions for each of the referenced entity types.
+
+	The definitions are sorted according to display order.
+	"""
+	definitions = list(searchService.listPropertiesDefinitionsForSampleType(sample_type))
+	definitions.sort(lambda x, y: cmp(x.getPositionInForms(), y.getPositionInForms()))
+	return definitions
+
+def properties_for_entity(entity, property_definitions, prop_names_set):
+	"""Extract the properties, in the correct order, for the entity. Restricting them to those in the prop_names_set, if it is non-empty"""
+	properties = []
+	check_prop_names_set = len(prop_names_set) > 0
+	for propdef in property_definitions:
+		propcode = propdef.getPropertyTypeCode()
+		# Only include the properties we explicitly specify
+		if check_prop_names_set and propcode not in prop_names_set:
+			continue
+		value = entity.getPropertyValue(propcode)
+		prop = {'key' : propcode, 'label' : propdef.getPropertyTypeLabel(), 'value' : value }
+		properties.append(prop)
+	return properties
+
+def marquee_image_spec_for_url(image_url):
+	return { 'MARQUEE' : { 'URL' : image_url } }
 
 def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buffers, plasmids, yeasts, bacterias, enzymes, westernBlottings):
 	oligo_dict = {}
@@ -216,7 +276,7 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	oligo_dict["SUMMARY"] = "Oligos in YeastLab"
 	oligo_dict['PERM_ID'] = "OLIGO"
 	refcon_oligo = {}
-	refcon_oligo['code'] =  "OLIGO"
+	refcon_oligo['code'] =	"OLIGO"
 	refcon_oligo['entityKind'] = 'NAVIGATION'
 	refcon_oligo['entityType'] = 'NAVIGATION'
 	oligo_dict['REFCON'] = json_encoded_value(refcon_oligo)
@@ -277,7 +337,7 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	media_dict["SUMMARY"] = "Medias in YeastLab"
 	media_dict['PERM_ID'] = "MEDIA"
 	refcon_media = {}
-	refcon_media['code'] =  "MEDIA"
+	refcon_media['code'] =	"MEDIA"
 	refcon_media['entityKind'] = 'NAVIGATION'
 	refcon_media['entityType'] = 'NAVIGATION'
 	media_dict['REFCON'] = json_encoded_value(refcon_media)
@@ -285,7 +345,7 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	children = [media.getPermId() for media in medias]
 	media_dict['CHILDREN'] = json_encoded_value(children)
 	media_dict['PROPERTIES'] = json_encoded_value([])
-	media_dict['ROOT_LEVEL'] = True	
+	media_dict['ROOT_LEVEL'] = True 
 
 	pcr_dict = {}
 	pcr_dict["SUMMARY_HEADER"] = "pcr"
@@ -307,7 +367,7 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	buffer_dict["SUMMARY"] = "Solution Buffers in YeastLab"
 	buffer_dict['PERM_ID'] = "SOLUTIONS_BUFFERS"
 	refcon_buffer = {}
-	refcon_buffer['code'] =  "SOLUTIONS_BUFFERS"
+	refcon_buffer['code'] =	 "SOLUTIONS_BUFFERS"
 	refcon_buffer['entityKind'] = 'NAVIGATION'
 	refcon_buffer['entityType'] = 'NAVIGATION'
 	buffer_dict['REFCON'] = json_encoded_value(refcon_buffer)
@@ -331,13 +391,13 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	plasmid_dict['CHILDREN'] = json_encoded_value(children)
 	plasmid_dict['PROPERTIES'] = json_encoded_value([])
 	plasmid_dict['ROOT_LEVEL'] = True	
-        
+		
 	yeast_dict = {}
 	yeast_dict["SUMMARY_HEADER"] = "yeast"
 	yeast_dict["SUMMARY"] = "Yeasts in YeastLab"
 	yeast_dict['PERM_ID'] = "YEAST"
 	refcon_yeast = {}
-	refcon_yeast['code'] =  "YEAST"
+	refcon_yeast['code'] =	"YEAST"
 	refcon_yeast['entityKind'] = 'NAVIGATION'
 	refcon_yeast['entityType'] = 'NAVIGATION'
 	yeast_dict['REFCON'] = json_encoded_value(refcon_yeast)
@@ -345,7 +405,7 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	children = [yeast.getPermId() for yeast in yeasts]
 	yeast_dict['CHILDREN'] = json_encoded_value(children)
 	yeast_dict['PROPERTIES'] = json_encoded_value([])
-	yeast_dict['ROOT_LEVEL'] = True    
+	yeast_dict['ROOT_LEVEL'] = True	   
 	
 	
 	bacteria_dict = {}
@@ -361,15 +421,14 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	children = [bacteria.getPermId() for bacteria in bacterias]
 	bacteria_dict['CHILDREN'] = json_encoded_value(children)
 	bacteria_dict['PROPERTIES'] = json_encoded_value([])
-	bacteria_dict['ROOT_LEVEL'] = True    
-
+	bacteria_dict['ROOT_LEVEL'] = True	  
 
 	enzyme_dict = {}
 	enzyme_dict["SUMMARY_HEADER"] = "enzyme"
 	enzyme_dict["SUMMARY"] = "Enzymes in YeastLab"
 	enzyme_dict['PERM_ID'] = "ENZYME"
 	refcon_enzyme = {}
-	refcon_enzyme['code'] =  "ENZYME"
+	refcon_enzyme['code'] =	 "ENZYME"
 	refcon_enzyme['entityKind'] = 'NAVIGATION'
 	refcon_enzyme['entityType'] = 'NAVIGATION'
 	enzyme_dict['REFCON'] = json_encoded_value(refcon_enzyme)
@@ -377,7 +436,7 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	children = [enzyme.getPermId() for enzyme in enzymes]
 	enzyme_dict['CHILDREN'] = json_encoded_value(children)
 	enzyme_dict['PROPERTIES'] = json_encoded_value([])
-	enzyme_dict['ROOT_LEVEL'] = True    
+	enzyme_dict['ROOT_LEVEL'] = True	
 
 
 	westernBlotting_dict = {}
@@ -393,200 +452,78 @@ def navigation_layer(oligos, antibodies, chemicals, protocols, medias, pcrs, buf
 	children = [westernBlotting.getPermId() for westernBlotting in westernBlottings]
 	westernBlotting_dict['CHILDREN'] = json_encoded_value(children)
 	westernBlotting_dict['PROPERTIES'] = json_encoded_value([])
-	westernBlotting_dict['ROOT_LEVEL'] = True    
+	westernBlotting_dict['ROOT_LEVEL'] = True 
 
+	return [oligo_dict, antibody_dict, chemical_dict, protocol_dict, media_dict, pcr_dict, buffer_dict, plasmid_dict, yeast_dict, bacteria_dict, enzyme_dict, westernBlotting_dict]
+
+def sample_to_dict_with_props(sample, want_props):
+	"""Convert a sample to a dictionary. Uses the NAME property to construct the summary. Returns empty children. Callers may need to modify the summary and children as well"""
+	sample_dict = {}
+	sample_dict['SUMMARY_HEADER'] = sample.getCode()
+	summary = "Name: " + unicode(sample.getPropertyValue("NAME"))
+	sample_dict['SUMMARY'] = summary
+	sample_dict['IDENTIFIER'] = sample.getSampleIdentifier()
+	sample_dict['PERM_ID'] = sample.getPermId()
+	refcon_sample = {}
+	refcon_sample['code'] =	 sample.getCode()
+	refcon_sample['entityKind'] = 'SAMPLE'
+	refcon_sample['entityType'] = sample.getSampleType()
+	sample_dict['REFCON'] = json_encoded_value(refcon_sample)
+	sample_dict['CATEGORY'] = sample.getSampleType()
+	children = []
+	sample_dict['CHILDREN'] = json_encoded_value(children)
+
+	if want_props:
+		property_definitions = retrieve_sample_type_properties_definitions(sample.getSampleType())
+		properties_sample = properties_for_entity(sample, property_definitions, [])
+		sample_dict['PROPERTIES'] = json_encoded_value(properties_sample)
+
+		sample_dict['ROOT_LEVEL'] = None
+		return sample_dict
 	
 
-	return [oligo_dict, antibody_dict, chemical_dict, protocol_dict, media_dict, pcr_dict, buffer_dict, plasmid_dict, yeast_dict, bacteria_dict, enzyme_dict, westernBlotting_dict]
+def oligo_to_dict(oligo, want_props):
+	sample_dict = sample_to_dict_with_props(oligo, want_props)
+	summary = "Project: " + str(oligo.getPropertyValue("PROJECT"))
+	summary = summary + "\n"
+	summary = summary + "Target: " + oligo.getPropertyValue("TARGET")
+	sample_dict['SUMMARY'] = summary
+	return sample_dict
 
-def oligo_to_dict(oligo):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = oligo.getCode()
-        summary = "Project: " + str(oligo.getPropertyValue("PROJECT"))
-        summary = summary + "\n"
-        summary = summary + "Target: " + oligo.getPropertyValue("TARGET")
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = oligo.getSampleIdentifier()
-        sample_dict['PERM_ID'] = oligo.getPermId()
-        refcon_oligo = {}
-        refcon_oligo['code'] =  oligo.getCode()
-        refcon_oligo['entityKind'] = 'SAMPLE'
-        refcon_oligo['entityType'] = oligo.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_oligo)
-        sample_dict['CATEGORY'] = oligo.getSampleType()
-#       sample_dict['IMAGE_URL'] = image_url_for_compound(compound)
-
-#       children = [oligo.getPropertyValue("TARGET"), oligo.getPropertyValue("COMPOUND")]
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_oligo = ["BOX_NUMBER", "ROW", "COLUMN", "TARGET", "DIRECTION", "RESTRICTION_ENZYME", "MODIFICATIONS", "SEQUENCE"]
-        properties_oligo = dict((name, oligo.getPropertyValue(name)) for name in prop_names_oligo if oligo.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_oligo)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def antibody_to_dict(antibody):
-	sample_antibody_dict = {}
-	sample_antibody_dict['SUMMARY_HEADER'] = antibody.getCode()
+def antibody_to_dict(antibody, want_props):
+	sample_antibody_dict = sample_to_dict_with_props(antibody, want_props)
 	summary = "Name: " + str(antibody.getPropertyValue("NAME"))
 	summary = summary + "\n"
 	summary = summary + "Epitope: " + str(antibody.getPropertyValue("EPITOPE"))
 	sample_antibody_dict['SUMMARY'] = summary
-	sample_antibody_dict['IDENTIFIER'] = antibody.getSampleIdentifier()
-	sample_antibody_dict['PERM_ID'] = antibody.getPermId()
-	refcon_antibody = {}
-	refcon_antibody['code'] =  antibody.getCode()
-	refcon_antibody['entityKind'] = 'SAMPLE'
-	refcon_antibody['entityType'] = antibody.getSampleType()
-	sample_antibody_dict['REFCON'] = json_encoded_value(refcon_antibody)
-	sample_antibody_dict['CATEGORY'] = antibody.getSampleType()
-#	sample_antibody_dict['IMAGE_URL'] = image_url_for_compound(compound)
-
-#	children = [oligo.getPropertyValue("TARGET"), oligo.getPropertyValue("COMPOUND")]
-	children = []
-	sample_antibody_dict['CHILDREN'] = json_encoded_value(children)
-
-	prop_names_antibody = ["STORAGE", "SUPPLIER", "ARTICLE_NUMBER", "CLONALITY", "ISOTYPE", "HOST", "STOCK_CONCENTRATION", "FOR_WHAT", "PUBLICATION", "COMMENTS"]
-	properties_antibody = dict((name, antibody.getPropertyValue(name)) for name in prop_names_antibody if antibody.getPropertyValue(name) is not None)
-	sample_antibody_dict['PROPERTIES'] = json_encoded_value(properties_antibody)
-	sample_antibody_dict['ROOT_LEVEL'] = None
 	return sample_antibody_dict
 
-def chemical_to_dict(chemical):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = chemical.getCode()
-        summary = "Name: " + str(chemical.getPropertyValue("NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = chemical.getSampleIdentifier()
-        sample_dict['PERM_ID'] = chemical.getPermId()
-        refcon_chemical = {}
-        refcon_chemical['code'] =  chemical.getCode()
-        refcon_chemical['entityKind'] = 'SAMPLE'
-        refcon_chemical['entityType'] = chemical.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_chemical)
-        sample_dict['CATEGORY'] = chemical.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_chemical = ["STORAGE", "LOCAL_ID", "SUPPLIER", "ARTICLE_NUMBER"]
-        properties_chemical = dict((name, chemical.getPropertyValue(name)) for name in prop_names_chemical if chemical.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_chemical)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def protocol_to_dict(protocol):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = protocol.getCode()
-        summary = "Name: " + str(protocol.getPropertyValue("NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = protocol.getSampleIdentifier()
-        sample_dict['PERM_ID'] = protocol.getPermId()
-        refcon_protocol = {}
-        refcon_protocol['code'] =  protocol.getCode()
-        refcon_protocol['entityKind'] = 'SAMPLE'
-        refcon_protocol['entityType'] = protocol.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_protocol)
-        sample_dict['CATEGORY'] = protocol.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_protocol = ["FOR_WHAT", "PROTOCOL_TYPE", "PUBLICATION", "MATERIALS", "PROCEDURE", "PROTOCOL_EVALUATION", "SUGGESTIONS", "PROTOCOL_MODIFICATIONS"]
-        properties_protocol = dict((name, protocol.getPropertyValue(name)) for name in prop_names_protocol if protocol.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_protocol)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def media_to_dict(media):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = media.getCode()
-        summary = "Name: " + str(media.getPropertyValue("NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = media.getSampleIdentifier()
-        sample_dict['PERM_ID'] = media.getPermId()
-        refcon_media = {}
-        refcon_media['code'] =  media.getCode()
-        refcon_media['entityKind'] = 'SAMPLE'
-        refcon_media['entityType'] = media.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_media)
-        sample_dict['CATEGORY'] = media.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_media = ["STOCK_CONCENTRATION", "STORAGE", "FOR_WHAT", "ORGANISM", "STERILIZATION", "DETAILS", "COMMENTS", "PUBLICATION"]
-        properties_media = dict((name, media.getPropertyValue(name)) for name in prop_names_media if media.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_media)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def pcr_to_dict(pcr):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = pcr.getCode()
-        summary = "Name: " + str(pcr.getPropertyValue("NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = pcr.getSampleIdentifier()
-        sample_dict['PERM_ID'] = pcr.getPermId()
-        refcon_pcr = {}
-        refcon_pcr['code'] =  pcr.getCode()
-        refcon_pcr['entityKind'] = 'SAMPLE'
-        refcon_pcr['entityType'] = pcr.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_pcr)
-        sample_dict['CATEGORY'] = pcr.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_pcr = ["SUPPLIER", "ARTICLE_NUMBER", "KIT", "PUBLICATION", "MATERIALS", "TEMPLATE"]
-        properties_pcr = dict((name, pcr.getPropertyValue(name)) for name in prop_names_pcr if pcr.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_pcr)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def buffer_to_dict(buffer):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = buffer.getCode()
-        summary = "Name: " + str(buffer.getPropertyValue("NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = buffer.getSampleIdentifier()
-        sample_dict['PERM_ID'] = buffer.getPermId()
-        refcon_buffer = {}
-        refcon_buffer['code'] =  buffer.getCode()
-        refcon_buffer['entityKind'] = 'SAMPLE'
-        refcon_buffer['entityType'] = buffer.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_buffer)
-        sample_dict['CATEGORY'] = buffer.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_buffer = ["STOCK_CONCENTRATION", "STORAGE", "FOR_WHAT", "STERILIZATION", "DETAILS", "COMMENTS", "PUBLICATION"]
-        properties_buffer = dict((name, buffer.getPropertyValue(name)) for name in prop_names_buffer if buffer.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_buffer)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def plasmid_to_dict(plasmid, children_map):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = plasmid.getCode()
-        summary = "Name: " + str(plasmid.getPropertyValue("PLASMID_NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] = plasmid.getSampleIdentifier()
-        sample_dict['PERM_ID'] = plasmid.getPermId()
-        refcon_plasmid = {}
-        refcon_plasmid['code'] =  plasmid.getCode()
-        refcon_plasmid['entityKind'] = 'SAMPLE'
-        refcon_plasmid['entityType'] = plasmid.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_plasmid)
-        sample_dict['CATEGORY'] = plasmid.getSampleType()
-        children = [child.getPermId() for child in children_map.get(plasmid.getSampleIdentifier(), [])]
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_plasmid = ["BOX_NUMBER", "ROW", "COLUMN", "OWNER", "OWNER_NUMBER", "BACKBONE", "DERIVATIVE_OF", "BACTERIAL_ANTIBIOTIC_RESISTANCE", "YEAST_MARKER", "OTHER_MARKER", "FLANKING_RESTRICTION_ENZYME", "COMMENTS", "DATE"]
-        properties_plasmid = dict((name, plasmid.getPropertyValue(name)) for name in prop_names_plasmid if plasmid.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_plasmid)
-        sample_dict['ROOT_LEVEL'] = None 
+def chemical_to_dict(chemical, want_props):
+	return sample_to_dict_with_props(chemical, want_props)
+
+def protocol_to_dict(protocol, want_props):
+		return sample_to_dict_with_props(protocol, want_props)
+
+def media_to_dict(media, want_props):
+		return sample_to_dict_with_props(media, want_props)
+
+def pcr_to_dict(pcr, want_props):
+		return sample_to_dict_with_props(pcr, want_props)
+
+def buffer_to_dict(buffer, want_props):
+		return sample_to_dict_with_props(buffer, want_props)
+
+def plasmid_to_dict(plasmid, children_map, want_props):
+	sample_dict = sample_to_dict_with_props(plasmid, want_props)
+
+	summary = "Name: " + str(plasmid.getPropertyValue("PLASMID_NAME"))
+	sample_dict['SUMMARY'] = summary
+	children = [child.getPermId() for child in children_map.get(plasmid.getSampleIdentifier(), [])]
+	sample_dict['CHILDREN'] = json_encoded_value(children)
 	return sample_dict
 
 def plasmid_to_dict_with_images(plasmid, children_map, data_sets):
-	plasmid_dict = plasmid_to_dict(plasmid, children_map)
+	plasmid_dict = plasmid_to_dict(plasmid, children_map, True)
 	plasmid_data_set = None
 	for data_set in data_sets:
 		if data_set.getSample().getSampleIdentifier() == plasmid.getSampleIdentifier():
@@ -597,160 +534,90 @@ def plasmid_to_dict_with_images(plasmid, children_map, data_sets):
 	image_url = 'https://openbis-csb.ethz.ch:8444/datastore_server/' + plasmid_data_set.getDataSetCode() + '/generated/'
 	image_url = image_url + plasmid.getCode() + '.svg'
 	plasmid_dict['IMAGE_URL'] = image_url
+	plasmid_dict['IMAGES'] = json_encoded_value(marquee_image_spec_for_url(image_url))
 	return plasmid_dict
 	
+def yeast_to_dict(yeast, children_map, want_props):
+		sample_dict = sample_to_dict_with_props(yeast, want_props)
+		summary = "Name: " + str(yeast.getPropertyValue("YEAST_STRAIN_NAME"))
+		sample_dict['SUMMARY'] = summary
+
+		children = [child.getPermId() for child in children_map.get(yeast.getSampleIdentifier(), [])]
+		sample_dict['CHILDREN'] = json_encoded_value(children)
 
-def yeast_to_dict(yeast, children_map):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = yeast.getCode()
-        summary = "Name: " + str(yeast.getPropertyValue("YEAST_STRAIN_NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] =yeast.getSampleIdentifier()
-        sample_dict['PERM_ID'] = yeast.getPermId()
-        refcon_yeast = {}
-        refcon_yeast['code'] =  yeast.getCode()
-        refcon_yeast['entityKind'] = 'SAMPLE'
-        refcon_yeast['entityType'] = yeast.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_yeast)
-        sample_dict['CATEGORY'] = yeast.getSampleType()
-        children = [child.getPermId() for child in children_map.get(yeast.getSampleIdentifier(), [])]
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_yeast = ["BOX_NUMBER", "ROW", "COLUMN", "OWNER", "OWNER_NUMBER", "GENETIC_BACKGROUND", "MATING_TYPE", "BACKGROUND_SPECIFIC_MARKER", "COMMON_MARKERS", "ENDOGENOUS_PLASMID", "SOURCE", "ORIGIN", "STRAIN_CHECK", "PROJECT", "COMMENTS"]
-        properties_yeast = dict((name, yeast.getPropertyValue(name)) for name in prop_names_yeast if yeast.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_yeast)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-
-def bacteria_to_dict(bacteria):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = bacteria.getCode()
+		return sample_dict
+
+def bacteria_to_dict(bacteria, with_props):
+	sample_dict = sample_to_dict_with_props(bacteria, with_props)
 	name = str(bacteria.getPropertyValue("BACTERIA_STRAIN_NAME").encode('utf-8'))
-        summary = "Name: " + name
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] =bacteria.getSampleIdentifier()
-        sample_dict['PERM_ID'] = bacteria.getPermId()
-        refcon_bacteria = {}
-        refcon_bacteria['code'] =  bacteria.getCode()
-        refcon_bacteria['entityKind'] = 'SAMPLE'
-        refcon_bacteria['entityType'] = bacteria.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_bacteria)
-        sample_dict['CATEGORY'] = bacteria.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_bacteria = ["BOX_NUMBER", "ROW", "COLUMN","BACTERIA_GENOTYPE".encode('utf-8'), "ARTICLE_NUMBER", "COMMENTS".encode('utf-8'),"FOR_WHAT".encode('utf-8'), "SUPLLIER" ]
-        properties_bacteria = dict((name, bacteria.getPropertyValue(name)) for name in prop_names_bacteria if bacteria.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_bacteria)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def enzyme_to_dict(enzyme):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = enzyme.getCode()
-        summary = "Name: " + str(enzyme.getPropertyValue("NAME"))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] =enzyme.getSampleIdentifier()
-        sample_dict['PERM_ID'] = enzyme.getPermId()
-        refcon_enzyme = {}
-        refcon_enzyme['code'] =  enzyme.getCode()
-        refcon_enzyme['entityKind'] = 'SAMPLE'
-        refcon_enzyme['entityType'] = enzyme.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_enzyme)
-        sample_dict['CATEGORY'] = enzyme.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_enzyme = ["SUPPLIER", "ARTICLE_NUMBER", "STORAGE", "KIT"]
-        properties_enzyme = dict((name, enzyme.getPropertyValue(name)) for name in prop_names_enzyme if enzyme.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_enzyme)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-def westernBlotting_to_dict(westernBlotting):
-        sample_dict = {}
-        sample_dict['SUMMARY_HEADER'] = westernBlotting.getCode()
-        summary = "Name: " + str(westernBlotting.getPropertyValue("NAME").encode('utf-8'))
-        sample_dict['SUMMARY'] = summary
-        sample_dict['IDENTIFIER'] =westernBlotting.getSampleIdentifier()
-        sample_dict['PERM_ID'] = westernBlotting.getPermId()
-        refcon_westernBlotting = {}
-        refcon_westernBlotting['code'] =  westernBlotting.getCode()
-        refcon_westernBlotting['entityKind'] = 'SAMPLE'
-        refcon_westernBlotting['entityType'] = westernBlotting.getSampleType()
-        sample_dict['REFCON'] = json_encoded_value(refcon_westernBlotting)
-        sample_dict['CATEGORY'] = westernBlotting.getSampleType()
-        children = []
-        sample_dict['CHILDREN'] = json_encoded_value(children)
-
-        prop_names_westernBlotting = [ "FOR_WHAT".encode('utf-8'), "COMMENTS", "STORAGE", "XMLCOMMENTS", "PUBLICATION", "CHEMICALS", "SOLUTIONS_BUFFERS", "ANTIBODIES", "ANTIBODY_DILUTION", "ANTIBODY_SOLUTION", "MEMBRANE"]
-        properties_westernBlotting = dict((name, westernBlotting.getPropertyValue(name)) for name in prop_names_westernBlotting if westernBlotting.getPropertyValue(name) is not None)
-        sample_dict['PROPERTIES'] = json_encoded_value(properties_westernBlotting)
-        sample_dict['ROOT_LEVEL'] = None
-        return sample_dict
-
-
-def oligos_to_dict(samples):
-	result = [oligo_to_dict(sample) for sample in samples]
-	return result
+	summary = "Name: " + name
+	sample_dict['SUMMARY'] = summary
+	return sample_dict
 
-def antibodies_to_dict(samples):
-        result = [antibody_to_dict(sample) for sample in samples]
-        return result
+def enzyme_to_dict(enzyme, with_props):
+	sample_dict = sample_to_dict_with_props(enzyme, with_props)
+	return sample_dict
 
-def chemicals_to_dict(samples):
-        result = [chemical_to_dict(sample) for sample in samples]
-        return result
+def westernBlotting_to_dict(westernBlotting, with_props):
+	return sample_to_dict_with_props(westernBlotting, with_props)
 
-def protocols_to_dict(samples):
-        result = [protocol_to_dict(sample) for sample in samples]
-        return result
+def oligos_to_dict(samples, want_props):
+	result = [oligo_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def medias_to_dict(samples):
-        result = [media_to_dict(sample) for sample in samples]
-        return result
+def antibodies_to_dict(samples, want_props):
+	result = [antibody_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def pcrs_to_dict(samples):
-        result = [pcr_to_dict(sample) for sample in samples]
-        return result
+def chemicals_to_dict(samples, want_props):
+	result = [chemical_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def buffers_to_dict(samples):
-        result = [buffer_to_dict(sample) for sample in samples]
-        return result
+def protocols_to_dict(samples, want_props):
+	result = [protocol_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def plasmids_to_dict(samples, children_map):
-        result = [plasmid_to_dict(sample, children_map) for sample in samples]
-        return result
+def medias_to_dict(samples, want_props):
+	result = [media_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def plasmids_to_dict_with_images(samples, children_map, data_sets):
-        result = [plasmid_to_dict_with_images(sample, children_map, data_sets) for sample in samples]
-        return result
+def pcrs_to_dict(samples, want_props):
+	result = [pcr_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def yeasts_to_dict(samples, children_map):
-        result = [yeast_to_dict(sample, children_map) for sample in samples]
-        return result
+def buffers_to_dict(samples, want_props):
+	result = [buffer_to_dict(sample, want_props) for sample in samples]
+	return result
 
-def bacterias_to_dict(samples):
-        result = [bacteria_to_dict(sample) for sample in samples]
-        return result
+def plasmids_to_dict(samples, children_map, want_props):
+	result = [plasmid_to_dict(sample, children_map, want_props) for sample in samples]
+	return result
 
-def enzymes_to_dict(samples):
-        result = [enzyme_to_dict(sample) for sample in samples]
-        return result
+def plasmids_to_dict_with_images(samples, children_map, data_sets):
+	result = [plasmid_to_dict_with_images(sample, children_map, data_sets) for sample in samples]
+	return result
 
-def westernBlottings_to_dict(samples):
-        result = [westernBlotting_to_dict(sample) for sample in samples]
-        return result
+def yeasts_to_dict(samples, children_map, want_props):
+	result = [yeast_to_dict(sample, children_map, want_props) for sample in samples]
+	return result
 
+def bacterias_to_dict(samples, want_props):
+	result = [bacteria_to_dict(sample, want_props) for sample in samples]
+	return result
 
+def enzymes_to_dict(samples, want_props):
+	result = [enzyme_to_dict(sample, want_props) for sample in samples]
+	return result
 
+def westernBlottings_to_dict(samples, want_props):
+	result = [westernBlotting_to_dict(sample, want_props) for sample in samples]
+	return result
 
 def retrieve_samples(sample_perm_ids_and_ref_cons):
 	sc = SearchCriteria()
 	sc.setOperator(sc.SearchOperator.MATCH_ANY_CLAUSES)
 	for sample in sample_perm_ids_and_ref_cons:
-		code = sample['REFCON']['code']	
+		code = sample['REFCON']['code'] 
 		sc.addMatchClause(sc.MatchClause.createAttributeMatch(sc.MatchClauseAttribute.CODE, code))
 	return searchService.searchForSamples(sc)
 
@@ -778,60 +645,27 @@ class YeastLabNavigationRequestHandler(NavigationRequestHandler):
 	def add_data_rows(self):
 		self.add_rows(navigation_layer([], [], [], [], [], [], [], [], [], [], [], []))
 
-
 class YeastLabRootRequestHandler(RootRequestHandler):
 	"""Handler for the ROOT request."""
-
 	def retrieve_data(self):
-		# Get the data and add a row for each data item
-		sc_oligo = SearchCriteria()
-		sc_oligo.addMatchClause(sc_oligo.MatchClause.createAttributeMatch(sc_oligo.MatchClauseAttribute.TYPE, "OLIGO"))
-		self.oligos = self.searchService.searchForSamples(sc_oligo)
-
-		sc_antibody = SearchCriteria()
-		sc_antibody.addMatchClause(sc_antibody.MatchClause.createAttributeMatch(sc_antibody.MatchClauseAttribute.TYPE, "ANTIBODY"))
-		self.antibodies = self.searchService.searchForSamples(sc_antibody)
-
-		sc_chemical = SearchCriteria()
-		sc_chemical.addMatchClause(sc_chemical.MatchClause.createAttributeMatch(sc_chemical.MatchClauseAttribute.TYPE, "CHEMICAL"))
-		self.chemicals = self.searchService.searchForSamples(sc_chemical)
-
-		sc_protocol = SearchCriteria()
-		sc_protocol.addMatchClause(sc_protocol.MatchClause.createAttributeMatch(sc_protocol.MatchClauseAttribute.TYPE, "GENERAL_PROTOCOL"))
-		self.protocols = self.searchService.searchForSamples(sc_protocol)
-
-		sc_media = SearchCriteria()
-		sc_media.addMatchClause(sc_media.MatchClause.createAttributeMatch(sc_media.MatchClauseAttribute.TYPE, "MEDIA"))
-		self.medias = self.searchService.searchForSamples(sc_media)
-
-		sc_pcr = SearchCriteria()
-		sc_pcr.addMatchClause(sc_pcr.MatchClause.createAttributeMatch(sc_pcr.MatchClauseAttribute.TYPE, "PCR"))
-		self.pcrs = self.searchService.searchForSamples(sc_pcr)
-
-		sc_buffer = SearchCriteria()
-		sc_buffer.addMatchClause(sc_buffer.MatchClause.createAttributeMatch(sc_buffer.MatchClauseAttribute.TYPE, "SOLUTIONS_BUFFERS"))
-		self.buffers = self.searchService.searchForSamples(sc_buffer)
-
-		sc_plasmid = SearchCriteria()
-		sc_plasmid.addMatchClause(sc_plasmid.MatchClause.createAttributeMatch(sc_plasmid.MatchClauseAttribute.TYPE, "PLASMID"))
-		self.plasmids = self.searchService.searchForSamples(sc_plasmid)
-
-		sc_yeast = SearchCriteria()
-		sc_yeast.addMatchClause(sc_yeast.MatchClause.createAttributeMatch(sc_yeast.MatchClauseAttribute.TYPE, "YEAST"))
-		self.yeasts = self.searchService.searchForSamples(sc_yeast)
-
-		sc_bacteria = SearchCriteria()
-		sc_bacteria.addMatchClause(sc_bacteria.MatchClause.createAttributeMatch(sc_bacteria.MatchClauseAttribute.TYPE, "BACTERIA"))
-		self.bacterias = self.searchService.searchForSamples(sc_bacteria)
-
-		sc_enzyme = SearchCriteria()
-		sc_enzyme.addMatchClause(sc_enzyme.MatchClause.createAttributeMatch(sc_enzyme.MatchClauseAttribute.TYPE, "ENZYME"))
-		self.enzymes = self.searchService.searchForSamples(sc_enzyme)
-
-		sc_westernBlotting = SearchCriteria()
-		sc_westernBlotting.addMatchClause(sc_westernBlotting.MatchClause.createAttributeMatch(sc_westernBlotting.MatchClauseAttribute.TYPE, "WESTERN_BLOTTING"))
-		self.westernBlottings = self.searchService.searchForSamples(sc_westernBlotting)
-
+		all_samples_sc = SearchCriteria()
+		all_samples_sc.setOperator(SearchCriteria.SearchOperator.MATCH_ANY_CLAUSES)
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "OLIGO"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "ANTIBODY"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "CHEMICAL"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "GENERAL_PROTOCOL"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "MEDIA"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "PCR"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "SOLUTIONS_BUFFERS"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "PLASMID"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "YEAST"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "BACTERIA"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "ENZYME"))
+		all_samples_sc.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(SearchCriteria.MatchClauseAttribute.TYPE, "WESTERN_BLOTTING"))
+		self.samples = self.searchService.searchForSamples(all_samples_sc)
+
+		# Sort out the results
+		self.sort_samples_by_type(self.samples)
 		
 		self.children_map = dict()
 		for plasmid in self.plasmids:
@@ -841,23 +675,22 @@ class YeastLabRootRequestHandler(RootRequestHandler):
 		for yeast in self.yeasts:
 			for parent in yeast.getParentSampleIdentifiers():
 				children = self.children_map.setdefault(parent, [])
-				children.append(yeast)
-			
+				children.append(yeast)			
 
 	def add_data_rows(self):
 		self.add_rows(navigation_layer(self.oligos, self.antibodies, self.chemicals, self.protocols, self.medias, self.pcrs, self.buffers, self.plasmids, self.yeasts, self.bacterias, self.enzymes, self.westernBlottings))
-		self.add_rows(oligos_to_dict(self.oligos))
-		self.add_rows(antibodies_to_dict(self.antibodies))
-		self.add_rows(chemicals_to_dict(self.chemicals))
-		self.add_rows(protocols_to_dict(self.protocols))
-		self.add_rows(medias_to_dict(self.medias))
-		self.add_rows(pcrs_to_dict(self.pcrs))
-		self.add_rows(buffers_to_dict(self.buffers))
-		self.add_rows(plasmids_to_dict(self.plasmids, self.children_map))
-		self.add_rows(yeasts_to_dict(self.yeasts, self.children_map))
-		self.add_rows(bacterias_to_dict(self.bacterias))
-		self.add_rows(enzymes_to_dict(self.enzymes))
-		self.add_rows(westernBlottings_to_dict(self.westernBlottings))
+		self.add_rows(oligos_to_dict(self.oligos, False))
+		self.add_rows(antibodies_to_dict(self.antibodies, False))
+		self.add_rows(chemicals_to_dict(self.chemicals, False))
+		self.add_rows(protocols_to_dict(self.protocols, False))
+		self.add_rows(medias_to_dict(self.medias, False))
+		self.add_rows(pcrs_to_dict(self.pcrs, False))
+		self.add_rows(buffers_to_dict(self.buffers, False))
+		self.add_rows(plasmids_to_dict(self.plasmids, self.children_map, False))            	
+		self.add_rows(yeasts_to_dict(self.yeasts, self.children_map, False))
+		self.add_rows(bacterias_to_dict(self.bacterias, False))
+		self.add_rows(enzymes_to_dict(self.enzymes, False))
+		self.add_rows(westernBlottings_to_dict(self.westernBlottings, False))
 
 class YeastLabDrillRequestHandler(DrillRequestHandler):
 	"""Handler for the DRILL request."""
@@ -872,7 +705,7 @@ class YeastLabDrillRequestHandler(DrillRequestHandler):
 		drill_medias = [entity for entity in entities if 'MEDIA' == entity['REFCON']['entityType']]	
 		drill_pcrs = [entity for entity in entities if 'PCR' == entity['REFCON']['entityType']]	
 		drill_buffers = [entity for entity in entities if 'SOLUTIONS_BUFFERS' == entity['REFCON']['entityType']]	
-                #drill_plasmids = [entity for entity in entities if 'PLASMID' == entity['REFCON']['entityType']]
+		#drill_plasmids = [entity for entity in entities if 'PLASMID' == entity['REFCON']['entityType']]
 		drill_bacterias = [entity for entity in entities if 'BACTERIA' == entity['REFCON']['entityType']]	
 		drill_enzymes = [entity for entity in entities if 'ENZYME' == entity['REFCON']['entityType']]	
 		drill_westernBlottings = [entity for entity in entities if 'WESTERN_BLOTTING' == entity['REFCON']['entityType']]	
@@ -892,37 +725,23 @@ class YeastLabDetailRequestHandler(DetailRequestHandler):
 		detail_samples = [entity for entity in entities if 'SAMPLE' == entity['REFCON']['entityKind']]
 
 		self.samples = retrieve_samples(detail_samples)
-		self.oligos = [sample for sample in self.samples if 'OLIGO' == sample.getSampleType()]
-		self.antibodies = [sample for sample in self.samples if 'ANTIBODY' == sample.getSampleType()]
-		self.chemicals = [sample for sample in self.samples if 'CHEMICAL' == sample.getSampleType()]
-		self.protocols = [sample for sample in self.samples if 'GENERAL_PROTOCOL' == sample.getSampleType()]
-		self.medias = [sample for sample in self.samples if 'MEDIA' == sample.getSampleType()]
-		self.pcrs = [sample for sample in self.samples if 'PCR' == sample.getSampleType()]
-		self.buffers = [sample for sample in self.samples if 'SOLUTIONS_BUFFERS' == sample.getSampleType()]
-		self.plasmids = [sample for sample in self.samples if 'PLASMID' == sample.getSampleType()]
-		self.yeasts = [sample for sample in self.samples if 'YEAST' == sample.getSampleType()]
+		self.sort_samples_by_type(self.samples)
 		self.plasmid_data_sets = retrieve_seq_data_sets(self.plasmids)
-		self.bacterias = [sample for sample in self.samples if 'BACTERIA' == sample.getSampleType()]
-		self.enzymes = [sample for sample in self.samples if 'ENZYME' == sample.getSampleType()]
-		self.westernBlottings = [sample for sample in self.samples if 'WESTERN_BLOTTING' == sample.getSampleType()]
-		
 
 	def add_data_rows(self):
-		self.add_rows(oligos_to_dict(self.oligos))
-		self.add_rows(antibodies_to_dict(self.antibodies))
-		self.add_rows(chemicals_to_dict(self.chemicals))
-		self.add_rows(protocols_to_dict(self.protocols))
-		self.add_rows(medias_to_dict(self.medias))
-		self.add_rows(pcrs_to_dict(self.pcrs))
-		self.add_rows(buffers_to_dict(self.buffers))
+		self.add_rows(oligos_to_dict(self.oligos, True))
+		self.add_rows(antibodies_to_dict(self.antibodies, True))
+		self.add_rows(chemicals_to_dict(self.chemicals, True))
+		self.add_rows(protocols_to_dict(self.protocols, True))
+		self.add_rows(medias_to_dict(self.medias, True))
+		self.add_rows(pcrs_to_dict(self.pcrs, True))
+		self.add_rows(buffers_to_dict(self.buffers, True))
 		self.add_rows(plasmids_to_dict_with_images(self.plasmids, {}, self.plasmid_data_sets))
-		self.add_rows(yeasts_to_dict(self.yeasts, {}))
-		self.add_rows(bacterias_to_dict(self.bacterias))
-		self.add_rows(enzymes_to_dict(self.enzymes))
-		self.add_rows(westernBlottings_to_dict(self.westernBlottings))            
-            
-            
-            
+		self.add_rows(yeasts_to_dict(self.yeasts, {}, True))
+		self.add_rows(bacterias_to_dict(self.bacterias, True))
+		self.add_rows(enzymes_to_dict(self.enzymes, True))
+		self.add_rows(westernBlottings_to_dict(self.westernBlottings, True))	  
+			
 
 def aggregate(parameters, builder):
 	request_key = parameters.get('requestKey')
-- 
GitLab