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