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