File:  [Repository] / ECHO_content / ECHO_Nav.py
Revision 1.16: download - view: text, annotated - select for diffs - revision graph
Sun Apr 18 19:40:13 2004 UTC (20 years, 1 month ago) by dwinter
Branches: MAIN
CVS tags: HEAD
change getlabe, and gettitle introduced

    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,label,RESPONSE=None):
  189:         """change"""
  190:         self.weight=weight
  191:         self.contentType=contentType
  192:         self.label=label
  193:         
  194:         if RESPONSE is not None:
  195:             RESPONSE.redirect('manage_main')
  196: 
  197:     def getLabel(self):
  198:         if hasattr(self,'label'):
  199:             return self.label.encode('utf-8')
  200:         else:
  201:             return 0
  202:         
  203:     def getWeight(self):
  204:         """get weight"""
  205:         if hasattr(self,'weight'):
  206:             return self.weight
  207:         else:
  208:             return 0
  209:         
  210:     def getcontentType(self):
  211:         """get weight"""
  212:         if hasattr(self,'weight'):
  213:             return self.weight
  214:         else:
  215:             return 0
  216: 
  217: 
  218: 
  219: 
  220:     ## def __init__(self, id, text=None, contentType=None):
  221: ##         self.id = str(id)
  222: ##         self.ZBindings_edit(self._default_bindings)
  223: ##         if text is None:
  224: ##             text = open(self._default_cont).read()
  225: ##         self.pt_edit(text, contentType)
  226: 
  227: def manage_addECHO_pageTemplateForm(self):
  228:     """Form for adding"""
  229:     pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_pageTemplate.zpt').__of__(self)
  230:     return pt()
  231: 
  232: from urllib import quote
  233: 
  234: 
  235: def manage_addECHO_pageTemplate(self, id, label, weight= 0,contentType=0,title=None, text=None,
  236:                            REQUEST=None, submit=None):
  237:     "Add a Page Template with optional file content."
  238: 
  239:     
  240:     id = str(id)
  241:     if REQUEST is None:
  242:         self._setObject(id, ECHO_pageTemplate(id, text))
  243:         ob = getattr(self, id)
  244:         setattr(ob,'weight',weight)
  245:         setattr(ob,'label',label)
  246:         setattr(ob,'contentType',contentType)
  247:         if title:
  248:             ob.pt_setTitle(title)
  249:         return ob
  250:     else:
  251:         file = REQUEST.form.get('file')
  252:         headers = getattr(file, 'headers', None)
  253:         if headers is None or not file.filename:
  254:             zpt = ECHO_pageTemplate(id)
  255:         else:
  256:             zpt = ECHO_pageTemplate(id, file, headers.get('contentType'))
  257: 
  258:         self._setObject(id, zpt)
  259:         ob = getattr(self, id)
  260:         setattr(ob,'weight',weight)
  261:         if title:
  262:             ob.pt_setTitle(title)
  263:         
  264:         try:
  265:             u = self.DestinationURL()
  266:         except AttributeError:
  267:             u = REQUEST['URL1']
  268: 
  269:         if submit == " Add and Edit ":
  270:             u = "%s/%s" % (u, quote(id))
  271:         REQUEST.RESPONSE.redirect(u+'/manage_main')
  272:     return ''
  273: 
  274: 
  275: class ECHO_navigation(Folder):
  276:     """Navigations Element"""
  277:     meta_type="ECHO_Navigation"
  278: 
  279:     displayedMetaTypes=['ECHO_group','ImageCollectionIFrame','ECHO_collection','ECHO_pageTemplate','ZSQLExtendFolder','ZSQLBibliography','ECHO_sqlElement','ECHO_resource','ECHO_externalLink']
  280:     
  281:     def __init__(self,id,title,pathToHierarchy):
  282:         """init"""
  283:         self.id=id
  284:         self.title=title
  285:         self.pathToHierarchy=pathToHierarchy
  286: 
  287:     manage_options = Folder.manage_options+(
  288:         {'label':'Main Config','action':'ECHO_navigationConfigForm'},
  289:         )
  290: 
  291:     def ECHO_navigationConfigForm(self):
  292:         """configForm"""
  293:         pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_navigation.zpt').__of__(self)
  294:         return pt()
  295:     
  296:     def ECHO_navigationConfig(self,title,pathToHierarchy,RESPONSE=None):
  297:         """config"""
  298:         self.title=title
  299:         self.pathToHierarchy=pathToHierarchy
  300: 
  301:         if RESPONSE is not None:
  302:             RESPONSE.redirect('manage_main')
  303: 
  304: 
  305:     def getColls(self,obj,depth):
  306:         nav={}
  307:         #print "HERE",obj.
  308:         for keys in obj.__dict__.keys():
  309:             x=getattr(obj,keys)
  310:             if hasattr(x,"meta_type"):
  311:                 if x.meta_type in self.displayedMetaTypes:
  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:         #exec(obj)
  329: 
  330:         #objtemp = compile(temp,'<string>','single')
  331:         #obj=eval(objtemp)
  332:         #print obj 
  333:         
  334:         #print obj.__dict__.keys()
  335:         
  336:         for keys in obj.__dict__.keys():
  337:             x=getattr(obj,keys)
  338:             if hasattr(x,"meta_type"):
  339:                 #print x.meta_type
  340:                 if x.meta_type in self.displayedMetaTypes:
  341:                    
  342:                     if depth>1:
  343:                         nav[x.getId()]=(self.getColls(x,int(depth)-1),x)
  344:                     else:
  345:                         nav[x.getId()]=(None,x)
  346:                     
  347: 
  348:         #print nav
  349:         return nav
  350: 
  351:     def barFromHash(self,hash,start=None,sortField=None):
  352:         """Erzeuge Navigations Element"""
  353:         #print "hash",hash
  354:         listNav=[]
  355:         if not start:
  356:             temp=hash
  357:             sortField="weight"
  358:         else: # list mit pfad zum hash
  359:             temp=hash
  360:             #print "HI",sortField
  361:             if not sortField:
  362:                 tempObj=self.pathToHierarchy[0:]
  363:                 tempObj=re.sub("/",".",tempObj)
  364:                 tempObj="self.aq_parent"+tempObj
  365: 
  366:                 objtemp=eval(tempObj)
  367: 
  368:                 obj=objtemp
  369: 
  370:                 for x in start:
  371:                     #print "OBJ",start,obj,obj.getId(),x
  372: 
  373:                     obj=getattr(obj,x)
  374: 
  375:                 if hasattr(obj,'sortfield'):
  376:                     sortField=obj.sortfield
  377:                 else:
  378:                     sortField='weight'
  379:             #print "START",start
  380:             for x in start:
  381:                 #print "N2",x,temp[x]
  382:                 try:
  383:                     temp=temp[x][0]
  384:                 except:
  385:                     """nothing"""
  386:                     return []
  387:             #print "TEMP",temp,self.tempSorted(temp, field=sortField)
  388: 
  389:         for x in self.tempSorted(temp, field=sortField):
  390:             if not temp[x][1].title == "":
  391:                 if temp[x][1].meta_type=="ECHO_sqlElement":
  392:                     for z in temp[x][1].getNavList():
  393:                         listNav.append((z[0],z[1]))
  394:                 else:
  395:                     # add label fals existiert und nicht leer
  396:                     if hasattr(temp[x][1],'label'):
  397:                         if not temp[x][1].label=='':
  398:                             label=temp[x][1].label.encode('utf-8')
  399:                             
  400:                         else:
  401:                             label=temp[x][1].title.encode('utf-8')
  402:                     else:
  403:                         label=temp[x][1].title.encode('utf-8')                            
  404:                     
  405:                     listNav.append((label,createPath(self.absolute_url(),temp[x][1].absolute_url()),temp[x][1]))
  406:                     
  407:         #print self.getId(),start
  408:         #print listNav
  409: 
  410:         #html=""
  411:         #for k in listNav:
  412:         #    print k
  413:         #    html=html+"<a href='%s'>%s</a>   "% (self.absolute_url()+createPath(k[1][1].absolute_url()),k[0])
  414: 
  415:         return listNav
  416: 
  417:     def tempSorted(self,hash,field="weight"):
  418:         ls=[]
  419: 
  420:         for x in hash.keys():
  421:             #print hash[x][1]
  422:             if hasattr(hash[x][1],field):
  423:                 weight=getattr(hash[x][1],field)
  424:                 #print weight
  425:             else:
  426:                 weight=0
  427: 
  428:             ls.append((x,weight))
  429: 
  430:         ls.sort(sortWeight)
  431:         
  432:         return [x[0] for x in ls]
  433: 
  434:     
  435:         
  436:             
  437:     def isSelectedPath(self,item):
  438:         """test is path is already selected"""
  439:         found=re.search("\?(.*)",item[1])
  440:         if found:
  441:             temp=re.sub(" ","%20",found.group(0))
  442:             #print temp+"::"+self.REQUEST['QUERY_STRING']
  443:             if ("?"+self.REQUEST['QUERY_STRING'])==temp:
  444:                 return 1
  445: 
  446:         if re.search(item[1],self.REQUEST['URL']):
  447:             return 1
  448:         else:
  449:             return 0
  450:         
  451:     
  452:     def buttonsFromHash(self,hash,start=None,orientation="horizontal"):
  453:         
  454:         """Generate Buttons"""
  455:         if orientation=="horizontal":
  456:             html="<table><tr>"
  457:             startTag="<td>"
  458:             endTag="</td>"
  459:             endHtml="</tr></table>"
  460: 
  461:         else:
  462:             html="<table>"
  463:             startTag="<tr><td>"
  464:             endTag="</td></tr>"
  465:             endHtml="</table>"
  466:             
  467:         if not start:
  468:             temp=hash
  469:         else:
  470:             temp=hash
  471:             for x in start:
  472:                 temp=temp[x][0]
  473:                 #print temp
  474:         
  475:         for key in self.tempSorted(temp):
  476:             
  477:             description=temp[x][1].title
  478:          
  479:             url=createPath(self.absolute_url(),temp[key][1].absolute_url())
  480: 
  481:             if (self.REQUEST['URL']==url) | (self.REQUEST['URL']==url+"/index_html"):
  482:                 html=html+startTag+"[%s]" % description+endTag
  483:             else:                
  484:                 html=html+startTag+"[<a href='%s'>%s</a>]" % (url,description)+endTag
  485:             
  486: 
  487:         html=html+endHtml
  488:         
  489:         return html
  490: 
  491:     def mainNavBar(self):
  492:         """print main navigation bar"""
  493:         keys=""
  494: 
  495:         try:
  496:             keys=self.buttonsFromHash(self.createNavHash(0))
  497:         except:
  498:             keys=""
  499:             
  500:         return keys
  501: 
  502:     def mainNavElements(self):
  503:         """print main navigation bar"""
  504:         keys=""
  505:         #print "NAVELEMENT",self.getId()
  506:         #try:
  507:       
  508:         keys=self.barFromHash(self.createNavHash(0))
  509:         
  510:         #except:
  511:         #    keys=""
  512:             
  513:         return keys
  514: 
  515:     def numberOfMainNavElements(self):
  516: 	"""number of main elements"""
  517: 
  518: 	return len(self.barFromHash(self.createNavHash(0))) 
  519: 
  520:     def secondNavElements(self):
  521:         """Zweite Ordnung"""
  522:         
  523:         hash=self.createNavHash(2)
  524:         actual_url=self.REQUEST['URL']
  525:         
  526:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  527:         #print ult_temp
  528: 
  529:         splitted=ult_temp.split("/")
  530:         
  531: 
  532:         ## if splitted[len(splitted)-1]=="index_html":
  533: ##             start=[splitted[len(splitted)-2]]
  534: ##         else:
  535: ##             start=[splitted[len(splitted)-1]]
  536: 
  537:         start=[splitted[2]]
  538:         #print start
  539:        
  540:         keys=self.barFromHash(hash,start=start)
  541:         
  542:         
  543:         return keys
  544: 
  545:     def navElements(self,order):
  546:         """n-te Ordnung"""
  547:         
  548:         hash=self.createNavHash(order)
  549:         actual_url=self.REQUEST['URL']
  550:         
  551:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  552:         #print ult_temp
  553: 
  554:         splitted=ult_temp.split("/")
  555:         
  556: 
  557:         ## if splitted[len(splitted)-1]=="index_html":
  558: ##             start=[splitted[len(splitted)-2]]
  559: ##         else:
  560: ##             start=[splitted[len(splitted)-1]]
  561: 
  562:         start=splitted[2:order+1]
  563:         #print start
  564:        
  565:         keys=self.barFromHash(hash,start=start)
  566:         
  567:         
  568:         return keys
  569: 
  570: 
  571:     def secondNavBar(self):
  572:         """Zweite Ordnung"""
  573: 
  574:         hash=self.createNavHash(2)
  575:         actual_url=self.REQUEST['URL']
  576:         
  577:         ult_temp=re.sub(self.absolute_url(),"",actual_url)
  578:         #print ult_temp
  579: 
  580:         splitted=ult_temp.split("/")
  581:         
  582: 
  583:         ## if splitted[len(splitted)-1]=="index_html":
  584: ##             start=[splitted[len(splitted)-2]]
  585: ##         else:
  586: ##             start=[splitted[len(splitted)-1]]
  587: 
  588:         start=[splitted[2]]
  589:         #print start
  590:         
  591:         keys=self.buttonsFromHash(hash,start=start,orientation="vertical")
  592:         
  593:         
  594:         return keys
  595: 
  596: def manage_addECHO_navigationForm(self):
  597:     """Form for adding"""
  598:     pt=PageTemplateFile('Products/ECHO_content/zpt/AddECHO_navigation.zpt').__of__(self)
  599:     return pt()
  600: 
  601: def manage_addECHO_navigation(self,id,title,pathToHierarchy,RESPONSE=None):
  602:     """Add an ECHO_root"""
  603:     self._setObject(id,ECHO_navigation(id,title,pathToHierarchy))
  604:     
  605:     if RESPONSE is not None:
  606:         RESPONSE.redirect('manage_main')
  607: 
  608: 
  609: #helpers
  610: 
  611: 
  612: 
  613: def createPath(url1,url2):
  614:     temp1=url1.split("/")
  615:     temp2=url2.split("/")
  616:     for test in temp1:
  617:         if temp2[0]==test:
  618:             del temp2[0]
  619: 
  620:     return url1+"/"+string.join(temp2,"/")
  621: 
  622: def sortWeight(x,y):
  623:     #print x[1],y[1]
  624:     return cmp(x[1],y[1])
  625:     

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