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