Annotation of ECHO_content/ECHO_Nav.py, revision 1.84.2.4

1.60      dwinter     1: # Objekte zur Erzeugung von Navigationselement
1.84.2.3  dwinter     2: # 29-8-2012 Referenzen zum Storagemanager entfernt
                      3: 
1.54      dwinter     4: from AccessControl import ClassSecurityInfo
1.11      dwinter     5: from Globals import DTMLFile
                      6: from OFS.Image import Image,cookId
1.1       dwinter     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
1.48      dwinter    17: from ECHO_helpers import *
1.59      dwinter    18: from ECHO_collection import content_html 
1.48      dwinter    19: from types import *
1.35      dwinter    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
1.55      dwinter    32: 
1.35      dwinter    33: import urllib
1.84.2.2  casties    34: import ECHO_helpers
1.81      casties    35: from ECHO_helpers import displayTypes,checkOnlyOneInGroup,unicodify
1.35      dwinter    36: from ECHO_collection import content_html
1.79      dwinter    37: import logging
                     38: 
                     39: #def ersetzt logging
                     40: def logger(txt,method,txt2):
                     41:     """logging"""
                     42:     logging.info(txt+ txt2)
                     43: 
1.84.2.3  dwinter    44: 
1.49      dwinter    45: try:    
                     46:     from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder
                     47: except:
1.79      dwinter    48:     logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
1.35      dwinter    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: 
1.48      dwinter    68:         
1.35      dwinter    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:         
1.84.2.4! dwinter    93:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_ZCatalogElement.zpt')).__of__(self)
1.35      dwinter    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):
1.72      dwinter   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
1.35      dwinter   116:     
                    117:     def getNavList(self):
1.64      dwinter   118:         """ausgabe der treffer list fuer navigation"""
1.37      dwinter   119:         
1.35      dwinter   120:         records=self.getKeywordList()
                    121:         
1.64      dwinter   122:         records=[x.encode('utf-8') for x in records]
                    123:         records.sort()
1.35      dwinter   124:         if not records:
                    125:             return []
                    126:         else:
                    127:             ret=[]
                    128:             for record in records:
1.64      dwinter   129:              
1.35      dwinter   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"""
1.49      dwinter   143:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_ZCatalogElement.zpt')).__of__(self)
1.35      dwinter   144:     return pt()
                    145: 
1.64      dwinter   146: def manage_addECHO_ZCatalogElement(self,id,title,field,catalogId,baseUrl,weight,contentType,RESPONSE=None):
1.35      dwinter   147:     """Add an ECHO_ZCatalogelement"""
1.64      dwinter   148: 
                    149:     self._setObject(id,ECHO_ZCatalogElement(id,title,field,catalogId,baseUrl,weight,contentType))
1.35      dwinter   150:     
                    151:     if RESPONSE is not None:
                    152:         RESPONSE.redirect('manage_main')
                    153: 
                    154: 
                    155: 
1.11      dwinter   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"""
1.48      dwinter   168:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_contentType.zpt')).__of__(self)
1.11      dwinter   169:         return pt()
1.48      dwinter   170:  
1.11      dwinter   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: 
1.1       dwinter   215: 
                    216: class ECHO_sqlElement(SimpleItem):
                    217:     """Erzeuge navigation aus sql-abfrage"""
                    218:     meta_type="ECHO_sqlElement"
                    219:     baseUrl=""
1.41      dwinter   220: 
                    221: 
1.1       dwinter   222:     
1.10      dwinter   223:     def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
1.1       dwinter   224:         """init"""
                    225:         self.id=id
                    226:         self.title=title
                    227:         self.query=query
                    228:         self.field=field
1.7       dwinter   229:         if searchField=="":
                    230:             self.searchField=field
                    231:         else:
                    232:             self.searchField=searchField
1.1       dwinter   233:         self.baseUrl=baseUrl
1.38      dwinter   234: 
1.10      dwinter   235:         self.content=contentType
1.1       dwinter   236: 
                    237:     manage_options= SimpleItem.manage_options+(
                    238:         {'label':'Main Config','action':'changeECHO_sqlElementForm'},
                    239:         )
                    240: 
