Annotation of ECHO_content/ECHO_Nav.py, revision 1.84.2.1
1.60 dwinter 1: # Objekte zur Erzeugung von Navigationselement
1.54 dwinter 2: from AccessControl import ClassSecurityInfo
1.11 dwinter 3: from Globals import DTMLFile
4: from OFS.Image import Image,cookId
1.1 dwinter 5: from OFS.Folder import Folder
6: from OFS.SimpleItem import SimpleItem
7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8: from Products.PageTemplates.PageTemplate import PageTemplate
9: import re
10: import string
11: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
12: import os.path
13: from Globals import package_home
14: import urllib
1.48 dwinter 15: from ECHO_helpers import *
1.59 dwinter 16: from ECHO_collection import content_html
1.48 dwinter 17: from types import *
1.35 dwinter 18:
19:
20: from Globals import DTMLFile
21: from OFS.Image import Image,cookId
22: from OFS.Folder import Folder
23: from OFS.SimpleItem import SimpleItem
24: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
25: from Products.PageTemplates.PageTemplate import PageTemplate
26: import re
27: import string
28: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
29: import os.path
1.55 dwinter 30:
1.35 dwinter 31: import urllib
1.81 casties 32: from ECHO_helpers import displayTypes,checkOnlyOneInGroup,unicodify
1.35 dwinter 33: from ECHO_collection import content_html
1.79 dwinter 34: import logging
35:
36: #def ersetzt logging
37: def logger(txt,method,txt2):
38: """logging"""
39: logging.info(txt+ txt2)
40:
1.83 dwinter 41: STORAGEMANAGER_URL_DEFAULT = "http://storage-web.mpiwg-berlin.mpg.de/storage/storeOnline?path="
1.49 dwinter 42: try:
43: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
44: except:
1.79 dwinter 45: logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
1.35 dwinter 46:
47:
48:
49: class ECHO_ZCatalogElement(SimpleItem):
50: """Erzeuge navigation aus ZCatalog-abfrage"""
51: meta_type="ECHO_ZCatalogElement"
52: baseUrl=""
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.83 dwinter 582: def getStorageManagerURL(self):
583: """returns the URL to the storagemanager"""
584: return getattr(self,"storageManagerURL",STORAGEMANAGER_URL_DEFAULT)
1.1 dwinter 585: def ECHO_navigationConfigForm(self):
586: """configForm"""
1.48 dwinter 587: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_navigation.zpt')).__of__(self)
1.1 dwinter 588: return pt()
589:
1.83 dwinter 590: def ECHO_navigationConfig(self,title,pathToHierarchy,storageManagerURL="",displayedMetaTypes=displayTypes,RESPONSE=None):
1.1 dwinter 591: """config"""
592: self.title=title
593: self.pathToHierarchy=pathToHierarchy
1.48 dwinter 594: self.displayedMetaTypes=toList(displayedMetaTypes)[0:]
1.83 dwinter 595: self.storageManagerURL=storageManagerURL
1.1 dwinter 596:
597: if RESPONSE is not None:
598: RESPONSE.redirect('manage_main')
599:
600:
1.19 dwinter 601: def getColls(self,obj,depth,checkOnly="no"):
1.1 dwinter 602: nav={}
603: #print "HERE",obj.
1.18 dwinter 604: for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
605: x=x_objs[1]
1.22 dwinter 606: if checkOnly=="yes":
1.19 dwinter 607: x = checkOnlyOneInGroup(x)
1.18 dwinter 608: if depth>1:
609: nav[x.getId()]=(self.getColls(x,depth-1),x)
610: else:
611: nav[x.getId()]=(None,x)
1.1 dwinter 612: return nav
613:
1.19 dwinter 614: def createNavHash(self,depth,checkOnly="no"):
1.1 dwinter 615: """Auslesen des Hierarchiebuames"""
616: temp=self.pathToHierarchy[0:]
617: temp=re.sub("/",".",temp)
618: temp="self.aq_parent"+temp
1.40 dwinter 619:
1.1 dwinter 620:
621: objtemp=eval(temp)
622: nav={}
1.40 dwinter 623:
1.41 dwinter 624: #check if cash is enabled and if already exists and if not empty
625: if getattr(self,'_v_hash',None) and getattr(self,'activateCache',None) and self._v_hash.get(str(depth),None):
626:
627: return self._v_hash[str(depth)]
1.1 dwinter 628:
1.41 dwinter 629: # if not generate new hash
630: obj=objtemp
1.79 dwinter 631:
1.37 dwinter 632: for keys in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
1.82 dwinter 633:
1.37 dwinter 634: x=keys[1]
1.41 dwinter 635: if depth>1:
636: nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
637: else:
638: nav[x.getId()]=(None,x)
1.37 dwinter 639:
1.41 dwinter 640: #store in cache if activated
641: if getattr(self,'activateCache',None):
642:
643: try:
644: self._v_hash[str(depth)]={}
645: except:
646: self._v_hash={}
647: self._v_hash[str(depth)]={}
1.1 dwinter 648:
1.41 dwinter 649: for x in nav.keys():
650: self._v_hash[str(depth)][x]=nav[x]
1.40 dwinter 651:
1.1 dwinter 652: return nav
653:
1.32 dwinter 654: def barFromHash(self,hash,start=None,sortField=None,location=None):
1.1 dwinter 655: """Erzeuge Navigations Element"""
1.68 dwinter 656:
1.1 dwinter 657: listNav=[]
658: if not start:
659: temp=hash
1.5 dwinter 660: sortField="weight"
1.41 dwinter 661: else: # liste mit pfad zum hash
1.1 dwinter 662: temp=hash
1.7 dwinter 663: #print "HI",sortField
1.5 dwinter 664: if not sortField:
665: tempObj=self.pathToHierarchy[0:]
666: tempObj=re.sub("/",".",tempObj)
667: tempObj="self.aq_parent"+tempObj
1.58 dwinter 668: #print tempObj
1.5 dwinter 669: objtemp=eval(tempObj)
670:
671: obj=objtemp
672:
673: for x in start:
1.7 dwinter 674: #print "OBJ",start,obj,obj.getId(),x
1.5 dwinter 675:
676: obj=getattr(obj,x)
677:
678: if hasattr(obj,'sortfield'):
679: sortField=obj.sortfield
680: else:
681: sortField='weight'
1.7 dwinter 682: #print "START",start
1.1 dwinter 683: for x in start:
1.7 dwinter 684: #print "N2",x,temp[x]
685: try:
1.5 dwinter 686: temp=temp[x][0]
1.7 dwinter 687: except:
688: """nothing"""
689: return []
690: #print "TEMP",temp,self.tempSorted(temp, field=sortField)
1.13 dwinter 691:
1.5 dwinter 692: for x in self.tempSorted(temp, field=sortField):
1.77 dwinter 693:
1.4 dwinter 694: if not temp[x][1].title == "":
1.35 dwinter 695:
696: if (temp[x][1].meta_type=="ECHO_sqlElement") or (temp[x][1].meta_type=="ECHO_ZCatalogElement"):
1.77 dwinter 697:
1.4 dwinter 698: for z in temp[x][1].getNavList():
1.47 dwinter 699: listNav.append((z[0],z[1],None,'',''))
1.37 dwinter 700:
1.4 dwinter 701: else:
1.27 dwinter 702: # add label falls existiert und nicht leer
1.7 dwinter 703: if hasattr(temp[x][1],'label'):
1.47 dwinter 704:
1.71 dwinter 705: if not temp[x][1].getLabel()=='':
1.47 dwinter 706: label=temp[x][1].getLabel()
1.7 dwinter 707: else:
1.71 dwinter 708: try:
709: label=temp[x][1].getTitle()
710: except:
1.79 dwinter 711: logger("ECHO_Nav",logging.ERROR,"%s has neither getLabel nor getTile implemented"%temp[x][1].getId())
1.71 dwinter 712: label=""
1.7 dwinter 713: else:
1.69 dwinter 714: label=temp[x][1].getTitle()
715:
1.63 dwinter 716:
1.51 dwinter 717: if location:
1.32 dwinter 718:
719: loc=getattr(temp[x][1],'location','top')
720: if (loc==location):
1.65 dwinter 721:
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','')))
1.32 dwinter 724: else:
1.65 dwinter 725:
726: 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','')))
727: #print self.REQUEST
1.1 dwinter 728: return listNav
729:
1.5 dwinter 730: def tempSorted(self,hash,field="weight"):
1.4 dwinter 731: ls=[]
1.13 dwinter 732:
1.4 dwinter 733: for x in hash.keys():
734: #print hash[x][1]
1.5 dwinter 735: if hasattr(hash[x][1],field):
1.52 dwinter 736: try:
737: weight=int(getattr(hash[x][1],field))
738: except:
739: weight=getattr(hash[x][1],field)
1.4 dwinter 740: #print weight
741: else:
742: weight=0
743:
744: ls.append((x,weight))
745:
746: ls.sort(sortWeight)
747:
748: return [x[0] for x in ls]
749:
750:
751:
752:
1.1 dwinter 753: def isSelectedPath(self,item):
754: """test is path is already selected"""
1.45 dwinter 755:
756: testStr=re.sub("/index_html",'',self.REQUEST.get('URL',''))
1.70 dwinter 757:
758: if len(item)<2:
759: return 0
1.84 casties 760: #falls exakte Uebereinstimmung dann immer 1
1.70 dwinter 761: if (testStr==item[1]) and (self.REQUEST.get('QUERY_STRING','')==''):
1.45 dwinter 762:
763: return 1
764:
765: found=re.search("\?(.*)",item[1])
1.43 dwinter 766:
1.1 dwinter 767: if found:
768: temp=re.sub(" ","%20",found.group(0))
1.45 dwinter 769:
1.1 dwinter 770: #print temp+"::"+self.REQUEST['QUERY_STRING']
771: if ("?"+self.REQUEST['QUERY_STRING'])==temp:
1.43 dwinter 772: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
773:
774: return 2
775: else:
776: return 1
777:
1.44 dwinter 778: if (getattr(item[2],'meta_type','')=="ECHO_pageTemplate") and (re.search(item[1],self.REQUEST['URL'])):
1.43 dwinter 779: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
780:
781: return 2
782: else:
1.1 dwinter 783: return 1
784:
1.26 dwinter 785: if re.search(item[1]+"/",self.REQUEST['URL']):
1.43 dwinter 786: if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
787:
788: return 2
789: else:
790: return 1
1.1 dwinter 791: else:
792: return 0
1.57 casties 793:
794:
795: def getPathStyle(self, item, style=""):
1.58 dwinter 796: """returns a string with the given style + 'sel' if the path is already selected."""
1.43 dwinter 797:
1.58 dwinter 798: if self.isSelectedPath(item):
799: return style + 'sel'
800: else:
801: return style
1.1 dwinter 802:
1.84.2.1! casties 803: def getHierCrumbs(self):
! 804: """returns a list of hierarchical breadcrumbs from self to the ECHO_root"""
! 805: # crumb for this object
! 806: crumb = {'obj': self,
! 807: 'url': self.absolute_url(),
! 808: 'label': self.get('label','Home')}
! 809: crumbs = [crumb]
! 810: return crumbs
! 811:
1.1 dwinter 812: def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
813:
814: """Generate Buttons"""
815: if orientation=="horizontal":
816: html="<table><tr>"
817: startTag="<td>"
818: endTag="</td>"
819: endHtml="</tr></table>"
820:
821: else:
822: html="<table>"
823: startTag="<tr><td>"
824: endTag="</td></tr>"
825: endHtml="</table>"
826:
827: if not start:
828: temp=hash
829: else:
830: temp=hash
831: for x in start:
832: temp=temp[x][0]
833: #print temp
834:
1.5 dwinter 835: for key in self.tempSorted(temp):
1.1 dwinter 836:
837: description=temp[x][1].title
1.65 dwinter 838:
839:
840: url=createPath(self,self.absolute_url(),temp[key][1].absolute_url(relative=1))
1.2 dwinter 841:
1.1 dwinter 842: if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
843: html=html+startTag+"[%s]" % description+endTag
844: else:
845: html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
846:
847:
848: html=html+endHtml
849:
850: return html
851:
852: def mainNavBar(self):
853: """print main navigation bar"""
854: keys=""
1.13 dwinter 855:
1.1 dwinter 856: try:
857: keys=self.buttonsFromHash(self.createNavHash(0))
858: except:
859: keys=""
860:
861: return keys
862:
1.32 dwinter 863: def mainNavElements(self,location=None):
1.1 dwinter 864: """print main navigation bar"""
865: keys=""
1.12 dwinter 866: #print "NAVELEMENT",self.getId()
1.5 dwinter 867: #try:
1.32 dwinter 868:
869: keys=self.barFromHash(self.createNavHash(0),location=location)
1.12 dwinter 870:
1.5 dwinter 871: #except:
872: # keys=""
1.71 dwinter 873:
1.1 dwinter 874: return keys
1.12 dwinter 875:
876: def numberOfMainNavElements(self):
1.58 dwinter 877: """number of main elements"""
1.12 dwinter 878:
1.58 dwinter 879: return len(self.barFromHash(self.createNavHash(0)))
1.12 dwinter 880:
1.29 dwinter 881: def startOfHierarchy(self,list):
882: splitted=self.pathToHierarchy.split("/")
883: last=splitted[len(splitted)-1]
884: #print last,list
885: try:
886: nr=list.index(last)
887: except:
888: nr=0
889: return nr+1
890:
1.78 dwinter 891: def subNavStatic(self,obj):
892: """subnav" von self"""
893: def sortWeight(x,y):
894: x1=int(getattr(x[1],'weight','0'))
895: y1=int(getattr(y[1],'weight','0'))
896: return cmp(x1,y1)
897: print "obj",obj
898: subs=self.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes)
899: subret=[]
900:
901: for x in subs:
902: if not(x[1].title==""):
903: subret.append(x)
904: subret.sort(sortWeight)
905: return subret
906:
1.1 dwinter 907: def secondNavElements(self):
1.57 casties 908: """Zweite Ordnung Navigationselemente"""
1.1 dwinter 909:
1.22 dwinter 910: hash=self.createNavHash(2,checkOnly="no")
1.82 dwinter 911:
1.1 dwinter 912: actual_url=self.REQUEST['URL']
913:
914: ult_temp=re.sub(self.absolute_url(),"",actual_url)
915: #print ult_temp
916:
917: splitted=ult_temp.split("/")
918:
1.58 dwinter 919: #print "AU",self.absolute_url(),splitted
920: #start=[splitted[2]] #orig
1.29 dwinter 921: startNr= self.startOfHierarchy(splitted)
922:
1.58 dwinter 923: start=[splitted[startNr]]
924:
1.29 dwinter 925: #print start
1.68 dwinter 926:
1.25 dwinter 927: keys=self.barFromHash(hash,start=start)
1.7 dwinter 928:
929:
930: return keys
931:
932: def navElements(self,order):
933: """n-te Ordnung"""
934:
935: hash=self.createNavHash(order)
936: actual_url=self.REQUEST['URL']
937:
938: ult_temp=re.sub(self.absolute_url(),"",actual_url)
939: #print ult_temp
940:
941: splitted=ult_temp.split("/")
942:
943:
944: ## if splitted[len(splitted)-1]=="index_html":
945: ## start=[splitted[len(splitted)-2]]
946: ## else:
947: ## start=[splitted[len(splitted)-1]]
948:
1.28 dwinter 949: #start=splitted[2:order+1] #orig
1.29 dwinter 950: startNr= self.startOfHierarchy(splitted)
1.30 dwinter 951: #print startNr
1.58 dwinter 952: start=splitted[startNr:order+startNr-1]
1.1 dwinter 953: #print start
1.5 dwinter 954:
1.1 dwinter 955: keys=self.barFromHash(hash,start=start)
956:
957:
958: return keys
959:
960:
961: def secondNavBar(self):
962: """Zweite Ordnung"""
963:
964: hash=self.createNavHash(2)
965: actual_url=self.REQUEST['URL']
966:
967: ult_temp=re.sub(self.absolute_url(),"",actual_url)
968: #print ult_temp
969:
970: splitted=ult_temp.split("/")
971:
972:
973: ## if splitted[len(splitted)-1]=="index_html":
974: ## start=[splitted[len(splitted)-2]]
975: ## else:
976: ## start=[splitted[len(splitted)-1]]
977:
978: start=[splitted[2]]
979: #print start
980:
981: keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
982:
983:
984: return keys
985:
1.6 dwinter 986: def manage_addECHO_navigationForm(self):
1.1 dwinter 987: """Form for adding"""
1.48 dwinter 988: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_navigation.zpt')).__of__(self)
1.1 dwinter 989: return pt()
990:
1.6 dwinter 991: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
1.1 dwinter 992: """Add an ECHO_root"""
993: self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
994:
995: if RESPONSE is not None:
996: RESPONSE.redirect('manage_main')
997:
998:
999: #helpers
1000:
1.3 dwinter 1001:
1002:
1.65 dwinter 1003: def createPath(self,url1,url2):
1004: #bugfix in absolute_url, ploetzlich erschein in absolute_url der physikalische pfad.
1005:
1.66 dwinter 1006: if self.REQUEST.has_key('VirtualRootPhysicalPath'):
1007: vp="/".join(self.REQUEST['VirtualRootPhysicalPath'])
1.76 dwinter 1008: if (len(vp)>0):
1009: if vp[0]=="/":
1010: vp=vp[1:]
1.66 dwinter 1011:
1.76 dwinter 1012: url2=url2.replace(vp+"/",'')
1.68 dwinter 1013: else:
1014: temp1=url1.split("/")
1015: temp2=url2.split("/")
1016: for test in temp1:
1017: if temp2[0]==test:
1018: del temp2[0]
1019:
1020: url2= string.join(temp2,"/")
1.66 dwinter 1021:
1.65 dwinter 1022: return url1+"/"+url2
1.4 dwinter 1023:
1024: def sortWeight(x,y):
1025: #print x[1],y[1]
1026: return cmp(x[1],y[1])
1.1 dwinter 1027:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>