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