1.7       dwinter   241:     def getSearchField(self):
                    242:         try:
                    243:             return self.searchField
                    244:         except:
                    245:             return self.field
                    246:         
1.3       dwinter   247:     def getWeight(self):
1.4       dwinter   248:         """get weight"""
                    249:         if hasattr(self,'weight'):
                    250:             return self.weight
1.3       dwinter   251:         else:
                    252:             return 0
                    253:         
1.10      dwinter   254:     def getcontentType(self):
1.6       dwinter   255:         """get weight"""
                    256:         
1.10      dwinter   257:         if hasattr(self,'contentType'):
                    258:             return self.contentType
1.6       dwinter   259:         else:
                    260:             return 0
1.3       dwinter   261:         
                    262: 
1.1       dwinter   263:     def changeECHO_sqlElementForm(self):
                    264:         """change"""
1.6       dwinter   265:         
1.48      dwinter   266:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeECHO_sqlElement.zpt')).__of__(self)
1.1       dwinter   267:         return pt()
                    268: 
1.10      dwinter   269:     def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
1.1       dwinter   270:         """change"""
                    271:         self.title=title
                    272:         self.query=query
                    273:         self.field=field
1.7       dwinter   274:         self.searchField=searchField
1.1       dwinter   275:         self.baseUrl=baseUrl
1.3       dwinter   276:         self.weight=weight
1.10      dwinter   277:         self.contentType=contentType
1.6       dwinter   278:         
1.1       dwinter   279:         if RESPONSE is not None:
                    280:             RESPONSE.redirect('manage_main')
                    281: 
1.49      dwinter   282:     try:    
                    283:         searchQuery=ZSQLExtendFolder.ZSQLSimpleSearch
                    284:     except:
1.79      dwinter   285:         logger('ECHO_Nav',logging.INFO,'ZSQLSimpleSearch not supported')
1.49      dwinter   286:             
                    287:     def getNavList(self): 
1.61      dwinter   288:         """ausgabe der treffer list fuer navigation"""
1.37      dwinter   289:         
1.60      dwinter   290:         #naechste schritte sind trial and error, warum geht mal das eine mal das andere 2.3 / 2.4 ??
1.77      dwinter   291:  
1.60      dwinter   292:         try:
1.77      dwinter   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 (??)
1.60      dwinter   297:         except:
1.77      dwinter   298:             records=self.searchQuery(query=self.query)#python 2.3 version(??)
1.37      dwinter   299:       
1.77      dwinter   300:  
1.1       dwinter   301:         if not records:
                    302:             return []
                    303:         else:
                    304:             ret=[]
                    305:             for record in records:
1.7       dwinter   306:                 try:
                    307:                     ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
                    308:                 except:
1.79      dwinter   309:                     logger('ECHO_Nav',logging.INFO,"error, search")
1.7       dwinter   310:                     """notrhing"""
                    311:                     
1.1       dwinter   312:             return ret
                    313:     
                    314: 
1.6       dwinter   315: def manage_addECHO_sqlElementForm(self):
1.1       dwinter   316:     """Form for adding"""
1.48      dwinter   317:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_sqlElement.zpt')).__of__(self)
1.1       dwinter   318:     return pt()
                    319: 
1.10      dwinter   320: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
1.1       dwinter   321:     """Add an ECHO_sqlelement"""
1.10      dwinter   322:     self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
1.1       dwinter   323:     
                    324:     if RESPONSE is not None:
                    325:         RESPONSE.redirect('manage_main')
                    326: 
                    327: 
1.51      dwinter   328: class ECHO_pageTemplate(ZopePageTemplate,ECHO_basis):
1.1       dwinter   329:     """pageTemplate Objekt"""
                    330:     meta_type="ECHO_pageTemplate"
1.54      dwinter   331:     security=ClassSecurityInfo()
                    332:     
1.56      dwinter   333:     
1.1       dwinter   334:     _default_content_fn = os.path.join(package_home(globals()),
1.6       dwinter   335:                                        'html/ECHO_pageTemplateDefault.html')
1.1       dwinter   336: 
1.51      dwinter   337:     manage_options=ZopePageTemplate.manage_options+ECHO_basis.manage_options+(
1.39      dwinter   338:         {'label':'Main Config','action':'changeECHO_pageTemplateMainForm'},
1.56      dwinter   339:         {'label':'Graphic Coords','action':'ECHO_graphicEntry'},
1.3       dwinter   340:         )
1.23      dwinter   341: 
1.54      dwinter   342:     security.declarePublic('content_html')
                    343: 
