Annotation of ECHO_content/ECHO_Nav.py, revision 1.85
1.60 dwinter 1: # Objekte zur Erzeugung von Navigationselement
1.54 dwinter 2: from AccessControl import ClassSecurityInfo
1.11 dwinter 3: from Globals import DTMLFile
4: from OFS.Image import Image,cookId
1.1 dwinter 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
1.48 dwinter 15: from ECHO_helpers import *
1.59 dwinter 16: from ECHO_collection import content_html
1.48 dwinter 17: from types import *
1.35 dwinter 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
1.55 dwinter 30:
1.35 dwinter 31: import urllib
1.81 casties 32: from ECHO_helpers import displayTypes,checkOnlyOneInGroup,unicodify
1.35 dwinter 33: from ECHO_collection import content_html
1.79 dwinter 34: import logging
35:
36: #def ersetzt logging
37: def logger(txt,method,txt2):
38: """logging"""
39: logging.info(txt+ txt2)
40:
1.83 dwinter 41: STORAGEMANAGER_URL_DEFAULT = "http://storage-web.mpiwg-berlin.mpg.de/storage/storeOnline?path="
1.49 dwinter 42: try:
43: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
44: except:
1.79 dwinter 45: logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
1.35 dwinter 46:
47:
48:
49: class ECHO_ZCatalogElement(SimpleItem):
50: """Erzeuge navigation aus ZCatalog-abfrage"""
51: meta_type="ECHO_ZCatalogElement"
52: baseUrl=""
1.85 ! dwinter 53:
! 54:
! 55:
1.35 dwinter 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:
1.48 dwinter 67:
1.35 dwinter 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:
1.48 dwinter 92: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_ZCatalogElement.zpt')).__of__(self)
1.35 dwinter 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):
1.72 dwinter 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
1.35 dwinter 115:
116: def getNavList(self):
1.64 dwinter 117: """ausgabe der treffer list fuer navigation"""
1.37 dwinter 118:
1.35 dwinter 119: records=self.getKeywordList()
120:
1.64 dwinter 121: records=[x.encode('utf-8') for x in records]
122: records.sort()
1.35 dwinter 123: if not records:
124: return []
125: else:
126: ret=[]
127: for record in records:
1.64 dwinter 128:
1.35 dwinter 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"""
1.49 dwinter 142: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_ZCatalogElement.zpt')).__of__(self)
1.35 dwinter 143: return pt()
144:
1.64 dwinter 145: def manage_addECHO_ZCatalogElement(self,id,title,field,catalogId,baseUrl,weight,contentType,RESPONSE=None):
1.35 dwinter 146: """Add an ECHO_ZCatalogelement"""
1.64 dwinter 147:
148: self._setObject(id,ECHO_ZCatalogElement(id,title,field,catalogId,baseUrl,weight,contentType))
1.35 dwinter 149:
150: if RESPONSE is not None:
151: RESPONSE.redirect('manage_main')
152:
153:
154:
1.11 dwinter 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"""
1.48 dwinter 167: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_contentType.zpt')).__of__(self)
1.11 dwinter 168: return pt()
1.48 dwinter 169:
1.11 dwinter 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:
1.1 dwinter 214:
215: class ECHO_sqlElement(SimpleItem):
216: """Erzeuge navigation aus sql-abfrage"""
217: meta_type="ECHO_sqlElement"
218: baseUrl=""
1.41 dwinter 219:
220:
1.1 dwinter 221:
1.10 dwinter 222: def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
1.1 dwinter 223: """init"""
224: self.id=id
225: self.title=title
226: self.query=query
227: self.field=field
1.7 dwinter 228: if searchField=="":
229: self.searchField=field
230: else:
231: self.searchField=searchField
1.1 dwinter 232: self.baseUrl=baseUrl
1.38 dwinter 233:
1.10 dwinter 234: self.content=contentType
1.1 dwinter 235:
236: manage_options= SimpleItem.manage_options+(
237: {'label':'Main Config','action':'changeECHO_sqlElementForm'},
238: )
239:
1.7 dwinter 240: def getSearchField(self):
241: try:
242: return self.searchField
243: except:
244: return self.field
245:
1.3 dwinter 246: def getWeight(self):
1.4 dwinter 247: """get weight"""
248: if hasattr(self,'weight'):
249: return self.weight
1.3 dwinter 250: else:
251: return 0
252:
1.10 dwinter 253: def getcontentType(self):
1.6 dwinter 254: """get weight"""
255:
1.10 dwinter 256: if hasattr(self,'contentType'):
257: return self.contentType
1.6 dwinter 258: else:
259: return 0
1.3 dwinter 260:
261:
1.1 dwinter 262: def changeECHO_sqlElementForm(self):
263: """change"""
1.6 dwinter 264:
1.48 dwinter 265: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_sqlElement.zpt')).__of__(self)
1.1 dwinter 266: return pt()
267:
1.10 dwinter 268: def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
1.1 dwinter 269: """change"""
270: self.title=title
271: self.query=query
272: self.field=field
1.7 dwinter 273: self.searchField=searchField
1.1 dwinter 274: self.baseUrl=baseUrl
1.3 dwinter 275: self.weight=weight
1.10 dwinter 276: self.contentType=contentType
1.6 dwinter 277:
1.1 dwinter 278: if RESPONSE is not None:
279: RESPONSE.redirect('manage_main')
280:
1.49 dwinter 281: try:
282: searchQuery=ZSQLExtendFolder.ZSQLSimpleSearch
283: except:
1.79 dwinter 284: logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
1.49 dwinter 285:
286: def getNavList(self):
1.61 dwinter 287: """ausgabe der treffer list fuer navigation"""
1.37 dwinter 288:
1.60 dwinter 289: #naechste schritte sind trial and error, warum geht mal das eine mal das andere 2.3 / 2.4 ??
1.77 dwinter 290:
1.60 dwinter 291: try:
1.77 dwinter 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 (??)
1.60 dwinter 296: except:
1.77 dwinter 297: records=self.searchQuery(query=self.query)#python 2.3 version(??)
1.37 dwinter 298:
1.77 dwinter 299:
1.1 dwinter 300: if not records:
301: return []
302: else:
303: ret=[]
304: for record in records:
1.7 dwinter 305: try:
306: ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
307: except:
1.79 dwinter 308: logger('ECHO_Nav',logging.INFO,"error, search")
1.7 dwinter 309: """notrhing"""
310:
1.1 dwinter 311: return ret
312:
313:
1.6 dwinter 314: def manage_addECHO_sqlElementForm(self):
1.1 dwinter 315: """Form for adding"""
1.48 dwinter 316: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_sqlElement.zpt')).__of__(self)
1.1 dwinter 317: return pt()
318:
1.10 dwinter 319: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
1.1 dwinter 320: """Add an ECHO_sqlelement"""
1.10 dwinter 321: self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
1.1 dwinter 322:
323: if RESPONSE is not None:
324: RESPONSE.redirect('manage_main')
325:
326:
1.51 dwinter 327: class ECHO_pageTemplate(ZopePageTemplate,ECHO_basis):
1.1 dwinter 328: """pageTemplate Objekt"""
329: meta_type="ECHO_pageTemplate"
1.54 dwinter 330: security=ClassSecurityInfo()
331:
1.56 dwinter 332:
1.1 dwinter 333: _default_content_fn = os.path.join(package_home(globals()),
1.6 dwinter 334: 'html/ECHO_pageTemplateDefault.html')
1.1 dwinter 335:
1.51 dwinter 336: manage_options=ZopePageTemplate.manage_options+ECHO_basis.manage_options+(
1.39 dwinter 337: {'label':'Main Config','action':'changeECHO_pageTemplateMainForm'},
1.56 dwinter 338: {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1.3 dwinter 339: )
1.23 dwinter 340:
1.54 dwinter 341: security.declarePublic('content_html')
342:
1.59 dwinter 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
1.54 dwinter 349:
1.23 dwinter 350: def content_html(self):
1.58 dwinter 351: """content_html"""
352: return content_html(self,'pageTemplate')
1.3 dwinter 353:
1.39 dwinter 354: def changeECHO_pageTemplateMainForm(self):
1.4 dwinter 355: """change"""
1.48 dwinter 356: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_pageTemplateMain.zpt')).__of__(self)
1.4 dwinter 357: return pt()
358:
1.47 dwinter 359: def changeECHO_pageTemplateMain(self,weight,contentType,label,description,RESPONSE=None,isAlwaysClickable=None,suffix=None,prefix=None):
1.4 dwinter 360: """change"""
361: self.weight=weight
1.10 dwinter 362: self.contentType=contentType
1.15 dwinter 363: self.label=label
1.39 dwinter 364: self.description=description
1.43 dwinter 365: self.isAlwaysClickable=isAlwaysClickable
1.47 dwinter 366: self.suffix=suffix
367: self.prefix=prefix
1.15 dwinter 368:
1.4 dwinter 369: if RESPONSE is not None:
370: RESPONSE.redirect('manage_main')
1.51 dwinter 371:
1.4 dwinter 372: def getWeight(self):
373: """get weight"""
374: if hasattr(self,'weight'):
375: return self.weight
376: else:
377: return 0
1.6 dwinter 378:
1.10 dwinter 379: def getcontentType(self):
1.33 jdamerow 380: """get contentType"""
381: if hasattr(self,'contentType'):
382: return self.contentType
1.6 dwinter 383: else:
384: return 0
385:
1.3 dwinter 386:
387:
1.1 dwinter 388:
1.10 dwinter 389: ## def __init__(self, id, text=None, contentType=None):
1.1 dwinter 390: ## self.id = str(id)
391: ## self.ZBindings_edit(self._default_bindings)
392: ## if text is None:
393: ## text = open(self._default_cont).read()
1.10 dwinter 394: ## self.pt_edit(text, contentType)
1.1 dwinter 395:
1.6 dwinter 396: def manage_addECHO_pageTemplateForm(self):
1.1 dwinter 397: """Form for adding"""
1.49 dwinter 398: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_pageTemplate.zpt')).__of__(self)
1.1 dwinter 399: return pt()
400:
401: from urllib import quote
402:
403:
1.15 dwinter 404: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
1.1 dwinter 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)
1.3 dwinter 413: setattr(ob,'weight',weight)
1.15 dwinter 414: setattr(ob,'label',label)
1.10 dwinter 415: setattr(ob,'contentType',contentType)
1.1 dwinter 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:
1.10 dwinter 425: zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
1.1 dwinter 426:
427: self._setObject(id, zpt)
1.3 dwinter 428: ob = getattr(self, id)
429: setattr(ob,'weight',weight)
1.34 dwinter 430: setattr(ob,'label',label)
1.8 dwinter 431: if title:
432: ob.pt_setTitle(title)
433:
1.1 dwinter 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"
1.69 dwinter 448: management_page_charset="utf-8"
1.74 dwinter 449:
1.85 ! dwinter 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:
1.74 dwinter 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:
1.67 dwinter 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:
1.59 dwinter 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:
1.53 dwinter 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"""
1.81 casties 517: return unicodify(str)
1.69 dwinter 518:
1.41 dwinter 519: def ECHOFormatListStr(self,list,search="\n",replace="<br>"):
520: """formatiert liste im str"""
1.58 dwinter 521: if list:
522: return re.sub(search,replace,list)
523: else:
524: return
1.42 dwinter 525:
1.41 dwinter 526: def ECHO_cacheManageForm(self):
1.58 dwinter 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()
1.41 dwinter 531:
532: def ECHO_cacheManage(self,cacheManagerName=None,deleteCache=None, activateCache=None,RESPONSE=None):
1.58 dwinter 533: """cachemanager"""
534: if cacheManagerName=="": chacheManagerName=None
535:
536: self.cacheManagerName=cacheManagerName
537: self.setCache(managerName=cacheManagerName)
538:
539: if deleteCache:
1.46 dwinter 540: try:
1.58 dwinter 541: self.deleteCache()
1.46 dwinter 542: except:
543: for roots in self.ZopeFind(self,obj_metatypes=['ECHO_root'],search_sub=1):
544: roots[1].deleteCache()
545:
1.41 dwinter 546:
1.58 dwinter 547: self.activateCache=activateCache
1.41 dwinter 548:
1.58 dwinter 549: if RESPONSE is not None:
550: RESPONSE.redirect('manage_main')
551:
1.41 dwinter 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:
1.58 dwinter 559: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_collection','VLP_resource'],search_sub=1)
1.41 dwinter 560:
561: for entry in entries:
562: entry[1].ZCacheable_setManagerId(managerName)
563:
564:
565: return "changed all CM in: "+self.title
566:
1.48 dwinter 567:
1.35 dwinter 568:
1.48 dwinter 569: displayableMetaTypes=displayTypes
570:
1.35 dwinter 571: def getImageViewers(self):
572: """images"""
573: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
574: return viewers
1.1 dwinter 575:
1.28 dwinter 576: def getR(self):
1.58 dwinter 577: """re"""
578: return self.REQUEST
1.28 dwinter 579:
1.1 dwinter 580: def __init__(self,id,title,pathToHierarchy):
581: """init"""
582: self.id=id
583: self.title=title
584: self.pathToHierarchy=pathToHierarchy
1.48 dwinter 585: self.displayedMetaTypes=displayTypes
586:
1.1 dwinter 587: manage_options = Folder.manage_options+(
588: {'label':'Main Config','action':'ECHO_navigationConfigForm'},
1.41 dwinter 589: {'label':'Cache','action':'ECHO_cacheManageForm'},
590:
1.1 dwinter 591: )
1.48 dwinter 592: displayedMetaTypes=displayTypes
593:
1.83 dwinter 594: def getStorageManagerURL(self):
595: """returns the URL to the storagemanager"""
596: return getattr(self,"storageManagerURL",STORAGEMANAGER_URL_DEFAULT)
1.1 dwinter 597: def ECHO_navigationConfigForm(self):
598: """configForm"""
1.48 dwinter 599: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_navigation.zpt')).__of__(self)
1.1 dwinter 600: return pt()
601:
1.85 ! dwinter 602: def ECHO_navigationConfig(self,title,pathToHierarchy,fullTextBasisUrl="",storageManagerURL="",displayedMetaTypes=displayTypes,RESPONSE=None):
1.1 dwinter 603: """config"""
604: self.title=title
605: self.pathToHierarchy=pathToHierarchy
1.48 dwinter 606: self.displayedMetaTypes=toList(displayedMetaTypes)[0:]
1.83 dwinter 607: self.storageManagerURL=storageManagerURL
1.85 ! dwinter 608: self.fullTextBasisUrl=fullTextBasisUrl
1.1 dwinter 609: if RESPONSE is not None:
610: RESPONSE.redirect('manage_main')
611:
612:
1.19 dwinter 613: def getColls(self,obj,depth,checkOnly="no"):
1.1 dwinter 614: nav={}
615: #print "HERE",obj.
1.18 dwinter 616: for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
617: x=x_objs[1]
1.22 dwinter 618: if checkOnly=="yes":
1.19 dwinter 619: x = checkOnlyOneInGroup(x)
1.18 dwinter 620: if depth>1:
621: nav[x.getId()]=(self.getColls(x,depth-1),x)
622: else:
623: nav[x.getId()]=(None,x)
1.1 dwinter 624: return nav
625:
1.19 dwinter 626: def createNavHash(self,depth,checkOnly="no"):
1.1 dwinter 627: """Auslesen des Hierarchiebuames"""
628: temp=self.pathToHierarchy[0:]
629: temp=re.sub("/",".",temp)
630: temp="self.aq_parent"+temp
1.40 dwinter 631:
1.1 dwinter 632:
633: objtemp=eval(temp)
634: nav={}
1.40 dwinter 635:
1.41 dwinter 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)]
1.1 dwinter 640:
1.41 dwinter 641: # if not generate new hash
642: obj=objtemp
1.79 dwinter 643:
1.37 dwinter 644: for keys in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
1.82 dwinter 645:
1.37 dwinter 646: x=keys[1]
1.41 dwinter 647: if depth>1:
648: nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
649: else:
650: nav[x.getId()]=(None,x)
1.37 dwinter 651:
1.41 dwinter 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)]={}
1.1 dwinter 660:
1.41 dwinter 661: for x in nav.keys():
662: self._v_hash[str(depth)][x]=nav[x]
1.40 dwinter 663:
1.1 dwinter 664: return nav
665:
1.32 dwinter 666: def barFromHash(self,hash,start=None,sortField=None,location=None):
1.1 dwinter 667: """Erzeuge Navigations Element"""
1.68 dwinter 668:
1.1 dwinter 669: listNav=[]
670: if not start:
671: temp=hash
1.5 dwinter 672: sortField="weight"
1.41 dwinter 673: else: # liste mit pfad zum hash
1.1 dwinter 674: temp=hash
1.7 dwinter 675: #print "HI",sortField
1.5 dwinter 676: if not sortField:
677: tempObj=self.pathToHierarchy[0:]
678: tempObj=re.sub("/",".",tempObj)
679: tempObj="self.aq_parent"+tempObj
1.58 dwinter 680: #print tempObj
1.5 dwinter 681: objtemp=eval(tempObj)
682:
683: obj=objtemp
684:
685: for x in start:
1.7 dwinter 686: #print "OBJ",start,obj,obj.getId(),x
1.5 dwinter 687:
688: obj=getattr(obj,x)
689:
690: if hasattr(obj,'sortfield'):
691: sortField=obj.sortfield
692: else:
693: sortField='weight'
1.7 dwinter 694: #print "START",start
1.1 dwinter 695: for x in start:
1.7 dwinter 696: #print "N2",x,temp[x]
697: try:
1.5 dwinter 698: temp=temp[x][0]
1.7 dwinter 699: except:
700: """nothing"""
701: return []
702: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
1.13 dwinter 703:
1.5 dwinter 704: for x in self.tempSorted(temp, field=sortField):
1.77 dwinter 705:
1.4 dwinter 706: if not temp[x][1].title == "":
1.35 dwinter 707:
708: if (temp[x][1].meta_type=="ECHO_sqlElement") or (temp[x][1].meta_type=="ECHO_ZCatalogElement"):
1.77 dwinter 709:
1.4 dwinter 710: for z in temp[x][1].getNavList():
1.47 dwinter 711: listNav.append((z[0],z[1],None,'',''))
1.37 dwinter 712:
1.4 dwinter 713: else:
1.27 dwinter 714: # add label falls existiert und nicht leer
1.7 dwinter 715: if hasattr(temp[x][1],'label'):
1.47 dwinter 716:
1.71 dwinter 717: if not temp[x][1].getLabel()=='':
1.47 dwinter 718: label=temp[x][1].getLabel()
1.7 dwinter 719: else:
1.71 dwinter 720: try:
721: label=temp[x][1].getTitle()
722: except:
1.79 dwinter 723: logger("ECHO_Nav",logging.ERROR,"%s has neither getLabel nor getTile implemented"%temp[x][1].getId())
1.71 dwinter 724: label=""
1.7 dwinter 725: else:
1.69 dwinter 726: label=temp[x][1].getTitle()
727:
1.63 dwinter 728:
1.51 dwinter 729: if location:
1.32 dwinter 730:
731: loc=getattr(temp[x][1],'location','top')
732: if (loc==location):
1.65 dwinter 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','')))
1.32 dwinter 736: else:
1.65 dwinter 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
1.1 dwinter 740: return listNav
741:
1.5 dwinter 742: def tempSorted(self,hash,field="weight"):
1.4 dwinter 743: ls=[]
1.13 dwinter 744:
1.4 dwinter 745: for x in hash.keys():
746: #print hash[x][1]
1.5 dwinter 747: if hasattr(hash[x][1],field):
1.52 dwinter 748: try:
749: weight=int(getattr(hash[x][1],field))
750: except:
751: weight=getattr(hash[x][1],field)
1.4 dwinter 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:
1.1 dwinter 765: def isSelectedPath(self,item):
766: """test is path is already selected"""
1.45 dwinter 767:
768: testStr=re.sub("/index_html",'',self.REQUEST.get('URL',''))
1.70 dwinter 769:
770: if len(item)<2:
771: return 0
1.84 casties 772: #falls exakte Uebereinstimmung dann immer 1
1.70 dwinter 773: if (testStr==item[1]) and (self.REQUEST.get('QUERY_STRING','')==''):
1.45 dwinter 774:
775: return 1
776:
777: found=re.search("\?(.*)",item[1])
1.43 dwinter 778:
1.1 dwinter 779: if found:
780: temp=re.sub(" ","%20",found.group(0))
1.45 dwinter 781:
1.1 dwinter 782: #print temp+"::"+self.REQUEST['QUERY_STRING']
783: if ("?"+self.REQUEST['QUERY_STRING'])==temp:
1.43 dwinter 784: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
785:
786: return 2
787: else:
788: return 1
789:
1.44 dwinter 790: if (getattr(item[2],'meta_type','')=="ECHO_pageTemplate") and (re.search(item[1],self.REQUEST['URL'])):
1.43 dwinter 791: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
792:
793: return 2
794: else:
1.1 dwinter 795: return 1
796:
1.26 dwinter 797: if re.search(item[1]+"/",self.REQUEST['URL']):
1.43 dwinter 798: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
799:
800: return 2
801: else:
802: return 1
1.1 dwinter 803: else:
804: return 0
1.57 casties 805:
806:
807: def getPathStyle(self, item, style=""):
1.58 dwinter 808: """returns a string with the given style + 'sel' if the path is already selected."""
1.43 dwinter 809:
1.58 dwinter 810: if self.isSelectedPath(item):
811: return style + 'sel'
812: else:
813: return style
1.1 dwinter 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:
1.5 dwinter 839: for key in self.tempSorted(temp):
1.1 dwinter 840:
841: description=temp[x][1].title
1.65 dwinter 842:
843:
844: url=createPath(self,self.absolute_url(),temp[key][1].absolute_url(relative=1))
1.2 dwinter 845:
1.1 dwinter 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=""
1.13 dwinter 859:
1.1 dwinter 860: try:
861: keys=self.buttonsFromHash(self.createNavHash(0))
862: except:
863: keys=""
864:
865: return keys
866:
1.32 dwinter 867: def mainNavElements(self,location=None):
1.1 dwinter 868: """print main navigation bar"""
869: keys=""
1.12 dwinter 870: #print "NAVELEMENT",self.getId()
1.5 dwinter 871: #try:
1.32 dwinter 872:
873: keys=self.barFromHash(self.createNavHash(0),location=location)
1.12 dwinter 874:
1.5 dwinter 875: #except:
876: # keys=""
1.71 dwinter 877:
1.1 dwinter 878: return keys
1.12 dwinter 879:
880: def numberOfMainNavElements(self):
1.58 dwinter 881: """number of main elements"""
1.12 dwinter 882:
1.58 dwinter 883: return len(self.barFromHash(self.createNavHash(0)))
1.12 dwinter 884:
1.29 dwinter 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:
1.78 dwinter 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:
1.1 dwinter 911: def secondNavElements(self):
1.57 casties 912: """Zweite Ordnung Navigationselemente"""
1.1 dwinter 913:
1.22 dwinter 914: hash=self.createNavHash(2,checkOnly="no")
1.82 dwinter 915:
1.1 dwinter 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:
1.58 dwinter 923: #print "AU",self.absolute_url(),splitted
924: #start=[splitted[2]] #orig
1.29 dwinter 925: startNr= self.startOfHierarchy(splitted)
926:
1.58 dwinter 927: start=[splitted[startNr]]
928:
1.29 dwinter 929: #print start
1.68 dwinter 930:
1.25 dwinter 931: keys=self.barFromHash(hash,start=start)
1.7 dwinter 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:
1.28 dwinter 953: #start=splitted[2:order+1] #orig
1.29 dwinter 954: startNr= self.startOfHierarchy(splitted)
1.30 dwinter 955: #print startNr
1.58 dwinter 956: start=splitted[startNr:order+startNr-1]
1.1 dwinter 957: #print start
1.5 dwinter 958:
1.1 dwinter 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:
1.6 dwinter 990: def manage_addECHO_navigationForm(self):
1.1 dwinter 991: """Form for adding"""
1.48 dwinter 992: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_navigation.zpt')).__of__(self)
1.1 dwinter 993: return pt()
994:
1.6 dwinter 995: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
1.1 dwinter 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:
1.3 dwinter 1005:
1006:
1.65 dwinter 1007: def createPath(self,url1,url2):
1008: #bugfix in absolute_url, ploetzlich erschein in absolute_url der physikalische pfad.
1009:
1.66 dwinter 1010: if self.REQUEST.has_key('VirtualRootPhysicalPath'):
1011: vp="/".join(self.REQUEST['VirtualRootPhysicalPath'])
1.76 dwinter 1012: if (len(vp)>0):
1013: if vp[0]=="/":
1014: vp=vp[1:]
1.66 dwinter 1015:
1.76 dwinter 1016: url2=url2.replace(vp+"/",'')
1.68 dwinter 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,"/")
1.66 dwinter 1025:
1.65 dwinter 1026: return url1+"/"+url2
1.4 dwinter 1027:
1028: def sortWeight(x,y):
1029: #print x[1],y[1]
1030: return cmp(x[1],y[1])
1.1 dwinter 1031:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>