comparison MPIWGStaff.py @ 0:bca61e893fcc

first checkin of MPIWGWeb r2 branch from CVS into mercurial
author casties
date Thu, 10 Jan 2013 17:52:13 +0100
parents
children ddf6c1a27a4b
comparison
equal deleted inserted replaced
-1:000000000000 0:bca61e893fcc
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.PageTemplates.ZopePageTemplate import ZopePageTemplate
11 from Products.ZCatalog.CatalogPathAwareness import CatalogAware
12 from Products.versionedFile.extVersionedFile import extVersionedFileFolder
13 from AccessControl import getSecurityManager
14
15 import os
16 import logging
17 import bibliography
18 import email
19 from Globals import package_home
20 from Products.PythonScripts.standard import sql_quote
21 from types import *
22 from AccessControl import ClassSecurityInfo
23 import time
24 import logging
25 import email
26 import re
27 from OFS.Cache import Cacheable
28 import urllib2
29 import transaction
30 import SrvTxtUtils
31
32 from MPIWGHelper import *
33 #ersetzt logging
34 def logger(txt,method,txt2):
35 """logging"""
36 logging.info(txt+ txt2)
37
38 departmentList="Renn\nRheinberger\nDaston\nKlein\nSibum\nIT\nInstitut\nBibliothek"
39 coneService="http://127.0.0.1:8280/MetaDataManagerRestlet/cone/" # kann in MPIWGRoot konfiguriert werden.
40
41
42
43 def createNewDBEntry(self,publish_the_data,key,name,vorname,titles_new,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by="",e_mail2="",txt="",txt_p="no",stay_at_mpiwg="",group="",web_object_created="no",current_work=""):
44 """lege person in der datenbank an"""
45
46 if date_to=="": # wenn date_to leer
47 date_to="date_none"
48
49 if date_from=="": # wenn date_fromleer
50 date_from="date_none"
51 msg=""
52 #test ob id schon existiert
53 if self.ZSQLQuery("select key from personal_www where key='%s'"%id):
54 return False,"ERROR:key%s already exists"%key
55
56 #eintragen
57 columnlist="""publish_the_data,key,last_name,first_name,titles_new,status,e_mail,e_mail_p,date_from,date_to,department,home_inst,funded_by,e_mail2,date_stay_at_mpiwg,web_object_created,"group",current_work,current_work_p """
58 insertTuple=(publish_the_data,key,name,vorname,titles_new,position,e_mail,e_mail_p,date_from,date_to,abteilung,heimat_inst,funded_by,e_mail2,stay_at_mpiwg,web_object_created,group,current_work,"yes")
59
60 insert=[]
61 for element in insertTuple:
62 if element=="date_none": # date_none eintrag wird zu null uebersetzt
63 insert.append('null')
64 else:
65 insert.append("%s"%self.ZSQLQuote(element))
66
67 insertStr=",".join(insert)
68 queryStr="INSERT INTO personal_www (%s) VALUES (%s)"%(columnlist,insertStr)
69 self.ZSQLQuery("SET DATESTYLE TO 'German'")
70 self.ZSQLQuery(queryStr)
71 logging.info("QQQQ %s:"%queryStr)
72 #currentwork
73 #if not (current_work==""):
74 # queryStr="INSERT INTO current_work (key_main,current,publish) VALUES ('%s',%s,'%s')"%(key,self.ZSQLQuote(current_work),"yes")
75
76 # self.ZSQLQuery(queryStr)
77
78 return True,msg
79 class MPIWGStaff(CatalogAware,ZSQLExtendFolder,Cacheable):
80 """Staff"""
81
82 meta_type="MPIWGStaff"
83 default_catalog='MembersCatalog'
84 departmentList=departmentList
85 #_v_cone=None;
86 security=ClassSecurityInfo()
87
88 def redirect(self,RESPONSE,url):
89 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
90
91 timeStamp=time.time()
92
93 if url.find("?")>-1: #giebt es schon parameter
94 addStr="&time=%s"
95 else:
96 addStr="?time=%s"
97
98 RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT')
99 logging.error(email.Utils.formatdate()+' GMT')
100 RESPONSE.redirect(url+addStr%timeStamp)
101
102 def getKeyUTF8(self):
103 """get db_key utf8"""
104 logging.debug("KEY - MPIWGStaff 1:"+self.getKey())
105 logging.debug("KEY - MPIWGStaff 2 :"+utf8ify(self.getKey()))
106
107 return utf8ify(self.getKey())
108
109 def setKey(self,key):
110 """set key"""
111 self.key=key
112
113 def rmKey(self):
114 """rm"""
115 self.key=None
116 return ""
117
118 def getKey(self):
119 """get database key"""
120
121
122 if getattr(self,'key',None):
123 logging.debug("KEY - MPIWGStaff 4:"+self.key)
124 #logging.error("SAVED KEY:%s"%self.key)
125 return unicodify(self.key.lower())
126 #return self.key.lower()
127
128 #fuer alt faelle ohne key
129 #logging.error("NEW KEY:%s"%(self.firstName+'_'+self.lastName).lower().replace(' ',''))
130 return (self.firstName+'_'+self.lastName).lower().replace(' ','')
131
132 def getConnectionObj(self):
133 """returns connection id (from root)"""
134 try:
135 root = self.getMPIWGRoot()
136 return root.getConnectionObj()
137 except:
138 return self.en.getConnectionObj()
139
140 def isPublished(self):
141 """gib publications status aus der datenbank aus"""
142 key=self.getKey()
143 query="select count(publish_the_data) from personal_www where lower(key)='%s' and publish_the_data='yes'"%key
144
145 res = self.ZSQLQuery(query)
146
147 if res and res[0].count>0:
148 return True
149 else:
150 return False
151
152
153
154 def updateDBEntry(self,publish_the_data,date_from,date_to,DBid=None,stay_at_mpiwg="",position="",abteilung=""):
155 """zpddatedb"""
156 if not DBid:
157 DBid=self.getDBId()
158
159
160 self.ZSQLQuery("SET DATESTYLE TO 'German'")
161
162 test=self.ZSQLQuery("select id from personal_www where id='%s' "%DBid)
163
164
165 if test and (len(test)>0): #dataset exists
166 logger("MPIWG Web",logging.INFO,'UPDATE: _table="personal_www",_identify="id=%s"'%DBid+',publish_the_data=%s'%publish_the_data+',date_from=%s'%date_from+',date_to=%s'%date_to+',stay_at_mpiwg=%s'%stay_at_mpiwg+',position=%s'%position)
167 self.ZSQLChange(_table="personal_www",_identify="id=%s"%DBid,publish_the_data=publish_the_data,
168 date_from=date_from,
169 date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position,abteilung=abteilung)
170 return True
171 else:
172 return False
173
174 def getPublicationSelectionMode(self):
175 """get publication selection mode, default 'priority'"""
176 return getattr(self,'publicationSelectionMode','priority')
177
178 def changePublicationSelectionMode(self,publicationSelectionMode,RESPONSE=None):
179 """change PublicationSelectionMode"""
180
181 self.publicationSelectionMode=publicationSelectionMode
182 self.ZCacheable_invalidate()
183 if RESPONSE:
184 self.redirect(RESPONSE,"editPublications")
185
186
187 def downloadCV(self,RESPONSE):
188 """download cv file"""
189 ob=self._getOb("downloadableFiles")._getOb("cv.pdf")
190
191 RESPONSE.redirect(ob.absolute_url()+"/download")
192
193 def getLastUpdateCV(self):
194 """getDate of Last Update"""
195 try:
196 ob=self._getOb("downloadableFiles")._getOb("cv.pdf")
197 return ob.getLastChangeDate()
198 except:
199 return "No file yet!"
200 def getLastUpdatePublications(self):
201 """getDate of Last Update"""
202 try:
203 ob=self._getOb("downloadableFiles")._getOb("publications.pdf")
204 return ob.getLastChangeDate()
205 except:
206 return "No file yet!"
207 def downloadPublications(self,RESPONSE):
208 """download publications"""
209 ob=self._getOb("downloadableFiles")._getOb("publications.pdf")
210
211 RESPONSE.redirect(ob.absolute_url()+"/download")
212
213 def changeDownloads(self,cv_pdf=None,cv_publish=None,publications_pdf=None,publications_publish=None,RESPONSE=None):
214 """"change the downloadable files"""
215 self.ZCacheable_invalidate()
216 if not hasattr(self,'downloadableFiles'):
217
218 extFolder = extVersionedFileFolder()
219 extFolder.id = "downloadableFiles"
220 self._setObject(extFolder.id,extFolder)
221
222 ob = self._getOb("downloadableFiles")
223
224 if cv_publish:
225 self.cv_publish=cv_publish
226
227 if publications_publish:
228 self.publications_publish=publications_publish
229
230 if cv_pdf:
231 if not hasattr(ob,"cv.pdf"):
232 ob.addFile("",cv_pdf,newName="cv.pdf")
233
234 else:
235 cvFile = getattr(ob,"cv.pdf")
236 cvFile.addContentObject("","",file=cv_pdf)
237
238 if publications_pdf:
239 if not hasattr(ob,"publications.pdf"):
240 ob.addFile("",cv_pdf,newName="publications.pdf")
241
242 else:
243 cvFile = getattr(ob,"publications.pdf")
244 cvFile.addContentObject("","",file=publications_pdf)
245
246 if RESPONSE:
247 self.redirect(RESPONSE,self.REQUEST['HTTP_REFERER'])
248
249
250 def getPublishImage(self):
251 """publish the image??, default no"""
252 return getattr(self,'publishImage','no')
253
254 def updateImage(self,publishImage,file=None,rename=None,RESPONSE=None):
255 """update image"""
256
257 if file and not(file.filename==""):
258 if self.getImageObj():
259 self.getImageObj().updateImage(file,_rename=None,RESPONSE=None)
260 else:
261 # create new image object
262 xp = file.filename.rfind('.')
263 if xp > 0:
264 ext = file.filename[xp:]
265 #fn = self.getId()+ext
266 fn = self.getId()
267 logger("MPWIG STAFF", logging.INFO, "new filename: %s"%fn)
268 self.getImageFolder().addImage2(file,fileName=fn)
269 else:
270 logger("MPWIG STAFF", logging.ERROR, "uploaded filename %s has no extension!"%file.filename)
271
272 self.publishImage=publishImage
273
274 if RESPONSE:
275 self.redirect(RESPONSE,"edit")
276
277 def getImageFolder(self):
278 """getImageFolder"""
279 #TODO: make place of staff image folder configurable
280
281 try:
282 return self.getPhysicalRoot().www_neu.images.staff_images
283 except:
284 logger("MPWIG STAFF", logging.ERROR, "image folder not found: has to be add /www_neu/staff_images")
285 return None
286
287 def getImageObj(self):
288 """getImage"""
289 imageFolder=self.getImageFolder()
290
291 if not imageFolder: return None
292
293 image=getattr(imageFolder,self.getId(),None)
294
295 if not image:
296 for suffix in ['jpg','tif']:
297
298 image=getattr(imageFolder,self.getId()+"."+suffix,None)
299 if image:
300 break
301 return image
302
303 def getImageUrl(self):
304 """getImageUrl"""
305 image=self.getImageObj()
306 if not image:
307 return None
308 else:
309 return self.getImageObj().absolute_url()+"/image"
310
311 def PrincipiaSearchSource(self):
312 """Return cataloguable key for ourselves."""
313 return str(self)
314
315 manage_options = Folder.manage_options+(
316 {'label':'Edit','action':'changeMPIWGStaffForm'},
317 {'label':'Change Publications Special','action':'changePublications_specialForm'},
318 ) + Cacheable.manage_options
319
320 __manager_id = "ramCache"
321 def __init__(self,id, lastName,firstName,key):
322 """init"""
323 self.id=id
324 self.title=key
325 self.lastName=lastName
326 self.firstName=firstName
327 self.key=key
328
329 def getPersonID(self):
330 """gibt den ID fuer die Person zurueck"
331 im Moment ist personID = id, i.e. e-mail
332 """
333 return self.id
334
335 def getConeUrl(self):
336 """gibt coneURL zurueck"""
337
338 self.coneService=getattr(self, "coneServiceURL",coneService)
339 logging.debug("coneservice:"+self.coneService)
340
341 if getattr(self,'_v_cone',None)==None:
342 try:
343
344 self._v_cone=SrvTxtUtils.getHttpData(self.coneService+self.getPersonID())
345 #cone = urllib2.urlopen(self.coneService+self.getPersonID())
346 #self._v_cone=cone.read()
347 if self._v_cone==None:
348 self._v_cone=""
349 except:
350 self._v_cone=""
351 return ""
352
353 return self._v_cone
354
355
356
357
358 def harvest_page_old(self,context=None):
359 """geharvestete seite = verschlankte version von members_main"""
360 #pt = getTemplate(self, "harvest_members_main")
361
362 if not self.isPublished():
363 return ""
364 if not context:
365 context=self
366
367
368 ext=getattr(self,"harvest_members_main",None)
369 if ext:
370 return getattr(self,ext.getId())()
371
372 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_members_main')).__of__(context)
373
374
375 return pt()
376
377 def harvest_page(self,mode="normal"):
378 """harvest"""
379 logging.debug("AAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
380 if not self.isPublished():
381 return
382 st = getattr(self.en.staff.members,self.getId()).index_html(mode)
383
384 templates = self.en.getHarvestCache()
385 #templates = getattr(self,'getHarvestCache',self.en.getHarvestCache)()
386 rendered = st
387 templates[self.absolute_url()]=rendered
388 transaction.commit()
389 return rendered
390
391
392
393 def index_html(self,mode="normal"):
394 """show homepage"""
395
396 bound_names={}
397 request = self.REQUEST
398 if request is not None:
399 response = request.response
400 if not response.headers.has_key('content-type'):
401 response.setHeader('content-type', 'text/html')
402
403 security = getSecurityManager()
404 bound_names['user'] = security.getUser()
405
406 # Retrieve the value from the cache.
407 keyset = None
408 if self.ZCacheable_isCachingEnabled():
409
410 # Prepare a cache key.
411 keyset = {'here': self}
412
413 result = self.ZCacheable_get(keywords=keyset)
414
415 if result is not None:
416 # Got a cached value.
417 return result
418
419 # look for individual page
420 if self.hasObject("index.html"):
421 pt = getattr(self, "index.html")
422 # else use template
423 else:
424 if mode=="slim":
425 pt = getTemplate(self, "members_main_slim")
426 else:
427 pt = getTemplate(self, "members_main")
428 # Execute the template in a new security context.
429 security.addContext(self)
430
431 try:
432 result = pt.pt_render(extra_context=bound_names)
433 if keyset is not None:
434 # Store the result in the cache.
435 self.ZCacheable_set(result, keywords=keyset)
436
437 return result
438 finally:
439 security.removeContext(self)
440
441
442
443 def changePublications_specialForm(self):
444 """Priority publications manual field"""
445 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changePublications_special.zpt')).__of__(self)
446 return pt()
447
448 def changePublications_special(self,usePublicationsSpecial=None,specialPublicationsField=None,RESPONSE=None):
449 """change publications special params"""
450 self.ZCacheable_invalidate()
451 if usePublicationsSpecial:
452 self.usePublicationsSpecial=True
453
454 else:
455 self.usePublicationsSpecial=False
456
457 self.specialPublicationsField=specialPublicationsField[0:]
458
459 if RESPONSE is not None:
460 self.redirect(RESPONSE,'manage_main')
461
462
463 def publications_full(self):
464 """show publication"""
465 pt=getTemplate(self, "publications_full_main")
466 return pt()
467
468 def talks_full(self):
469 """show talks"""
470 pt=getTemplate(self, 'talks_full_main')
471 return pt()
472
473 def teaching_full(self):
474 """show talks"""
475 pt=getTemplate(self, 'teaching_full_main')
476 return pt()
477
478 def changeMPIWGStaffForm(self):
479 """change form"""
480 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGStaff.zpt')).__of__(self)
481 return pt()
482
483 security.declareProtected('View management screens','changeMPIWGStaff')
484 def changeMPIWGStaff(self,lastName,firstName,key=None,RESPONSE=None):
485 """change it"""
486 self.ZCacheable_invalidate()
487 self.title="%s, %s"%(lastName,firstName)
488 self.lastName=lastName
489 self.firstName=firstName
490 if key:
491 self.key = key
492
493
494 if RESPONSE is not None:
495 self.redirect(RESPONSE,'manage_main')
496
497 security.declareProtected('View management screens','edit')
498 def edit(self):
499 """Edit the pages"""
500 #TODO: zusammenspiel mit apache, redirect auf 18080 rausnehmen bzw. zumindest verallgemeinern
501 #if self.REQUEST['SERVER_URL']=="http://www.mpiwg-berlin.mpg.de":
502 # redURL="http://xserve04.mpiwg-berlin.mpg.de:18080/www_neu/de/mitarbeiter/members/%s/edit"%self.getId()
503 #
504 # self.REQUEST.RESPONSE.redirect(redURL)
505
506 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMPIWGStaff.zpt')).__of__(self)
507
508
509 logging.debug("XX:"+email.Utils.formatdate().split("-")[0]+'GMT')
510 return pt()
511
512 mainEditFile=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMPIWGStaff_main.zpt'))
513 addPublicationsBib=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addPublicationsBib.zpt'))
514
515 def getPathStyle(self, path, selected, style=""):
516 """returns a string with the given style + 'sel' if path == selected."""
517
518 if path == selected:
519 return style + 'sel'
520 else:
521 return style
522
523
524 def getLabel(self):
525 """returns a label for this object"""
526 return self.title
527
528 def getBreadcrumbs(self):
529 """return list of breadcrumbs from here to the root"""
530 crumbs = []
531 # skip direct parent Folder /members/
532 parent = self.aq_parent.aq_parent
533 # get parents breadcrumbs
534 logging.debug("getbreadcrumbs-: title=%s self=%s parent=%s"%(self.title, repr(self), repr(parent)))
535 if hasattr(parent, 'getBreadcrumbs'):
536 logging.debug("getbreadcrumbs: recurse to %s"%parent)
537 crumbs = parent.getBreadcrumbs()
538
539 # try to get acquisition URL from parent
540 if hasattr(parent, 'absolute_url'):
541 baseUrl = "%s/%s/"%(parent.absolute_url(), 'members')
542 else:
543 baseUrl = "/en/staff/members/"
544
545 # add this
546 crumbs.append((self.getLabel(), baseUrl+self.getId(), self))
547
548 return crumbs
549
550
551 def changeCurrentWork(self,current_work,key,publish="yes",RESPONSE=None):
552 """change current work"""
553
554 query="UPDATE personal_www SET current_work =%s WHERE key='%s'"
555
556 self.ZSQLQuery(query%(self.ZSQLQuote(current_work),key))
557
558 query="UPDATE personal_www SET current_work_p =%s WHERE key='%s'"
559
560 self.ZSQLQuery(query%(self.ZSQLQuote(publish),key))
561 self.ZCacheable_invalidate()
562 if RESPONSE:
563 self.redirect(RESPONSE,"edit")
564
565 security.declareProtected('View management screens','changeResearch')
566 def changeResearch(self,noredirect=None,RESPONSE=None):
567 """change the research entries"""
568 self.ZCacheable_invalidate()
569 newEntries={}
570 key_main=self.REQUEST.form['key_main']
571
572 mainfieldL=self.REQUEST.form['main_fields'].split(",")
573 mainfield={}
574 for x in mainfieldL:
575 tmp=x.split('__')
576 mainfield[tmp[0]]=tmp[1]
577 for field in self.REQUEST.form.keys():
578 splittedField=field.split("__")
579 if len(splittedField)<3:
580 pass #kein datenbank eintrag
581
582 elif splittedField[2]=='new': # store new entries
583 if not newEntries.has_key(splittedField[0]):
584 newEntries[splittedField[0]]={}
585
586 newEntries[splittedField[0]][splittedField[1]]=self.REQUEST.form[field]
587
588 else:
589 query="UPDATE %s "%splittedField[0]
590 query+="SET %s = '%s' "%(splittedField[1],sql_quote(self.REQUEST.form[field]))
591 query+="WHERE oid = '%s' "%sql_quote(splittedField[2])
592
593 self.ZSQLQuery(query)
594
595
596 #new entries
597 for newEntry in newEntries.keys():
598 query="INSERT INTO %s "%newEntry
599 keys=['key_main']
600 values=["'"+sql_quote(key_main)+"'"]
601 for key in newEntries[newEntry].keys():
602 keys.append(key)
603 values.append("'"+sql_quote(newEntries[newEntry][key])+"'")
604
605
606 keystring=",".join(keys)
607
608 valuestring=",".join(values)
609
610 query+=" (%s) "%keystring
611 query+="VALUES (%s)"%valuestring
612 if not (newEntries[newEntry][mainfield[newEntry]].lstrip().rstrip()==""):
613 self.ZSQLQuery(query)
614
615 if not noredirect:
616 self.redirect(RESPONSE,self.REQUEST['HTTP_REFERER'])
617
618 security.declareProtected('View management screens','editCV')
619 def editCV(self,cv=None,oid=None,RESPONSE=None):
620 """edit Cv"""
621
622 if (not oid):
623 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editCV.zpt')).__of__(self)
624 return pt()
625
626 query="UPDATE personal_www SET cv =%s WHERE oid='%s'"
627 self.ZCacheable_invalidate()
628 self.ZSQLQuery(query%(self.ZSQLQuote(cv),oid))
629
630 if RESPONSE:
631 self.redirect(RESPONSE,"editCV")
632
633
634 def getProfile(self):
635 """get the profile"""
636 self.REQUEST.RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT')
637
638 founds=self.ZSQLInlineSearchU(_table='personal_www',key=self.getKeyUTF8())
639 html="""<html><body>%s</body></html>"""
640 if founds.profile and founds.profile != "":
641
642 return html%founds.profile
643 else:
644
645 return html%self.generateProfileForPerson(founds)
646
647 def editProfile(self,oid=None,RESPONSE=None, kupu=None, preview=None):
648 """edit Profile, new entry replaces CD, current work and research interests"""
649
650 if (not oid):
651 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editProfile.zpt')).__of__(self)
652 return pt()
653
654 self.ZCacheable_invalidate()
655
656
657 if preview:
658 pass
659 #TODO: not supported yet
660 #kupu=preview
661 # find content of body tags
662
663 start=kupu.find("<body>")
664 end=kupu.find("</body>")
665
666 newcontent= kupu[start+6:end]
667
668
669
670
671 if preview:
672 #TODO: not supported yet
673 if RESPONSE:
674 self.redirect(RESPONSE,"editProfile")
675
676 #return self.preview(newcontent)
677
678 query="UPDATE personal_www SET profile=%s WHERE oid='%s'"
679 self.ZSQLQuery(query%(self.ZSQLQuote(newcontent),oid))
680 logging.error("PROFILE:"+query%(self.ZSQLQuote(newcontent),oid))
681 if RESPONSE:
682 self.redirect(RESPONSE,"editProfile")
683
684
685
686 def generateProfileForPerson(self,person):
687 """erzeugt ein automatisches Profil aus den alten Eintraegen CV, Current work, und research interests"""
688
689 ret=""
690 #founds=self.ZSQLInlineSearch(_table='research_interest',key_main=person.getKeyUTF8())
691 founds=self.ZSQLInlineSearch(_table='research_interest',key_main=person.key)
692 if founds:
693 ret="<p class=\"bio_section_header\">Research interests: </p><br/>"
694 for found in self.sortPriority(founds):
695 ret+=found.interest+"<br/>"
696
697
698 if (person.current_work) and (not person.current_work==""):
699 ret+="<p class=\"bio_section_header\">Current work: </p><br/>"
700
701 ret+=person.current_work+"<br/>"
702 if (person.cv) and (not person.cv==""):
703 ret+="<p class=\"bio_section_header\">Curriculum Vitae: </p><br/>"
704 ret+=self.formatAscii(person.cv)
705
706 return ret
707 security.declareProtected('View management screens','editDownloads')
708 def editDownloads(self):
709 """editiere die Downloads von der Webseite"""
710
711 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editDownloads.zpt')).__of__(self)
712 return pt()
713
714 security.declareProtected('View management screens','editAdditionalLinks.zpt')
715 def editAdditionalLinks(self):
716 """editiere die Downloads von der Webseite"""
717
718 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editAdditionalLinks.zpt')).__of__(self)
719 return pt()
720
721
722 security.declareProtected('View management screens','editAwards')
723 def editAwards(self,awards=None,oid=None,RESPONSE=None):
724 """edit a awards"""
725
726 if (not oid):
727 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editAwards.zpt')).__of__(self)
728 return pt()
729 self.ZCacheable_invalidate()
730 query="UPDATE personal_www SET awards =%s WHERE oid='%s'"
731
732 self.ZSQLQuery(query%(self.ZSQLQuote(awards),oid))
733
734
735 if RESPONSE:
736 self.redirect(RESPONSE,"editAwards")
737
738 security.declareProtected('View management screens','editTalks')
739 def editTalks(self):
740 """edit talks"""
741
742 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editTalks.zpt')).__of__(self)
743 return pt()
744
745 security.declareProtected('View management screens','editTeaching')
746 def editTeaching(self):
747 """edit Teaching"""
748
749 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editTeaching.zpt')).__of__(self)
750 return pt()
751
752 def getDocTypes(self):
753 finds = self.ZopeFind(self.metadata.main.meta.bib,obj_metatypes=["OSAS_MetadataMapping__neu"])
754
755 list= [x[0] for x in finds]
756 return "\n".join(list)
757
758 security.declareProtected('View management screens','editMainData')
759 def editMainData(self,REQUEST=None,RESPONSE=None):
760 """edit main data"""
761 self.ZCacheable_invalidate()
762 argv=REQUEST.form
763
764 if not argv.has_key('last_name'):
765 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editMainData.zpt')).__of__(self)
766 return pt()
767 else:
768 self.ZSQLChange(argv,_table="personal_www",_identify="lower(key)=%s"%utf8ify(self.getKey().lower()),USE_FORM="yes")
769 # aendere auch dien enstsprechen infos in der instance
770 self.changeMPIWGStaff(argv['last_name'],argv['first_name']);
771
772
773
774 self.reindex_object()
775
776
777
778 if RESPONSE:
779 self.redirect(RESPONSE,"editMainData")
780
781 security.declareProtected('View management screens','newBibliogrpaphy')
782 def newBibliography(self,_docType=None, _addEntry=None,RESPONSE=None,**argv):
783
784 """add an entry to the bibliography"""
785 if not _docType: #kein docType
786 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','newBibliographyEntryDocType.zpt')).__of__(self)
787 return pt()
788 elif _docType and not _addEntry: #doctype aber keine daten
789 self.REQUEST['_docType']=_docType
790 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','newBibliographyEntry.zpt')).__of__(self)
791 return pt()
792 else: #doctype und daten
793 try:
794 newId=self.ZSQLSimpleSearch("select nextval('id_raw')")[0].nextval
795 except:#id_raw existiert nich, dann neu erzeugen
796
797 self.createOrUpdateId_raw()
798 newId=self.ZSQLSimpleSearch("select nextval('id_raw')")[0].nextval
799
800 bookId="b%06i" % newId
801
802 self.ZSQLAdd(argv,_table="bibliography",reference_type=_docType,id=bookId)
803
804 self.ZSQLAdd(_useRequest=False,_table="publications",id_gen_bib=bookId,key_main=self.getDBId(),publish='yes')
805 self.updatePublicationDB(personId=self.getDBId())
806
807
808 if RESPONSE:
809 self.redirect(RESPONSE,"editPublications")
810
811 return True
812
813 security.declareProtected('View management screens','editImage')
814 def editImage(self):
815 """edit images"""
816 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editImageStaff.zpt')).__of__(self)
817 return pt()
818
819 security.declareProtected('View management screens','editBibliography')
820 def editBibliography(self):
821 """edit the bibliography"""
822 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editBibliographyEntry.zpt')).__of__(self)
823 return pt()
824
825
826 security.declareProtected('View management screens','editPublications')
827 def editPublications(self):
828 """edit the bibliographie"""
829
830 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editPublications.zpt')).__of__(self)
831 return pt()
832
833 def changeSortingMode(self,sortingMode,RESPONSE=None,REQUEST=None):
834 """change sorting mode"""
835 self.ZCacheable_invalidate()
836 self.sortingMode=sortingMode
837
838 if RESPONSE and REQUEST:
839 self.redirect(RESPONSE,REQUEST['HTTP_REFERER'])
840
841 return True
842
843 def getSortingMode(self):
844 """get sorting mode"""
845 mode=getattr(self,'sortingMode','priority')
846 if mode=="year":
847 return "year DESC"
848 else:
849 return mode
850
851 def integer(self,value):
852 try:
853 return int(value)
854 except:
855 return 0
856
857 security.declareProtected('View management screens','changePublications')
858 def changePublications(self,RESPONSE=None):
859 """change the publication list"""
860 self.changeResearch(noredirect=True)
861 self.ZCacheable_invalidate()
862 #self.updatePublicationDB(personId=self.getDBId())
863 self.redirect(RESPONSE,self.REQUEST['HTTP_REFERER'])
864
865
866
867 security.declareProtected('View management screens','addPublications')
868 def addPublications(self,submit=None,REQUEST=None,noredirect=None,RESPONSE=None):
869 """add publications"""
870
871 #setzte flag ob aufruf aus suchformular
872
873 if REQUEST.get("QUERY_STRING",None) and (not submit):
874 self.REQUEST.set('fromSearch','1')
875 else:
876 self.REQUEST.set('fromSearch','0')
877
878 if not submit or (not (submit == "add")):
879 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addPublications.zpt')).__of__(self)
880 return pt()
881
882 #new entries
883 entries = REQUEST.form.get('addEntries',None)
884 if not (type(entries) is ListType):
885 entries=[entries]
886
887
888 for bibId in entries:
889 query="INSERT INTO %s " % "publications"
890 query+="(key_main,id_institutsbibliographie,publish) "
891 query+="VALUES ('%s','%s','yes')" %(sql_quote(self.getKey()),sql_quote(bibId))
892
893 #self.ZSQLAdd(_table="publications",id_institutsbibliographie=bibId,id_main=self.getDBId(),publish='yes')
894 self.ZSQLQuery(query)
895
896 self.updatePublicationDB(personId=self.getKey())
897
898 if not noredirect:
899
900 self.redirect(RESPONSE,"./editPublications")
901
902 return True
903
904
905 def getDBId(self):
906 """get id from the personal database"""
907
908 #in der neuen version ist definitions gemaess der key der Datenbank gleich dem key im Object.
909 # TODO: remove all occurences of getDBId and replaces it by getKey
910 return self.getKey()
911
912 # search=self.ZSQLInlineSearch(_table='personal_www',key=self.getKey(),publish_the_data='yes')
913 # if search:#name existiert und published, dann nimm diesen falls es mehrereeventuell nich publizierte datensaetze gibt.
914 # return search[0].id
915 # else:#nicht publiziert dann nimm einen davon
916 # search2=self.ZSQLInlineSearch(_table='personal_www',username=self.getId())
917 # if search2:
918 # return search2[0].id
919 # else:
920 # return None
921
922
923
924 formatBiblHelp=bibliography.formatBiblHelp
925
926 def sortBibliography(self,list,sortingMode=None,max=None):
927 if not sortingMode:
928 sortingMode=self.getSortingMode()
929
930 if sortingMode == "year":
931 l= self.sortYear(list)
932 else:
933 l=self.sortPriority(list)
934
935 if max:
936 return l[0:min(len(l),max)]
937 else:
938 return l
939
940 def sortPriority(self,list):
941 def sort(x,y):
942 try:
943 xInt=int(x.priority)
944 except:
945 xInt=0
946 try:
947 yInt=int(y.priority)
948 except:
949 yInt=0
950
951 return cmp(xInt,yInt)
952
953 if not list:
954 return []
955 tmp=[x for x in list]
956 tmp.sort(sort)
957
958 return tmp
959
960 def sortYear(self,list):
961 #TODO: sort TO APPEAR and TO BE PUBLISHED etc...
962
963 def sort(x,y):
964 try:
965 xInt=int(x.year)
966 except:
967 xInt=0
968 try:
969 yInt=int(y.year)
970 except:
971 yInt=0
972
973 return cmp(yInt,xInt)
974
975
976 tmp=[x for x in list]
977
978 tmp.sort(sort)
979 return tmp
980
981 def deleteField(self,table,oid,RESPONSE=None):
982 """delete entry"""
983 query="DELETE FROM %s WHERE oid = '%s'"%(table,oid)
984
985 self.ZSQLQuery(query)
986 self.redirect(RESPONSE,self.REQUEST['HTTP_REFERER'])
987
988
989 def manage_addMPIWGStaffForm(self):
990 """form for adding the project"""
991 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGStaffForm.zpt')).__of__(self)
992 return pt()
993
994 def manage_addMPIWGStaff(self,id,lastName,firstName,RESPONSE=None):
995 """add it"""
996 newObj=MPIWGStaff(id,lastName,firstName)
997
998 self._setObject(id,newObj)
999
1000
1001 if RESPONSE is not None:
1002 self.redirect(RESPONSE,'manage_main')
1003
1004