File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Thu Feb 5 17:13:18 2004 UTC (20 years, 4 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
added sorting by different fields

    1: # Objekte zur Erzeugung von Navigationselementen
    2: 
    3: 
    4: from OFS.Folder import Folder
    5: from OFS.SimpleItem import SimpleItem
    6: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    7: from Products.PageTemplates.PageTemplate import PageTemplate
    8: import re
    9: import string
   10: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
   11: import os.path
   12: from Globals import package_home
   13: import urllib
   14: 
   15: class ECHO_sqlElement(SimpleItem):
   16:     """Erzeuge navigation aus sql-abfrage"""
   17:     meta_type="ECHO_sqlElement"
   18:     baseUrl=""
   19:     
   20:     def __init__(self,id,title,query,field,baseUrl,weight):
   21:         """init"""
   22:         self.id=id
   23:         self.title=title
   24:         self.query=query
   25:         self.field=field
   26:         self.baseUrl=baseUrl
   27:         self.weight=weight
   28: 
   29:     manage_options= SimpleItem.manage_options+(
   30:         {'label':'Main Config','action':'changeECHO_sqlElementForm'},
   31:         )
   32: 
   33:     def getWeight(self):
   34:         """get weight"""
   35:         if hasattr(self,'weight'):
   36:             return self.weight
   37:         else:
   38:             return 0
   39:         
   40:         
   41: 
   42:     def changeECHO_sqlElementForm(self):
   43:         """change"""
   44:         pt=PageTemplateFile('Products/ECHO_content/ChangeECHO_sqlElement.zpt').__of__(self)
   45:         return pt()
   46: 
   47:     def changeECHO_sqlElement(self,title,query,field,baseUrl,weight,RESPONSE=None):
   48:         """change"""
   49:         self.title=title
   50:         self.query=query
   51:         self.field=field
   52:         self.baseUrl=baseUrl
   53:         self.weight=weight
   54: 
   55:         if RESPONSE is not None:
   56:             RESPONSE.redirect('manage_main')
   57: 
   58:     def searchQuery(self):
   59:         return self.search(var=self.query)
   60:     
   61:     def getNavList(self):
   62:         """ausgabe der treffer list für navigation"""
   63:         records=self.searchQuery()
   64:         if not records:
   65:             return []
   66:         else:
   67:             ret=[]
   68:             for record in records:
   69:                 ret.append((getattr(record,self.field),self.baseUrl+str(getattr(record,self.field))))
   70:             return ret
   71:     
   72: 
   73: def manage_AddECHO_sqlElementForm(self):
   74:     """Form for adding"""
   75:     pt=PageTemplateFile('Products/ECHO_content/AddECHO_sqlElement.zpt').__of__(self)
   76:     return pt()
   77: 
   78: def manage_AddECHO_sqlElement(self,id,title,query,field,baseUrl,RESPONSE=None):
   79:     """Add an ECHO_sqlelement"""
   80:     self._setObject(id,ECHO_sqlElement(id,title,query,field,baseUrl))
   81:     
   82:     if RESPONSE is not None:
   83:         RESPONSE.redirect('manage_main')
   84: 
   85: 
   86: class ECHO_pageTemplate(ZopePageTemplate):
   87:     """pageTemplate Objekt"""
   88:     meta_type="ECHO_pageTemplate"
   89: 
   90:     _default_content_fn = os.path.join(package_home(globals()),
   91:                                        'ECHO_pageTemplateDefault.html')
   92: 
   93:     manage_options=ZopePageTemplate.manage_options+(
   94:         {'label':'Weight','action':'changeECHO_pageTemplateWeightForm'},
   95:         )
   96: 
   97:     def changeECHO_pageTemplateWeightForm(self):
   98:         """change"""
   99:         pt=PageTemplateFile('Products/ECHO_content/ChangeECHO_pageTemplateWeight.zpt').__of__(self)
  100:         return pt()
  101: 
  102:     def changeECHO_pageTemplateWeight(self,weight,RESPONSE=None):
  103:         """change"""
  104:         self.weight=weight
  105: 
  106:         if RESPONSE is not None:
  107:             RESPONSE.redirect('manage_main')
  108:         
  109:     def getWeight(self):
  110:         """get weight"""
  111:         if hasattr(self,'weight'):
  112:             return self.weight
  113:         else:
  114:             return 0
  115: 
  116: 
  117: 
  118:     ## def __init__(self, id, text=None, content_type=None):
  119: ##         self.id = str(id)
  120: ##         self.ZBindings_edit(self._default_bindings)
  121: ##         if text is None:
  122: ##             text = open(self._default_cont).read()
  123: ##         self.pt_edit(text, content_type)
  124: 
  125: def manage_AddECHO_pageTemplateForm(self):
  126:     """Form for adding"""
  127:     pt=PageTemplateFile('Products/ECHO_content/AddECHO_pageTemplate.zpt').__of__(self)
  128:     return pt()
  129: 
  130: from urllib import quote
  131: 
  132: 
  133: def manage_AddECHO_pageTemplate(self, id, weight= 0,title=None, text=None,
  134:                            REQUEST=None, submit=None):
  135:     "Add a Page Template with optional file content."
  136: 
  137:     
  138:     id = str(id)
  139:     if REQUEST is None:
  140:         self._setObject(id, ECHO_pageTemplate(id, text))
  141:         ob = getattr(self, id)
  142:         setattr(ob,'weight',weight)
  143:         if title:
  144:             ob.pt_setTitle(title)
  145:         return ob
  146:     else:
  147:         file = REQUEST.form.get('file')
  148:         headers = getattr(file, 'headers', None)
  149:         if headers is None or not file.filename:
  150:             zpt = ECHO_pageTemplate(id)
  151:         else:
  152:             zpt = ECHO_pageTemplate(id, file, headers.get('content_type'))
  153: 
  154:         self._setObject(id, zpt)
  155:         ob = getattr(self, id)
  156:         setattr(ob,'weight',weight)
  157: 
  158:         try:
  159:             u = self.DestinationURL()
  160:         except AttributeError:
  161:             u = REQUEST['URL1']
  162: 
  163:         if submit == " Add and Edit ":
  164:             u = "%s/%s" % (u, quote(id))
  165:         REQUEST.RESPONSE.redirect(u+'/manage_main')
  166:     return ''
  167: 
  168: 
  169: class ECHO_navigation(Folder):
  170:     """Navigations Element"""
  171:     meta_type="ECHO_Navigation"
  172: 
  173:     displayedMetaTypes=['ECHO_collection','ECHO_pageTemplate','ZSQLExtendFolder','ECHO_sqlElement']
  174:     
  175:     def __init__(self,id,title,pathToHierarchy):
  176:         """init"""
  177:         self.id=id
  178:         self.title=title
  179:         self.pathToHierarchy=pathToHierarchy
  180: 
  181:     manage_options = Folder.manage_options+(
  182:         {'label':'Main Config','action':'ECHO_navigationConfigForm'},
  183:         )
  184: 
  185:     def ECHO_navigationConfigForm(self):
  186:         """configForm"""
  187:         pt=PageTemplateFile('Products/ECHO_content/ChangeECHO_navigation.zpt').__of__(self)
  188:         return pt()
  189:     
  190:     def ECHO_navigationConfig(self,title,pathToHierarchy,RESPONSE=None):
  191:         """config"""
  192:         self.title=title
  193:         self.pathToHierarchy=pathToHierarchy
  194: 
  195:         if RESPONSE is not None:
  196:             RESPONSE.redirect('manage_main')
  197: 
  198: 
  199:     def getColls(self,obj,depth):
  200:         nav={}
  201:         #print "HERE",obj.
  202:         for keys in obj.__dict__.keys():
  203:             x=getattr(obj,keys)
  204:             if hasattr(x,"meta_type"):
  205:                 if x.meta_type in self.displayedMetaTypes:
  206:                     if depth>1:
  207:                         nav[x.getId()]=(self.getColls(x,depth-1),x)
  208:                     else:
  209:                         nav[x.getId()]=(None,x)
  210:         return nav
  211:     
  212:     def createNavHash(self,depth):
  213:         """Auslesen des Hierarchiebuames"""
  214:         temp=self.pathToHierarchy[0:]
  215:         temp=re.sub("/",".",temp)
  216:         temp="self.aq_parent"+temp
  217:         
  218:         objtemp=eval(temp)
  219:         nav={}
  220:         obj=objtemp
  221:         
  222:         #exec(obj)
  223: 
  224:         #objtemp = compile(temp,'<string>','single')
  225:         #obj=eval(objtemp)
  226:         #print obj 
  227:         
  228:         #print obj.__dict__.keys()
  229:         
  230:         for keys in obj.__dict__.keys():
  231:             x=getattr(obj,keys)
  232:             if hasattr(x,"meta_type"):
  233:                 #print x.meta_type
  234:                 if x.meta_type in self.displayedMetaTypes:
  235:                    
  236:                     if depth>1:
  237:                         nav[x.getId()]=(self.getColls(x,int(depth)-1),x)
  238:                     else:
  239:                         nav[x.getId()]=(None,x)
  240:                     
  241: 
  242:         #print nav
  243:         return nav
  244: 
  245:     def barFromHash(self,hash,start=None,sortField=None):
  246:         """Erzeuge Navigations Element"""
  247:         #print "hash",hash
  248:         listNav=[]
  249:         if not start:
  250:             temp=hash
  251:             sortField="weight"
  252:         else: # list mit pfad zum hash
  253:             temp=hash
  254:             print "HI",sortField
  255:             if not sortField:
  256:                 tempObj=self.pathToHierarchy[0:]
  257:                 tempObj=re.sub("/",".",tempObj)
  258:                 tempObj="self.aq_parent"+tempObj
  259: 
  260:                 objtemp=eval(tempObj)
  261: 
  262:                 obj=objtemp
  263: 
  264:                 for x in start:
  265: 
  266: 
  267:                     obj=getattr(obj,x)
  268: 
  269:                 if hasattr(obj,'sortfield'):
  270:                     sortField=obj.sortfield
  271:                 else:
  272:                     sortField='weight'
  273:             for x in start:
  274:                     temp=temp[x][0]
  275:         print "HELL",sortField
  276:         for x in self.tempSorted(temp, field=sortField):
  277:             if not temp[x][1].title == "":
  278:                 if temp[x][1].meta_type=="ECHO_sqlElement":
  279:                     for z in temp[x][1].getNavList():
  280:                         listNav.append((z[0],z[1]))
  281:                 else:
  282:                     listNav.append((temp[x][1].title,createPath(self.absolute_url(),temp[x][1].absolute_url())))
  283:                     
  284:         print self.getId(),start
  285:         print listNav
  286: 
  287:         #html=""
  288:         #for k in listNav:
  289:         #    print k
  290:         #    html=html+"<a href='%s'>%s</a>   "% (self.absolute_url()+createPath(k[1][1].absolute_url()),k[0])
  291: 
  292:         return listNav
  293: 
  294:     def tempSorted(self,hash,field="weight"):
  295:         ls=[]
  296:         print "SORT",field
  297:         for x in hash.keys():
  298:             #print hash[x][1]
  299:             if hasattr(hash[x][1],field):
  300:                 weight=getattr(hash[x][1],field)
  301:                 #print weight
  302:             else:
  303:                 weight=0
  304: 
  305:             ls.append((x,weight))
  306: 
  307:         ls.sort(sortWeight)
  308:         
  309:         return [x[0] for x in ls]
  310: 
  311:     
  312:         
  313:             
  314:     def isSelectedPath(self,item):
  315:         """test is path is already selected"""
  316:         found=re.search("\?(.*)",item[1])
  317:         if found:
  318:             temp=re.sub(" ","%20",found.group(0))
  319:             #print temp+"::"+self.REQUEST['QUERY_STRING']
  320:             if ("?"+self.REQUEST['QUERY_STRING'])==temp:
  321:                 return 1
  322: 
  323:         if re.search(item[1],self.REQUEST['URL']):
  324:             return 1
  325:         else:
  326:             return 0
  327:         
  328:     
  329:     def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
  330:         
  331:         """Generate Buttons"""
  332:         if orientation=="horizontal":
  333:             html="<table><tr>"
  334:             startTag="<td>"
  335:             endTag="</td>"
  336:             endHtml="</tr></table>"
  337: 
  338:         else:
  339:             html="<table>"
  340:             startTag="<tr><td>"
  341:             endTag="</td></tr>"
  342:             endHtml="</table>"
  343:             
  344:         if not start:
  345:             temp=hash
  346:         else:
  347:             temp=hash
  348:             for x in start:
  349:                 temp=temp[x][0]
  350:                 #print temp
  351:         
  352:         for key in self.tempSorted(temp):
  353:             
  354:             description=temp[x][1].title
  355:          
  356:             url=createPath(self.absolute_url(),temp[key][1].absolute_url())
  357: 
  358:             if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
  359:                 html=html+startTag+"[%s]" % description+endTag
  360:             else:                
  361:                 html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
  362:             
  363: 
  364:         html=html+endHtml
  365:         
  366:         return html
  367: 
  368:     def mainNavBar(self):
  369:         """print main navigation bar"""
  370:         keys=""
  371:         print "NAVBAR",self.getId()
  372:         try:
  373:             keys=self.buttonsFromHash(self.createNavHash(0))
  374:         except:
  375:             keys=""
  376:             
  377:         return keys
  378: 
  379:     def mainNavElements(self):
  380:         """print main navigation bar"""
  381:         keys=""
  382:         print "NAVELEMENT",self.getId()
  383:         #try:
  384:       
  385:         keys=self.barFromHash(self.createNavHash(0))
  386: 
  387:         #except:
  388:         #    keys=""
  389:             
  390:         return keys
  391:     
  392:     def secondNavElements(self):
  393:         """Zweite Ordnung"""
  394:         
  395:         hash=self.createNavHash(2)
  396:         actual_url=self.REQUEST['URL']
  397:         
  398:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  399:         #print ult_temp
  400: 
  401:         splitted=ult_temp.split("/")
  402:         
  403: 
  404:         ## if splitted[len(splitted)-1]=="index_html":
  405: ##             start=[splitted[len(splitted)-2]]
  406: ##         else:
  407: ##             start=[splitted[len(splitted)-1]]
  408: 
  409:         start=[splitted[2]]
  410:         #print start
  411:        
  412:         keys=self.barFromHash(hash,start=start)
  413:         
  414:         
  415:         return keys
  416: 
  417: 
  418:     def secondNavBar(self):
  419:         """Zweite Ordnung"""
  420: 
  421:         hash=self.createNavHash(2)
  422:         actual_url=self.REQUEST['URL']
  423:         
  424:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  425:         #print ult_temp
  426: 
  427:         splitted=ult_temp.split("/")
  428:         
  429: 
  430:         ## if splitted[len(splitted)-1]=="index_html":
  431: ##             start=[splitted[len(splitted)-2]]
  432: ##         else:
  433: ##             start=[splitted[len(splitted)-1]]
  434: 
  435:         start=[splitted[2]]
  436:         #print start
  437:         
  438:         keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
  439:         
  440:         
  441:         return keys
  442: 
  443: def manage_AddECHO_navigationForm(self):
  444:     """Form for adding"""
  445:     pt=PageTemplateFile('Products/ECHO_content/AddECHO_navigation.zpt').__of__(self)
  446:     return pt()
  447: 
  448: def manage_AddECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
  449:     """Add an ECHO_root"""
  450:     self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
  451:     
  452:     if RESPONSE is not None:
  453:         RESPONSE.redirect('manage_main')
  454: 
  455: 
  456: #helpers
  457: 
  458: 
  459: 
  460: def createPath(url1,url2):
  461:     temp1=url1.split("/")
  462:     temp2=url2.split("/")
  463:     for test in temp1:
  464:         if temp2[0]==test:
  465:             del temp2[0]
  466: 
  467:     return url1+"/"+string.join(temp2,"/")
  468: 
  469: def sortWeight(x,y):
  470:     #print x[1],y[1]
  471:     return cmp(x[1],y[1])
  472:     

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