1: """This files contains the class MPIWG Projects
2: for organizing and maintaining the different projectspages
3:
4: """
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
12: from types import *
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):
23:
24: return cmp(x[1],y[1])
25:
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])
47:
48:
49: class MPIWGRoot(Folder):
50: """Stammordner für den Web-Server"""
51:
52: folders=['MPIWGProject','Folder']
53: meta_type='MPIWGRoot'
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
81:
82: def __init__(self, id, title):
83: """init"""
84: self.id=id
85: self.title=title
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])]
141:
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:
187: def getProjectFields(self,fieldName,folder=None,sort=None):
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'):
197: #print obj.meta_type
198: if obj.meta_type=='MPIWGProject':
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
208:
209: ret.append((obj,obj.getContent(fieldNameTmp)))
210:
211: if obj.meta_type in self.folders:
212:
213: ret += self.getProjectFields(fieldName,obj)
214:
215: if sort=="int":
216: ret.sort(sortI)
217: else:
218: ret.sort(sortF)
219:
220: return ret
221:
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:
232: manage_options = Folder.manage_options+(
233: {'label':'Import Persons','action':'importNamesForm'},
234: {'label':'Main config','action':'changeMPIWGRootForm'},
235: {'label':'Store Historical Persons','action':'storeHistoricalPersons'},
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():
248: #print line
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:
259: def getAllMembers(self):
260: """give list of all members"""
261: ret=[]
262:
263: for x in self.members.objectValues('MPIWGStaff'):
264: #print x.title
265: ret.append(x.title)
266:
267: ret.sort()
268: return ret
269:
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
298: #print "pj",projects
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:
309: numbers.append(int(0))
310:
311: try:
312: highest=max(numbers)
313: except:
314: highest=0
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:
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=='':
366:
367: try:
368: proj=self.MembersCatalog({'title':search})
369: except:
370: proj=None
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
389: def givePersonList(self,name):
390: """check if person is in personfolder and return list of person objects"""
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=[]
418:
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'):
423:
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)):
425:
426: ## objs.append((obj,lastName+", "+firstName))
427:
428:
429: return objs
430:
431:
432: def personCheck(self,names):
433: """all persons for list"""
434: #print "names",names
435: splitted=names.split(";")
436: ret={}
437: for name in splitted:
438:
439: if not (name==""):
440: try:
441: ret[name]=self.givePersonList(name)
442: except:
443: """NOTHIHN"""
444: #print "RET",ret
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))
452: #print "GCLBACKX",x
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:
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:
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:
518: def __init__(self, id, argv=None):
519: """initieriere classe"""
520:
521: self.id=id
522: self.title=id
523: if argv:
524: for arg in definedFields:
525: try:
526: setattr(self,arg,argv[arg])
527: except:
528: setattr(self,arg,"")
529: else:
530: for arg in definedFields:
531: setattr(self,arg,'')
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"
571: #print "TEXT",text.encode('ascii','ignore')
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
643: if self.REQUEST.has_key('fileupload'):
644: fileupload=self.REQUEST['fileupload']
645: if fileupload:
646: file_name=fileupload.filename
647: filedata=fileupload.read()
648:
649: argv=xmlhelper.proj2hash(filedata)
650:
651: #print argv
652: newObj=MPIWGProject(id,argv)
653: else:
654: newObj=MPIWGProject(id)
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>