1.59      dwinter   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
1.54      dwinter   350:     
1.23      dwinter   351:     def content_html(self):
1.58      dwinter   352:         """content_html"""
                    353:         return content_html(self,'pageTemplate')
1.3       dwinter   354: 
1.39      dwinter   355:     def changeECHO_pageTemplateMainForm(self):
1.4       dwinter   356:         """change"""
1.48      dwinter   357:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_pageTemplateMain.zpt')).__of__(self)
1.4       dwinter   358:         return pt()
                    359: 
1.47      dwinter   360:     def changeECHO_pageTemplateMain(self,weight,contentType,label,description,RESPONSE=None,isAlwaysClickable=None,suffix=None,prefix=None):
1.4       dwinter   361:         """change"""
                    362:         self.weight=weight
1.10      dwinter   363:         self.contentType=contentType
1.15      dwinter   364:         self.label=label
1.39      dwinter   365:         self.description=description
1.43      dwinter   366:         self.isAlwaysClickable=isAlwaysClickable
1.47      dwinter   367:         self.suffix=suffix
                    368:         self.prefix=prefix
1.15      dwinter   369:         
1.4       dwinter   370:         if RESPONSE is not None:
                    371:             RESPONSE.redirect('manage_main')
1.51      dwinter   372:      
1.4       dwinter   373:     def getWeight(self):
                    374:         """get weight"""
                    375:         if hasattr(self,'weight'):
                    376:             return self.weight
                    377:         else:
                    378:             return 0
1.6       dwinter   379:         
1.10      dwinter   380:     def getcontentType(self):
1.33      jdamerow  381:         """get contentType"""
                    382:         if hasattr(self,'contentType'):
                    383:             return self.contentType
1.6       dwinter   384:         else:
                    385:             return 0
                    386: 
1.84.2.2  casties   387:     def getCrumb(self):
                    388:         """returns breadcrumb for this object"""
                    389:         return ECHO_helpers.getCrumb(self)
1.3       dwinter   390: 
1.84.2.2  casties   391:     def getHierCrumbs(self):
                    392:         """returns a list of hierarchical breadcrumbs from self to the ECHO_root"""
                    393:         return ECHO_helpers.getHierCrumbs(self);    
                    394:     
1.3       dwinter   395: 
1.1       dwinter   396: 
1.10      dwinter   397:     ## def __init__(self, id, text=None, contentType=None):
1.1       dwinter   398: ##         self.id = str(id)
                    399: ##         self.ZBindings_edit(self._default_bindings)
                    400: ##         if text is None:
                    401: ##             text = open(self._default_cont).read()
1.10      dwinter   402: ##         self.pt_edit(text, contentType)
1.1       dwinter   403: 
1.6       dwinter   404: def manage_addECHO_pageTemplateForm(self):
1.1       dwinter   405:     """Form for adding"""
1.49      dwinter   406:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_pageTemplate.zpt')).__of__(self)
1.1       dwinter   407:     return pt()
                    408: 
                    409: from urllib import quote
                    410: 
                    411: 
1.15      dwinter   412: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
1.1       dwinter   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)
1.3       dwinter   421:         setattr(ob,'weight',weight)
1.15      dwinter   422:         setattr(ob,'label',label)
1.10      dwinter   423:         setattr(ob,'contentType',contentType)
1.1       dwinter   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:
1.10      dwinter   433:             zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
1.1       dwinter   434: 
                    435:         self._setObject(id, zpt)
1.3       dwinter   436:         ob = getattr(self, id)
                    437:         setattr(ob,'weight',weight)
1.34      dwinter   438:         setattr(ob,'label',label)
1.8       dwinter   439:         if title:
                    440:             ob.pt_setTitle(title)
                    441:         
