File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.84.2.3: download - view: text, annotated - select for diffs - revision graph
Wed Aug 29 07:53:31 2012 UTC (11 years, 9 months ago) by dwinter
Branches: cleanup
Diff to: branchpoint 1.84: preferred, unified
removed very old pdf generation
all references to OSAS removed
viewtemplates

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

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