Annotation of zogiLib/zogiLib.py, revision 1.4
1.1 dwinter 1: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
2: from Products.PageTemplates.PageTemplate import PageTemplate
3: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
1.4 ! dwinter 4: from OFS.Image import Image
! 5: from webdav.common import rfc1123_date
1.1 dwinter 6:
7: import xml.dom.minidom
8: from OFS.Folder import Folder
9: from xml_helpers import getText
10: import os
11: import re
12: import string
13: import urllib
14: from Globals import package_home
15:
16: def getString(self,key,default=''):
17: try:
18: return self.REQUEST[key]
19: except:
20: return default
21:
22:
23: class zogiLib_navTemplate(ZopePageTemplate):
24: """pageTemplate Objekt"""
25: meta_type="zogiLib_navTemplate"
26:
27: _default_content_fn = os.path.join(package_home(globals()),
28: 'zpt/zogiLib_NavTemplateDefault.zpt')
29:
30: manage_options=ZopePageTemplate.manage_options+(
31: {'label':'Copy to Filesystem','action':'copyContent'},
32: )
33:
34: def getPath(self):
35: """get path"""
36: return getPath(self,'thumbtemplate.templ')
37:
38: ## def changeECHO_pageTemplateWeightForm(self):
39: ## """change"""
40: ## pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_pageTemplateWeight.zpt').__of__(self)
41: ## return pt()
42:
43: ## def changeECHO_pageTemplateWeight(self,weight,content_type,RESPONSE=None):
44: ## """change"""
45: ## self.weight=weight
46: ## self.content_type=content_type
47:
48: ## if RESPONSE is not None:
49: ## RESPONSE.redirect('manage_main')
50:
51:
52: def copyContent(self):
53: """copycontent to path"""
54:
55: return "copied to:"+copyContent(self,'thumbtemplate.templ')
56:
57:
58: def manage_addZogiLib_NavTemplateForm(self):
59: """Form for adding"""
1.3 dwinter 60: pt=PageTemplateFile('Products/zogiLib/zpt/AddZogilib_NavTemplate.zpt').__of__(self)
1.1 dwinter 61: return pt()
62:
63:
64:
65:
66: def manage_addZogiLib_NavTemplate(self, id,title=None, text=None,
67: REQUEST=None, submit=None):
68: "Add a Page Template with optional file content."
69:
70:
71: id = str(id)
72: if REQUEST is None:
73: self._setObject(id, zogilib_NavTemplate(id, text))
74: ob = getattr(self, id)
75:
76: if title:
77: ob.pt_setTitle(title)
78: return ob
79: else:
80: file = REQUEST.form.get('file')
81: headers = getattr(file, 'headers', None)
82: if headers is None or not file.filename:
83: zpt = zogilib_NavTemplate(id)
84: else:
85: zpt = zogilib_NavTemplate(id, file, headers.get('content_type'))
86:
87: self._setObject(id, zpt)
88: ob = getattr(self, id)
89:
90:
91: try:
92: u = self.DestinationURL()
93: except AttributeError:
94: u = REQUEST['URL1']
95:
96: if submit == " Add and Edit ":
97: u = "%s/%s" % (u, quote(id))
98: REQUEST.RESPONSE.redirect(u+'/manage_main')
99: return ''
100:
1.3 dwinter 101:
102:
1.1 dwinter 103: def readNavTemp(fileName):
104: """navtemp"""
1.3 dwinter 105:
1.1 dwinter 106:
107: if os.path.exists(fileName+"/index.meta"):
108: dom=xml.dom.minidom.parse(fileName+"/index.meta")
109: else:
110: return None
111:
1.3 dwinter 112:
1.1 dwinter 113: try:
114: navTag=getText(dom.getElementsByTagName('zogilibtemplate')[0].childNodes)
115: except:
116: navTag=None
117: return navTag
118:
1.4 ! dwinter 119: class zogiImage(Image):
! 120: """einzelnes Image"""
! 121: meta_type="zogiImage"
! 122:
! 123:
! 124:
! 125: def __init__(self,id,title,baseUrl,queryString,content_type='',precondition=''):
! 126: """init"""
! 127: self.id=id
! 128: self.title=title
! 129: self.baseUrl=baseUrl
! 130: self.queryString=queryString
! 131: self.content_type=content_type
! 132: self.precondition=precondition
! 133:
! 134: def getData(self):
! 135: """getUrlData"""
! 136: return urllib.urlopen(self.baseUrl+self.queryString)
! 137:
! 138: def changeZogiImageForm(self):
! 139: """Main configuration"""
! 140: pt=PageTemplateFile('Products/zogiLib/zpt/changeZogiImageForm.zpt').__of__(self)
! 141: return pt()
! 142:
! 143: def changeZogiImage(self,title,baseUrl, queryString,RESPONSE=None):
! 144: """change it"""
! 145: self.title=title
! 146: self.baseUrl=baseUrl
! 147: self.queryString=queryString
! 148:
! 149: if RESPONSE is not None:
! 150: RESPONSE.redirect('manage_main')
! 151:
! 152:
! 153: manage_options=ZopePageTemplate.manage_options+(
! 154: {'label':'Main config','action':'changeZogiImageForm'},
! 155: )
! 156:
! 157:
! 158:
! 159:
! 160: def index_html(self, REQUEST, RESPONSE):
! 161: """
! 162: Modified version of OFS/Image.py
1.1 dwinter 163:
1.4 ! dwinter 164: The default view of the contents of a File or Image.
! 165:
! 166: Returns the contents of the file or image. Also, sets the
! 167: Content-Type HTTP header to the objects content type.
! 168: """
! 169:
! 170: # HTTP If-Modified-Since header handling.
! 171: header=REQUEST.get_header('If-Modified-Since', None)
! 172: if header is not None:
! 173: header=header.split( ';')[0]
! 174: # Some proxies seem to send invalid date strings for this
! 175: # header. If the date string is not valid, we ignore it
! 176: # rather than raise an error to be generally consistent
! 177: # with common servers such as Apache (which can usually
! 178: # understand the screwy date string as a lucky side effect
! 179: # of the way they parse it).
! 180: # This happens to be what RFC2616 tells us to do in the face of an
! 181: # invalid date.
! 182: try: mod_since=long(DateTime(header).timeTime())
! 183: except: mod_since=None
! 184: if mod_since is not None:
! 185: if self._p_mtime:
! 186: last_mod = long(self._p_mtime)
! 187: else:
! 188: last_mod = long(0)
! 189: if last_mod > 0 and last_mod <= mod_since:
! 190: # Set header values since apache caching will return Content-Length
! 191: # of 0 in response if size is not set here
! 192: RESPONSE.setHeader('Last-Modified', rfc1123_date(self._p_mtime))
! 193: RESPONSE.setHeader('Content-Type', self.content_type)
! 194: RESPONSE.setHeader('Content-Length', self.size)
! 195: RESPONSE.setHeader('Accept-Ranges', 'bytes')
! 196: self.ZCacheable_set(None)
! 197: RESPONSE.setStatus(304)
! 198: return ''
! 199:
! 200: if self.precondition and hasattr(self,self.precondition):
! 201: # Grab whatever precondition was defined and then
! 202: # execute it. The precondition will raise an exception
! 203: # if something violates its terms.
! 204: c=getattr(self,self.precondition)
! 205: if hasattr(c,'isDocTemp') and c.isDocTemp:
! 206: c(REQUEST['PARENTS'][1],REQUEST)
! 207: else:
! 208: c()
! 209:
! 210: # HTTP Range header handling
! 211: range = REQUEST.get_header('Range', None)
! 212: request_range = REQUEST.get_header('Request-Range', None)
! 213: if request_range is not None:
! 214: # Netscape 2 through 4 and MSIE 3 implement a draft version
! 215: # Later on, we need to serve a different mime-type as well.
! 216: range = request_range
! 217: if_range = REQUEST.get_header('If-Range', None)
! 218: if range is not None:
! 219: ranges = HTTPRangeSupport.parseRange(range)
! 220:
! 221: if if_range is not None:
! 222: # Only send ranges if the data isn't modified, otherwise send
! 223: # the whole object. Support both ETags and Last-Modified dates!
! 224: if len(if_range) > 1 and if_range[:2] == 'ts':
! 225: # ETag:
! 226: if if_range != self.http__etag():
! 227: # Modified, so send a normal response. We delete
! 228: # the ranges, which causes us to skip to the 200
! 229: # response.
! 230: ranges = None
! 231: else:
! 232: # Date
! 233: date = if_range.split( ';')[0]
! 234: try: mod_since=long(DateTime(date).timeTime())
! 235: except: mod_since=None
! 236: if mod_since is not None:
! 237: if self._p_mtime:
! 238: last_mod = long(self._p_mtime)
! 239: else:
! 240: last_mod = long(0)
! 241: if last_mod > mod_since:
! 242: # Modified, so send a normal response. We delete
! 243: # the ranges, which causes us to skip to the 200
! 244: # response.
! 245: ranges = None
! 246:
! 247: if ranges:
! 248: # Search for satisfiable ranges.
! 249: satisfiable = 0
! 250: for start, end in ranges:
! 251: if start < self.size:
! 252: satisfiable = 1
! 253: break
! 254:
! 255: if not satisfiable:
! 256: RESPONSE.setHeader('Content-Range',
! 257: 'bytes */%d' % self.size)
! 258: RESPONSE.setHeader('Accept-Ranges', 'bytes')
! 259: RESPONSE.setHeader('Last-Modified',
! 260: rfc1123_date(self._p_mtime))
! 261: RESPONSE.setHeader('Content-Type', self.content_type)
! 262: RESPONSE.setHeader('Content-Length', self.size)
! 263: RESPONSE.setStatus(416)
! 264: return ''
! 265:
! 266: ranges = HTTPRangeSupport.expandRanges(ranges, self.size)
! 267:
! 268: if len(ranges) == 1:
! 269: # Easy case, set extra header and return partial set.
! 270: start, end = ranges[0]
! 271: size = end - start
! 272:
! 273: RESPONSE.setHeader('Last-Modified',
! 274: rfc1123_date(self._p_mtime))
! 275: RESPONSE.setHeader('Content-Type', self.content_type)
! 276: RESPONSE.setHeader('Content-Length', size)
! 277: RESPONSE.setHeader('Accept-Ranges', 'bytes')
! 278: RESPONSE.setHeader('Content-Range',
! 279: 'bytes %d-%d/%d' % (start, end - 1, self.size))
! 280: RESPONSE.setStatus(206) # Partial content
! 281:
! 282: data = urllib.urlopen(self.baseUrl+self.queryString).read()
! 283: if type(data) is StringType:
! 284: return data[start:end]
! 285:
! 286: # Linked Pdata objects. Urgh.
! 287: pos = 0
! 288: while data is not None:
! 289: l = len(data.data)
! 290: pos = pos + l
! 291: if pos > start:
! 292: # We are within the range
! 293: lstart = l - (pos - start)
! 294:
! 295: if lstart < 0: lstart = 0
! 296:
! 297: # find the endpoint
! 298: if end <= pos:
! 299: lend = l - (pos - end)
! 300:
! 301: # Send and end transmission
! 302: RESPONSE.write(data[lstart:lend])
! 303: break
! 304:
! 305: # Not yet at the end, transmit what we have.
! 306: RESPONSE.write(data[lstart:])
! 307:
! 308: data = data.next
! 309:
! 310: return ''
! 311:
! 312: else:
! 313: boundary = choose_boundary()
! 314:
! 315: # Calculate the content length
! 316: size = (8 + len(boundary) + # End marker length
! 317: len(ranges) * ( # Constant lenght per set
! 318: 49 + len(boundary) + len(self.content_type) +
! 319: len('%d' % self.size)))
! 320: for start, end in ranges:
! 321: # Variable length per set
! 322: size = (size + len('%d%d' % (start, end - 1)) +
! 323: end - start)
! 324:
! 325:
! 326: # Some clients implement an earlier draft of the spec, they
! 327: # will only accept x-byteranges.
! 328: draftprefix = (request_range is not None) and 'x-' or ''
! 329:
! 330: RESPONSE.setHeader('Content-Length', size)
! 331: RESPONSE.setHeader('Accept-Ranges', 'bytes')
! 332: RESPONSE.setHeader('Last-Modified',
! 333: rfc1123_date(self._p_mtime))
! 334: RESPONSE.setHeader('Content-Type',
! 335: 'multipart/%sbyteranges; boundary=%s' % (
! 336: draftprefix, boundary))
! 337: RESPONSE.setStatus(206) # Partial content
! 338:
! 339: data = urllib.urlopen(self.baseUrl+self.queryString).read()
! 340: # The Pdata map allows us to jump into the Pdata chain
! 341: # arbitrarily during out-of-order range searching.
! 342: pdata_map = {}
! 343: pdata_map[0] = data
! 344:
! 345: for start, end in ranges:
! 346: RESPONSE.write('\r\n--%s\r\n' % boundary)
! 347: RESPONSE.write('Content-Type: %s\r\n' %
! 348: self.content_type)
! 349: RESPONSE.write(
! 350: 'Content-Range: bytes %d-%d/%d\r\n\r\n' % (
! 351: start, end - 1, self.size))
! 352:
! 353: if type(data) is StringType:
! 354: RESPONSE.write(data[start:end])
! 355:
! 356: else:
! 357: # Yippee. Linked Pdata objects. The following
! 358: # calculations allow us to fast-forward through the
! 359: # Pdata chain without a lot of dereferencing if we
! 360: # did the work already.
! 361: first_size = len(pdata_map[0].data)
! 362: if start < first_size:
! 363: closest_pos = 0
! 364: else:
! 365: closest_pos = (
! 366: ((start - first_size) >> 16 << 16) +
! 367: first_size)
! 368: pos = min(closest_pos, max(pdata_map.keys()))
! 369: data = pdata_map[pos]
! 370:
! 371: while data is not None:
! 372: l = len(data.data)
! 373: pos = pos + l
! 374: if pos > start:
! 375: # We are within the range
! 376: lstart = l - (pos - start)
! 377:
! 378: if lstart < 0: lstart = 0
! 379:
! 380: # find the endpoint
! 381: if end <= pos:
! 382: lend = l - (pos - end)
! 383:
! 384: # Send and loop to next range
! 385: RESPONSE.write(data[lstart:lend])
! 386: break
! 387:
! 388: # Not yet at the end, transmit what we have.
! 389: RESPONSE.write(data[lstart:])
! 390:
! 391: data = data.next
! 392: # Store a reference to a Pdata chain link so we
! 393: # don't have to deref during this request again.
! 394: pdata_map[pos] = data
! 395:
! 396: # Do not keep the link references around.
! 397: del pdata_map
! 398:
! 399: RESPONSE.write('\r\n--%s--\r\n' % boundary)
! 400: return ''
! 401:
! 402: RESPONSE.setHeader('Last-Modified', rfc1123_date(self._p_mtime))
! 403: RESPONSE.setHeader('Content-Type', self.content_type)
! 404: RESPONSE.setHeader('Content-Length', self.size)
! 405: RESPONSE.setHeader('Accept-Ranges', 'bytes')
! 406:
! 407: # Don't cache the data itself, but provide an opportunity
! 408: # for a cache manager to set response headers.
! 409: self.ZCacheable_set(None)
! 410:
! 411: data=urllib.urlopen(self.baseUrl+self.queryString).read()
! 412:
! 413: if type(data) is type(''):
! 414: RESPONSE.setBase(None)
! 415: return data
! 416:
! 417: while data is not None:
! 418: RESPONSE.write(data.data)
! 419: data=data.next
! 420:
! 421: return ''
! 422:
! 423:
! 424: def manage_addZogiImageForm(self):
! 425: """Form for adding"""
! 426: pt=PageTemplateFile('Products/zogiLib/zpt/addZogiImage.zpt').__of__(self)
! 427: return pt()
! 428:
! 429:
! 430: def manage_addZogiImage(self,id,title,baseUrl, queryString,RESPONSE=None):
! 431: """add dgilib"""
! 432: newObj=zogiImage(id,title,baseUrl, queryString)
! 433: self.Destination()._setObject(id,newObj)
! 434: if RESPONSE is not None:
! 435: RESPONSE.redirect('manage_main')
! 436:
! 437:
! 438:
1.1 dwinter 439: class zogiLib(Folder):
440: """StandardElement"""
441:
442: meta_type="zogiLib"
443:
1.3 dwinter 444: def getDlInfo(self):
445: """DLInfo"""
446: paramH={}
447: baseUrl=re.sub("servlet/Scaler","/dlInfo-xml.jsp",self.digilibBaseUrl)
448:
449: url=urllib.urlopen(baseUrl+self.REQUEST['QUERY_STRING'])
450: dom=xml.dom.minidom.parse(url)
451: params=dom.getElementsByTagName('parameter')
452: for param in params:
453: paramH[param.getAttribute('name')]=param.getAttribute('value')
454: return paramH
455:
456: def getPageNumTotal(self):
457: """pagenums"""
458: return self.getDlInfo()['pt']
459:
460:
1.1 dwinter 461: def generateImageFolder(self):
462: """images ablegen"""
463: self.manage_addFolder('images')
464: for image in os.listdir("../lib/python/Products/zogiLib/images"):
465: fn=file("../lib/python/Products/zogiLib/images/"+image)
1.3 dwinter 466:
1.1 dwinter 467: self.images.manage_addImage(image,fn)
468:
469:
1.2 dwinter 470: def __init__(self, id,title,digilibBaseUrl, localFileBase):
1.1 dwinter 471: """init"""
472:
473: self.id=id
474: self.title=title
1.2 dwinter 475: self.digilibBaseUrl=digilibBaseUrl
1.1 dwinter 476: self.localFileBase=localFileBase
477: self._setObject('topTemplate',zogiLib_navTemplate(id='topTemplate'))
478: self.generateImageFolder()
479:
480:
481: manage_options = Folder.manage_options+(
482: {'label':'Main Config','action':'changeZogiLibForm'},
483: )
484:
1.3 dwinter 485: def option_js(self):
486: """option_js"""
487: ret="""function setParam(e) {
488: if (document.all) s=e.srcElement;
489: else s=e.target;
490: if (window.opener) location=window.opener.location
491: else location=document.location
492: location=" %s/setParam?"+s.name+'='+s.value;
493: }"""%self.REQUEST['URL1']
494: return ret
495:
496:
1.1 dwinter 497: def navigation_js(self):
498: """Javascript"""
499:
500: return file("../lib/python/Products/zogiLib/js/navigation.js").read()
501:
1.3 dwinter 502:
1.1 dwinter 503:
504: def generateTopJavaScript(self):
505: """generate script"""
506: ret="""var baseUrl = '%s'; """% self.REQUEST['URL0']
507: ret+="""newParameter('fn', '%s', '', 1);
508: newParameter('pn', '%s', '1', 1);
509: newParameter('ws', '%s', '1.0', 1);
510: newParameter('mo', '%s', '', 1);
511: newParameter('mk', '%s', '', 3);
512: newParameter('wx', '%s', '0.0', 2);
513: newParameter('wy', '%s', '0.0', 2);
514: newParameter('ww', '%s', '1.0', 2);
515: newParameter('wh', '%s', '1.0', 2);
516: newParameter('pt', '%s', '%s', 9);
517: newParameter('brgt', '%s', '0.0', 1);
518: newParameter('cont', '%s', '0.0', 1);
519: newParameter('rot', '%s', '0.0', 1);
520: newParameter('rgba', '%s', '', 1);
521: newParameter('rgbm', '%s', '', 1);
522: newParameter('ddpix', '%s', '', 9);
523: newParameter('ddpiy', '%s', '', 9);"""%(getString(self,'fn'),
524: getString(self,'pn',1),
525: getString(self,'ws',1.0),
526: getString(self,'mo',''),
527: getString(self,'mk',''),
528: getString(self,'wx',0.0),
529: getString(self,'wy',0.0),
530: getString(self,'ww',1.0),
531: getString(self,'wh',1.0),
532: getString(self,'pt',100),getString(self,'pt',100),
533: getString(self,'brgt',0.0),
534: getString(self,'cont',0.0),
535: getString(self,'rot',0.0),
536: getString(self,'rgba','0/0/0'),
537: getString(self,'rgbm','0/0/0'),
538: getString(self,'ddpix',0.0),
539: getString(self,'ddpiy',0.0)
540: )
541:
542: ret+="""
543:
544: var wwidth, wheight;
545: if (self.innerHeight) // all except Explorer
546: {
547: wwidth = self.innerWidth;
548: wheight = self.innerHeight;
549: }
550: else if (document.documentElement && document.documentElement.clientHeight)
551: // Explorer 6 Strict Mode
552: {
553: wwidth = document.documentElement.clientWidth;
554: wheight = document.documentElement.clientHeight;
555: }
556: else if (document.body) // other Explorers
557: {
558: wwidth = document.body.clientWidth;
559: wheight = document.body.clientHeight;
560: }
561:
1.3 dwinter 562: document.id="digilib"
1.1 dwinter 563:
564: """
565: return ret
566:
567:
568:
569:
570:
571:
572:
573: def generateScalerImg(self,requestString):
574: """generate Scaler Tag"""
1.2 dwinter 575: retStr=self.digilibBaseUrl+requestString
1.1 dwinter 576: jS="""<script type="text/javascript">
577: document.write("<img id=\\\"pic\\\" src=\\\"%s&dw="+wwidth+"&dh="+wheight+"\\\"/>")</script>"""%retStr
578: return jS
579:
580: def changeZogiLibForm(self):
581: """Main configuration"""
582: pt=PageTemplateFile('Products/zogiLib/zpt/changeZogiLibForm.zpt').__of__(self)
583: return pt()
584:
1.2 dwinter 585: def changeZogiLib(self,title,digilibBaseUrl, localFileBase,RESPONSE=None):
1.1 dwinter 586: """change it"""
587: self.title=title
1.2 dwinter 588: self.digilibBaseUrl=digilibBaseUrl
1.1 dwinter 589: self.localFileBase=localFileBase
590:
591: if RESPONSE is not None:
592: RESPONSE.redirect('manage_main')
593:
594:
595: def nav_html(self,fileName):
596: """navigations frame"""
597:
598: # suche nach index.meta mit zogilib thumb info
599:
600: templ=readNavTemp(self.localFileBase+"/"+fileName)
601: if not templ:
602: templ=readNavTemp(self.localFileBase+"/"+fileName.split("/")[0])
603: if not templ:
604: return self.topTemplate.document_src()
605:
606: return urllib.urlopen(templ).read()
607:
608:
609: def index_html(self):
610: """main action"""
611:
612:
1.3 dwinter 613: pt=PageTemplateFile('Products/zogiLib/zpt/zogiLibMain_book.zpt').__of__(self)
1.1 dwinter 614: return pt()
615:
616: def storeQuery(self):
617: """storeQuery in session"""
618: self.REQUEST.SESSION['query']={}
619: for fm in self.REQUEST.form.keys():
620: self.REQUEST.SESSION['query'][fm]=self.REQUEST.form[fm]
621:
1.3 dwinter 622: self.REQUEST.SESSION['dlInfo']=self.getDlInfo()
623:
624: def getParam(self,param):
625: """Gebe Parameter aus"""
626: try:
627: return self.REQUEST.SESSION['query'][param]
628: except:
629: return None
630:
631: def getPageNum(self):
632: """PAgenum"""
633: pn=self.getParam('pn')
634: if pn:
635: return pn
636: else:
637: return 1
638:
639: def biggerWS(self):
640: """ws+1"""
641: ws=self.getParam('ws')
642: if ws:
643: return int(ws)+1
644: else:
645: return 2
646:
647: def options(self):
648: """showoptions"""
649: pt=PageTemplateFile('Products/zogiLib/zpt/optionwindow.zpt').__of__(self)
650: return pt()
651:
652:
653: def smallerWS(self):
654: """ws-11"""
655: ws=self.getParam('ws')
656: if ws:
657: if int(ws)==1:
658: return
659: else:
660: return int(ws)-1
661: else:
662: return 1
663:
664:
665: def setParam(self,pn=None,ws=None,rot=None,brgt=None,cont=None):
666: """setze Parameter"""
1.1 dwinter 667: ret=""
668:
1.3 dwinter 669: if brgt:
670: self.REQUEST.SESSION['query']['brgt']=brgt
671:
672: if cont:
673: self.REQUEST.SESSION['query']['cont']=cont
674:
1.1 dwinter 675: if pn:
676: self.REQUEST.SESSION['query']['pn']=pn
677:
678: if ws:
679: self.REQUEST.SESSION['query']['ws']=ws
680:
681: if rot:
682: self.REQUEST.SESSION['query']['rot']=rot
683:
684: for param in self.REQUEST.SESSION['query'].keys():
685:
686: ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&"
687:
688: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)
689:
1.3 dwinter 690:
1.1 dwinter 691: def mirrorPage(self,mi):
692: """mirror"""
693: ret=""
694: try:
695: splitted=self.REQUEST.SESSION['query']['mo'].split(',')
696: except:
697: splitted=[]
698:
699: if mi=="h":
700:
701: if 'hmir' in splitted:
702: splitted.remove('hmir')
703: else:
704: splitted.append('hmir')
705:
706: if mi=="v":
707:
708: if 'vmir' in splitted:
709: splitted.remove('vmir')
710: else:
711: splitted.append('vmir')
712:
713:
714: self.REQUEST.SESSION['query']['mo']=string.join(splitted,",")
715:
716:
717:
718:
719: for param in self.REQUEST.SESSION['query'].keys():
720:
721: ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&"
722:
723: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)
724:
725: def decode(self,strR):
726: """decode &"""
1.3 dwinter 727:
1.1 dwinter 728: return re.sub('\&','\&',strR)
729:
730: def wholePage(self):
731: """zoom out"""
732: ret=""
733:
734: self.REQUEST.SESSION['query']['ww']=1
735: self.REQUEST.SESSION['query']['wh']=1
736: self.REQUEST.SESSION['query']['wx']=0
737: self.REQUEST.SESSION['query']['wy']=0
738:
739: for param in self.REQUEST.SESSION['query'].keys():
740:
741: ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&"
742:
743: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)
744:
745: def prevPage(self,pn=None):
746: """next page"""
747: ret=""
748:
749: if pn and pn>0:
750: pn=str(int(pn)-1)
751:
752:
753: self.REQUEST.form['pn']=pn
1.3 dwinter 754:
1.1 dwinter 755: for param in self.REQUEST.form.keys():
1.3 dwinter 756:
1.1 dwinter 757: ret+=param+"="+str(self.REQUEST.form[param])+"&"
758:
759: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)
760:
1.3 dwinter 761: def firstPage(self):
762: """erste Seite"""
763: return self.setParam(pn="1")
1.1 dwinter 764:
1.3 dwinter 765: def lastPage(self):
766: """letzte Seite"""
767:
768:
1.1 dwinter 769: def nextPage(self,pn=None):
770: """next page"""
771: ret=""
772:
773: try:
774: pn=str(int(pn)+1)
775: except:
776: pn=str(2)
777:
778: self.REQUEST.form['pn']=pn
1.3 dwinter 779:
1.1 dwinter 780: for param in self.REQUEST.form.keys():
781: ret+=param+"="+str(self.REQUEST.form[param])+"&"
782:
783: self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)
784:
785:
786: def manage_addZogiLibForm(self):
787: """interface for adding zogilib"""
788: pt=PageTemplateFile('Products/zogiLib/zpt/addZogiLibForm').__of__(self)
789: return pt()
790:
1.2 dwinter 791: def manage_addZogiLib(self,id,title,digilibBaseUrl, localFileBase,RESPONSE=None):
1.1 dwinter 792: """add dgilib"""
1.2 dwinter 793: newObj=zogiLib(id,title,digilibBaseUrl, localFileBase)
1.1 dwinter 794: self.Destination()._setObject(id,newObj)
795: if RESPONSE is not None:
796: RESPONSE.redirect('manage_main')
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>