1.1       dwinter   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"
1.69      dwinter   456:     management_page_charset="utf-8"
1.74      dwinter   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:         
1.67      dwinter   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:     
1.59      dwinter   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: 
1.53      dwinter   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"""
1.81      casties   515:         return unicodify(str)
1.69      dwinter   516: 
1.41      dwinter   517:     def ECHOFormatListStr(self,list,search="\n",replace="<br>"):
                    518:         """formatiert liste im str"""
1.58      dwinter   519:         if list:
                    520:                 return re.sub(search,replace,list)
                    521:         else:
                    522:                 return 
1.42      dwinter   523: 
1.41      dwinter   524:     def ECHO_cacheManageForm(self):
1.58      dwinter   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()
1.41      dwinter   529: 
                    530:     def ECHO_cacheManage(self,cacheManagerName=None,deleteCache=None, activateCache=None,RESPONSE=None):
1.58      dwinter   531:             """cachemanager"""
                    532:             if cacheManagerName=="": chacheManagerName=None
                    533:             
                    534:             self.cacheManagerName=cacheManagerName
                    535:             self.setCache(managerName=cacheManagerName)
                    536:             
                    537:             if deleteCache:
1.46      dwinter   538:                 try:
1.58      dwinter   539:                     self.deleteCache()
1.46      dwinter   540:                 except:
                    541:                     for roots in self.ZopeFind(self,obj_metatypes=['ECHO_root'],search_sub=1):
                    542:                         roots[1].deleteCache()
                    543:                     
1.41      dwinter   544: 
1.58      dwinter   545:             self.activateCache=activateCache
1.41      dwinter   546: 
1.58      dwinter   547:             if RESPONSE is not None:
                    548:                     RESPONSE.redirect('manage_main')
                    549:         
1.41      dwinter   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:             
1.58      dwinter   557:         entries=obj.ZopeFind(obj,obj_metatypes=['ECHO_collection','VLP_resource'],search_sub=1)
1.41      dwinter   558: 
                    559:         for entry in entries:
                    560:             entry[1].ZCacheable_setManagerId(managerName)
                    561: 
                    562:         
                    563:         return "changed all CM in: "+self.title
                    564: 
1.48      dwinter   565:     
1.35      dwinter   566: 
1.48      dwinter   567:     displayableMetaTypes=displayTypes
                    568:     
1.84.2.3  dwinter   569:   
1.28      dwinter   570:     def getR(self):
1.58      dwinter   571:         """re"""
                    572:         return self.REQUEST
1.28      dwinter   573: 
1.1       dwinter   574:     def __init__(self,id,title,pathToHierarchy):
                    575:         """init"""
                    576:         self.id=id
                    577:         self.title=title
                    578:         self.pathToHierarchy=pathToHierarchy
1.48      dwinter   579:         self.displayedMetaTypes=displayTypes
                    580:         
1.1       dwinter   581:     manage_options = Folder.manage_options+(
                    582:         {'label':'Main Config','action':'ECHO_navigationConfigForm'},
1.41      dwinter   583:         {'label':'Cache','action':'ECHO_cacheManageForm'},
                    584: 
1.1       dwinter   585:         )
1.48      dwinter   586:     displayedMetaTypes=displayTypes
                    587:     
1.84.2.3  dwinter   588:    
                    589:     
1.1       dwinter   590:     def ECHO_navigationConfigForm(self):
                    591:         """configForm"""
1.48      dwinter   592:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','ChangeECHO_navigation.zpt')).__of__(self)
1.1       dwinter   593:         return pt()
                    594:     
1.84.2.3  dwinter   595:     def ECHO_navigationConfig(self,title,pathToHierarchy,displayedMetaTypes=displayTypes,RESPONSE=None):
1.1       dwinter   596:         """config"""
                    597:         self.title=title
                    598:         self.pathToHierarchy=pathToHierarchy
1.48      dwinter   599:         self.displayedMetaTypes=toList(displayedMetaTypes)[0:]
1.84.2.3  dwinter   600:        
1.1       dwinter   601: 
                    602:         if RESPONSE is not None:
                    603:             RESPONSE.redirect('manage_main')
                    604: 
                    605: 
1.19      dwinter   606:     def getColls(self,obj,depth,checkOnly="no"):
1.1       dwinter   607:         nav={}
                    608:         #print "HERE",obj.
1.18      dwinter   609:         for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
                    610:             x=x_objs[1]
1.22      dwinter   611:             if checkOnly=="yes":
1.19      dwinter   612:                 x = checkOnlyOneInGroup(x)
1.18      dwinter   613:             if depth>1:
                    614:                 nav[x.getId()]=(self.getColls(x,depth-1),x)
                    615:             else:
                    616:                 nav[x.getId()]=(None,x)
1.1       dwinter   617:         return nav
                    618:     
1.19      dwinter   619:     def createNavHash(self,depth,checkOnly="no"):
1.1       dwinter   620:         """Auslesen des Hierarchiebuames"""
                    621:         temp=self.pathToHierarchy[0:]
                    622:         temp=re.sub("/",".",temp)
                    623:         temp="self.aq_parent"+temp
1.40      dwinter   624: 
1.1       dwinter   625:         
                    626:         objtemp=eval(temp)
                    627:         nav={}
1.40      dwinter   628:         
1.41      dwinter   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)]
1.1       dwinter   633: 
1.41      dwinter   634:         # if not generate new hash
                    635:         obj=objtemp      
1.79      dwinter   636:         
1.37      dwinter   637:         for keys in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
1.82      dwinter   638: 
1.37      dwinter   639:             x=keys[1]
1.41      dwinter   640:             if depth>1:
                    641:                 nav[x.getId()]=(self.getColls(x,int(depth)-1,checkOnly),x)
                    642:             else:
                    643:                 nav[x.getId()]=(None,x)
1.37      dwinter   644:             
1.41      dwinter   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)]={}
1.1       dwinter   653: 
1.41      dwinter   654:             for x in nav.keys():
                    655:                 self._v_hash[str(depth)][x]=nav[x]
1.40      dwinter   656: 
1.1       dwinter   657:         return nav
                    658: 
1.32      dwinter   659:     def barFromHash(self,hash,start=None,sortField=None,location=None):
1.1       dwinter   660:         """Erzeuge Navigations Element"""
1.68      dwinter   661:                 
1.1       dwinter   662:         listNav=[]
                    663:         if not start:
                    664:             temp=hash
1.5       dwinter   665:             sortField="weight"
1.41      dwinter   666:         else: # liste mit pfad zum hash
1.1       dwinter   667:             temp=hash
1.7       dwinter   668:             #print "HI",sortField
1.5       dwinter   669:             if not sortField:
                    670:                 tempObj=self.pathToHierarchy[0:]
                    671:                 tempObj=re.sub("/",".",tempObj)
                    672:                 tempObj="self.aq_parent"+tempObj
1.58      dwinter   673:                 #print tempObj
1.5       dwinter   674:                 objtemp=eval(tempObj)
                    675: 
                    676:                 obj=objtemp
                    677: 
                    678:                 for x in start:
1.7       dwinter   679:                     #print "OBJ",start,obj,obj.getId(),x
1.5       dwinter   680: 
                    681:                     obj=getattr(obj,x)
                    682: 
                    683:                 if hasattr(obj,'sortfield'):
                    684:                     sortField=obj.sortfield
                    685:                 else:
                    686:                     sortField='weight'
1.7       dwinter   687:             #print "START",start
1.1       dwinter   688:             for x in start:
1.7       dwinter   689:                 #print "N2",x,temp[x]
                    690:                 try:
1.5       dwinter   691:                     temp=temp[x][0]
1.7       dwinter   692:                 except:
                    693:                     """nothing"""
                    694:                     return []
                    695:             #print "TEMP",temp,self.tempSorted(temp, field=sortField)
1.13      dwinter   696: 
1.5       dwinter   697:         for x in self.tempSorted(temp, field=sortField):
1.77      dwinter   698:            
1.4       dwinter   699:             if not temp[x][1].title == "":
1.35      dwinter   700:                 
                    701:                 if (temp[x][1].meta_type=="ECHO_sqlElement") or (temp[x][1].meta_type=="ECHO_ZCatalogElement"):
1.77      dwinter   702: 
1.4       dwinter   703:                     for z in temp[x][1].getNavList():
1.47      dwinter   704:                         listNav.append((z[0],z[1],None,'',''))
1.37      dwinter   705:             
1.4       dwinter   706:                 else:
1.27      dwinter   707:                     # add label falls existiert und nicht leer
1.7       dwinter   708:                     if hasattr(temp[x][1],'label'):
1.47      dwinter   709:                         
1.71      dwinter   710:                         if not temp[x][1].getLabel()=='':
1.47      dwinter   711:                                 label=temp[x][1].getLabel()
1.7       dwinter   712:                         else:
1.71      dwinter   713:                             try:
                    714:                                 label=temp[x][1].getTitle()
                    715:                             except:
1.79      dwinter   716:                                 logger("ECHO_Nav",logging.ERROR,"%s has neither getLabel nor getTile implemented"%temp[x][1].getId())
1.71      dwinter   717:                                 label=""
1.7       dwinter   718:                     else:
1.69      dwinter   719:                         label=temp[x][1].getTitle()
                    720: 
1.63      dwinter   721:                         
1.51      dwinter   722:                     if location:
1.32      dwinter   723: 
                    724:                         loc=getattr(temp[x][1],'location','top')
                    725:                         if (loc==location):
1.65      dwinter   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','')))
1.32      dwinter   729:                     else:
1.65      dwinter   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
1.1       dwinter   733:         return listNav
                    734: 
1.5       dwinter   735:     def tempSorted(self,hash,field="weight"):
1.4       dwinter   736:         ls=[]
1.13      dwinter   737: 
1.4       dwinter   738:         for x in hash.keys():
                    739:             #print hash[x][1]
1.5       dwinter   740:             if hasattr(hash[x][1],field):
1.52      dwinter   741:                 try:
                    742:                     weight=int(getattr(hash[x][1],field))
                    743:                 except:
                    744:                     weight=getattr(hash[x][1],field)
1.4       dwinter   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:             
1.1       dwinter   758:     def isSelectedPath(self,item):
                    759:         """test is path is already selected"""
1.45      dwinter   760: 
                    761:         testStr=re.sub("/index_html",'',self.REQUEST.get('URL',''))
1.70      dwinter   762:    
                    763:    if len(item)<2:
                    764:        return 0
1.84      casties   765:         #falls exakte Uebereinstimmung dann immer 1
1.70      dwinter   766:         if  (testStr==item[1]) and (self.REQUEST.get('QUERY_STRING','')==''):
1.45      dwinter   767:             
                    768:             return 1
                    769:            
                    770:         found=re.search("\?(.*)",item[1])
1.43      dwinter   771:         
1.1       dwinter   772:         if found:
                    773:             temp=re.sub(" ","%20",found.group(0))
1.45      dwinter   774:           
1.1       dwinter   775:             #print temp+"::"+self.REQUEST['QUERY_STRING']
                    776:             if ("?"+self.REQUEST['QUERY_STRING'])==temp:
1.43      dwinter   777:                 if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
                    778:                 
                    779:                     return 2
                    780:                 else:
                    781:                     return 1
                    782: 
1.44      dwinter   783:         if (getattr(item[2],'meta_type','')=="ECHO_pageTemplate") and (re.search(item[1],self.REQUEST['URL'])):
1.43      dwinter   784:             if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
                    785:                 
                    786:                 return 2
                    787:             else:
1.1       dwinter   788:                 return 1
                    789: 
1.26      dwinter   790:         if re.search(item[1]+"/",self.REQUEST['URL']):
1.43      dwinter   791:             if getattr(item[2],'isAlwaysClickable',None): #immer auswaehlbar?
                    792:                 
                    793:                 return 2
                    794:             else:
                    795:                 return 1
1.1       dwinter   796:         else:
                    797:             return 0
1.57      casties   798:     
                    799: 
                    800:     def getPathStyle(self, item, style=""):
1.58      dwinter   801:         """returns a string with the given style + 'sel' if the path is already selected."""
1.43      dwinter   802: 
1.58      dwinter   803:         if self.isSelectedPath(item):
                    804:             return style + 'sel'
                    805:         else:
                    806:             return style
1.84.2.2  casties   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
1.1       dwinter   814:         
1.84.2.2  casties   815:         # we use title for the label TODO: add label to ECHO_root
1.84.2.1  casties   816:         crumb = {'obj': self,
                    817:                  'url': self.absolute_url(),
1.84.2.2  casties   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: 
1.84.2.1  casties   825: 
1.1       dwinter   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:         
1.5       dwinter   849:         for key in self.tempSorted(temp):
1.1       dwinter   850:             
                    851:             description=temp[x][1].title
1.65      dwinter   852:             
                    853:             
                    854:             url=createPath(self,self.absolute_url(),temp[key][1].absolute_url(relative=1))
1.2       dwinter   855: 
1.1       dwinter   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=""
1.13      dwinter   869: 
1.1       dwinter   870:         try:
                    871:             keys=self.buttonsFromHash(self.createNavHash(0))
                    872:         except:
                    873:             keys=""
                    874:             
                    875:         return keys
                    876: 
1.32      dwinter   877:     def mainNavElements(self,location=None):
1.1       dwinter   878:         """print main navigation bar"""
                    879:         keys=""
1.12      dwinter   880:         #print "NAVELEMENT",self.getId()
1.5       dwinter   881:         #try:
1.32      dwinter   882:         
                    883:         keys=self.barFromHash(self.createNavHash(0),location=location)
1.12      dwinter   884:         
1.5       dwinter   885:         #except:
                    886:         #    keys=""
1.71      dwinter   887:      
1.1       dwinter   888:         return keys
1.12      dwinter   889: 
                    890:     def numberOfMainNavElements(self):
1.58      dwinter   891:         """number of main elements"""
1.12      dwinter   892: 
1.58      dwinter   893:         return len(self.barFromHash(self.createNavHash(0))) 
1.12      dwinter   894: 
1.29      dwinter   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:     
1.78      dwinter   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:     
1.1       dwinter   921:     def secondNavElements(self):
1.57      casties   922:         """Zweite Ordnung Navigationselemente"""
1.1       dwinter   923:         
1.22      dwinter   924:         hash=self.createNavHash(2,checkOnly="no")
1.82      dwinter   925: 
1.1       dwinter   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:         
1.58      dwinter   933:         #print "AU",self.absolute_url(),splitted
                    934:         #start=[splitted[2]] #orig
1.29      dwinter   935:         startNr= self.startOfHierarchy(splitted)
                    936:         
1.58      dwinter   937:         start=[splitted[startNr]]
                    938:         
1.29      dwinter   939:         #print start
1.68      dwinter   940: 
1.25      dwinter   941:         keys=self.barFromHash(hash,start=start)
1.7       dwinter   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: 
1.28      dwinter   963:         #start=splitted[2:order+1] #orig
1.29      dwinter   964:         startNr= self.startOfHierarchy(splitted)
1.30      dwinter   965:         #print startNr
1.58      dwinter   966:         start=splitted[startNr:order+startNr-1] 
1.1       dwinter   967:         #print start
1.5       dwinter   968:        
1.1       dwinter   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: 
1.6       dwinter  1000: def manage_addECHO_navigationForm(self):
1.1       dwinter  1001:     """Form for adding"""
1.48      dwinter  1002:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_navigation.zpt')).__of__(self)
1.1       dwinter  1003:     return pt()
                   1004: 
1.6       dwinter  1005: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
1.1       dwinter  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: 
1.3       dwinter  1015: 
                   1016: 
1.65      dwinter  1017: def createPath(self,url1,url2):
                   1018:     #bugfix in absolute_url, ploetzlich erschein in absolute_url der physikalische pfad.
                   1019:     
1.66      dwinter  1020:     if self.REQUEST.has_key('VirtualRootPhysicalPath'):
                   1021:         vp="/".join(self.REQUEST['VirtualRootPhysicalPath'])
1.76      dwinter  1022:         if (len(vp)>0):
                   1023:             if vp[0]=="/":
                   1024:                vp=vp[1:]
1.66      dwinter  1025:         
1.76      dwinter  1026:             url2=url2.replace(vp+"/",'')
1.68      dwinter  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,"/")
1.66      dwinter  1035:         
1.65      dwinter  1036:     return url1+"/"+url2
1.4       dwinter  1037: 
                   1038: def sortWeight(x,y):
                   1039:     #print x[1],y[1]
                   1040:     return cmp(x[1],y[1])
1.1       dwinter  1041:     

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