aboutsummaryrefslogtreecommitdiff
path: root/web/webqtl/updateTrait/DataUpdatePage.py
diff options
context:
space:
mode:
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)
+