File:  [Repository] / ECHO_content / ECHO_xslt.py
Revision 1.18: download - view: text, annotated - select for diffs - revision graph
Tue Jan 9 17:01:01 2007 UTC (17 years, 5 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
bug fixed in echo_xslt

    1: ### XSLT Class ###
    2: ### setzt 4 suite vorraus ###
    3: from Acquisition import Implicit
    4: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    5: from Globals import DTMLFile
    6: from ECHO_Nav import ECHO_pageTemplate
    7: from threading import Thread,Timer
    8: import threading
    9: from ECHO_helpers import *
   10: try:
   11: 	from ECHO_language import *
   12: except:
   13: 	print "no echo language"
   14: 	class ECHO_language:
   15: 		"""leere Klasse"""
   16: 		pass
   17: import sys
   18: import urllib
   19: import urlparse
   20: from Ft.Xml.Domlette import Print, PrettyPrint
   21: from StringIO import StringIO
   22: from types import *
   23: from Globals import package_home
   24: import transaction
   25: 
   26: import os.path
   27: 
   28: import urllib,cgi
   29: 
   30: try:
   31:     from Ft.Xml.Xslt.Processor import Processor
   32:     from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
   33:     from Ft.Xml.Domlette import NonvalidatingReader
   34: except:
   35:     print "4suite has to be installed"
   36: 
   37: 
   38: class getXML(Implicit):
   39:     """get XML thread"""
   40: 
   41:     def set(self,qs,xsl,result):
   42:         """set"""
   43:    
   44:         self._v_qs=qs
   45:         self.xsl=xsl
   46:         self.result=None        
   47: 
   48: #    def acquireLock(self):
   49: #    
   50: #         lock=getattr(self, "_v_lock", None)
   51: #         if not lock:
   52: #             self._v_lock=threading.Lock()
   53: #             lock=self._v_lock
   54: #         lock.acquire()
   55: #
   56: #    def releaseLock(self):
   57: #         # acquire() should have been called
   58: #         # about one second before. This means the volatile lock
   59: #         # should still be there
   60: #    
   61: #         self._v_lock.release()
   62: #        
   63:   
   64:     def __call__(self):
   65:         """wait"""
   66:         return True
   67:     
   68:     def run(self):
   69:         """call it"""
   70:         xml=""
   71: 
   72:         try:
   73:   
   74:             urlH=urllib.urlopen(self._v_qs)
   75:             xml=urlH.read()
   76:             urlH.close()
   77:             xsltproc=Processor()
   78:             document = InputSource.DefaultFactory.fromString(xml)
   79:             
   80:             stylesheet = InputSource.DefaultFactory.fromUri(self.xsl)
   81:             
   82:             xsltproc.appendStylesheet(stylesheet)
   83:             
   84:         
   85:             #print self.xsl
   86:             #< xsltproc.run(document)
   87:             tmp=xsltproc.run(document)
   88:             
   89:             self.result=tmp[0:]
   90:             
   91:         
   92:        	except:
   93:                
   94:                self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
   95:                self.result+=xml
   96:                self.result+="</html>"
   97:         
   98:         
   99:     
  100:     def getResult(self):
  101: 
  102:         return self.result
  103: 
  104: from ZODB import DB
  105: from ZODB.FileStorage import FileStorage
  106: class ECHO_cache:
  107:     def __init__(self):
  108:         """init the storage"""
  109:         self.storage=FileStorage(os.path.join(INSTANCE_HOME,"var/echo_cache.fs"))		
  110:         self.db=DB(self.storage)    
  111:         self.connection=self.db.open()
  112:         self.root=self.connection.root()
  113:     
  114:     def deleteObject(self,name,pn=None):
  115:         """delete an object from cache"""
  116:         fileStore=self.root.get(name,None)
  117:         if fileStore:
  118:             if not pn:
  119:                 del(self.root[name])
  120:             else:
  121:                 if self.root[name].get(pn,None):
  122:                     del(self.root[name][pn])
  123:                     
  124:         
  125:     def storeObject(self,name,pn,object):
  126:         """store an object"""
  127:         
  128:         if not self.root.get(name,None):
  129:             self.root[name]={}
  130:             
  131: 
  132:         #following is necessary to make clear that object has really changed for ZODB
  133:         tmp=self.root[name]
  134:         tmp[pn]=object
  135:         self.root[name]=tmp
  136:         transaction.get().commit()
  137:         return True
  138:    
  139:     def retrieveObject(self,name,pn):
  140:         """retrieve it"""
  141:         
  142:         fileStore=self.root.get(name,None)
  143:         if not fileStore:
  144:             return None
  145:         else:
  146:            
  147:             return self.root[name].get(pn,None)
  148:         
  149: 
  150: class ECHO_xslt(ECHO_pageTemplate,ECHO_language):
  151:     """ECHO_xslt classe"""
  152: 
  153:     meta_type="ECHO_xslt"
  154:     
  155:     cache=ECHO_cache() # cache for analysed pages
  156:     caching="yes"
  157:     
  158:     appendQueryString=True # add query string to the cgiUrl can be changed with addChanges
  159:     
  160:     passURL=False #use url from querystring parameter fn to retrieve the text and not the url in cgi-url can be changed with addChanges
  161:         
  162:     
  163:     results={}
  164:     manage_options=ECHO_pageTemplate.manage_options+(
  165:      {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
  166:      
  167:     def refreshTxt(self):
  168:         """txt fuer refresh"""
  169:         return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName)
  170: 
  171:     def xslt(self):
  172:         """xslt"""
  173: 
  174:         return self.document_src()
  175: 
  176:     def change_ECHO_xsltForm(self):
  177:         """change form"""
  178:         pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
  179:         return pt()
  180: 
  181:     def addChanges(self,cgiUrl,appendQueryString=False,passURL=False,caching=False,RESPONSE=None):
  182:         """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
  183:     
  184:         if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
  185:             self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
  186:         else:
  187:             self.cgiUrl=cgiUrl
  188:         
  189:         if appendQueryString: 
  190:             self.appendQueryString=True
  191:         else:
  192:             self.appendQueryString=False
  193:         
  194:         if passURL:
  195:             self.passURL=True
  196:         else:
  197:             self.passURL=False
  198:        
  199:         if caching:
  200:             self.caching="yes"
  201:         else:
  202:             self.caching="No"
  203:         
  204: 
  205:         if RESPONSE:
  206:             RESPONSE.redirect("manage_main")
  207:         
  208:     def index_html(self,repeat=None):
  209:         """standard ausgabe"""
  210: 
  211:         threadName=repeat
  212:         
  213:         if not threadName or threadName=="":
  214:             
  215:             #abwaertskompatibilitŠt mit altem nivht konfigurierbaren prototypen
  216:             
  217:             if getattr(self,'cgiUrl','')=='':
  218:                 self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1"
  219:                 
  220:             qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
  221:             xsl=self.absolute_url()+"/xslt"
  222:             self._v_xmltrans=getXML().__of__(self)
  223:             #self._xmltrans.start()
  224:             thread=Thread(target=self._v_xmltrans)
  225:             thread.start()
  226:             self._v_xmltrans.set(qs,xsl,None)
  227:             self._v_xmltrans.run()
  228:             
  229:             
  230:             self.threadName=thread.getName()[0:]
  231:             wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
  232:             if wait_template:
  233:                 return wait_template[0][1]()
  234:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
  235:             return pt()
  236:             #_v_xmltrans.run()
  237:         
  238:         else:
  239:             
  240:             if (self._v_xmltrans.getResult()==None):
  241: 
  242:                 wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
  243:                 if wait_template:
  244:                         return wait_template[0][1]()
  245:                 
  246:                 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
  247:                 return pt()
  248:             else:
  249:                 return self._v_xmltrans.getResult()
  250: 
  251:     
  252:     def getText(self):
  253:         """print nur den text"""
  254:         qs,baseUri=self.getTextInput()
  255:         self.REQUEST.RESPONSE.redirect(qs)
  256: 
  257:     def deleteCache(self):
  258:         """deletefrom cache"""
  259:         fn=self.REQUEST['fn']
  260:         self.cache.deleteObject(fn)
  261:         
  262:     
  263:     def createLinkNode(self,url,dom):
  264:         """createa a link node"""
  265:         txt=dom.createTextNode("<XMLLink>")
  266:         node=dom.createElementNS("http://test.de","a")
  267:         node.setAttributeNS("http://test.de","href",url)
  268:         node.appendChild(txt)
  269:         return node
  270:       
  271:     def forwardLink(self,linkid,url,type="target",RESPONSE=None):
  272:         """forward to link"""
  273:         if RESPONSE:
  274:             RESPONSE.redirect(self.getLink(linkid,url,type=type))
  275:             
  276:         else:
  277:             return self.getLink(linkid,url,type=type)
  278:     def getLink(self,linkid,url,type="target"):
  279:         """get target for linkid"""
  280:         dom=NonvalidatingReader.parseUri(url)
  281:         
  282:         masterurl=dom.xpath("//mpiwg:masterurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  283:         slaveurl=dom.xpath("//mpiwg:slaveurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  284:         
  285:         #check now if there are in the link file
  286:      
  287:         xp="//mpiwg:link[@id='%s']"%linkid
  288:         
  289:         if type=="target":
  290:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  291:                 fn=link.xpath("mpiwg:target/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  292:                 
  293:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
  294:                     return urllib.unquote(fn)  # dann gibt diese zurueck 
  295:                 
  296:                 ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  297:                 
  298:                 ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  299:                 selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  300:                   
  301:               
  302:                 
  303:                 lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target')
  304:                 lstr+="&_links="+urllib.quote(url)
  305:                 
  306:         else:
  307:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  308:                 fn=link.xpath("mpiwg:source/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  309:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
  310:                     return urllib.unquote(fn)  # dann gibt diese zurueck 
  311:                 
  312:                 ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  313:                 
  314:                 ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  315:                 selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  316:                              
  317:                 lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'source')
  318:                 lstr+="&_links="+urllib.quote(url)
  319:         return lstr
  320:    
  321:     def addLinksUrl(self,txt,url):
  322:         """add reference to links to  url"""
  323:         ret=[]
  324:         dom=NonvalidatingReader.parseUri(url)
  325:         textDom=NonvalidatingReader.parseString(txt)
  326: 
  327:         #find ids in txt
  328:         ids=textDom.xpath("//*[@id]")
  329:         
  330:         for textid in ids:
  331:             xp="//mpiwg:link[mpiwg:source/@refid='%s']"%textid.xpath("@id")[0].value
  332:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  333:                 ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  334:                 selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  335:                 linkid=link.xpath("@id")[0].value         
  336:                 ret.append('%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'source'))
  337:            
  338:             xp="//mpiwg:link[mpiwg:target/@refid='%s']"%textid.xpath("@id")[0].value
  339:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  340:                 ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  341:                 selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  342:                 linkid=link.xpath("@id")[0].value         
  343:                 ret.append('%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target'))
  344:            
  345:            
  346:         return ret
  347:           
  348:     def addLinks(self,txt,url="http://127.0.0.1:8080/HFQP/linkCreator/getCollectionXML?collection=commentary2"):
  349:         """add links to a page from xml linkfile"""
  350:         
  351:         dom=NonvalidatingReader.parseUri(url)
  352:         textDom=NonvalidatingReader.parseString(txt)
  353: 
  354:         #find ids in txt
  355:         ids=textDom.xpath("//*[@id]")
  356:         masterurl=dom.xpath("//mpiwg:masterurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  357:         slaveurl=dom.xpath("//mpiwg:slaveurl/@ref",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  358:         
  359:         #check now if there are in the link file
  360:         for textid in ids:
  361:             xp="//mpiwg:link[mpiwg:source/@refid='%s']"%textid.xpath("@id")[0].value
  362:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  363:                 fn=link.xpath("mpiwg:target/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  364:                 print fn
  365:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
  366:                     lstr=urllib.unquote(fn)  # dann gibt diese zurueck 
  367:                 else:
  368:                     try:
  369:                         ref=link.xpath("mpiwg:target/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  370:                     
  371:                         ref2=link.xpath("mpiwg:target/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  372:                         selectionNodeIndex=link.xpath("mpiwg:target/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  373:                         linkid=link.xpath("@id")[0].value         
  374:                         lstr=slaveurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,'target')
  375:                         lstr+="&_links="+urllib.quote(url)
  376:                     except:
  377:                         lstr=""
  378:                 node=self.createLinkNode(lstr,textDom)
  379:                 textid.parentNode.insertBefore(node,textid)
  380:               
  381:           
  382:             xp="//mpiwg:link[mpiwg:target/@refid='%s']"%textid.xpath("@id")[0].value
  383:             for link in dom.xpath(xp,explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  384:                 fn=link.xpath("mpiwg:source/@filename",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  385:                 if urlparse.urlparse(urllib.unquote(fn))[0]=="http": # fn ist eine url
  386:                     lstr=urllib.unquote(fn)  # dann gibt diese zurueck 
  387:                 else:
  388:                 
  389:                     ref=link.xpath("mpiwg:source/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  390:                     
  391:                     ref2=link.xpath("mpiwg:source/mpiwg:pagelink/@refid",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  392:                     selectionNodeIndex=link.xpath("mpiwg:source/mpiwg:pagelink/@selectionNodeIndex",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})[0].value
  393:                     linkid=link.xpath("@id")[0].value                    
  394:                     lstr=masterurl+'fn='+fn+'&_id='+ref+'&_pagelink=%s///%s/%s/%s'%(ref2,selectionNodeIndex,linkid,"source")
  395:                     lstr+="&_links="+urllib.quote(url)
  396:                     
  397:                 node=self.createLinkNode(lstr,textDom)
  398:                 textid.parentNode.insertBefore(node,textid)
  399:               
  400:             
  401:         
  402:         strio = StringIO()
  403:         PrettyPrint(textDom,strio) 
  404:         xmlstr = strio.getvalue()
  405:         
  406:         return xmlstr
  407: 
  408:             
  409:         
  410:     def getPageLex(self,_pn="1",_id=None,_caching=None,_links=None,_showall="no",_displaylinks="yes"):
  411:         """getpage mit lexikalischer analyse und xslt transform
  412:         if _caching=yes dann wird die lwxikalisch analysierte seite in einem cache abgespeichert
  413:         """
  414:         def encode(hash):
  415:             ret=[]
  416:             for x in hash.keys():
  417:                 value=hash[x]
  418:                 
  419:                 if type(value) is ListType:
  420:                     for z in value:
  421:                         ret.append("%s=%s"%(x,z))
  422:                 else:
  423:                     ret.append("%s=%s"%(x,value))
  424:             return "&".join(ret)
  425:                     
  426:                         
  427:             
  428:         if not _caching:
  429:             _caching=self.caching
  430:             
  431:         fn=self.REQUEST['fn']
  432: 
  433:         if not _id:
  434:            
  435:             fromCache=self.cache.retrieveObject(fn,_pn)
  436:      
  437:             if fromCache and _caching=="yes":
  438:               
  439:                 txt = fromCache
  440:             else:
  441:                 txt=self.tagLex(nr=_pn)   
  442:               
  443:                 self.cache.storeObject(fn,_pn,txt[0:])
  444:             
  445:         else:
  446:            txt=self.tagLex(id=_id)
  447:       
  448:         if _showall=="yes":
  449:            params=cgi.parse_qs(self.REQUEST['QUERY_STRING'])
  450:            
  451:            params['_pagelink']=self.addLinksUrl(txt,url=_links)
  452:            params['_showall']='no'
  453:           
  454:            print self.absolute_url()+"?"+encode(params)
  455:            self.REQUEST.RESPONSE.redirect(self.absolute_url()+"/getPageLex?"+encode(params))
  456:            
  457:            
  458:         xsl=self.xslt()
  459:         
  460:         xsltproc=Processor()
  461:         if type(txt)==UnicodeType:
  462:             document = InputSource.DefaultFactory.fromString(txt.encode('utf-8'))
  463:         else:
  464:             document = InputSource.DefaultFactory.fromString(txt)
  465:         stylesheet = InputSource.DefaultFactory.fromString(xsl)
  466:         xsltproc.appendStylesheet(stylesheet)
  467:         tmp=xsltproc.run(document)
  468:         
  469:         if _links and (_displaylinks=='yes'):
  470:             _links=urllib.unquote(_links)
  471:             tmp=self.addLinks(tmp,url=_links)
  472:             
  473:         #bugfix for digilib images which doesn't accept &amp;
  474:         tmp=tmp.replace("&amp;","&")
  475:         
  476: 
  477:         return tmp[0:]
  478:             
  479:     def getTextInput(self):
  480:         """get the text
  481:         wie der text geholt wird liegt an der konfiguration,
  482:         is appendQueryString gesetzt, dann wir jeweils der Querystring an vorgebenen url gesetzt, erwartet wird fn=
  483:         fŸr den Pfad, is passURL gesetzt, dann wird falls fn= eine vollstŠndige url enthŠlt, diese anstelle der in cgiurl definierten genommen.
  484:         """
  485:         
  486:         if getattr(self,'passURL',False) and self.REQUEST.has_key('fn') and (urlparse.urlparse(self.REQUEST['fn'])[0]=='http'):
  487:             qs=self.REQUEST['fn']
  488:             baseUri=qs
  489:         elif getattr(self,'pappendQueryString',True):
  490:             qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
  491:             baseUri=self.cgiUrl
  492:         else:
  493:             qs="%s"%(self.cgiUrl)
  494:             baseUri=self.cgiUrl
  495:         
  496:         #fact= InputSource.DefaultFactory.fromUri(qs)
  497:         return qs,baseUri
  498:         #return InputSource.InputSource(fact)
  499:         #xmlt=urllib.urlopen(qs).read()
  500:         
  501:     def getPage(self,_pn="-1",_id=None,REQUEST=None,_caching=None):
  502:         """get a page from an xml"""
  503:         
  504:         if not _caching:
  505:             _caching=self.caching
  506:             
  507:         pn=int(_pn)-1
  508:         if pn<0 and (not _id):
  509:             if REQUEST:
  510:                 return "Sorry, pagenumbers have to be greater than 0"
  511:             else:
  512:                 return None
  513:        
  514:         xmlt,self.baseUri=self.getTextInput()
  515:         
  516:         #get the text from cache, if existing
  517:         try:
  518:             fromCache=self.cache.retrieveObject(self.baseUri,"-1")
  519:         except:
  520:             fromCache=None
  521:         if fromCache and _caching=="yes":
  522:           
  523:             txt = fromCache
  524:         else:
  525: 
  526:             txt=urllib.urlopen(xmlt).read()
  527:             
  528:             self.cache.storeObject(self.baseUri,"-1",txt)
  529:         
  530:    
  531:         dom=NonvalidatingReader.parseString(txt,self.baseUri)
  532:         
  533:         #pb should have a namespache
  534: 
  535:         pbs=dom.xpath("//mpiwg:pb",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})
  536:         
  537:         if len(pbs)==0: # versuche nochmal ohne
  538:             pbs=dom.xpath("//pb")
  539: 
  540:         if _id:
  541:             #suche wieviele pb for der id
  542:             
  543:             
  544:             idpb=dom.xpath("//*[@id='%s']/preceding::node()/mpiwg:pb"%_id,explicitNss={'html':'http://www.w3.org/1999/xhtml','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})
  545:             if len(idpb)==0:
  546:                 idpb=dom.xpath("//*[@id='%s']/preceding::node()/pb"%_id)
  547:          
  548:             if len(idpb)==0:
  549:                         k=0
  550:                         for node in dom.xpath("//*[@id='%s']//preceding::node()"%_id,explicitNss={'html':'http://www.w3.org/1999/xhtml','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
  551:                             if getattr(node,'tagName',"")=="mpiwg:pb":
  552:                                 k+=1
  553:             else:
  554:                 k=len(idpb)
  555:             #pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0
  556:             pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0
  557:         if pn > len(pbs):
  558:             if REQUEST:
  559:                 return "Sorry, pagenumber %s does not exit"%(pn+1)
  560:             else:
  561:                 return None
  562:             
  563:         beginNode=pbs[pn] #take the n'th pb
  564: 
  565:         if not (pn==len(pbs)-1): # nicht die letzte Seite
  566:             endNode=pbs[pn+1]
  567:         else:
  568:             endNode=None
  569:         
  570:         deleteNodes=beginNode.xpath('preceding::node()')
  571:         if endNode:
  572:             deleteNodes+=endNode.xpath('following::node()')
  573:         for node in deleteNodes:
  574:             try:
  575:                 parent=node.xpath("..")
  576:            
  577:                 if parent:
  578:                     parent[0].removeChild(node)
  579:             except:
  580:                 zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
  581:         strio = StringIO()
  582:         PrettyPrint(dom,strio) 
  583:         xmlstr = strio.getvalue()
  584:         
  585:         return xmlstr
  586: 
  587: 
  588:         
  589: def manage_addECHO_xsltForm(self):
  590:     """Form for adding"""
  591:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
  592:     return pt()
  593: 
  594: from urllib import quote
  595: 
  596: 
  597: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
  598:                            REQUEST=None, submit=None):
  599:     "Add a Page Template with optional file content."
  600: 
  601:     
  602:     id = str(id)
  603:     if REQUEST is None:
  604:         self._setObject(id, ECHO_xslt(id, text))
  605:         ob = getattr(self, id)
  606:         setattr(ob,'weight',weight)
  607:         setattr(ob,'label',label)
  608:         setattr(ob,'contentType',contentType)
  609:         if title:
  610:             ob.pt_setTitle(title)
  611:         return ob
  612:         setattr(ob,'cgiUrl',cgiUrl)
  613:     else:
  614:         file = REQUEST.form.get('file')
  615:         headers = getattr(file, 'headers', None)
  616:         if headers is None or not file.filename:
  617:             zpt = ECHO_xslt(id)
  618:         else:
  619:             zpt = ECHO_xslt(id, file, headers.get('contentType'))
  620: 
  621:         self._setObject(id, zpt)
  622:         ob = getattr(self, id)
  623:         setattr(ob,'weight',weight)
  624:         setattr(ob,'label',label)
  625:         setattr(ob,'cgiUrl',cgiUrl)
  626:         if title:
  627:             ob.pt_setTitle(title)
  628:         
  629:         try:
  630:             u = self.DestinationURL()
  631:         except AttributeError:
  632:             u = REQUEST['URL1']
  633: 
  634:         if submit == " Add and Edit ":
  635:             u = "%s/%s" % (u, quote(id))
  636:         REQUEST.RESPONSE.redirect(u+'/manage_main')
  637:     return ''

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