Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.44
1.9 dwinter 1: """This contains the class MPIWG Projects
1.42 dwinter 2: for organizing and maintaining the different project pages
1.6 dwinter 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
1.11 dwinter 8: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
1.34 dwinter 9: from Globals import package_home
1.12 dwinter 10: import urllib
1.1 dwinter 11: import MPIWGStaff
12: import string
13: import re
1.34 dwinter 14: import os
1.5 dwinter 15: from types import *
1.40 dwinter 16: import zLOG
1.1 dwinter 17: import xmlhelper # Methoden zur Verwaltung der projekt xmls
18: from OFS.SimpleItem import SimpleItem
19: from OFS.Folder import Folder
20:
1.11 dwinter 21: from bibliography import *
1.42 dwinter 22: import time
1.11 dwinter 23:
1.1 dwinter 24: 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']
25:
26: checkFields = ['xdata_01']
27:
1.9 dwinter 28:
29:
1.1 dwinter 30: def sortF(x,y):
1.9 dwinter 31: try:
32: return cmp(x[1],y[1])
33: except:
1.18 dwinter 34: try:
35: return cmp(str(x[1]),str(y[1]))
36: except:
37: print "error",x[1],y[1]
38: return 0
1.5 dwinter 39:
40: def sortI(x,y):
41: xsplit=x[1].split(".")
42: ysplit=y[1].split(".")
43: xret=""
44: yret=""
45: try:
46: for i in range(5):
47: try:
48: yret=yret+"%04i"%int(xsplit[i])
49: except:
50: yret=yret+"%04i"%0
51:
52: try:
53: xret=xret+"%04i"%int(ysplit[i])
54: except:
55: xret=xret+"%04i"%0
56:
57:
58: return cmp(int(yret),int(xret))
59: except:
60: return cmp(x[1],y[1])
1.1 dwinter 61:
1.37 dwinter 62: class MPIWGTemplate(ZopePageTemplate):
63: """Create a layout Template for different purposes"""
64:
65: meta_type="MPIWGTemplate"
66:
67: def __init__(self, id, text=None, content_type=None,MPIWGType=None):
68: self.id = str(id)
69:
70:
71:
72: self.ZBindings_edit(self._default_bindings)
73: if text is None:
74: self._default_content_fn = os.path.join(package_home(globals()),
75: 'zpt/MPIWG_%s_template_standard.zpt'%MPIWGType)
76: text = open(self._default_content_fn).read()
77: self.pt_edit(text, content_type)
78:
79:
80: """change form"""
81:
82:
83: def manage_addMPIWGTemplateForm(self):
84: """Form for adding"""
85: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGTemplate.zpt')).__of__(self)
86: return pt()
87:
88: from urllib import quote
89:
90:
91: def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,REQUEST=None):
92: "Add a Page Template with optional file content."
93: if type(MPIWGType)==StringType:
94: MPIWGTypes=[MPIWGType]
95: else:
96: MPIWGTypes=MPIWGType
97:
98: for singleType in MPIWGTypes:
99:
100:
101: if REQUEST is None:
102: self._setObject(id, MPIWGTemplate(id, text,EchoType=singleType))
103: ob = getattr(self, id)
104:
105: if title:
106: ob.pt_setTitle(title)
107: return ob
108: else:
109: file = REQUEST.form.get('file')
110: headers = getattr(file, 'headers', None)
111: if headers is None or not file.filename:
112: zpt = MPIWGTemplate(id,MPIWGType=singleType)
113: else:
114: zpt = MPIWGTemplate(id, file, headers.get('content_type'))
115:
116: self._setObject(id, zpt)
117: ob = getattr(self, id)
118: if title:
119: ob.pt_setTitle(title)
120:
121: try:
122: u = self.DestinationURL()
123: except AttributeError:
124: u = REQUEST['URL1']
125:
126:
127: REQUEST.RESPONSE.redirect(u+'/manage_main')
128: return ''
129:
1.5 dwinter 130:
1.11 dwinter 131: class MPIWGRoot(ZSQLExtendFolder):
1.1 dwinter 132: """Stammordner für den Web-Server"""
133:
1.9 dwinter 134: fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department',
135: 'xdata_03':'Historical Persons','xdata_04':'Time period',
136: 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title',
137: 'xdata_08':'Other involved scholars' ,'xdata_09':'Part of','xdata_10':'Covered by',
138: 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners',
139: 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header',
140: 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'}
141:
1.38 dwinter 142: folders=['MPIWGProject','Folder','ECHO_Navigation']
1.1 dwinter 143: meta_type='MPIWGRoot'
1.8 dwinter 144:
1.34 dwinter 145: def upDateSQL(self,fileName):
146: """updates SQL databases using fm.jar"""
147: fmJarPath=os.path.join(package_home(globals()), 'updateSQL/fm.jar')
148: xmlPath=os.path.join(package_home(globals()), "updateSQL/%s"%fileName)
1.40 dwinter 149: zLOG.LOG("MPIWG Web",zLOG.INFO,"java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath))
150: ret=os.popen("java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath),"r").read()
151: zLOG.LOG("MPIWG Web",zLOG.INFO,"result convert: %s"%ret)
1.34 dwinter 152: return 1
153:
1.31 dwinter 154: def patchProjects(self,RESPONSE):
155: """patch"""
156: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
157: for project in projects:
1.33 casties 158: tmp=project[1].WEB_project_description[0].replace("/CD/projects/","")[0:]
159: setattr(project[1],'WEB_project_description',[tmp[0:]])
160: RESPONSE.write("<p>%s</p>\n"%project[0])
1.31 dwinter 161:
1.11 dwinter 162: def replaceNotEmpty(self,format,field):
163: """replace not empty"""
1.44 ! dwinter 164: if field and (not field.lstrip()==''):
1.11 dwinter 165: return format%field
166: else:
167: return ""
168:
1.29 dwinter 169:
170: def redirectIndex_html(self,request):
171: #return request['URL1']+'/index_html'
1.11 dwinter 172:
1.29 dwinter 173: return urllib.urlopen(request['URL1']+'/index_html').read()
174:
175:
1.11 dwinter 176: def formatBibliography(self,here,found):
177: """format"""
178: return formatBibliography(here,found)
179:
1.21 dwinter 180: def getValue(self,fieldStr):
1.9 dwinter 181: """Inhalt des Feldes"""
182:
1.21 dwinter 183: if type(fieldStr)==StringType:
184: field=fieldStr
1.9 dwinter 185: else:
1.21 dwinter 186: field=fieldStr[0]
187: try:
188: if field[len(field)-1]==";":
189: field=field[0:len(field)-1]
190: except:
191:
192: """nothing"""
193: field=re.sub(r';([^\s])','; \g<1>',field)
194: return field.encode('utf-8')
195:
1.9 dwinter 196:
197:
1.8 dwinter 198: def sortedNames(self,list):
199: """sort names"""
200:
1.12 dwinter 201: def sortLastName(x_c,y_c):
1.13 dwinter 202: try:
203: x=urllib.unquote(x_c).encode('utf-8','ignore')
204: except:
205: x=urllib.unquote(x_c)
206:
207: try:
208: y=urllib.unquote(y_c).encode('utf-8','ignore')
209: except:
210: x=urllib.unquote(y_c)
211:
212:
1.12 dwinter 213:
1.8 dwinter 214: try:
215: last_x=x.split()[len(x.split())-1]
216: last_y=y.split()[len(y.split())-1]
217:
218: except:
219:
220: last_x=""
221: last_y=""
222:
223:
224:
225: if last_x<last_y:
226: return 1
227: elif last_x>last_y:
228: return -1
229: else:
230: return 0
231:
232: list.sort(sortLastName)
233: list.reverse()
234:
235: return list
1.1 dwinter 236:
237: def __init__(self, id, title):
238: """init"""
239: self.id=id
240: self.title=title
1.12 dwinter 241:
242: def urlQuote(self,str):
243: """quote"""
244: return urllib.quote(str)
245:
246: def urlUnQuote(self,str):
247: """quote"""
248: return urllib.unquote(str)
249:
1.8 dwinter 250: def harvestHistoricalPersons(self):
251: """erstelle liste aller erwaehnten actors"""
252:
253: def normalize(str):
254: """loesche fuhrendes space"""
255: if (len(str)>1) and (str[0]==" "):
256: ret=str[1:]
257: else:
258: ret=str
259: return ret
260:
261: list={}
262: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
263:
264: for project in projects:
265: lg=len(project[1].xdata_03[0])-1
266:
267: if (lg>1) and (project[1].xdata_03[0][lg]==";"):
1.12 dwinter 268: project[1].xdata_03[0]=project[1].xdata_03[0][0:lg]
1.8 dwinter 269:
270:
271:
272:
273: try:
274: if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ;
275: for person in project[1].xdata_03[0].split(";"):
276: personNormal=normalize(person)
277: if personNormal in list.keys():
1.12 dwinter 278: list[urllib.quote(personNormal)][1].append(project[1])
1.8 dwinter 279: else:
1.12 dwinter 280: list[urllib.quote(personNormal)]=(personNormal,[project[1]])
1.8 dwinter 281: else: #guess , is sepeator
282: for person in project[1].xdata_03[0].split(","):
283: personNormal=normalize(person)
1.12 dwinter 284: if urllib.quote(personNormal) in list.keys():
285: list[urllib.quote(personNormal)][1].append(project[1])
1.8 dwinter 286: else:
1.12 dwinter 287: list[urllib.quote(personNormal)]=(personNormal,[project[1]])
1.8 dwinter 288:
289: except:
290: print "ERROR",project
291:
292: return list
293:
294: def storeHistoricalPersons(self,RESPONSE=None):
295: """store persons"""
296: self.personDict={}
297: personDict=self.harvestHistoricalPersons()
298: for person in personDict.keys():
1.12 dwinter 299: for project in personDict[person][1]:
1.8 dwinter 300: if person in self.personDict.keys():
1.12 dwinter 301: self.personDict[person][1].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0]))
1.8 dwinter 302: else:
1.12 dwinter 303: self.personDict[person]=(personDict[person][0],[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])])
1.1 dwinter 304:
1.8 dwinter 305: if RESPONSE is not None:
306: RESPONSE.redirect("showHistoricalPersons")
307:
1.13 dwinter 308:
309: def getPersonDict(self,name):
310: """name von dict"""
311:
312: try:
313: return self.personDict[name][0].encode('utf-8')
314: except:
315: return self.personDict[name][0]
316: return self.personDict[name][0].decode('latin-1').encode('utf-8')
317:
1.8 dwinter 318:
319: def showHistoricalPersons(self):
320: """show persons"""
321: pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self)
322: return pt()
323:
324:
325: def editHistoricalPersonsForm(self):
326: """edit historical persons for consistency"""
327: pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self)
328: return pt()
329:
330: def getProjectsByFieldContent(self,fieldName,fieldContentsEntry):
331: """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents"""
332: if type(fieldContentsEntry) is StringType:
333: fieldContents=[fieldContentsEntry]
334: else:
335: fieldContents=fieldContentsEntry
336:
337: projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')})
338: #print projects
339: return projects
340:
341: def changeMPIWGRootForm(self):
342: """edit"""
343: pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self)
344: return pt()
345:
346: def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None):
347: """change"""
348: self.title=title
349: self.disciplineList=disciplineList
350: self.themesList=themesList
351:
352: if RESPONSE is not None:
353: RESPONSE.redirect('manage_main')
354:
1.9 dwinter 355: def getDisciplineList(self):
356: """get disciplines as list"""
357: return self.disciplineList.split("\n")
358:
359: def getThemeList(self):
360: """get themes as list"""
361: return self.themesList.split("\n")
362:
1.8 dwinter 363: def test(self):
364: """test"""
365: return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url
1.9 dwinter 366:
367: def getContexts(self,childs=None,parents=None,depth=None):
368: """childs alle childs, alle parents"""
369: ret=[]
370: if parents:
371: splitted=parents.split(".")
372: parentId=string.join(splitted[0:len(splitted)-1],".")
373:
374: for project in self.getProjectFields('xdata_05',sort='int'):
375: if project[1]==parentId:
376: ret.append(project)
377:
378: if childs:
379: for project in self.getProjectFields('xdata_05',sort='int'):
380: searchStr=childs+"(\..*)"
381: if re.match(searchStr,project[1]):
382:
383: if depth:
1.14 dwinter 384:
1.9 dwinter 385: if int(depth)>=len(project[1].split("."))-len(childs.split(".")):
386:
387: ret.append(project)
388: else:
389: ret.append(project)
390: return ret
1.8 dwinter 391:
1.5 dwinter 392: def getProjectFields(self,fieldName,folder=None,sort=None):
1.1 dwinter 393: """getListofFieldNames"""
394: ret=[]
1.38 dwinter 395:
1.44 ! dwinter 396: objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0)
1.5 dwinter 397:
1.38 dwinter 398:
399: for object in objects:
400: obj=object[1]
1.41 dwinter 401:
402: if not getattr(obj,'invisible',None):
403: if fieldName=="WEB_title_or_short":
404:
405: if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
406: fieldNameTmp="WEB_title"
407: else:
408: fieldNameTmp="xdata_07"
1.38 dwinter 409: else:
1.41 dwinter 410: fieldNameTmp=fieldName
411:
412: ret.append((obj,obj.getContent(fieldNameTmp)))
1.5 dwinter 413:
1.38 dwinter 414:
1.5 dwinter 415: if sort=="int":
416: ret.sort(sortI)
417: else:
418: ret.sort(sortF)
1.1 dwinter 419:
420: return ret
421:
1.5 dwinter 422: def showNewProjects(self):
423: projects=[]
424: for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
425: if objs[0].xdata_05[0] == "":
426:
427: projects.append(objs)
428:
429: return projects
430:
431:
1.1 dwinter 432: manage_options = Folder.manage_options+(
1.36 dwinter 433: {'label':'Update Personal Homepages','action':'updateHomepages'},
1.8 dwinter 434: {'label':'Main config','action':'changeMPIWGRootForm'},
1.9 dwinter 435: {'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'},
1.8 dwinter 436: {'label':'Store Historical Persons','action':'storeHistoricalPersons'},
1.1 dwinter 437: )
438:
439: def importNamesForm(self):
440: """Form"""
441: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self)
442: return pt()
443:
444: def importNames(self,fileupload,folderName,RESPONSE=None):
445: """import komma-sep list email,lastName,firstName"""
446: project=getattr(self,folderName)
1.9 dwinter 447: load=fileupload.read()
1.1 dwinter 448:
1.9 dwinter 449: for line in load.split('\r'):
450:
451:
1.1 dwinter 452: splitted=line.split(",")
1.26 dwinter 453: # print splitted
1.9 dwinter 454:
1.1 dwinter 455: if not (splitted[0]==""):
456: newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
1.9 dwinter 457:
1.1 dwinter 458: try:
459: project._setObject(splitted[0],newObj)
1.26 dwinter 460: #print "done:",splitted[0]
1.1 dwinter 461: except:
462: print "not done:",splitted[0]
1.9 dwinter 463:
1.1 dwinter 464: if RESPONSE is not None:
465: RESPONSE.redirect('manage_main')
466:
1.36 dwinter 467: def updateHomepages(self,RESPONSE):
468: """lege members an"""
1.39 dwinter 469:
1.36 dwinter 470: self.upDateSQL('personalwww.xml')
1.39 dwinter 471: founds=self.ZSQLInlineSearch(_table='personal_www',publish_the_data='yes')
1.36 dwinter 472: project=getattr(self,'members')
473: for found in founds:
474:
475: if not (found.e_mail==""):
476: newObj=MPIWGStaff.MPIWGStaff(found.username,found.name,found.vorname)
477:
478: try:
479: project._setObject(found.username,newObj)
480: RESPONSE.write("<p>new:%s</p>\n"%found.username)
481: except:
482: RESPONSE.write("<p>old:%s (%s,%s)</p>\n"%(found.username,found.name,found.vorname))
483:
484:
1.39 dwinter 485: #delete non existing
486:
487:
488: foundUserNames=[x.username for x in founds]
489: for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1):
490:
491: if member[1].getId() not in foundUserNames:
492: member[1].aq_parent.manage_delObjects(ids=[member[1].getId()])
493: RESPONSE.write("<p>deleted:%s</p>\n"%member[1].getId())
494:
495: self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
496:
497:
1.36 dwinter 498:
499: if RESPONSE is not None:
500: RESPONSE.redirect('manage_main')
501:
502:
1.3 dwinter 503: def getAllMembers(self):
504: """give list of all members"""
505: ret=[]
506:
1.9 dwinter 507: #for x in self.members.objectValues('MPIWGStaff'):
1.4 dwinter 508: #print x.title
1.9 dwinter 509: # ret.append(x.title.decode('utf-8'))
510:
511: for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']):
512: ret.append(x[1].title.decode('utf-8'))
1.3 dwinter 513:
1.18 dwinter 514: ret.sort()
1.9 dwinter 515: #print ret
516:
1.3 dwinter 517: return ret
518:
1.9 dwinter 519: def printAllMembers(self):
520: """prin"""
521: members=self.getAllMembers()
522: ret=""
523: for x in members:
524: ret+="<p>%s</p>"%x
525: return ret
526:
527:
1.5 dwinter 528: def makeList(self,entry):
529: """makes a list out of one entry or repeat a list"""
530: if type(entry) is StringType:
531: return [entry]
532: else:
533: return entry
534:
535:
536: def getTree(self):
537: """generate Tree from project list"""
538: returnList=[]
539: for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
1.41 dwinter 540:
1.5 dwinter 541: for idNr in project[1].split(";"): # more than one number
542: if not idNr=="":
543: splittedId=idNr.split(".")
544: depth=len(splittedId)
545: nr=idNr
1.14 dwinter 546: #title=project[0].WEB_title
547: title=[project[0].getContent('WEB_title')]
548: #print title
1.5 dwinter 549: returnList.append((depth,nr,title,project[0]))
550:
551: return returnList
552:
1.33 casties 553:
1.16 dwinter 554: def formatElementForOverview(self,element):
555: """format the element for output in overview"""
556: if element[0]==1: #department
1.26 dwinter 557: #print element[3].getContent('xdata_05')
1.23 dwinter 558: if element[3].getContent('xdata_05') == "4":
1.33 casties 559: return """<h2 class="hier"><a href="%s">Ind. Research Group I: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
1.25 dwinter 560: if element[3].getContent('xdata_05') == "5":
1.33 casties 561: return """<h2 class="hier"><a href="%s">Ind. Research Group II: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
1.23 dwinter 562:
1.33 casties 563: return """<h2 class="hier"><a href="%s">Department %s: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('xdata_05'),element[3].getContent('WEB_title'))
1.16 dwinter 564:
565: elif element[0]==2: #mainprojects
1.33 casties 566: return """<h3 class="hier"><a href="%s">%s</a></h3><p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
1.16 dwinter 567:
568: elif element[0]==3:
1.33 casties 569: return """<p class="hier"><a href="%s">%s</a></p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
570:
1.16 dwinter 571:
1.5 dwinter 572: def changePosition(self,treeId,select,RESPONSE=None):
573: """Change Postion Entry"""
574: numbers=[]
575:
576: # Suche hoechste bisherige nummer
577: projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
1.8 dwinter 578: #print "pj",projects
1.5 dwinter 579: for project in projects: #suche alle subtrees der treeId
580: #print treeId
581:
582: founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
583: if founds:
584: #print "x",founds.group(0),len(founds.group(0).split("."))
585: if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
586: try:
587: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
588: except:
1.6 dwinter 589: numbers.append(int(0))
590:
591: try:
592: highest=max(numbers)
593: except:
594: highest=0
1.5 dwinter 595: projects=self.showNewProjects()
596: for i in self.makeList(select):
597: highest+=10
598: projects[int(i)][0].xdata_05=treeId+"."+str(highest)
599:
600:
601: if RESPONSE is not None:
602: RESPONSE.redirect('showTree')
603:
604: def changeTree(self,RESPONSE=None):
605: """change the complete tree"""
606: form=self.REQUEST.form
607: hashList={}
608: fields=self.getTree()
609:
610:
611: for idNr in form.keys():
612: fields[int(idNr)][3].xdata_05=form[idNr]
613:
614:
615:
616: if RESPONSE is not None:
617: RESPONSE.redirect('showTree')
618:
619: def getProjectWithId(self,id):
620: fields=self.getProjectFields('xdata_05')
621: for field in fields:
622: if field[1]==id:
623: return field[0]
624:
625: return None
626:
627:
628:
629:
1.15 dwinter 630: def getRelativeUrlFromPerson(self,list):
631: """get urls to person list"""
632: ret=[]
633: persons=list.split(";")
634: for person in persons:
635:
636: if len(person)>1: #nicht nur Trennzeichen
637: splitted=person.split(",")
638: if len(splitted)==1:
639: splitted=person.split(" ")
640: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
641: if splittedNew[0]=='':
642: del splittedNew[0]
643: search=string.join(splittedNew,' AND ')
644:
645: if not search=='':
646:
647: try:
648: proj=self.MembersCatalog({'title':search})
649: except:
650: proj=None
651:
652: if proj:
653: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
1.29 dwinter 654: ret.append("<a href=%s >%s</a>"%('members/'+proj[0].id+'/index.html',person))
1.15 dwinter 655: else:
656: #ret.append("%s"%person.encode('utf-8'))
657: ret.append("%s"%person)
658: return string.join(ret,";")
1.5 dwinter 659:
660:
1.3 dwinter 661: def getUrlFromPerson(self,list):
662: """get urls to person list"""
663: ret=[]
664: persons=list.split(";")
665: for person in persons:
666:
1.9 dwinter 667: if len(person)>1: #nicht nur Trennzeichen
668: splitted=person.split(",")
669: if len(splitted)==1:
1.26 dwinter 670: splitted=person.lstrip().rstrip().split(" ")
1.9 dwinter 671: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
672: if splittedNew[0]=='':
673: del splittedNew[0]
674: search=string.join(splittedNew,' AND ')
1.4 dwinter 675:
1.9 dwinter 676: if not search=='':
677:
678: try:
679: proj=self.MembersCatalog({'title':search})
680: except:
681: proj=None
682:
683: if proj:
1.35 dwinter 684: if person =="Otto Sibum" : person="H. Otto Sibum"
685: if person =="Norton Wise" : person="M. Norton Wise"
1.12 dwinter 686: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
1.29 dwinter 687: ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url+"/index.html",person))
1.9 dwinter 688: else:
1.12 dwinter 689: #ret.append("%s"%person.encode('utf-8'))
1.9 dwinter 690: ret.append("%s"%person)
1.3 dwinter 691: return string.join(ret,";")
692:
693: def getProjectsOfMembers(self):
694: """give tuple member /projects"""
695: ret=[]
696: members=self.getAllMembers()
1.9 dwinter 697: #return str(members)
1.3 dwinter 698: for x in members:
1.11 dwinter 699: ret+=self.getProjectsOfMember(name=x)
1.18 dwinter 700:
1.3 dwinter 701: return ret
1.11 dwinter 702:
703: def getProjectsOfMember(self,name=None,email=None):
704: """get project of a member"""
705: def sortP(x,y):
706: """sort by sorting number"""
1.18 dwinter 707: #print x.xdata_05,y.xdata_05
708: return cmp(x.WEB_title,y.WEB_title)
1.11 dwinter 709:
1.18 dwinter 710:
1.11 dwinter 711: ret=[]
712: splitNeu=[]
713: if email:
1.38 dwinter 714: #print "IIII:",self.getId()
715: members=self.ZopeFind(self,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
1.11 dwinter 716: name = members[0][1].title.decode('utf-8')
717:
718: y=name
1.28 dwinter 719: splitted=y.split(",")
720: #XXXX
721: splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
722:
723: #for s in splitted:
724: # splitNeu.append("\""+s+"\"")
1.11 dwinter 725: search=string.join(splitNeu,' AND ')
1.28 dwinter 726:
1.11 dwinter 727: proj=self.ProjectCatalog({'xdata_01':search})
1.28 dwinter 728:
1.11 dwinter 729: if proj:
1.28 dwinter 730: proj2=[]
731: for x in proj:
1.41 dwinter 732:
733: if not getattr(x.getObject(),'invisible',None):
734: if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
1.28 dwinter 735: proj2.append(x)
1.41 dwinter 736:
1.18 dwinter 737: else:
738: proj2=[]
739:
1.11 dwinter 740: proj=self.ProjectCatalog({'xdata_08':search})
741: if proj:
1.18 dwinter 742: names=[x.WEB_title for x in proj]
743: for x in proj:
1.41 dwinter 744:
1.18 dwinter 745: if not x.WEB_title in names:
746: proj2.append(x)
747:
748:
749: proj2.sort(sortP)
750:
751: if len(proj2)>0:
1.11 dwinter 752: ret.append((y,proj2))
753:
754: return ret
755:
1.1 dwinter 756: def givePersonList(self,name):
757: """check if person is in personfolder and return list of person objects"""
1.3 dwinter 758:
759: splitted=name.split(",")
760: if len(splitted)==1:
1.26 dwinter 761: splitted=name.lstrip().rstrip().split(" ")
762: splittedNew=[split.lstrip() for split in splitted]
763:
1.3 dwinter 764: if splittedNew[0]=='':
765: del splittedNew[0]
766: search=string.join(splittedNew,' AND ')
767: if not search=='':
768: proj=self.MembersCatalog({'title':search})
769:
770: if proj:
771: return [[x.lastName,x.firstName] for x in proj]
772: else:
773: return []
774:
775: ## splitted=name.split(",") # version nachname, vorname...
776: ## if len(splitted)>1:
777: ## lastName=splitted[0]
778: ## firstName=splitted[1]
779: ## else:
780: ## splitted=name.split(" ") #version vorname irgenwas nachnamae
781:
782: ## lastName=splitted[len(splitted)-1]
783: ## firstName=string.join(splitted[0:len(splitted)-1])
784:
785: ## objs=[]
1.1 dwinter 786:
1.3 dwinter 787: #print self.members
788: ## for x in self.members.__dict__:
789: ## obj=getattr(self.members,x)
790: ## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
1.1 dwinter 791:
1.3 dwinter 792: ## 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 793:
1.3 dwinter 794: ## objs.append((obj,lastName+", "+firstName))
1.1 dwinter 795:
1.3 dwinter 796:
1.1 dwinter 797: return objs
798:
799:
800: def personCheck(self,names):
801: """all persons for list"""
1.4 dwinter 802: #print "names",names
1.1 dwinter 803: splitted=names.split(";")
804: ret={}
805: for name in splitted:
806:
807: if not (name==""):
1.3 dwinter 808: try:
809: ret[name]=self.givePersonList(name)
810: except:
811: """NOTHIHN"""
1.4 dwinter 812: #print "RET",ret
1.1 dwinter 813: return ret
814:
815: def giveCheckList(self,person,fieldname):
816: """return checklist"""
817: #print "GCL",fieldname
818: if fieldname=='xdata_01':
819: x=self.personCheck(person.getContent(fieldname))
1.4 dwinter 820: #print "GCLBACKX",x
1.1 dwinter 821: return x
822:
823:
824: def isCheckField(self,fieldname):
825: """return chechfield"""
826:
827: return (fieldname in checkFields)
828:
1.9 dwinter 829:
1.1 dwinter 830:
831:
832:
833: def manage_addMPIWGRootForm(self):
834: """form for adding the root"""
835: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
836: return pt()
837:
838: def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
839: """add a root folder"""
840: newObj=MPIWGRoot(id,title)
841: self._setObject(id,newObj)
842:
843: if RESPONSE is not None:
844: RESPONSE.redirect('manage_main')
845:
846:
847: class MPIWGProject(Folder):
848: """Class for Projects"""
849:
850: meta_type='MPIWGProject'
851:
1.42 dwinter 852:
853: def versionHeader(self):
854: """version Header, gibt header text entsprechend der aktuellen version aus"""
855:
856: actualTime=time.localtime()
857: retTXT="""<h2>This is an outdated version, for the actual version please refer to <a href="%s">%s</a></h2>"""
858: s=self.aq_parent.absolute_url()
1.43 dwinter 859: #print getattr(self,'archiveTime',actualTime)
1.42 dwinter 860: if getattr(self,'archiveTime',actualTime)< actualTime:
861: return retTXT%(s,s)
862: else:
863: return ""
1.43 dwinter 864: def isActual(self):
865: """gibt 1 zurueck wenn aktuell, 0 sonst"""
866: actualTime=time.localtime()
867:
868:
869: #print getattr(self,'archiveTime',actualTime)
870: if getattr(self,'archiveTime',actualTime)< actualTime:
871: return 0
872: else:
873: return 1
1.42 dwinter 874:
875: def copyObjectToArchive(self):
876: """kopiere aktuelles objekt ins archiv"""
877: cb=self.aq_parent.manage_copyObjects(self.getId())
878: self.manage_pasteObjects(cb)
879: actualTime=time.localtime()
880:
881: self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
882: obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
883: obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime))
884: ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])]
885: obj.manage_delObjects(ids)
886:
887: def setArchiveTime(self,time):
888: """set Archive Time"""
889: self.archiveTime=time[0:]
890:
1.41 dwinter 891: def versionManageForm(self):
892: """version Manage form:currently only set to invisible"""
893: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self)
894: return pt()
895:
896: def versionManage(self,invisible=None,RESPONSE=None):
897: """version Manage form:currently only set to invisible"""
898: self.invisible=invisible
899:
900: if RESPONSE is not None:
901: RESPONSE.redirect('manage_main')
902:
1.38 dwinter 903:
1.3 dwinter 904: def crossLinker(self):
905: """experimental crosslinker"""
906: splitted=self.WEB_project_description[0].split()
907: new=[]
908: for split in splitted:
909: try:
910: found=self.DescriptionCatalog({'fulltext':split})
911:
912: if len(found)>1:
913:
914: new.append("<a href=%s>%s</a>"%(split,split))
915: else:
916: new.append(split)
917: except:
918: new.append(split)
919: return string.join(new)
920:
921:
922:
1.1 dwinter 923:
924: def generateTemplate(self,RESPONSE=None):
925: """Erzeuge Template für defined fields not_used"""
926:
927: id="index_html"
928: title=id
929: if self._getOb('index_html'):
930: self._delObject('index_html')
931:
932:
933: newObj=ZopePageTemplate(id,'TEXT')
934: self._setObject(id,newObj)
935: #self.manage_addPageTemplate(id,title)
936: if RESPONSE is not None:
937: RESPONSE.redirect('manage_main')
938:
1.5 dwinter 939: def __init__(self, id, argv=None):
1.1 dwinter 940: """initieriere classe"""
941:
942: self.id=id
943: self.title=id
1.5 dwinter 944: if argv:
945: for arg in definedFields:
1.7 dwinter 946: try:
947: setattr(self,arg,argv[arg])
948: except:
949: setattr(self,arg,"")
1.5 dwinter 950: else:
951: for arg in definedFields:
952: setattr(self,arg,'')
1.1 dwinter 953:
954: manage_options = Folder.manage_options+(
955: {'label':'Load New File','action':'loadNewFileForm'},
956: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
957: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
958: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
1.9 dwinter 959: {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'},
1.41 dwinter 960: {'label':'Versionmanager','action':'versionManageForm'},
1.1 dwinter 961: )
1.33 casties 962:
963:
1.42 dwinter 964: def checkDate(self,date):
965: """teste ob zum Zeitpunkt date eine andere version existierte"""
966:
967:
968: def sortProjectsByTime(x,y):
969: return cmp(x[1].archiveTime,y[1].archiveTime)
970:
971: finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
972: if not finds:
973: return self.absolute_url()
974: else:
975: finds.sort(sortProjectsByTime)
976:
977: for find in finds:
978: if int(find[1].archiveTime) > int(date):
979: return find[1].absolute_url()
980:
981: return self.absolute_url()
982:
983:
984:
1.33 casties 985: def index_html(self):
986: """show homepage"""
1.42 dwinter 987:
988: if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None:
989: self.REQUEST.SESSION['MPI_redirected']=1
990: self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date']))
991: else:
992: self.REQUEST.SESSION['MPI_redirected']=None
993:
1.33 casties 994: ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
995:
996: if ext:
997: return getattr(self,ext[0][1].getId())()
998:
999: pt=PageTemplateFile('Products/MPIWGWeb/zpt/project_main').__of__(self)
1000: return pt()
1.1 dwinter 1001:
1.38 dwinter 1002:
1.1 dwinter 1003: def getDataFields(self):
1004: """giveListofDatafields"""
1005: ret=[]
1006: for x in range(1,14):
1.17 dwinter 1007: if not x in [6,10,9]: # not used fields
1008: ret.append('xdata_%02i'%x)
1.1 dwinter 1009: return ret
1010:
1011: def getDefinedFields(self):
1012: """show all defined fields"""
1013:
1014: return definedFields
1015:
1016: def getAttribute(self,field):
1017: """get attrbiute"""
1018: return getattr(self,field)
1019:
1020: def getContent(self,field):
1021: """Inhalt des Feldes"""
1022:
1023: text=u''
1024: #print "FIELD",field
1025: for x in getattr(self,field):
1026: #print "HIHIIII"
1027:
1028: try:
1.9 dwinter 1029: text +=x.encode('utf-8')
1.1 dwinter 1030: except:
1031: try:
1.9 dwinter 1032: text =x.encode('utf-8')
1.1 dwinter 1033: except:
1.14 dwinter 1034: text=x.decode('latin-1').encode('utf-8')
1.9 dwinter 1035:
1036: #delete separator (;) if is there is one
1.21 dwinter 1037: ## try:
1038: ## print text, text[len(text)-1]
1039: ## except:
1040: ## print "error:",text
1.9 dwinter 1041: try:
1042: if text[len(text)-1]==";":
1.21 dwinter 1043: text=text[0:len(text)-1]
1044:
1045:
1.9 dwinter 1046: except:
1047: """nothing"""
1.16 dwinter 1048:
1.21 dwinter 1049: text2=re.sub(r';([^\s])','; \g<1>',text)
1.30 dwinter 1050: #teste ob ergebnis leer und header dann nehme title
1051:
1052: if (text2=='') and (field=='WEB_project_header'):
1053: return self.getContent('WEB_title')
1054:
1055: #teste ob WEB_project_description und keine führenden p tags
1056: if (len(text2)>4) and (not text2[0:3]=='<p>') and (field=='WEB_project_description'):
1057: return "<p>"+text2+"</p>"
1.35 dwinter 1058: #if text2=="Otto Sibum":
1059: #text2="H. Otto Sibum"
1.21 dwinter 1060: return text2
1.1 dwinter 1061:
1062: def show_html(self):
1063: """simple index"""
1064: #return "HI"
1065: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
1066: return pt()
1067:
1068: def editMPIWGProjectForm(self):
1069: """editform"""
1070: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
1071: return pt()
1072:
1073: def editMPIWGProject(self,RESPONSE=None):
1.42 dwinter 1074: """edit the project and archive the old version"""
1075:
1076: self.copyObjectToArchive() # archive the object
1077:
1.22 dwinter 1078:
1.1 dwinter 1079: for x in definedFields:
1080: if self.REQUEST.has_key(x):
1081:
1.9 dwinter 1082: setattr(self,x,[self.REQUEST[x].decode('utf-8')])
1.42 dwinter 1083:
1084:
1085:
1.1 dwinter 1086: if RESPONSE is not None:
1087: RESPONSE.redirect('manage_main')
1088:
1.9 dwinter 1089: def editMPIWGDisciplinesThemesForm(self):
1090: """edit the disciplines and themes Form"""
1091: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGDisciplinesThemes.zpt').__of__(self)
1092: return pt()
1093:
1094: def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None):
1095: """edit disciplin and form"""
1096: if disciplines:
1097: if type(disciplines) is StringType:
1098: self.xdata_09=disciplines
1099: else:
1100: self.xdata_09=string.join(disciplines,";")
1101: else:
1102: self.xdata_09=""
1103: if themes:
1104: if type(themes) is StringType:
1105: self.xdata_10=themes
1106: else:
1107: self.xdata_10=string.join(themes,";")
1108: else:
1109: self.xdata_10=""
1110:
1111: if RESPONSE is not None:
1112: RESPONSE.redirect('manage_main')
1113:
1114:
1115: def isChecked(self,wert,list):
1116: """check if wert is in ; seperated list"""
1117: print "W:",wert
1118: print "L:",list,type(list)
1119: #felder sind manchmnal als liste mit einem element definiert
1120: if type(list) is StringType or UnicodeType:
1121: splitted=list.split(";")
1122: else:
1123: splitted=list[0].split(";")
1124:
1125: print splitted
1126: for x in splitted:
1127: if (not x==u'') and x in wert:
1128: return 1
1129: return 0
1130:
1131: def editMPIWGBasisForm(self):
1132: """editform"""
1133: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
1134: return pt()
1135: def editMPIWGRelatedPublicationsForm(self):
1136: """Edit related Publications"""
1137: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
1138: return pt()
1.1 dwinter 1139:
1.9 dwinter 1140:
1.1 dwinter 1141: def loadNewFileForm(self):
1142: """Neues XML-File einlesen"""
1143: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
1144: return pt()
1145:
1146: def loadNewFile(self,RESPONSE=None):
1147: """einlesen des neuen files"""
1148: fileupload=self.REQUEST['fileupload']
1149: if fileupload:
1150: file_name=fileupload.filename
1151: filedata=fileupload.read()
1152:
1153: argv=xmlhelper.proj2hash(filedata)
1154: #print argv.keys()
1155: for arg in definedFields:
1156:
1157: #print arg,argv[arg],getattr(self,arg)
1158: try:
1159: temp=argv[arg][0:]
1160: #old=getattr(self,arg)
1161: setattr(self,arg,temp)
1162: #print old,getattr(self,arg)
1163: except:
1164: """nothing"""
1165:
1166: if RESPONSE is not None:
1167: RESPONSE.redirect('manage_main')
1168:
1169: def manage_addMPIWGProjectForm(self):
1170: """form for adding the project"""
1171: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
1172: return pt()
1173:
1174: def manage_addMPIWGProject(self,id,RESPONSE=None):
1175: """method to add a project"""
1176: #print argv
1.20 dwinter 1177: fileupload=self.REQUEST.get('fileupload',None)
1178: if fileupload:
1179: print fileupload
1180: file_name=fileupload.filename
1181: filedata=fileupload.read()
1182:
1183: argv=xmlhelper.proj2hash(filedata)
1184:
1185: #print argv
1.5 dwinter 1186: newObj=MPIWGProject(id,argv)
1187: else:
1188: newObj=MPIWGProject(id)
1.1 dwinter 1189:
1190: self._setObject(id,newObj)
1191:
1192:
1193: if RESPONSE is not None:
1194: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>