File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.84.2.2: download - view: text, annotated - select for diffs - revision graph
Thu Jan 19 19:03:28 2012 UTC (12 years, 4 months ago) by casties
Branches: cleanup
Diff to: branchpoint 1.84: preferred, unified
improved hierarchical breadcrumbs.

    1: # Objekte zur Erzeugung von Navigationselement
    2: from AccessControl import ClassSecurityInfo
    3: from Globals import DTMLFile
    4: from OFS.Image import Image,cookId
    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
   15: from ECHO_helpers import *
   16: from ECHO_collection import content_html 
   17: from types import *
   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
   30: 
   31: import urllib
   32: import ECHO_helpers
   33: from ECHO_helpers import displayTypes,checkOnlyOneInGroup,unicodify
   34: from ECHO_collection import content_html
   35: import logging
   36: 
   37: #def ersetzt logging
   38: def logger(txt,method,txt2):
   39:     """logging"""
   40:     logging.info(txt+ txt2)
   41: 
   42: STORAGEMANAGER_URL_DEFAULT = "http://storage-web.mpiwg-berlin.mpg.de/storage/storeOnline?path="
   43: try:    
   44:     from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
   45: except:
   46:     logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
   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: 
   66:         
   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:         
   91:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_ZCatalogElement.zpt')).__of__(self)
   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):
  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
  114:     
  115:     def getNavList(self):
  116:         """ausgabe der treffer list fuer navigation"""
  117:         
  118:         records=self.getKeywordList()
  119:         
  120:         records=[x.encode('utf-8') for x in records]
  121:         records.sort()
  122:         if not records:
  123:             return []
  124:         else:
  125:             ret=[]
  126:             for record in records:
  127:              
  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"""
  141:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_ZCatalogElement.zpt')).__of__(self)
  142:     return pt()
  143: 
  144: def manage_addECHO_ZCatalogElement(self,id,title,field,catalogId,baseUrl,weight,contentType,RESPONSE=None):
  145:     """Add an ECHO_ZCatalogelement"""
  146: 
  147:     self._setObject(id,ECHO_ZCatalogElement(id,title,field,catalogId,baseUrl,weight,contentType))
  148:     
  149:     if RESPONSE is not None:
  150:         RESPONSE.redirect('manage_main')
  151: 
  152: 
  153: 
  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"""
  166:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_contentType.zpt')).__of__(self)
  167:         return pt()
  168:  
  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: 
  213: 
  214: class ECHO_sqlElement(SimpleItem):
  215:     """Erzeuge navigation aus sql-abfrage"""
  216:     meta_type="ECHO_sqlElement"
  217:     baseUrl=""
  218: 
  219: 
  220:     
  221:     def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
  222:         """init"""
  223:         self.id=id
  224:         self.title=title
  225:         self.query=query
  226:         self.field=field
  227:         if searchField=="":
  228:             self.searchField=field
  229:         else:
  230:             self.searchField=searchField
  231:         self.baseUrl=baseUrl
  232: 
  233:         self.content=contentType
  234: 
  235:     manage_options= SimpleItem.manage_options+(
  236:         {'label':'Main Config','action':'changeECHO_sqlElementForm'},
  237:         )
  238: 
  239:     def getSearchField(self):
  240:         try:
  241:             return self.searchField
  242:         except:
  243:             return self.field
  244:         
  245:     def getWeight(self):
  246:         """get weight"""
  247:         if hasattr(self,'weight'):
  248:             return self.weight
  249:         else:
  250:             return 0
  251:         
  252:     def getcontentType(self):
  253:         """get weight"""
  254:         
  255:         if hasattr(self,'contentType'):
  256:             return self.contentType
  257:         else:
  258:             return 0
  259:         
  260: 
  261:     def changeECHO_sqlElementForm(self):
  262:         """change"""
  263:         
  264:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_sqlElement.zpt')).__of__(self)
  265:         return pt()
  266: 
  267:     def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
  268:         """change"""
  269:         self.title=title
  270:         self.query=query
  271:         self.field=field
  272:         self.searchField=searchField
  273:         self.baseUrl=baseUrl
  274:         self.weight=weight
  275:         self.contentType=contentType
  276:         
  277:         if RESPONSE is not None:
  278:             RESPONSE.redirect('manage_main')
  279: 
  280:     try:    
  281:         searchQuery=ZSQLExtendFolder.ZSQLSimpleSearch
  282:     except:
  283:         logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
  284:             
  285:     def getNavList(self): 
  286:         """ausgabe der treffer list fuer navigation"""
  287:         
  288:         #naechste schritte sind trial and error, warum geht mal das eine mal das andere 2.3 / 2.4 ??
  289:  
  290:         try:
  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 (??)
  295:         except:
  296:             records=self.searchQuery(query=self.query)#python 2.3 version(??)
  297:       
  298:  
  299:         if not records:
  300:             return []
  301:         else:
  302:             ret=[]
  303:             for record in records:
  304:                 try:
  305:                     ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
  306:                 except:
  307:                     logger('ECHO_Nav',logging.INFO,"error, search")
  308:                     """notrhing"""
  309:                     
  310:             return ret
  311:     
  312: 
  313: def manage_addECHO_sqlElementForm(self):
  314:     """Form for adding"""
  315:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_sqlElement.zpt')).__of__(self)
  316:     return pt()
  317: 
  318: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
  319:     """Add an ECHO_sqlelement"""
  320:     self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
  321:     
  322:     if RESPONSE is not None:
  323:         RESPONSE.redirect('manage_main')
  324: 
  325: 
  326: class ECHO_pageTemplate(ZopePageTemplate,ECHO_basis):
  327:     """pageTemplate Objekt"""
  328:     meta_type="ECHO_pageTemplate"
  329:     security=ClassSecurityInfo()
  330:     
  331:     
  332:     _default_content_fn = os.path.join(package_home(globals()),
  333:                                        'html/ECHO_pageTemplateDefault.html')
  334: 
  335:     manage_options=ZopePageTemplate.manage_options+ECHO_basis.manage_options+(
  336:         {'label':'Main Config','action':'changeECHO_pageTemplateMainForm'},
  337:         {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
  338:         )
  339: 
  340:     security.declarePublic('content_html')
  341: 
  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
  348:     
  349:     def content_html(self):
  350:         """content_html"""
  351:         return content_html(self,'pageTemplate')
  352: 
  353:     def changeECHO_pageTemplateMainForm(self):
  354:         """change"""
  355:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_pageTemplateMain.zpt')).__of__(self)
  356:         return pt()
  357: 
  358:     def changeECHO_pageTemplateMain(self,weight,contentType,label,description,RESPONSE=None,isAlwaysClickable=None,suffix=None,prefix=None):
  359:         """change"""
  360:         self.weight=weight
  361:         self.contentType=contentType
  362:         self.label=label
  363:         self.description=description
  364:         self.isAlwaysClickable=isAlwaysClickable
  365:         self.suffix=suffix
  366:         self.prefix=prefix
  367:         
  368:         if RESPONSE is not None:
  369:             RESPONSE.redirect('manage_main')
  370:      
  371:     def getWeight(self):
  372:         """get weight"""
  373:         if hasattr(self,'weight'):
  374:             return self.weight
  375:         else:
  376:             return 0
  377:         
  378:     def getcontentType(self):
  379:         """get contentType"""
  380:         if hasattr(self,'contentType'):
  381:             return self.contentType
  382:         else:
  383:             return 0
  384: 
  385:     def getCrumb(self):
  386:         """returns breadcrumb for this object"""
  387:         return ECHO_helpers.getCrumb(self)
  388: 
  389:     def getHierCrumbs(self):
  390:         """returns a list of hierarchical breadcrumbs from self to the ECHO_root"""
  391:         return ECHO_helpers.getHierCrumbs(self);    
  392:     
  393: 
  394: 
  395:     ## def __init__(self, id, text=None, contentType=None):
  396: ##         self.id = str(id)
  397: ##         self.ZBindings_edit(self._default_bindings)
  398: ##         if text is None:
  399: ##             text = open(self._default_cont).read()
  400: ##         self.pt_edit(text, contentType)
  401: 
  402: def manage_addECHO_pageTemplateForm(self):
  403:     """Form for adding"""
  404:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_pageTemplate.zpt')).__of__(self)
  405:     return pt()
  406: 
  407: from urllib import quote
  408: 
  409: 
  410: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
  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)
  419:         setattr(ob,'weight',weight)
  420:         setattr(ob,'label',label)
  421:         setattr(ob,'contentType',contentType)
  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:
  431:             zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
  432: 
  433:         self._setObject(id, zpt)
  434:         ob = getattr(self, id)
  435:         setattr(ob,'weight',weight)
  436:         setattr(ob,'label',label)
  437:         if title:
  438:             ob.pt_setTitle(title)
  439:         
  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"
  454:     management_page_charset="utf-8"
  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:         
  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:     
  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: 
  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"""
  513:         return unicodify(str)
  514: 
  515:     def ECHOFormatListStr(self,list,search="\n",replace="<br>"):
  516:         """formatiert liste im str"""
  517:         if list:
  518:                 return re.sub(search,replace,list)
  519:         else:
  520:                 return 
  521: 
  522:     def ECHO_cacheManageForm(self):
  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()
  527: 
  528:     def ECHO_cacheManage(self,cacheManagerName=None,deleteCache=None, activateCache=None,RESPONSE=None):
  529:             """cachemanager"""
  530:             if cacheManagerName=="": chacheManagerName=None
  531:             
  532:             self.cacheManagerName=cacheManagerName
  533:             self.setCache(managerName=cacheManagerName)
  534:             
  535:             if deleteCache:
  536:                 try:
  537:                     self.deleteCache()
  538:                 except:
  539:                     for roots in self.ZopeFind(self,obj_metatypes=['ECHO_root'],search_sub=1):
  540:                         roots[1].deleteCache()
  541:                     
  542: 
  543:             self.activateCache=activateCache
  544: 
  545:             if RESPONSE is not None:
  546:                     RESPONSE.redirect('manage_main')
  547:         
  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:             
  555:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_collection','VLP_resource'],search_sub=1)
  556: 
  557:         for entry in entries:
  558:             entry[1].ZCacheable_setManagerId(managerName)
  559: 
  560:         
  561:         return "changed all CM in: "+self.title
  562: 
  563:     
  564: 
  565:     displayableMetaTypes=displayTypes
  566:     
  567:     def getImageViewers(self):
  568:         """images"""
  569:         viewers=self.ZopeFind(self.standardImageViewer,obj_metatypes=['OSAS_ViewerObject'])
  570:         return viewers
  571:     
  572:     def getR(self):
  573:         """re"""
  574:         return self.REQUEST
  575: 
  576:     def __init__(self,id,title,pathToHierarchy):
  577:         """init"""
  578:         self.id=id
  579:         self.title=title
  580:         self.pathToHierarchy=pathToHierarchy
  581:         self.displayedMetaTypes=displayTypes
  582:         
  583:     manage_options = Folder.manage_options+(
  584:         {'label':'Main Config','action':'ECHO_navigationConfigForm'},
  585:         {'label':'Cache','action':'ECHO_cacheManageForm'},
  586: 
  587:         )
  588:     displayedMetaTypes=displayTypes
  589:     
  590:     def getStorageManagerURL(self):
  591:         """returns the URL to the storagemanager"""
  592:         return getattr(self,"storageManagerURL",STORAGEMANAGER_URL_DEFAULT)
  593:     def ECHO_navigationConfigForm(self):
  594:         """configForm"""
  595:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_navigation.zpt')).__of__(self)
  596:         return pt()
  597:     
  598:     def ECHO_navigationConfig(self,title,pathToHierarchy,storageManagerURL="",displayedMetaTypes=displayTypes,RESPONSE=None):
  599:         """config"""
  600:         self.title=title
  601:         self.pathToHierarchy=pathToHierarchy
  602:         self.displayedMetaTypes=toList(displayedMetaTypes)[0:]
  603:         self.storageManagerURL=storageManagerURL
  604: 
  605:         if RESPONSE is not None:
  606:             RESPONSE.redirect('manage_main')
  607: 
  608: 
  609:     def getColls(self,obj,depth,checkOnly="no"):
  610:         nav={}
  611:         #print "HERE",obj.
  612:         for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
  613:             x=x_objs[1]
  614:             if checkOnly=="yes":
  615:                 x = checkOnlyOneInGroup(x)
  616:             if depth>1:
  617:                 nav[x.getId()]=(self.getColls(x,depth-1),x)
  618:             else:
  619:                 nav[x.getId()]=(None,x)
  620:         return nav
  621:     
  622:     def createNavHash(self,depth,checkOnly="no"):
  623:         """Auslesen des Hierarchiebuames"""
  624:         temp=self.pathToHierarchy[0:]
  625:         temp=re.sub("/",".",temp)
  626:         temp="self.aq_parent"+temp
  627: 
  628:         
  629:         objtemp=eval(temp)
  630:         nav={}
  631:         
  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)]
  636: 
  637:         # if not generate new hash
  638:         obj=objtemp      
  639:         
  640:         for keys in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
  641: 
  642:             x=keys[1]
  643:             if depth>1:
  644:                 nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
  645:             else:
  646:                 nav[x.getId()]=(None,x)
  647:             
  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)]={}
  656: 
  657:             for x in nav.keys():
  658:                 self._v_hash[str(depth)][x]=nav[x]
  659: 
  660:         return nav
  661: 
  662:     def barFromHash(self,hash,start=None,sortField=None,location=None):
  663:         """Erzeuge Navigations Element"""
  664:                 
  665:         listNav=[]
  666:         if not start:
  667:             temp=hash
  668:             sortField="weight"
  669:         else: # liste mit pfad zum hash
  670:             temp=hash
  671:             #print "HI",sortField
  672:             if not sortField:
  673:                 tempObj=self.pathToHierarchy[0:]
  674:                 tempObj=re.sub("/",".",tempObj)
  675:                 tempObj="self.aq_parent"+tempObj
  676:                 #print tempObj
  677:                 objtemp=eval(tempObj)
  678: 
  679:                 obj=objtemp
  680: 
  681:                 for x in start:
  682:                     #print "OBJ",start,obj,obj.getId(),x
  683: 
  684:                     obj=getattr(obj,x)
  685: 
  686:                 if hasattr(obj,'sortfield'):
  687:                     sortField=obj.sortfield
  688:                 else:
  689:                     sortField='weight'
  690:             #print "START",start
  691:             for x in start:
  692:                 #print "N2",x,temp[x]
  693:                 try:
  694:                     temp=temp[x][0]
  695:                 except:
  696:                     """nothing"""
  697:                     return []
  698:             #print "TEMP",temp,self.tempSorted(temp, field=sortField)
  699: 
  700:         for x in self.tempSorted(temp, field=sortField):
  701:            
  702:             if not temp[x][1].title == "":
  703:                 
  704:                 if (temp[x][1].meta_type=="ECHO_sqlElement") or (temp[x][1].meta_type=="ECHO_ZCatalogElement"):
  705: 
  706:                     for z in temp[x][1].getNavList():
  707:                         listNav.append((z[0],z[1],None,'',''))
  708:             
  709:                 else:
  710:                     # add label falls existiert und nicht leer
  711:                     if hasattr(temp[x][1],'label'):
  712:                         
  713:                         if not temp[x][1].getLabel()=='':
  714:                                 label=temp[x][1].getLabel()
  715:                         else:
  716:                             try:
  717:                                 label=temp[x][1].getTitle()
  718:                             except:
  719:                                 logger("ECHO_Nav",logging.ERROR,"%s has neither getLabel nor getTile implemented"%temp[x][1].getId())
  720:                                 label=""
  721:                     else:
  722:                         label=temp[x][1].getTitle()
  723: 
  724:                         
  725:                     if location:
  726: 
  727:                         loc=getattr(temp[x][1],'location','top')
  728:                         if (loc==location):
  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','')))
  732:                     else:
  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
  736:         return listNav
  737: 
  738:     def tempSorted(self,hash,field="weight"):
  739:         ls=[]
  740: 
  741:         for x in hash.keys():
  742:             #print hash[x][1]
  743:             if hasattr(hash[x][1],field):
  744:                 try:
  745:                     weight=int(getattr(hash[x][1],field))
  746:                 except:
  747:                     weight=getattr(hash[x][1],field)
  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:             
  761:     def isSelectedPath(self,item):
  762:         """test is path is already selected"""
  763: 
  764:         testStr=re.sub("/index_html",'',self.REQUEST.get('URL',''))
  765: 	
  766: 	if len(item)<2:
  767: 		return 0
  768:         #falls exakte Uebereinstimmung dann immer 1
  769:         if  (testStr==item[1]) and (self.REQUEST.get('QUERY_STRING','')==''):
  770:             
  771:             return 1
  772:            
  773:         found=re.search("\?(.*)",item[1])
  774:         
  775:         if found:
  776:             temp=re.sub(" ","%20",found.group(0))
  777:           
  778:             #print temp+"::"+self.REQUEST['QUERY_STRING']
  779:             if ("?"+self.REQUEST['QUERY_STRING'])==temp:
  780:                 if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
  781:                 
  782:                     return 2
  783:                 else:
  784:                     return 1
  785: 
  786:         if (getattr(item[2],'meta_type','')=="ECHO_pageTemplate") and (re.search(item[1],self.REQUEST['URL'])):
  787:             if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
  788:                 
  789:                 return 2
  790:             else:
  791:                 return 1
  792: 
  793:         if re.search(item[1]+"/",self.REQUEST['URL']):
  794:             if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
  795:                 
  796:                 return 2
  797:             else:
  798:                 return 1
  799:         else:
  800:             return 0
  801:     
  802: 
  803:     def getPathStyle(self, item, style=""):
  804:         """returns a string with the given style + 'sel' if the path is already selected."""
  805: 
  806:         if self.isSelectedPath(item):
  807:             return style + 'sel'
  808:         else:
  809:             return style
  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
  817:         
  818:         # we use title for the label TODO: add label to ECHO_root
  819:         crumb = {'obj': self,
  820:                  'url': self.absolute_url(),
  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: 
  828: 
  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:         
  852:         for key in self.tempSorted(temp):
  853:             
  854:             description=temp[x][1].title
  855:             
  856:             
  857:             url=createPath(self,self.absolute_url(),temp[key][1].absolute_url(relative=1))
  858: 
  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=""
  872: 
  873:         try:
  874:             keys=self.buttonsFromHash(self.createNavHash(0))
  875:         except:
  876:             keys=""
  877:             
  878:         return keys
  879: 
  880:     def mainNavElements(self,location=None):
  881:         """print main navigation bar"""
  882:         keys=""
  883:         #print "NAVELEMENT",self.getId()
  884:         #try:
  885:         
  886:         keys=self.barFromHash(self.createNavHash(0),location=location)
  887:         
  888:         #except:
  889:         #    keys=""
  890:      
  891:         return keys
  892: 
  893:     def numberOfMainNavElements(self):
  894:         """number of main elements"""
  895: 
  896:         return len(self.barFromHash(self.createNavHash(0))) 
  897: 
  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:     
  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:     
  924:     def secondNavElements(self):
  925:         """Zweite Ordnung Navigationselemente"""
  926:         
  927:         hash=self.createNavHash(2,checkOnly="no")
  928: 
  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:         
  936:         #print "AU",self.absolute_url(),splitted
  937:         #start=[splitted[2]] #orig
  938:         startNr= self.startOfHierarchy(splitted)
  939:         
  940:         start=[splitted[startNr]]
  941:         
  942:         #print start
  943: 
  944:         keys=self.barFromHash(hash,start=start)
  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: 
  966:         #start=splitted[2:order+1] #orig
  967:         startNr= self.startOfHierarchy(splitted)
  968:         #print startNr
  969:         start=splitted[startNr:order+startNr-1] 
  970:         #print start
  971:        
  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: 
 1003: def manage_addECHO_navigationForm(self):
 1004:     """Form for adding"""
 1005:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_navigation.zpt')).__of__(self)
 1006:     return pt()
 1007: 
 1008: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
 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: 
 1018: 
 1019: 
 1020: def createPath(self,url1,url2):
 1021:     #bugfix in absolute_url, ploetzlich erschein in absolute_url der physikalische pfad.
 1022:     
 1023:     if self.REQUEST.has_key('VirtualRootPhysicalPath'):
 1024:         vp="/".join(self.REQUEST['VirtualRootPhysicalPath'])
 1025:         if (len(vp)>0):
 1026:             if vp[0]=="/":
 1027:             	vp=vp[1:]
 1028:         
 1029:             url2=url2.replace(vp+"/",'')
 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,"/")
 1038:         
 1039:     return url1+"/"+url2
 1040: 
 1041: def sortWeight(x,y):
 1042:     #print x[1],y[1]
 1043:     return cmp(x[1],y[1])
 1044:     

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>