File:  [Repository] / MPIWGWeb / MPIWGStaff.py
Revision 1.10.2.16: download - view: text, annotated - select for diffs - revision graph
Fri Nov 11 15:02:27 2005 UTC (18 years, 7 months ago) by dwinter
Branches: r2
minor

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

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