Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.7
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'
54:
55: def __init__(self, id, title):
56: """init"""
57: self.id=id
58: self.title=title
59:
1.5 dwinter 60: def getProjectFields(self,fieldName,folder=None,sort=None):
1.1 dwinter 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'):
1.5 dwinter 70: #print obj.meta_type
1.1 dwinter 71: if obj.meta_type=='MPIWGProject':
1.5 dwinter 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
1.1 dwinter 81:
1.5 dwinter 82: ret.append((obj,obj.getContent(fieldNameTmp)))
83:
1.1 dwinter 84: if obj.meta_type in self.folders:
85:
86: ret += self.getProjectFields(fieldName,obj)
1.5 dwinter 87:
88: if sort=="int":
89: ret.sort(sortI)
90: else:
91: ret.sort(sortF)
1.1 dwinter 92:
93: return ret
94:
1.5 dwinter 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:
1.1 dwinter 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():
1.4 dwinter 119: #print line
1.1 dwinter 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:
1.3 dwinter 130: def getAllMembers(self):
131: """give list of all members"""
132: ret=[]
133:
134: for x in self.members.objectValues('MPIWGStaff'):
1.4 dwinter 135: #print x.title
1.3 dwinter 136: ret.append(x.title)
137:
138: ret.sort()
139: return ret
140:
1.5 dwinter 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
1.6 dwinter 169: print "pj",projects
1.5 dwinter 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:
1.6 dwinter 180: numbers.append(int(0))
181:
182: try:
183: highest=max(numbers)
184: except:
185: highest=0
1.5 dwinter 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:
1.3 dwinter 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=='':
1.4 dwinter 237:
238: try:
239: proj=self.MembersCatalog({'title':search})
240: except:
241: proj=None
1.3 dwinter 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
1.1 dwinter 260: def givePersonList(self,name):
261: """check if person is in personfolder and return list of person objects"""
1.3 dwinter 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=[]
1.1 dwinter 289:
1.3 dwinter 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'):
1.1 dwinter 294:
1.3 dwinter 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)):
1.1 dwinter 296:
1.3 dwinter 297: ## objs.append((obj,lastName+", "+firstName))
1.1 dwinter 298:
1.3 dwinter 299:
1.1 dwinter 300: return objs
301:
302:
303: def personCheck(self,names):
304: """all persons for list"""
1.4 dwinter 305: #print "names",names
1.1 dwinter 306: splitted=names.split(";")
307: ret={}
308: for name in splitted:
309:
310: if not (name==""):
1.3 dwinter 311: try:
312: ret[name]=self.givePersonList(name)
313: except:
314: """NOTHIHN"""
1.4 dwinter 315: #print "RET",ret
1.1 dwinter 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))
1.4 dwinter 323: #print "GCLBACKX",x
1.1 dwinter 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:
1.3 dwinter 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:
1.1 dwinter 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:
1.5 dwinter 389: def __init__(self, id, argv=None):
1.1 dwinter 390: """initieriere classe"""
391:
392: self.id=id
393: self.title=id
1.5 dwinter 394: if argv:
395: for arg in definedFields:
1.7 ! dwinter 396: try:
! 397: setattr(self,arg,argv[arg])
! 398: except:
! 399: setattr(self,arg,"")
1.5 dwinter 400: else:
401: for arg in definedFields:
402: setattr(self,arg,'')
1.1 dwinter 403:
404: manage_options = Folder.manage_options+(
405: {'label':'Load New File','action':'loadNewFileForm'},
406: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
407: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
408: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
409: )
410:
411: def getDataFields(self):
412: """giveListofDatafields"""
413: ret=[]
414: for x in range(1,14):
415: ret.append('xdata_%02i'%x)
416: return ret
417:
418: def getDefinedFields(self):
419: """show all defined fields"""
420:
421: return definedFields
422:
423: def getAttribute(self,field):
424: """get attrbiute"""
425: return getattr(self,field)
426:
427: def getContent(self,field):
428: """Inhalt des Feldes"""
429:
430: text=u''
431: #print "FIELD",field
432: for x in getattr(self,field):
433: #print "HIHIIII"
434:
435: try:
436: text +=x
437: except:
438: try:
439: text =x
440: except:
441: text="ERROR"
1.5 dwinter 442: #print "TEXT",text.encode('ascii','ignore')
1.1 dwinter 443: return text
444:
445: def show_html(self):
446: """simple index"""
447: #return "HI"
448: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
449: return pt()
450:
451: def editMPIWGProjectForm(self):
452: """editform"""
453: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
454: return pt()
455:
456: def editMPIWGBasisForm(self):
457: """editform"""
458: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
459: return pt()
460: def editMPIWGRelatedPublicationsForm(self):
461: """Edit related Publications"""
462: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
463: return pt()
464:
465: def editMPIWGProject(self,RESPONSE=None):
466: """edit the project"""
467:
468: #return self.REQUEST
469: for x in definedFields:
470: if self.REQUEST.has_key(x):
471:
472: setattr(self,x,[self.REQUEST[x]])
473:
474: if RESPONSE is not None:
475: RESPONSE.redirect('manage_main')
476:
477:
478: def loadNewFileForm(self):
479: """Neues XML-File einlesen"""
480: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
481: return pt()
482:
483: def loadNewFile(self,RESPONSE=None):
484: """einlesen des neuen files"""
485: fileupload=self.REQUEST['fileupload']
486: if fileupload:
487: file_name=fileupload.filename
488: filedata=fileupload.read()
489:
490: argv=xmlhelper.proj2hash(filedata)
491: #print argv.keys()
492: for arg in definedFields:
493:
494: #print arg,argv[arg],getattr(self,arg)
495: try:
496: temp=argv[arg][0:]
497: #old=getattr(self,arg)
498: setattr(self,arg,temp)
499: #print old,getattr(self,arg)
500: except:
501: """nothing"""
502:
503: if RESPONSE is not None:
504: RESPONSE.redirect('manage_main')
505:
506: def manage_addMPIWGProjectForm(self):
507: """form for adding the project"""
508: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
509: return pt()
510:
511: def manage_addMPIWGProject(self,id,RESPONSE=None):
512: """method to add a project"""
513: #print argv
1.5 dwinter 514: if self.REQUEST.has_key('fileupload'):
515: fileupload=self.REQUEST['fileupload']
516: if fileupload:
517: file_name=fileupload.filename
518: filedata=fileupload.read()
1.1 dwinter 519:
1.5 dwinter 520: argv=xmlhelper.proj2hash(filedata)
1.1 dwinter 521:
1.5 dwinter 522: #print argv
523: newObj=MPIWGProject(id,argv)
524: else:
525: newObj=MPIWGProject(id)
1.1 dwinter 526:
527: self._setObject(id,newObj)
528:
529:
530: if RESPONSE is not None:
531: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>