File:  [Repository] / MPIWGWeb / MPIWGStaff.py
Revision 1.10.2.21: download - view: text, annotated - select for diffs - revision graph
Thu Dec 22 20:33:45 2005 UTC (18 years, 5 months ago) by dwinter
Branches: r2
bug fixed if already existing user get another dataset

    1: """This file contains the classes for the organization of the staff"""
    2: # TODO: pruefe ob die id der einzelnen tabellen, wie id in publications noch benutzt werden
    3: # TODO: pruefe ob die bibliographischen felder in publications noch benutzt werden
    4: # TODO: wird username gebraucht?
    5: 
    6: from OFS.Folder import Folder
    7: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
    8: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    9: from Products.PageTemplates.PageTemplate import PageTemplate
   10: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
   11: import os
   12: import bibliography
   13: from Globals import package_home
   14: from Products.PythonScripts.standard import sql_quote
   15: from types import *
   16: from AccessControl import ClassSecurityInfo
   17: 
   18: import zLOG
   19: 
   20: departmentList="Renn\nRheinberger\nDaston\nKlein\nSibum\nIT\nInstitut\nBibliothek"
   21: 
   22: 
   23: def getTemplate(self, tpName):
   24:     """get a template file either form the instance or from the product"""
   25:     ext=self.ZopeFind(self.aq_parent,obj_ids=[tpName])
   26:     if ext:
   27:         pt = getattr(self,ext[0][1].getId())
   28:     else:
   29:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/'+tpName)).__of__(self)
   30:     assert(pt)
   31:     return pt
   32: 
   33: class MPIWGStaff(CatalogAware,ZSQLExtendFolder):
   34:     """Staff"""
   35: 
   36:     meta_type="MPIWGStaff"
   37:     default_catalog='MembersCatalog'
   38:     departmentList=departmentList
   39:     security=ClassSecurityInfo()
   40:     
   41:     def getConnectionObj(self):#ueberschreibe connection id methode    
   42:          
   43:             return getattr(self.de,self.de.connection_id)
   44:         
   45:     def isPublished(self):
   46:         """gib publications status aus der datenbank aus"""
   47:         username=self.getId()
   48:         query="select count(publish_the_data) from personal_www where username='%s' and publish_the_data='yes'"%username
   49:         
   50:         res = self.ZSQLQuery(query)
   51:         
   52:         if res and res[0].count>0:
   53:             return True
   54:         else:
   55:             return False
   56:         
   57:     def createNewDBEntry(self,publish_the_data,id,name,vorname,username,title,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by="",e_mail2="",txt="",txt_p="no",stay_at_mpiwg=""):
   58:         """lege person in der datenbank an"""
   59:         msg=""
   60:         #test ob id schon existiert
   61:         if self.ZSQLQuery("select id from personal_www where id='%s'"%id):
   62:             return False,"ERROR:id %s already exists"%id
   63:         
   64:         if self.ZSQLQuery("select username from personal_www where username='%s' and publish_the_data='yes'"%username):
   65:             
   66:             return False,"ERROR:username %s already exists and has data published, id=%s not added (running update again might solve this problem)"%(username,id)
   67:         
   68:         if self.ZSQLQuery("select username from personal_www where username='%s' and not publish_the_data='yes'"%username):
   69:             msg="WARNING:username %s not unique but id=%s added"%(username,id)
   70:         #eintragen
   71:         columnlist="publish_the_data,id,name,vorname,username,title,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by,e_mail2,stay_at_mpiwg"
   72:         insertTuple=(publish_the_data,id,name,vorname,username,title,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by,e_mail2,stay_at_mpiwg)
   73:         
   74:         insert=[]
   75:         for element in insertTuple:
   76:             insert.append("'%s'"%element)
   77:         
   78:         insertStr=",".join(insert)
   79:         queryStr="INSERT INTO personal_www (%s) VALUES (%s)"%(columnlist,insertStr)
   80:         self.ZSQLQuery("SET DATESTYLE TO 'German'")
   81:         self.ZSQLQuery(queryStr)
   82: 
   83:         #currentwork
   84:         if not (txt==""):
   85:             queryStr="INSERT INTO current_work (id_main,current,publish) VALUES ('%s','%s','%s')"%(id,txt,txt_p)
   86: 
   87:             self.ZSQLQuery(queryStr)
   88:         
   89:         return True,msg
   90:     
   91:     def updateDBEntry(self,publish_the_data,date_from,date_to,DBid=None,stay_at_mpiwg="",position=""): 
   92:         """zpddatedb"""
   93:         if not DBid:
   94:             DBid=self.getDBId()
   95:          
   96:         self.ZSQLQuery("SET DATESTYLE TO 'German'")
   97: 
   98: 	test=self.ZSQLQuery("select id from personal_www where id='%s' "%DBid)
   99: 
  100: 	
  101: 	if test and (len(test)>0): #dataset exists
  102: 	        self.ZSQLChange(_table="personal_www",_identify="id=%s"%DBid,publish_the_data=publish_the_data,
  103:                                    date_from=date_from,
  104:                                    date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position)
  105: 		return True
  106:         else:
  107: 	       return False
  108:           
  109:     def getPublicationSelectionMode(self):
  110:         """get publication selection mode, default 'priority'"""
  111:         return getattr(self,'publicationSelectionMode','priority')
  112:         
  113:     def changePublicationSelectionMode(self,publicationSelectionMode,RESPONSE=None):
  114:         """change PublicationSelectionMode"""
  115:         
  116:         self.publicationSelectionMode=publicationSelectionMode
  117:         
  118:         if RESPONSE:
  119:             RESPONSE.redirect("editPublications")
  120:             
  121:             
  122:     def getPublishImage(self):
  123:         """publish the image??, default no"""
  124:         return getattr(self,'publishImage','no')
  125:     
  126:     def updateImage(self,file,publishImage,rename=None,RESPONSE=None):
  127:         """update image"""
  128: 
  129:         if file and not(file.filename==""):
  130:             if self.getImageObj():
  131:                      self.getImageObj().updateImage(file,rename=None,RESPONSE=None)
  132:             else:
  133:                      self.getImageFolder().addImage2(file,fileName=self.getId())
  134:             
  135:         self.publishImage=publishImage
  136:         
  137:         if RESPONSE:
  138:             RESPONSE.redirect("edit")
  139:             
  140:     def getImageFolder(self):
  141:         """getImageFolder"""
  142:         #TODO: make place of staff image folder configurable
  143:         
  144:         try:
  145:             return self.getPhysicalRoot().www_neu.images.staff_images
  146:         except: 
  147:             zLOG.LOG("MPWIG STAFF", zLOG.ERROR, "image folder not found:"," has to be add /www_neu/staff_images") 
  148:             return None
  149:         
  150:     def getImageObj(self):
  151:         """getImage"""
  152:         imageFolder=self.getImageFolder()
  153:         
  154:         if not imageFolder: return None
  155:         
  156:         image=getattr(imageFolder,self.getId(),None)
  157: 
  158:         if not image:
  159:             for suffix in ['jpg','tif']:
  160:                 
  161:                 image=getattr(imageFolder,self.getId()+"."+suffix,None)
  162:                 if image:
  163:                     break
  164:         return image
  165:             
  166:     def getImageUrl(self):
  167:         """getImageUrl"""
  168:         image=self.getImageObj()
  169:         if not image:
  170:             return None
  171:         else:
  172:             return self.getImageObj().absolute_url()+"/image"
  173:     
  174:     def PrincipiaSearchSource(self):
  175:         """Return cataloguable key for ourselves."""
  176:         return str(self)
  177: 
  178:     manage_options = Folder.manage_options+(
  179:         {'label':'Edit','action':'changeMPIWGStaffForm'},
  180:         {'label':'Change Publications Special','action':'changePublications_specialForm'},
  181:         )
  182:     
  183:     def __init__(self,id, lastName,firstName):
  184:         """init"""
  185:         self.id=id
  186:         self.title="%s, %s"%(lastName,firstName)
  187:         self.lastName=lastName
  188:         self.firstName=firstName
  189: 
  190: 
  191:     def index_html(self):
  192:         """show homepage"""
  193:         pt = getTemplate(self, "members_main")
  194:         return pt()
  195: 
  196:     def changePublications_specialForm(self):
  197:         """Priority publications manual field"""
  198:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changePublications_special.zpt')).__of__(self)
  199:         return pt()
  200:         
  201:     def changePublications_special(self,usePublicationsSpecial=None,specialPublicationsField=None,RESPONSE=None):
  202:         """change publications special params"""
  203:         if usePublicationsSpecial:
  204:           self.usePublicationsSpecial=True
  205:          
  206:         else:
  207:           self.usePublicationsSpecial=False
  208: 
  209:         self.specialPublicationsField=specialPublicationsField[0:]
  210: 
  211:         if RESPONSE is not None:
  212:             RESPONSE.redirect('manage_main')
  213: 
  214:         
  215:     def publications_full(self):
  216:         """show publication"""
  217:         pt=getTemplate(self, "publications_full_main")
  218:         return pt()
  219: 
  220:     def talks_full(self):
  221:         """show talks"""
  222:         pt=getTemplate(self, 'talks_full_main')
  223:         return pt()
  224: 
  225:     def teaching_full(self):
  226:         """show talks"""
  227:         pt=getTemplate(self, 'teaching_full_main')
  228:         return pt()
  229:     
  230:     def changeMPIWGStaffForm(self):
  231:         """change form"""
  232:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGStaff.zpt')).__of__(self)
  233:         return pt()
  234:     
  235:     security.declareProtected('View management screens','changeMPIWGStaff')
  236:     def changeMPIWGStaff(self,lastName,firstName,RESPONSE=None):
  237:         """change it"""
  238:         self.title="%s, %s"%(lastName,firstName)
  239:         self.lastName=lastName
  240:         self.firstName=firstName
  241: 
  242:         if RESPONSE is not None:
  243:             RESPONSE.redirect('manage_main')
  244:             
  245:     security.declareProtected('View management screens','edit')
  246:     def edit(self):
  247:         """Edit the pages"""
  248:     #TODO: zusammenspiel mit apache, redirect auf 18080 rausnehmen bzw. zumindest verallgemeinern
  249:         if self.REQUEST['SERVER_URL']=="http://www.mpiwg-berlin.mpg.de":
  250:                 redURL="http://xserve04.mpiwg-berlin.mpg.de:18080/www_neu/de/mitarbeiter/members/%s/edit"%self.getId()
  251:         
  252:                 self.REQUEST.RESPONSE.redirect(redURL)
  253: 
  254:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMPIWGStaff.zpt')).__of__(self)
  255:         return pt()
  256: 
  257:     mainEditFile=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMPIWGStaff_main.zpt'))
  258: 
  259:     def getPathStyle(self, path, selected, style=""):
  260:         """returns a string with the given style + 'sel' if path == selected."""
  261: 
  262:         if path == selected:
  263:             return style + 'sel'
  264:         else:
  265:             return style    
  266: 
  267:     security.declareProtected('View management screens','changeResearch')
  268:     def changeResearch(self,noredirect=None):
  269:         """change the research entries"""
  270:         newEntries={}
  271:         id_main=self.REQUEST.form['id_main']
  272: 
  273:         mainfieldL=self.REQUEST.form['main_fields'].split(",")
  274:         mainfield={}
  275:         for x in mainfieldL:
  276:             tmp=x.split('__')
  277:             mainfield[tmp[0]]=tmp[1]
  278:         for field in self.REQUEST.form.keys():
  279:             splittedField=field.split("__")
  280:             if len(splittedField)<3:
  281:                 pass #kein datenbank eintrag
  282: 
  283:             elif splittedField[2]=='new': # store new entries
  284:                 if not newEntries.has_key(splittedField[0]):
  285:                     newEntries[splittedField[0]]={}
  286:                     
  287:                 newEntries[splittedField[0]][splittedField[1]]=self.REQUEST.form[field]
  288: 
  289:             else:
  290:                 query="UPDATE %s "%splittedField[0]
  291:                 query+="SET %s = '%s' "%(splittedField[1],sql_quote(self.REQUEST.form[field]))
  292:                 query+="WHERE oid = '%s' "%sql_quote(splittedField[2])
  293:                 
  294:                 self.ZSQLQuery(query)
  295: 
  296: 
  297:         #new entries
  298:         for newEntry in newEntries.keys():
  299:             query="INSERT INTO %s "%newEntry
  300:             keys=['id_main']
  301:             values=["'"+id_main+"'"]
  302:             for key in newEntries[newEntry].keys():
  303:                 keys.append(key)
  304:                 values.append("'"+newEntries[newEntry][key]+"'")
  305: 
  306: 
  307:             keystring=",".join(keys)
  308:                 
  309:             valuestring=",".join(values)
  310:                 
  311:             query+=" (%s) "%keystring
  312:             query+="VALUES (%s)"%valuestring
  313:             if not (newEntries[newEntry][mainfield[newEntry]].lstrip().rstrip()==""):
  314:                 self.ZSQLQuery(query)
  315: 
  316:         if not noredirect:
  317:             self.REQUEST.RESPONSE.redirect(self.REQUEST['HTTP_REFERER'])
  318:             
  319:     security.declareProtected('View management screens','editCV')    
  320:     def editCV(self,cv=None,oid=None,RESPONSE=None):
  321:          """edit Cv"""
  322: 
  323:          if (not oid):
  324:              pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editCV.zpt')).__of__(self)
  325:              return pt()
  326:         
  327:          query="UPDATE personal_www SET cv =%s WHERE oid='%s'"
  328:          
  329:          self.ZSQLQuery(query%(self.ZSQLQuote(cv),oid))
  330:         
  331:          if RESPONSE:
  332:             RESPONSE.redirect("editCV")
  333: 
  334:     security.declareProtected('View management screens','editAwards')    
  335:     def editAwards(self,awards=None,oid=None,RESPONSE=None):
  336:          """edit a awards"""
  337:      
  338:          if (not oid):
  339:              pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editAwards.zpt')).__of__(self)
  340:              return pt()
  341:         
  342:          query="UPDATE personal_www SET awards =%s WHERE oid='%s'"
  343:       
  344:          self.ZSQLQuery(query%(self.ZSQLQuote(awards),oid))
  345:         
  346:          if RESPONSE:
  347:             RESPONSE.redirect("editAwards")
  348: 
  349:     security.declareProtected('View management screens','editTalks')    
  350:     def editTalks(self):
  351:         """edit talks"""
  352: 
  353:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editTalks.zpt')).__of__(self)
  354:         return pt()
  355:         
  356:     security.declareProtected('View management screens','editTeaching')    
  357:     def editTeaching(self):
  358:         """edit Teaching"""
  359: 
  360:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editTeaching.zpt')).__of__(self)
  361:         return pt()
  362:         
  363:     def getDocTypes(self):
  364:         finds = self.ZopeFind(self.metadata.main.meta.bib,obj_metatypes=["OSAS_MetadataMapping__neu"])
  365: 
  366:         list= [x[0] for x in finds]
  367:         return "\n".join(list)
  368: 
  369:     security.declareProtected('View management screens','editMainData')    
  370:     def editMainData(self,REQUEST=None,RESPONSE=None,name=None,**argv):
  371:         """edit main data"""
  372:         
  373:     
  374:         if not name:
  375:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMainData.zpt')).__of__(self)
  376:             return pt() 
  377:         else:
  378:             
  379:             self.ZSQLChange(argv,_table="personal_www",_identify="id=%s"%self.getDBId(),USE_FORM="yes")
  380:             if RESPONSE:
  381:                 RESPONSE.redirect("editMainData")
  382:                 
  383:     security.declareProtected('View management screens','newBibliogrpaphy')    
  384:     def newBibliography(self,_docType=None, _addEntry=None,RESPONSE=None,**argv):
  385:         
  386:         """add an entry to the bibliography"""
  387:         if not _docType: #kein docType
  388:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','newBibliographyEntryDocType.zpt')).__of__(self)
  389:             return pt() 
  390:         elif _docType and not _addEntry: #doctype aber keine daten
  391:             self.REQUEST['_docType']=_docType
  392:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','newBibliographyEntry.zpt')).__of__(self)
  393:             return pt() 
  394:         else: #doctype und daten
  395:             try:
  396:                 newId=self.ZSQLSimpleSearch("select nextval('id_raw')")[0].nextval
  397:             except:#id_raw existiert nich, dann neu erzeugen
  398:                 
  399:                 self.createOrUpdateId_raw()
  400:                 newId=self.ZSQLSimpleSearch("select nextval('id_raw')")[0].nextval
  401:                                 
  402:             bookId="b%06i" % newId
  403:             
  404:             self.ZSQLAdd(argv,_table="bibliography",reference_type=_docType,id=bookId)
  405:             self.ZSQLAdd(_table="publications",id_gen_bib=bookId,id_main=self.getDBId(),publish='yes')
  406:             self.updatePublicationDB(personId=self.getDBId())
  407:             
  408:         
  409:         if RESPONSE:
  410:             RESPONSE.redirect("editPublications")
  411:             
  412:         return True
  413:     
  414:     security.declareProtected('View management screens','editImage')    
  415:     def editImage(self):
  416:         """edit images"""
  417:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editImageStaff.zpt')).__of__(self)
  418:         return pt()
  419:     
  420:     security.declareProtected('View management screens','editBibliography')    
  421:     def editBibliography(self):
  422:         """edit the bibliography"""
  423:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editBibliographyEntry.zpt')).__of__(self)
  424:         return pt()
  425:     
  426:       
  427:     security.declareProtected('View management screens','editPublications')    
  428:     def editPublications(self):
  429:         """edit the bibliographie"""
  430: 
  431:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editPublications.zpt')).__of__(self)
  432:         return pt()
  433:     
  434:     def changeSortingMode(self,sortingMode,RESPONSE=None,REQUEST=None):
  435:         """change sorting mode"""
  436:         self.sortingMode=sortingMode
  437:         
  438:         if RESPONSE and REQUEST:
  439:             REQUEST.RESPONSE.redirect(REQUEST['HTTP_REFERER'])
  440: 
  441:         return True
  442: 
  443:     def getSortingMode(self):
  444:         """get sorting mode"""
  445:         return getattr(self,'sortingMode','priority')
  446:     
  447:     def integer(self,value):
  448:         try:
  449:             return int(value)
  450:         except:
  451:             return 0
  452:         
  453:     security.declareProtected('View management screens','changePublications')    
  454:     def changePublications(self):
  455:         """change the publication list"""
  456:         self.changeResearch(noredirect=True)
  457:         
  458:         #self.updatePublicationDB(personId=self.getDBId())
  459:         self.REQUEST.RESPONSE.redirect(self.REQUEST['HTTP_REFERER'])
  460:         
  461: 
  462:     security.declareProtected('View management screens','addPublications')    
  463:     def addPublications(self,submit=None,REQUEST=None,noredirect=None):
  464:         """add publications"""
  465: 
  466:         #setzte flag ob aufruf aus suchformular
  467:         
  468:         if REQUEST.get("QUERY_STRING",None) and (not submit):
  469:             self.REQUEST.set('fromSearch','1')
  470:         else:
  471:             self.REQUEST.set('fromSearch','0')
  472:              
  473:         if not submit or (not (submit == "add")):
  474:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addPublications.zpt')).__of__(self)
  475:             return pt()
  476:         
  477:         #new entries
  478:         entries = REQUEST.form.get('addEntries',None)
  479:         if not (type(entries) is ListType):
  480:             entries=[entries]
  481:             
  482:         for bibId in entries: 
  483:             query="INSERT INTO %s " % "publications"
  484:             query+="(id_main,id_institutsbibliographie,publish) "
  485:             query+="VALUES ('%s','%s','yes')" %(sql_quote(self.getDBId()),sql_quote(bibId))
  486:             
  487:             #self.ZSQLAdd(_table="publications",id_institutsbibliographie=bibId,id_main=self.getDBId(),publish='yes')
  488:             self.ZSQLQuery(query)
  489:      
  490:         self.updatePublicationDB(personId=self.getDBId())
  491:         
  492:         if not noredirect:
  493:             
  494:             self.REQUEST.RESPONSE.redirect("./editPublications")
  495:             
  496:             return True
  497:         
  498:     
  499:     def getDBId(self):
  500:         """get id from the personal database"""
  501:         search=self.ZSQLInlineSearch(_table='personal_www',username=self.getId(),publish_the_data='yes')
  502:         if search:#name existiert und published, dann nimm diesen falls es mehrereeventuell nich publizierte datensaetze gibt.
  503:             return search[0].id
  504:         else:#nicht publiziert dann nimm einen davon
  505:             search2=self.ZSQLInlineSearch(_table='personal_www',username=self.getId())
  506:             if search2:
  507:                 return search2[0].id
  508:             else:
  509:                 return None
  510:         
  511:     
  512:     
  513:     formatBiblHelp=bibliography.formatBiblHelp
  514:     
  515:     def sortBibliography(self,list,sortingMode=None):
  516:         if not sortingMode:
  517:             sortingMode=self.getSortingMode()
  518:     
  519:         if sortingMode == "year":
  520:             return self.sortYear(list)
  521:         else:
  522:             return self.sortPriority(list)
  523:         
  524:     def sortPriority(self,list):
  525:         def sort(x,y):
  526:             try:
  527:                 xInt=int(x.priority)
  528:             except:
  529:                 xInt=0
  530:             try:
  531:                 yInt=int(y.priority)
  532:             except:
  533:                 yInt=0
  534: 
  535:             return cmp(xInt,yInt)
  536: 
  537:         tmp=[x for x in list]
  538:         tmp.sort(sort)           
  539:         return tmp
  540: 
  541:     def sortYear(self,list):
  542:         #TODO: sort TO APPEAR and TO BE PUBLISHED etc...
  543:         
  544:         def sort(x,y):
  545:             try:
  546:                 xInt=int(x.year)
  547:             except:
  548:                 xInt=0
  549:             try:
  550:                 yInt=int(y.year)
  551:             except:
  552:                 yInt=0
  553: 
  554:             return cmp(yInt,xInt)
  555:             
  556:             
  557:         tmp=[x for x in list]
  558:         
  559:         tmp.sort(sort)           
  560:         return tmp
  561:     
  562:     def deleteField(self,table,oid):
  563:         """delete entry"""
  564:         query="DELETE FROM %s WHERE oid = '%s'"%(table,oid)
  565: 
  566:         self.ZSQLQuery(query)
  567:         self.REQUEST.RESPONSE.redirect(self.REQUEST['HTTP_REFERER'])
  568:         
  569:     
  570: def manage_addMPIWGStaffForm(self):
  571:     """form for adding the project"""
  572:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGStaffForm.zpt')).__of__(self)
  573:     return pt()
  574: 
  575: def manage_addMPIWGStaff(self,id,lastName,firstName,RESPONSE=None):
  576:     """add it"""
  577:     newObj=MPIWGStaff(id,lastName,firstName)
  578: 
  579:     self._setObject(id,newObj)
  580: 
  581: 
  582:     if RESPONSE is not None:
  583:         RESPONSE.redirect('manage_main')
  584: 
  585:     

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>