File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.22: download - view: text, annotated - select for diffs - revision graph
Thu May 6 13:35:25 2004 UTC (20 years, 1 month ago) by dwinter
Branches: MAIN
CVS tags: HEAD
navaigation shows now all elements, i.e. also the groups and colls with only one element

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

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