1: # Objekte zur Erzeugung von Navigationselement
2: from AccessControl import ClassSecurityInfo
3: from Globals import DTMLFile
4: from OFS.Image import Image,cookId
5: from OFS.Folder import Folder
6: from OFS.SimpleItem import SimpleItem
7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8: from Products.PageTemplates.PageTemplate import PageTemplate
9: import re
10: import string
11: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
12: import os.path
13: from Globals import package_home
14: import urllib
15: from ECHO_helpers import *
16: from ECHO_collection import content_html
17: from types import *
18:
19:
20: from Globals import DTMLFile
21: from OFS.Image import Image,cookId
22: from OFS.Folder import Folder
23: from OFS.SimpleItem import SimpleItem
24: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
25: from Products.PageTemplates.PageTemplate import PageTemplate
26: import re
27: import string
28: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
29: import os.path
30:
31: import urllib
32: from ECHO_helpers import displayTypes,checkOnlyOneInGroup,unicodify
33: from ECHO_collection import content_html
34: import logging
35:
36: #def ersetzt logging
37: def logger(txt,method,txt2):
38: """logging"""
39: logging.info(txt+ txt2)
40:
41: STORAGEMANAGER_URL_DEFAULT = "http://storage-web.mpiwg-berlin.mpg.de/storage/storeOnline?path="
42: try:
43: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
44: except:
45: logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
46:
47:
48:
49: class ECHO_ZCatalogElement(SimpleItem):
50: """Erzeuge navigation aus ZCatalog-abfrage"""
51: meta_type="ECHO_ZCatalogElement"
52: baseUrl=""
53:
54:
55:
56: def __init__(self,id,title,field,catalogId,baseUrl,weight,contentType):
57: """init"""
58: self.id=id
59: self.title=title
60: self.catalogId=catalogId
61: self.field=field
62:
63: self.baseUrl=baseUrl
64: self.weight=weight
65: self.content=contentType
66:
67:
68: manage_options= SimpleItem.manage_options+(
69: {'label':'Main Config','action':'changeECHO_ZCatalogElementForm'},
70: )
71:
72:
73: def getWeight(self):
74: """get weight"""
75: if hasattr(self,'weight'):
76: return self.weight
77: else:
78: return 0
79:
80: def getcontentType(self):
81: """get weight"""
82:
83: if hasattr(self,'contentType'):
84: return self.contentType
85: else:
86: return 0
87:
88:
89: def changeECHO_ZCatalogElementForm(self):
90: """change"""
91:
92: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_ZCatalogElement.zpt')).__of__(self)
93: return pt()
94:
95: def changeECHO_ZCatalogElement(self,title,field,catalogId,baseUrl,weight,contentType,RESPONSE=None):
96: """change"""
97: self.title=title
98: self.catalogId=catalogId
99: self.field=field
100: self.baseUrl=baseUrl
101: self.weight=weight
102: self.contentType=contentType
103:
104: if RESPONSE is not None:
105: RESPONSE.redirect('manage_main')
106: def getKeywordList(self):
107: try:
108: return getattr(self,self.catalogId).uniqueValuesFor(self.field)
109: except:
110: #return getattr(self,self.catalogId).query(self.field)
111:
112: list= [x for x in getattr(getattr(self,self.catalogId),self.field).words()]
113: list.sort()
114: return list
115:
116: def getNavList(self):
117: """ausgabe der treffer list fuer navigation"""
118:
119: records=self.getKeywordList()
120:
121: records=[x.encode('utf-8') for x in records]
122: records.sort()
123: if not records:
124: return []
125: else:
126: ret=[]
127: for record in records:
128:
129: #print "RC",record
130: #if record:
131: # ret.append((record,self.baseUrl+urllib.quote(record)))
132: try:
133: ret.append((record,self.baseUrl+urllib.quote(record)))
134: except:
135: """nothing"""
136:
137: return ret
138:
139:
140: def manage_addECHO_ZCatalogElementForm(self):
141: """Form for adding"""
142: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_ZCatalogElement.zpt')).__of__(self)
143: return pt()
144:
145: def manage_addECHO_ZCatalogElement(self,id,title,field,catalogId,baseUrl,weight,contentType,RESPONSE=None):
146: """Add an ECHO_ZCatalogelement"""
147:
148: self._setObject(id,ECHO_ZCatalogElement(id,title,field,catalogId,baseUrl,weight,contentType))
149:
150: if RESPONSE is not None:
151: RESPONSE.redirect('manage_main')
152:
153:
154:
155: class ECHO_contentType(Image):
156: """ContentType Object"""
157:
158: meta_type="ECHO_contentType"
159:
160:
161: manage_options=Image.manage_options+(
162: {'label':'Change Description','action':'changeECHO_contentTypeForm'},
163: )
164:
165: def changeECHO_contentTypeForm(self):
166: """Change the description text"""
167: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_contentType.zpt')).__of__(self)
168: return pt()
169:
170: def changeECHO_contentType(self,description,RESPONSE=None):
171: """Change the Content"""
172: self.description=description
173: if RESPONSE is not None:
174: RESPONSE.redirect('manage_main')
175:
176: manage_addECHO_contentTypeForm=DTMLFile('dtml/ECHO_contentTypeAdd',globals(),
177: Kind='ECHO_contentType',kind='ECHO_contentType')
178:
179: def manage_addECHO_contentType(self, id, file=None, title='', precondition='', content_type='', description='',
180: REQUEST=None):
181: """
182: Add a new Image object.
183:
184: Creates a new Image object 'id' with the contents of 'file'.
185: """
186:
187: id=str(id)
188: title=str(title)
189: content_type=str(content_type)
190: precondition=str(precondition)
191:
192: id, title = cookId(id, title, file)
193:
194: self=self.this()
195:
196: # First, we create the image without data:
197: self._setObject(id, ECHO_contentType(id,title,'',content_type, precondition))
198:
199: self._getOb(id).description=description
200:
201: # Now we "upload" the data. By doing this in two steps, we
202: # can use a database trick to make the upload more efficient.
203: if file:
204: self._getOb(id).manage_upload(file)
205: if content_type:
206: self._getOb(id).content_type=content_type
207:
208: if REQUEST is not None:
209: try: url=self.DestinationURL()
210: except: url=REQUEST['URL1']
211: REQUEST.RESPONSE.redirect('%s/manage_main' % url)
212: return id
213:
214:
215: class ECHO_sqlElement(SimpleItem):
216: """Erzeuge navigation aus sql-abfrage"""
217: meta_type="ECHO_sqlElement"
218: baseUrl=""
219:
220:
221:
222: def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
223: """init"""
224: self.id=id
225: self.title=title
226: self.query=query
227: self.field=field
228: if searchField=="":
229: self.searchField=field
230: else:
231: self.searchField=searchField
232: self.baseUrl=baseUrl
233:
234: self.content=contentType
235:
236: manage_options= SimpleItem.manage_options+(
237: {'label':'Main Config','action':'changeECHO_sqlElementForm'},
238: )
239:
240: def getSearchField(self):
241: try:
242: return self.searchField
243: except:
244: return self.field
245:
246: def getWeight(self):
247: """get weight"""
248: if hasattr(self,'weight'):
249: return self.weight
250: else:
251: return 0
252:
253: def getcontentType(self):
254: """get weight"""
255:
256: if hasattr(self,'contentType'):
257: return self.contentType
258: else:
259: return 0
260:
261:
262: def changeECHO_sqlElementForm(self):
263: """change"""
264:
265: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_sqlElement.zpt')).__of__(self)
266: return pt()
267:
268: def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
269: """change"""
270: self.title=title
271: self.query=query
272: self.field=field
273: self.searchField=searchField
274: self.baseUrl=baseUrl
275: self.weight=weight
276: self.contentType=contentType
277:
278: if RESPONSE is not None:
279: RESPONSE.redirect('manage_main')
280:
281: try:
282: searchQuery=ZSQLExtendFolder.ZSQLSimpleSearch
283: except:
284: logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
285:
286: def getNavList(self):
287: """ausgabe der treffer list fuer navigation"""
288:
289: #naechste schritte sind trial and error, warum geht mal das eine mal das andere 2.3 / 2.4 ??
290:
291: try:
292: try:
293: records=self.ZSQLSimpleSearch(query=self.query)
294: except:
295: records=self.searchQuery(self.aq_parent,query=self.query) #python 2.4 version (??)
296: except:
297: records=self.searchQuery(query=self.query)#python 2.3 version(??)
298:
299:
300: if not records:
301: return []
302: else:
303: ret=[]
304: for record in records:
305: try:
306: ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
307: except:
308: logger('ECHO_Nav',logging.INFO,"error, search")
309: """notrhing"""
310:
311: return ret
312:
313:
314: def manage_addECHO_sqlElementForm(self):
315: """Form for adding"""
316: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_sqlElement.zpt')).__of__(self)
317: return pt()
318:
319: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
320: """Add an ECHO_sqlelement"""
321: self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
322:
323: if RESPONSE is not None:
324: RESPONSE.redirect('manage_main')
325:
326:
327: class ECHO_pageTemplate(ZopePageTemplate,ECHO_basis):
328: """pageTemplate Objekt"""
329: meta_type="ECHO_pageTemplate"
330: security=ClassSecurityInfo()
331:
332:
333: _default_content_fn = os.path.join(package_home(globals()),
334: 'html/ECHO_pageTemplateDefault.html')
335:
336: manage_options=ZopePageTemplate.manage_options+ECHO_basis.manage_options+(
337: {'label':'Main Config','action':'changeECHO_pageTemplateMainForm'},
338: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
339: )
340:
341: security.declarePublic('content_html')
342:
343: def addChanges(self):
344: """do nothing leere methode, notwendig, da bei veerbung
345: von dieser klasse nur ueberschrieben werden kann,
346: falls methode per url aufgerufen werden soll"""
347:
348: return True
349:
350: def content_html(self):
351: """content_html"""
352: return content_html(self,'pageTemplate')
353:
354: def changeECHO_pageTemplateMainForm(self):
355: """change"""
356: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_pageTemplateMain.zpt')).__of__(self)
357: return pt()
358:
359: def changeECHO_pageTemplateMain(self,weight,contentType,label,description,RESPONSE=None,isAlwaysClickable=None,suffix=None,prefix=None):
360: """change"""
361: self.weight=weight
362: self.contentType=contentType
363: self.label=label
364: self.description=description
365: self.isAlwaysClickable=isAlwaysClickable
366: self.suffix=suffix
367: self.prefix=prefix
368:
369: if RESPONSE is not None:
370: RESPONSE.redirect('manage_main')
371:
372: def getWeight(self):
373: """get weight"""
374: if hasattr(self,'weight'):
375: return self.weight
376: else:
377: return 0
378:
379: def getcontentType(self):
380: """get contentType"""
381: if hasattr(self,'contentType'):
382: return self.contentType
383: else:
384: return 0
385:
386:
387:
388:
389: ## def __init__(self, id, text=None, contentType=None):
390: ## self.id = str(id)
391: ## self.ZBindings_edit(self._default_bindings)
392: ## if text is None:
393: ## text = open(self._default_cont).read()
394: ## self.pt_edit(text, contentType)
395:
396: def manage_addECHO_pageTemplateForm(self):
397: """Form for adding"""
398: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_pageTemplate.zpt')).__of__(self)
399: return pt()
400:
401: from urllib import quote
402:
403:
404: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
405: REQUEST=None, submit=None):
406: "Add a Page Template with optional file content."
407:
408:
409: id = str(id)
410: if REQUEST is None:
411: self._setObject(id, ECHO_pageTemplate(id, text))
412: ob = getattr(self, id)
413: setattr(ob,'weight',weight)
414: setattr(ob,'label',label)
415: setattr(ob,'contentType',contentType)
416: if title:
417: ob.pt_setTitle(title)
418: return ob
419: else:
420: file = REQUEST.form.get('file')
421: headers = getattr(file, 'headers', None)
422: if headers is None or not file.filename:
423: zpt = ECHO_pageTemplate(id)
424: else:
425: zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
426:
427: self._setObject(id, zpt)
428: ob = getattr(self, id)
429: setattr(ob,'weight',weight)
430: setattr(ob,'label',label)
431: if title:
432: ob.pt_setTitle(title)
433:
434: try:
435: u = self.DestinationURL()
436: except AttributeError:
437: u = REQUEST['URL1']
438:
439: if submit == " Add and Edit ":
440: u = "%s/%s" % (u, quote(id))
441: REQUEST.RESPONSE.redirect(u+'/manage_main')
442: return ''
443:
444:
445: class ECHO_navigation(Folder):
446: """Navigations Element"""
447: meta_type="ECHO_Navigation"
448: management_page_charset="utf-8"
449:
450:
451: def getFullTextBasisUrl(self):
452: #return die Basis url auf fulltexte, z.B.
453: #Beispiel http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/getDoc?doc=/archimedes/la/achil_propo_087_la_1545.xml
454: return getattr(self, "fullTextBasisUrl","http://mpdl-text.mpiwg-berlin.mpg.de/mpdl/getDoc?doc=%s")
455:
456: def getStandardMD(self):
457: #return self.standardMD_old
458: return self.metadata.main.meta.bib
459:
460: def getUsername(self):
461: """get name of user"""
462: username=str(self.REQUEST['AUTHENTICATED_USER'])
463: if username=='Anonymous User':
464: return None
465: else:
466: return username
467:
468: def searchExternalCollection(self,url,simpleSearch):
469: """search external collection via xmlrpc"""
470: server=xmlrpclib.Server(url)
471:
472: results=server.getSubcolsXMLRpc(simpleSearch)
473:
474: return results
475:
476: def getXMLRpcConnection(self,url):
477: """getxmlrpc"""
478: if not hasattr(self,"_v_server"):
479: self._v_server=[]
480:
481: server=xmlrpclib.Server(url)
482: self._v_server.append(server)
483:
484: return len(self._v_server)-1
485:
486: def getXMLRpcMethod(self,nr,method,compressed=None):
487: """getmethod"""
488:
489: ret= eval('self._v_server[%i].%s'%(nr,method))
490: if compressed:
491: ret=decodeRPC(ret)
492: return ret
493:
494: def getNavInfo(self):
495: """root informationen"""
496: if hasattr(self,'logo_image'):
497: if hasattr(self.logo_image,'tag'):
498: imageTag=self.logo_image.tag()
499: else:
500: imageTag=''
501: return (self.title,imageTag)
502:
503: def linkBar(self,parent):
504: """linkbarer balken"""
505: str=""
506:
507:
508: while not(parent.meta_type == "ECHO_root"):
509: fragment="""<a href="%s">%s</a>"""%(parent.absolute_url(),parent.label)
510: str=fragment+"/"+str
511: parent=parent.aq_parent
512:
513: return str
514:
515: def decode(self,str):
516: """decoder"""
517: return unicodify(str)
518:
519: def ECHOFormatListStr(self,list,search="\n",replace="<br>"):
520: """formatiert liste im str"""
521: if list:
522: return re.sub(search,replace,list)
523: else:
524: return
525:
526: def ECHO_cacheManageForm(self):
527: """change form"""
528: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ECHO_cacheManageForm')).__of__(self)
529: pt.content_type="text/html"
530: return pt()
531:
532: def ECHO_cacheManage(self,cacheManagerName=None,deleteCache=None, activateCache=None,RESPONSE=None):
533: """cachemanager"""
534: if cacheManagerName=="": chacheManagerName=None
535:
536: self.cacheManagerName=cacheManagerName
537: self.setCache(managerName=cacheManagerName)
538:
539: if deleteCache:
540: try:
541: self.deleteCache()
542: except:
543: for roots in self.ZopeFind(self,obj_metatypes=['ECHO_root'],search_sub=1):
544: roots[1].deleteCache()
545:
546:
547: self.activateCache=activateCache
548:
549: if RESPONSE is not None:
550: RESPONSE.redirect('manage_main')
551:
552: def setCache(self,obj=None,RESPONSE=None,managerName='CacheManager'):
553: """setze alle collections auf cache = CacheManager"""
554:
555:
556: if not obj:
557: obj = self
558:
559: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_collection','VLP_resource'],search_sub=1)
560:
561: for entry in entries:
562: entry[1].ZCacheable_setManagerId(managerName)
563:
564:
565: return "changed all CM in: "+self.title
566:
567:
568:
569: displayableMetaTypes=displayTypes
570:
571: def getImageViewers(self):
572: """images"""
573: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
574: return viewers
575:
576: def getR(self):
577: """re"""
578: return self.REQUEST
579:
580: def __init__(self,id,title,pathToHierarchy):
581: """init"""
582: self.id=id
583: self.title=title
584: self.pathToHierarchy=pathToHierarchy
585: self.displayedMetaTypes=displayTypes
586:
587: manage_options = Folder.manage_options+(
588: {'label':'Main Config','action':'ECHO_navigationConfigForm'},
589: {'label':'Cache','action':'ECHO_cacheManageForm'},
590:
591: )
592: displayedMetaTypes=displayTypes
593:
594: def getStorageManagerURL(self):
595: """returns the URL to the storagemanager"""
596: return getattr(self,"storageManagerURL",STORAGEMANAGER_URL_DEFAULT)
597: def ECHO_navigationConfigForm(self):
598: """configForm"""
599: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_navigation.zpt')).__of__(self)
600: return pt()
601:
602: def ECHO_navigationConfig(self,title,pathToHierarchy,fullTextBasisUrl="",storageManagerURL="",displayedMetaTypes=displayTypes,RESPONSE=None):
603: """config"""
604: self.title=title
605: self.pathToHierarchy=pathToHierarchy
606: self.displayedMetaTypes=toList(displayedMetaTypes)[0:]
607: self.storageManagerURL=storageManagerURL
608: self.fullTextBasisUrl=fullTextBasisUrl
609: if RESPONSE is not None:
610: RESPONSE.redirect('manage_main')
611:
612:
613: def getColls(self,obj,depth,checkOnly="no"):
614: nav={}
615: #print "HERE",obj.
616: for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
617: x=x_objs[1]
618: if checkOnly=="yes":
619: x = checkOnlyOneInGroup(x)
620: if depth>1:
621: nav[x.getId()]=(self.getColls(x,depth-1),x)
622: else:
623: nav[x.getId()]=(None,x)
624: return nav
625:
626: def createNavHash(self,depth,checkOnly="no"):
627: """Auslesen des Hierarchiebuames"""
628: temp=self.pathToHierarchy[0:]
629: temp=re.sub("/",".",temp)
630: temp="self.aq_parent"+temp
631:
632:
633: objtemp=eval(temp)
634: nav={}
635:
636: #check if cash is enabled and if already exists and if not empty
637: if getattr(self,'_v_hash',None) and getattr(self,'activateCache',None) and self._v_hash.get(str(depth),None):
638:
639: return self._v_hash[str(depth)]
640:
641: # if not generate new hash
642: obj=objtemp
643:
644: for keys in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
645:
646: x=keys[1]
647: if depth>1:
648: nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
649: else:
650: nav[x.getId()]=(None,x)
651:
652: #store in cache if activated
653: if getattr(self,'activateCache',None):
654:
655: try:
656: self._v_hash[str(depth)]={}
657: except:
658: self._v_hash={}
659: self._v_hash[str(depth)]={}
660:
661: for x in nav.keys():
662: self._v_hash[str(depth)][x]=nav[x]
663:
664: return nav
665:
666: def barFromHash(self,hash,start=None,sortField=None,location=None):
667: """Erzeuge Navigations Element"""
668:
669: listNav=[]
670: if not start:
671: temp=hash
672: sortField="weight"
673: else: # liste mit pfad zum hash
674: temp=hash
675: #print "HI",sortField
676: if not sortField:
677: tempObj=self.pathToHierarchy[0:]
678: tempObj=re.sub("/",".",tempObj)
679: tempObj="self.aq_parent"+tempObj
680: #print tempObj
681: objtemp=eval(tempObj)
682:
683: obj=objtemp
684:
685: for x in start:
686: #print "OBJ",start,obj,obj.getId(),x
687:
688: obj=getattr(obj,x)
689:
690: if hasattr(obj,'sortfield'):
691: sortField=obj.sortfield
692: else:
693: sortField='weight'
694: #print "START",start
695: for x in start:
696: #print "N2",x,temp[x]
697: try:
698: temp=temp[x][0]
699: except:
700: """nothing"""
701: return []
702: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
703:
704: for x in self.tempSorted(temp, field=sortField):
705:
706: if not temp[x][1].title == "":
707:
708: if (temp[x][1].meta_type=="ECHO_sqlElement") or (temp[x][1].meta_type=="ECHO_ZCatalogElement"):
709:
710: for z in temp[x][1].getNavList():
711: listNav.append((z[0],z[1],None,'',''))
712:
713: else:
714: # add label falls existiert und nicht leer
715: if hasattr(temp[x][1],'label'):
716:
717: if not temp[x][1].getLabel()=='':
718: label=temp[x][1].getLabel()
719: else:
720: try:
721: label=temp[x][1].getTitle()
722: except:
723: logger("ECHO_Nav",logging.ERROR,"%s has neither getLabel nor getTile implemented"%temp[x][1].getId())
724: label=""
725: else:
726: label=temp[x][1].getTitle()
727:
728:
729: if location:
730:
731: loc=getattr(temp[x][1],'location','top')
732: if (loc==location):
733:
734:
735: listNav.append((label,createPath(self,self.absolute_url(),temp[x][1].absolute_url(relative=1))+getattr(temp[x][1],'queryString',''),temp[x][1],getattr(temp[x][1],'prefix',''),getattr(temp[x][1],'suffix','')))
736: else:
737:
738: listNav.append((label,createPath(self,self.absolute_url(),temp[x][1].absolute_url(relative=1))+getattr(temp[x][1],'queryString',''),temp[x][1],getattr(temp[x][1],'prefix',''),getattr(temp[x][1],'suffix','')))
739: #print self.REQUEST
740: return listNav
741:
742: def tempSorted(self,hash,field="weight"):
743: ls=[]
744:
745: for x in hash.keys():
746: #print hash[x][1]
747: if hasattr(hash[x][1],field):
748: try:
749: weight=int(getattr(hash[x][1],field))
750: except:
751: weight=getattr(hash[x][1],field)
752: #print weight
753: else:
754: weight=0
755:
756: ls.append((x,weight))
757:
758: ls.sort(sortWeight)
759:
760: return [x[0] for x in ls]
761:
762:
763:
764:
765: def isSelectedPath(self,item):
766: """test is path is already selected"""
767:
768: testStr=re.sub("/index_html",'',self.REQUEST.get('URL',''))
769:
770: if len(item)<2:
771: return 0
772: #falls exakte Uebereinstimmung dann immer 1
773: if (testStr==item[1]) and (self.REQUEST.get('QUERY_STRING','')==''):
774:
775: return 1
776:
777: found=re.search("\?(.*)",item[1])
778:
779: if found:
780: temp=re.sub(" ","%20",found.group(0))
781:
782: #print temp+"::"+self.REQUEST['QUERY_STRING']
783: if ("?"+self.REQUEST['QUERY_STRING'])==temp:
784: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
785:
786: return 2
787: else:
788: return 1
789:
790: if (getattr(item[2],'meta_type','')=="ECHO_pageTemplate") and (re.search(item[1],self.REQUEST['URL'])):
791: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
792:
793: return 2
794: else:
795: return 1
796:
797: if re.search(item[1]+"/",self.REQUEST['URL']):
798: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
799:
800: return 2
801: else:
802: return 1
803: else:
804: return 0
805:
806:
807: def getPathStyle(self, item, style=""):
808: """returns a string with the given style + 'sel' if the path is already selected."""
809:
810: if self.isSelectedPath(item):
811: return style + 'sel'
812: else:
813: return style
814:
815:
816: def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
817:
818: """Generate Buttons"""
819: if orientation=="horizontal":
820: html="<table><tr>"
821: startTag="<td>"
822: endTag="</td>"
823: endHtml="</tr></table>"
824:
825: else:
826: html="<table>"
827: startTag="<tr><td>"
828: endTag="</td></tr>"
829: endHtml="</table>"
830:
831: if not start:
832: temp=hash
833: else:
834: temp=hash
835: for x in start:
836: temp=temp[x][0]
837: #print temp
838:
839: for key in self.tempSorted(temp):
840:
841: description=temp[x][1].title
842:
843:
844: url=createPath(self,self.absolute_url(),temp[key][1].absolute_url(relative=1))
845:
846: if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
847: html=html+startTag+"[%s]" % description+endTag
848: else:
849: html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
850:
851:
852: html=html+endHtml
853:
854: return html
855:
856: def mainNavBar(self):
857: """print main navigation bar"""
858: keys=""
859:
860: try:
861: keys=self.buttonsFromHash(self.createNavHash(0))
862: except:
863: keys=""
864:
865: return keys
866:
867: def mainNavElements(self,location=None):
868: """print main navigation bar"""
869: keys=""
870: #print "NAVELEMENT",self.getId()
871: #try:
872:
873: keys=self.barFromHash(self.createNavHash(0),location=location)
874:
875: #except:
876: # keys=""
877:
878: return keys
879:
880: def numberOfMainNavElements(self):
881: """number of main elements"""
882:
883: return len(self.barFromHash(self.createNavHash(0)))
884:
885: def startOfHierarchy(self,list):
886: splitted=self.pathToHierarchy.split("/")
887: last=splitted[len(splitted)-1]
888: #print last,list
889: try:
890: nr=list.index(last)
891: except:
892: nr=0
893: return nr+1
894:
895: def subNavStatic(self,obj):
896: """subnav" von self"""
897: def sortWeight(x,y):
898: x1=int(getattr(x[1],'weight','0'))
899: y1=int(getattr(y[1],'weight','0'))
900: return cmp(x1,y1)
901: print "obj",obj
902: subs=self.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes)
903: subret=[]
904:
905: for x in subs:
906: if not(x[1].title==""):
907: subret.append(x)
908: subret.sort(sortWeight)
909: return subret
910:
911: def secondNavElements(self):
912: """Zweite Ordnung Navigationselemente"""
913:
914: hash=self.createNavHash(2,checkOnly="no")
915:
916: actual_url=self.REQUEST['URL']
917:
918: ult_temp=re.sub(self.absolute_url(),"",actual_url)
919: #print ult_temp
920:
921: splitted=ult_temp.split("/")
922:
923: #print "AU",self.absolute_url(),splitted
924: #start=[splitted[2]] #orig
925: startNr= self.startOfHierarchy(splitted)
926:
927: start=[splitted[startNr]]
928:
929: #print start
930:
931: keys=self.barFromHash(hash,start=start)
932:
933:
934: return keys
935:
936: def navElements(self,order):
937: """n-te Ordnung"""
938:
939: hash=self.createNavHash(order)
940: actual_url=self.REQUEST['URL']
941:
942: ult_temp=re.sub(self.absolute_url(),"",actual_url)
943: #print ult_temp
944:
945: splitted=ult_temp.split("/")
946:
947:
948: ## if splitted[len(splitted)-1]=="index_html":
949: ## start=[splitted[len(splitted)-2]]
950: ## else:
951: ## start=[splitted[len(splitted)-1]]
952:
953: #start=splitted[2:order+1] #orig
954: startNr= self.startOfHierarchy(splitted)
955: #print startNr
956: start=splitted[startNr:order+startNr-1]
957: #print start
958:
959: keys=self.barFromHash(hash,start=start)
960:
961:
962: return keys
963:
964:
965: def secondNavBar(self):
966: """Zweite Ordnung"""
967:
968: hash=self.createNavHash(2)
969: actual_url=self.REQUEST['URL']
970:
971: ult_temp=re.sub(self.absolute_url(),"",actual_url)
972: #print ult_temp
973:
974: splitted=ult_temp.split("/")
975:
976:
977: ## if splitted[len(splitted)-1]=="index_html":
978: ## start=[splitted[len(splitted)-2]]
979: ## else:
980: ## start=[splitted[len(splitted)-1]]
981:
982: start=[splitted[2]]
983: #print start
984:
985: keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
986:
987:
988: return keys
989:
990: def manage_addECHO_navigationForm(self):
991: """Form for adding"""
992: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_navigation.zpt')).__of__(self)
993: return pt()
994:
995: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
996: """Add an ECHO_root"""
997: self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
998:
999: if RESPONSE is not None:
1000: RESPONSE.redirect('manage_main')
1001:
1002:
1003: #helpers
1004:
1005:
1006:
1007: def createPath(self,url1,url2):
1008: #bugfix in absolute_url, ploetzlich erschein in absolute_url der physikalische pfad.
1009:
1010: if self.REQUEST.has_key('VirtualRootPhysicalPath'):
1011: vp="/".join(self.REQUEST['VirtualRootPhysicalPath'])
1012: if (len(vp)>0):
1013: if vp[0]=="/":
1014: vp=vp[1:]
1015:
1016: url2=url2.replace(vp+"/",'')
1017: else:
1018: temp1=url1.split("/")
1019: temp2=url2.split("/")
1020: for test in temp1:
1021: if temp2[0]==test:
1022: del temp2[0]
1023:
1024: url2= string.join(temp2,"/")
1025:
1026: return url1+"/"+url2
1027:
1028: def sortWeight(x,y):
1029: #print x[1],y[1]
1030: return cmp(x[1],y[1])
1031:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>