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