Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.47.2.70
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.47.2.64 dwinter 5: #TODO: mechanismus fur links to personen ueberarbeiten, da jetzt alle e_mails als members auftauchen unabhaenig vom status publish_the_data
1.47.2.29 dwinter 6: #TODO: was passiert wenn aenderungen von jochen im filemaker nicht mit den aenderungen im sql uebereinstimmen
1.47.2.34 dwinter 7: #TODO: in einzelnen projecte steht als pfad auf die bilder noch wwwneu statt www
1.47.2.28 dwinter 8:
1.1 dwinter 9: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
10: from Products.PageTemplates.PageTemplate import PageTemplate
11: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
1.11 dwinter 12: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
1.45 dwinter 13: from Products.ZCatalog.CatalogPathAwareness import CatalogAware
1.47.2.22 dwinter 14: from OFS.Image import Image
1.34 dwinter 15: from Globals import package_home
1.12 dwinter 16: import urllib
1.1 dwinter 17: import MPIWGStaff
18: import string
19: import re
1.34 dwinter 20: import os
1.5 dwinter 21: from types import *
1.40 dwinter 22: import zLOG
1.47.2.23 dwinter 23: import xmlhelper # Methoden zur Verwaltung der projekt xml
1.1 dwinter 24: from OFS.SimpleItem import SimpleItem
25: from OFS.Folder import Folder
1.45 dwinter 26: from Products.ZSQLMethods.SQL import SQLConnectionIDs
1.47.2.21 dwinter 27: from AccessControl import ClassSecurityInfo
1.11 dwinter 28: from bibliography import *
1.42 dwinter 29: import time
1.47.2.28 dwinter 30: import xml.dom.minidom
31: import sys
1.47.2.29 dwinter 32: from Ft.Xml.XPath import Evaluate
33: from Ft.Xml.XPath.Context import Context
34: from Ft.Xml.Domlette import NonvalidatingReader,PrettyPrint, Print
35: from Ft.Xml import EMPTY_NAMESPACE
1.47.2.64 dwinter 36: import copy
1.11 dwinter 37:
1.1 dwinter 38: 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']
39:
40: checkFields = ['xdata_01']
41:
1.9 dwinter 42:
1.47.2.28 dwinter 43: def getTextFromNode(nodename):
44: nodelist=nodename.childNodes
45: rc = ""
46: for node in nodelist:
47: if node.nodeType == node.TEXT_NODE:
48: rc = rc + node.data
49: return rc
1.9 dwinter 50:
1.47.2.57 dwinter 51:
52: def sortStopWordsF(self,xo,yo):
53: if not hasattr(self,'_v_stopWords'):
54: self._v_stopWords=self.stopwords_en.data.split("\n")
55:
56: x=str(xo[1])
57: y=str(yo[1])
58:
59: strx=x.split(" ")
60: stry=y.split(" ")
61:
62: for tmp in strx:
63: if tmp.lower() in self._v_stopWords:
64: del strx[strx.index(tmp)]
65:
66: for tmp in stry:
67: if tmp.lower() in self._v_stopWords:
68: del stry[stry.index(tmp)]
69:
70: return cmp(" ".join(strx)," ".join(stry))
71:
72: def sortStopWords(self):
73: return lambda x,y : sortStopWordsF(self,x,y)
74:
1.1 dwinter 75: def sortF(x,y):
1.9 dwinter 76: try:
77: return cmp(x[1],y[1])
78: except:
1.18 dwinter 79: try:
80: return cmp(str(x[1]),str(y[1]))
81: except:
1.46 dwinter 82:
1.18 dwinter 83: return 0
1.5 dwinter 84:
85: def sortI(x,y):
86: xsplit=x[1].split(".")
87: ysplit=y[1].split(".")
88: xret=""
89: yret=""
90: try:
91: for i in range(5):
92: try:
93: yret=yret+"%04i"%int(xsplit[i])
94: except:
95: yret=yret+"%04i"%0
96:
97: try:
98: xret=xret+"%04i"%int(ysplit[i])
99: except:
100: xret=xret+"%04i"%0
101:
102:
103: return cmp(int(yret),int(xret))
104: except:
105: return cmp(x[1],y[1])
1.1 dwinter 106:
1.47.2.14 dwinter 107: class MPIWGLink(SimpleItem):
108: """create a symbolic link to another page"""
109:
110: meta_type="MPIWGLink"
111:
1.47.2.16 dwinter 112: def isActiveItem(self):
113: """teste ob ausgewaehlt"""
1.47.2.17 dwinter 114: #url1 beim link anstelle von url1, da link jeweils index_html als url hat.
115: if self.absolute_url()==self.REQUEST['URL1']:
1.47.2.16 dwinter 116: return "aktiv"
117: else:
118: return ""
1.47.2.15 dwinter 119:
1.47.2.14 dwinter 120: def __init__(self,id,link,title='',weight=''):
121: """init mpiwglink"""
122: self.id=id
123: self.link=link
124: self.title=title
125: self.weight=weight
126:
127: def getObj(self):
128: """bekomme original"""
129: ## objpath=self.link.replace("/",".")
130: ## if objpath[0]!=".":
131: ## objpath="."+objpath
132:
133: ## print objpath
134: ## return eval("self"+objpath)
135:
136:
1.47.2.15 dwinter 137: splitted=self.link.lstrip().split("/")
1.47.2.14 dwinter 138: obj=self
139: for x in splitted:
1.47.2.25 dwinter 140: if not x=="":
1.47.2.15 dwinter 141: obj=getattr(obj,x)
1.47.2.14 dwinter 142:
143: return obj
144:
145: def getWeight(self):
146: if self.linkWeight and linkWeight!="":
147: return self.linkWeight
148: else:
149: return self.getObj().weight
150:
1.47.2.63 dwinter 151: manage_options=(
1.47.2.14 dwinter 152: {'label':'main config','action':'changeLinkForm'},
1.47.2.63 dwinter 153: )+SimpleItem.manage_options
1.47.2.14 dwinter 154:
155:
156: def changeLinkForm(self):
157: """change MPIWG link"""
158: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGLinkChange.zpt')).__of__(self)
159: return pt()
160:
161: def changeLink(self,link,title,weight,RESPONSE=None):
162: """change links"""
163: self.link=link
164: self.title=title
165: self.weight=weight
166:
167: if RESPONSE is not None:
168: RESPONSE.redirect('manage')
169:
1.47.2.69 dwinter 170: def index_html(self,**argv):
1.47.2.14 dwinter 171: """index"""
1.47.2.70! dwinter 172:
! 173:
! 174:
! 175: try:
! 176: return self.getObj().pt_render(extra_context={'here':self})
! 177: except:
! 178: self.REQUEST.RESPONSE.redirect(self.getObj().absolute_url())
! 179:
1.47.2.69 dwinter 180:
1.47.2.14 dwinter 181:
182: def manage_addMPIWGLinkForm(self):
183: """Form for adding link"""
184: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGLink.zpt')).__of__(self)
185: return pt()
186:
187: def manage_addMPIWGLink(self,id,link,title,weight,RESPONSE=None):
188: """add link"""
189: newObj=MPIWGLink(id,link,title,weight)
190:
191: self._setObject(id,newObj)
192:
193: if RESPONSE is not None:
194: RESPONSE.redirect('manage_main')
195:
196:
1.37 dwinter 197: class MPIWGTemplate(ZopePageTemplate):
198: """Create a layout Template for different purposes"""
199:
200: meta_type="MPIWGTemplate"
201:
1.47.2.1 dwinter 202: manage_options=ZopePageTemplate.manage_options+(
203: {'label':'Change Weight','action':'changeWeightForm'},
204: )
205:
206: def changeWeightForm(self):
207: """change weight form"""
208: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGTemplateChangeWeight.zpt')).__of__(self)
209: return pt()
210:
211: def changeWeight(self,weight,RESPONSE=None):
212: """change weight"""
213: self.weight=weight
214: if RESPONSE is not None:
215: RESPONSE.redirect('manage')
216:
217:
1.37 dwinter 218: def __init__(self, id, text=None, content_type=None,MPIWGType=None):
219: self.id = str(id)
220:
221:
222:
223: self.ZBindings_edit(self._default_bindings)
224: if text is None:
225: self._default_content_fn = os.path.join(package_home(globals()),
226: 'zpt/MPIWG_%s_template_standard.zpt'%MPIWGType)
227: text = open(self._default_content_fn).read()
228: self.pt_edit(text, content_type)
229:
230:
231: """change form"""
232:
1.47.2.16 dwinter 233: def isActiveItem(self):
1.47.2.1 dwinter 234: """teste ob ausgewaehlt"""
235: if self.absolute_url()==self.REQUEST['URL']:
236: return "aktiv"
237: else:
238: return ""
1.47.2.25 dwinter 239:
1.37 dwinter 240: def manage_addMPIWGTemplateForm(self):
241: """Form for adding"""
242: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGTemplate.zpt')).__of__(self)
243: return pt()
244:
245: from urllib import quote
246:
247:
1.47.2.1 dwinter 248: def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,weight=0,REQUEST=None):
1.37 dwinter 249: "Add a Page Template with optional file content."
250: if type(MPIWGType)==StringType:
251: MPIWGTypes=[MPIWGType]
252: else:
253: MPIWGTypes=MPIWGType
254:
255: for singleType in MPIWGTypes:
256:
257:
258: if REQUEST is None:
259: self._setObject(id, MPIWGTemplate(id, text,EchoType=singleType))
260: ob = getattr(self, id)
261:
262: if title:
263: ob.pt_setTitle(title)
264: return ob
265: else:
266: file = REQUEST.form.get('file')
267: headers = getattr(file, 'headers', None)
268: if headers is None or not file.filename:
269: zpt = MPIWGTemplate(id,MPIWGType=singleType)
270: else:
271: zpt = MPIWGTemplate(id, file, headers.get('content_type'))
272:
273: self._setObject(id, zpt)
274: ob = getattr(self, id)
275: if title:
276: ob.pt_setTitle(title)
277:
278: try:
279: u = self.DestinationURL()
280: except AttributeError:
281: u = REQUEST['URL1']
282:
1.47.2.1 dwinter 283: ob = getattr(self, id)
284: ob.weight=weight
285:
1.37 dwinter 286: REQUEST.RESPONSE.redirect(u+'/manage_main')
287: return ''
288:
1.5 dwinter 289:
1.11 dwinter 290: class MPIWGRoot(ZSQLExtendFolder):
1.47.2.65 casties 291: """Stammordner fuer den Web-Server"""
1.1 dwinter 292:
1.9 dwinter 293: fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department',
294: 'xdata_03':'Historical Persons','xdata_04':'Time period',
295: 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title',
1.47.2.18 dwinter 296: 'xdata_08':'Other involved scholars' ,'xdata_09':'Disciplines','xdata_10':'Themes',
1.9 dwinter 297: 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners',
298: 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header',
299: 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'}
300:
1.38 dwinter 301: folders=['MPIWGProject','Folder','ECHO_Navigation']
1.1 dwinter 302: meta_type='MPIWGRoot'
1.8 dwinter 303:
1.47.2.68 dwinter 304:
1.47.2.57 dwinter 305: def harvestProjects(self):
306: """harvest"""
307: folder="/tmp"
308: try:
309: os.mkdir("/tmp/harvest_MPIWG")
310: except:
311: pass
312: founds=self.ZopeFind(self.aq_parent.projects,obj_metatypes=['MPIWGProject'],search_sub=1)
313: for found in founds:
314: txt=found[1].harvest_page()
315:
316: if txt and (txt != ""):
317: name=found[0].replace("/","_")
318: fh=file("/tmp/harvest_MPIWG/"+name,"w")
319: fh.write(txt)
320: fh.close()
321:
1.47.2.53 dwinter 322: def decode(self,str):
323: """decoder"""
324: if not str:
325: return ""
326: if type(str) is StringType:
327: try:
328: return str.decode('utf-8')
329: except:
330: return str.decode('latin-1')
331: else:
332:
333: return str
334:
1.47.2.63 dwinter 335:
336: def browserCheck(self):
337: """check the browsers request to find out the browser type"""
338: bt = {}
339: ua = self.REQUEST.get_header("HTTP_USER_AGENT")
340: bt['ua'] = ua
341: bt['isIE'] = False
342: bt['isN4'] = False
343: if string.find(ua, 'MSIE') > -1:
344: bt['isIE'] = True
345: else:
346: bt['isN4'] = (string.find(ua, 'Mozilla/4.') > -1)
347:
348: try:
349: nav = ua[string.find(ua, '('):]
350: ie = string.split(nav, "; ")[1]
351: if string.find(ie, "MSIE") > -1:
352: bt['versIE'] = string.split(ie, " ")[1]
353: except: pass
354:
355: bt['isMac'] = string.find(ua, 'Macintosh') > -1
356: bt['isWin'] = string.find(ua, 'Windows') > -1
357: bt['isIEWin'] = bt['isIE'] and bt['isWin']
358: bt['isIEMac'] = bt['isIE'] and bt['isMac']
359: bt['staticHTML'] = False
360:
361: return bt
362:
363:
1.47.2.20 dwinter 364: def versionHeaderEN(self):
365: """version header text"""
366:
367: date= self.REQUEST.get('date',None)
368: if date:
369: txt="""<h2>This pages shows the project which existed at %s</h2>"""%str(date)
370: return txt
371: return ""
372:
373: def versionHeaderDE(self):
374: """version header text"""
375: date= self.REQUEST.get('date',None)
376: if date:
377: txt="""<h2>Auf dieser Seite finden Sie die Projekte mit Stand vom %s</h2>"""%str(date)
378: return ""
379:
1.47.2.28 dwinter 380:
381: def createOrUpdateId_raw(self):
382: """create sequence to create ids for bibliography"""
383: debug=None
384: #suche groesste existierende id
385: founds=self.ZSQLQuery("select id from bibliography")
386:
387: if founds:
388: ids=[int(x.id[1:]) for x in founds]
389: maximum=max(ids)
390:
1.47.2.32 dwinter 391: id_raw=self.ZSQLQuery("select nextval('id_raw')",debug=debug)
1.47.2.28 dwinter 392:
393: if id_raw:
1.47.2.32 dwinter 394: self.ZSQLQuery("drop sequence id_raw",debug=debug)
1.47.2.28 dwinter 395:
1.47.2.32 dwinter 396: self.ZSQLQuery("create sequence id_raw start %i"%(maximum+1),debug=debug)
1.47.2.28 dwinter 397:
398:
1.47.2.18 dwinter 399: def queryLink(self,link):
400: """append querystring to the link"""
401: return "%s?%s"%(link,self.REQUEST.get('QUERY_STRING',''))
402:
1.47.2.7 dwinter 403: def getKategory(self,url):
1.47.2.25 dwinter 404: """kategorie"""
405: splitted=url.split("/")
406: return splitted[4]
1.47.2.7 dwinter 407:
1.47.2.6 dwinter 408: def generateUrlProject(self,url,project=None):
1.47.2.5 dwinter 409: """erzeuge aus absoluter url, relative des Projektes"""
1.47.2.25 dwinter 410: if project:
1.47.2.18 dwinter 411: splitted=url.split("/")
412: length=len(splitted)
413: short=splitted[length-2:length]
414:
415: base=self.REQUEST['URL3']+"/"+"/".join(short)
416:
1.47.2.25 dwinter 417: else:
1.47.2.18 dwinter 418: findPart=url.find("/projects/")
419: base=self.REQUEST['URL1']+"/"+url[findPart:]
420:
421:
1.47.2.5 dwinter 422: return base
423:
1.47.2.1 dwinter 424: def isNewCapital(self,text=None,reset=None):
425: if reset:
426: self.REQUEST['capital']="A"
427: return True
428: else:
429: if len(text)>0 and not (text[0]==self.REQUEST['capital']):
430: self.REQUEST['capital']=text[0]
431: return True
432: else:
433: return False
1.47.2.56 dwinter 434:
435: def subNavStatic(self,obj):
436: """subnav" von self"""
437: def sortWeight(x,y):
438: x1=int(getattr(x[1],'weight','0'))
439: y1=int(getattr(y[1],'weight','0'))
440: return cmp(x1,y1)
441:
442: subs=self.ZopeFind(obj,obj_metatypes=['MPIWGTemplate','MPIWGLink'])
443: subret=[]
444:
445: for x in subs:
446: if not(x[1].title==""):
447: subret.append(x)
448: subret.sort(sortWeight)
449: return subret
450:
1.47.2.16 dwinter 451: def subNav(self,obj):
1.47.2.1 dwinter 452: """return subnav elemente"""
453: def sortWeight(x,y):
454: x1=int(getattr(x[1],'weight','0'))
455: y1=int(getattr(y[1],'weight','0'))
456: return cmp(x1,y1)
1.47.2.16 dwinter 457: #if obj.meta_type in ['MPIWGTemplate','MPIWGLink']:
458: # id=obj.aq_parent.getId()
459: #else:
460:
461: #id=obj.getId()
1.47.2.17 dwinter 462:
463:
464: #suche die zweite ebene
1.47.2.56 dwinter 465:
1.47.2.17 dwinter 466: if not obj.aq_parent.getId() in ['de','en']:
467: obj=obj.aq_parent
1.47.2.56 dwinter 468:
1.47.2.16 dwinter 469: while not self.ZopeFind(self,obj_ids=[obj.getId()]):
470: obj=obj.aq_parent
1.47.2.17 dwinter 471:
1.47.2.56 dwinter 472:
1.47.2.16 dwinter 473: if hasattr(self,obj.getId()):
474:
475: subs=self.ZopeFind(getattr(self,obj.getId()),obj_metatypes=['MPIWGTemplate','MPIWGLink'])
1.47.2.8 dwinter 476: subret=[]
1.47.2.16 dwinter 477:
1.47.2.8 dwinter 478: for x in subs:
479: if not(x[1].title==""):
480: subret.append(x)
481: subret.sort(sortWeight)
482: return subret
1.47.2.2 dwinter 483: else:
484: return None
1.47.2.16 dwinter 485:
1.47.2.1 dwinter 486: def isActive(self,name):
487: """teste ob subnavigation aktiv"""
488: for part in self.REQUEST['URL'].split("/"):
489: if part==name:
490: return True
491: return False
492:
1.47.2.62 casties 493: def getSection(self):
494: """returns the current section name"""
495: root = self.absolute_url()
496: url = self.REQUEST['URL']
497: path = string.replace(url, root, '')
498: paths = path.split('/')
499: if len(paths) > 0:
1.47.2.63 dwinter 500: sec = paths[1]
501: if sec.find('.') < 0:
502: return sec
503: else:
504: return None
1.47.2.62 casties 505: return None
506:
507: def getSectionStyle(self, name, style=""):
508: """returns a string with the given style + '-sel' if the current section == name"""
509: if self.getSection() == name:
510: return style + '-sel'
511: else:
512: return style
513:
514: def MPIWGrootURL(self):
515: """returns the URL to the root"""
516: return self.absolute_url()
1.47.2.1 dwinter 517:
1.34 dwinter 518: def upDateSQL(self,fileName):
519: """updates SQL databases using fm.jar"""
520: fmJarPath=os.path.join(package_home(globals()), 'updateSQL/fm.jar')
521: xmlPath=os.path.join(package_home(globals()), "updateSQL/%s"%fileName)
1.40 dwinter 522: zLOG.LOG("MPIWG Web",zLOG.INFO,"java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath))
523: ret=os.popen("java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath),"r").read()
1.47.2.25 dwinter 524: zLOG.LOG("MPIWG Web",zLOG.INFO,"result convert: %s"%ret)
1.34 dwinter 525: return 1
526:
1.31 dwinter 527: def patchProjects(self,RESPONSE):
528: """patch"""
529: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'])
530: for project in projects:
1.47.2.25 dwinter 531: tmp=project[1].WEB_project_description[0].replace("/CD/projects/","")[0:]
532: setattr(project[1],'WEB_project_description',[tmp[0:]])
533: RESPONSE.write("<p>%s</p>\n"%project[0])
1.31 dwinter 534:
1.11 dwinter 535: def replaceNotEmpty(self,format,field):
536: """replace not empty"""
1.44 dwinter 537: if field and (not field.lstrip()==''):
1.11 dwinter 538: return format%field
539: else:
540: return ""
541:
1.29 dwinter 542:
1.45 dwinter 543: def isActual(self,project):
544: """checke if project is actual"""
545: actualTime=time.localtime()
546: obj= project.getObject()
547:
548: if getattr(obj,'archiveTime',actualTime)< actualTime:
549: return False
550: else:
551: return True
552:
1.29 dwinter 553: def redirectIndex_html(self,request):
554: #return request['URL1']+'/index_html'
1.11 dwinter 555:
1.29 dwinter 556: return urllib.urlopen(request['URL1']+'/index_html').read()
557:
558:
1.11 dwinter 559: def formatBibliography(self,here,found):
560: """format"""
561: return formatBibliography(here,found)
562:
1.21 dwinter 563: def getValue(self,fieldStr):
1.9 dwinter 564: """Inhalt des Feldes"""
565:
1.21 dwinter 566: if type(fieldStr)==StringType:
567: field=fieldStr
1.9 dwinter 568: else:
1.21 dwinter 569: field=fieldStr[0]
570: try:
571: if field[len(field)-1]==";":
572: field=field[0:len(field)-1]
573: except:
574:
575: """nothing"""
576: field=re.sub(r';([^\s])','; \g<1>',field)
577: return field.encode('utf-8')
578:
1.9 dwinter 579:
580:
1.8 dwinter 581: def sortedNames(self,list):
582: """sort names"""
583:
1.12 dwinter 584: def sortLastName(x_c,y_c):
1.13 dwinter 585: try:
586: x=urllib.unquote(x_c).encode('utf-8','ignore')
587: except:
588: x=urllib.unquote(x_c)
589:
590: try:
591: y=urllib.unquote(y_c).encode('utf-8','ignore')
592: except:
593: x=urllib.unquote(y_c)
594:
595:
1.12 dwinter 596:
1.8 dwinter 597: try:
598: last_x=x.split()[len(x.split())-1]
599: last_y=y.split()[len(y.split())-1]
600:
601: except:
602:
603: last_x=""
604: last_y=""
605:
606:
607:
608: if last_x<last_y:
609: return 1
610: elif last_x>last_y:
611: return -1
612: else:
613: return 0
614:
615: list.sort(sortLastName)
616: list.reverse()
617:
618: return list
1.1 dwinter 619:
620: def __init__(self, id, title):
621: """init"""
622: self.id=id
623: self.title=title
1.12 dwinter 624:
1.47.2.57 dwinter 625: def removeStopWords(self,xo):
626: """remove stop words from xo"""
627: if not hasattr(self,'_v_stopWords'):
628: self._v_stopWords=self.stopwords_en.data.split("\n")
629:
630: x=str(xo)
631:
632: strx=x.split(" ")
633:
634: for tmp in strx:
635:
636: if tmp.lower() in self._v_stopWords:
637: del strx[strx.index(tmp)]
638:
639: return " ".join(strx)
640:
1.12 dwinter 641: def urlQuote(self,str):
642: """quote"""
643: return urllib.quote(str)
644:
645: def urlUnQuote(self,str):
646: """quote"""
647: return urllib.unquote(str)
648:
1.8 dwinter 649:
650:
1.47.2.19 dwinter 651: def getProjectsByFieldContent(self,fieldName,fieldContentsEntry, date=None):
1.47.2.65 casties 652: """gib alle Projekte aus mit Value von field mit fieldName enthaelt ein Element der Liste fieldContents"""
1.47.2.10 dwinter 653: def sort(x,y):
1.47.2.25 dwinter 654: return cmp(x.WEB_title[0],y.WEB_title[0])
1.47.2.10 dwinter 655:
1.47.2.25 dwinter 656: if type(fieldContentsEntry) is StringType:
1.47.2.13 dwinter 657: fieldContentsTmp=[fieldContentsEntry]
1.8 dwinter 658: else:
1.47.2.13 dwinter 659: fieldContentsTmp=fieldContentsEntry
660:
661: fieldContents=[]
662: for x in fieldContentsTmp:
663: fieldContents.append(" AND ".join(x.split()))
664: projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' AND')})
1.8 dwinter 665: #print projects
1.47.2.25 dwinter 666: #ret=[x for x in projects]
1.47.2.19 dwinter 667: ret=[]
668: for x in projects:
669: obj=x.getObject()
670: obj=obj.getActualVersion(date)
671: if obj and (not getattr(obj,'invisible',None)):
672: #if not (x in ret):
673: ret.append(x)
674:
1.47.2.25 dwinter 675: ret.sort(sort)
1.47.2.10 dwinter 676: return ret
1.8 dwinter 677:
678: def changeMPIWGRootForm(self):
679: """edit"""
1.45 dwinter 680: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGRootForm')).__of__(self)
1.8 dwinter 681: return pt()
682:
1.45 dwinter 683: def changeMPIWGRoot(self,title,disciplineList,themesList,connection_id,RESPONSE=None):
1.8 dwinter 684: """change"""
685: self.title=title
1.45 dwinter 686: self.connection_id=connection_id
1.8 dwinter 687: self.disciplineList=disciplineList
688: self.themesList=themesList
689:
690: if RESPONSE is not None:
691: RESPONSE.redirect('manage_main')
692:
1.9 dwinter 693: def getDisciplineList(self):
694: """get disciplines as list"""
1.47.2.12 dwinter 695: list= self.disciplineList.split("\n")
696: return [x.rstrip().lstrip() for x in list]
1.9 dwinter 697:
698: def getThemeList(self):
699: """get themes as list"""
1.47.2.12 dwinter 700: list= self.themesList.split("\n")
701: return [x.rstrip().lstrip() for x in list]
1.9 dwinter 702:
1.8 dwinter 703: def test(self):
704: """test"""
705: return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url
1.9 dwinter 706:
1.47.2.54 dwinter 707: def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True):
1.9 dwinter 708: """childs alle childs, alle parents"""
709: ret=[]
1.47.2.20 dwinter 710:
1.9 dwinter 711: if parents:
712: splitted=parents.split(".")
713: parentId=string.join(splitted[0:len(splitted)-1],".")
714:
1.47.2.18 dwinter 715: for project in self.getProjectFields('xdata_05',sort='int',date=date):
1.9 dwinter 716: if project[1]==parentId:
717: ret.append(project)
718:
719: if childs:
1.47.2.18 dwinter 720: for project in self.getProjectFields('xdata_05',sort='int',date=date):
1.9 dwinter 721: searchStr=childs+"(\..*)"
1.47.2.54 dwinter 722:
723: if (onlyActive and project[0].isActiveProject()) or (not onlyActive):
724: if re.match(searchStr,project[1]):
725:
726: if depth:
727:
728: if int(depth)>=len(project[1].split("."))-len(childs.split(".")):
729:
730: ret.append(project)
731: else:
1.9 dwinter 732: ret.append(project)
733: return ret
1.8 dwinter 734:
1.47.2.18 dwinter 735: def getProjectFields(self,fieldName,date=None,folder=None,sort=None):
1.1 dwinter 736: """getListofFieldNames"""
737: ret=[]
1.38 dwinter 738:
1.44 dwinter 739: objects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject'],search_sub=0)
1.5 dwinter 740:
1.38 dwinter 741:
742: for object in objects:
743: obj=object[1]
1.47.2.18 dwinter 744: obj=obj.getActualVersion(date)
745: if obj and (not getattr(obj,'invisible',None)):
1.41 dwinter 746: if fieldName=="WEB_title_or_short":
747:
748: if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
749: fieldNameTmp="WEB_title"
750: else:
751: fieldNameTmp="xdata_07"
1.38 dwinter 752: else:
1.41 dwinter 753: fieldNameTmp=fieldName
754:
755: ret.append((obj,obj.getContent(fieldNameTmp)))
1.5 dwinter 756:
1.38 dwinter 757:
1.5 dwinter 758: if sort=="int":
759: ret.sort(sortI)
1.47.2.57 dwinter 760: elif sort=="stopWords":
1.47.2.58 dwinter 761:
1.47.2.57 dwinter 762: ret.sort(sortStopWords(self))
763:
1.5 dwinter 764: else:
765: ret.sort(sortF)
1.1 dwinter 766:
767: return ret
768:
1.5 dwinter 769: def showNewProjects(self):
770: projects=[]
771: for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
1.47.2.18 dwinter 772: if objs[0].xdata_05 and (objs[0].xdata_05[0] == ""):
1.5 dwinter 773:
774: projects.append(objs)
775:
776: return projects
777:
778:
1.1 dwinter 779: manage_options = Folder.manage_options+(
1.47.2.30 dwinter 780: {'label':'Update personal homepages','action':'updateHomepages'},
781: {'label':'Reindex catalogs','action':'reindexCatalogs'},
1.8 dwinter 782: {'label':'Main config','action':'changeMPIWGRootForm'},
1.47.2.30 dwinter 783: #{'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'},
784: #{'label':'Store Historical Persons','action':'storeHistoricalPersons'},
1.1 dwinter 785: )
786:
787: def importNamesForm(self):
788: """Form"""
1.45 dwinter 789: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGNamesForm.zpt')).__of__(self)
1.1 dwinter 790: return pt()
791:
792: def importNames(self,fileupload,folderName,RESPONSE=None):
793: """import komma-sep list email,lastName,firstName"""
794: project=getattr(self,folderName)
1.9 dwinter 795: load=fileupload.read()
1.1 dwinter 796:
1.9 dwinter 797: for line in load.split('\r'):
798:
799:
1.1 dwinter 800: splitted=line.split(",")
1.26 dwinter 801: # print splitted
1.9 dwinter 802:
1.1 dwinter 803: if not (splitted[0]==""):
804: newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
1.9 dwinter 805:
1.1 dwinter 806: try:
807: project._setObject(splitted[0],newObj)
1.26 dwinter 808: #print "done:",splitted[0]
1.1 dwinter 809: except:
1.46 dwinter 810: zLOG.LOG("MPIWG Web (importNames)",zLOG.INFO,"cannot import: %s"%splitted[0])
811:
1.9 dwinter 812:
1.1 dwinter 813: if RESPONSE is not None:
814: RESPONSE.redirect('manage_main')
815:
1.47.2.26 dwinter 816: def updatePublicationDB(self,personId=None):
817: """updates the publication db, i.e. copy year into the main table"""
818:
819: if personId:
1.47.2.27 dwinter 820: founds = self.ZSQLInlineSearch(_table="publications",id_main=personId)
1.47.2.26 dwinter 821: else:
822: founds = self.ZSQLInlineSearch(_table="publications")
823:
824: for found in founds:
1.47.2.30 dwinter 825:
826: if found.id_institutsbibliographie and (not found.id_institutsbibliographie =="") and (not found.id_institutsbibliographie =="0"):
827:
1.47.2.26 dwinter 828: entries = self.ZSQLInlineSearch(_table="institutsbiblio",id=found.id_institutsbibliographie)
829: for entry in entries:
1.47.2.27 dwinter 830: self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type)
1.47.2.26 dwinter 831:
832: if found.id_gen_bib and (not found.id_gen_bib ==""):
833: entries = self.ZSQLInlineSearch(_table="bibliography",id=found.id_gen_bib)
834: for entry in entries:
1.47.2.27 dwinter 835: self.ZSQLChange(_table='publications',_identify='oid=%s' % found.oid,year=entry.year,referencetype=entry.reference_type)
1.47.2.26 dwinter 836:
837: return True
838:
1.47.2.30 dwinter 839: def updateHomepages(self,RESPONSE=None):
1.47.2.28 dwinter 840: """ update"""
1.47.2.41 dwinter 841:
1.47.2.32 dwinter 842: RESPONSE.setHeader('Content-type', 'text/html')
1.47.2.28 dwinter 843: RESPONSE.write("<html><body>\n")
1.47.2.53 dwinter 844: RESPONSE.write("Update Institutsbibliography\n")
845: ret=self.upDateSQL('personalwww.xml')
1.47.2.64 dwinter 846: RESPONSE.write("done Insitutsbibliography:%s\n"%ret)
1.47.2.44 dwinter 847: url="http://itgroup.mpiwg-berlin.mpg.de:8050/FMPro?-db=personal-www&-format=-dso_xml&-lay=sql_export&-max=20000&-findall"
1.47.2.29 dwinter 848: dom = NonvalidatingReader.parseUri(url)
849: #fh=urllib.urlopen(url)
850: #dom=xml.dom.minidom.parse(fh)
1.47.2.53 dwinter 851:
1.47.2.30 dwinter 852: RESPONSE.write("got_xml_File\n")
1.47.2.28 dwinter 853:
854:
855: memberFolder=getattr(self,'members')
856: members=memberFolder.ZopeFind(memberFolder,obj_metatypes=["MPIWGStaff"])
857:
858: memberList=[x[0] for x in members]
1.47.2.29 dwinter 859: #print dom
860: #ctx=Context(dom,processorNss={EMPTY_NAMESPACE:'http://www.filemaker.com/fmpdsoresult'})
861: # Evaluate(u".//dn:ROW",contextNode=dom,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
862: #print dom.xpath(u'.//dn:ROW',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
863: for row in dom.xpath(u'.//dn:ROW',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'}):
864:
865: username=getTextFromNode(row.xpath('./dn:username',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
866: id=getTextFromNode(row.xpath('./dn:ID',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
867: name=getTextFromNode(row.xpath('./dn:Name',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
868: vorname=getTextFromNode(row.xpath('./dn:Vorname',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
869: title=getTextFromNode(row.xpath('./dn:Title',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
1.47.2.41 dwinter 870: position=getTextFromNode(row.xpath('./dn:Position',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
1.47.2.29 dwinter 871: e_mail=getTextFromNode(row.xpath('./dn:e_mail',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
872: e_mail_p=getTextFromNode(row.xpath('./dn:e_mail_p',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
873: date_from=getTextFromNode(row.xpath('./dn:Date_from',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
874: date_to=getTextFromNode(row.xpath('./dn:Date_to',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
875: abteilung=getTextFromNode(row.xpath('./dn:Abteilung',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
876: heimat_inst=getTextFromNode(row.xpath('./dn:heimat_inst',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
877: funded_by=getTextFromNode(row.xpath('./dn:funded_by',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
878: e_mail2=getTextFromNode(row.xpath('./dn:e_mail2',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
879: publish_the_data=getTextFromNode(row.xpath('./dn:publish_the_data',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
1.47.2.39 dwinter 880: stay_at_mpiwg=getTextFromNode(row.xpath('./dn:stay_at_mpiwg',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
1.47.2.29 dwinter 881: #cwNode=row.xpath('./dn:current_work.current',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]
882: cw=row.xpath('./dn:current_work/dn:DATA',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
1.47.2.28 dwinter 883: if cw:
884: txt=getTextFromNode(cw[0])
885: else:
886: txt=""
887:
1.47.2.29 dwinter 888: #cwNode=row.xpath('.//dn:current_work.publish',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0]
889: cw=row.xpath('./dn:current_work/dn:DATA',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
890:
1.47.2.28 dwinter 891: if cw:
892: txt_p=getTextFromNode(cw[0])
893: else:
894: txt_p=""
895:
896: project=getattr(self,'members')
897:
898: if not (username in memberList):#neuer eintrag
1.47.2.30 dwinter 899:
1.47.2.28 dwinter 900: try:
1.47.2.30 dwinter 901: newObj=MPIWGStaff.MPIWGStaff(str(username),name.encode('utf-8'),vorname.encode('utf-8'))
1.47.2.28 dwinter 902: memberFolder._setObject(str(username),newObj)
903: RESPONSE.write("<p>new:%s</p>\n"%username.encode('utf-8'))
904: obj=getattr(memberFolder,username)
1.47.2.29 dwinter 905: ret=obj.createNewDBEntry(publish_the_data,id,name,
1.47.2.41 dwinter 906: vorname,username,title,position,e_mail,
1.47.2.28 dwinter 907: e_mail_p,date_from,date_to,
908: abteilung,heimat_inst,funded_by,
1.47.2.46 dwinter 909: e_mail2,txt,txt_p,stay_at_mpiwg)
1.47.2.30 dwinter 910: RESPONSE.write("""<p>%s</p>"""%ret[1].encode('utf-8'))
1.47.2.28 dwinter 911: except:
912: RESPONSE.write("<p>ERROR:%s %s %s</p>\n"%(username.encode('utf-8'),name.encode('utf-8'),vorname.encode('utf-8')))
913: RESPONSE.write("<p> : %s %s"%sys.exc_info()[:2])
914: else:
915: RESPONSE.write("<p>update:%s</p>\n"%username.encode('utf-8'))
1.47.2.29 dwinter 916:
917: xquery=".//dn:ROW[dn:username='%s']"%username
918: results=dom.xpath(xquery,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
919: if len(results)>1:
920: RESPONSE.write("<p>WARNING (update): username %s not unique</p>\n"%username.encode('utf-8'))
921: xquery=".//dn:ROW[dn:publish_the_data='yes' and dn:username='%s']"%username
922: rd=dom.xpath(xquery,explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})
923: if len(rd)>1:#mehrere published
924: RESPONSE.write("<p>ERROR (update): username %s not unique and more then one date set to be published</p>\n"%username.encode('utf-8'))
925: # elif len(rd)==1:#nur einer published, kein published dann mache nichts
926: # publish_the_data=getTextFromNode(rd[0].xpath('./dn:publish_the_data',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
927: # date_from=getTextFromNode(rd[0].xpath('./dn:Date_from',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
928: # date_to=getTextFromNode(rd[0].xpath('./dn:Date_to',explicitNss={'dn':'http://www.filemaker.com/fmpdsoresult'})[0])
929: #
930:
931: obj=getattr(memberFolder,username)
932:
1.47.2.43 dwinter 933: done= obj.updateDBEntry(DBid=id,publish_the_data=publish_the_data,
1.47.2.28 dwinter 934: date_from=date_from,
1.47.2.51 dwinter 935: date_to=date_to,stay_at_mpiwg=stay_at_mpiwg,position=position,abteilung=abteilung)
1.47.2.45 dwinter 936: if not done and (publish_the_data=='yes'):
937:
1.47.2.43 dwinter 938: ret=obj.createNewDBEntry(publish_the_data,id,name,
939: vorname,username,title,position,e_mail,
940: e_mail_p,date_from,date_to,
941: abteilung,heimat_inst,funded_by,
1.47.2.46 dwinter 942: e_mail2,txt,txt_p,stay_at_mpiwg)
1.47.2.43 dwinter 943: if not ret[0]:
944:
1.47.2.45 dwinter 945: RESPONSE.write("<p>Error: %s</p>\n"%repr(ret[1]))
946: else:
947: RESPONSE.write("<p>New: %s</p>\n"%repr(ret[1]))
1.47.2.29 dwinter 948:
1.47.2.41 dwinter 949: #TODO: reindexCatlogs and updatePublications wieder einbaue
1.47.2.37 dwinter 950: #self.reindexCatalogs(RESPONSE)
1.47.2.30 dwinter 951:
1.47.2.44 dwinter 952: #self.updatePublicationDB()
953:
1.47.2.46 dwinter 954: #self.ZSQLResetConnection()
1.47.2.45 dwinter 955: RESPONSE.write("<h2>Done</h2></body></html>")
1.47.2.31 dwinter 956:
1.47.2.39 dwinter 957: return True
1.47.2.30 dwinter 958:
959: def reindexCatalogs(self,RESPONSE=None):
960: """reindex members and project catalog"""
961:
1.47.2.26 dwinter 962:
1.47.2.30 dwinter 963: try:
964: self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
965: self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
966: except:
967: zLOG.LOG("MPIWG Root (updatehomepage)",zLOG.WARNING," %s %s"%sys.exc_info()[:2])
968:
969:
970:
1.47.2.48 dwinter 971:
1.47.2.30 dwinter 972:
973: if RESPONSE:
974: RESPONSE.redirect('manage_main')
975:
976:
977:
978: def updateHomepages_old(self,RESPONSE):
979: """lege members an, alte version vollstaendige kopie aller fm-dateien per fm.jar"""
1.36 dwinter 980: self.upDateSQL('personalwww.xml')
1.39 dwinter 981: founds=self.ZSQLInlineSearch(_table='personal_www',publish_the_data='yes')
1.36 dwinter 982: project=getattr(self,'members')
983: for found in founds:
984:
985: if not (found.e_mail==""):
986: newObj=MPIWGStaff.MPIWGStaff(found.username,found.name,found.vorname)
987:
988: try:
989: project._setObject(found.username,newObj)
990: RESPONSE.write("<p>new:%s</p>\n"%found.username)
991: except:
992: RESPONSE.write("<p>old:%s (%s,%s)</p>\n"%(found.username,found.name,found.vorname))
993:
1.47.2.26 dwinter 994:
1.36 dwinter 995:
1.39 dwinter 996: #delete non existing
997:
998:
999: foundUserNames=[x.username for x in founds]
1000: for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1):
1001:
1002: if member[1].getId() not in foundUserNames:
1003: member[1].aq_parent.manage_delObjects(ids=[member[1].getId()])
1004: RESPONSE.write("<p>deleted:%s</p>\n"%member[1].getId())
1.45 dwinter 1005: try:
1006: self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
1007: except:
1008: pass
1009: self.ProjectCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1'])
1.39 dwinter 1010:
1.47.2.26 dwinter 1011: self.updatePublicationDB()
1012:
1.36 dwinter 1013: if RESPONSE is not None:
1014: RESPONSE.redirect('manage_main')
1015:
1016:
1.47.2.48 dwinter 1017: # def getAllMembers(self,reset=None):
1018: # """give list of all members"""
1019: # ret=[]
1020: #
1021: #
1022: # if reset or (getattr(self,'_v_membersList',None) is None):
1023: # for member in self.members._objects:
1024: # if member['meta_type']=='MPIWGStaff':
1025: # memberObj=getattr(self.members,member['id'])
1026: # if memberObj.isPublished():
1027: # ret.append(memberObj.title.decode('utf-8'))
1028: #
1029: # ret.sort()
1030: # self._v_membersList=ret[0:]
1031: # print ret
1032: #
1033: # return self._v_membersList
1.3 dwinter 1034:
1.47.2.48 dwinter 1035: def getAllMembers(self):
1036: #ret=[]
1037:
1038: results=self.MembersCatalog({'isPublished':True})
1039:
1.47.2.49 dwinter 1040: ret=[", ".join([proj.lastName, proj.firstName]).decode('utf-8') for proj in results]
1.47.2.48 dwinter 1041:
1.47.2.49 dwinter 1042: ret.sort()
1.3 dwinter 1043: return ret
1.9 dwinter 1044: def printAllMembers(self):
1.47.2.50 dwinter 1045: """print"""
1.9 dwinter 1046: members=self.getAllMembers()
1047: ret=""
1048: for x in members:
1049: ret+="<p>%s</p>"%x
1050: return ret
1051:
1052:
1.5 dwinter 1053: def makeList(self,entry):
1054: """makes a list out of one entry or repeat a list"""
1055: if type(entry) is StringType:
1056: return [entry]
1057: else:
1058: return entry
1059:
1060:
1.47.2.60 dwinter 1061: def getTree(self,dep=None,date=None,onlyActive=None):
1.5 dwinter 1062: """generate Tree from project list"""
1.47.2.20 dwinter 1063:
1.5 dwinter 1064: returnList=[]
1.47.2.18 dwinter 1065: for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05
1.41 dwinter 1066:
1.5 dwinter 1067: for idNr in project[1].split(";"): # more than one number
1068: if not idNr=="":
1069: splittedId=idNr.split(".")
1070: depth=len(splittedId)
1071: nr=idNr
1.14 dwinter 1072: #title=project[0].WEB_title
1073: title=[project[0].getContent('WEB_title')]
1074: #print title
1.47.2.54 dwinter 1075:
1.47.2.65 casties 1076: if idNr[0]=="x": # kompatibilitaet mit alter Konvention, x vor der Nummer macht project inactive
1.47.2.54 dwinter 1077: project[0].setActiveFlag(False)
1078:
1.47.2.65 casties 1079: if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.
1.47.2.60 dwinter 1080: if onlyActive and project[0].isActiveProject(): #nur active projekte
1081: returnList.append((depth,nr,title,project[0]))
1082: elif not onlyActive:
1083: returnList.append((depth,nr,title,project[0]))
1.5 dwinter 1084: return returnList
1085:
1.47.2.60 dwinter 1086: def formatElementsAsList(self,elements,onlyOneDept=False):
1.47.2.3 dwinter 1087: """formatiere tree als liste"""
1088:
1089: actualDepth=0
1090: ret=""
1091: for element in elements:
1092: if (element[0]>actualDepth):
1093: #fuege soviele ul ein wie unterschied in tiefe
1094: if element[0]==1:
1.47.2.10 dwinter 1095: ret+="""<div class="dept">\n<ul class="liste">\n"""
1.47.2.3 dwinter 1096: else:
1097: for i in range(element[0]-actualDepth):
1.47.2.12 dwinter 1098: if i>0:
1099: ret+="<li>"
1.47.2.10 dwinter 1100: ret+="""<ul class="liste">\n"""
1.47.2.12 dwinter 1101:
1.47.2.3 dwinter 1102: actualDepth=element[0]
1103:
1104: elif (element[0]<actualDepth):
1105: #fuege soviele /ul ein wie unterschied in tiefe
1106: for i in range(-element[0]+actualDepth):
1.47.2.12 dwinter 1107:
1108: ret+="<br><br></li></ul>\n"
1109:
1110: #ret+="<br><br>\n</li>\n</ul>\n</li>\n"
1111:
1.33 casties 1112:
1.47.2.3 dwinter 1113: if element[0]==1:
1114: department=int(element[3].getContent('xdata_05'))-1
1115:
1.47.2.10 dwinter 1116: ret+="""</ul></div>\n"""
1.47.2.25 dwinter 1117: if department==4: #hack
1118: department=3
1.47.2.11 dwinter 1119:
1.47.2.3 dwinter 1120: ret+="""<div class="bildspalte"><img src="../grafik/dept%i.jpg" width="160" height="120" vspace="40"></div>
1.47.2.10 dwinter 1121: <div class="dept">\n<ul class="liste">\n
1.47.2.3 dwinter 1122: """%department
1123:
1124: actualDepth=element[0]
1125: else:
1.47.2.10 dwinter 1126: ret+="""\n</li>\n"""
1.47.2.3 dwinter 1127: ret+="""<li>\n"""
1128:
1129: if actualDepth==1:
1.47.2.52 dwinter 1130: departmentName={'1':'Department I','2':'Department II','3':'Department III', '4':'Ind. Research Group','5':'Ind. Research Group','6':'Ind. Research Group','7':'Research Network'}
1.47.2.3 dwinter 1131: department=element[3].getContent('xdata_05')
1.47.2.60 dwinter 1132: if not onlyOneDept:
1133: 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 1134:
1.47.2.18 dwinter 1135: if self.REQUEST.has_key('date'):
1136: ret+="""<a href="%s?date=%s">%s</a>"""%(self.generateUrlProject(element[3].absolute_url())+"/index.html",self.REQUEST['date'],element[3].getContent('WEB_title'))
1137: else:
1138: ret+="""<a href="%s">%s</a>"""%(self.generateUrlProject(element[3].absolute_url())+"/index.html",element[3].getContent('WEB_title'))
1.47.2.3 dwinter 1139: return ret
1140:
1.16 dwinter 1141: def formatElementForOverview(self,element):
1142: """format the element for output in overview"""
1143: if element[0]==1: #department
1.26 dwinter 1144: #print element[3].getContent('xdata_05')
1.23 dwinter 1145: if element[3].getContent('xdata_05') == "4":
1.33 casties 1146: 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 1147: if element[3].getContent('xdata_05') == "5":
1.33 casties 1148: 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.47.2.38 dwinter 1149: if element[3].getContent('xdata_05') == "6":
1150: return """<h2 class="hier"><a href="%s">Research Network "History of Scientific Objects": %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
1.23 dwinter 1151:
1.33 casties 1152: 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 1153:
1154: elif element[0]==2: #mainprojects
1.33 casties 1155: 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 1156:
1157: elif element[0]==3:
1.33 casties 1158: return """<p class="hier"><a href="%s">%s</a></p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title'))
1159:
1.16 dwinter 1160:
1.5 dwinter 1161: def changePosition(self,treeId,select,RESPONSE=None):
1162: """Change Postion Entry"""
1163: numbers=[]
1164:
1165: # Suche hoechste bisherige nummer
1166: projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
1.8 dwinter 1167: #print "pj",projects
1.5 dwinter 1168: for project in projects: #suche alle subtrees der treeId
1169: #print treeId
1170:
1171: founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
1172: if founds:
1173: #print "x",founds.group(0),len(founds.group(0).split("."))
1174: if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
1175: try:
1176: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
1177: except:
1.6 dwinter 1178: numbers.append(int(0))
1179:
1180: try:
1181: highest=max(numbers)
1182: except:
1183: highest=0
1.5 dwinter 1184: projects=self.showNewProjects()
1185: for i in self.makeList(select):
1186: highest+=10
1187: projects[int(i)][0].xdata_05=treeId+"."+str(highest)
1188:
1189:
1190: if RESPONSE is not None:
1191: RESPONSE.redirect('showTree')
1192:
1193: def changeTree(self,RESPONSE=None):
1194: """change the complete tree"""
1195: form=self.REQUEST.form
1196: hashList={}
1197: fields=self.getTree()
1198:
1199:
1200: for idNr in form.keys():
1.47.2.54 dwinter 1201:
1202: splitted=idNr.split('_')
1203:
1204: if len(splitted)==1: # name des Feldes = idNr, dann Aendere id_nr
1205: if not (fields[int(idNr)][3].xdata_05==form[idNr]):
1206: fields[int(idNr)][3].xdata_05=form[idNr]
1207: fields[int(idNr)][3].copyObjectToArchive()
1208:
1209: if form.has_key(idNr+'_active'): # active flag is set
1210:
1211: fields[int(splitted[0])][3].setActiveFlag(True)
1212: else:
1213:
1214: fields[int(splitted[0])][3].setActiveFlag(False)
1215:
1.5 dwinter 1216: if RESPONSE is not None:
1217: RESPONSE.redirect('showTree')
1218:
1219: def getProjectWithId(self,id):
1220: fields=self.getProjectFields('xdata_05')
1221: for field in fields:
1222: if field[1]==id:
1223: return field[0]
1224:
1225: return None
1226:
1227:
1228:
1229:
1.15 dwinter 1230: def getRelativeUrlFromPerson(self,list):
1231: """get urls to person list"""
1232: ret=[]
1233: persons=list.split(";")
1234: for person in persons:
1235:
1236: if len(person)>1: #nicht nur Trennzeichen
1237: splitted=person.split(",")
1238: if len(splitted)==1:
1239: splitted=person.split(" ")
1240: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
1241: if splittedNew[0]=='':
1242: del splittedNew[0]
1243: search=string.join(splittedNew,' AND ')
1244:
1245: if not search=='':
1246:
1247: try:
1248: proj=self.MembersCatalog({'title':search})
1249: except:
1250: proj=None
1251:
1252: if proj:
1253: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
1.29 dwinter 1254: ret.append("<a href=%s >%s</a>"%('members/'+proj[0].id+'/index.html',person))
1.15 dwinter 1255: else:
1256: #ret.append("%s"%person.encode('utf-8'))
1257: ret.append("%s"%person)
1258: return string.join(ret,";")
1.5 dwinter 1259:
1260:
1.47.2.65 casties 1261: def getMembersFromList(self,list):
1262: """get member names from person full text list"""
1263: memberlist=[]
1264: persons=list.split(";")
1265: for person in persons:
1266: if len(person)>1: #nicht nur Trennzeichen
1267: splitted=person.split(",")
1268: if len(splitted)==1:
1269: splitted=person.lstrip().rstrip().split(" ")
1270: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
1271: if splittedNew[0]=='':
1272: del splittedNew[0]
1273: search=string.join(splittedNew,' AND ')
1274:
1275: if not search=='':
1276: try:
1277: member=self.MembersCatalog({'title':search})
1278: except:
1279: member=None
1280:
1281: if member and (member[0].getObject().isPublished()):
1282: if person =="Otto Sibum" : person="H. Otto Sibum"
1283: if person =="Norton Wise" : person="M. Norton Wise"
1284: #memberlist.append("<a href=%s >%s</a>"%(member[0].absolute_url,person.encode('utf-8')))
1285: memberlist.append((person, member[0].getObject().getId()))
1286: else:
1287: #memberlist.append("%s"%person.encode('utf-8'))
1288: memberlist.append((person,None))
1289: return memberlist
1290:
1.3 dwinter 1291: def getUrlFromPerson(self,list):
1292: """get urls to person list"""
1293: ret=[]
1294: persons=list.split(";")
1295: for person in persons:
1296:
1.9 dwinter 1297: if len(person)>1: #nicht nur Trennzeichen
1298: splitted=person.split(",")
1299: if len(splitted)==1:
1.26 dwinter 1300: splitted=person.lstrip().rstrip().split(" ")
1.9 dwinter 1301: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
1302: if splittedNew[0]=='':
1303: del splittedNew[0]
1304: search=string.join(splittedNew,' AND ')
1.4 dwinter 1305:
1.9 dwinter 1306: if not search=='':
1307:
1308: try:
1309: proj=self.MembersCatalog({'title':search})
1310: except:
1311: proj=None
1312:
1.47.2.30 dwinter 1313: if proj and (proj[0].getObject().isPublished()):
1.47.2.25 dwinter 1314: if person =="Otto Sibum" : person="H. Otto Sibum"
1315: if person =="Norton Wise" : person="M. Norton Wise"
1.12 dwinter 1316: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
1.47.2.63 dwinter 1317: if self.MPIWGrootURL().split("/")[-1]=='en':
1318: tmpPath="/en/staff/members/"
1319: else:
1.47.2.65 casties 1320: tmpPath="/de/mitarbeiter/members/"
1.47.2.63 dwinter 1321: ret.append("<a href=%s >%s</a>"%(tmpPath+proj[0].getObject().getId()+"/index.html",person))
1.9 dwinter 1322: else:
1.12 dwinter 1323: #ret.append("%s"%person.encode('utf-8'))
1.9 dwinter 1324: ret.append("%s"%person)
1.3 dwinter 1325: return string.join(ret,";")
1326:
1.47.2.18 dwinter 1327: def getProjectsOfMembers(self,date=None):
1.3 dwinter 1328: """give tuple member /projects"""
1329: ret=[]
1330: members=self.getAllMembers()
1.47.2.48 dwinter 1331:
1.9 dwinter 1332: #return str(members)
1.3 dwinter 1333: for x in members:
1.47.2.48 dwinter 1334:
1.47.2.18 dwinter 1335: ret+=self.getProjectsOfMember(name=x,date=date)
1.18 dwinter 1336:
1.3 dwinter 1337: return ret
1.11 dwinter 1338:
1.47.2.18 dwinter 1339: def getProjectsOfMember(self,name=None,email=None,date=None):
1.11 dwinter 1340: """get project of a member"""
1341: def sortP(x,y):
1342: """sort by sorting number"""
1.18 dwinter 1343: #print x.xdata_05,y.xdata_05
1344: return cmp(x.WEB_title,y.WEB_title)
1.11 dwinter 1345:
1.18 dwinter 1346:
1.11 dwinter 1347: ret=[]
1348: splitNeu=[]
1349: if email:
1.47.2.15 dwinter 1350:
1.47.2.2 dwinter 1351: members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)
1.11 dwinter 1352: name = members[0][1].title.decode('utf-8')
1353:
1354: y=name
1.28 dwinter 1355: splitted=y.split(",")
1356: #XXXX
1357: splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
1358:
1359: #for s in splitted:
1360: # splitNeu.append("\""+s+"\"")
1.11 dwinter 1361: search=string.join(splitNeu,' AND ')
1.28 dwinter 1362:
1.11 dwinter 1363: proj=self.ProjectCatalog({'xdata_01':search})
1.28 dwinter 1364:
1.11 dwinter 1365: if proj:
1.28 dwinter 1366: proj2=[]
1367: for x in proj:
1.47.2.18 dwinter 1368: if (not getattr(x.getObject(),'invisible',None)) and (getattr(x.getObject(),'archiveTime','')==''):
1.41 dwinter 1369: if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
1.28 dwinter 1370: proj2.append(x)
1.41 dwinter 1371:
1.18 dwinter 1372: else:
1373: proj2=[]
1374:
1.11 dwinter 1375: proj=self.ProjectCatalog({'xdata_08':search})
1376: if proj:
1.18 dwinter 1377: names=[x.WEB_title for x in proj]
1378: for x in proj:
1.47.2.18 dwinter 1379:
1380: if (not x.WEB_title in names) and (getattr(x.getObject(),'archiveTime','')==''):
1.18 dwinter 1381: proj2.append(x)
1382:
1383:
1384: proj2.sort(sortP)
1385:
1386: if len(proj2)>0:
1.11 dwinter 1387: ret.append((y,proj2))
1388:
1389: return ret
1390:
1.1 dwinter 1391: def givePersonList(self,name):
1392: """check if person is in personfolder and return list of person objects"""
1.3 dwinter 1393:
1394: splitted=name.split(",")
1395: if len(splitted)==1:
1.26 dwinter 1396: splitted=name.lstrip().rstrip().split(" ")
1397: splittedNew=[split.lstrip() for split in splitted]
1398:
1.3 dwinter 1399: if splittedNew[0]=='':
1400: del splittedNew[0]
1401: search=string.join(splittedNew,' AND ')
1.47.2.54 dwinter 1402:
1.3 dwinter 1403: if not search=='':
1404: proj=self.MembersCatalog({'title':search})
1405:
1406: if proj:
1407: return [[x.lastName,x.firstName] for x in proj]
1408: else:
1409: return []
1410:
1411: ## splitted=name.split(",") # version nachname, vorname...
1412: ## if len(splitted)>1:
1413: ## lastName=splitted[0]
1414: ## firstName=splitted[1]
1415: ## else:
1416: ## splitted=name.split(" ") #version vorname irgenwas nachnamae
1417:
1418: ## lastName=splitted[len(splitted)-1]
1419: ## firstName=string.join(splitted[0:len(splitted)-1])
1420:
1421: ## objs=[]
1.1 dwinter 1422:
1.3 dwinter 1423: #print self.members
1424: ## for x in self.members.__dict__:
1425: ## obj=getattr(self.members,x)
1426: ## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
1.1 dwinter 1427:
1.3 dwinter 1428: ## 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 1429:
1.3 dwinter 1430: ## objs.append((obj,lastName+", "+firstName))
1.1 dwinter 1431:
1.3 dwinter 1432:
1.1 dwinter 1433: return objs
1434:
1435:
1436: def personCheck(self,names):
1437: """all persons for list"""
1.4 dwinter 1438: #print "names",names
1.1 dwinter 1439: splitted=names.split(";")
1440: ret={}
1441: for name in splitted:
1442:
1443: if not (name==""):
1.3 dwinter 1444: try:
1445: ret[name]=self.givePersonList(name)
1446: except:
1447: """NOTHIHN"""
1.4 dwinter 1448: #print "RET",ret
1.1 dwinter 1449: return ret
1450:
1451: def giveCheckList(self,person,fieldname):
1452: """return checklist"""
1453: #print "GCL",fieldname
1454: if fieldname=='xdata_01':
1455: x=self.personCheck(person.getContent(fieldname))
1.4 dwinter 1456: #print "GCLBACKX",x
1.1 dwinter 1457: return x
1458:
1459:
1460: def isCheckField(self,fieldname):
1461: """return chechfield"""
1462:
1463: return (fieldname in checkFields)
1464:
1.47.2.59 dwinter 1465:
1466: def generateNameIndex(self):
1467: """erzeuge einen index verwendeter personen"""
1.47.2.61 dwinter 1468: import psycopg
1.47.2.59 dwinter 1469: o = psycopg.connect('dbname=authorities user=dwinter password=3333',serialize=0)
1470: results={}
1471: print self.fulltext.historicalNames.items()
1472: for nameItem in self.fulltext.historicalNames.items(): #gehe durch alle namen des lexikons
1473:
1474: c = o.cursor()
1475: name=nameItem[0]
1476: print "check",name
1477: c.execute("select lastname,firstname from persons where lower(lastname) = '%s'"%quote(name))
1478: tmpres=c.fetchall()
1479: firstnames=[result[1] for result in tmpres] # find all firstnames
1480: if tmpres:
1481: lastname=tmpres[0][0]
1482:
1483: for found in self.fulltext({'names':name}):
1484: if found.getObject().isActual():
1485: for nh in found.getObject().getGetNeighbourhood(name, length=50,tagging=False): #hole umgebung
1486: #schaue nun ob der vorname hinter oder vor dem name ist
1487: position=nh.find(lastname)
1488: # vorher
1489: #print "NH",nh
1490: bevorS=nh[0:position].split()
1491: #print "BV",bevorS
1492: if len(bevorS)>1:
1493: try:
1494: bevor=[bevorS[-1],bevorS[-2]]
1495: except:
1496: bevor=[bevorS[0]]
1497: else:
1498: bevor=[]
1499: #nachher
1500: behindS= re.split("[,|;| ]",nh[position:])
1501: #print "BH",behindS
1502: if len(behindS)>2:
1503: try:
1504: behind=behindS[1:3]
1505: except:
1506: behind=[bevorS[1]]
1507: else:
1508: behind=[]
1509: for firstname in firstnames:
1510: if firstname in bevor+behind: #Namen wie mit Adelspraedikaten werden so erstmal nich gefunden
1511: id="%s,%s"%(lastname,firstname)
1512: if not results.has_key(id):
1513: results[id]=[]
1514: objId=found.getObject().getId()
1515: if not (objId in results[id]):
1.47.2.66 dwinter 1516: print "d %s for %s"%(id,objId)
1.47.2.59 dwinter 1517: results[id].append(objId)
1518: self.nameIndex=results
1519: return results
1520:
1.47.2.64 dwinter 1521: def editNameIndexHTML(self):
1522: """edit the name index"""
1523: if not hasattr(self,'nameIndexEdited'): # falls editierter index noch nicht existiert, kopiere automatisch erstellten
1524: self.nameIndexEdited=copy.copy(self.nameIndex)
1525: print "huh"
1526: #self.nameIndexEdited=copy.copy(self.nameIndex)
1527: #print self.nameIndexEdited
1528: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','editHistoricalNames.zpt')).__of__(self)
1529: return pt()
1530:
1531: def getNamesInProject(self,projectId):
1532: """get all names ofnameIndexEdited which are references in projec with projectId"""
1533:
1534: ret=[]
1535: for name in self.nameIndexEdited.keys():
1536: if projectId in self.nameIndexEdited[name]:
1537: ret.append(name)
1538:
1539: return ret
1540:
1541: def editNameIndex(self,RESPONSE=None,name=None,occurrances=None,submit=None):
1542: """edit the index"""
1543: nI=self.nameIndexEdited # mI introduced to make sure that changes to nameIndexEdited are know to ZODB
1544: if submit=="delete":
1545:
1546:
1547: dh=getattr(self,'deletedHistoricalNames',{})
1.47.2.70! dwinter 1548:
! 1549: if type(dh) is ListType:
! 1550: dh={}
1.47.2.64 dwinter 1551: if not dh.has_key(name):
1.47.2.70! dwinter 1552: dh[name]=occurrances.split("\n")
1.47.2.64 dwinter 1553: else:
1.47.2.70! dwinter 1554: dh[name]+=occurrances.split("\n")
1.47.2.64 dwinter 1555:
1556: self.deletedHistoricalNames=dh
1557:
1558: del self.nameIndexEdited[name]
1559:
1560:
1561: elif (submit=="change"):
1562:
1563: nI[name]=occurrances.split("\n")[0:]
1564:
1565: elif (submit=="add"):
1566: if not nI.has_key(name):
1567: nI[name]=occurrances.split("\n")
1568: else:
1569: nI[name]+=occurrances.split("\n")
1570:
1571: self.nameIndexEdited=nI
1572:
1573:
1574: if RESPONSE is not None:
1575: RESPONSE.redirect('editNameIndexHTML')
1576:
1577:
1578:
1579: def restoreIndex(self):
1580: """restore"""
1581: self.nameIndexEdited=self.nameIndex
1582: return "done"
1583:
1584: def changeHistoricalNames(self,projId,nameListTmp):
1585: """add resp change nameIndexEdited b
1586: y adding/changing names menitionen in project projId"""
1587:
1588: #clear namelist from blanks
1589: nameList=[x.lstrip().rstrip() for x in nameListTmp]
1590:
1591: nI=self.nameIndexEdited
1592: for name in nameList:
1593: if not nI.has_key(name): #neuer Name
1594: nI[name]=[projId]
1595:
1596: for name in nI.keys():
1597:
1598: if name in nameList: #checke if name in name List
1599:
1600: if not(projId in nI[name]): #nicht in listt -> hinzufuegen
1601:
1602: nI[name].append(projId)
1603:
1604: """loesche falls projekt in nI list aber der name nicht mehr
1605: in der namensliste des projectes auftaucht
1606: """
1607:
1608: for pr in nI[name]:
1609:
1610: if (pr==projId) and (not name in nameList):
1611:
1612: nI[name].remove(pr)
1613:
1614: self.nameIndexEdited=nI
1615:
1616:
1617:
1.1 dwinter 1618: def manage_addMPIWGRootForm(self):
1619: """form for adding the root"""
1.45 dwinter 1620: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGRootForm.zpt')).__of__(self)
1.1 dwinter 1621: return pt()
1622:
1.45 dwinter 1623: def manage_addMPIWGRoot(self,id,title,connection_id="",RESPONSE=None):
1.1 dwinter 1624: """add a root folder"""
1625: newObj=MPIWGRoot(id,title)
1626: self._setObject(id,newObj)
1.45 dwinter 1627: ob=getattr(self,id)
1628: setattr(ob,'connection_id',connection_id)
1.1 dwinter 1629: if RESPONSE is not None:
1630: RESPONSE.redirect('manage_main')
1631:
1632:
1.47.2.22 dwinter 1633: class MPIWGProject_publication(SimpleItem):
1634: """publications object fuer project"""
1635:
1636: meta_type="MPIWGProject_publication"
1637:
1638: def editPublication(self,text=None,RESPONSE=None):
1639: """edit a publication"""
1640:
1641: if (not text):
1642: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_publicationForm.zpt')).__of__(self)
1643: return pt()
1644:
1645:
1646: self.text=text[0:]
1647:
1648: if RESPONSE:
1649: RESPONSE.redirect("../managePublications")
1650:
1651: class MPIWGProject_image(Image):
1652: """Images for Projects"""
1653:
1654: meta_type="MPIWGProject_image"
1655:
1656: def showImage(self,imageUrl=None):
1657: """show Images at an extra page"""
1658: self.getContent('WEB_project_description',filter='yes') #get the content and store image infos into session
1659: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','projectImageView.zpt')).__of__(self)
1660: return pt()
1661:
1662: def editImage(self,file=None,caption=None,RESPONSE=None):
1663: """edit the Image"""
1664: if (not file) and (not caption):
1665: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_imageForm.zpt')).__of__(self)
1666: return pt()
1667:
1668: if file and (not file.filename.lstrip().rstrip()==""):
1669: self.manage_upload(file)
1670:
1671: if caption:
1672: self.caption=caption[0:]
1673:
1674: if RESPONSE:
1675: RESPONSE.redirect("../manageImages")
1676:
1.45 dwinter 1677: class MPIWGProject(CatalogAware,Folder):
1.1 dwinter 1678: """Class for Projects"""
1.47.2.22 dwinter 1679:
1680:
1.47.2.21 dwinter 1681: security=ClassSecurityInfo()
1.1 dwinter 1682: meta_type='MPIWGProject'
1.45 dwinter 1683: default_catalog='ProjectCatalog'
1.47.2.22 dwinter 1684:
1.47.2.57 dwinter 1685:
1.47.2.22 dwinter 1686: def sortedByPlace(self,metatype):
1687: """find metatype and sort by place"""
1688: def sort(x,y):
1689: return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
1690:
1691: founds=self.ZopeFind(self,obj_metatypes=[metatype]);
1692:
1693: founds.sort(sort)
1694:
1695: return founds
1.45 dwinter 1696:
1.47.2.22 dwinter 1697:
1698: def copyPublicationsToList(self,RESPONSE=None):
1699: """copy publications in to list"""
1700:
1701: publicationTxt=self.getContent('WEB_related_pub')
1702:
1703: pubSplits=publicationTxt.split("<p>")
1704:
1705: for pubSplit in pubSplits:
1706: pubSplit=pubSplit.replace("</p>","")
1707: self.addPublication(pubSplit)
1708:
1709: if RESPONSE:
1710: RESPONSE.redirect('managePublications')
1711:
1712:
1.47.2.47 dwinter 1713: def copyImageToMargin(self,RESPONSE=None):
1.47.2.22 dwinter 1714: """copy inline images to marginal images"""
1.47.2.47 dwinter 1715:
1716:
1717: #getImages from WEB_project_description
1718: description=self.getContent('WEB_project_description')
1719:
1720: text2=description
1721: splitted=text2.split("""<p class="picture">""")
1722:
1723: imageURLs=[]
1724: imageCaptions=[]
1725: for split in splitted[1:]:
1726: tmp=split.split("</p>")
1727: #return repr(splitted[1])
1.47.2.68 dwinter 1728:
1.47.2.47 dwinter 1729: try:
1730: imageURLs.append(tmp[0].split("\"")[1].encode('utf-8'))
1731: except:
1.47.2.68 dwinter 1732:
1733: try:
1.47.2.47 dwinter 1734: imageURLs.append(tmp[0].split("src=")[1].split(" ")[0].encode('utf-8'))
1.47.2.68 dwinter 1735: except:
1736: imageURLs.append("")
1.47.2.47 dwinter 1737:
1738: split2="</p>".join(tmp[1:])
1739:
1740:
1741: splitted=split2.split("""<p class="picturetitle">""")
1742: if len(splitted)>1:
1743: tmp=splitted[1].split("</p>")
1744: imageCaptions.append(tmp[0].encode('utf-8'))
1.47.2.22 dwinter 1745:
1746:
1.47.2.47 dwinter 1747: else:
1748: #keine caption
1749:
1750: imageCaptions.append("")
1751:
1752:
1753:
1.47.2.34 dwinter 1754:
1.47.2.47 dwinter 1755:
1756:
1757:
1758: #eintragen:
1759: for imageURL in imageURLs:
1760: filename=imageURL.split("/")[-1]
1761: #lege neues images object an, mit leerem bild
1762:
1763: if self.ZopeFind(self,obj_ids=[filename]):
1764: #existiert das bild schon, dann neuen filenamen
1765: filename="project_image_"+filename
1766:
1767: self.addImage(None,imageCaptions[imageURLs.index(imageURL)],filename=filename)
1768: #hole die bilddaten aus der url
1769: url=self.absolute_url()+"/"+imageURL
1770: #url=self.absolute_url()+"/"+filename
1771:
1772: try:#relative url
1773: data=urllib.urlopen(url).read()
1.47.2.34 dwinter 1774: except:
1.47.2.47 dwinter 1775: try:#absolute
1776: data=urllib.urlopen(self.imageURL).read()
1777: except:
1778: zLOG.LOG("MPIWG Project",zLOG.ERROR,"can't open: %s"%url)
1.47.2.34 dwinter 1779:
1.47.2.47 dwinter 1780: obj=getattr(self,filename)
1781: obj.update_data(data)
1.47.2.22 dwinter 1782:
1783: if RESPONSE:
1784: RESPONSE.redirect('manageImages')
1785:
1786: def manageImages(self,imageName=None,op=None):
1787: """managage images"""
1788:
1789:
1790: if imageName and op:
1791: if op=='up':
1792: images=self.getImages()
1793: for image in images:
1794: if image[0]==imageName:
1795: nr=images.index(image)
1796: if not nr==0:
1797: images[nr-1][1].place+=1
1798: images[nr][1].place-=1
1799: pass
1800: elif op=='down':
1801: images=self.getImages()
1802: for image in images:
1803: if image[0]==imageName:
1804: nr=images.index(image)
1805: if not (nr==len(images)-1):
1806: images[nr+1][1].place-=1
1807: images[nr][1].place+=1
1808: pass
1809:
1810:
1811: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_manageImagesForm.zpt')).__of__(self)
1812: return pt()
1813:
1814: def managePublications(self,pubName=None,op=None):
1815: """managage images"""
1816:
1817:
1818: if pubName and op:
1819: if op=='up':
1820: publications=self.getPublications()
1821: for publication in publications:
1822: if publication[0]==pubName:
1823: nr=publications.index(publication)
1824: if not nr==0:
1825: publications[nr-1][1].place+=1
1826: publications[nr][1].place-=1
1827: pass
1828: elif op=='down':
1829: publications=self.getPublications()
1830: for publication in publications:
1831: if publication[0]==pubName:
1832: nr=publications.index(publication)
1833: if not (nr==len(publications)-1):
1834: publications[nr+1][1].place-=1
1835: publications[nr][1].place+=1
1836: pass
1837:
1838:
1839: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_managePublicationsForm.zpt')).__of__(self)
1840: return pt()
1841:
1842: def getPublications(self):
1843: """get all Publications"""
1844: def sort_images(x,y):
1845: return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
1.47.2.25 dwinter 1846:
1.47.2.22 dwinter 1847: publications=self.ZopeFind(self,obj_metatypes=['MPIWGProject_publication'])
1848:
1849: publications.sort(sort_images)
1850: return publications
1851:
1852: def addPublication(self,text,RESPONSE=None):
1853: """add an MPIWG_Publication"""
1854:
1855: name="publication_"+str(self.getLastPublicationNumber()+1)
1856:
1857: newPublication=MPIWGProject_publication(name)
1858:
1859: self._setObject(name,newPublication)
1860: obj=getattr(self,name)
1861: obj.text=text[0:]
1862: obj.enabled=True;
1863: obj.place=self.getLastPublicationNumber()+1
1864: obj.id=name
1865:
1866: if RESPONSE is not None:
1867: RESPONSE.redirect('managePublications')
1868:
1869:
1870: def getLastPublicationNumber(self):
1871: publications=self.getPublications()
1872:
1873: if not publications:
1874: return 0
1875: else:
1876: return getattr(publications[-1][1],'place',0)
1877:
1.47.2.70! dwinter 1878: def deletePublication(self,id,RESPONSE=None):
1.47.2.68 dwinter 1879: """delete Publication id"""
1880: self.manage_delObjects([id])
1881: if RESPONSE:
1882: RESPONSE.redirect('managePublications')
1883:
1.47.2.22 dwinter 1884: def getImages(self):
1885: """get all Images"""
1.47.2.68 dwinter 1886:
1.47.2.22 dwinter 1887: def sort_images(x,y):
1888: return cmp(getattr(x[1],'place',0),getattr(y[1],'place',0))
1.47.2.25 dwinter 1889:
1.47.2.68 dwinter 1890:
1891: if (getattr(self,'imageURL','')!='') or (getattr(self,'imagecap','')!='') :
1892: try:
1893: self.addImage(None,getattr(self,'imagecap',''),RESPONSE=None,filename=getattr(self,'imageURL',''))
1894: except:
1895: pass
1896: self.imageURL=''
1897: self.imagecap=''
1898:
1.47.2.22 dwinter 1899: images=self.ZopeFind(self,obj_metatypes=['MPIWGProject_image'])
1900:
1901: images.sort(sort_images)
1902: return images
1903:
1904: def getLastImageNumber(self):
1905: images=self.getImages()
1906:
1907: if not images:
1908: return 0
1909: else:
1910: return getattr(images[-1][1],'place',0)
1911:
1912: def deleteImage(self,id,RESPONSE=None):
1913: """delete Image id"""
1914: self.manage_delObjects([id])
1915: if RESPONSE:
1916: RESPONSE.redirect('manageImages')
1917:
1.47.2.59 dwinter 1918:
1.47.2.54 dwinter 1919: def hasChildren(self,date=None,onlyActive=True):
1920: """check if project has children"""
1921: ct=self.getContexts(childs=self.getContent('xdata_05'),
1922: depth=1,date=date,onlyActive=onlyActive)
1923:
1924: if ct and len(ct)>0:
1925: return True
1926: else:
1927: return False
1.47.2.68 dwinter 1928:
1.47.2.54 dwinter 1929:
1.47.2.22 dwinter 1930: def addImage(self,fileHd,caption,RESPONSE=None,filename=None):
1931: """add an MPIWG_Project_image"""
1932:
1933: if not filename:
1934: filename=fileHd.filename
1935:
1936: if not fileHd:
1937: fileHd=file(os.path.join(package_home(globals()),'blank.gif'))
1938:
1939: newImage=MPIWGProject_image(filename,filename,fileHd)
1940:
1941: self._setObject(filename,newImage)
1942: obj=getattr(self,filename)
1943: obj.caption=caption[0:]
1944: obj.enabled=True;
1945: obj.place=self.getLastImageNumber()+1
1.47.2.68 dwinter 1946: obj.id=filename
1947:
1.47.2.22 dwinter 1948: if RESPONSE is not None:
1949: RESPONSE.redirect('manageImages')
1950:
1.45 dwinter 1951: def PrincipiaSearchSource(self):
1952: """Return cataloguable key for ourselves."""
1953: return str(self)
1.42 dwinter 1954:
1955: def versionHeader(self):
1956: """version Header, gibt header text entsprechend der aktuellen version aus"""
1957:
1958: actualTime=time.localtime()
1959: retTXT="""<h2>This is an outdated version, for the actual version please refer to <a href="%s">%s</a></h2>"""
1960: s=self.aq_parent.absolute_url()
1.43 dwinter 1961: #print getattr(self,'archiveTime',actualTime)
1.42 dwinter 1962: if getattr(self,'archiveTime',actualTime)< actualTime:
1963: return retTXT%(s,s)
1964: else:
1965: return ""
1.47.2.18 dwinter 1966:
1967: def getActualVersion(self,date=None):
1968: """actuelle version"""
1969: def sortProjectsByTime(x,y):
1970: return cmp(x[1].archiveTime,y[1].archiveTime)
1971:
1972: if not date:
1973: if self.isActual():
1974: return self
1975: else:
1976: return None
1977:
1978: #suche ob aeltere versionen vorhanden sind
1979:
1980: finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
1981: if not finds: #wenn nicht dann teste ob die aktuelle version schon existiert hat.
1982: ad=getattr(self,'creationTime','20050101000000')
1983: if int(date)>int(ad):
1984: return self
1985: else:
1986: return None
1987:
1988:
1989: else:
1990: finds.sort(sortProjectsByTime)
1991:
1992: for find in finds:
1993: #gehe durch die alten Projekte und finde das entprechende
1994: if (int(find[1].archiveTime) > int(date)) and (int(date)>int(getattr(find[1],'creationTime','20050101000000'))):
1995: return find[1]
1996:
1997: #kein passendes gefunden, dann teste ob das aktuelle in frage kommt
1998: ad=getattr(self,'creationTime','20050101000000')
1999:
2000: if int(date)>int(ad):
2001:
2002: return self
2003: else:
2004: return None
2005:
2006:
1.43 dwinter 2007: def isActual(self):
2008: """gibt 1 zurueck wenn aktuell, 0 sonst"""
2009: actualTime=time.localtime()
2010:
2011:
2012: #print getattr(self,'archiveTime',actualTime)
2013: if getattr(self,'archiveTime',actualTime)< actualTime:
2014: return 0
2015: else:
2016: return 1
1.42 dwinter 2017:
2018: def copyObjectToArchive(self):
2019: """kopiere aktuelles objekt ins archiv"""
2020: cb=self.aq_parent.manage_copyObjects(self.getId())
2021: self.manage_pasteObjects(cb)
2022: actualTime=time.localtime()
2023:
2024: self.manage_renameObject(self.getId(),self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
2025: obj=getattr(self,self.getId()+"_"+time.strftime("%Y%m%d%H%M%S",actualTime))
2026: obj.setArchiveTime(time.strftime("%Y%m%d%H%M%S",actualTime))
2027: ids=[x[0] for x in self.ZopeFind(obj,obj_metatypes=['MPIWGProject'])]
2028: obj.manage_delObjects(ids)
2029:
2030: def setArchiveTime(self,time):
2031: """set Archive Time"""
2032: self.archiveTime=time[0:]
2033:
1.41 dwinter 2034: def versionManageForm(self):
2035: """version Manage form:currently only set to invisible"""
2036: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self)
2037: return pt()
2038:
2039: def versionManage(self,invisible=None,RESPONSE=None):
2040: """version Manage form:currently only set to invisible"""
2041: self.invisible=invisible
2042:
2043: if RESPONSE is not None:
2044: RESPONSE.redirect('manage_main')
2045:
1.38 dwinter 2046:
1.3 dwinter 2047: def crossLinker(self):
2048: """experimental crosslinker"""
2049: splitted=self.WEB_project_description[0].split()
2050: new=[]
2051: for split in splitted:
2052: try:
2053: found=self.DescriptionCatalog({'fulltext':split})
2054:
2055: if len(found)>1:
2056:
2057: new.append("<a href=%s>%s</a>"%(split,split))
2058: else:
2059: new.append(split)
2060: except:
2061: new.append(split)
2062: return string.join(new)
2063:
2064:
2065:
1.1 dwinter 2066:
2067: def generateTemplate(self,RESPONSE=None):
1.47.2.65 casties 2068: """Erzeuge Template fuer defined fields not_used"""
1.1 dwinter 2069:
2070: id="index_html"
2071: title=id
2072: if self._getOb('index_html'):
2073: self._delObject('index_html')
2074:
2075:
2076: newObj=ZopePageTemplate(id,'TEXT')
2077: self._setObject(id,newObj)
2078: #self.manage_addPageTemplate(id,title)
2079: if RESPONSE is not None:
2080: RESPONSE.redirect('manage_main')
2081:
1.5 dwinter 2082: def __init__(self, id, argv=None):
1.47.2.18 dwinter 2083: """initiere classe"""
2084:
2085: self.creationTime=time.strftime("%Y%m%d%H%M%S",time.localtime())[0:]
1.1 dwinter 2086: self.id=id
2087: self.title=id
1.47.2.54 dwinter 2088: self.isActiveFlag=True #Flag is true is the project is still active, False if accomplished
2089:
1.5 dwinter 2090: if argv:
2091: for arg in definedFields:
1.47.2.25 dwinter 2092: try:
2093: setattr(self,arg,argv[arg])
2094: except:
2095: setattr(self,arg,"")
1.5 dwinter 2096: else:
2097: for arg in definedFields:
2098: setattr(self,arg,'')
1.1 dwinter 2099:
2100: manage_options = Folder.manage_options+(
2101: {'label':'Load New File','action':'loadNewFileForm'},
2102: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
2103: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
2104: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
1.9 dwinter 2105: {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'},
1.41 dwinter 2106: {'label':'Versionmanager','action':'versionManageForm'},
1.1 dwinter 2107: )
1.33 casties 2108:
2109:
1.47.2.54 dwinter 2110: def isActiveProject(self):
2111: """check if the project is still active, default is true, set to false is the project is accomplished"""
2112: return getattr(self,'isActiveFlag',True)
2113:
2114: def setActiveFlag(self,status=True):
2115: """set the active flag"""
2116: self.isActiveFlag=status
2117:
1.42 dwinter 2118: def checkDate(self,date):
2119: """teste ob zum Zeitpunkt date eine andere version existierte"""
2120:
2121:
2122: def sortProjectsByTime(x,y):
2123: return cmp(x[1].archiveTime,y[1].archiveTime)
1.47.2.18 dwinter 2124:
2125: #suche ob aeltere versionen vorhanden sind
2126:
1.42 dwinter 2127: finds=self.ZopeFind(self,obj_metatypes=['MPIWGProject'])
1.47.2.18 dwinter 2128: if not finds: #wenn nicht dann teste ob die aktuelle version schon existiert hat.
2129: ad=getattr(self,'creationTime','20050101000000')
2130: if int(date)>int(ad):
2131: return self.REQUEST['URL1']+"/"+self.getId()
2132: else:
2133: return self.REQUEST['URL1']+"/no_project"
2134:
2135:
1.42 dwinter 2136: else:
2137: finds.sort(sortProjectsByTime)
2138:
2139: for find in finds:
1.47.2.18 dwinter 2140: #gehe durch die alten Projekte und finde das entprechende
2141: if (int(find[1].archiveTime) > int(date)) and (int(date)>int(getattr(find[1],'creationTime','20050101000000'))):
2142: return self.REQUEST['URL1']+"/"+find[1].getId()
1.42 dwinter 2143:
1.47.2.18 dwinter 2144: #kein passendes gefunden, dann teste ob das aktuelle in frage kommt
2145: ad=getattr(self,'creationTime','20050101000000')
2146:
2147: if int(date)>int(ad):
2148:
2149: return self.REQUEST['URL1']+"/"+self.getId()
2150: else:
2151: return self.REQUEST['URL1']+"/no_project"
1.42 dwinter 2152:
2153:
1.47.2.18 dwinter 2154: def no_project(self):
2155: """warnung: project noch nicht existent"""
2156: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self)
2157: return pt()
1.47.2.55 dwinter 2158:
1.47.2.59 dwinter 2159: def getGetNeighbourhood(self,wordStr, length=100,tagging=True):
1.47.2.65 casties 2160: """finde umgebung um die worte in wordStr, zurueckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte
1.47.2.55 dwinter 2161: alle Tags werden entfernt, die Fundstellen werden mit <span class="found">XX</span> getaggt, die Umgebungen werden
2162: case insensitive gesucht
2163: @param wordStr: string mit Worten getrennt durch Leerzeichen, Phrasen sind mit " gekennzeichnet
2164: "eine phrase", "*" bezeichnet wildcards und wird ignoriert"
1.47.2.65 casties 2165: @param length: optional, default wert 100, 2*length ist die groesse der Umgebung
1.47.2.59 dwinter 2166: @param tagging: optional default wert true, kein span tag wird erzweugt falls tag=false
1.47.2.55 dwinter 2167: """
2168:
1.47.2.65 casties 2169: ret=[] # nimmt das Array auf, dass spaeter zurueckgegeben wird
1.47.2.55 dwinter 2170: ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt
2171:
2172: def isInRanges(nr,length):
1.47.2.65 casties 2173: """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurueck,
1.47.2.55 dwinter 2174: -1, wenn kein Treffer
2175:
1.47.2.65 casties 2176: @param nr: Position die geprueft werden soll
2177: @param length: Laenge des Wortes das geprueft werden soll
1.47.2.55 dwinter 2178: """
2179: for x in ranges:
2180: if (x[0]<=nr) and (nr < (x[1]-length)):
2181: return ranges.index(x)
2182: return -1
2183:
2184: # deal with phrases, in Phrasen werden die Leerzeichen durch "_" ersetzt.
2185: def rep_empty(str):
2186: x= re.sub(" ","_",str.group(0))
2187: return re.sub("\"","",x)
2188:
2189: wordStr=re.sub("\".*?\"", rep_empty,wordStr)#ersetze leerzeichen in " " durch "_" und loesche "
2190:
2191: #deal with wildcards, for our purposes it is enough to delete the wildcard
2192: wordStr=wordStr.replace("*","")
2193:
2194: words=wordStr.split(" ")
2195: #if not words is ListType:
2196: # words=[words]
2197:
2198: txt=self.harvest_page()
1.47.2.59 dwinter 2199: if not txt:
2200: return ret
1.47.2.55 dwinter 2201: txt=re.sub("<.*?>", "", txt) # loesche alle Tags
2202: for word in words:
2203: word=re.sub("_"," ",word) # ersetze zurueck "_" durch " "
2204: pos=0
2205:
2206: n=txt.lower().count(word.lower()) # wie oft tritt das Wort auf
2207:
2208: for i in range(n):
2209: pos=txt.lower().find(word.lower(),pos)
2210:
2211: if pos > 0:
2212: x=max(0,pos-length)
2213: y=min(len(txt),pos+length)
2214:
2215:
2216: #is word already in one of the results
2217: nr=isInRanges(pos,len(word))
1.47.2.65 casties 2218: if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergroessere diese
1.47.2.55 dwinter 2219: x=min(ranges[nr][0],x)
2220: y=max(ranges[nr][1],y)
2221:
2222: str=txt[x:y]
2223:
2224: if nr >=0: # word ist in einer schon gefunden Umgebung
2225: ranges[nr]=(x,y) # neue Position der Umgebung
2226:
2227: ret[nr]=str # neue Umgebung
1.47.2.65 casties 2228: else: # andernfalls neue Umgebung hinzufuegen
1.47.2.55 dwinter 2229: ranges.append((x,y))
2230:
2231: ret.append(str)
2232:
2233: pos=pos+len(word)
2234: else:
2235: break;
2236:
2237: # now highlight everything
1.47.2.59 dwinter 2238: if tagging:
2239: for x in range(len(ret)):
2240: for word in words:
2241: repl=re.compile(word,re.IGNORECASE)
2242: ret[x]=repl.sub(""" <span class="found">%s</span>"""%word.upper(),ret[x])
1.47.2.55 dwinter 2243:
2244: return ret
2245:
2246: def harvest_page(self,context=None):
2247: """seite fuer harvesting fuer die Projektsuche"""
2248: if not context:
2249: context=self
2250:
2251: if self.isActiveProject() and self.isActual():
2252: ext=getattr(self,"harvest_main",None)
2253: if ext:
2254: return getattr(self,ext.getId())()
2255:
2256: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_main')).__of__(context)
2257:
2258:
2259: return pt()
2260:
1.47.2.20 dwinter 2261: def index_html(self,request=True,context=None):
1.33 casties 2262: """show homepage"""
1.47.2.20 dwinter 2263: if not context:
2264: context=self
2265: if request:
2266: if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None:
2267: self.REQUEST.SESSION['MPI_redirected']=1
2268: self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date'])+"?date="+self.REQUEST['date'])
2269: else:
2270: self.REQUEST.SESSION['MPI_redirected']=None
1.42 dwinter 2271:
1.47.2.25 dwinter 2272: #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
1.47.2.18 dwinter 2273: ext=getattr(self,"project_main",None)
1.33 casties 2274: if ext:
1.47.2.18 dwinter 2275: return getattr(self,ext.getId())()
1.33 casties 2276:
1.47.2.20 dwinter 2277: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','project_main')).__of__(context)
2278:
1.33 casties 2279: return pt()
1.1 dwinter 2280:
1.38 dwinter 2281:
1.1 dwinter 2282: def getDataFields(self):
2283: """giveListofDatafields"""
2284: ret=[]
2285: for x in range(1,14):
1.17 dwinter 2286: if not x in [6,10,9]: # not used fields
2287: ret.append('xdata_%02i'%x)
1.1 dwinter 2288: return ret
2289:
2290: def getDefinedFields(self):
2291: """show all defined fields"""
2292:
2293: return definedFields
2294:
2295: def getAttribute(self,field):
2296: """get attrbiute"""
2297: return getattr(self,field)
2298:
1.47.2.4 dwinter 2299: def getContent(self,field,filter=None):
1.1 dwinter 2300: """Inhalt des Feldes"""
2301:
2302: text=u''
1.46 dwinter 2303:
1.1 dwinter 2304: for x in getattr(self,field):
2305:
2306: try:
1.46 dwinter 2307: text +=x
1.1 dwinter 2308: except:
1.46 dwinter 2309: text = x
2310:
1.9 dwinter 2311:
1.46 dwinter 2312:
1.9 dwinter 2313: try:
2314: if text[len(text)-1]==";":
1.21 dwinter 2315: text=text[0:len(text)-1]
2316:
2317:
1.9 dwinter 2318: except:
1.46 dwinter 2319: pass
2320:
2321: if text=='':
2322: text2=text
2323: else:
2324: text2=re.sub(r';([^\s])','; \g<1>',text)
1.16 dwinter 2325:
1.30 dwinter 2326: #teste ob ergebnis leer und header dann nehme title
2327:
2328: if (text2=='') and (field=='WEB_project_header'):
2329: return self.getContent('WEB_title')
2330:
1.47.2.4 dwinter 2331: if filter:
2332: splitted=text2.split("""<p class="picture">""")
1.47.2.5 dwinter 2333: if len(splitted)>1:
2334: tmp=splitted[1].split("</p>")
1.47.2.25 dwinter 2335: #return repr(splitted[1])
1.47.2.10 dwinter 2336: try:
1.47.2.25 dwinter 2337: self.imageURL=tmp[0].split("\"")[1].encode('utf-8')
2338: except:
1.47.2.68 dwinter 2339: try:
1.47.2.25 dwinter 2340: self.imageURL=tmp[0].split("src=")[1].split(" ")[0].encode('utf-8')
1.47.2.68 dwinter 2341: except:
2342: self.imageURL=""
2343:
1.47.2.5 dwinter 2344: split2="</p>".join(tmp[1:])
2345:
2346: text3=splitted[0]+split2
2347:
2348: splitted=text3.split("""<p class="picturetitle">""")
2349: if len(splitted)>1:
2350: tmp=splitted[1].split("</p>")
1.47.2.25 dwinter 2351: self.imagecap=tmp[0].encode('utf-8')
1.47.2.11 dwinter 2352:
1.47.2.5 dwinter 2353: split4="".join(tmp[1:])
1.47.2.4 dwinter 2354:
1.47.2.5 dwinter 2355: text5=splitted[0]+split4
2356: else:
2357: #keine caption
2358: text5=text3
2359: else:
2360: #kein bild
2361: text5=text2
1.47.2.4 dwinter 2362: else:
2363: text5=text2
2364:
1.47.2.65 casties 2365: #teste ob WEB_project_description und keine fuehrenden p tags
1.47.2.4 dwinter 2366: if (len(text5)>4) and (not text5[0:3]=='<p>') and (field=='WEB_project_description'):
1.47.2.11 dwinter 2367: text5= "<p>"+text5+"</p>"
1.46 dwinter 2368:
2369:
1.47.2.4 dwinter 2370: #filter image
2371:
1.47.2.68 dwinter 2372: text5=text5.lstrip().rstrip() #loescher leerzeichen und einzelndes br
2373: if (text5=="<br>") or (text5=="<br/>"):
2374: text5=""
1.47.2.11 dwinter 2375:
1.47.2.4 dwinter 2376: return text5.encode('utf-8')
1.47.2.9 dwinter 2377:
2378: def showImagesOfPage(self,imageUrl=None):
2379: """show Images of project"""
2380: self.getContent('WEB_project_description',filter='yes') #get the content and store image infos into session
2381: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','projectImageView.zpt')).__of__(self)
2382: return pt()
2383:
1.47.2.22 dwinter 2384:
1.1 dwinter 2385: def show_html(self):
2386: """simple index"""
2387: #return "HI"
1.45 dwinter 2388: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_index.zpt')).__of__(self)
1.1 dwinter 2389: return pt()
2390:
1.47.2.20 dwinter 2391: def saveFromPreview(self):
2392: """save content aus preview"""
2393: self.WEB_project_description=self.previewTemplate.WEB_project_description[0:]
2394: self.REQUEST.RESPONSE.redirect("./index.html")
2395:
2396: def saveEditedContent(self,kupu=None,preview=None):
2397: """save Edited content"""
2398:
1.47.2.23 dwinter 2399: if preview:
2400: kupu=preview
1.47.2.20 dwinter 2401: #find content of body tags
2402: start=kupu.find("<body>")
2403: end=kupu.find("</body>")
2404: newcontent= kupu[start+6:end]
1.47.2.43 dwinter 2405:
1.47.2.20 dwinter 2406: if preview:
1.47.2.23 dwinter 2407:
1.47.2.20 dwinter 2408: return self.preview(newcontent)
2409:
1.47.2.23 dwinter 2410: self.copyObjectToArchive()
1.47.2.20 dwinter 2411: self.WEB_project_description=newcontent[0:]
2412:
1.47.2.23 dwinter 2413: self.REQUEST.RESPONSE.redirect("./index.html")
1.47.2.20 dwinter 2414:
2415: return True
1.47.2.21 dwinter 2416:
1.47.2.33 dwinter 2417: security.declareProtected('View management screens','edit')
1.47.2.24 dwinter 2418: def edit(self,western=None):
1.47.2.20 dwinter 2419: """Edit pages"""
1.47.2.24 dwinter 2420: if western:
2421: self.REQUEST.RESPONSE.setCookie("MP_debug_code","western",path="/")
2422:
2423:
1.47.2.20 dwinter 2424: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProjectNeu.zpt')).__of__(self)
2425: return pt()
1.47.2.36 casties 2426:
2427: edit_MPIWGProject_main = PageTemplateFile('zpt/edit_MPIWGProject_main', globals())
2428:
2429: def getPathStyle(self, path, selected, style=""):
2430: """returns a string with the given style + 'sel' if path == selected."""
2431:
2432: if path == selected:
2433: return style + 'sel'
2434: else:
2435: return style
1.47.2.20 dwinter 2436:
2437: def preview(self,description):
2438: """preview"""
2439: tmpPro=getattr(self,"previewTemplate",None)
2440: if not tmpPro:
2441: tmpPro=MPIWGProject("previewTemplate")
2442: self._setObject("previewTemplate",tmpPro)
2443: for field in definedFields:
2444: setattr(tmpPro,field,getattr(self,field))
2445: tmpPro.WEB_project_description=description[0:]
1.47.2.37 dwinter 2446: tmpPro.invisible=True
1.47.2.20 dwinter 2447: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','previewFrame.zpt')).__of__(self)
2448: return pt()
2449:
2450: #return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate")
2451:
2452:
2453: def getWebProject_description(self):
2454: """get description"""
1.47.2.24 dwinter 2455: debug= self.REQUEST.cookies.get("MP_debug_code",None)
1.47.2.20 dwinter 2456:
1.47.2.24 dwinter 2457: if debug and debug=="western":
1.47.2.23 dwinter 2458: return """
2459: <html>
2460: <head>
2461: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
2462: </head>
2463: <body>%s
2464: </html></body>
1.47.2.24 dwinter 2465: """%self.WEB_project_description[0]
2466:
2467: return """
2468: <html>
2469: <head>
2470: <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
2471: </head>
2472: <body>%s
2473: </html></body>
1.47.2.23 dwinter 2474: """%self.getContent('WEB_project_description')
1.47.2.24 dwinter 2475:
1.47.2.20 dwinter 2476:
2477:
1.1 dwinter 2478: def editMPIWGProjectForm(self):
2479: """editform"""
1.45 dwinter 2480: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProject.zpt')).__of__(self)
1.1 dwinter 2481: return pt()
2482:
1.47.2.21 dwinter 2483:
1.47.2.20 dwinter 2484: def editMPIWGProject(self,RESPONSE=None,fromEdit=None):
1.42 dwinter 2485: """edit the project and archive the old version"""
2486:
2487: self.copyObjectToArchive() # archive the object
2488:
1.22 dwinter 2489:
1.1 dwinter 2490: for x in definedFields:
2491: if self.REQUEST.has_key(x):
2492:
1.9 dwinter 2493: setattr(self,x,[self.REQUEST[x].decode('utf-8')])
1.42 dwinter 2494:
1.47.2.67 casties 2495:
2496: if self.REQUEST.has_key('historicalNames'):
2497: self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))
1.47.2.64 dwinter 2498:
1.47.2.54 dwinter 2499: if self.REQUEST.has_key('active'):
2500: self.setActiveFlag(True)
2501: else:
2502: self.setActiveFlag(False)
1.47.2.20 dwinter 2503: if fromEdit and (RESPONSE is not None):
2504: RESPONSE.redirect('./editMPIWGBasisEditor')
1.42 dwinter 2505:
1.47.2.20 dwinter 2506: else:
2507: if RESPONSE is not None:
2508: RESPONSE.redirect('manage_main')
1.1 dwinter 2509:
1.47.2.20 dwinter 2510:
1.47.2.21 dwinter 2511:
2512: security.declareProtected('View managment screens','editMPIWGDisciplinesThemesEditor')
1.47.2.20 dwinter 2513: def editMPIWGDisciplinesThemesEditor(self):
2514: """edit from edit"""
2515: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGDisciplinesThemesNeu.zpt')).__of__(self)
2516: return pt()
2517:
2518:
1.9 dwinter 2519: def editMPIWGDisciplinesThemesForm(self):
2520: """edit the disciplines and themes Form"""
1.47.2.20 dwinter 2521:
1.45 dwinter 2522: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGDisciplinesThemes.zpt')).__of__(self)
1.9 dwinter 2523: return pt()
2524:
1.47.2.20 dwinter 2525: def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None,fromEdit=None):
1.9 dwinter 2526: """edit disciplin and form"""
2527: if disciplines:
2528: if type(disciplines) is StringType:
2529: self.xdata_09=disciplines
2530: else:
2531: self.xdata_09=string.join(disciplines,";")
2532: else:
2533: self.xdata_09=""
2534: if themes:
2535: if type(themes) is StringType:
2536: self.xdata_10=themes
2537: else:
2538: self.xdata_10=string.join(themes,";")
2539: else:
2540: self.xdata_10=""
1.47.2.20 dwinter 2541:
2542: if fromEdit and (RESPONSE is not None):
2543: RESPONSE.redirect('./editMPIWGDisciplinesThemesEditor')
2544:
2545: else:
2546: if RESPONSE is not None:
2547: RESPONSE.redirect('manage_main')
1.9 dwinter 2548:
2549:
2550: def isChecked(self,wert,list):
2551: """check if wert is in ; seperated list"""
1.46 dwinter 2552:
1.9 dwinter 2553: #felder sind manchmnal als liste mit einem element definiert
2554: if type(list) is StringType or UnicodeType:
2555: splitted=list.split(";")
2556: else:
2557: splitted=list[0].split(";")
2558:
1.47.2.12 dwinter 2559: splitted=[y.rstrip().lstrip() for y in splitted]
2560:
1.9 dwinter 2561: for x in splitted:
1.47.2.35 dwinter 2562: x=re.sub(r"[^A-z ]","",x)
1.9 dwinter 2563: if (not x==u'') and x in wert:
2564: return 1
2565: return 0
1.47.2.20 dwinter 2566:
1.47.2.21 dwinter 2567: security.declareProtected('View management screens','editMPIWGBasisEditor')
1.47.2.20 dwinter 2568: def editMPIWGBasisEditor(self):
2569: """editform"""
2570: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self)
2571: return pt()
2572:
1.47.2.33 dwinter 2573: security.declareProtected('View management screens','editMPIWGBasisForm')
1.9 dwinter 2574: def editMPIWGBasisForm(self):
2575: """editform"""
1.45 dwinter 2576: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasis.zpt')).__of__(self)
1.9 dwinter 2577: return pt()
1.47.2.20 dwinter 2578:
1.47.2.33 dwinter 2579: security.declareProtected('View management screens','editMPIWGRelatedPublicationsForm')
1.9 dwinter 2580: def editMPIWGRelatedPublicationsForm(self):
2581: """Edit related Publications"""
1.45 dwinter 2582: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGRelatedPublications.zpt')).__of__(self)
1.9 dwinter 2583: return pt()
1.1 dwinter 2584:
1.9 dwinter 2585:
1.1 dwinter 2586: def loadNewFileForm(self):
2587: """Neues XML-File einlesen"""
1.45 dwinter 2588: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_newfile.zpt')).__of__(self)
1.1 dwinter 2589: return pt()
2590:
2591: def loadNewFile(self,RESPONSE=None):
2592: """einlesen des neuen files"""
2593: fileupload=self.REQUEST['fileupload']
2594: if fileupload:
2595: file_name=fileupload.filename
2596: filedata=fileupload.read()
2597:
2598: argv=xmlhelper.proj2hash(filedata)
2599: #print argv.keys()
2600: for arg in definedFields:
2601:
2602: #print arg,argv[arg],getattr(self,arg)
2603: try:
2604: temp=argv[arg][0:]
2605: #old=getattr(self,arg)
2606: setattr(self,arg,temp)
2607: #print old,getattr(self,arg)
2608: except:
2609: """nothing"""
2610:
2611: if RESPONSE is not None:
2612: RESPONSE.redirect('manage_main')
2613:
2614: def manage_addMPIWGProjectForm(self):
2615: """form for adding the project"""
1.45 dwinter 2616: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGProjectForm.zpt')).__of__(self)
1.1 dwinter 2617: return pt()
2618:
2619: def manage_addMPIWGProject(self,id,RESPONSE=None):
2620: """method to add a project"""
2621: #print argv
1.20 dwinter 2622: fileupload=self.REQUEST.get('fileupload',None)
2623: if fileupload:
1.46 dwinter 2624:
1.20 dwinter 2625: file_name=fileupload.filename
2626: filedata=fileupload.read()
2627:
2628: argv=xmlhelper.proj2hash(filedata)
2629:
2630: #print argv
1.5 dwinter 2631: newObj=MPIWGProject(id,argv)
2632: else:
2633: newObj=MPIWGProject(id)
1.1 dwinter 2634:
2635: self._setObject(id,newObj)
2636:
1.47.2.18 dwinter 2637:
1.1 dwinter 2638: if RESPONSE is not None:
1.47.2.69 dwinter 2639: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>