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