about summary refs log tree commit diff
path: root/web/webqtl/updateTrait/DataUpdatePage.py
diff options
context:
space:
mode:
authorroot2012-05-08 18:39:56 -0500
committerroot2012-05-08 18:39:56 -0500
commitea46f42ee640928b92947bfb204c41a482d80937 (patch)
tree9b27a4eb852d12539b543c3efee9d2a47ef470f3 /web/webqtl/updateTrait/DataUpdatePage.py
parent056b5253fc3857b0444382aa39944f6344dc1ceb (diff)
downloadgenenetwork2-ea46f42ee640928b92947bfb204c41a482d80937.tar.gz
Add all the source codes into the github.
Diffstat (limited to 'web/webqtl/updateTrait/DataUpdatePage.py')
-rwxr-xr-xweb/webqtl/updateTrait/DataUpdatePage.py738
1 files changed, 738 insertions, 0 deletions
diff --git a/web/webqtl/updateTrait/DataUpdatePage.py b/web/webqtl/updateTrait/DataUpdatePage.py
new file mode 100755
index 00000000..a43f8367
--- /dev/null
+++ b/web/webqtl/updateTrait/DataUpdatePage.py
@@ -0,0 +1,738 @@
+# Copyright (C) University of Tennessee Health Science Center, Memphis, TN.
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License
+# as published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the GNU Affero General Public License for more details.
+#
+# This program is available from Source Forge: at GeneNetwork Project
+# (sourceforge.net/projects/genenetwork/).
+#
+# Contact Drs. Robert W. Williams and Xiaodong Zhou (2010)
+# at rwilliams@uthsc.edu and xzhou15@uthsc.edu
+#
+#
+#
+# This module is used by GeneNetwork project (www.genenetwork.org)
+#
+# Created by GeneNetwork Core Team 2010/08/10
+#
+# Last updated by GeneNetwork Core Team 2011/04/20
+
+
+
+#DataUpdatePage.py
+#
+#Classes:
+#DataUpagePage
+#-KA
+
+
+import string
+from htmlgen import HTMLgen2 as HT
+import os
+import time
+
+from base.webqtlTrait import webqtlTrait
+from base.templatePage import templatePage
+from base import webqtlConfig
+from utility import webqtlUtil
+from dbFunction import webqtlDatabaseFunction
+
+#########################################
+#      Update Trait
+#########################################
+
+class DataUpdatePage(templatePage):
+
+	def __init__(self, fd):
+
+		templatePage.__init__(self, fd)
+
+		if not self.updMysql():
+			return
+
+		if not fd.genotype:
+			fd.readGenotype()
+			fd.strainlist = fd.f1list + fd.strainlist
+		
+		fd.readData()
+		
+		self.formdata = fd.formdata
+		self.dict['title'] = 'Data Updating'
+		
+		try:
+			thisTrait = webqtlTrait(fullname=self.formdata.getvalue('fullname'), cursor=self.cursor)
+			thisTrait.retrieveInfo()
+		except:
+			heading = "Updating Database"
+			detail = ["The trait doesn't exist."]
+			self.error(heading=heading,detail=detail,error="Error")
+			return
+
+		if webqtlConfig.USERDICT[self.privilege] >= webqtlConfig.USERDICT['user']:
+				pass
+		else:
+			heading = "Updating Database"
+			detail = ["You don't have the permission to modify this trait"]
+			self.error(heading=heading,detail=detail,error="Error")
+			return
+
+			
+		status = self.formdata.getvalue('curStatus')
+		if status == 'updateCheck': #XZhou: Check the change
+			self.updateCheckPage(fd, thisTrait)
+		elif status == 'updateResult': #XZhou: make the changes to database
+			self.updateResultPage(fd, thisTrait)
+		else: #XZhou: show info retrieved from database
+			self.dispTraitPage(fd, thisTrait)
+
+
+	def dispTraitPage(self, fd, thisTrait):	
+		form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), name='dataInput',submit=HT.Input(type='hidden'))
+
+		#XZhou: This is to show trait info.
+		recordInfoTable = HT.TableLite(border=0, cellspacing=1, cellpadding=5,align="left")
+
+		for field in thisTrait.db.disfield:
+			fieldValue = getattr(thisTrait, field)
+			if not fieldValue:
+				fieldValue = ""
+			#fields to be ignored
+			if field in ("chipid", "genbankid"):
+				continue
+			elif field == "comments":
+				if fieldValue:
+					comments = string.split(fieldValue, '\n')
+					title0 = HT.Paragraph("Update History: ", Class="subtitle")
+					form.append(title0)
+					history = HT.Blockquote()
+					for item in comments:
+						if item:
+							history.append(item, HT.BR())
+					form.append(history)
+				continue
+			else:
+				pass
+				
+			if field == 'name' or field == 'units':
+				form.append(HT.Input(type="hidden",name=field,value=fieldValue))
+				if field == 'name':
+					inputBox = HT.Strong(fieldValue)
+				else:
+					continue
+			elif field == 'pubmed_id':
+				inputBox = HT.Span(HT.Input(type="text",name=field,size=60, maxlength=255,value=fieldValue))
+				warning = HT.Paragraph(Class="fs11 cr")
+				warning.append('1. Please enter only the PubMed ID integer value into the field above.', HT.BR(), '    Don\'t enter',
+							' other characters.', HT.BR()) 
+				warning.append('2. If you modify an existing PubMed ID, changes will affect other records with', HT.BR(), \
+							'    the same ID but will NOT affect the phenotype description or trait data.', HT.BR()) 
+				warning.append('3. If your delete an existing PubMed ID, this will not affect any other traits,', HT.BR(), \
+							'    including those with the same PubMed ID.', HT.BR()) 
+				warning.append('4. If you enter publication data for a PubMed ID that is already in the database,', HT.BR(), \
+							'    then all fields except Phenotype and Trait Data will be ignored.') 
+				inputBox.append(warning)
+			elif field == 'pre_publication_description' or field == 'post_publication_description' or field == 'original_description' or field == 'owner' or field == 'abstract' or field == 'blatseq' or field == 'targetseq' or field == 'description' or field == 'authors' or field == 'sequence' or field == 'alias' or field == 'probe_target_description':
+				inputBox = HT.Textarea(name=field, cols=60, rows=4,text=fieldValue)
+			elif field == 'post_publication_abbreviation' or field == 'pre_publication_abbreviation':
+				inputBox = HT.Input(type="text",name=field,size=60, maxlength=30,value=fieldValue)
+			elif field == 'geneid':
+				inputBox = HT.Input(type="text",name=field,size=60, maxlength=255,value=fieldValue)
+				recordInfoTable.append(HT.TR(
+                                HT.TD("%s :" % webqtlUtil.formatField(field), Class="fs12 fwb ff1", align="right"),
+                                HT.TD(width=20),HT.TD(inputBox)))
+				#XZ: homologene is not in thisTrait.db.disfield, so have to do in this way
+				field = 'homologeneid'
+				inputBox = HT.Input(type="text",name=field,size=60, maxlength=255,value=thisTrait.homologeneid)
+			else:
+				inputBox = HT.Input(type="text",name=field,size=60, maxlength=255,value=fieldValue)
+
+			#XZ: For existing non-confidential phenotype trait, pre_publication_description and pre_publication_abbreviation are not shown to anybody except submitter or admistrator to prevent the trait being set to confidential one.
+			if thisTrait.db.type == 'Publish' and field == 'pre_publication_description' or field == 'pre_publication_abbreviation':
+				if not thisTrait.confidential and webqtlConfig.USERDICT[self.privilege] < webqtlConfig.USERDICT['admin'] and self.userName != thisTrait.submitter:
+					continue
+
+			#XZ and Rob, April 20, 2011: This is to add field and inputBox to table. Note that the change of format to each field(Capitalize) by webqtlUtil.formatField function.
+			recordInfoTable.append(HT.TR(
+				HT.TD("%s :" % webqtlUtil.formatField(field), Class="fs12 fwb ff1", align="right", valign="top"),
+				HT.TD(width=5),HT.TD(inputBox)))
+
+		#XZhou: This is to show trait data.
+		recordDataTable = HT.Text('Trait data updating is disabled')
+		
+		if thisTrait.db.type == 'Publish':
+			thisTrait.retrieveData()
+			recordDataTable = HT.TableLite(border=0, width = "90%",cellspacing=2, cellpadding=2)
+			recordDataTable.append(HT.TR(HT.TD('Strain Name',Class="fs12 ffl fwb",align="Center"), 
+				HT.TD('TraitData',Class="fs12 ffl fwb",align="Center"), 
+				HT.TD('SE',Class="fs12 ffl fwb",align="Center"),
+				HT.TD('N Per Strain',Class="fs12 ffl fwb",align="Center"),
+				HT.TD('Strain Name',Class="fs12 ffl fwb",align="Center"), 
+				HT.TD('TraitData',Class="fs12 ffl fwb",align="Center"), 
+				HT.TD('SE',Class="fs12 ffl fwb",align="Center"),
+				HT.TD('N Per Strain',Class="fs12 ffl fwb",align="Center")))
+			tempTR = HT.TR(align="Center")
+			for i, strainName in enumerate(fd.strainlist):
+				if thisTrait.data.has_key(strainName):
+					tdata = thisTrait.data[strainName]
+					traitVal, traitVar, traitNP = tdata.val, tdata.var, tdata.N
+				else:
+					traitVal, traitVar, traitNP = None, None, None
+				
+				if traitVal != None:	
+					traitVal = "%2.3f" % traitVal
+				else:
+					traitVal = 'x'
+				if traitVar != None:	
+					traitVar = "%2.3f" % traitVar
+				else:
+					traitVar = 'x'
+				if traitNP != None:	
+					traitNP = "%d" % traitNP
+				else:
+					traitNP = 'x'
+						
+				tempTR.append(HT.TD(HT.Paragraph(strainName),align='CENTER'), 
+					HT.TD(HT.Input(name=strainName, size=8, maxlength=8, value=traitVal),align='CENTER'),
+					HT.TD(HT.Input(name='V'+strainName, size=8, maxlength=8, value=traitVar),align='CENTER'),
+					HT.TD(HT.Input(name='N'+strainName, size=8, maxlength=8, value=traitNP),align='CENTER'))
+				if i % 2:
+					recordDataTable.append(tempTR)
+					tempTR = HT.TR(align="Center")
+			
+			if (i+1) % 2:
+				tempTR.append(HT.TD(''))
+				tempTR.append(HT.TD(''))
+				tempTR.append(HT.TD(''))
+				recordDataTable.append(tempTR)
+					
+		updateButton = HT.Input(type='submit',name='submit', value='Submit Change',Class="button")
+		resetButton = HT.Input(type='reset',Class="button")
+		
+		hddn = {'fullname':str(thisTrait), 'FormID':'updateRecord', 'curStatus':'updateCheck', 'RISet':fd.RISet, "incparentsf1":1}
+		for key in hddn.keys():
+			form.append(HT.Input(name=key, value=hddn[key], type='hidden'))
+
+		
+		#############################
+		TD_LR = HT.TD(valign="top",colspan=2,bgcolor="#eeeeee")
+
+		containerTable = HT.TableLite(border=0, width = "90%",cellspacing=0, cellpadding=0)
+		
+		mainTitle = HT.Paragraph("Update Info and Data", Class="title")
+		
+		title1 = HT.Paragraph("Trait Information: ", Class="subtitle")
+
+		title2 = HT.Paragraph("Trait Data:", Class="subtitle")
+
+		containerTable.append(HT.TR(HT.TD(title1)), HT.TR(HT.TD(HT.BR(),updateButton,resetButton,HT.BR(),HT.BR())), 
+					 HT.TR(HT.TD(recordInfoTable)), HT.TR(HT.TD(title2)), HT.TR(HT.TD(HT.BR(),recordDataTable, HT.BR(), HT.BR())),
+					 HT.TR(HT.TD(updateButton,resetButton)))
+		
+		form.append(containerTable)
+		
+		TD_LR.append(mainTitle, form)
+		
+		self.dict['body'] = TD_LR
+		
+	def updateCheckPage(self, fd, thisTrait):
+		form = HT.Form(cgi= os.path.join(webqtlConfig.CGIDIR, webqtlConfig.SCRIPTFILE), name='updateCheck',submit=HT.Input(type='hidden'))
+		hddn = {'fullname':str(thisTrait), 'FormID':'updateRecord', 'curStatus':'updateResult', 'RISet':fd.RISet, "incparentsf1":1}
+		
+		recordInfoTable = HT.TableLite(border=0, cellspacing=1, cellpadding=5,align="left",width="90%")
+		infoChanges = []
+		for field in thisTrait.db.disfield:
+			#fields to be ignored
+			#XZ: The stupid htmlgen can not set readonly for input and textarea. This is the only way I can prevent displayed items such as 'original_description', 'submitter' being changed.
+			if field in ("chipid", "genbankid", "comments", "original_description", "submitter"):
+				continue
+			oldValue = getattr(thisTrait, field)
+			if not oldValue:
+				oldValue = ''
+			oldValue = str(oldValue)
+			modifiedValue = self.formdata.getvalue(field)
+			if not modifiedValue:
+				modifiedValue = ""
+			modifiedValue.strip()
+			oldValue.strip()
+			if oldValue == modifiedValue:
+				form.append(HT.Input(type="hidden",name=field,value=oldValue))
+				continue
+				
+			oldValue = HT.Paragraph(oldValue, Class="cr")
+			warning = ''
+			if field == 'PubMed_ID':
+				if modifiedValue != "":
+					try:
+						modifiedValue = int(modifiedValue)
+					except:
+						continue
+					
+				#whether new PMID already exists
+				newPMIDExist = None
+				if modifiedValue:
+					self.cursor.execute("SelecT Id from Publication where PubMed_ID = %d" % modifiedValue)
+					results = self.cursor.fetchall()
+					if results:
+						newPMIDExist = results[0][0]
+				if newPMIDExist:
+					warning = HT.Paragraph(Class="fs11 cr")
+					warning.append('This new PubMed_ID already exists in our database. If you still want to change to this very PubMed_ID, the publication information (title, author, journal, etc.) will be replaced by those linked to this new PubMed_ID. That means, all the fields below (if any, except phenotype info and trait value) will be ignored.')
+
+			infoChanges.append(field)
+			inputBox = HT.Textarea(name=field, cols=50, rows=3,text=modifiedValue, onChange = "Javascript:this.form.curStatus.value='updateCheck';")
+			recordInfoTable.append(
+				HT.TR(HT.TD("%s :" % webqtlUtil.formatField(field), Class="fs12 fwb ff1", colspan = 3, valign="top")), 
+				HT.TR(HT.TD(oldValue, valign="top"),HT.TD(width=20),HT.TD( inputBox, warning)))
+
+		#XZ: homologeneid is not in thisTrait.db.disfield
+		if thisTrait.db.type == "ProbeSet":
+			field = 'homologeneid'
+			oldValue = getattr(thisTrait, field)
+                        if not oldValue:
+                                oldValue = ''
+                        oldValue = str(oldValue)
+                        modifiedValue = self.formdata.getvalue(field)
+                        if not modifiedValue:
+                                modifiedValue = ""
+                        modifiedValue.strip()
+                        oldValue.strip()
+
+                        if oldValue == modifiedValue:
+                                form.append(HT.Input(type="hidden",name=field,value=oldValue))
+                        else:
+				oldValue = HT.Paragraph(oldValue, Class="cr")
+				warning = ''
+				infoChanges.append(field)
+				inputBox = HT.Textarea(name=field, cols=50, rows=3,text=modifiedValue, onChange = "Javascript:this.form.curStatus.value='updateCheck';")
+	                        recordInfoTable.append(
+        			                        HT.TR(HT.TD("%s :" % webqtlUtil.formatField(field), Class="fs12 fwb ff1", colspan = 3, valign="top")),
+                                			HT.TR(HT.TD(oldValue, valign="top"),HT.TD(width=20),HT.TD( inputBox, warning)))
+				
+
+		if infoChanges == []:
+			recordInfoTable = ""
+			recordInfoChange = HT.Blockquote('No change has been made.')
+		else:
+			hddn['modifiedField'] = string.join(infoChanges, '::')
+			recordInfoChange = ''
+			
+		recordDataChange = HT.Blockquote('Trait data updating is disabled')
+		recordDataTable = ""
+		
+		modifiedVals = []
+		modifiedVars = []
+		modifiedNps = []
+		numDataChanges = 0
+		if thisTrait.db.type == 'Publish':
+			thisTrait.retrieveData()
+			recordDataTable = HT.TableLite(border=0, width = "90%",cellspacing=2, cellpadding=2)
+			for i, strainName in enumerate(fd.strainlist):
+				if thisTrait.data.has_key(strainName):
+					tdata = thisTrait.data[strainName]
+					traitVal, traitVar, traitNP = tdata.val, tdata.var, tdata.N
+				else:
+					traitVal, traitVar, traitNP = None, None, None
+				
+				if traitVal != None:	
+					traitVal = "%2.3f" % traitVal
+				else:
+					traitVal = 'x'
+				if traitVar != None:	
+					traitVar = "%2.3f" % traitVar
+				else:
+					traitVar = 'x'
+				if traitNP != None:	
+					traitNP = "%d" % traitNP
+				else:
+					traitNP = 'x'
+					
+				try:	
+					modifiedVal =  "%2.3f" % fd.allTraitData[strainName].val
+				except:
+					modifiedVal = 'x'
+				try:	
+					modifiedVar = "%2.3f" % fd.allTraitData[strainName].var
+				except:
+					modifiedVar = 'x'
+				try:	
+					modifiedNp = "%d" % fd.allTraitData[strainName].N
+				except:
+					modifiedNp = 'x'
+				
+				if modifiedVal != traitVal:
+					recordDataTable.append(HT.TR(HT.TD(HT.Paragraph(strainName + " Value")),
+						HT.TD(HT.Paragraph(traitVal, Class="cr")), 
+						HT.TD(HT.Input(name=strainName, size=8, maxlength=8, value=modifiedVal, onChange = "Javascript:this.form.curStatus.value='updateCheck';"))))
+					numDataChanges += 1
+					modifiedVals.append(modifiedVal)
+				else:
+					form.append(HT.Input(type="hidden",name=strainName,value=traitVal))
+					modifiedVals.append(traitVal)
+					
+				if modifiedVar != traitVar:
+					recordDataTable.append(HT.TR(HT.TD(HT.Paragraph(strainName + " SE")),
+						HT.TD(HT.Paragraph(traitVar, Class="cr")), 
+						HT.TD(HT.Input(name='V'+strainName, size=8, maxlength=8, value=modifiedVar, onChange = "Javascript:this.form.curStatus.value='updateCheck';"))))
+					numDataChanges += 1
+					modifiedVars.append(modifiedVar)
+				else:
+					form.append(HT.Input(type="hidden",name='V'+strainName,value=traitVar))
+					modifiedVars.append(traitVar)
+					
+				if modifiedNp != traitNP:
+					recordDataTable.append(HT.TR(HT.TD(HT.Paragraph(strainName + " N Per Strain")),
+						HT.TD(HT.Paragraph(traitNP, Class="cr")), 
+						HT.TD(HT.Input(name='N'+strainName, size=8, maxlength=8, value=modifiedNp, onChange = "Javascript:this.form.curStatus.value='updateCheck';"))))
+					numDataChanges += 1
+					modifiedNps.append(modifiedNp)
+				else:
+					form.append(HT.Input(type="hidden",name='N'+strainName,value=traitNP))
+					modifiedNps.append(traitNP)
+					
+					
+			if numDataChanges == 0:
+				recordDataChange = HT.Blockquote('No change has been made.')
+				recordDataTable = ""
+			else:
+				hddn['modifiedDataField'] = 1
+				recordDataChange = ""
+				
+		#if numDataChanges:
+		#	hddn['val'] = string.join(modifiedVals, ',')
+		#	hddn['var'] = string.join(modifiedVars, ',')
+		#	hddn['np'] = string.join(modifiedNps, ',')
+			
+		for key in hddn.keys():
+			form.append(HT.Input(name=key, value=hddn[key], type='hidden'))
+
+		#############################
+		TD_LR = HT.TD(valign="top",colspan=2,bgcolor="#eeeeee", height=200)
+		
+		mainTitle = HT.Paragraph("Update Info and Data", Class="title")
+		
+		title1 = HT.Paragraph("Trait Information:", Class="subtitle")
+
+		title2 = HT.Paragraph("Trait Data:", Class="subtitle")
+		
+		if numDataChanges or infoChanges:
+			recordChange = HT.Blockquote('The table below lists all the changes made. The texts in red are the original information stored on the server, the texts to the right are the modified version. ')
+			updateButton = HT.Input(type='submit',name='submit', value='Update Data',Class="button")
+			resetButton = HT.Input(type='reset',Class="button")
+			form.append(title1, HT.Center(updateButton,resetButton), recordInfoChange, recordInfoTable,title2, recordDataChange, HT.Center(recordDataTable,HT.P(),updateButton,resetButton),HT.P())
+			TD_LR.append(mainTitle, recordChange, HT.Blockquote(form))
+		else:
+			recordInfoChange = HT.Blockquote("No change has been made")
+			TD_LR.append(mainTitle, recordInfoChange)
+			
+		self.dict['body'] = TD_LR
+		#self.dict['js1'] = webqtlConfig.resetFieldScript
+		return
+
+	def updateResultPage(self, fd, thisTrait):
+	
+		comments = []
+		ctime = time.ctime()
+		##Start Updating
+		dataID = -1
+		if thisTrait.db.type == 'Publish':
+			self.cursor.execute("SelecT PublishXRef.InbredSetId, PublishXRef.DataId, PublishXRef.PublicationId, PublishXRef.PhenotypeId, PublishXRef.Sequence from PublishXRef, PublishFreeze where PublishXRef.InbredSetId= PublishFreeze.InbredSetId and  PublishFreeze.Name = '%s' and PublishXRef.Id = %s" % (thisTrait.db.name, thisTrait.name))
+			PInbredSetId, dataID, PublicationId, PhenotypeId, Sequence = self.cursor.fetchall()[0]
+			
+		modifyField = self.formdata.getvalue('modifiedField')
+		###Modify Trait Informations
+		if modifyField:
+			modifyField = string.split(modifyField, '::')
+			comments += modifyField
+			updateHomologeneid = False
+
+			if thisTrait.db.type == 'Publish':
+				PhenotypeItemUpdate = []
+				PhenotypeItemValues = []
+				PublicationItemUpdate = []
+				PublicationItemValues = []
+
+				for item in modifyField:
+					itemvalue = self.formdata.getvalue(item)
+
+					#XZ: identify Phenotype items
+					if item in ['pre_publication_description', 'post_publication_description', 'original_description', 'pre_publication_abbreviation', 'post_publication_abbreviation', 'lab_code', 'submitter', 'owner', 'authorized_users', 'units']:
+						if itemvalue != None: #XZ: the problem is that the item value can not be deleted
+							PhenotypeItemUpdate.append('%s=%%s' % item)
+							PhenotypeItemValues.append(itemvalue)
+
+							continue #XZ: this is important to distinguish Phenotype item and Publication item
+
+					elif item == "pubmed_id":
+						#Only integer allowed in this field
+						try:
+							itemvalue = int(itemvalue)
+						except:
+							itemvalue = None
+							
+						#whether old PMID exists
+						self.cursor.execute("SelecT PubMed_ID from Publication where Id = %d" % PublicationId)
+						oldPMID = self.cursor.fetchone()
+						if oldPMID:
+							oldPMID = oldPMID[0]
+						
+						#whether new PMID already exists
+						newPMID = None
+						self.cursor.execute("SelecT Id from Publication where PubMed_ID = %d" % itemvalue)
+						newPMID = self.cursor.fetchone()
+						if newPMID:
+							newPMID = newPMID[0]
+						
+						##the logic is still not very clear here
+						if newPMID:
+							#new PMID in record
+							self.cursor.execute("Update PublishXRef set PublicationId = %d where InbredSetId=%d and PhenotypeId=%d and PublicationId=%d and Sequence=%d" % (newPMID, PInbredSetId, PhenotypeId, PublicationId, Sequence))
+							#no need to update other fields
+							PublicationItemUpdate = []
+							break
+						elif itemvalue:
+							#have new PMID, but not in record or need to change
+							self.cursor.execute("Update Publication set pubmed_id=%d where Id = %s" % (itemvalue,PublicationId))
+						else:
+							#no new PMID
+							if oldPMID:
+								#remove a pubmed_id, don't know if this ever gonna happen
+								self.cursor.execute("SelecT max(Id) from Publication")
+								maxId = self.cursor.fetchone()[0] + 1
+								self.cursor.execute("SelecT * from Publication where Id = %d" % PublicationId)
+								oldRecs = list(self.cursor.fetchone())
+								oldRecs[0] = maxId
+								oldRecs[1] = None
+								NFields = ['%s'] * len(oldRecs)
+								query = "insert into Publication Values (%s)" % string.join(NFields, ',')
+								self.cursor.execute(query, tuple(oldRecs))
+								self.cursor.execute("Update PublishXRef set PublicationId = %d where InbredSetId=%d and PhenotypeId=%d and PublicationId=%d and Sequence=%d" % (maxId, PInbredSetId, PhenotypeId, PublicationId, Sequence))
+								PublicationId = maxId
+								pass
+							else:
+								pass
+						continue
+					else:
+						pass
+
+					if itemvalue:						
+						PublicationItemUpdate.append('%s=%%s' % item)
+						PublicationItemValues.append(itemvalue)
+
+				if PhenotypeItemUpdate:
+                                        updateStr= string.join(PhenotypeItemUpdate,',')
+                                        query = "Update Phenotype set %s where Id = %s" % (updateStr, PhenotypeId)
+                                        self.cursor.execute(query,tuple(PhenotypeItemValues))
+
+				if PublicationItemUpdate:
+					updateStr= string.join(PublicationItemUpdate,',')
+					query = "Update Publication set %s where Id = %s" % (updateStr, PublicationId)
+					self.cursor.execute(query,tuple(PublicationItemValues))
+
+			else: #ProbeSet or Genotype Data
+				itemValues = []
+	                        itemUpdate = []
+
+				for item in modifyField:
+					itemvalue = self.formdata.getvalue(item)
+					if itemvalue != None:
+						itemvalue = string.strip(itemvalue)
+					else:
+						pass
+					if item == 'homologeneid':
+						updateHomologeneid = True
+						new_homologeneid = 0
+
+						if itemvalue and len(itemvalue) > 0:
+							try:
+								new_homologeneid = int(itemvalue)
+							except:
+								heading = "Record Updating Result"
+								detail = ["Can't update database. Homologeneid must be integer!"]
+								self.error(heading=heading,detail=detail,error="Error")
+								return
+					else:
+						itemUpdate.append('%s=%%s' % item) #XZ: Use %% to put a % in the output string
+						itemValues.append(itemvalue)
+
+				if itemUpdate:
+					updateStr= string.join(itemUpdate,', ')
+					comments = "%s modified %s at %s\n" % (self.userName, string.join(comments, ', '), ctime)
+					if thisTrait.db.type == "ProbeSet":#XZ, June 29, 2010: The algorithm is not good. Need to fix it later.
+					 	if thisTrait.chipid in (2,4):
+					 		if thisTrait.name[-2:] == '_A':
+								thisTrait.name = string.replace(thisTrait.name, '_A', '')
+					 		elif thisTrait.name[-2:] == '_B':
+								thisTrait.name = string.replace(thisTrait.name, '_B', '')
+							else:
+								pass
+							query = "Update %s set %s where Name like '%s%%%%'" % (thisTrait.db.type,updateStr,thisTrait.name)
+							self.cursor.execute(query,tuple(itemValues))
+							self.cursor.execute("Update %s set comments = CONCAT(comments,'%s') where Name like '%s%%%%'" % (thisTrait.db.type, comments, thisTrait.name))
+						elif thisTrait.sequence:
+							query = "Update %s set %s where BlatSeq='%s'" % (thisTrait.db.type,updateStr,thisTrait.sequence)
+							self.cursor.execute(query,tuple(itemValues))
+							self.cursor.execute("Update %s set comments = CONCAT(comments,'%s') where BlatSeq='%s'" % (thisTrait.db.type, comments, thisTrait.sequence))
+						else:
+							query = "Update %s set %s where Name='%s'" % (thisTrait.db.type,updateStr,thisTrait.name)
+							self.cursor.execute(query,tuple(itemValues))
+							self.cursor.execute("Update %s set comments = CONCAT(comments,'%s') where Name='%s'" % (thisTrait.db.type, comments, thisTrait.name))
+					else: #XZ: Genotype
+						query = "Update %s set %s where SpeciesId=%s and Name='%s'" % (thisTrait.db.type,updateStr, webqtlDatabaseFunction.retrieveSpeciesId(self.cursor, thisTrait.db.riset), thisTrait.name)
+						self.cursor.execute(query,tuple(itemValues))
+
+				if updateHomologeneid: #XZ: to update homologene id must be after updating geneid.
+				#XZ: In one species, one homologeneid can have multiple geneid. One geneid only can have one homologeneid.
+				#XZ: In Homologene table, GeneId is unique.
+                                #XZ: Geneid might just being updated.
+                                        thisTrait = webqtlTrait(fullname=self.formdata.getvalue('fullname'), cursor=self.cursor)
+                                        thisTrait.retrieveInfo()
+
+					if not thisTrait.geneid:
+                                        	heading = "Record Updating Result"
+						detail = ["There is no geneid associated with this trait. Can't update homologeneid info"]
+						self.error(heading=heading,detail=detail,error="Error")
+						return
+					else:
+						query = """
+							SELECT Species.TaxonomyId
+							FROM Species, InbredSet
+							WHERE InbredSet.Name = '%s' and InbredSet.SpeciesId = Species.Id
+							""" % thisTrait.db.riset
+						self.cursor.execute(query)
+	                                        taxonomyId = self.cursor.fetchone()[0]
+
+						if not new_homologeneid:
+							query = """DELETE FROM Homologene WHERE GeneId=%s""" % thisTrait.geneid
+                                                        self.cursor.execute(query)
+						else:
+							query = """SELECT GeneId FROM Homologene WHERE GeneId=%s""" % thisTrait.geneid
+							self.cursor.execute(query)
+							result = self.cursor.fetchone()
+
+							if not result:
+	                                                        query = """INSERT into Homologene (HomologeneId, GeneId, TaxonomyId) VALUES (%s, %s, %s)""" % (new_homologeneid, thisTrait.geneid, taxonomyId)
+        	                                                self.cursor.execute(query)
+							else:
+								query = """UPDATE Homologene SET HomologeneId=%s WHERE GeneId=%s""" % (new_homologeneid, thisTrait.geneid)
+								self.cursor.execute(query)
+
+
+                                #XZ: It's critical to get lasted info first, then update gene level info across traits by geneid.
+				#XZ: Need to build index on GeneId. Otherwise, it's too slow.
+                                if thisTrait.db.type == 'ProbeSet':
+                                        thisTrait = webqtlTrait(fullname=self.formdata.getvalue('fullname'), cursor=self.cursor)
+                                        thisTrait.retrieveInfo()
+
+					if thisTrait.geneid:
+						if 'symbol' in modifyField:
+							if thisTrait.symbol:
+								query = """UPDATE ProbeSet SET Symbol='%s' WHERE GeneId=%s""" % (thisTrait.symbol, thisTrait.geneid)
+							else:
+                        	                                query = """UPDATE ProbeSet SET Symbol=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'alias' in modifyField:
+							if thisTrait.alias:
+								query = """UPDATE ProbeSet SET alias='%s' WHERE GeneId=%s""" % (thisTrait.alias, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET alias=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'description' in modifyField:
+							if thisTrait.description: #XZ: Attention, we must use "%s" instead of '%s'. Otherwise, to insert 3'UTR will generate error.
+								query = """UPDATE ProbeSet SET description="%s" WHERE GeneId=%s""" % (thisTrait.description, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET description=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'strand_gene' in modifyField:
+							if thisTrait.strand_gene:
+								query = """UPDATE ProbeSet SET Strand_Gene='%s' WHERE GeneId=%s""" % (thisTrait.strand_gene, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET Strand_Gene=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'unigeneid' in modifyField:
+							if thisTrait.unigeneid:
+								query = """UPDATE ProbeSet SET UniGeneId='%s' WHERE GeneId=%s""" % (thisTrait.unigeneid, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET UniGeneId=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'refseq_transcriptid' in modifyField:
+							if thisTrait.refseq_transcriptid:
+								query = """UPDATE ProbeSet SET RefSeq_TranscriptId='%s' WHERE GeneId=%s""" % (thisTrait.refseq_transcriptid, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET RefSeq_TranscriptId=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'genbankid' in modifyField:
+							if thisTrait.genbankid:
+								query = """UPDATE ProbeSet SET GenbankId='%s' WHERE GeneId=%s""" % (thisTrait.genbankid, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET GenbankId=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+						if 'omim' in modifyField:
+							if thisTrait.omim:
+								query = """UPDATE ProbeSet SET OMIM='%s' WHERE GeneId=%s""" % (thisTrait.omim, thisTrait.geneid)
+							else:
+								query = """UPDATE ProbeSet SET OMIM=NULL WHERE GeneId=%s""" % (thisTrait.geneid)
+							self.cursor.execute(query)
+
+
+		###Modify Trait Data
+		if thisTrait.db.type == 'Publish' and dataID > 0 and fd.formdata.getvalue("modifiedDataField"):
+			StrainIds = []
+			for item in fd.strainlist:
+				self.cursor.execute('SelecT Id from Strain where Name = "%s"' % item)
+				StrainId = self.cursor.fetchone()
+				if not StrainId:
+					raise ValueError
+				else:
+					StrainIds.append(StrainId[0])
+			comments.append('Trait Value')
+			#XZ, 03/05/2009: Xiaodong changed Data to PublishData, SE to PublishSE
+			self.cursor.execute('delete from PublishData where Id = %d' % dataID)
+			self.cursor.execute('delete from PublishSE where DataId = %d' % dataID)
+			self.cursor.execute('delete from NStrain where DataId = %d' % dataID)
+				
+			for i, strain in enumerate(fd.strainlist):
+				sId = StrainIds[i]
+				if fd.allTraitData.has_key(strain):
+					tdata = fd.allTraitData[strain]
+					_val, _var, _N = tdata.val, tdata.var, tdata.N
+					if _val != None:
+						#XZ, 03/05/2009: Xiaodong changed Data to PublishData, SE to PublishSE
+						self.cursor.execute('insert into PublishData values(%d, %d, %s)' % (dataID, sId, _val))
+					if _var != None:
+						self.cursor.execute('insert into PublishSE values(%d, %d, %s)' % (dataID, sId, _var))
+					if _N != None:
+						self.cursor.execute('insert into NStrain values(%d, %d, %s)' % (dataID, sId, _N))
+				else:
+					pass
+			#end for
+		else:
+			pass
+		TD_LR = HT.TD(valign="top", bgcolor="#eeeeee",height=200,width="100%")
+		main_title = HT.Paragraph(" Record Updating Result", Class="title")
+
+		TD_LR.append(main_title,HT.Blockquote('Successfully updated record %s in database ' % thisTrait.name, thisTrait.db.genHTML(), '.'))
+		if thisTrait.db.type == 'Publish':
+			comments = "%s modified %s at %s\n" % (self.userName, string.join(comments, ', '), ctime)
+			self.cursor.execute("Update PublishXRef set comments = CONCAT(comments,'%s') where InbredSetId=%d and PhenotypeId=%d and PublicationId=%d and Sequence=%d" % (comments,  PInbredSetId, PhenotypeId, PublicationId, Sequence))
+			
+		if 0:
+			heading = "Record Updating Result"
+			detail = ["Can't update database. The server may be down at this time or you don't have the permission"]
+			self.error(heading=heading,detail=detail,error="Error")
+			return
+		self.dict['body'] = str(TD_LR)
+