File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.14: download - view: text, annotated - select for diffs - revision graph
Thu Apr 15 11:24:56 2004 UTC (20 years, 2 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
groups added for navigation display

    1: # Objekte zur Erzeugung von Navigationselementen
    2: 
    3: from Globals import DTMLFile
    4: from OFS.Image import Image,cookId
    5: from OFS.Folder import Folder
    6: from OFS.SimpleItem import SimpleItem
    7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    8: from Products.PageTemplates.PageTemplate import PageTemplate
    9: import re
   10: import string
   11: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
   12: import os.path
   13: from Globals import package_home
   14: import urllib
   15: 
   16: class ECHO_contentType(Image):
   17:     """ContentType Object"""
   18: 
   19:     meta_type="ECHO_contentType"
   20: 
   21:     
   22:     manage_options=Image.manage_options+(
   23:         {'label':'Change Description','action':'changeECHO_contentTypeForm'},
   24:        )
   25: 
   26:     def changeECHO_contentTypeForm(self):
   27:         """Change the description text"""
   28:         pt=PageTemplateFile('Products/ECHO_content/zpt/changeECHO_contentType.zpt').__of__(self)
   29:         return pt()
   30: 
   31:     def changeECHO_contentType(self,description,RESPONSE=None):
   32:         """Change the Content"""
   33:         self.description=description
   34:         if RESPONSE is not None:
   35:             RESPONSE.redirect('manage_main')
   36: 
   37: manage_addECHO_contentTypeForm=DTMLFile('dtml/ECHO_contentTypeAdd',globals(),
   38:                              Kind='ECHO_contentType',kind='ECHO_contentType')
   39: 
   40: def manage_addECHO_contentType(self, id, file=None, title='', precondition='', content_type='', description='',
   41:                     REQUEST=None):
   42:     """
   43:     Add a new Image object.
   44: 
   45:     Creates a new Image object 'id' with the contents of 'file'.
   46:     """
   47: 
   48:     id=str(id)
   49:     title=str(title)
   50:     content_type=str(content_type)
   51:     precondition=str(precondition)
   52: 
   53:     id, title = cookId(id, title, file)
   54: 
   55:     self=self.this()
   56: 
   57:     # First, we create the image without data:
   58:     self._setObject(id, ECHO_contentType(id,title,'',content_type, precondition))
   59: 
   60:     self._getOb(id).description=description
   61:         
   62:     # Now we "upload" the data.  By doing this in two steps, we
   63:     # can use a database trick to make the upload more efficient.
   64:     if file:
   65:         self._getOb(id).manage_upload(file)
   66:     if content_type:
   67:         self._getOb(id).content_type=content_type
   68: 
   69:     if REQUEST is not None:
   70:         try:    url=self.DestinationURL()
   71:         except: url=REQUEST['URL1']
   72:         REQUEST.RESPONSE.redirect('%s/manage_main' % url)
   73:     return id
   74: 
   75: 
   76: class ECHO_sqlElement(SimpleItem):
   77:     """Erzeuge navigation aus sql-abfrage"""
   78:     meta_type="ECHO_sqlElement"
   79:     baseUrl=""
   80:     
   81:     def __init__(self,id,title,query,field,searchField,baseUrl,weight,contentType):
   82:         """init"""
   83:         self.id=id
   84:         self.title=title
   85:         self.query=query
   86:         self.field=field
   87:         if searchField=="":
   88:             self.searchField=field
   89:         else:
   90:             self.searchField=searchField
   91:         self.baseUrl=baseUrl
   92:         self.weight=weight
   93:         self.content=contentType
   94: 
   95:     manage_options= SimpleItem.manage_options+(
   96:         {'label':'Main Config','action':'changeECHO_sqlElementForm'},
   97:         )
   98: 
   99:     def getSearchField(self):
  100:         try:
  101:             return self.searchField
  102:         except:
  103:             return self.field
  104:         
  105:     def getWeight(self):
  106:         """get weight"""
  107:         if hasattr(self,'weight'):
  108:             return self.weight
  109:         else:
  110:             return 0
  111:         
  112:     def getcontentType(self):
  113:         """get weight"""
  114:         
  115:         if hasattr(self,'contentType'):
  116:             return self.contentType
  117:         else:
  118:             return 0
  119:         
  120: 
  121:     def changeECHO_sqlElementForm(self):
  122:         """change"""
  123:         
  124:         pt=PageTemplateFile('Products/ECHO_content/zpt/changeECHO_sqlElement.zpt').__of__(self)
  125:         return pt()
  126: 
  127:     def changeECHO_sqlElement(self,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
  128:         """change"""
  129:         self.title=title
  130:         self.query=query
  131:         self.field=field
  132:         self.searchField=searchField
  133:         self.baseUrl=baseUrl
  134:         self.weight=weight
  135:         self.contentType=contentType
  136:         
  137:         if RESPONSE is not None:
  138:             RESPONSE.redirect('manage_main')
  139: 
  140:     def searchQuery(self):
  141:         return self.search(var=self.query)
  142:     
  143:     def getNavList(self):
  144:         """ausgabe der treffer list für navigation"""
  145:         records=self.searchQuery()
  146:         if not records:
  147:             return []
  148:         else:
  149:             ret=[]
  150:             for record in records:
  151:                 try:
  152:                     ret.append((getattr(record,self.field),self.baseUrl+urllib.quote(str(getattr(record,self.getSearchField())))))
  153:                 except:
  154:                     """notrhing"""
  155:                     
  156:             return ret
  157:     
  158: 
  159: def manage_addECHO_sqlElementForm(self):
  160:     """Form for adding"""
  161:     pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_sqlElement.zpt').__of__(self)
  162:     return pt()
  163: 
  164: def manage_addECHO_sqlElement(self,id,title,query,field,searchField,baseUrl,weight,contentType,RESPONSE=None):
  165:     """Add an ECHO_sqlelement"""
  166:     self._setObject(id,ECHO_sqlElement(id,title,query,field,searchField,baseUrl,weight,contentType))
  167:     
  168:     if RESPONSE is not None:
  169:         RESPONSE.redirect('manage_main')
  170: 
  171: 
  172: class ECHO_pageTemplate(ZopePageTemplate):
  173:     """pageTemplate Objekt"""
  174:     meta_type="ECHO_pageTemplate"
  175: 
  176:     _default_content_fn = os.path.join(package_home(globals()),
  177:                                        'html/ECHO_pageTemplateDefault.html')
  178: 
  179:     manage_options=ZopePageTemplate.manage_options+(
  180:         {'label':'Weight and Type','action':'changeECHO_pageTemplateWeightForm'},
  181:         )
  182: 
  183:     def changeECHO_pageTemplateWeightForm(self):
  184:         """change"""
  185:         pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_pageTemplateWeight.zpt').__of__(self)
  186:         return pt()
  187: 
  188:     def changeECHO_pageTemplateWeight(self,weight,contentType,RESPONSE=None):
  189:         """change"""
  190:         self.weight=weight
  191:         self.contentType=contentType
  192: 
  193:         if RESPONSE is not None:
  194:             RESPONSE.redirect('manage_main')
  195:         
  196:     def getWeight(self):
  197:         """get weight"""
  198:         if hasattr(self,'weight'):
  199:             return self.weight
  200:         else:
  201:             return 0
  202:         
  203:     def getcontentType(self):
  204:         """get weight"""
  205:         if hasattr(self,'weight'):
  206:             return self.weight
  207:         else:
  208:             return 0
  209: 
  210: 
  211: 
  212: 
  213:     ## def __init__(self, id, text=None, contentType=None):
  214: ##         self.id = str(id)
  215: ##         self.ZBindings_edit(self._default_bindings)
  216: ##         if text is None:
  217: ##             text = open(self._default_cont).read()
  218: ##         self.pt_edit(text, contentType)
  219: 
  220: def manage_addECHO_pageTemplateForm(self):
  221:     """Form for adding"""
  222:     pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_pageTemplate.zpt').__of__(self)
  223:     return pt()
  224: 
  225: from urllib import quote
  226: 
  227: 
  228: def manage_addECHO_pageTemplate(self, id, weight= 0,contentType=0,title=None, text=None,
  229:                            REQUEST=None, submit=None):
  230:     "Add a Page Template with optional file content."
  231: 
  232:     
  233:     id = str(id)
  234:     if REQUEST is None:
  235:         self._setObject(id, ECHO_pageTemplate(id, text))
  236:         ob = getattr(self, id)
  237:         setattr(ob,'weight',weight)
  238:         setattr(ob,'contentType',contentType)
  239:         if title:
  240:             ob.pt_setTitle(title)
  241:         return ob
  242:     else:
  243:         file = REQUEST.form.get('file')
  244:         headers = getattr(file, 'headers', None)
  245:         if headers is None or not file.filename:
  246:             zpt = ECHO_pageTemplate(id)
  247:         else:
  248:             zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
  249: 
  250:         self._setObject(id, zpt)
  251:         ob = getattr(self, id)
  252:         setattr(ob,'weight',weight)
  253:         if title:
  254:             ob.pt_setTitle(title)
  255:         
  256:         try:
  257:             u = self.DestinationURL()
  258:         except AttributeError:
  259:             u = REQUEST['URL1']
  260: 
  261:         if submit == " Add and Edit ":
  262:             u = "%s/%s" % (u, quote(id))
  263:         REQUEST.RESPONSE.redirect(u+'/manage_main')
  264:     return ''
  265: 
  266: 
  267: class ECHO_navigation(Folder):
  268:     """Navigations Element"""
  269:     meta_type="ECHO_Navigation"
  270: 
  271:     displayedMetaTypes=['ECHO_group','ImageCollectionIFrame','ECHO_collection','ECHO_pageTemplate','ZSQLExtendFolder','ECHO_sqlElement','ECHO_resource','ECHO_externalLink']
  272:     
  273:     def __init__(self,id,title,pathToHierarchy):
  274:         """init"""
  275:         self.id=id
  276:         self.title=title
  277:         self.pathToHierarchy=pathToHierarchy
  278: 
  279:     manage_options = Folder.manage_options+(
  280:         {'label':'Main Config','action':'ECHO_navigationConfigForm'},
  281:         )
  282: 
  283:     def ECHO_navigationConfigForm(self):
  284:         """configForm"""
  285:         pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_navigation.zpt').__of__(self)
  286:         return pt()
  287:     
  288:     def ECHO_navigationConfig(self,title,pathToHierarchy,RESPONSE=None):
  289:         """config"""
  290:         self.title=title
  291:         self.pathToHierarchy=pathToHierarchy
  292: 
  293:         if RESPONSE is not None:
  294:             RESPONSE.redirect('manage_main')
  295: 
  296: 
  297:     def getColls(self,obj,depth):
  298:         nav={}
  299:         #print "HERE",obj.
  300:         for keys in obj.__dict__.keys():
  301:             x=getattr(obj,keys)
  302:             if hasattr(x,"meta_type"):
  303:                 if x.meta_type in self.displayedMetaTypes:
  304:                     if depth>1:
  305:                         nav[x.getId()]=(self.getColls(x,depth-1),x)
  306:                     else:
  307:                         nav[x.getId()]=(None,x)
  308:         return nav
  309:     
  310:     def createNavHash(self,depth):
  311:         """Auslesen des Hierarchiebuames"""
  312:         temp=self.pathToHierarchy[0:]
  313:         temp=re.sub("/",".",temp)
  314:         temp="self.aq_parent"+temp
  315:         
  316:         objtemp=eval(temp)
  317:         nav={}
  318:         obj=objtemp
  319:         
  320:         #exec(obj)
  321: 
  322:         #objtemp = compile(temp,'<string>','single')
  323:         #obj=eval(objtemp)
  324:         #print obj 
  325:         
  326:         #print obj.__dict__.keys()
  327:         
  328:         for keys in obj.__dict__.keys():
  329:             x=getattr(obj,keys)
  330:             if hasattr(x,"meta_type"):
  331:                 #print x.meta_type
  332:                 if x.meta_type in self.displayedMetaTypes:
  333:                    
  334:                     if depth>1:
  335:                         nav[x.getId()]=(self.getColls(x,int(depth)-1),x)
  336:                     else:
  337:                         nav[x.getId()]=(None,x)
  338:                     
  339: 
  340:         #print nav
  341:         return nav
  342: 
  343:     def barFromHash(self,hash,start=None,sortField=None):
  344:         """Erzeuge Navigations Element"""
  345:         #print "hash",hash
  346:         listNav=[]
  347:         if not start:
  348:             temp=hash
  349:             sortField="weight"
  350:         else: # list mit pfad zum hash
  351:             temp=hash
  352:             #print "HI",sortField
  353:             if not sortField:
  354:                 tempObj=self.pathToHierarchy[0:]
  355:                 tempObj=re.sub("/",".",tempObj)
  356:                 tempObj="self.aq_parent"+tempObj
  357: 
  358:                 objtemp=eval(tempObj)
  359: 
  360:                 obj=objtemp
  361: 
  362:                 for x in start:
  363:                     #print "OBJ",start,obj,obj.getId(),x
  364: 
  365:                     obj=getattr(obj,x)
  366: 
  367:                 if hasattr(obj,'sortfield'):
  368:                     sortField=obj.sortfield
  369:                 else:
  370:                     sortField='weight'
  371:             #print "START",start
  372:             for x in start:
  373:                 #print "N2",x,temp[x]
  374:                 try:
  375:                     temp=temp[x][0]
  376:                 except:
  377:                     """nothing"""
  378:                     return []
  379:             #print "TEMP",temp,self.tempSorted(temp, field=sortField)
  380: 
  381:         for x in self.tempSorted(temp, field=sortField):
  382:             if not temp[x][1].title == "":
  383:                 if temp[x][1].meta_type=="ECHO_sqlElement":
  384:                     for z in temp[x][1].getNavList():
  385:                         listNav.append((z[0],z[1]))
  386:                 else:
  387:                     # add label fals existiert und nicht leer
  388:                     if hasattr(temp[x][1],'label'):
  389:                         if not temp[x][1].label=='':
  390:                             label=temp[x][1].label
  391:                             
  392:                         else:
  393:                             label=temp[x][1].title
  394:                     else:
  395:                         label=temp[x][1].title                            
  396:                     
  397:                     listNav.append((label,createPath(self.absolute_url(),temp[x][1].absolute_url()),temp[x][1]))
  398:                     
  399:         #print self.getId(),start
  400:         #print listNav
  401: 
  402:         #html=""
  403:         #for k in listNav:
  404:         #    print k
  405:         #    html=html+"<a href='%s'>%s</a>   "% (self.absolute_url()+createPath(k[1][1].absolute_url()),k[0])
  406: 
  407:         return listNav
  408: 
  409:     def tempSorted(self,hash,field="weight"):
  410:         ls=[]
  411: 
  412:         for x in hash.keys():
  413:             #print hash[x][1]
  414:             if hasattr(hash[x][1],field):
  415:                 weight=getattr(hash[x][1],field)
  416:                 #print weight
  417:             else:
  418:                 weight=0
  419: 
  420:             ls.append((x,weight))
  421: 
  422:         ls.sort(sortWeight)
  423:         
  424:         return [x[0] for x in ls]
  425: 
  426:     
  427:         
  428:             
  429:     def isSelectedPath(self,item):
  430:         """test is path is already selected"""
  431:         found=re.search("\?(.*)",item[1])
  432:         if found:
  433:             temp=re.sub(" ","%20",found.group(0))
  434:             #print temp+"::"+self.REQUEST['QUERY_STRING']
  435:             if ("?"+self.REQUEST['QUERY_STRING'])==temp:
  436:                 return 1
  437: 
  438:         if re.search(item[1],self.REQUEST['URL']):
  439:             return 1
  440:         else:
  441:             return 0
  442:         
  443:     
  444:     def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
  445:         
  446:         """Generate Buttons"""
  447:         if orientation=="horizontal":
  448:             html="<table><tr>"
  449:             startTag="<td>"
  450:             endTag="</td>"
  451:             endHtml="</tr></table>"
  452: 
  453:         else:
  454:             html="<table>"
  455:             startTag="<tr><td>"
  456:             endTag="</td></tr>"
  457:             endHtml="</table>"
  458:             
  459:         if not start:
  460:             temp=hash
  461:         else:
  462:             temp=hash
  463:             for x in start:
  464:                 temp=temp[x][0]
  465:                 #print temp
  466:         
  467:         for key in self.tempSorted(temp):
  468:             
  469:             description=temp[x][1].title
  470:          
  471:             url=createPath(self.absolute_url(),temp[key][1].absolute_url())
  472: 
  473:             if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
  474:                 html=html+startTag+"[%s]" % description+endTag
  475:             else:                
  476:                 html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
  477:             
  478: 
  479:         html=html+endHtml
  480:         
  481:         return html
  482: 
  483:     def mainNavBar(self):
  484:         """print main navigation bar"""
  485:         keys=""
  486: 
  487:         try:
  488:             keys=self.buttonsFromHash(self.createNavHash(0))
  489:         except:
  490:             keys=""
  491:             
  492:         return keys
  493: 
  494:     def mainNavElements(self):
  495:         """print main navigation bar"""
  496:         keys=""
  497:         #print "NAVELEMENT",self.getId()
  498:         #try:
  499:       
  500:         keys=self.barFromHash(self.createNavHash(0))
  501:         
  502:         #except:
  503:         #    keys=""
  504:             
  505:         return keys
  506: 
  507:     def numberOfMainNavElements(self):
  508: 	"""number of main elements"""
  509: 
  510: 	return len(self.barFromHash(self.createNavHash(0))) 
  511: 
  512:     def secondNavElements(self):
  513:         """Zweite Ordnung"""
  514:         
  515:         hash=self.createNavHash(2)
  516:         actual_url=self.REQUEST['URL']
  517:         
  518:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  519:         #print ult_temp
  520: 
  521:         splitted=ult_temp.split("/")
  522:         
  523: 
  524:         ## if splitted[len(splitted)-1]=="index_html":
  525: ##             start=[splitted[len(splitted)-2]]
  526: ##         else:
  527: ##             start=[splitted[len(splitted)-1]]
  528: 
  529:         start=[splitted[2]]
  530:         #print start
  531:        
  532:         keys=self.barFromHash(hash,start=start)
  533:         
  534:         
  535:         return keys
  536: 
  537:     def navElements(self,order):
  538:         """n-te Ordnung"""
  539:         
  540:         hash=self.createNavHash(order)
  541:         actual_url=self.REQUEST['URL']
  542:         
  543:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  544:         #print ult_temp
  545: 
  546:         splitted=ult_temp.split("/")
  547:         
  548: 
  549:         ## if splitted[len(splitted)-1]=="index_html":
  550: ##             start=[splitted[len(splitted)-2]]
  551: ##         else:
  552: ##             start=[splitted[len(splitted)-1]]
  553: 
  554:         start=splitted[2:order+1]
  555:         #print start
  556:        
  557:         keys=self.barFromHash(hash,start=start)
  558:         
  559:         
  560:         return keys
  561: 
  562: 
  563:     def secondNavBar(self):
  564:         """Zweite Ordnung"""
  565: 
  566:         hash=self.createNavHash(2)
  567:         actual_url=self.REQUEST['URL']
  568:         
  569:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  570:         #print ult_temp
  571: 
  572:         splitted=ult_temp.split("/")
  573:         
  574: 
  575:         ## if splitted[len(splitted)-1]=="index_html":
  576: ##             start=[splitted[len(splitted)-2]]
  577: ##         else:
  578: ##             start=[splitted[len(splitted)-1]]
  579: 
  580:         start=[splitted[2]]
  581:         #print start
  582:         
  583:         keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
  584:         
  585:         
  586:         return keys
  587: 
  588: def manage_addECHO_navigationForm(self):
  589:     """Form for adding"""
  590:     pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_navigation.zpt').__of__(self)
  591:     return pt()
  592: 
  593: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
  594:     """Add an ECHO_root"""
  595:     self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
  596:     
  597:     if RESPONSE is not None:
  598:         RESPONSE.redirect('manage_main')
  599: 
  600: 
  601: #helpers
  602: 
  603: 
  604: 
  605: def createPath(url1,url2):
  606:     temp1=url1.split("/")
  607:     temp2=url2.split("/")
  608:     for test in temp1:
  609:         if temp2[0]==test:
  610:             del temp2[0]
  611: 
  612:     return url1+"/"+string.join(temp2,"/")
  613: 
  614: def sortWeight(x,y):
  615:     #print x[1],y[1]
  616:     return cmp(x[1],y[1])
  617:     

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