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