1: """This contains the class MPIWG Projects
2: for organizing and maintaining the different project pages
3:
4: """
5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
6: from Products.PageTemplates.PageTemplate import PageTemplate
7: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
8: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
9: from Globals import package_home
10: import urllib
11: import MPIWGStaff
12: import string
13: import re
14: import os
15: from types import *
16: import zLOG
17: import xmlhelper # Methoden zur Verwaltung der projekt xmls
18: from OFS.SimpleItem import SimpleItem
19: from OFS.Folder import Folder
20:
21: from bibliography import *
22: import time
23:
24: definedFields=['WEB_title','xdata_01','xdata_02','xdata_03','xdata_04','xdata_05','xdata_06','xdata_07','xdata_08','xdata_09','xdata_10','xdata_11','xdata_12','xdata_13','WEB_project_header','WEB_project_description','WEB_related_pub']
25:
26: checkFields = ['xdata_01']
27:
28:
29:
30: def sortF(x,y):
31: try:
32: return cmp(x[1],y[1])
33: except:
34: try:
35: return cmp(str(x[1]),str(y[1]))
36: except:
37: print "error",x[1],y[1]
38: return 0
39:
40: def sortI(x,y):
41: xsplit=x[1].split(".")
42: ysplit=y[1].split(".")
43: xret=""
44: yret=""
45: try:
46: for i in range(5):
47: try:
48: yret=yret+"%04i"%int(xsplit[i])
49: except:
50: yret=yret+"%04i"%0
51:
52: try:
53: xret=xret+"%04i"%int(ysplit[i])
54: except:
55: xret=xret+"%04i"%0
56:
57:
58: return cmp(int(yret),int(xret))
59: except:
60: return cmp(x[1],y[1])
61:
62: class MPIWGTemplate(ZopePageTemplate):
63: """Create a layout Template for different purposes"""
64:
65: meta_type="MPIWGTemplate"
66:
67: def __init__(self, id, text=None, content_type=None,MPIWGType=None):
68: self.id = str(id)
69:
70:
71:
72: self.ZBindings_edit(self._default_bindings)
73: if text is None:
74: self._default_content_fn = os.path.join(package_home(globals()),
75: 'zpt/MPIWG_%s_template_standard.zpt'%MPIWGType)
76: text = open(self._default_content_fn).read()
77: self.pt_edit(text, content_type)
78:
79:
80: """change form"""
81:
82:
83: def manage_addMPIWGTemplateForm(self):
84: """Form for adding"""
85: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGTemplate.zpt')).__of__(self)
86: return pt()
87:
88: from urllib import quote
89:
90:
91: def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,REQUEST=None):
92: "Add a Page Template with optional file content."
93: if type(MPIWGType)==StringType:
94: MPIWGTypes=[MPIWGType]
95: else:
96: MPIWGTypes=MPIWGType
97:
98: for singleType in MPIWGTypes:
99:
100:
101: if REQUEST is None:
102: self._setObject(id, MPIWGTemplate(id, text,EchoType=singleType))
103: ob = getattr(self, id)
104:
105: if title:
106: ob.pt_setTitle(title)
107: return ob
108: else:
109: file = REQUEST.form.get('file')
110: headers = getattr(file, 'headers', None)
111: if headers is None or not file.filename:
112: zpt = MPIWGTemplate(id,MPIWGType=singleType)
113: else:
114: zpt = MPIWGTemplate(id, file, headers.get('content_type'))
115:
116: self._setObject(id, zpt)
117: ob = getattr(self, id)
118: if title:
119: ob.pt_setTitle(title)
120:
121: try:
122: u = self.DestinationURL()
123: except AttributeError:
124: u = REQUEST['URL1']
125:
126:
127: REQUEST.RESPONSE.redirect(u+'/manage_main')
128: return ''
129:
130:
131: class MPIWGRoot(ZSQLExtendFolder):
132: """Stammordner für den Web-Server"""
133:
134: fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department',
135: 'xdata_03':'Historical Persons','xdata_04':'Time period',
136: 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title',
137: 'xdata_08':'Other involved scholars' ,'xdata_09':'Part of','xdata_10':'Covered by',
138: 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners',
139: 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header',
140: 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'}
141:
142: folders=['MPIWGProject','Folder','ECHO_Navigation']
143: meta_type='MPIWGRoot'
144:
145: def upDateSQL(self,fileName):
146: """updates SQL databases using fm.jar"""
147: fmJarPath=os.path.join(package_home(globals()), 'updateSQL/fm.jar')
148: xmlPath=os.path.join(package_home(globals()), "updateSQL/%s"%fileName)
149: zLOG.LOG("MPIWG Web",zLOG.INFO,"java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath))
150: ret=os.popen("java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath),"r").read()
151: zLOG.LOG("MPIWG Web",zLOG.INFO,"result convert: %s"%ret)
152: return 1
153:
154: def patchProjects(self,RESPONSE):
155: """patch"""
156: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
157: for project in projects:
158: tmp=project[1].WEB_project_description[0].replace("/CD/projects/","")[0:]
159: setattr(project[1],'WEB_project_description',[tmp[0:]])
160: RESPONSE.write("<p>%s</p>\n"%project[0])
161:
162: def replaceNotEmpty(self,format,field):
163: """replace not empty"""
164: if field and (not field==''):
165: return format%field
166: else:
167: return ""
168:
169:
170: def redirectIndex_html(self,request):
171: #return request['URL1']+'/index_html'
172:
173: return urllib.urlopen(request['URL1']+'/index_html').read()
174:
175:
176: def formatBibliography(self,here,found):
177: """format"""
178: return formatBibliography(here,found)
179:
180: def getValue(self,fieldStr):
181: """Inhalt des Feldes"""
182:
183: if type(fieldStr)==StringType:
184: field=fieldStr
185: else:
186: field=fieldStr[0]
187: try:
188: if field[len(field)-1]==";":
189: field=field[0:len(field)-1]
190: except:
191:
192: """nothing"""
193: field=re.sub(r';([^\s])','; \g<1>',field)
194: return field.encode('utf-8')
195:
196:
197:
198: def sortedNames(self,list):
199: """sort names"""
200:
201: def sortLastName(x_c,y_c):
202: try:
203: x=urllib.unquote(x_c).encode('utf-8','ignore')
204: except:
205: x=urllib.unquote(x_c)
206:
207: try:
208: y=urllib.unquote(y_c).encode('utf-8','ignore')
209: except:
210: x=urllib.unquote(y_c)
211:
212:
213:
214: try:
215: last_x=x.split()[len(x.split())-1]
216: last_y=y.split()[len(y.split())-1]
217:
218: except:
219:
220: last_x=""
221: last_y=""
222:
223:
224:
225: if last_x<last_y:
226: return 1
227: elif last_x>last_y:
228: return -1
229: else:
230: return 0
231:
232: list.sort(sortLastName)
233: list.reverse()
234:
235: return list
236:
237: def __init__(self, id, title):
238: """init"""
239: self.id=id
240: self.title=title
241:
242: def urlQuote(self,str):
243: """quote"""
244: return urllib.quote(str)
245:
246: def urlUnQuote(self,str):
247: """quote"""
248: return urllib.unquote(str)
249:
250: def harvestHistoricalPersons(self):
251: """erstelle liste aller erwaehnten actors"""
252:
253: def normalize(str):
254: """loesche fuhrendes space"""
255: if (len(str)>1) and (str[0]==" "):
256: ret=str[1:]
257: else:
258: ret=str
259: return ret
260:
261: list={}
262: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
263:
264: for project in projects:
265: lg=len(project[1].xdata_03[0])-1
266:
267: if (lg>1) and (project[1].xdata_03[0][lg]==";"):
268: project[1].xdata_03[0]=project[1].xdata_03[0][0:lg]
269:
270:
271:
272:
273: try:
274: if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ;
275: for person in project[1].xdata_03[0].split(";"):
276: personNormal=normalize(person)
277: if personNormal in list.keys():
278: list[urllib.quote(personNormal)][1].append(project[1])
279: else:
280: list[urllib.quote(personNormal)]=(personNormal,[project[1]])
281: else: #guess , is sepeator
282: for person in project[1].xdata_03[0].split(","):
283: personNormal=normalize(person)
284: if urllib.quote(personNormal) in list.keys():
285: list[urllib.quote(personNormal)][1].append(project[1])
286: else:
287: list[urllib.quote(personNormal)]=(personNormal,[project[1]])
288:
289: except:
290: print "ERROR",project
291:
292: return list
293:
294: def storeHistoricalPersons(self,RESPONSE=None):
295: """store persons"""
296: self.personDict={}
297: personDict=self.harvestHistoricalPersons()
298: for person in personDict.keys():
299: for project in personDict[person][1]:
300: if person in self.personDict.keys():
301: self.personDict[person][1].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0]))
302: else:
303: self.personDict[person]=(personDict[person][0],[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])])
304:
305: if RESPONSE is not None:
306: RESPONSE.redirect("showHistoricalPersons")
307:
308:
309: def getPersonDict(self,name):
310: """name von dict"""
311:
312: try:
313: return self.personDict[name][0].encode('utf-8')
314: except:
315: return self.personDict[name][0]
316: return self.personDict[name][0].decode('latin-1').encode('utf-8')
317:
318:
319: def showHistoricalPersons(self):
320: """show persons"""
321: pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self)
322: return pt()
323:
324:
325: def editHistoricalPersonsForm(self):
326: """edit historical persons for consistency"""
327: pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self)
328: return pt()
329:
330: def getProjectsByFieldContent(self,fieldName,fieldContentsEntry):
331: """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents"""
332: if type(fieldContentsEntry) is StringType:
333: fieldContents=[fieldContentsEntry]
334: else:
335: fieldContents=fieldContentsEntry
336:
337: projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')})
338: #print projects
339: return projects
340:
341: def changeMPIWGRootForm(self):
342: """edit"""
343: pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self)
344: return pt()
345:
346: def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None):
347: """change"""
348: self.title=title
349: self.disciplineList=disciplineList
350: self.themesList=themesList
351:
352: if RESPONSE is not None:
353: RESPONSE.redirect('manage_main')
354:
355: def getDisciplineList(self):
356: """get disciplines as list"""
357: return self.disciplineList.split("\n")
358:
359: def getThemeList(self):
360: """get themes as list"""
361: return self.themesList.split("\n")
362:
363: def test(self):
364: """test"""
365: return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url
366:
367: def getContexts(self,childs=None,parents=None,depth=None):
368: """childs alle childs, alle parents"""
369: ret=[]
370: if parents:
371: splitted=parents.split(".")
372: parentId=string.join(splitted[0:len(splitted)-1],".")
373:
374: for project in self.getProjectFields('xdata_05',sort='int'):
375: if project[1]==parentId:
376: ret.append(project)
377:
378: if childs:
379: for project in self.getProjectFields('xdata_05',sort='int'):
380: searchStr=childs+"(\..*)"
381: if re.match(searchStr,project[1]):
382:
383: if depth:
384:
385: if int(depth)>=len(project[1].split("."))-len(childs.split(".")):
386:
387: ret.append(project)
388: else:
389: ret.append(project)
390: return ret
391:
392: def getProjectFields(self,fieldName,folder=None,sort=None):
393: """getListofFieldNames"""
394: ret=[]
395:
396: objects=self.ZopeFind(self,obj_metatypes=['MPIWGProject'],search_sub=1)
397:
398:
399: for object in objects:
400: obj=object[1]
401:
402: if not getattr(obj,'invisible',None):
403: if fieldName=="WEB_title_or_short":
404:
405: if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
406: fieldNameTmp="WEB_title"
407: else:
408: fieldNameTmp="xdata_07"
409: else:
410: fieldNameTmp=fieldName
411:
412: ret.append((obj,obj.getContent(fieldNameTmp)))
413:
414:
415: if sort=="int":
416: ret.sort(sortI)
417: else:
418: ret.sort(sortF)
419:
420: return ret
421:
422: def showNewProjects(self):
423: projects=[]
424: for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
425: if objs[0].xdata_05[0] == "":
426:
427: projects.append(objs)
428:
429: return projects
430:
431:
432: manage_options = Folder.manage_options+(
433: {'label':'Update Personal Homepages','action':'updateHomepages'},
434: {'label':'Main config','action':'changeMPIWGRootForm'},
435: {'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'},
436: {'label':'Store Historical Persons','action':'storeHistoricalPersons'},
437: )
438:
439: def importNamesForm(self):
440: """Form"""
441: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self)
442: return pt()
443:
444: def importNames(self,fileupload,folderName,RESPONSE=None):
445: """import komma-sep list email,lastName,firstName"""
446: project=getattr(self,folderName)
447: load=fileupload.read()
448:
449: for line in load.split('\r'):
450:
451:
452: splitted=line.split(",")
453: # print splitted
454:
455: if not (splitted[0]==""):
456: newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
457:
458: try:
459: project._setObject(splitted[0],newObj)
460: #print "done:",splitted[0]
461: except:
462: print "not done:",splitted[0]
463:
464: if RESPONSE is not None:
465: RESPONSE.redirect('manage_main')
466:
467: def updateHomepages(self,RESPONSE):
468: """lege members an"""
469:
470: self.upDateSQL('personalwww.xml')
471: founds=self.ZSQLInlineSearch(_table='personal_www',publish_the_data='yes')
472: project=getattr(self,'members')
473: for found in founds:
474:
475: if not (found.e_mail==""):
476: newObj=MPIWGStaff.MPIWGStaff(found.username,found.name,found.vorname)
477:
478: try:
479: project._setObject(found.username,newObj)
480: RESPONSE.write("<p>new:%s</p>\n"%found.username)
481: except:
482: RESPONSE.write("<p>old:%s (%s,%s)</p>\n"%(found.username,found.name,found.vorname))
483:
484:
485: #delete non existing
486:
487:
488: foundUserNames=[x.username for x in founds]
489: for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1):
490:
491: if member[1].getId() not in foundUserNames:
492: member[1].aq_parent.manage_delObjects(ids=[member[1].getId()])
493: RESPONSE.write("<p>deleted:%s</p>\n"%member[1].getId())
494:
495: self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
496:
497:
498:
499: if RESPONSE is not None:
500: RESPONSE.redirect('manage_main')
501:
502:
503: def getAllMembers(self):
504: """give list of all members"""
505: ret=[]
506:
507: #for x in self.members.objectValues('MPIWGStaff'):
508: #print x.title
509: # ret.append(x.title.decode('utf-8'))
510:
511: for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']):
512: ret.append(x[1].title.decode('utf-8'))
513:
514: ret.sort()
515: #print ret
516:
517: return ret
518:
519: def printAllMembers(self):
520: """prin"""
521: members=self.getAllMembers()
522: ret=""
523: for x in members:
524: ret+="<p>%s</p>"%x
525: return ret
526:
527:
528: def makeList(self,entry):
529: """makes a list out of one entry or repeat a list"""
530: if type(entry) is StringType:
531: return [entry]
532: else:
533: return entry
534:
535:
536: def getTree(self):
537: """generate Tree from project list"""
538: returnList=[]
539: for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
540:
541: for idNr in project[1].split(";"): # more than one number
542: if not idNr=="":
543: splittedId=idNr.split(".")
544: depth=len(splittedId)
545: nr=idNr
546: #title=project[0].WEB_title
547: title=[project[0].getContent('WEB_title')]
548: #print title
549: returnList.append((depth,nr,title,project[0]))
550:
551: return returnList
552:
553:
554: def formatElementForOverview(self,element):
555: """format the element for output in overview"""
556: if element[0]==1: #department
557: #print element[3].getContent('xdata_05')
558: if element[3].getContent('xdata_05') == "4":
559: return """<h2 class="hier"><a href="%s">Ind. Research Group I: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
560: if element[3].getContent('xdata_05') == "5":
561: return """<h2 class="hier"><a href="%s">Ind. Research Group II: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
562:
563: return """<h2 class="hier"><a href="%s">Department %s: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('xdata_05'),element[3].getContent('WEB_title'))
564:
565: elif element[0]==2: #mainprojects
566: return """<h3 class="hier"><a href="%s">%s</a></h3><p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
567:
568: elif element[0]==3:
569: return """<p class="hier"><a href="%s">%s</a></p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
570:
571:
572: def changePosition(self,treeId,select,RESPONSE=None):
573: """Change Postion Entry"""
574: numbers=[]
575:
576: # Suche hoechste bisherige nummer
577: projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
578: #print "pj",projects
579: for project in projects: #suche alle subtrees der treeId
580: #print treeId
581:
582: founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
583: if founds:
584: #print "x",founds.group(0),len(founds.group(0).split("."))
585: if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
586: try:
587: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
588: except:
589: numbers.append(int(0))
590:
591: try:
592: highest=max(numbers)
593: except:
594: highest=0
595: projects=self.showNewProjects()
596: for i in self.makeList(select):
597: highest+=10
598: projects[int(i)][0].xdata_05=treeId+"."+str(highest)
599:
600:
601: if RESPONSE is not None:
602: RESPONSE.redirect('showTree')
603:
604: def changeTree(self,RESPONSE=None):
605: """change the complete tree"""
606: form=self.REQUEST.form
607: hashList={}
608: fields=self.getTree()
609:
610:
611: for idNr in form.keys():
612: fields[int(idNr)][3].xdata_05=form[idNr]
613:
614:
615:
616: if RESPONSE is not None:
617: RESPONSE.redirect('showTree')
618:
619: def getProjectWithId(self,id):
620: fields=self.getProjectFields('xdata_05')
621: for field in fields:
622: if field[1]==id:
623: return field[0]
624:
625: return None
626:
627:
628:
629:
630: def getRelativeUrlFromPerson(self,list):
631: """get urls to person list"""
632: ret=[]
633: persons=list.split(";")
634: for person in persons:
635:
636: if len(person)>1: #nicht nur Trennzeichen
637: splitted=person.split(",")
638: if len(splitted)==1:
639: splitted=person.split(" ")
640: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
641: if splittedNew[0]=='':
642: del splittedNew[0]
643: search=string.join(splittedNew,' AND ')
644:
645: if not search=='':
646:
647: try:
648: proj=self.MembersCatalog({'title':search})
649: except:
650: proj=None
651:
652: if proj:
653: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
654: ret.append("<a href=%s >%s</a>"%('members/'+proj[0].id+'/index.html',person))
655: else:
656: #ret.append("%s"%person.encode('utf-8'))
657: ret.append("%s"%person)
658: return string.join(ret,";")
659:
660:
661: def getUrlFromPerson(self,list):
662: """get urls to person list"""
663: ret=[]
664: persons=list.split(";")
665: for person in persons:
666:
667: if len(person)>1: #nicht nur Trennzeichen
668: splitted=person.split(",")
669: if len(splitted)==1:
670: splitted=person.lstrip().rstrip().split(" ")
671: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
672: if splittedNew[0]=='':
673: del splittedNew[0]
674: search=string.join(splittedNew,' AND ')
675:
676: if not search=='':
677:
678: try:
679: proj=self.MembersCatalog({'title':search})
680: except:
681: proj=None
682:
683: if proj:
684: if person =="Otto Sibum" : person="H. Otto Sibum"
685: if person =="Norton Wise" : person="M. Norton Wise"
686: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
687: ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url+"/index.html",person))
688: else:
689: #ret.append("%s"%person.encode('utf-8'))
690: ret.append("%s"%person)
691: return string.join(ret,";")
692:
693: def getProjectsOfMembers(self):
694: """give tuple member /projects"""
695: ret=[]
696: members=self.getAllMembers()
697: #return str(members)
698: for x in members:
699: ret+=self.getProjectsOfMember(name=x)
700:
701: return ret
702:
703: def getProjectsOfMember(self,name=None,email=None):
704: """get project of a member"""
705: def sortP(x,y):
706: """sort by sorting number"""
707: #print x.xdata_05,y.xdata_05
708: return cmp(x.WEB_title,y.WEB_title)
709:
710:
711: ret=[]
712: splitNeu=[]
713: if email:
714: #print "IIII:",self.getId()
715: members=self.ZopeFind(self,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
716: name = members[0][1].title.decode('utf-8')
717:
718: y=name
719: splitted=y.split(",")
720: #XXXX
721: splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
722:
723: #for s in splitted:
724: # splitNeu.append("\""+s+"\"")
725: search=string.join(splitNeu,' AND ')
726:
727: proj=self.ProjectCatalog({'xdata_01':search})
728:
729: if proj:
730: proj2=[]
731: for x in proj:
732:
733: if not getattr(x.getObject(),'invisible',None):
734: if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
735: proj2.append(x)
736:
737: else:
738: proj2=[]
739:
740: proj=self.ProjectCatalog({'xdata_08':search})
741: if proj:
742: names=[x.WEB_title for x in proj]
743: for x in proj:
744:
745: if not x.WEB_title in names:
746: proj2.append(x)
747:
748:
749: proj2.sort(sortP)
750:
751: if len(proj2)>0:
752: ret.append((y,proj2))
753:
754: return ret
755:
756: def givePersonList(self,name):
757: """check if person is in personfolder and return list of person objects"""
758:
759: splitted=name.split(",")
760: if len(splitted)==1:
761: splitted=name.lstrip().rstrip().split(" ")
762: splittedNew=[split.lstrip() for split in splitted]
763:
764: if splittedNew[0]=='':
765: del splittedNew[0]
766: search=string.join(splittedNew,' AND ')
767: if not search=='':
768: proj=self.MembersCatalog({'title':search})
769:
770: if proj:
771: return [[x.lastName,x.firstName] for x in proj]
772: else:
773: return []
774:
775: ## splitted=name.split(",") # version nachname, vorname...
776: ## if len(splitted)>1:
777: ## lastName=splitted[0]
778: ## firstName=splitted[1]
779: ## else:
780: ## splitted=name.split(" ") #version vorname irgenwas nachnamae
781:
782: ## lastName=splitted[len(splitted)-1]
783: ## firstName=string.join(splitted[0:len(splitted)-1])
784:
785: ## objs=[]
786:
787: #print self.members
788: ## for x in self.members.__dict__:
789: ## obj=getattr(self.members,x)
790: ## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
791:
792: ## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
793:
794: ## objs.append((obj,lastName+", "+firstName))
795:
796:
797: return objs
798:
799:
800: def personCheck(self,names):
801: """all persons for list"""
802: #print "names",names
803: splitted=names.split(";")
804: ret={}
805: for name in splitted:
806:
807: if not (name==""):
808: try:
809: ret[name]=self.givePersonList(name)
810: except:
811: """NOTHIHN"""
812: #print "RET",ret
813: return ret
814:
815: def giveCheckList(self,person,fieldname):
816: """return checklist"""
817: #print "GCL",fieldname
818: if fieldname=='xdata_01':
819: x=self.personCheck(person.getContent(fieldname))
820: #print "GCLBACKX",x
821: return x
822:
823:
824: def isCheckField(self,fieldname):
825: """return chechfield"""
826:
827: return (fieldname in checkFields)
828:
829:
830:
831:
832:
833: def manage_addMPIWGRootForm(self):
834: """form for adding the root"""
835: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
836: return pt()
837:
838: def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
839: """add a root folder"""
840: newObj=MPIWGRoot(id,title)
841: self._setObject(id,newObj)
842:
843: if RESPONSE is not None:
844: RESPONSE.redirect('manage_main')
845:
846:
847: class MPIWGProject(Folder):
848: """Class for Projects"""
849:
850: meta_type='MPIWGProject'
851:
852:
853: def versionHeader(self):
854: """version Header, gibt header text entsprechend der aktuellen version aus"""
855:
856: actualTime=time.localtime()
857: retTXT="""<h2>This is an outdated version, for the actual version please refer to <a href="%s">%s</a></h2>"""
858: s=self.aq_parent.absolute_url()
859: print getattr(self,'archiveTime',actualTime)
860: if getattr(self,'archiveTime',actualTime)< actualTime:
861: return retTXT%(s,s)
862: else:
863: return ""
864:
865: def copyObjectToArchive(self):
866: """kopiere aktuelles objekt ins archiv"""
867: cb=self.aq_parent.manage_copyObjects(self.getId())
868: self.manage_pasteObjects(cb)
869: actualTime=time.localtime()
870:
871: self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
872: obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
873: obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime))
874: ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])]
875: obj.manage_delObjects(ids)
876:
877: def setArchiveTime(self,time):
878: """set Archive Time"""
879: self.archiveTime=time[0:]
880:
881: def versionManageForm(self):
882: """version Manage form:currently only set to invisible"""
883: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self)
884: return pt()
885:
886: def versionManage(self,invisible=None,RESPONSE=None):
887: """version Manage form:currently only set to invisible"""
888: self.invisible=invisible
889:
890: if RESPONSE is not None:
891: RESPONSE.redirect('manage_main')
892:
893:
894: def crossLinker(self):
895: """experimental crosslinker"""
896: splitted=self.WEB_project_description[0].split()
897: new=[]
898: for split in splitted:
899: try:
900: found=self.DescriptionCatalog({'fulltext':split})
901:
902: if len(found)>1:
903:
904: new.append("<a href=%s>%s</a>"%(split,split))
905: else:
906: new.append(split)
907: except:
908: new.append(split)
909: return string.join(new)
910:
911:
912:
913:
914: def generateTemplate(self,RESPONSE=None):
915: """Erzeuge Template für defined fields not_used"""
916:
917: id="index_html"
918: title=id
919: if self._getOb('index_html'):
920: self._delObject('index_html')
921:
922:
923: newObj=ZopePageTemplate(id,'TEXT')
924: self._setObject(id,newObj)
925: #self.manage_addPageTemplate(id,title)
926: if RESPONSE is not None:
927: RESPONSE.redirect('manage_main')
928:
929: def __init__(self, id, argv=None):
930: """initieriere classe"""
931:
932: self.id=id
933: self.title=id
934: if argv:
935: for arg in definedFields:
936: try:
937: setattr(self,arg,argv[arg])
938: except:
939: setattr(self,arg,"")
940: else:
941: for arg in definedFields:
942: setattr(self,arg,'')
943:
944: manage_options = Folder.manage_options+(
945: {'label':'Load New File','action':'loadNewFileForm'},
946: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
947: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
948: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
949: {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'},
950: {'label':'Versionmanager','action':'versionManageForm'},
951: )
952:
953:
954: def checkDate(self,date):
955: """teste ob zum Zeitpunkt date eine andere version existierte"""
956:
957:
958: def sortProjectsByTime(x,y):
959: return cmp(x[1].archiveTime,y[1].archiveTime)
960:
961: finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
962: if not finds:
963: return self.absolute_url()
964: else:
965: finds.sort(sortProjectsByTime)
966:
967: for find in finds:
968: if int(find[1].archiveTime) > int(date):
969: return find[1].absolute_url()
970:
971: return self.absolute_url()
972:
973:
974:
975: def index_html(self):
976: """show homepage"""
977:
978: if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None:
979: self.REQUEST.SESSION['MPI_redirected']=1
980: self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']))
981: else:
982: self.REQUEST.SESSION['MPI_redirected']=None
983:
984: ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
985:
986: if ext:
987: return getattr(self,ext[0][1].getId())()
988:
989: pt=PageTemplateFile('Products/MPIWGWeb/zpt/project_main').__of__(self)
990: return pt()
991:
992:
993: def getDataFields(self):
994: """giveListofDatafields"""
995: ret=[]
996: for x in range(1,14):
997: if not x in [6,10,9]: # not used fields
998: ret.append('xdata_%02i'%x)
999: return ret
1000:
1001: def getDefinedFields(self):
1002: """show all defined fields"""
1003:
1004: return definedFields
1005:
1006: def getAttribute(self,field):
1007: """get attrbiute"""
1008: return getattr(self,field)
1009:
1010: def getContent(self,field):
1011: """Inhalt des Feldes"""
1012:
1013: text=u''
1014: #print "FIELD",field
1015: for x in getattr(self,field):
1016: #print "HIHIIII"
1017:
1018: try:
1019: text +=x.encode('utf-8')
1020: except:
1021: try:
1022: text =x.encode('utf-8')
1023: except:
1024: text=x.decode('latin-1').encode('utf-8')
1025:
1026: #delete separator (;) if is there is one
1027: ## try:
1028: ## print text, text[len(text)-1]
1029: ## except:
1030: ## print "error:",text
1031: try:
1032: if text[len(text)-1]==";":
1033: text=text[0:len(text)-1]
1034:
1035:
1036: except:
1037: """nothing"""
1038:
1039: text2=re.sub(r';([^\s])','; \g<1>',text)
1040: #teste ob ergebnis leer und header dann nehme title
1041:
1042: if (text2=='') and (field=='WEB_project_header'):
1043: return self.getContent('WEB_title')
1044:
1045: #teste ob WEB_project_description und keine führenden p tags
1046: if (len(text2)>4) and (not text2[0:3]=='<p>') and (field=='WEB_project_description'):
1047: return "<p>"+text2+"</p>"
1048: #if text2=="Otto Sibum":
1049: #text2="H. Otto Sibum"
1050: return text2
1051:
1052: def show_html(self):
1053: """simple index"""
1054: #return "HI"
1055: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
1056: return pt()
1057:
1058: def editMPIWGProjectForm(self):
1059: """editform"""
1060: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
1061: return pt()
1062:
1063: def editMPIWGProject(self,RESPONSE=None):
1064: """edit the project and archive the old version"""
1065:
1066: self.copyObjectToArchive() # archive the object
1067:
1068:
1069: for x in definedFields:
1070: if self.REQUEST.has_key(x):
1071:
1072: setattr(self,x,[self.REQUEST[x].decode('utf-8')])
1073:
1074:
1075:
1076: if RESPONSE is not None:
1077: RESPONSE.redirect('manage_main')
1078:
1079: def editMPIWGDisciplinesThemesForm(self):
1080: """edit the disciplines and themes Form"""
1081: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGDisciplinesThemes.zpt').__of__(self)
1082: return pt()
1083:
1084: def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None):
1085: """edit disciplin and form"""
1086: if disciplines:
1087: if type(disciplines) is StringType:
1088: self.xdata_09=disciplines
1089: else:
1090: self.xdata_09=string.join(disciplines,";")
1091: else:
1092: self.xdata_09=""
1093: if themes:
1094: if type(themes) is StringType:
1095: self.xdata_10=themes
1096: else:
1097: self.xdata_10=string.join(themes,";")
1098: else:
1099: self.xdata_10=""
1100:
1101: if RESPONSE is not None:
1102: RESPONSE.redirect('manage_main')
1103:
1104:
1105: def isChecked(self,wert,list):
1106: """check if wert is in ; seperated list"""
1107: print "W:",wert
1108: print "L:",list,type(list)
1109: #felder sind manchmnal als liste mit einem element definiert
1110: if type(list) is StringType or UnicodeType:
1111: splitted=list.split(";")
1112: else:
1113: splitted=list[0].split(";")
1114:
1115: print splitted
1116: for x in splitted:
1117: if (not x==u'') and x in wert:
1118: return 1
1119: return 0
1120:
1121: def editMPIWGBasisForm(self):
1122: """editform"""
1123: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
1124: return pt()
1125: def editMPIWGRelatedPublicationsForm(self):
1126: """Edit related Publications"""
1127: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
1128: return pt()
1129:
1130:
1131: def loadNewFileForm(self):
1132: """Neues XML-File einlesen"""
1133: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
1134: return pt()
1135:
1136: def loadNewFile(self,RESPONSE=None):
1137: """einlesen des neuen files"""
1138: fileupload=self.REQUEST['fileupload']
1139: if fileupload:
1140: file_name=fileupload.filename
1141: filedata=fileupload.read()
1142:
1143: argv=xmlhelper.proj2hash(filedata)
1144: #print argv.keys()
1145: for arg in definedFields:
1146:
1147: #print arg,argv[arg],getattr(self,arg)
1148: try:
1149: temp=argv[arg][0:]
1150: #old=getattr(self,arg)
1151: setattr(self,arg,temp)
1152: #print old,getattr(self,arg)
1153: except:
1154: """nothing"""
1155:
1156: if RESPONSE is not None:
1157: RESPONSE.redirect('manage_main')
1158:
1159: def manage_addMPIWGProjectForm(self):
1160: """form for adding the project"""
1161: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
1162: return pt()
1163:
1164: def manage_addMPIWGProject(self,id,RESPONSE=None):
1165: """method to add a project"""
1166: #print argv
1167: fileupload=self.REQUEST.get('fileupload',None)
1168: if fileupload:
1169: print fileupload
1170: file_name=fileupload.filename
1171: filedata=fileupload.read()
1172:
1173: argv=xmlhelper.proj2hash(filedata)
1174:
1175: #print argv
1176: newObj=MPIWGProject(id,argv)
1177: else:
1178: newObj=MPIWGProject(id)
1179:
1180: self._setObject(id,newObj)
1181:
1182:
1183: if RESPONSE is not None:
1184: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>