Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.47.2.86
1.9 dwinter 1: """This contains the class MPIWG Projects
1.42 dwinter 2: for organizing and maintaining the different project pages
1.47.2.86! dwinter 3:
! 4: $author dwinter - last change 26.06.2008
! 5:
1.6 dwinter 6: """
1.1 dwinter 7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
1.45 dwinter 9: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
1.47.2.22 dwinter 10: from OFS.Image import Image
1.34 dwinter 11: from Globals import package_home
1.12 dwinter 12: import urllib
1.1 dwinter 13: import re
1.34 dwinter 14: import os
1.5 dwinter 15: from types import *
1.47.2.71 dwinter 16: import logging
1.47.2.23 dwinter 17: import xmlhelper # Methoden zur Verwaltung der projekt xml
1.1 dwinter 18: from OFS.SimpleItem import SimpleItem
19: from OFS.Folder import Folder
1.47.2.86! dwinter 20:
1.47.2.21 dwinter 21: from AccessControl import ClassSecurityInfo
1.11 dwinter 22: from bibliography import *
1.42 dwinter 23: import time
1.47.2.86! dwinter 24: #import xml.dom.minidom
1.47.2.28 dwinter 25: import sys
1.47.2.86! dwinter 26: #from Ft.Xml.XPath import Evaluate
! 27: #from Ft.Xml.XPath.Context import Context
! 28: #from Ft.Xml.Domlette import NonvalidatingReader,PrettyPrint, Print
! 29: #from Ft.Xml import EMPTY_NAMESPACE
! 30: #import copy
! 31: #import updatePersonalWWW
! 32:
! 33: #import MPIWGStaff
1.11 dwinter 34:
1.47.2.84 dwinter 35: from MPIWGHelper import *
1.41 dwinter 36:
1.47.2.84 dwinter 37: import MPIWGRoot
38: import MPIWGLink
39: import MPIWGTemplate
1.5 dwinter 40:
1.47.2.86! dwinter 41: # die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus KompatibilitŠtsgrŸnden, bleiben die Klassen hier noch drin.
! 42: # Sonst funktionieren die alten Webseiten nicht mehr.
! 43:
1.47.2.84 dwinter 44: class MPIWGRoot(MPIWGRoot.MPIWGRoot):
45: """depricated"""
1.5 dwinter 46:
1.47.2.84 dwinter 47: class MPIWGLink(MPIWGLink.MPIWGLink):
48: """depricated"""
1.1 dwinter 49:
1.47.2.84 dwinter 50: class MPIWGTemplate(MPIWGTemplate.MPIWGTemplate):
51: """depricated"""
1.47.2.71 dwinter 52:
1.47.2.22 dwinter 53: class MPIWGProject_publication(SimpleItem):
54: """publications object fuer project"""
55:
56: meta_type="MPIWGProject_publication"
57:
58: def editPublication(self,text=None,RESPONSE=None):
59: """edit a publication"""
60:
61: if (not text):
62: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self)
63: return pt()
64:
65:
66: self.text=text[0:]
67:
68: if RESPONSE:
69: RESPONSE.redirect("../managePublications")
70:
71: class MPIWGProject_image(Image):
72: """Images for Projects"""
73:
74: meta_type="MPIWGProject_image"
75:
76: def showImage(self,imageUrl=None):
77: """show Images at an extra page"""
78: self.getContent('WEB_project_description',filter='yes') #get the content and store image infos into session
79: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','projectImageView.zpt')).__of__(self)
80: return pt()
81:
82: def editImage(self,file=None,caption=None,RESPONSE=None):
83: """edit the Image"""
84: if (not file) and (not caption):
85: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_imageForm.zpt')).__of__(self)
86: return pt()
87:
88: if file and (not file.filename.lstrip().rstrip()==""):
89: self.manage_upload(file)
90:
91: if caption:
92: self.caption=caption[0:]
93:
94: if RESPONSE:
95: RESPONSE.redirect("../manageImages")
96:
1.45 dwinter 97: class MPIWGProject(CatalogAware,Folder):
1.1 dwinter 98: """Class for Projects"""
1.47.2.22 dwinter 99:
100:
1.47.2.21 dwinter 101: security=ClassSecurityInfo()
1.1 dwinter 102: meta_type='MPIWGProject'
1.45 dwinter 103: default_catalog='ProjectCatalog'
1.47.2.22 dwinter 104:
1.47.2.79 casties 105: def decode(self,str):
106: """return unicode object"""
107: return unicodify(str)
1.47.2.57 dwinter 108:
1.47.2.22 dwinter 109: def sortedByPlace(self,metatype):
110: """find metatype and sort by place"""
111: def sort(x,y):
112: return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
113:
114: founds=self.ZopeFind(self,obj_metatypes=[metatype]);
115:
116: founds.sort(sort)
117:
118: return founds
1.45 dwinter 119:
1.47.2.22 dwinter 120:
121: def copyPublicationsToList(self,RESPONSE=None):
122: """copy publications in to list"""
123:
124: publicationTxt=self.getContent('WEB_related_pub')
125:
126: pubSplits=publicationTxt.split("<p>")
127:
128: for pubSplit in pubSplits:
129: pubSplit=pubSplit.replace("</p>","")
130: self.addPublication(pubSplit)
131:
132: if RESPONSE:
133: RESPONSE.redirect('managePublications')
134:
135:
1.47.2.47 dwinter 136: def copyImageToMargin(self,RESPONSE=None):
1.47.2.22 dwinter 137: """copy inline images to marginal images"""
1.47.2.47 dwinter 138:
139:
140: #getImages from WEB_project_description
141: description=self.getContent('WEB_project_description')
142:
143: text2=description
144: splitted=text2.split("""<p class="picture">""")
145:
146: imageURLs=[]
147: imageCaptions=[]
148: for split in splitted[1:]:
149: tmp=split.split("</p>")
150: #return repr(splitted[1])
1.47.2.84 dwinter 151:
1.47.2.47 dwinter 152: try:
153: imageURLs.append(tmp[0].split("\"")[1].encode('utf-8'))
154: except:
1.47.2.84 dwinter 155:
156: try:
1.47.2.47 dwinter 157: imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
1.47.2.84 dwinter 158: except:
159: imageURLs.append("")
1.47.2.47 dwinter 160:
161: split2="</p>".join(tmp[1:])
162:
163:
164: splitted=split2.split("""<p class="picturetitle">""")
165: if len(splitted)>1:
166: tmp=splitted[1].split("</p>")
167: imageCaptions.append(tmp[0].encode('utf-8'))
1.47.2.22 dwinter 168:
169:
1.47.2.47 dwinter 170: else:
171: #keine caption
172:
173: imageCaptions.append("")
1.47.2.71 dwinter 174:
175:
1.47.2.47 dwinter 176: #eintragen:
177: for imageURL in imageURLs:
178: filename=imageURL.split("/")[-1]
179: #lege neues images object an, mit leerem bild
180:
181: if self.ZopeFind(self,obj_ids=[filename]):
182: #existiert das bild schon, dann neuen filenamen
183: filename="project_image_"+filename
184:
185: self.addImage(None,imageCaptions[imageURLs.index(imageURL)],filename=filename)
186: #hole die bilddaten aus der url
187: url=self.absolute_url()+"/"+imageURL
188: #url=self.absolute_url()+"/"+filename
189:
190: try:#relative url
191: data=urllib.urlopen(url).read()
1.47.2.34 dwinter 192: except:
1.47.2.47 dwinter 193: try:#absolute
194: data=urllib.urlopen(self.imageURL).read()
195: except:
1.47.2.71 dwinter 196: logger("MPIWG Project",logging.ERROR,"can't open: %s"%url)
1.47.2.34 dwinter 197:
1.47.2.47 dwinter 198: obj=getattr(self,filename)
199: obj.update_data(data)
1.47.2.22 dwinter 200:
201: if RESPONSE:
202: RESPONSE.redirect('manageImages')
203:
204: def manageImages(self,imageName=None,op=None):
205: """managage images"""
206:
207:
208: if imageName and op:
209: if op=='up':
210: images=self.getImages()
211: for image in images:
212: if image[0]==imageName:
213: nr=images.index(image)
214: if not nr==0:
215: images[nr-1][1].place+=1
216: images[nr][1].place-=1
217: pass
218: elif op=='down':
219: images=self.getImages()
220: for image in images:
221: if image[0]==imageName:
222: nr=images.index(image)
223: if not (nr==len(images)-1):
224: images[nr+1][1].place-=1
225: images[nr][1].place+=1
226: pass
227:
228:
229: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_manageImagesForm.zpt')).__of__(self)
230: return pt()
231:
232: def managePublications(self,pubName=None,op=None):
233: """managage images"""
234:
235:
236: if pubName and op:
237: if op=='up':
238: publications=self.getPublications()
239: for publication in publications:
240: if publication[0]==pubName:
241: nr=publications.index(publication)
242: if not nr==0:
243: publications[nr-1][1].place+=1
244: publications[nr][1].place-=1
245: pass
246: elif op=='down':
247: publications=self.getPublications()
248: for publication in publications:
249: if publication[0]==pubName:
250: nr=publications.index(publication)
251: if not (nr==len(publications)-1):
252: publications[nr+1][1].place-=1
253: publications[nr][1].place+=1
254: pass
255:
256:
257: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_managePublicationsForm.zpt')).__of__(self)
258: return pt()
259:
260: def getPublications(self):
261: """get all Publications"""
262: def sort_images(x,y):
263: return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
1.47.2.25 dwinter 264:
1.47.2.22 dwinter 265: publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_publication'])
266:
267: publications.sort(sort_images)
268: return publications
269:
270: def addPublication(self,text,RESPONSE=None):
271: """add an MPIWG_Publication"""
272:
273: name="publication_"+str(self.getLastPublicationNumber()+1)
274:
275: newPublication=MPIWGProject_publication(name)
276:
277: self._setObject(name,newPublication)
278: obj=getattr(self,name)
279: obj.text=text[0:]
280: obj.enabled=True;
281: obj.place=self.getLastPublicationNumber()+1
282: obj.id=name
283:
284: if RESPONSE is not None:
285: RESPONSE.redirect('managePublications')
286:
287:
288: def getLastPublicationNumber(self):
289: publications=self.getPublications()
290:
291: if not publications:
292: return 0
293: else:
294: return getattr(publications[-1][1],'place',0)
295:
1.47.2.70 dwinter 296: def deletePublication(self,id,RESPONSE=None):
1.47.2.84 dwinter 297: """delete Publication id"""
298: self.manage_delObjects([id])
299: if RESPONSE:
300: RESPONSE.redirect('managePublications')
301:
1.47.2.22 dwinter 302: def getImages(self):
303: """get all Images"""
1.47.2.68 dwinter 304:
1.47.2.22 dwinter 305: def sort_images(x,y):
306: return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
1.47.2.25 dwinter 307:
1.47.2.68 dwinter 308:
1.47.2.84 dwinter 309: if (getattr(self,'imageURL','')!='') or (getattr(self,'imagecap','')!='') :
310: try:
311: self.addImage(None,getattr(self,'imagecap',''),RESPONSE=None,filename=getattr(self,'imageURL',''))
312: except:
313: pass
314: self.imageURL=''
315: self.imagecap=''
1.47.2.68 dwinter 316:
1.47.2.22 dwinter 317: images=self.ZopeFind(self,obj_metatypes=['MPIWGProject_image'])
318:
319: images.sort(sort_images)
320: return images
321:
322: def getLastImageNumber(self):
323: images=self.getImages()
324:
325: if not images:
326: return 0
327: else:
328: return getattr(images[-1][1],'place',0)
329:
330: def deleteImage(self,id,RESPONSE=None):
331: """delete Image id"""
332: self.manage_delObjects([id])
333: if RESPONSE:
334: RESPONSE.redirect('manageImages')
335:
1.47.2.59 dwinter 336:
1.47.2.80 dwinter 337: def hasChildren(self,date=None,onlyActive=1,onlyArchived=1):
1.47.2.54 dwinter 338: """check if project has children"""
339: ct=self.getContexts(childs=self.getContent('xdata_05'),
340: depth=1,date=date,onlyActive=onlyActive)
341:
342: if ct and len(ct)>0:
343: return True
344: else:
345: return False
1.47.2.68 dwinter 346:
1.47.2.54 dwinter 347:
1.47.2.22 dwinter 348: def addImage(self,fileHd,caption,RESPONSE=None,filename=None):
349: """add an MPIWG_Project_image"""
350:
351: if not filename:
352: filename=fileHd.filename
353:
354: if not fileHd:
355: fileHd=file(os.path.join(package_home(globals()),'blank.gif'))
356:
357: newImage=MPIWGProject_image(filename,filename,fileHd)
358:
359: self._setObject(filename,newImage)
360: obj=getattr(self,filename)
361: obj.caption=caption[0:]
362: obj.enabled=True;
363: obj.place=self.getLastImageNumber()+1
1.47.2.68 dwinter 364: obj.id=filename
365:
1.47.2.22 dwinter 366: if RESPONSE is not None:
367: RESPONSE.redirect('manageImages')
368:
1.45 dwinter 369: def PrincipiaSearchSource(self):
370: """Return cataloguable key for ourselves."""
371: return str(self)
1.42 dwinter 372:
373: def versionHeader(self):
374: """version Header, gibt header text entsprechend der aktuellen version aus"""
375:
376: actualTime=time.localtime()
377: retTXT="""<h2>This is an outdated version, for the actual version please refer to <a href="%s">%s</a></h2>"""
378: s=self.aq_parent.absolute_url()
1.43 dwinter 379: #print getattr(self,'archiveTime',actualTime)
1.42 dwinter 380: if getattr(self,'archiveTime',actualTime)< actualTime:
381: return retTXT%(s,s)
382: else:
383: return ""
1.47.2.18 dwinter 384:
385: def getActualVersion(self,date=None):
386: """actuelle version"""
387: def sortProjectsByTime(x,y):
388: return cmp(x[1].archiveTime,y[1].archiveTime)
389:
390: if not date:
391: if self.isActual():
392: return self
393: else:
394: return None
395:
396: #suche ob aeltere versionen vorhanden sind
397:
398: finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
399: if not finds: #wenn nicht dann teste ob die aktuelle version schon existiert hat.
400: ad=getattr(self,'creationTime','20050101000000')
401: if int(date)>int(ad):
402: return self
403: else:
404: return None
405:
406:
407: else:
408: finds.sort(sortProjectsByTime)
409:
410: for find in finds:
411: #gehe durch die alten Projekte und finde das entprechende
412: if (int(find[1].archiveTime) > int(date)) and (int(date)>int(getattr(find[1],'creationTime','20050101000000'))):
413: return find[1]
414:
415: #kein passendes gefunden, dann teste ob das aktuelle in frage kommt
416: ad=getattr(self,'creationTime','20050101000000')
417:
418: if int(date)>int(ad):
419:
420: return self
421: else:
422: return None
423:
424:
1.43 dwinter 425: def isActual(self):
426: """gibt 1 zurueck wenn aktuell, 0 sonst"""
427: actualTime=time.localtime()
428:
429:
430: #print getattr(self,'archiveTime',actualTime)
431: if getattr(self,'archiveTime',actualTime)< actualTime:
432: return 0
433: else:
434: return 1
1.42 dwinter 435:
436: def copyObjectToArchive(self):
437: """kopiere aktuelles objekt ins archiv"""
438: cb=self.aq_parent.manage_copyObjects(self.getId())
439: self.manage_pasteObjects(cb)
440: actualTime=time.localtime()
441:
442: self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
443: obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
444: obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime))
445: ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])]
446: obj.manage_delObjects(ids)
447:
448: def setArchiveTime(self,time):
449: """set Archive Time"""
450: self.archiveTime=time[0:]
451:
1.41 dwinter 452: def versionManageForm(self):
453: """version Manage form:currently only set to invisible"""
454: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self)
455: return pt()
456:
457: def versionManage(self,invisible=None,RESPONSE=None):
458: """version Manage form:currently only set to invisible"""
459: self.invisible=invisible
460:
461: if RESPONSE is not None:
462: RESPONSE.redirect('manage_main')
463:
1.38 dwinter 464:
1.3 dwinter 465: def crossLinker(self):
466: """experimental crosslinker"""
467: splitted=self.WEB_project_description[0].split()
468: new=[]
469: for split in splitted:
470: try:
471: found=self.DescriptionCatalog({'fulltext':split})
472:
473: if len(found)>1:
474:
475: new.append("<a href=%s>%s</a>"%(split,split))
476: else:
477: new.append(split)
478: except:
479: new.append(split)
1.47.2.86! dwinter 480: return " ".join(new)
1.3 dwinter 481:
482:
483:
1.1 dwinter 484:
485: def generateTemplate(self,RESPONSE=None):
1.47.2.65 casties 486: """Erzeuge Template fuer defined fields not_used"""
1.1 dwinter 487:
488: id="index_html"
489: title=id
490: if self._getOb('index_html'):
491: self._delObject('index_html')
492:
493:
494: newObj=ZopePageTemplate(id,'TEXT')
495: self._setObject(id,newObj)
496: #self.manage_addPageTemplate(id,title)
497: if RESPONSE is not None:
498: RESPONSE.redirect('manage_main')
499:
1.5 dwinter 500: def __init__(self, id, argv=None):
1.47.2.18 dwinter 501: """initiere classe"""
502:
503: self.creationTime=time.strftime("%Y%m%d%H%M%S",time.localtime())[0:]
1.1 dwinter 504: self.id=id
505: self.title=id
1.47.2.54 dwinter 506: self.isActiveFlag=True #Flag is true is the project is still active, False if accomplished
1.47.2.83 dwinter 507: self.responsibleScientistsList=[] # enthaelt die Lister der verantwortlichen Wissenschaftler in der Form (NAME, KEY), key ist "" flass Wissenschaftler nicht an unserem Haus
1.47.2.54 dwinter 508:
1.5 dwinter 509: if argv:
510: for arg in definedFields:
1.47.2.25 dwinter 511: try:
512: setattr(self,arg,argv[arg])
513: except:
514: setattr(self,arg,"")
1.5 dwinter 515: else:
516: for arg in definedFields:
517: setattr(self,arg,'')
1.1 dwinter 518:
519: manage_options = Folder.manage_options+(
520: {'label':'Load New File','action':'loadNewFileForm'},
521: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
522: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
523: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
1.9 dwinter 524: {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'},
1.41 dwinter 525: {'label':'Versionmanager','action':'versionManageForm'},
1.1 dwinter 526: )
1.33 casties 527:
528:
1.47.2.54 dwinter 529: def isActiveProject(self):
530: """check if the project is still active, default is true, set to false is the project is accomplished"""
531: return getattr(self,'isActiveFlag',True)
1.47.2.80 dwinter 532:
533: def isArchivedProject(self):
534: """check if the project is archived"""
535:
536: completed=getattr(self,'completedAt',0)
537:
538: #completed leer
539: if completed=="" :
540: return False;
541: if completed == 0:
542: return False;
543:
544:
545: return True
546:
1.47.2.54 dwinter 547:
548: def setActiveFlag(self,status=True):
549: """set the active flag"""
550: self.isActiveFlag=status
551:
1.47.2.80 dwinter 552: def setCompletedAt(self,date):
553: """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""
554: logging.info("DATE:"+repr(date))
555: transformedDate=self.transformDate(date);
556: logging.info("transformed"+repr(transformedDate))
557: if transformedDate is not None:
558: setattr(self,"completedAt",transformedDate)
559: return True;
560: else:
561: return False;
562:
563: def getCompletedAt(self):
564: """gibt das transformierte Datum zurŸck"""
565: date=getattr(self,'completedAt','')
566: if date:
567: return self.reTransformDate(date);
568: else:
569: return '';
570:
571: def reTransformDate(self,date):
572: """transformiert , transformdate zurueck"""
573: year=int(date/10000)
574: month=int((date-year*10000)/100)
575: day=int((date-year*10000-month*100))
576: return """%s.%s.%s"""%(day,month,year);
577:
578:
579: def transformDate(self,date):
580: """transformiert ein Datum von DD.MM.YYYY, MM.YYYY,YYYY nach YYYYMMDD, alle nicht angebebenn Werte
581: werden auf 0 gesetzt, es wird null zurŸckgegeben falls das Datum ungueltig ist"""
582:
583: if (date=="" ) :
584: return "";
585:
586: if (date==None):
587: return None;
588:
589: splitted=date.split(".")
590: length=len(splitted)
591: year=0
592: month=0
593: day=0
594: if length > 3:
595: return "";
596: if length==3:
597: day = int(splitted[0])
598: if length>1:
599: month=int(splitted[length-2])
600:
601: if length > 0:
602: try:
603: year = int(splitted[length-1])
604: except:
605: pass
606:
607: ## logging.info("month:"+(month))
608: if not (0<=month<13):
609: return None;
610:
611: if not(0<=day<32):
612: return None;
613:
614: if (year>0) and (year<1900): #jahr nicht vierstellig eingegeben
615: year=2000+year;
616: return year*10000+month*100+day
617:
618:
619:
1.42 dwinter 620: def checkDate(self,date):
621: """teste ob zum Zeitpunkt date eine andere version existierte"""
622:
623:
624: def sortProjectsByTime(x,y):
625: return cmp(x[1].archiveTime,y[1].archiveTime)
1.47.2.18 dwinter 626:
627: #suche ob aeltere versionen vorhanden sind
628:
1.42 dwinter 629: finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
1.47.2.18 dwinter 630: if not finds: #wenn nicht dann teste ob die aktuelle version schon existiert hat.
631: ad=getattr(self,'creationTime','20050101000000')
632: if int(date)>int(ad):
633: return self.REQUEST['URL1']+"/"+self.getId()
634: else:
635: return self.REQUEST['URL1']+"/no_project"
636:
637:
1.42 dwinter 638: else:
639: finds.sort(sortProjectsByTime)
640:
641: for find in finds:
1.47.2.18 dwinter 642: #gehe durch die alten Projekte und finde das entprechende
643: if (int(find[1].archiveTime) > int(date)) and (int(date)>int(getattr(find[1],'creationTime','20050101000000'))):
644: return self.REQUEST['URL1']+"/"+find[1].getId()
1.42 dwinter 645:
1.47.2.18 dwinter 646: #kein passendes gefunden, dann teste ob das aktuelle in frage kommt
647: ad=getattr(self,'creationTime','20050101000000')
648:
649: if int(date)>int(ad):
650:
651: return self.REQUEST['URL1']+"/"+self.getId()
652: else:
653: return self.REQUEST['URL1']+"/no_project"
1.42 dwinter 654:
655:
1.47.2.18 dwinter 656: def no_project(self):
657: """warnung: project noch nicht existent"""
658: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self)
659: return pt()
1.47.2.55 dwinter 660:
1.47.2.59 dwinter 661: def getGetNeighbourhood(self,wordStr, length=100,tagging=True):
1.47.2.65 casties 662: """finde umgebung um die worte in wordStr, zurueckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte
1.47.2.55 dwinter 663: alle Tags werden entfernt, die Fundstellen werden mit <span class="found">XX</span> getaggt, die Umgebungen werden
664: case insensitive gesucht
665: @param wordStr: string mit Worten getrennt durch Leerzeichen, Phrasen sind mit " gekennzeichnet
666: "eine phrase", "*" bezeichnet wildcards und wird ignoriert"
1.47.2.65 casties 667: @param length: optional, default wert 100, 2*length ist die groesse der Umgebung
1.47.2.59 dwinter 668: @param tagging: optional default wert true, kein span tag wird erzweugt falls tag=false
1.47.2.55 dwinter 669: """
670:
1.47.2.65 casties 671: ret=[] # nimmt das Array auf, dass spaeter zurueckgegeben wird
1.47.2.55 dwinter 672: ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt
673:
674: def isInRanges(nr,length):
1.47.2.65 casties 675: """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurueck,
1.47.2.55 dwinter 676: -1, wenn kein Treffer
677:
1.47.2.65 casties 678: @param nr: Position die geprueft werden soll
679: @param length: Laenge des Wortes das geprueft werden soll
1.47.2.55 dwinter 680: """
681: for x in ranges:
682: if (x[0]<=nr) and (nr < (x[1]-length)):
683: return ranges.index(x)
684: return -1
685:
686: # deal with phrases, in Phrasen werden die Leerzeichen durch "_" ersetzt.
687: def rep_empty(str):
688: x= re.sub(" ","_",str.group(0))
689: return re.sub("\"","",x)
690:
691: wordStr=re.sub("\".*?\"", rep_empty,wordStr)#ersetze leerzeichen in " " durch "_" und loesche "
692:
693: #deal with wildcards, for our purposes it is enough to delete the wildcard
694: wordStr=wordStr.replace("*","")
695:
696: words=wordStr.split(" ")
697: #if not words is ListType:
698: # words=[words]
699:
700: txt=self.harvest_page()
1.47.2.59 dwinter 701: if not txt:
702: return ret
1.47.2.55 dwinter 703: txt=re.sub("<.*?>", "", txt) # loesche alle Tags
704: for word in words:
705: word=re.sub("_"," ",word) # ersetze zurueck "_" durch " "
706: pos=0
707:
708: n=txt.lower().count(word.lower()) # wie oft tritt das Wort auf
709:
710: for i in range(n):
711: pos=txt.lower().find(word.lower(),pos)
712:
713: if pos > 0:
714: x=max(0,pos-length)
715: y=min(len(txt),pos+length)
716:
717:
718: #is word already in one of the results
719: nr=isInRanges(pos,len(word))
1.47.2.65 casties 720: if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergroessere diese
1.47.2.55 dwinter 721: x=min(ranges[nr][0],x)
722: y=max(ranges[nr][1],y)
723:
724: str=txt[x:y]
725:
726: if nr >=0: # word ist in einer schon gefunden Umgebung
727: ranges[nr]=(x,y) # neue Position der Umgebung
728:
729: ret[nr]=str # neue Umgebung
1.47.2.65 casties 730: else: # andernfalls neue Umgebung hinzufuegen
1.47.2.55 dwinter 731: ranges.append((x,y))
732:
733: ret.append(str)
734:
735: pos=pos+len(word)
736: else:
737: break;
738:
739: # now highlight everything
1.47.2.59 dwinter 740: if tagging:
741: for x in range(len(ret)):
742: for word in words:
743: repl=re.compile(word,re.IGNORECASE)
744: ret[x]=repl.sub(""" <span class="found">%s</span>"""%word.upper(),ret[x])
1.47.2.55 dwinter 745:
746: return ret
747:
748: def harvest_page(self,context=None):
749: """seite fuer harvesting fuer die Projektsuche"""
750: if not context:
751: context=self
752:
753: if self.isActiveProject() and self.isActual():
754: ext=getattr(self,"harvest_main",None)
755: if ext:
756: return getattr(self,ext.getId())()
757:
758: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_main')).__of__(context)
759:
760:
761: return pt()
762:
1.47.2.20 dwinter 763: def index_html(self,request=True,context=None):
1.33 casties 764: """show homepage"""
1.47.2.20 dwinter 765: if not context:
766: context=self
767: if request:
768: if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None:
769: self.REQUEST.SESSION['MPI_redirected']=1
770: self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date'])+"?date="+self.REQUEST['date'])
771: else:
772: self.REQUEST.SESSION['MPI_redirected']=None
1.42 dwinter 773:
1.47.2.25 dwinter 774: #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
1.47.2.18 dwinter 775: ext=getattr(self,"project_main",None)
1.33 casties 776: if ext:
1.47.2.18 dwinter 777: return getattr(self,ext.getId())()
1.33 casties 778:
1.47.2.20 dwinter 779: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','project_main')).__of__(context)
780:
1.33 casties 781: return pt()
1.1 dwinter 782:
1.38 dwinter 783:
1.1 dwinter 784: def getDataFields(self):
785: """giveListofDatafields"""
786: ret=[]
787: for x in range(1,14):
1.17 dwinter 788: if not x in [6,10,9]: # not used fields
789: ret.append('xdata_%02i'%x)
1.1 dwinter 790: return ret
791:
792: def getDefinedFields(self):
793: """show all defined fields"""
794:
795: return definedFields
796:
797: def getAttribute(self,field):
798: """get attrbiute"""
799: return getattr(self,field)
800:
1.47.2.4 dwinter 801: def getContent(self,field,filter=None):
1.1 dwinter 802: """Inhalt des Feldes"""
803:
804: text=u''
1.46 dwinter 805:
1.1 dwinter 806: for x in getattr(self,field):
807:
808: try:
1.46 dwinter 809: text +=x
1.1 dwinter 810: except:
1.46 dwinter 811: text = x
812:
1.9 dwinter 813:
1.46 dwinter 814:
1.9 dwinter 815: try:
816: if text[len(text)-1]==";":
1.21 dwinter 817: text=text[0:len(text)-1]
818:
819:
1.9 dwinter 820: except:
1.46 dwinter 821: pass
822:
823: if text=='':
824: text2=text
825: else:
826: text2=re.sub(r';([^\s])','; \g<1>',text)
1.16 dwinter 827:
1.30 dwinter 828: #teste ob ergebnis leer und header dann nehme title
829:
830: if (text2=='') and (field=='WEB_project_header'):
831: return self.getContent('WEB_title')
832:
1.47.2.4 dwinter 833: if filter:
834: splitted=text2.split("""<p class="picture">""")
1.47.2.5 dwinter 835: if len(splitted)>1:
836: tmp=splitted[1].split("</p>")
1.47.2.25 dwinter 837: #return repr(splitted[1])
1.47.2.10 dwinter 838: try:
1.47.2.25 dwinter 839: self.imageURL=tmp[0].split("\"")[1].encode('utf-8')
840: except:
1.47.2.84 dwinter 841: try:
1.47.2.25 dwinter 842: self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')
1.47.2.84 dwinter 843: except:
844: self.imageURL=""
1.47.2.68 dwinter 845:
1.47.2.5 dwinter 846: split2="</p>".join(tmp[1:])
847:
848: text3=splitted[0]+split2
849:
850: splitted=text3.split("""<p class="picturetitle">""")
851: if len(splitted)>1:
852: tmp=splitted[1].split("</p>")
1.47.2.25 dwinter 853: self.imagecap=tmp[0].encode('utf-8')
1.47.2.11 dwinter 854:
1.47.2.5 dwinter 855: split4="".join(tmp[1:])
1.47.2.4 dwinter 856:
1.47.2.5 dwinter 857: text5=splitted[0]+split4
858: else:
859: #keine caption
860: text5=text3
861: else:
862: #kein bild
863: text5=text2
1.47.2.4 dwinter 864: else:
865: text5=text2
866:
1.47.2.65 casties 867: #teste ob WEB_project_description und keine fuehrenden p tags
1.47.2.4 dwinter 868: if (len(text5)>4) and (not text5[0:3]=='<p>') and (field=='WEB_project_description'):
1.47.2.11 dwinter 869: text5= "<p>"+text5+"</p>"
1.46 dwinter 870:
871:
1.47.2.4 dwinter 872: #filter image
873:
1.47.2.68 dwinter 874: text5=text5.lstrip().rstrip() #loescher leerzeichen und einzelndes br
1.47.2.84 dwinter 875: if (text5=="<br>") or (text5=="<br/>"):
876: text5=""
1.47.2.11 dwinter 877:
1.47.2.84 dwinter 878: logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5)))
1.47.2.79 casties 879: #return unicodify(text5)
880: return utf8ify(text5) # return as utf-8 byte string
881:
1.47.2.9 dwinter 882:
883: def showImagesOfPage(self,imageUrl=None):
884: """show Images of project"""
885: self.getContent('WEB_project_description',filter='yes') #get the content and store image infos into session
886: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','projectImageView.zpt')).__of__(self)
887: return pt()
888:
1.47.2.22 dwinter 889:
1.1 dwinter 890: def show_html(self):
891: """simple index"""
892: #return "HI"
1.45 dwinter 893: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_index.zpt')).__of__(self)
1.1 dwinter 894: return pt()
895:
1.47.2.20 dwinter 896: def saveFromPreview(self):
897: """save content aus preview"""
898: self.WEB_project_description=self.previewTemplate.WEB_project_description[0:]
899: self.REQUEST.RESPONSE.redirect("./index.html")
900:
901: def saveEditedContent(self,kupu=None,preview=None):
902: """save Edited content"""
903:
1.47.2.23 dwinter 904: if preview:
905: kupu=preview
1.47.2.20 dwinter 906: #find content of body tags
907: start=kupu.find("<body>")
908: end=kupu.find("</body>")
909: newcontent= kupu[start+6:end]
1.47.2.43 dwinter 910:
1.47.2.20 dwinter 911: if preview:
1.47.2.23 dwinter 912:
1.47.2.20 dwinter 913: return self.preview(newcontent)
914:
1.47.2.23 dwinter 915: self.copyObjectToArchive()
1.47.2.20 dwinter 916: self.WEB_project_description=newcontent[0:]
917:
1.47.2.23 dwinter 918: self.REQUEST.RESPONSE.redirect("./index.html")
1.47.2.20 dwinter 919:
920: return True
1.47.2.21 dwinter 921:
1.47.2.33 dwinter 922: security.declareProtected('View management screens','edit')
1.47.2.24 dwinter 923: def edit(self,western=None):
1.47.2.20 dwinter 924: """Edit pages"""
1.47.2.24 dwinter 925: if western:
926: self.REQUEST.RESPONSE.setCookie("MP_debug_code","western",path="/")
927:
928:
1.47.2.20 dwinter 929: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProjectNeu.zpt')).__of__(self)
930: return pt()
1.47.2.36 casties 931:
932: edit_MPIWGProject_main = PageTemplateFile('zpt/edit_MPIWGProject_main', globals())
933:
934: def getPathStyle(self, path, selected, style=""):
935: """returns a string with the given style + 'sel' if path == selected."""
936:
937: if path == selected:
938: return style + 'sel'
939: else:
940: return style
1.47.2.20 dwinter 941:
942: def preview(self,description):
943: """preview"""
944: tmpPro=getattr(self,"previewTemplate",None)
945: if not tmpPro:
946: tmpPro=MPIWGProject("previewTemplate")
947: self._setObject("previewTemplate",tmpPro)
948: for field in definedFields:
949: setattr(tmpPro,field,getattr(self,field))
950: tmpPro.WEB_project_description=description[0:]
1.47.2.37 dwinter 951: tmpPro.invisible=True
1.47.2.20 dwinter 952: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','previewFrame.zpt')).__of__(self)
953: return pt()
954:
955: #return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate")
956:
957:
958: def getWebProject_description(self):
959: """get description"""
1.47.2.24 dwinter 960: debug= self.REQUEST.cookies.get("MP_debug_code",None)
1.47.2.20 dwinter 961:
1.47.2.24 dwinter 962: if debug and debug=="western":
1.47.2.23 dwinter 963: return """
964: <html>
965: <head>
966: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
967: </head>
968: <body>%s
969: </html></body>
1.47.2.24 dwinter 970: """%self.WEB_project_description[0]
971:
972: return """
973: <html>
974: <head>
975: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
976: </head>
977: <body>%s
978: </html></body>
1.47.2.23 dwinter 979: """%self.getContent('WEB_project_description')
1.47.2.24 dwinter 980:
1.47.2.20 dwinter 981:
982:
1.1 dwinter 983: def editMPIWGProjectForm(self):
984: """editform"""
1.45 dwinter 985: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProject.zpt')).__of__(self)
1.1 dwinter 986: return pt()
987:
1.47.2.83 dwinter 988: def isResponsibleScientist(self,key):
989: """teste ob eine Person in der Liste der respl. scientists auftaucht"""
990: #logging.info("XXXXXXXXXXXXX"+repr(self.responsibleScientistsList))
991:
992:
993: keys = [x[1] for x in getattr(self,"responsibleScientistsList",[])]
994:
995: if key in keys:
996: return True
997: else:
998: return False
999:
1000: def getPersonKeyList(self):
1001: """gibt die key Lister der beteiligten Personen zurŸck"""
1002: return [x[1] for x in getattr(self,'responsibleScientistsList',[])]
1003:
1004:
1005:
1006:
1007: def identifyNames(self,nameList):
1008: """Bekommt eine Komma oder Semikolon getrennte Liste mit Name der Form Vorname MittelName(n) Nachname
1009: und ordnet diese dann Mitarbeiter IDs zu falls es schone eine Liste gibt wird im Projekte gibt wird diese Upgedated.
1010: @param nameList
1011: """
1012: nameList=nameList.replace(";",",") # falls ; als Trenner ersetze
1013: names=nameList.split(",")
1014:
1015: returnNamesDict={}
1016:
1017:
1018: for name in names:
1019: name=name.lstrip().rstrip()
1020: nameSplitted = name.split(" ")
1021: if len(nameSplitted)>1: #vor und nachname angegeben)
1022:
1023: lastname=nameSplitted[-1]
1024: firstname=nameSplitted[0]
1025: else:
1026: firstname =""
1027: lastname=nameSplitted[0]
1028:
1029: #finde Mitarbeiter mit den entsprechenden Name
1030: logging.info("Search: %s %s %s"%(name,firstname,lastname))
1031: cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname)
1032:
1033: #Teste ob die ensprechenden Namen schon der Liste zu geordnet sind
1034: #if not hasattr(self,'responsibleScientistsList'):
1035: # self.responsibleScientistsList={}
1036: #
1037: # if name in self.responsibleScientistsList.values()
1038:
1039: if len(cataloggedNames)>0:
1040: returnNamesDict[name]=cataloggedNames
1041: else:
1042: returnNamesDict[name]=[]
1043:
1044: return returnNamesDict
1045:
1.47.2.20 dwinter 1046: def editMPIWGProject(self,RESPONSE=None,fromEdit=None):
1.42 dwinter 1047: """edit the project and archive the old version"""
1048:
1049: self.copyObjectToArchive() # archive the object
1050:
1.22 dwinter 1051:
1.1 dwinter 1052: for x in definedFields:
1053: if self.REQUEST.has_key(x):
1054:
1.9 dwinter 1055: setattr(self,x,[self.REQUEST[x].decode('utf-8')])
1.42 dwinter 1056:
1.47.2.83 dwinter 1057:
1058:
1.47.2.67 casties 1059:
1.47.2.80 dwinter 1060: completedAt = self.REQUEST.get('completedAt')
1061: if not self.setCompletedAt(completedAt):
1062: RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong')
1063:
1.47.2.67 casties 1064: if self.REQUEST.has_key('historicalNames'):
1065: self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))
1.47.2.64 dwinter 1066:
1.47.2.54 dwinter 1067: if self.REQUEST.has_key('active'):
1068: self.setActiveFlag(True)
1069: else:
1070: self.setActiveFlag(False)
1.47.2.83 dwinter 1071:
1072: self.responsibleScientistsList=[] # setze die Liste der verantwortlichen Wissenschaftler zurueck
1073:
1074: names={}
1075: keys={}
1076: tmpList=[]
1077: for key in self.REQUEST.keys(): #gehe durch das Formular
1078: splitted=key.split("_")
1079: if splitted[0]=="responsibleScientist": #wenn es ein Feld der Form reponsibleScientist_nr_KEY gibt
1080: nr=splitted[2]
1081: if splitted[1]=="name":
1082: names[nr]=self.REQUEST[key]
1083: elif splitted[1]=="key":
1084: keys[nr]=self.REQUEST[key]
1085:
1086:
1087: for nr in names.keys():
1088: tmpList.append((names[nr],keys.get(nr,"")))
1089:
1090: self.responsibleScientistsList=tmpList
1.47.2.20 dwinter 1091: if fromEdit and (RESPONSE is not None):
1.47.2.83 dwinter 1092: #RESPONSE.redirect('./editMPIWGBasisEditor')
1093: return self.editMPIWGBasisEditor(identifiedNames=self.identifyNames(self.REQUEST.get('xdata_01','')))
1094:
1.47.2.20 dwinter 1095: else:
1096: if RESPONSE is not None:
1097: RESPONSE.redirect('manage_main')
1.1 dwinter 1098:
1.47.2.20 dwinter 1099:
1.47.2.21 dwinter 1100:
1101: security.declareProtected('View managment screens','editMPIWGDisciplinesThemesEditor')
1.47.2.20 dwinter 1102: def editMPIWGDisciplinesThemesEditor(self):
1103: """edit from edit"""
1104: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGDisciplinesThemesNeu.zpt')).__of__(self)
1105: return pt()
1106:
1107:
1.9 dwinter 1108: def editMPIWGDisciplinesThemesForm(self):
1109: """edit the disciplines and themes Form"""
1.47.2.20 dwinter 1110:
1.45 dwinter 1111: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGDisciplinesThemes.zpt')).__of__(self)
1.9 dwinter 1112: return pt()
1113:
1.47.2.20 dwinter 1114: def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None,fromEdit=None):
1.9 dwinter 1115: """edit disciplin and form"""
1116: if disciplines:
1117: if type(disciplines) is StringType:
1118: self.xdata_09=disciplines
1119: else:
1.47.2.86! dwinter 1120: self.xdata_09=";".join(disciplines)
1.9 dwinter 1121: else:
1122: self.xdata_09=""
1123: if themes:
1124: if type(themes) is StringType:
1125: self.xdata_10=themes
1126: else:
1.47.2.86! dwinter 1127: self.xdata_10=";".join(themes)
1.9 dwinter 1128: else:
1129: self.xdata_10=""
1.47.2.20 dwinter 1130:
1131: if fromEdit and (RESPONSE is not None):
1132: RESPONSE.redirect('./editMPIWGDisciplinesThemesEditor')
1133:
1134: else:
1135: if RESPONSE is not None:
1136: RESPONSE.redirect('manage_main')
1.9 dwinter 1137:
1138:
1139: def isChecked(self,wert,list):
1140: """check if wert is in ; seperated list"""
1.46 dwinter 1141:
1.9 dwinter 1142: #felder sind manchmnal als liste mit einem element definiert
1143: if type(list) is StringType or UnicodeType:
1144: splitted=list.split(";")
1145: else:
1146: splitted=list[0].split(";")
1147:
1.47.2.12 dwinter 1148: splitted=[y.rstrip().lstrip() for y in splitted]
1149:
1.9 dwinter 1150: for x in splitted:
1.47.2.35 dwinter 1151: x=re.sub(r"[^A-z ]","",x)
1.9 dwinter 1152: if (not x==u'') and x in wert:
1153: return 1
1154: return 0
1.47.2.20 dwinter 1155:
1.47.2.21 dwinter 1156: security.declareProtected('View management screens','editMPIWGBasisEditor')
1.47.2.83 dwinter 1157: def editMPIWGBasisEditor(self, identifiedNames=None):
1158:
1.47.2.20 dwinter 1159: """editform"""
1.47.2.83 dwinter 1160: if not identifiedNames:
1161: identifiedNames=self.identifyNames(self.getContent('xdata_01'))
1162: # identifiedNames=self.getFullNameEntries()
1163:
1.47.2.20 dwinter 1164: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self)
1.47.2.83 dwinter 1165: return pt(identifiedNames=identifiedNames)
1.47.2.20 dwinter 1166:
1.47.2.33 dwinter 1167: security.declareProtected('View management screens','editMPIWGBasisForm')
1.9 dwinter 1168: def editMPIWGBasisForm(self):
1169: """editform"""
1.45 dwinter 1170: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasis.zpt')).__of__(self)
1.9 dwinter 1171: return pt()
1.47.2.20 dwinter 1172:
1.47.2.33 dwinter 1173: security.declareProtected('View management screens','editMPIWGRelatedPublicationsForm')
1.9 dwinter 1174: def editMPIWGRelatedPublicationsForm(self):
1175: """Edit related Publications"""
1.45 dwinter 1176: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGRelatedPublications.zpt')).__of__(self)
1.9 dwinter 1177: return pt()
1.1 dwinter 1178:
1.9 dwinter 1179:
1.1 dwinter 1180: def loadNewFileForm(self):
1181: """Neues XML-File einlesen"""
1.45 dwinter 1182: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_newfile.zpt')).__of__(self)
1.1 dwinter 1183: return pt()
1184:
1185: def loadNewFile(self,RESPONSE=None):
1186: """einlesen des neuen files"""
1187: fileupload=self.REQUEST['fileupload']
1188: if fileupload:
1189: file_name=fileupload.filename
1190: filedata=fileupload.read()
1191:
1192: argv=xmlhelper.proj2hash(filedata)
1193: #print argv.keys()
1194: for arg in definedFields:
1195:
1196: #print arg,argv[arg],getattr(self,arg)
1197: try:
1198: temp=argv[arg][0:]
1199: #old=getattr(self,arg)
1200: setattr(self,arg,temp)
1201: #print old,getattr(self,arg)
1202: except:
1203: """nothing"""
1204:
1205: if RESPONSE is not None:
1206: RESPONSE.redirect('manage_main')
1207:
1208: def manage_addMPIWGProjectForm(self):
1209: """form for adding the project"""
1.45 dwinter 1210: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGProjectForm.zpt')).__of__(self)
1.1 dwinter 1211: return pt()
1212:
1213: def manage_addMPIWGProject(self,id,RESPONSE=None):
1214: """method to add a project"""
1215: #print argv
1.20 dwinter 1216: fileupload=self.REQUEST.get('fileupload',None)
1217: if fileupload:
1.46 dwinter 1218:
1.20 dwinter 1219: file_name=fileupload.filename
1220: filedata=fileupload.read()
1221:
1222: argv=xmlhelper.proj2hash(filedata)
1223:
1224: #print argv
1.5 dwinter 1225: newObj=MPIWGProject(id,argv)
1226: else:
1227: newObj=MPIWGProject(id)
1.1 dwinter 1228:
1229: self._setObject(id,newObj)
1230:
1.47.2.18 dwinter 1231:
1.1 dwinter 1232: if RESPONSE is not None:
1.47.2.75 casties 1233: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>