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