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 __init__(self, id, title):
56: """init"""
57: self.id=id
58: self.title=title
59:
60: def getProjectFields(self,fieldName,folder=None,sort=None):
61: """getListofFieldNames"""
62: ret=[]
63: #print "FN",fieldName
64: if not folder:
65: folder=self
66: for object in folder.__dict__:
67:
68: obj=getattr(folder,object)
69: if hasattr(obj,'meta_type'):
70: #print obj.meta_type
71: if obj.meta_type=='MPIWGProject':
72: if fieldName=="WEB_title_or_short":
73: #print "HI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
74: #print len(obj.getContent('xdata_07'))
75: if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
76: fieldNameTmp="WEB_title"
77: else:
78: fieldNameTmp="xdata_07"
79: else:
80: fieldNameTmp=fieldName
81:
82: ret.append((obj,obj.getContent(fieldNameTmp)))
83:
84: if obj.meta_type in self.folders:
85:
86: ret += self.getProjectFields(fieldName,obj)
87:
88: if sort=="int":
89: ret.sort(sortI)
90: else:
91: ret.sort(sortF)
92:
93: return ret
94:
95: def showNewProjects(self):
96: projects=[]
97: for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
98: if objs[0].xdata_05[0] == "":
99:
100: projects.append(objs)
101:
102: return projects
103:
104:
105: manage_options = Folder.manage_options+(
106: {'label':'Import Persons','action':'importNamesForm'},
107: )
108:
109: def importNamesForm(self):
110: """Form"""
111: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self)
112: return pt()
113:
114: def importNames(self,fileupload,folderName,RESPONSE=None):
115: """import komma-sep list email,lastName,firstName"""
116: project=getattr(self,folderName)
117:
118: for line in fileupload.readlines():
119: #print line
120: splitted=line.split(",")
121: if not (splitted[0]==""):
122: newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
123: try:
124: project._setObject(splitted[0],newObj)
125: except:
126: print "not done:",splitted[0]
127: if RESPONSE is not None:
128: RESPONSE.redirect('manage_main')
129:
130: def getAllMembers(self):
131: """give list of all members"""
132: ret=[]
133:
134: for x in self.members.objectValues('MPIWGStaff'):
135: #print x.title
136: ret.append(x.title)
137:
138: ret.sort()
139: return ret
140:
141: def makeList(self,entry):
142: """makes a list out of one entry or repeat a list"""
143: if type(entry) is StringType:
144: return [entry]
145: else:
146: return entry
147:
148:
149: def getTree(self):
150: """generate Tree from project list"""
151: returnList=[]
152: for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
153: for idNr in project[1].split(";"): # more than one number
154: if not idNr=="":
155: splittedId=idNr.split(".")
156: depth=len(splittedId)
157: nr=idNr
158: title=project[0].WEB_title
159: returnList.append((depth,nr,title,project[0]))
160:
161: return returnList
162:
163: def changePosition(self,treeId,select,RESPONSE=None):
164: """Change Postion Entry"""
165: numbers=[]
166:
167: # Suche hoechste bisherige nummer
168: projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
169: print "pj",projects
170: for project in projects: #suche alle subtrees der treeId
171: #print treeId
172:
173: founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
174: if founds:
175: #print "x",founds.group(0),len(founds.group(0).split("."))
176: if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
177: try:
178: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
179: except:
180: numbers.append(int(0))
181:
182: try:
183: highest=max(numbers)
184: except:
185: highest=0
186: projects=self.showNewProjects()
187: for i in self.makeList(select):
188: highest+=10
189: projects[int(i)][0].xdata_05=treeId+"."+str(highest)
190:
191:
192: if RESPONSE is not None:
193: RESPONSE.redirect('showTree')
194:
195: def changeTree(self,RESPONSE=None):
196: """change the complete tree"""
197: form=self.REQUEST.form
198: hashList={}
199: fields=self.getTree()
200:
201:
202: for idNr in form.keys():
203: fields[int(idNr)][3].xdata_05=form[idNr]
204:
205:
206:
207: if RESPONSE is not None:
208: RESPONSE.redirect('showTree')
209:
210: def getProjectWithId(self,id):
211: fields=self.getProjectFields('xdata_05')
212: for field in fields:
213: if field[1]==id:
214: return field[0]
215:
216: return None
217:
218:
219:
220:
221:
222:
223: def getUrlFromPerson(self,list):
224: """get urls to person list"""
225: ret=[]
226: persons=list.split(";")
227: for person in persons:
228:
229: splitted=person.split(",")
230: if len(splitted)==1:
231: splitted=person.split(" ")
232: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
233: if splittedNew[0]=='':
234: del splittedNew[0]
235: search=string.join(splittedNew,' AND ')
236: if not search=='':
237:
238: try:
239: proj=self.MembersCatalog({'title':search})
240: except:
241: proj=None
242:
243: if proj:
244: ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person))
245: else:
246: ret.append("%s"%person)
247: return string.join(ret,";")
248:
249: def getProjectsOfMembers(self):
250: """give tuple member /projects"""
251: ret=[]
252: members=self.getAllMembers()
253: for x in members:
254: splitted=x.split(",")
255:
256: proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')})
257: if proj:
258: ret.append((x,proj))
259: return ret
260: def givePersonList(self,name):
261: """check if person is in personfolder and return list of person objects"""
262:
263: splitted=name.split(",")
264: if len(splitted)==1:
265: splitted=name.split(" ")
266: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
267: if splittedNew[0]=='':
268: del splittedNew[0]
269: search=string.join(splittedNew,' AND ')
270: if not search=='':
271: proj=self.MembersCatalog({'title':search})
272:
273: if proj:
274: return [[x.lastName,x.firstName] for x in proj]
275: else:
276: return []
277:
278: ## splitted=name.split(",") # version nachname, vorname...
279: ## if len(splitted)>1:
280: ## lastName=splitted[0]
281: ## firstName=splitted[1]
282: ## else:
283: ## splitted=name.split(" ") #version vorname irgenwas nachnamae
284:
285: ## lastName=splitted[len(splitted)-1]
286: ## firstName=string.join(splitted[0:len(splitted)-1])
287:
288: ## objs=[]
289:
290: #print self.members
291: ## for x in self.members.__dict__:
292: ## obj=getattr(self.members,x)
293: ## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
294:
295: ## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
296:
297: ## objs.append((obj,lastName+", "+firstName))
298:
299:
300: return objs
301:
302:
303: def personCheck(self,names):
304: """all persons for list"""
305: #print "names",names
306: splitted=names.split(";")
307: ret={}
308: for name in splitted:
309:
310: if not (name==""):
311: try:
312: ret[name]=self.givePersonList(name)
313: except:
314: """NOTHIHN"""
315: #print "RET",ret
316: return ret
317:
318: def giveCheckList(self,person,fieldname):
319: """return checklist"""
320: #print "GCL",fieldname
321: if fieldname=='xdata_01':
322: x=self.personCheck(person.getContent(fieldname))
323: #print "GCLBACKX",x
324: return x
325:
326:
327: def isCheckField(self,fieldname):
328: """return chechfield"""
329:
330: return (fieldname in checkFields)
331:
332:
333:
334:
335: def manage_addMPIWGRootForm(self):
336: """form for adding the root"""
337: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
338: return pt()
339:
340: def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
341: """add a root folder"""
342: newObj=MPIWGRoot(id,title)
343: self._setObject(id,newObj)
344:
345: if RESPONSE is not None:
346: RESPONSE.redirect('manage_main')
347:
348:
349: class MPIWGProject(Folder):
350: """Class for Projects"""
351:
352: meta_type='MPIWGProject'
353:
354: def crossLinker(self):
355: """experimental crosslinker"""
356: splitted=self.WEB_project_description[0].split()
357: new=[]
358: for split in splitted:
359: try:
360: found=self.DescriptionCatalog({'fulltext':split})
361:
362: if len(found)>1:
363:
364: new.append("<a href=%s>%s</a>"%(split,split))
365: else:
366: new.append(split)
367: except:
368: new.append(split)
369: return string.join(new)
370:
371:
372:
373:
374: def generateTemplate(self,RESPONSE=None):
375: """Erzeuge Template für defined fields not_used"""
376:
377: id="index_html"
378: title=id
379: if self._getOb('index_html'):
380: self._delObject('index_html')
381:
382:
383: newObj=ZopePageTemplate(id,'TEXT')
384: self._setObject(id,newObj)
385: #self.manage_addPageTemplate(id,title)
386: if RESPONSE is not None:
387: RESPONSE.redirect('manage_main')
388:
389: def __init__(self, id, argv=None):
390: """initieriere classe"""
391:
392: self.id=id
393: self.title=id
394: if argv:
395: for arg in definedFields:
396: setattr(self,arg,argv[arg])
397: else:
398: for arg in definedFields:
399: setattr(self,arg,'')
400:
401: manage_options = Folder.manage_options+(
402: {'label':'Load New File','action':'loadNewFileForm'},
403: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
404: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
405: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
406: )
407:
408: def getDataFields(self):
409: """giveListofDatafields"""
410: ret=[]
411: for x in range(1,14):
412: ret.append('xdata_%02i'%x)
413: return ret
414:
415: def getDefinedFields(self):
416: """show all defined fields"""
417:
418: return definedFields
419:
420: def getAttribute(self,field):
421: """get attrbiute"""
422: return getattr(self,field)
423:
424: def getContent(self,field):
425: """Inhalt des Feldes"""
426:
427: text=u''
428: #print "FIELD",field
429: for x in getattr(self,field):
430: #print "HIHIIII"
431:
432: try:
433: text +=x
434: except:
435: try:
436: text =x
437: except:
438: text="ERROR"
439: #print "TEXT",text.encode('ascii','ignore')
440: return text
441:
442: def show_html(self):
443: """simple index"""
444: #return "HI"
445: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
446: return pt()
447:
448: def editMPIWGProjectForm(self):
449: """editform"""
450: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
451: return pt()
452:
453: def editMPIWGBasisForm(self):
454: """editform"""
455: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
456: return pt()
457: def editMPIWGRelatedPublicationsForm(self):
458: """Edit related Publications"""
459: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
460: return pt()
461:
462: def editMPIWGProject(self,RESPONSE=None):
463: """edit the project"""
464:
465: #return self.REQUEST
466: for x in definedFields:
467: if self.REQUEST.has_key(x):
468:
469: setattr(self,x,[self.REQUEST[x]])
470:
471: if RESPONSE is not None:
472: RESPONSE.redirect('manage_main')
473:
474:
475: def loadNewFileForm(self):
476: """Neues XML-File einlesen"""
477: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
478: return pt()
479:
480: def loadNewFile(self,RESPONSE=None):
481: """einlesen des neuen files"""
482: fileupload=self.REQUEST['fileupload']
483: if fileupload:
484: file_name=fileupload.filename
485: filedata=fileupload.read()
486:
487: argv=xmlhelper.proj2hash(filedata)
488: #print argv.keys()
489: for arg in definedFields:
490:
491: #print arg,argv[arg],getattr(self,arg)
492: try:
493: temp=argv[arg][0:]
494: #old=getattr(self,arg)
495: setattr(self,arg,temp)
496: #print old,getattr(self,arg)
497: except:
498: """nothing"""
499:
500: if RESPONSE is not None:
501: RESPONSE.redirect('manage_main')
502:
503: def manage_addMPIWGProjectForm(self):
504: """form for adding the project"""
505: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
506: return pt()
507:
508: def manage_addMPIWGProject(self,id,RESPONSE=None):
509: """method to add a project"""
510: #print argv
511: if self.REQUEST.has_key('fileupload'):
512: fileupload=self.REQUEST['fileupload']
513: if fileupload:
514: file_name=fileupload.filename
515: filedata=fileupload.read()
516:
517: argv=xmlhelper.proj2hash(filedata)
518:
519: #print argv
520: newObj=MPIWGProject(id,argv)
521: else:
522: newObj=MPIWGProject(id)
523:
524: self._setObject(id,newObj)
525:
526:
527: if RESPONSE is not None:
528: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>