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