Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.8
1.6 dwinter 1: """This files contains the class MPIWG Projects
2: for organizing and maintaining the different projectspages
3:
4: """
1.1 dwinter 5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
6: from Products.PageTemplates.PageTemplate import PageTemplate
7: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
8:
9: import MPIWGStaff
10: import string
11: import re
1.5 dwinter 12: from types import *
1.1 dwinter 13:
14: import xmlhelper # Methoden zur Verwaltung der projekt xmls
15: from OFS.SimpleItem import SimpleItem
16: from OFS.Folder import Folder
17:
18: 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']
19:
20: checkFields = ['xdata_01']
21:
22: def sortF(x,y):
1.5 dwinter 23:
24: return cmp(x[1],y[1])
1.1 dwinter 25:
1.5 dwinter 26: def sortI(x,y):
27: xsplit=x[1].split(".")
28: ysplit=y[1].split(".")
29: xret=""
30: yret=""
31: try:
32: for i in range(5):
33: try:
34: yret=yret+"%04i"%int(xsplit[i])
35: except:
36: yret=yret+"%04i"%0
37:
38: try:
39: xret=xret+"%04i"%int(ysplit[i])
40: except:
41: xret=xret+"%04i"%0
42:
43:
44: return cmp(int(yret),int(xret))
45: except:
46: return cmp(x[1],y[1])
1.1 dwinter 47:
1.5 dwinter 48:
1.1 dwinter 49: class MPIWGRoot(Folder):
50: """Stammordner für den Web-Server"""
51:
52: folders=['MPIWGProject','Folder']
53: meta_type='MPIWGRoot'
1.8 ! dwinter 54:
! 55: def sortedNames(self,list):
! 56: """sort names"""
! 57:
! 58: def sortLastName(x,y):
! 59: try:
! 60: last_x=x.split()[len(x.split())-1]
! 61: last_y=y.split()[len(y.split())-1]
! 62:
! 63: except:
! 64:
! 65: last_x=""
! 66: last_y=""
! 67:
! 68:
! 69:
! 70: if last_x<last_y:
! 71: return 1
! 72: elif last_x>last_y:
! 73: return -1
! 74: else:
! 75: return 0
! 76:
! 77: list.sort(sortLastName)
! 78: list.reverse()
! 79:
! 80: return list
1.1 dwinter 81:
82: def __init__(self, id, title):
83: """init"""
84: self.id=id
85: self.title=title
1.8 ! dwinter 86:
! 87: def harvestHistoricalPersons(self):
! 88: """erstelle liste aller erwaehnten actors"""
! 89:
! 90: def normalize(str):
! 91: """loesche fuhrendes space"""
! 92: if (len(str)>1) and (str[0]==" "):
! 93: ret=str[1:]
! 94: else:
! 95: ret=str
! 96: return ret
! 97:
! 98: list={}
! 99: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
! 100:
! 101: for project in projects:
! 102: lg=len(project[1].xdata_03[0])-1
! 103:
! 104: if (lg>1) and (project[1].xdata_03[0][lg]==";"):
! 105: project[1].xdata_03[0]=project[1].xdata_03[0][0:lg-1]
! 106:
! 107:
! 108:
! 109:
! 110: try:
! 111: if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ;
! 112: for person in project[1].xdata_03[0].split(";"):
! 113: personNormal=normalize(person)
! 114: if personNormal in list.keys():
! 115: list[personNormal].append(project[1])
! 116: else:
! 117: list[personNormal]=[project[1]]
! 118: else: #guess , is sepeator
! 119: for person in project[1].xdata_03[0].split(","):
! 120: personNormal=normalize(person)
! 121: if personNormal in list.keys():
! 122: list[personNormal].append(project[1])
! 123: else:
! 124: list[personNormal]=[project[1]]
! 125:
! 126: except:
! 127: print "ERROR",project
! 128:
! 129: return list
! 130:
! 131: def storeHistoricalPersons(self,RESPONSE=None):
! 132: """store persons"""
! 133: self.personDict={}
! 134: personDict=self.harvestHistoricalPersons()
! 135: for person in personDict.keys():
! 136: for project in personDict[person]:
! 137: if person in self.personDict.keys():
! 138: self.personDict[person].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0]))
! 139: else:
! 140: self.personDict[person]=[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])]
1.1 dwinter 141:
1.8 ! dwinter 142: if RESPONSE is not None:
! 143: RESPONSE.redirect("showHistoricalPersons")
! 144:
! 145:
! 146: def showHistoricalPersons(self):
! 147: """show persons"""
! 148: pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self)
! 149: return pt()
! 150:
! 151:
! 152: def editHistoricalPersonsForm(self):
! 153: """edit historical persons for consistency"""
! 154: pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self)
! 155: return pt()
! 156:
! 157: def getProjectsByFieldContent(self,fieldName,fieldContentsEntry):
! 158: """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents"""
! 159: if type(fieldContentsEntry) is StringType:
! 160: fieldContents=[fieldContentsEntry]
! 161: else:
! 162: fieldContents=fieldContentsEntry
! 163:
! 164: projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')})
! 165: #print projects
! 166: return projects
! 167:
! 168: def changeMPIWGRootForm(self):
! 169: """edit"""
! 170: pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self)
! 171: return pt()
! 172:
! 173: def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None):
! 174: """change"""
! 175: self.title=title
! 176: self.disciplineList=disciplineList
! 177: self.themesList=themesList
! 178:
! 179: if RESPONSE is not None:
! 180: RESPONSE.redirect('manage_main')
! 181:
! 182:
! 183: def test(self):
! 184: """test"""
! 185: return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url
! 186:
1.5 dwinter 187: def getProjectFields(self,fieldName,folder=None,sort=None):
1.1 dwinter 188: """getListofFieldNames"""
189: ret=[]
190: #print "FN",fieldName
191: if not folder:
192: folder=self
193: for object in folder.__dict__:
194:
195: obj=getattr(folder,object)
196: if hasattr(obj,'meta_type'):
1.5 dwinter 197: #print obj.meta_type
1.1 dwinter 198: if obj.meta_type=='MPIWGProject':
1.5 dwinter 199: if fieldName=="WEB_title_or_short":
200: #print "HI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
201: #print len(obj.getContent('xdata_07'))
202: if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
203: fieldNameTmp="WEB_title"
204: else:
205: fieldNameTmp="xdata_07"
206: else:
207: fieldNameTmp=fieldName
1.1 dwinter 208:
1.5 dwinter 209: ret.append((obj,obj.getContent(fieldNameTmp)))
210:
1.1 dwinter 211: if obj.meta_type in self.folders:
212:
213: ret += self.getProjectFields(fieldName,obj)
1.5 dwinter 214:
215: if sort=="int":
216: ret.sort(sortI)
217: else:
218: ret.sort(sortF)
1.1 dwinter 219:
220: return ret
221:
1.5 dwinter 222: def showNewProjects(self):
223: projects=[]
224: for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
225: if objs[0].xdata_05[0] == "":
226:
227: projects.append(objs)
228:
229: return projects
230:
231:
1.1 dwinter 232: manage_options = Folder.manage_options+(
233: {'label':'Import Persons','action':'importNamesForm'},
1.8 ! dwinter 234: {'label':'Main config','action':'changeMPIWGRootForm'},
! 235: {'label':'Store Historical Persons','action':'storeHistoricalPersons'},
1.1 dwinter 236: )
237:
238: def importNamesForm(self):
239: """Form"""
240: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self)
241: return pt()
242:
243: def importNames(self,fileupload,folderName,RESPONSE=None):
244: """import komma-sep list email,lastName,firstName"""
245: project=getattr(self,folderName)
246:
247: for line in fileupload.readlines():
1.4 dwinter 248: #print line
1.1 dwinter 249: splitted=line.split(",")
250: if not (splitted[0]==""):
251: newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
252: try:
253: project._setObject(splitted[0],newObj)
254: except:
255: print "not done:",splitted[0]
256: if RESPONSE is not None:
257: RESPONSE.redirect('manage_main')
258:
1.3 dwinter 259: def getAllMembers(self):
260: """give list of all members"""
261: ret=[]
262:
263: for x in self.members.objectValues('MPIWGStaff'):
1.4 dwinter 264: #print x.title
1.3 dwinter 265: ret.append(x.title)
266:
267: ret.sort()
268: return ret
269:
1.5 dwinter 270: def makeList(self,entry):
271: """makes a list out of one entry or repeat a list"""
272: if type(entry) is StringType:
273: return [entry]
274: else:
275: return entry
276:
277:
278: def getTree(self):
279: """generate Tree from project list"""
280: returnList=[]
281: for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
282: for idNr in project[1].split(";"): # more than one number
283: if not idNr=="":
284: splittedId=idNr.split(".")
285: depth=len(splittedId)
286: nr=idNr
287: title=project[0].WEB_title
288: returnList.append((depth,nr,title,project[0]))
289:
290: return returnList
291:
292: def changePosition(self,treeId,select,RESPONSE=None):
293: """Change Postion Entry"""
294: numbers=[]
295:
296: # Suche hoechste bisherige nummer
297: projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
1.8 ! dwinter 298: #print "pj",projects
1.5 dwinter 299: for project in projects: #suche alle subtrees der treeId
300: #print treeId
301:
302: founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
303: if founds:
304: #print "x",founds.group(0),len(founds.group(0).split("."))
305: if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
306: try:
307: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
308: except:
1.6 dwinter 309: numbers.append(int(0))
310:
311: try:
312: highest=max(numbers)
313: except:
314: highest=0
1.5 dwinter 315: projects=self.showNewProjects()
316: for i in self.makeList(select):
317: highest+=10
318: projects[int(i)][0].xdata_05=treeId+"."+str(highest)
319:
320:
321: if RESPONSE is not None:
322: RESPONSE.redirect('showTree')
323:
324: def changeTree(self,RESPONSE=None):
325: """change the complete tree"""
326: form=self.REQUEST.form
327: hashList={}
328: fields=self.getTree()
329:
330:
331: for idNr in form.keys():
332: fields[int(idNr)][3].xdata_05=form[idNr]
333:
334:
335:
336: if RESPONSE is not None:
337: RESPONSE.redirect('showTree')
338:
339: def getProjectWithId(self,id):
340: fields=self.getProjectFields('xdata_05')
341: for field in fields:
342: if field[1]==id:
343: return field[0]
344:
345: return None
346:
347:
348:
349:
350:
351:
1.3 dwinter 352: def getUrlFromPerson(self,list):
353: """get urls to person list"""
354: ret=[]
355: persons=list.split(";")
356: for person in persons:
357:
358: splitted=person.split(",")
359: if len(splitted)==1:
360: splitted=person.split(" ")
361: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
362: if splittedNew[0]=='':
363: del splittedNew[0]
364: search=string.join(splittedNew,' AND ')
365: if not search=='':
1.4 dwinter 366:
367: try:
368: proj=self.MembersCatalog({'title':search})
369: except:
370: proj=None
1.3 dwinter 371:
372: if proj:
373: ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person))
374: else:
375: ret.append("%s"%person)
376: return string.join(ret,";")
377:
378: def getProjectsOfMembers(self):
379: """give tuple member /projects"""
380: ret=[]
381: members=self.getAllMembers()
382: for x in members:
383: splitted=x.split(",")
384:
385: proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')})
386: if proj:
387: ret.append((x,proj))
388: return ret
1.1 dwinter 389: def givePersonList(self,name):
390: """check if person is in personfolder and return list of person objects"""
1.3 dwinter 391:
392: splitted=name.split(",")
393: if len(splitted)==1:
394: splitted=name.split(" ")
395: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
396: if splittedNew[0]=='':
397: del splittedNew[0]
398: search=string.join(splittedNew,' AND ')
399: if not search=='':
400: proj=self.MembersCatalog({'title':search})
401:
402: if proj:
403: return [[x.lastName,x.firstName] for x in proj]
404: else:
405: return []
406:
407: ## splitted=name.split(",") # version nachname, vorname...
408: ## if len(splitted)>1:
409: ## lastName=splitted[0]
410: ## firstName=splitted[1]
411: ## else:
412: ## splitted=name.split(" ") #version vorname irgenwas nachnamae
413:
414: ## lastName=splitted[len(splitted)-1]
415: ## firstName=string.join(splitted[0:len(splitted)-1])
416:
417: ## objs=[]
1.1 dwinter 418:
1.3 dwinter 419: #print self.members
420: ## for x in self.members.__dict__:
421: ## obj=getattr(self.members,x)
422: ## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
1.1 dwinter 423:
1.3 dwinter 424: ## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
1.1 dwinter 425:
1.3 dwinter 426: ## objs.append((obj,lastName+", "+firstName))
1.1 dwinter 427:
1.3 dwinter 428:
1.1 dwinter 429: return objs
430:
431:
432: def personCheck(self,names):
433: """all persons for list"""
1.4 dwinter 434: #print "names",names
1.1 dwinter 435: splitted=names.split(";")
436: ret={}
437: for name in splitted:
438:
439: if not (name==""):
1.3 dwinter 440: try:
441: ret[name]=self.givePersonList(name)
442: except:
443: """NOTHIHN"""
1.4 dwinter 444: #print "RET",ret
1.1 dwinter 445: return ret
446:
447: def giveCheckList(self,person,fieldname):
448: """return checklist"""
449: #print "GCL",fieldname
450: if fieldname=='xdata_01':
451: x=self.personCheck(person.getContent(fieldname))
1.4 dwinter 452: #print "GCLBACKX",x
1.1 dwinter 453: return x
454:
455:
456: def isCheckField(self,fieldname):
457: """return chechfield"""
458:
459: return (fieldname in checkFields)
460:
461:
462:
463:
464: def manage_addMPIWGRootForm(self):
465: """form for adding the root"""
466: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
467: return pt()
468:
469: def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
470: """add a root folder"""
471: newObj=MPIWGRoot(id,title)
472: self._setObject(id,newObj)
473:
474: if RESPONSE is not None:
475: RESPONSE.redirect('manage_main')
476:
477:
478: class MPIWGProject(Folder):
479: """Class for Projects"""
480:
481: meta_type='MPIWGProject'
482:
1.3 dwinter 483: def crossLinker(self):
484: """experimental crosslinker"""
485: splitted=self.WEB_project_description[0].split()
486: new=[]
487: for split in splitted:
488: try:
489: found=self.DescriptionCatalog({'fulltext':split})
490:
491: if len(found)>1:
492:
493: new.append("<a href=%s>%s</a>"%(split,split))
494: else:
495: new.append(split)
496: except:
497: new.append(split)
498: return string.join(new)
499:
500:
501:
1.1 dwinter 502:
503: def generateTemplate(self,RESPONSE=None):
504: """Erzeuge Template für defined fields not_used"""
505:
506: id="index_html"
507: title=id
508: if self._getOb('index_html'):
509: self._delObject('index_html')
510:
511:
512: newObj=ZopePageTemplate(id,'TEXT')
513: self._setObject(id,newObj)
514: #self.manage_addPageTemplate(id,title)
515: if RESPONSE is not None:
516: RESPONSE.redirect('manage_main')
517:
1.5 dwinter 518: def __init__(self, id, argv=None):
1.1 dwinter 519: """initieriere classe"""
520:
521: self.id=id
522: self.title=id
1.5 dwinter 523: if argv:
524: for arg in definedFields:
1.7 dwinter 525: try:
526: setattr(self,arg,argv[arg])
527: except:
528: setattr(self,arg,"")
1.5 dwinter 529: else:
530: for arg in definedFields:
531: setattr(self,arg,'')
1.1 dwinter 532:
533: manage_options = Folder.manage_options+(
534: {'label':'Load New File','action':'loadNewFileForm'},
535: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
536: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
537: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
538: )
539:
540: def getDataFields(self):
541: """giveListofDatafields"""
542: ret=[]
543: for x in range(1,14):
544: ret.append('xdata_%02i'%x)
545: return ret
546:
547: def getDefinedFields(self):
548: """show all defined fields"""
549:
550: return definedFields
551:
552: def getAttribute(self,field):
553: """get attrbiute"""
554: return getattr(self,field)
555:
556: def getContent(self,field):
557: """Inhalt des Feldes"""
558:
559: text=u''
560: #print "FIELD",field
561: for x in getattr(self,field):
562: #print "HIHIIII"
563:
564: try:
565: text +=x
566: except:
567: try:
568: text =x
569: except:
570: text="ERROR"
1.5 dwinter 571: #print "TEXT",text.encode('ascii','ignore')
1.1 dwinter 572: return text
573:
574: def show_html(self):
575: """simple index"""
576: #return "HI"
577: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
578: return pt()
579:
580: def editMPIWGProjectForm(self):
581: """editform"""
582: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
583: return pt()
584:
585: def editMPIWGBasisForm(self):
586: """editform"""
587: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
588: return pt()
589: def editMPIWGRelatedPublicationsForm(self):
590: """Edit related Publications"""
591: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
592: return pt()
593:
594: def editMPIWGProject(self,RESPONSE=None):
595: """edit the project"""
596:
597: #return self.REQUEST
598: for x in definedFields:
599: if self.REQUEST.has_key(x):
600:
601: setattr(self,x,[self.REQUEST[x]])
602:
603: if RESPONSE is not None:
604: RESPONSE.redirect('manage_main')
605:
606:
607: def loadNewFileForm(self):
608: """Neues XML-File einlesen"""
609: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
610: return pt()
611:
612: def loadNewFile(self,RESPONSE=None):
613: """einlesen des neuen files"""
614: fileupload=self.REQUEST['fileupload']
615: if fileupload:
616: file_name=fileupload.filename
617: filedata=fileupload.read()
618:
619: argv=xmlhelper.proj2hash(filedata)
620: #print argv.keys()
621: for arg in definedFields:
622:
623: #print arg,argv[arg],getattr(self,arg)
624: try:
625: temp=argv[arg][0:]
626: #old=getattr(self,arg)
627: setattr(self,arg,temp)
628: #print old,getattr(self,arg)
629: except:
630: """nothing"""
631:
632: if RESPONSE is not None:
633: RESPONSE.redirect('manage_main')
634:
635: def manage_addMPIWGProjectForm(self):
636: """form for adding the project"""
637: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
638: return pt()
639:
640: def manage_addMPIWGProject(self,id,RESPONSE=None):
641: """method to add a project"""
642: #print argv
1.5 dwinter 643: if self.REQUEST.has_key('fileupload'):
644: fileupload=self.REQUEST['fileupload']
645: if fileupload:
646: file_name=fileupload.filename
647: filedata=fileupload.read()
1.1 dwinter 648:
1.5 dwinter 649: argv=xmlhelper.proj2hash(filedata)
1.1 dwinter 650:
1.5 dwinter 651: #print argv
652: newObj=MPIWGProject(id,argv)
653: else:
654: newObj=MPIWGProject(id)
1.1 dwinter 655:
656: self._setObject(id,newObj)
657:
658:
659: if RESPONSE is not None:
660: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>