Annotation of ECHO_content/ECHO_xslt.py, revision 1.7
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 *
10: import sys
11: import urllib
12: import urlparse
1.6 dwinter 13: from Ft.Xml.Domlette import Print, PrettyPrint
1.7 ! dwinter 14: from StringIO import StringIO
1.1 dwinter 15:
16: from Globals import package_home
17:
1.4 dwinter 18:
1.1 dwinter 19: import os.path
20:
21: import urllib
22:
23: try:
24: from Ft.Xml.Xslt.Processor import Processor
1.6 dwinter 25: from Ft.Xml import InputSource, EMPTY_NAMESPACE,Parse
1.1 dwinter 26: except:
27: print "4suite has to be installed"
28:
29:
1.4 dwinter 30: class getXML(Implicit):
1.2 dwinter 31: """get XML thread"""
32:
1.4 dwinter 33: def set(self,qs,xsl,result):
34: """set"""
35:
36: self._v_qs=qs
1.2 dwinter 37: self.xsl=xsl
1.4 dwinter 38: self.result=None
1.2 dwinter 39:
1.4 dwinter 40: # def acquireLock(self):
41: #
42: # lock=getattr(self, "_v_lock", None)
43: # if not lock:
44: # self._v_lock=threading.Lock()
45: # lock=self._v_lock
46: # lock.acquire()
47: #
48: # def releaseLock(self):
49: # # acquire() should have been called
50: # # about one second before. This means the volatile lock
51: # # should still be there
52: #
53: # self._v_lock.release()
54: #
55:
1.2 dwinter 56: def __call__(self):
1.4 dwinter 57: """wait"""
58: return True
59:
60: def run(self):
61: """call it"""
62: xml=""
1.6 dwinter 63: print "X",self._v_qs
1.3 dwinter 64: try:
1.5 dwinter 65:
1.4 dwinter 66: urlH=urllib.urlopen(self._v_qs)
67: xml=urlH.read()
68: urlH.close()
69: xsltproc=Processor()
70: document = InputSource.DefaultFactory.fromString(xml)
71:
72: stylesheet = InputSource.DefaultFactory.fromUri(self.xsl)
73:
74: xsltproc.appendStylesheet(stylesheet)
75:
76:
77: #print self.xsl
78: #print xsltproc.run(document)
79: tmp=xsltproc.run(document)
80:
81: self.result=tmp[0:]
82:
1.3 dwinter 83:
84: except:
1.4 dwinter 85:
86: self.result="<html>error: %s %s<br>"%sys.exc_info()[0:2]
87: self.result+=xml
88: self.result+="</html>"
1.2 dwinter 89:
1.4 dwinter 90:
91:
1.2 dwinter 92: def getResult(self):
1.4 dwinter 93:
1.2 dwinter 94: return self.result
95:
96:
97:
1.1 dwinter 98: class ECHO_xslt(ECHO_pageTemplate):
99: """ECHO_xslt classe"""
100:
101: meta_type="ECHO_xslt"
1.4 dwinter 102:
103: results={}
104: manage_options=ECHO_pageTemplate.manage_options+(
105: {'label':'Change xml-ressource','action':'change_ECHO_xsltForm'},)
106:
1.2 dwinter 107: def refreshTxt(self):
108: """txt fuer refresh"""
109: return """ 2;url=%s?repeat=%s """%(self.absolute_url(),self.threadName)
1.1 dwinter 110:
111: def xslt(self):
1.2 dwinter 112: """xslt"""
1.1 dwinter 113:
1.4 dwinter 114: return self.document_src()
1.1 dwinter 115:
1.4 dwinter 116: def change_ECHO_xsltForm(self):
117: """change form"""
118: pt=zptFile(self, 'zpt/ChangeECHO_xsltForm.zpt')
119: return pt()
120:
121: def addChanges(self,cgiUrl,RESPONSE=None):
122: """change the xslt, ueberschriebt addChanges in ECHO_PageTemplate"""
123: if urlparse.urlparse(cgiUrl)[0]=="":#relative url in absolute
124: self.cgiUrl=urlparse.urljoin(self.absolute_url(), cgiUrl)
125: else:
126: self.cgiUrl=cgiUrl
127:
128: if RESPONSE:
129: RESPONSE.redirect("manage_main")
1.2 dwinter 130:
131: def index_html(self,repeat=None):
132: """standard ausgabe"""
1.4 dwinter 133:
1.2 dwinter 134: threadName=repeat
135:
136: if not threadName or threadName=="":
1.4 dwinter 137:
138: #abwaertskompatibilitt mit altem nivht konfigurierbaren prototypen
139:
140: if getattr(self,'cgiUrl','')=='':
141: self.cgiUrl="http://medea.mpiwg-berlin.mpg.de/cgi-bin/search/q1"
142:
1.6 dwinter 143: qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
1.2 dwinter 144: xsl=self.absolute_url()+"/xslt"
1.4 dwinter 145: self._v_xmltrans=getXML().__of__(self)
146: #self._xmltrans.start()
147: thread=Thread(target=self._v_xmltrans)
148: thread.start()
149: self._v_xmltrans.set(qs,xsl,None)
150: self._v_xmltrans.run()
1.2 dwinter 151:
152:
153: self.threadName=thread.getName()[0:]
154: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
155: if wait_template:
156: return wait_template[0][1]()
157: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
158: return pt()
1.4 dwinter 159: #_v_xmltrans.run()
1.2 dwinter 160:
161: else:
162:
1.4 dwinter 163: if (self._v_xmltrans.getResult()==None):
1.3 dwinter 164:
1.5 dwinter 165: wait_template=self.aq_parent.ZopeFind(self.aq_parent,obj_ids=['wait_template'])
166: if wait_template:
167: return wait_template[0][1]()
1.2 dwinter 168:
169: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','xsltWait.zpt')).__of__(self)
170: return pt()
171: else:
1.4 dwinter 172: return self._v_xmltrans.getResult()
1.2 dwinter 173:
174:
1.7 ! dwinter 175: def getPage(self,_pn,REQUEST=None):
1.6 dwinter 176: """get a page from an xml"""
1.7 ! dwinter 177: pn=int(_pn)-1
! 178: if pn<0:
! 179: if REQUEST:
! 180: return "Sorry, pagenumbers have to be greater than 0"
! 181: else:
! 182: return None
1.6 dwinter 183: impl=xml.dom.getDOMImplementation()
184: newDoc=impl.createDocument(EMPTY_NAMESPACE,None,None
185: )
186: root=newDoc.createElement('page')
187: newDoc.appendChild(root)
1.7 ! dwinter 188: qs="%s%s"%(self.cgiUrl,self.REQUEST['QUERY_STRING'])
! 189: print qs
! 190: xmlt=urllib.urlopen(qs).read()
1.6 dwinter 191: dom=Parse(xmlt)
192:
193: pbs=dom.xpath("//pb")
1.7 ! dwinter 194: if pn > len(pbs):
! 195: if REQUEST:
! 196: return "Sorry, pagenumber %s does not exit"%pn+1
! 197: else:
! 198: return None
! 199:
1.6 dwinter 200: beginNode=pbs[pn] #take the n'th pb
1.7 ! dwinter 201:
! 202: if not (pn==len(pbs)-1): # nicht die letzte Seite
! 203: endNode=pbs[pn+1]
! 204: else:
! 205: endNode=None
! 206:
! 207:
! 208: # follower=beginNode.xpath('following::node()')
! 209: # #root.appendChild(beginNode)
! 210: # found=[]
! 211: #
! 212: # for node in endNode.xpath('preceding::node()'):
! 213: # if node in follower:
! 214: # found.append(node)
! 215: #
! 216:
! 217:
1.6 dwinter 218: #rempove all children of parents which are also in the list
1.7 ! dwinter 219: # for x in found:
! 220: # for child in x.xpath(".//*"):
! 221: # try:
! 222: #
! 223: # nr=found.index(child)
! 224: #
! 225: # del(found[nr])
! 226: # except:
! 227: # pass
! 228: #
! 229: # found.append(endNode)
! 230: #
! 231: deleteNodes=beginNode.xpath('preceding::node()')
! 232: if endNode:
! 233: deleteNodes+=endNode.xpath('following::node()')
! 234: for node in deleteNodes:
! 235: try:
! 236: parent=node.xpath("..")
! 237:
! 238: if parent:
! 239: parent[0].removeChild(node)
! 240: except:
! 241: zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
! 242: strio = StringIO()
! 243: PrettyPrint(dom,strio)
! 244: xmlstr = strio.getvalue()
! 245: return xmlstr
1.6 dwinter 246:
247:
248:
1.1 dwinter 249: def manage_addECHO_xsltForm(self):
250: """Form for adding"""
251: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
252: return pt()
253:
254: from urllib import quote
255:
256:
1.4 dwinter 257: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
1.1 dwinter 258: REQUEST=None, submit=None):
259: "Add a Page Template with optional file content."
260:
261:
262: id = str(id)
263: if REQUEST is None:
264: self._setObject(id, ECHO_xslt(id, text))
265: ob = getattr(self, id)
266: setattr(ob,'weight',weight)
267: setattr(ob,'label',label)
268: setattr(ob,'contentType',contentType)
269: if title:
270: ob.pt_setTitle(title)
271: return ob
1.4 dwinter 272: setattr(ob,'cgiUrl',cgiUrl)
1.1 dwinter 273: else:
274: file = REQUEST.form.get('file')
275: headers = getattr(file, 'headers', None)
276: if headers is None or not file.filename:
277: zpt = ECHO_xslt(id)
278: else:
279: zpt = ECHO_xslt(id, file, headers.get('contentType'))
280:
281: self._setObject(id, zpt)
282: ob = getattr(self, id)
283: setattr(ob,'weight',weight)
284: setattr(ob,'label',label)
1.4 dwinter 285: setattr(ob,'cgiUrl',cgiUrl)
1.1 dwinter 286: if title:
287: ob.pt_setTitle(title)
288:
289: try:
290: u = self.DestinationURL()
291: except AttributeError:
292: u = REQUEST['URL1']
293:
294: if submit == " Add and Edit ":
295: u = "%s/%s" % (u, quote(id))
296: REQUEST.RESPONSE.redirect(u+'/manage_main')
297: return ''
298:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>