Annotation of ECHO_content/ECHO_Nav.py, revision 1.81
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.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"""
1.81 ! casties 505: return unicodify(str)
1.69 dwinter 506:
1.41 dwinter 507: def ECHOFormatListStr(self,list,search="\n",replace="<br>"):
508: """formatiert liste im str"""
1.58 dwinter 509: if list:
510: return re.sub(search,replace,list)
511: else:
512: return
1.42 dwinter 513:
1.41 dwinter 514: def ECHO_cacheManageForm(self):
1.58 dwinter 515: """change form"""
516: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ECHO_cacheManageForm')).__of__(self)
517: pt.content_type="text/html"
518: return pt()
1.41 dwinter 519:
520: def ECHO_cacheManage(self,cacheManagerName=None,deleteCache=None, activateCache=None,RESPONSE=None):
1.58 dwinter 521: """cachemanager"""
522: if cacheManagerName=="": chacheManagerName=None
523:
524: self.cacheManagerName=cacheManagerName
525: self.setCache(managerName=cacheManagerName)
526:
527: if deleteCache:
1.46 dwinter 528: try:
1.58 dwinter 529: self.deleteCache()
1.46 dwinter 530: except:
531: for roots in self.ZopeFind(self,obj_metatypes=['ECHO_root'],search_sub=1):
532: roots[1].deleteCache()
533:
1.41 dwinter 534:
1.58 dwinter 535: self.activateCache=activateCache
1.41 dwinter 536:
1.58 dwinter 537: if RESPONSE is not None:
538: RESPONSE.redirect('manage_main')
539:
1.41 dwinter 540: def setCache(self,obj=None,RESPONSE=None,managerName='CacheManager'):
541: """setze alle collections auf cache = CacheManager"""
542:
543:
544: if not obj:
545: obj = self
546:
1.58 dwinter 547: entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_collection','VLP_resource'],search_sub=1)
1.41 dwinter 548:
549: for entry in entries:
550: entry[1].ZCacheable_setManagerId(managerName)
551:
552:
553: return "changed all CM in: "+self.title
554:
1.48 dwinter 555:
1.35 dwinter 556:
1.48 dwinter 557: displayableMetaTypes=displayTypes
558:
1.35 dwinter 559: def getImageViewers(self):
560: """images"""
561: viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
562: return viewers
1.1 dwinter 563:
1.28 dwinter 564: def getR(self):
1.58 dwinter 565: """re"""
566: return self.REQUEST
1.28 dwinter 567:
1.1 dwinter 568: def __init__(self,id,title,pathToHierarchy):
569: """init"""
570: self.id=id
571: self.title=title
572: self.pathToHierarchy=pathToHierarchy
1.48 dwinter 573: self.displayedMetaTypes=displayTypes
574:
1.1 dwinter 575: manage_options = Folder.manage_options+(
576: {'label':'Main Config','action':'ECHO_navigationConfigForm'},
1.41 dwinter 577: {'label':'Cache','action':'ECHO_cacheManageForm'},
578:
1.1 dwinter 579: )
1.48 dwinter 580: displayedMetaTypes=displayTypes
581:
1.1 dwinter 582: def ECHO_navigationConfigForm(self):
583: """configForm"""
1.48 dwinter 584: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_navigation.zpt')).__of__(self)
1.1 dwinter 585: return pt()
586:
1.48 dwinter 587: def ECHO_navigationConfig(self,title,pathToHierarchy,displayedMetaTypes=displayTypes,RESPONSE=None):
1.1 dwinter 588: """config"""
589: self.title=title
590: self.pathToHierarchy=pathToHierarchy
1.48 dwinter 591: self.displayedMetaTypes=toList(displayedMetaTypes)[0:]
592:
1.1 dwinter 593:
594: if RESPONSE is not None:
595: RESPONSE.redirect('manage_main')
596:
597:
1.19 dwinter 598: def getColls(self,obj,depth,checkOnly="no"):
1.1 dwinter 599: nav={}
600: #print "HERE",obj.
1.18 dwinter 601: for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
602: x=x_objs[1]
1.22 dwinter 603: if checkOnly=="yes":
1.19 dwinter 604: x = checkOnlyOneInGroup(x)
1.18 dwinter 605: if depth>1:
606: nav[x.getId()]=(self.getColls(x,depth-1),x)
607: else:
608: nav[x.getId()]=(None,x)
1.1 dwinter 609: return nav
610:
1.19 dwinter 611: def createNavHash(self,depth,checkOnly="no"):
1.1 dwinter 612: """Auslesen des Hierarchiebuames"""
613: temp=self.pathToHierarchy[0:]
614: temp=re.sub("/",".",temp)
615: temp="self.aq_parent"+temp
1.40 dwinter 616:
1.1 dwinter 617:
618: objtemp=eval(temp)
619: nav={}
1.40 dwinter 620:
1.41 dwinter 621: #check if cash is enabled and if already exists and if not empty
622: if getattr(self,'_v_hash',None) and getattr(self,'activateCache',None) and self._v_hash.get(str(depth),None):
623:
624: return self._v_hash[str(depth)]
1.1 dwinter 625:
1.41 dwinter 626: # if not generate new hash
627: obj=objtemp
1.79 dwinter 628:
1.37 dwinter 629: for keys in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
1.80 dwinter 630:
1.37 dwinter 631: x=keys[1]
1.41 dwinter 632: if depth>1:
633: nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
634: else:
635: nav[x.getId()]=(None,x)
1.37 dwinter 636:
1.41 dwinter 637: #store in cache if activated
638: if getattr(self,'activateCache',None):
639:
640: try:
641: self._v_hash[str(depth)]={}
642: except:
643: self._v_hash={}
644: self._v_hash[str(depth)]={}
1.1 dwinter 645:
1.41 dwinter 646: for x in nav.keys():
647: self._v_hash[str(depth)][x]=nav[x]
1.40 dwinter 648:
1.1 dwinter 649: return nav
650:
1.32 dwinter 651: def barFromHash(self,hash,start=None,sortField=None,location=None):
1.1 dwinter 652: """Erzeuge Navigations Element"""
1.68 dwinter 653:
1.1 dwinter 654: listNav=[]
655: if not start:
656: temp=hash
1.5 dwinter 657: sortField="weight"
1.41 dwinter 658: else: # liste mit pfad zum hash
1.1 dwinter 659: temp=hash
1.7 dwinter 660: #print "HI",sortField
1.5 dwinter 661: if not sortField:
662: tempObj=self.pathToHierarchy[0:]
663: tempObj=re.sub("/",".",tempObj)
664: tempObj="self.aq_parent"+tempObj
1.58 dwinter 665: #print tempObj
1.5 dwinter 666: objtemp=eval(tempObj)
667:
668: obj=objtemp
669:
670: for x in start:
1.7 dwinter 671: #print "OBJ",start,obj,obj.getId(),x
1.5 dwinter 672:
673: obj=getattr(obj,x)
674:
675: if hasattr(obj,'sortfield'):
676: sortField=obj.sortfield
677: else:
678: sortField='weight'
1.7 dwinter 679: #print "START",start
1.1 dwinter 680: for x in start:
1.7 dwinter 681: #print "N2",x,temp[x]
682: try:
1.5 dwinter 683: temp=temp[x][0]
1.7 dwinter 684: except:
685: """nothing"""
686: return []
687: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
1.13 dwinter 688:
1.5 dwinter 689: for x in self.tempSorted(temp, field=sortField):
1.77 dwinter 690:
1.4 dwinter 691: if not temp[x][1].title == "":
1.35 dwinter 692:
693: if (temp[x][1].meta_type=="ECHO_sqlElement") or (temp[x][1].meta_type=="ECHO_ZCatalogElement"):
1.77 dwinter 694:
1.4 dwinter 695: for z in temp[x][1].getNavList():
1.47 dwinter 696: listNav.append((z[0],z[1],None,'',''))
1.37 dwinter 697:
1.4 dwinter 698: else:
1.27 dwinter 699: # add label falls existiert und nicht leer
1.7 dwinter 700: if hasattr(temp[x][1],'label'):
1.47 dwinter 701:
1.71 dwinter 702: if not temp[x][1].getLabel()=='':
1.47 dwinter 703: label=temp[x][1].getLabel()
1.7 dwinter 704: else:
1.71 dwinter 705: try:
706: label=temp[x][1].getTitle()
707: except:
1.79 dwinter 708: logger("ECHO_Nav",logging.ERROR,"%s has neither getLabel nor getTile implemented"%temp[x][1].getId())
1.71 dwinter 709: label=""
1.7 dwinter 710: else:
1.69 dwinter 711: label=temp[x][1].getTitle()
712:
1.63 dwinter 713:
1.51 dwinter 714: if location:
1.32 dwinter 715:
716: loc=getattr(temp[x][1],'location','top')
717: if (loc==location):
1.65 dwinter 718:
719:
720: 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 721: else:
1.65 dwinter 722:
723: 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','')))
724: #print self.REQUEST
1.1 dwinter 725: return listNav
726:
1.5 dwinter 727: def tempSorted(self,hash,field="weight"):
1.4 dwinter 728: ls=[]
1.13 dwinter 729:
1.4 dwinter 730: for x in hash.keys():
731: #print hash[x][1]
1.5 dwinter 732: if hasattr(hash[x][1],field):
1.52 dwinter 733: try:
734: weight=int(getattr(hash[x][1],field))
735: except:
736: weight=getattr(hash[x][1],field)
1.4 dwinter 737: #print weight
738: else:
739: weight=0
740:
741: ls.append((x,weight))
742:
743: ls.sort(sortWeight)
744:
745: return [x[0] for x in ls]
746:
747:
748:
749:
1.1 dwinter 750: def isSelectedPath(self,item):
751: """test is path is already selected"""
1.45 dwinter 752:
753: testStr=re.sub("/index_html",'',self.REQUEST.get('URL',''))
1.70 dwinter 754:
755: if len(item)<2:
756: return 0
1.45 dwinter 757: #falls exakte Übereinstimmung dann immer 1
1.70 dwinter 758: if (testStr==item[1]) and (self.REQUEST.get('QUERY_STRING','')==''):
1.45 dwinter 759:
760: return 1
761:
762: found=re.search("\?(.*)",item[1])
1.43 dwinter 763:
1.1 dwinter 764: if found:
765: temp=re.sub(" ","%20",found.group(0))
1.45 dwinter 766:
1.1 dwinter 767: #print temp+"::"+self.REQUEST['QUERY_STRING']
768: if ("?"+self.REQUEST['QUERY_STRING'])==temp:
1.43 dwinter 769: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
770:
771: return 2
772: else:
773: return 1
774:
1.44 dwinter 775: if (getattr(item[2],'meta_type','')=="ECHO_pageTemplate") and (re.search(item[1],self.REQUEST['URL'])):
1.43 dwinter 776: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
777:
778: return 2
779: else:
1.1 dwinter 780: return 1
781:
1.26 dwinter 782: if re.search(item[1]+"/",self.REQUEST['URL']):
1.43 dwinter 783: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
784:
785: return 2
786: else:
787: return 1
1.1 dwinter 788: else:
789: return 0
1.57 casties 790:
791:
792: def getPathStyle(self, item, style=""):
1.58 dwinter 793: """returns a string with the given style + 'sel' if the path is already selected."""
1.43 dwinter 794:
1.58 dwinter 795: if self.isSelectedPath(item):
796: return style + 'sel'
797: else:
798: return style
1.1 dwinter 799:
800:
801: def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
802:
803: """Generate Buttons"""
804: if orientation=="horizontal":
805: html="<table><tr>"
806: startTag="<td>"
807: endTag="</td>"
808: endHtml="</tr></table>"
809:
810: else:
811: html="<table>"
812: startTag="<tr><td>"
813: endTag="</td></tr>"
814: endHtml="</table>"
815:
816: if not start:
817: temp=hash
818: else:
819: temp=hash
820: for x in start:
821: temp=temp[x][0]
822: #print temp
823:
1.5 dwinter 824: for key in self.tempSorted(temp):
1.1 dwinter 825:
826: description=temp[x][1].title
1.65 dwinter 827:
828:
829: url=createPath(self,self.absolute_url(),temp[key][1].absolute_url(relative=1))
1.2 dwinter 830:
1.1 dwinter 831: if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
832: html=html+startTag+"[%s]" % description+endTag
833: else:
834: html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
835:
836:
837: html=html+endHtml
838:
839: return html
840:
841: def mainNavBar(self):
842: """print main navigation bar"""
843: keys=""
1.13 dwinter 844:
1.1 dwinter 845: try:
846: keys=self.buttonsFromHash(self.createNavHash(0))
847: except:
848: keys=""
849:
850: return keys
851:
1.32 dwinter 852: def mainNavElements(self,location=None):
1.1 dwinter 853: """print main navigation bar"""
854: keys=""
1.12 dwinter 855: #print "NAVELEMENT",self.getId()
1.5 dwinter 856: #try:
1.32 dwinter 857:
858: keys=self.barFromHash(self.createNavHash(0),location=location)
1.12 dwinter 859:
1.5 dwinter 860: #except:
861: # keys=""
1.71 dwinter 862:
1.1 dwinter 863: return keys
1.12 dwinter 864:
865: def numberOfMainNavElements(self):
1.58 dwinter 866: """number of main elements"""
1.12 dwinter 867:
1.58 dwinter 868: return len(self.barFromHash(self.createNavHash(0)))
1.12 dwinter 869:
1.29 dwinter 870: def startOfHierarchy(self,list):
871: splitted=self.pathToHierarchy.split("/")
872: last=splitted[len(splitted)-1]
873: #print last,list
874: try:
875: nr=list.index(last)
876: except:
877: nr=0
878: return nr+1
879:
1.78 dwinter 880: def subNavStatic(self,obj):
881: """subnav" von self"""
882: def sortWeight(x,y):
883: x1=int(getattr(x[1],'weight','0'))
884: y1=int(getattr(y[1],'weight','0'))
885: return cmp(x1,y1)
886: print "obj",obj
887: subs=self.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes)
888: subret=[]
889:
890: for x in subs:
891: if not(x[1].title==""):
892: subret.append(x)
893: subret.sort(sortWeight)
894: return subret
895:
1.1 dwinter 896: def secondNavElements(self):
1.57 casties 897: """Zweite Ordnung Navigationselemente"""
1.1 dwinter 898:
1.22 dwinter 899: hash=self.createNavHash(2,checkOnly="no")
1.80 dwinter 900:
1.1 dwinter 901: actual_url=self.REQUEST['URL']
902:
903: ult_temp=re.sub(self.absolute_url(),"",actual_url)
904: #print ult_temp
905:
906: splitted=ult_temp.split("/")
907:
1.58 dwinter 908: #print "AU",self.absolute_url(),splitted
909: #start=[splitted[2]] #orig
1.29 dwinter 910: startNr= self.startOfHierarchy(splitted)
911:
1.58 dwinter 912: start=[splitted[startNr]]
913:
1.29 dwinter 914: #print start
1.68 dwinter 915:
1.25 dwinter 916: keys=self.barFromHash(hash,start=start)
1.7 dwinter 917:
918:
919: return keys
920:
921: def navElements(self,order):
922: """n-te Ordnung"""
923:
924: hash=self.createNavHash(order)
925: actual_url=self.REQUEST['URL']
926:
927: ult_temp=re.sub(self.absolute_url(),"",actual_url)
928: #print ult_temp
929:
930: splitted=ult_temp.split("/")
931:
932:
933: ## if splitted[len(splitted)-1]=="index_html":
934: ## start=[splitted[len(splitted)-2]]
935: ## else:
936: ## start=[splitted[len(splitted)-1]]
937:
1.28 dwinter 938: #start=splitted[2:order+1] #orig
1.29 dwinter 939: startNr= self.startOfHierarchy(splitted)
1.30 dwinter 940: #print startNr
1.58 dwinter 941: start=splitted[startNr:order+startNr-1]
1.1 dwinter 942: #print start
1.5 dwinter 943:
1.1 dwinter 944: keys=self.barFromHash(hash,start=start)
945:
946:
947: return keys
948:
949:
950: def secondNavBar(self):
951: """Zweite Ordnung"""
952:
953: hash=self.createNavHash(2)
954: actual_url=self.REQUEST['URL']
955:
956: ult_temp=re.sub(self.absolute_url(),"",actual_url)
957: #print ult_temp
958:
959: splitted=ult_temp.split("/")
960:
961:
962: ## if splitted[len(splitted)-1]=="index_html":
963: ## start=[splitted[len(splitted)-2]]
964: ## else:
965: ## start=[splitted[len(splitted)-1]]
966:
967: start=[splitted[2]]
968: #print start
969:
970: keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
971:
972:
973: return keys
974:
1.6 dwinter 975: def manage_addECHO_navigationForm(self):
1.1 dwinter 976: """Form for adding"""
1.48 dwinter 977: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_navigation.zpt')).__of__(self)
1.1 dwinter 978: return pt()
979:
1.6 dwinter 980: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
1.1 dwinter 981: """Add an ECHO_root"""
982: self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
983:
984: if RESPONSE is not None:
985: RESPONSE.redirect('manage_main')
986:
987:
988: #helpers
989:
1.3 dwinter 990:
991:
1.65 dwinter 992: def createPath(self,url1,url2):
993: #bugfix in absolute_url, ploetzlich erschein in absolute_url der physikalische pfad.
994:
1.66 dwinter 995: if self.REQUEST.has_key('VirtualRootPhysicalPath'):
996: vp="/".join(self.REQUEST['VirtualRootPhysicalPath'])
1.76 dwinter 997: if (len(vp)>0):
998: if vp[0]=="/":
999: vp=vp[1:]
1.66 dwinter 1000:
1.76 dwinter 1001: url2=url2.replace(vp+"/",'')
1.68 dwinter 1002: else:
1003: temp1=url1.split("/")
1004: temp2=url2.split("/")
1005: for test in temp1:
1006: if temp2[0]==test:
1007: del temp2[0]
1008:
1009: url2= string.join(temp2,"/")
1.66 dwinter 1010:
1.65 dwinter 1011: return url1+"/"+url2
1.4 dwinter 1012:
1013: def sortWeight(x,y):
1014: #print x[1],y[1]
1015: return cmp(x[1],y[1])
1.1 dwinter 1016:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>