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