Changeset 494:ecdb238aa595 in documentViewer for documentViewer.py
- Timestamp:
- Jun 13, 2006, 2:57:46 PM (18 years ago)
- Branch:
- roc_1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
documentViewer.py
r0 r494 1 2 genericDigilib="http://nausikaa2.rz-berlin.mpg.de/digitallibrary/"3 4 1 from OFS.Folder import Folder 5 2 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate 6 3 from Products.PageTemplates.PageTemplateFile import PageTemplateFile 7 4 from AccessControl import ClassSecurityInfo 5 from AccessControl import getSecurityManager 8 6 from Globals import package_home 9 7 … … 15 13 16 14 import os.path 15 import sys 17 16 import cgi 18 17 import urllib 18 import zLOG 19 20 def getInt(number, default=0): 21 """returns always an int (0 in case of problems)""" 22 try: 23 return int(number) 24 except: 25 return default 19 26 20 27 def getTextFromNode(nodename): 28 if nodename is None: 29 return "" 21 30 nodelist=nodename.childNodes 22 31 rc = "" … … 26 35 return rc 27 36 37 38 def getParentDir(path): 39 """returns pathname shortened by one""" 40 return '/'.join(path.split('/')[0:-1]) 41 42 28 43 import socket 29 44 30 def urlopen(url ):45 def urlopen(url,timeout=2): 31 46 """urlopen mit timeout""" 32 socket.setdefaulttimeout( 2)47 socket.setdefaulttimeout(timeout) 33 48 ret=urllib.urlopen(url) 34 49 socket.setdefaulttimeout(5) 35 50 return ret 36 37 def getParamFromDigilib(path,param): 38 """gibt param von dlInfo aus""" 39 imageUrl=genericDigilib+"/dlInfo-xml.jsp?fn="+path 40 41 try: 42 dom = NonvalidatingReader.parseUri(imageUrl) 43 except: 44 return None 45 46 47 params=dom.xpath("//document-parameters/parameter[@name='%s']/@value"%param) 48 49 if params: 50 return params[0].value 51 52 def parseUrlTextTool(url): 53 """parse index meta""" 54 55 try: 56 dom = NonvalidatingReader.parseUri(url) 57 except: 58 zLOG.LOG("documentViewer (parseUrlTexttool)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) 59 return (None,None,None) 60 61 archivePaths=dom.xpath("//resource/archive-path") 62 63 if archivePaths and (len(archivePaths)>0): 64 archivePath=getTextFromNode(archivePaths[0]) 65 else: 66 archivePath=None 67 68 69 images=dom.xpath("//texttool/image") 70 71 if images and (len(images)>0): 72 image=getTextFromNode(images[0]) 73 else: 74 image=None 75 76 if image and archivePath: 77 image=os.path.join(archivePath,image) 78 image=image.replace("/mpiwg/online",'') 79 pt=getParamFromDigilib(image,'pt') 80 81 else: 82 image=None 83 84 viewerUrls=dom.xpath("//texttool/digiliburlprefix") 85 86 if viewerUrls and (len(viewerUrls)>0): 87 viewerUrl=getTextFromNode(viewerUrls[0]) 88 else: 89 viewerUrl=None 90 91 92 textUrls=dom.xpath("//texttool/text") 93 94 if textUrls and (len(textUrls)>0): 95 textUrl=getTextFromNode(textUrls[0]) 96 else: 97 textUrl=None 98 return viewerUrl,(image,pt),textUrl 99 100 101 class documentViewer(ZopePageTemplate): 51 52 53 ## 54 ## documentViewer class 55 ## 56 class documentViewer(Folder): 102 57 """document viewer""" 103 58 … … 105 60 106 61 security=ClassSecurityInfo() 107 manage_options= ZopePageTemplate.manage_options+(62 manage_options=Folder.manage_options+( 108 63 {'label':'main config','action':'changeDocumentViewerForm'}, 109 64 ) 110 65 111 _default_content_fn = os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt') 112 113 def __init__(self,id,imageViewerUrl,title=""): 66 # templates and forms 67 viewer_main = PageTemplateFile('zpt/viewer_main', globals()) 68 thumbs_main = PageTemplateFile('zpt/thumbs_main', globals()) 69 image_main = PageTemplateFile('zpt/image_main', globals()) 70 head_main = PageTemplateFile('zpt/head_main', globals()) 71 docuviewer_css = PageTemplateFile('css/docuviewer.css', globals()) 72 73 security.declareProtected('View management screens','changeDocumentViewerForm') 74 changeDocumentViewerForm = PageTemplateFile('zpt/changeDocumentViewer', globals()) 75 76 77 def __init__(self,id,imageViewerUrl,title="",digilibBaseUrl=None,thumbcols=2,thumbrows=10,authgroups="mpiwg"): 114 78 """init document viewer""" 115 79 self.id=id 116 80 self.title=title 117 81 self.imageViewerUrl=imageViewerUrl 118 119 security.declareProtected('View management screens','changeDocumentViewerForm') 120 def changeDocumentViewerForm(self): 121 """change it""" 122 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeDocumentViewer.zpt')).__of__(self) 123 return pt() 82 if not digilibBaseUrl: 83 self.digilibBaseUrl = self.findDigilibUrl() 84 else: 85 self.digilibBaseUrl = digilibBaseUrl 86 self.thumbcols = thumbcols 87 self.thumbrows = thumbrows 88 # authgroups is list of authorized groups (delimited by ,) 89 self.authgroups = [s.strip().lower() for s in authgroups.split(',')] 90 # add template folder so we can always use template.something 91 self.manage_addFolder('template') 92 93 94 security.declareProtected('View','index_html') 95 def index_html(self,mode,url,start=None,pn=1): 96 ''' 97 view it 98 @param mode: defines which type of document is behind url 99 @param url: url which contains display information 100 ''' 101 102 zLOG.LOG("documentViewer (index)", zLOG.INFO, "mode: %s url:%s start:%s pn:%s"%(mode,url,start,pn)) 103 104 if not hasattr(self, 'template'): 105 # create template folder if it doesn't exist 106 self.manage_addFolder('template') 107 108 if not self.digilibBaseUrl: 109 self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary" 110 111 docinfo = self.getDocinfo(mode=mode,url=url) 112 pageinfo = self.getPageinfo(start=start,current=pn,docinfo=docinfo) 113 pt = getattr(self.template, 'viewer_main') 114 return pt(docinfo=docinfo,pageinfo=pageinfo) 124 115 125 116 126 def changeDocumentViewer(self,imageViewerUrl,title="",RESPONSE=None): 127 """init document viewer""" 128 self.title=title 129 self.imageViewerUrl=imageViewerUrl 130 131 if RESPONSE is not None: 132 RESPONSE.redirect('manage_main') 133 134 135 def imageLink(self,nr): 136 """link hinter den images""" 137 paramsTmp=cgi.parse_qs(self.REQUEST['QUERY_STRING']) 138 params={} 139 for x in paramsTmp.iteritems(): 140 params[x[0]]=x[1][0] 141 142 params['pn']=nr 143 newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params) 144 return newUrl 145 146 147 def thumbruler(self,cols,rows,start,maximum): 148 """ruler for thumbs""" 149 ret="" 150 paramsTmp=cgi.parse_qs(self.REQUEST['QUERY_STRING']) 151 params={} 152 for x in paramsTmp.iteritems(): 153 154 if not x[0]=="start": 155 params[x[0]]=x[1][0] 156 157 newUrlSelect=self.REQUEST['URL']+"?"+urllib.urlencode(params) 158 if start>0: 159 newStart=max(start-cols*rows,0) 160 params['start']=newStart 161 newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params) 162 ret+="""<a href="%s">prev</a>"""%newUrl 163 164 165 ret+="""<select onChange="location.href='%s&start='+this.options[this.selectedIndex].value" """%newUrlSelect 166 nr,rest=divmod(maximum,cols*rows) 167 if rest > 0: 168 nr+=1 169 for i in range(nr): 170 nr=i*cols*rows 117 def getLink(self,param=None,val=None): 118 """link to documentviewer with parameter param set to val""" 119 params=self.REQUEST.form.copy() 120 if param is not None: 121 if val is None: 122 if params.has_key(param): 123 del params[param] 124 else: 125 params[param] = str(val) 126 127 # quote values and assemble into query string 128 ps = "&".join(["%s=%s"%(k,urllib.quote(v)) for (k, v) in params.items()]) 129 url=self.REQUEST['URL1']+"?"+ps 130 return url 131 132 133 def getStyle(self, idx, selected, style=""): 134 """returns a string with the given style and append 'sel' if path == selected.""" 135 #zLOG.LOG("documentViewer (getstyle)", zLOG.INFO, "idx: %s selected: %s style: %s"%(idx,selected,style)) 136 if idx == selected: 137 return style + 'sel' 138 else: 139 return style 140 141 142 def isAccessible(self, docinfo): 143 """returns if access to the resource is granted""" 144 access = docinfo.get('accessType', None) 145 if access is None: 146 # no information - no access 147 #TODO: check 148 return True 149 elif access == 'free': 150 return True 151 elif access in self.authgroups: 152 # only local access -- only logged in users 153 user = getSecurityManager().getUser() 154 if user is not None: 155 #print "user: ", user 156 return (user.getUserName() != "Anonymous User") 157 else: 158 return False 159 160 zLOG.LOG("documentViewer (accessOK)", zLOG.INFO, "unknown access type %s"%access) 161 return False 162 163 164 def getDirinfoFromDigilib(self,path,docinfo=None): 165 """gibt param von dlInfo aus""" 166 if docinfo is None: 167 docinfo = {} 168 169 imageUrl=self.digilibBaseUrl+"/dirInfo-xml.jsp?mo=dir&fn="+path 170 171 zLOG.LOG("documentViewer (getparamfromdigilib)", zLOG.INFO, "dirInfo from %s"%(imageUrl)) 172 173 for cnt in (1,2,3): 174 try: 175 dom = NonvalidatingReader.parseUri(imageUrl) 176 break 177 except: 178 zLOG.LOG("documentViewer (getdirinfofromdigilib)", zLOG.ERROR, "error reading %s (try %d)"%(imageUrl,cnt)) 179 else: 180 raise IOError("Unable to get dir-info from %s"%(imageUrl)) 181 182 sizes=dom.xpath("//dir/size") 183 zLOG.LOG("documentViewer (getparamfromdigilib)", zLOG.INFO, "dirInfo:size"%sizes) 184 185 if sizes: 186 docinfo['numPages'] = int(getTextFromNode(sizes[0])) 187 else: 188 docinfo['numPages'] = 0 189 190 return docinfo 191 192 193 def getIndexMeta(self, url): 194 """returns dom of index.meta document at url""" 195 num_retries = 3 196 dom = None 197 metaUrl = None 198 if url.startswith("http://"): 199 # real URL 200 metaUrl = url 201 try: 202 dom = NonvalidatingReader.parseUri(url) 203 except: 204 zLOG.LOG("documentViewer (getIndexMata)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) 205 raise IOError("Unable to read index.meta from %s"%(url)) 206 else: 207 # online path 208 server=self.digilibBaseUrl+"/servlet/Texter?fn=" 209 metaUrl=server+url 210 if not metaUrl.endswith("index.meta"): 211 metaUrl += "/index.meta" 212 213 for n in range(num_retries): 214 try: 215 dom = NonvalidatingReader.parseUri(metaUrl) 216 zLOG.LOG("documentViewer (getIndexMata)", zLOG.INFO,metaUrl) 217 break 218 except: 219 zLOG.LOG("ERROR documentViewer (getIndexMata)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2]) 220 221 if dom is None: 222 raise IOError("Unable to read index meta from %s"%(url)) 223 224 return dom 225 226 227 def getAuthinfoFromIndexMeta(self,path,docinfo=None,dom=None): 228 """gets authorization info from the index.meta file at path or given by dom""" 229 zLOG.LOG("documentViewer (getauthinfofromindexmeta)", zLOG.INFO,"path: %s"%(path)) 230 231 access = None 232 233 if docinfo is None: 234 docinfo = {} 235 236 if dom is None: 237 dom = self.getIndexMeta(getParentDir(path)) 238 239 acctype = dom.xpath("//access-conditions/access/@type") 240 if acctype and (len(acctype)>0): 241 access=acctype[0].value 242 if access in ['group', 'institution']: 243 access = getTextFromNode(dom.xpath("//access-conditions/access/name")[0]).lower() 244 245 docinfo['accessType'] = access 246 return docinfo 247 248 249 def getBibinfoFromIndexMeta(self,path,docinfo=None,dom=None): 250 """gets bibliographical info from the index.meta file at path or given by dom""" 251 zLOG.LOG("documentViewer (getbibinfofromindexmeta)", zLOG.INFO,"path: %s"%(path)) 252 253 if docinfo is None: 254 docinfo = {} 255 256 if dom is None: 257 dom = self.getIndexMeta(getParentDir(path)) 258 259 metaData=self.metadata.main.meta.bib 260 bibtype=dom.xpath("//bib/@type") 261 if bibtype and (len(bibtype)>0): 262 bibtype=bibtype[0].value 263 else: 264 bibtype="generic" 265 bibtype=bibtype.replace("-"," ") # wrong typesiin index meta "-" instead of " " (not wrong! ROC) 266 bibmap=metaData.generateMappingForType(bibtype) 267 #print "bibmap: ", bibmap, " for: ", bibtype 268 # if there is no mapping bibmap is empty (mapping sometimes has empty fields) 269 if len(bibmap) > 0 and len(bibmap['author'][0]) > 0: 270 docinfo['author']=getTextFromNode(dom.xpath("//bib/%s"%bibmap['author'][0])[0]) 271 docinfo['title']=getTextFromNode(dom.xpath("//bib/%s"%bibmap['title'][0])[0]) 272 docinfo['year']=getTextFromNode(dom.xpath("//bib/%s"%bibmap['year'][0])[0]) 273 274 return docinfo 275 276 277 def getDocinfoFromTextTool(self,url,dom=None,docinfo=None): 278 """parse texttool tag in index meta""" 279 zLOG.LOG("documentViewer (getdocinfofromtexttool)", zLOG.INFO,"url: %s"%(url)) 280 if docinfo is None: 281 docinfo = {} 171 282 172 if (start >= nr) and (start < nr+cols*rows): 173 ret+="""<option value="%s" selected>%s</option>"""%(nr,nr) 174 else: 175 ret+="""<option value="%s">%s</option>"""%(nr,nr) 176 ret+="</select>" 177 178 if start<maximum: 179 newStart=min(start+cols*rows,maximum) 180 params['start']=newStart 181 newUrl=self.REQUEST['URL']+"?"+urllib.urlencode(params) 182 ret+="""<a href="%s">next</a>"""%newUrl 183 184 return ret 185 186 def textToolThumb(self,url,start=0): 187 """understands the texttool format 188 @param url: url to index.meta with texttool tag 189 """ 190 (viewerUrl,imagepath,textpath)=parseUrlTextTool(url) 191 192 imageUrl=genericDigilib+"/servlet/Scaler?fn=%s"%imagepath[0] 193 194 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','thumbs.zpt')).__of__(self) 195 return pt(imageUrl=imageUrl,pt=imagepath[1],start=start) 196 283 if dom is None: 284 dom = self.getIndexMeta(url) 285 286 archiveNames=dom.xpath("//resource/name") 287 if archiveNames and (len(archiveNames)>0): 288 archiveName=getTextFromNode(archiveNames[0]) 289 290 archivePaths=dom.xpath("//resource/archive-path") 291 if archivePaths and (len(archivePaths)>0): 292 archivePath=getTextFromNode(archivePaths[0]) 293 # clean up archive path 294 if archivePath[0] != '/': 295 archivePath = '/' + archivePath 296 if not archivePath.endswith(archiveName): 297 archivePath += "/" + archiveName 298 else: 299 archivePath=None 300 301 imageDirs=dom.xpath("//texttool/image") 302 if imageDirs and (len(imageDirs)>0): 303 imageDir=getTextFromNode(imageDirs[0]) 304 else: 305 # we balk with no image tag 306 raise IOError("No text-tool info in %s"%(url)) 307 308 if imageDir and archivePath: 309 #print "image: ", imageDir, " archivepath: ", archivePath 310 imageDir=os.path.join(archivePath,imageDir) 311 imageDir=imageDir.replace("/mpiwg/online",'') 312 docinfo=self.getDirinfoFromDigilib(imageDir,docinfo=docinfo) 313 docinfo['imagePath'] = imageDir 314 docinfo['imageURL'] = self.digilibBaseUrl+"/servlet/Scaler?fn="+imageDir 315 316 viewerUrls=dom.xpath("//texttool/digiliburlprefix") 317 if viewerUrls and (len(viewerUrls)>0): 318 viewerUrl=getTextFromNode(viewerUrls[0]) 319 docinfo['viewerURL'] = viewerUrl 320 321 textUrls=dom.xpath("//texttool/text") 322 if textUrls and (len(textUrls)>0): 323 textUrl=getTextFromNode(textUrls[0]) 324 docinfo['textURL'] = textUrl 325 326 docinfo = self.getBibinfoFromIndexMeta(url,docinfo=docinfo,dom=dom) 327 docinfo = self.getAuthinfoFromIndexMeta(url,docinfo=docinfo,dom=dom) 328 return docinfo 329 330 331 def getDocinfoFromImagePath(self,path,docinfo=None): 332 """path ist the path to the images it assumes that the index.meta file is one level higher.""" 333 zLOG.LOG("documentViewer (getdocinfofromimagepath)", zLOG.INFO,"path: %s"%(path)) 334 if docinfo is None: 335 docinfo = {} 336 path=path.replace("/mpiwg/online","") 337 docinfo['imagePath'] = path 338 docinfo=self.getDirinfoFromDigilib(path,docinfo=docinfo) 339 imageUrl=self.digilibBaseUrl+"/servlet/Scaler?fn="+path 340 docinfo['imageURL'] = imageUrl 341 342 docinfo = self.getBibinfoFromIndexMeta(path,docinfo=docinfo) 343 docinfo = self.getAuthinfoFromIndexMeta(path,docinfo=docinfo) 344 return docinfo 345 346 347 def getDocinfo(self, mode, url): 348 """returns docinfo depending on mode""" 349 zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"mode: %s, url: %s"%(mode,url)) 350 # look for cached docinfo in session 351 if self.REQUEST.SESSION.has_key('docinfo'): 352 docinfo = self.REQUEST.SESSION['docinfo'] 353 # check if its still current 354 if docinfo is not None and docinfo.get('mode') == mode and docinfo.get('url') == url: 355 zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"docinfo in session: %s"%docinfo) 356 return docinfo 357 # new docinfo 358 docinfo = {'mode': mode, 'url': url} 359 if mode=="texttool": #index.meta with texttool information 360 docinfo = self.getDocinfoFromTextTool(url, docinfo=docinfo) 361 elif mode=="imagepath": 362 docinfo = self.getDocinfoFromImagePath(url, docinfo=docinfo) 363 else: 364 zLOG.LOG("documentViewer (getdocinfo)", zLOG.ERROR,"unknown mode!") 365 raise ValueError("Unknown mode %s"%(mode)) 366 367 zLOG.LOG("documentViewer (getdocinfo)", zLOG.INFO,"docinfo: %s"%docinfo) 368 self.REQUEST.SESSION['docinfo'] = docinfo 369 return docinfo 370 371 372 def getPageinfo(self, current, start=None, rows=None, cols=None, docinfo=None): 373 """returns pageinfo with the given parameters""" 374 pageinfo = {} 375 current = getInt(current) 376 pageinfo['current'] = current 377 rows = int(rows or self.thumbrows) 378 pageinfo['rows'] = rows 379 cols = int(cols or self.thumbcols) 380 pageinfo['cols'] = cols 381 grpsize = cols * rows 382 pageinfo['groupsize'] = grpsize 383 start = getInt(start, default=(int(current / grpsize) * grpsize +1)) 384 pageinfo['start'] = start 385 pageinfo['end'] = start + grpsize 386 if docinfo is not None: 387 np = int(docinfo['numPages']) 388 pageinfo['end'] = min(pageinfo['end'], np) 389 pageinfo['numgroups'] = int(np / grpsize) 390 if np % grpsize > 0: 391 pageinfo['numgroups'] += 1 392 393 return pageinfo 394 197 395 def text(self,mode,url,pn): 198 396 """give text""" … … 200 398 (viewerUrl,imagepath,textpath)=parseUrlTextTool(url) 201 399 202 print textpath400 #print textpath 203 401 try: 204 402 dom = NonvalidatingReader.parseUri(textpath) … … 235 433 236 434 if p==e:# beide im selben paragraphen 237 238 else: 239 next=p 240 while next!=e: 241 print next,e 242 list.append(next) 243 next=next.nextSibling 244 245 for x in list: 246 PrettyPrint(x) 247 248 return list 249 250 def image(self,mode,url,pn): 251 """give image out""" 252 if mode=="texttool": #index.meta with texttool information 253 (viewerUrl,imagepath,textpath)=parseUrlTextTool(url) 254 url=viewerUrl+"pn=%s&fn=%s"%(pn,imagepath[0]) 255 ret="""<iframe height="100%%" width="100%%" src="%s"/>"""%url 256 return url 257 258 def thumbs(self,mode,url,start): 259 """give thumbs out""" 260 if mode=="texttool": #index.meta with texttool information 261 return self.textToolThumb(url,int(start)) 262 263 security.declareProtected('View','index_html') 264 265 266 def index_html(self,mode,url,start=0,pn=0): 267 ''' 268 view it 269 @param mode: defines which type of document is behind url 270 @param url: url which contains display information 271 ''' 272 273 274 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','documentViewer_template.zpt')).__of__(self) 275 return pt(mode=mode,url=url,start=start,pn=pn) 276 435 pass 436 # else: 437 # next=p 438 # while next!=e: 439 # print next,e 440 # list.append(next) 441 # next=next.nextSibling 442 # 443 # for x in list: 444 # PrettyPrint(x) 445 # 446 # return list 447 # 448 449 def findDigilibUrl(self): 450 """try to get the digilib URL from zogilib""" 451 url = self.imageViewerUrl[:-1] + "/getScalerUrl" 452 try: 453 scaler = urlopen(url).read() 454 return scaler.replace("/servlet/Scaler?", "") 455 except: 456 return None 457 458 def changeDocumentViewer(self,imageViewerUrl,title="",digilibBaseUrl=None,thumbrows=2,thumbcols=10,authgroups='mpiwg',RESPONSE=None): 459 """init document viewer""" 460 self.title=title 461 self.imageViewerUrl=imageViewerUrl 462 self.digilibBaseUrl = digilibBaseUrl 463 self.thumbrows = thumbrows 464 self.thumbcols = thumbcols 465 self.authgroups = [s.strip().lower() for s in authgroups.split(',')] 466 if RESPONSE is not None: 467 RESPONSE.redirect('manage_main') 468 469 277 470 278 471 … … 281 474 def manage_AddDocumentViewerForm(self): 282 475 """add the viewer form""" 283 pt=PageTemplateFile( os.path.join(package_home(globals()),'zpt','addDocumentViewer.zpt')).__of__(self)476 pt=PageTemplateFile('zpt/addDocumentViewer', globals()).__of__(self) 284 477 return pt() 285 478 … … 291 484 if RESPONSE is not None: 292 485 RESPONSE.redirect('manage_main') 293 486 487 488 ## 489 ## DocumentViewerTemplate class 490 ## 491 class DocumentViewerTemplate(ZopePageTemplate): 492 """Template for document viewer""" 493 meta_type="DocumentViewer Template" 494 495 496 def manage_addDocumentViewerTemplateForm(self): 497 """Form for adding""" 498 pt=PageTemplateFile('zpt/addDocumentViewerTemplate', globals()).__of__(self) 499 return pt() 500 501 def manage_addDocumentViewerTemplate(self, id='viewer_main', title=None, text=None, 502 REQUEST=None, submit=None): 503 "Add a Page Template with optional file content." 504 505 self._setObject(id, DocumentViewerTemplate(id)) 506 ob = getattr(self, id) 507 ob.pt_edit(open(os.path.join(package_home(globals()),'zpt/viewer_main.zpt')).read(),None) 508 if title: 509 ob.pt_setTitle(title) 510 try: 511 u = self.DestinationURL() 512 except AttributeError: 513 u = REQUEST['URL1'] 514 515 u = "%s/%s" % (u, urllib.quote(id)) 516 REQUEST.RESPONSE.redirect(u+'/manage_main') 517 return '' 518 519 520
Note: See TracChangeset
for help on using the changeset viewer.