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("/var/tmp/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: #abwaertskompatibilitt 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"):
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:
470: _links=urllib.unquote(_links)
471: tmp=self.addLinks(tmp,url=_links)
472:
473: #bugfix for digilib images which doesn't accept &
474: tmp=tmp.replace("&","&")
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: fr den Pfad, is passURL gesetzt, dann wird falls fn= eine vollstndige url enthlt, 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: fromCache=self.cache.retrieveObject(self.baseUri,"-1")
518: if fromCache and _caching=="yes":
519:
520: txt = fromCache
521: else:
522:
523: txt=urllib.urlopen(xmlt).read()
524:
525: self.cache.storeObject(self.baseUri,"-1",txt)
526:
527:
528: dom=NonvalidatingReader.parseString(txt,self.baseUri)
529:
530: #pb should have a namespache
531:
532: pbs=dom.xpath("//mpiwg:pb",explicitNss={'mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})
533:
534: if len(pbs)==0: # versuche nochmal ohne
535: pbs=dom.xpath("//pb")
536:
537: if _id:
538: #suche wieviele pb for der id
539:
540:
541: idpb=dom.xpath("//*[@id='%s']/preceding::node()/mpiwg:pb"%_id,explicitNss={'html':'http://test.de','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'})
542: if len(idpb)==0:
543: idpb=dom.xpath("//*[@id='%s']/preceding::node()/pb"%_id)
544:
545: if len(idpb)==0:
546: k=0
547: for node in dom.xpath("//*[@id='%s']//preceding::node()"%_id,explicitNss={'html':'http://test.de','mpiwg':'http://www.mpiwg-berlin.mpg.de/namespace'}):
548: if getattr(node,'tagName',"")=="mpiwg:pb":
549: k+=1
550: else:
551: k=len(idpb)
552: pn=k-1 #-1 wegen Seitenzahlzaehlung startet mit 0
553:
554: if pn > len(pbs):
555: if REQUEST:
556: return "Sorry, pagenumber %s does not exit"%(pn+1)
557: else:
558: return None
559:
560: beginNode=pbs[pn] #take the n'th pb
561:
562: if not (pn==len(pbs)-1): # nicht die letzte Seite
563: endNode=pbs[pn+1]
564: else:
565: endNode=None
566:
567: deleteNodes=beginNode.xpath('preceding::node()')
568: if endNode:
569: deleteNodes+=endNode.xpath('following::node()')
570: for node in deleteNodes:
571: try:
572: parent=node.xpath("..")
573:
574: if parent:
575: parent[0].removeChild(node)
576: except:
577: zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
578: strio = StringIO()
579: PrettyPrint(dom,strio)
580: xmlstr = strio.getvalue()
581:
582: return xmlstr
583:
584:
585:
586: def manage_addECHO_xsltForm(self):
587: """Form for adding"""
588: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddECHO_xslt.zpt')).__of__(self)
589: return pt()
590:
591: from urllib import quote
592:
593:
594: def manage_addECHO_xslt(self, id, label, weight= 0,contentType=0,title=None, text=None, cgiUrl=None,
595: REQUEST=None, submit=None):
596: "Add a Page Template with optional file content."
597:
598:
599: id = str(id)
600: if REQUEST is None:
601: self._setObject(id, ECHO_xslt(id, text))
602: ob = getattr(self, id)
603: setattr(ob,'weight',weight)
604: setattr(ob,'label',label)
605: setattr(ob,'contentType',contentType)
606: if title:
607: ob.pt_setTitle(title)
608: return ob
609: setattr(ob,'cgiUrl',cgiUrl)
610: else:
611: file = REQUEST.form.get('file')
612: headers = getattr(file, 'headers', None)
613: if headers is None or not file.filename:
614: zpt = ECHO_xslt(id)
615: else:
616: zpt = ECHO_xslt(id, file, headers.get('contentType'))
617:
618: self._setObject(id, zpt)
619: ob = getattr(self, id)
620: setattr(ob,'weight',weight)
621: setattr(ob,'label',label)
622: setattr(ob,'cgiUrl',cgiUrl)
623: if title:
624: ob.pt_setTitle(title)
625:
626: try:
627: u = self.DestinationURL()
628: except AttributeError:
629: u = REQUEST['URL1']
630:
631: if submit == " Add and Edit ":
632: u = "%s/%s" % (u, quote(id))
633: REQUEST.RESPONSE.redirect(u+'/manage_main')
634: return ''
635:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>