File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.18: download - view: text, annotated - select for diffs - revision graph
Thu May 6 10:27:07 2004 UTC (20 years, 1 month ago) by dwinter
Branches: MAIN
CVS tags: HEAD
added group_index_template, group fällt nun weg, wennnur ein element inder navigation.

    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):
  307:         nav={}
  308:         #print "HERE",obj.
  309:         for x_objs in obj.ZopeFind(obj,obj_metatypes=self.displayedMetaTypes):
  310:             x=x_objs[1]
  311:             x = checkOnlyOneInGroup(x)
  312:             if depth>1:
  313:                 nav[x.getId()]=(self.getColls(x,depth-1),x)
  314:             else:
  315:                 nav[x.getId()]=(None,x)
  316:         return nav
  317:     
  318:     def createNavHash(self,depth):
  319:         """Auslesen des Hierarchiebuames"""
  320:         temp=self.pathToHierarchy[0:]
  321:         temp=re.sub("/",".",temp)
  322:         temp="self.aq_parent"+temp
  323:         
  324:         objtemp=eval(temp)
  325:         nav={}
  326:         obj=objtemp
  327: 
  328:         
  329:         for keys in obj.__dict__.keys():
  330:             x=getattr(obj,keys)
  331:             if hasattr(x,"meta_type"):
  332: 
  333:                 if x.meta_type in self.displayedMetaTypes:
  334:                    
  335:                     if depth>1:
  336:                         nav[x.getId()]=(self.getColls(x,int(depth)-1),x)
  337:                     else:
  338:                         nav[x.getId()]=(None,x)
  339:                     
  340: 
  341:         #print nav
  342:         return nav
  343: 
  344:     def barFromHash(self,hash,start=None,sortField=None):
  345:         """Erzeuge Navigations Element"""
  346:         #print "hash",hash
  347:         listNav=[]
  348:         if not start:
  349:             temp=hash
  350:             sortField="weight"
  351:         else: # list mit pfad zum hash
  352:             temp=hash
  353:             #print "HI",sortField
  354:             if not sortField:
  355:                 tempObj=self.pathToHierarchy[0:]
  356:                 tempObj=re.sub("/",".",tempObj)
  357:                 tempObj="self.aq_parent"+tempObj
  358: 
  359:                 objtemp=eval(tempObj)
  360: 
  361:                 obj=objtemp
  362: 
  363:                 for x in start:
  364:                     #print "OBJ",start,obj,obj.getId(),x
  365: 
  366:                     obj=getattr(obj,x)
  367: 
  368:                 if hasattr(obj,'sortfield'):
  369:                     sortField=obj.sortfield
  370:                 else:
  371:                     sortField='weight'
  372:             #print "START",start
  373:             for x in start:
  374:                 #print "N2",x,temp[x]
  375:                 try:
  376:                     temp=temp[x][0]
  377:                 except:
  378:                     """nothing"""
  379:                     return []
  380:             #print "TEMP",temp,self.tempSorted(temp, field=sortField)
  381: 
  382:         for x in self.tempSorted(temp, field=sortField):
  383:             if not temp[x][1].title == "":
  384:                 if temp[x][1].meta_type=="ECHO_sqlElement":
  385:                     for z in temp[x][1].getNavList():
  386:                         listNav.append((z[0],z[1],None))
  387:                 else:
  388:                     # add label fals existiert und nicht leer
  389:                     if hasattr(temp[x][1],'label'):
  390:                         if not temp[x][1].label=='':
  391:                             label=temp[x][1].label.encode('utf-8')
  392:                             
  393:                         else:
  394:                             label=temp[x][1].title.encode('utf-8')
  395:                     else:
  396:                         label=temp[x][1].title.encode('utf-8')                            
  397:                     
  398:                     listNav.append((label,createPath(self.absolute_url(),temp[x][1].absolute_url()),temp[x][1]))
  399:                     
  400:         #print self.getId(),start
  401:         #print listNav
  402: 
  403:         #html=""
  404:         #for k in listNav:
  405:         #    print k
  406:         #    html=html+"<a href='%s'>%s</a>   "% (self.absolute_url()+createPath(k[1][1].absolute_url()),k[0])
  407: 
  408:         return listNav
  409: 
  410:     def tempSorted(self,hash,field="weight"):
  411:         ls=[]
  412: 
  413:         for x in hash.keys():
  414:             #print hash[x][1]
  415:             if hasattr(hash[x][1],field):
  416:                 weight=getattr(hash[x][1],field)
  417:                 #print weight
  418:             else:
  419:                 weight=0
  420: 
  421:             ls.append((x,weight))
  422: 
  423:         ls.sort(sortWeight)
  424:         
  425:         return [x[0] for x in ls]
  426: 
  427:     
  428:         
  429:             
  430:     def isSelectedPath(self,item):
  431:         """test is path is already selected"""
  432:         found=re.search("\?(.*)",item[1])
  433:         if found:
  434:             temp=re.sub(" ","%20",found.group(0))
  435:             #print temp+"::"+self.REQUEST['QUERY_STRING']
  436:             if ("?"+self.REQUEST['QUERY_STRING'])==temp:
  437:                 return 1
  438: 
  439:         if re.search(item[1],self.REQUEST['URL']):
  440:             return 1
  441:         else:
  442:             return 0
  443:         
  444:     
  445:     def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
  446:         
  447:         """Generate Buttons"""
  448:         if orientation=="horizontal":
  449:             html="<table><tr>"
  450:             startTag="<td>"
  451:             endTag="</td>"
  452:             endHtml="</tr></table>"
  453: 
  454:         else:
  455:             html="<table>"
  456:             startTag="<tr><td>"
  457:             endTag="</td></tr>"
  458:             endHtml="</table>"
  459:             
  460:         if not start:
  461:             temp=hash
  462:         else:
  463:             temp=hash
  464:             for x in start:
  465:                 temp=temp[x][0]
  466:                 #print temp
  467:         
  468:         for key in self.tempSorted(temp):
  469:             
  470:             description=temp[x][1].title
  471:          
  472:             url=createPath(self.absolute_url(),temp[key][1].absolute_url())
  473: 
  474:             if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
  475:                 html=html+startTag+"[%s]" % description+endTag
  476:             else:                
  477:                 html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
  478:             
  479: 
  480:         html=html+endHtml
  481:         
  482:         return html
  483: 
  484:     def mainNavBar(self):
  485:         """print main navigation bar"""
  486:         keys=""
  487: 
  488:         try:
  489:             keys=self.buttonsFromHash(self.createNavHash(0))
  490:         except:
  491:             keys=""
  492:             
  493:         return keys
  494: 
  495:     def mainNavElements(self):
  496:         """print main navigation bar"""
  497:         keys=""
  498:         #print "NAVELEMENT",self.getId()
  499:         #try:
  500:       
  501:         keys=self.barFromHash(self.createNavHash(0))
  502:         
  503:         #except:
  504:         #    keys=""
  505:             
  506:         return keys
  507: 
  508:     def numberOfMainNavElements(self):
  509: 	"""number of main elements"""
  510: 
  511: 	return len(self.barFromHash(self.createNavHash(0))) 
  512: 
  513:     def secondNavElements(self):
  514:         """Zweite Ordnung"""
  515:         
  516:         hash=self.createNavHash(2)
  517:         actual_url=self.REQUEST['URL']
  518:         
  519:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  520:         #print ult_temp
  521: 
  522:         splitted=ult_temp.split("/")
  523:         
  524: 
  525:         start=[splitted[2]]
  526:         #print start
  527:        
  528:         keys=self.barFromHash(hash,start=start)
  529:         
  530:         
  531:         return keys
  532: 
  533:     def navElements(self,order):
  534:         """n-te Ordnung"""
  535:         
  536:         hash=self.createNavHash(order)
  537:         actual_url=self.REQUEST['URL']
  538:         
  539:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  540:         #print ult_temp
  541: 
  542:         splitted=ult_temp.split("/")
  543:         
  544: 
  545:         ## if splitted[len(splitted)-1]=="index_html":
  546: ##             start=[splitted[len(splitted)-2]]
  547: ##         else:
  548: ##             start=[splitted[len(splitted)-1]]
  549: 
  550:         start=splitted[2:order+1]
  551:         #print start
  552:        
  553:         keys=self.barFromHash(hash,start=start)
  554:         
  555:         
  556:         return keys
  557: 
  558: 
  559:     def secondNavBar(self):
  560:         """Zweite Ordnung"""
  561: 
  562:         hash=self.createNavHash(2)
  563:         actual_url=self.REQUEST['URL']
  564:         
  565:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  566:         #print ult_temp
  567: 
  568:         splitted=ult_temp.split("/")
  569:         
  570: 
  571:         ## if splitted[len(splitted)-1]=="index_html":
  572: ##             start=[splitted[len(splitted)-2]]
  573: ##         else:
  574: ##             start=[splitted[len(splitted)-1]]
  575: 
  576:         start=[splitted[2]]
  577:         #print start
  578:         
  579:         keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
  580:         
  581:         
  582:         return keys
  583: 
  584: def manage_addECHO_navigationForm(self):
  585:     """Form for adding"""
  586:     pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_navigation.zpt').__of__(self)
  587:     return pt()
  588: 
  589: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
  590:     """Add an ECHO_root"""
  591:     self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
  592:     
  593:     if RESPONSE is not None:
  594:         RESPONSE.redirect('manage_main')
  595: 
  596: 
  597: #helpers
  598: 
  599: 
  600: 
  601: def createPath(url1,url2):
  602:     temp1=url1.split("/")
  603:     temp2=url2.split("/")
  604:     for test in temp1:
  605:         if temp2[0]==test:
  606:             del temp2[0]
  607: 
  608:     return url1+"/"+string.join(temp2,"/")
  609: 
  610: def sortWeight(x,y):
  611:     #print x[1],y[1]
  612:     return cmp(x[1],y[1])
  613:     

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