Diff for /zogiLib/zogiLib.py between versions 1.1.1.1 and 1.58

version 1.1.1.1, 2004/03/25 18:07:37 version 1.58, 2005/10/11 20:06:05
Line 1 Line 1
   from OFS.SimpleItem import SimpleItem
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile  from Products.PageTemplates.PageTemplateFile import PageTemplateFile
 from Products.PageTemplates.PageTemplate import PageTemplate  from Products.PageTemplates.PageTemplate import PageTemplate
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate  from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
   from OFS.Image import Image
   from AccessControl import ClassSecurityInfo
 import xml.dom.minidom  import xml.dom.minidom
 from OFS.Folder import Folder  from OFS.Folder import Folder
 from xml_helpers import getText  from xml_helpers import getUniqueElementText,getText
 import os  import os
 import re  import re
 import string  import string
 import urllib  import urllib
   from types import *
   import random
   import cgi
 from Globals import package_home  from Globals import package_home
   
 def getString(self,key,default=''):  ZOGIVERSION = "0.9.15b DW:22.2.2005"
     try:  
         return self.REQUEST[key]  
     except:  
         return default  
   
   def cropf(f):
       """returns a float with reduced precision"""
       return float(int(f * 10000)/10000.0)
           
 class zogiLib_navTemplate(ZopePageTemplate):  
     """pageTemplate Objekt"""  
     meta_type="zogiLib_navTemplate"  
   
     _default_content_fn = os.path.join(package_home(globals()),  def sendFile(self, filename, type):
                                        'zpt/zogiLib_NavTemplateDefault.zpt')      """sends an object or a local file (from the product) as response"""
       paths = filename.split('/')
       object = self
       # look for an object called filename
       for path in paths:
           if hasattr(object, path):
               object = getattr(object, path)
           else:
               object = None
               break
       if object:
           # if the object exists then send it
           return object.index_html(self.REQUEST.REQUEST, self.REQUEST.RESPONSE)
       else:
           # send a local file with the given content-type
           fn = os.path.join(package_home(globals()), filename)
           self.REQUEST.RESPONSE.setHeader("Content-Type", type)
           self.REQUEST.RESPONSE.write(file(fn).read())
       return
   
   def browserCheck(self):
       """check the browsers request to find out the browser type"""
       bt = {}
       ua = self.REQUEST.get_header("HTTP_USER_AGENT")
       bt['ua'] = ua
       bt['isIE'] = False
       bt['isN4'] = False
       if string.find(ua, 'MSIE') > -1:
           bt['isIE'] = True
       else:
           bt['isN4'] = (string.find(ua, 'Mozilla/4.') > -1)
           
       try:
           nav = ua[string.find(ua, '('):]
           ie = string.split(nav, "; ")[1]
           if string.find(ie, "MSIE") > -1:
               bt['versIE'] = string.split(ie, " ")[1]
       except: pass
       
       bt['isMac'] = string.find(ua, 'Macintosh') > -1
       bt['isWin'] = string.find(ua, 'Windows') > -1
       bt['isIEWin'] = bt['isIE'] and bt['isWin']
       bt['isIEMac'] = bt['isIE'] and bt['isMac']
       bt['staticHTML'] = False
   
       return bt
   
       
   class zogiImage(SimpleItem):
       """einzelnes Image"""
       meta_type="zogiImage"
   
     manage_options=ZopePageTemplate.manage_options+(      manage_options=SimpleItem.manage_options+(
         {'label':'Copy to Filesystem','action':'copyContent'},          {'label':'Main config','action':'changeZogiImageForm'},
        )         )
   
     def getPath(self):  
         """get path"""  
         return getPath(self,'thumbtemplate.templ')  
           
     ## def changeECHO_pageTemplateWeightForm(self):      def __init__(self,id,title,baseUrl,queryString,content_type='',precondition=''):
 ##         """change"""          """init"""
 ##         pt=PageTemplateFile('Products/ECHO_content/zpt/ChangeECHO_pageTemplateWeight.zpt').__of__(self)          self.id=id
 ##         return pt()          self.title=title
           if baseUrl:
               self.baseUrl=baseUrl
           else:
               self.baseUrl="http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary/servlet/Scaler?"
               
           self.queryString=queryString
           self.content_type=content_type
           self.precondition=precondition
   
 ##     def changeECHO_pageTemplateWeight(self,weight,content_type,RESPONSE=None):      #def getData(self):
 ##         """change"""      #    """getUrlData"""
 ##         self.weight=weight      #    return urllib.urlopen(self.baseUrl+self.queryString)
 ##         self.content_type=content_type  
   
 ##         if RESPONSE is not None:      def changeZogiImageForm(self):
 ##             RESPONSE.redirect('manage_main')          """Main configuration"""
           pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/changeZogiImageForm.zpt')).__of__(self)
           return pt()
                   
       def changeZogiImage(self,title,baseUrl, queryString,RESPONSE=None):
           """change it"""
           self.title=title
           self.baseUrl=baseUrl
           self.queryString=queryString
   
     def copyContent(self):          if RESPONSE is not None:
         """copycontent to path"""              RESPONSE.redirect('manage_main')
   
         return "copied to:"+copyContent(self,'thumbtemplate.templ')      def index_html(self, REQUEST, RESPONSE):
           """service the request by redirecting to digilib server"""
           RESPONSE.redirect(self.baseUrl+self.queryString)
           return ''
                   
       def rescale(self,width=None,height=None):
           """andere parameter im querystring"""
           qs=cgi.parse_qs(self.queryString)
           for x in qs.keys():
               if type(qs[x]) is ListType:
                   qs[x]=qs[x][0]
           
           if width:
               qs['dw']=width
           if height:
               qs['dh']=height
   
           
           qsneu=urllib.urlencode(qs)
           self.queryString=qsneu
           return "done"
           
 def manage_addZogiLib_NavTemplateForm(self):  def manage_addZogiImageForm(self):
     """Form for adding"""      """Form for adding"""
     pt=PageTemplateFile('Products/ECHO_content/zpt/AddZogilib_NavTemplate.zpt').__of__(self)      pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiImage.zpt')).__of__(self)
     return pt()      return pt()
   
   
   def manage_addZogiImage(self,id,title,baseUrl, queryString,RESPONSE=None):
       """add zogiimage"""
       newObj=zogiImage(id,title,baseUrl, queryString)
       self.Destination()._setObject(id,newObj)
       if RESPONSE is not None:
           RESPONSE.redirect('manage_main')
   
   
 def manage_addZogiLib_NavTemplate(self, id,title=None, text=None,  
                            REQUEST=None, submit=None):  
     "Add a Page Template with optional file content."  
   
   class zogiLib(Folder):
       """digilib frontend with ZOPE"""
           
     id = str(id)      meta_type="zogiLib"
     if REQUEST is None:      #xxxx
         self._setObject(id, zogilib_NavTemplate(id, text))      security=ClassSecurityInfo()
         ob = getattr(self, id)  
                 
         if title:      manage_options = Folder.manage_options+(
             ob.pt_setTitle(title)              {'label':'Main Config','action':'changeZogiLibForm'},
         return ob              )
     else:  
         file = REQUEST.form.get('file')  
         headers = getattr(file, 'headers', None)  
         if headers is None or not file.filename:  
             zpt = zogilib_NavTemplate(id)  
         else:  
             zpt = zogilib_NavTemplate(id, file, headers.get('content_type'))  
   
         self._setObject(id, zpt)      def __init__(self, id, title, dlServerURL, layout="book", basePath="", dlTarget=None, dlToolbarBaseURL=None):
         ob = getattr(self, id)          """init"""
   
           self.id=id
           self.title=title
           self.dlServerURL = dlServerURL
           self.basePath=basePath
           self.layout=layout
           self.dlTarget = dlTarget
   
         try:          if dlToolbarBaseURL:
             u = self.DestinationURL()              self.dlToolbarBaseURL = dlToolbarBaseURL
         except AttributeError:          else:
             u = REQUEST['URL1']              self.dlToolbarBaseURL = dlServerURL + "/digimage.jsp?"
   
         if submit == " Add and Edit ":      security.declareProtected('View','getLayout')
             u = "%s/%s" % (u, quote(id))      def getLayout(self):
         REQUEST.RESPONSE.redirect(u+'/manage_main')          """get Layout"""
     return ''          return self.layout
       
       def version(self):
           """version information"""
           return ZOGIVERSION
   
 def readNavTemp(fileName):      def getContextStatic(self):
     """navtemp"""          """get all the contexts which go to static pages"""
     print "HI reading",fileName  
           
     if os.path.exists(fileName+"/index.meta"):          try:
         dom=xml.dom.minidom.parse(fileName+"/index.meta")              dom=xml.dom.minidom.parse(urllib.urlopen(self.getMetaFileName()))
     else:              contexts=dom.getElementsByTagName("context")
         return None  
               ret=[]
               for context in contexts:
                   name=getUniqueElementText(context.getElementsByTagName("name"))
   
                   link=getUniqueElementText(context.getElementsByTagName("link"))
                   if name or link:
                       ret.append((name,link))
               return ret
           except:
               return []
           
     print "dom",dom      def getContextDatabases(self):
           """get all dynamic contexts"""
     try:      try:
         navTag=getText(dom.getElementsByTagName('zogilibtemplate')[0].childNodes)              dom=xml.dom.minidom.parse(urllib.urlopen(self.getMetaFileName()))
               contexts=dom.getElementsByTagName("context")
               ret=[]
               for context in contexts:
                   metaDataLinks=context.getElementsByTagName("meta-datalink")
                   for metaDataLink in metaDataLinks:
                       db=metaDataLink.getAttribute("db")
                       link=self.REQUEST['URL1']+"/dl_db?db=%s"%db
                       if db:
                           ret.append((db,link))
                   metaDataLinks=context.getElementsByTagName("meta-baselink")
   
                   for metaDataLink in metaDataLinks:
                       db=metaDataLink.getAttribute("db")
                       link=self.REQUEST['URL1']+"/dl_db?db=%s"%db
                       if db:
                           ret.append((db,link))
   
               return ret
     except:      except:
         navTag=None  
     return navTag  
           
               return []
                   
 class zogiLib(Folder):  
     """StandardElement"""  
   
     meta_type="zogiLib"      def formatHTML(self,url,label=None,viewUrl=None):
   
     def generateImageFolder(self):          sets=xml.dom.minidom.parse(urllib.urlopen(url)).getElementsByTagName('dataset')
         """images ablegen"""          ret=""
         self.manage_addFolder('images')          print label
         for image in os.listdir("../lib/python/Products/zogiLib/images"):          if label:
             fn=file("../lib/python/Products/zogiLib/images/"+image)              ret+="""<a href="%s">%s</a>"""%(viewUrl,label)
             print fn          for set in sets:
             self.images.manage_addImage(image,fn)              ret+="<table>"
               for node in set.childNodes:
                   if hasattr(node,'tagName'):
                       tag=node.tagName
                       label=node.getAttribute("label")
                       if not label:
                           label=tag
                       text=getText(node.childNodes)
                       ret+="""<tr><td><b>%s:</b></td><td>%s</td></tr>"""%(label,text)
               ret+="</table>"
           return ret
                   
   
     def __init__(self, id,title,zogilibBaseUrl, localFileBase):      def getMetaData(self):
         """init"""          """getMetaData"""
           try:
               dom=xml.dom.minidom.parse(urllib.urlopen(self.getMetaFileName()))
           except:
               return "error metadata"
   
         self.id=id          contexts=dom.getElementsByTagName("context")
         self.title=title          ret=[]
         self.zogilibBaseUrl=zogilibBaseUrl          db=self.getDLParam("db")
         self.localFileBase=localFileBase          ob=self.getDLParam("object")
         self._setObject('topTemplate',zogiLib_navTemplate(id='topTemplate'))  
         self.generateImageFolder()  
   
           fn=self.getDLParam("fn")
           pn=self.getDLParam("pn")
           if not fn:
               fn=""
           if not pn:
               pn=""
           if not ob:
               ob=""
   
     manage_options = Folder.manage_options+(          for context in contexts:
             {'label':'Main Config','action':'changeZogiLibForm'},              metaDataLinks=context.getElementsByTagName("meta-datalink")
             )              for metaDataLink in metaDataLinks:
   
     def navigation_js(self):                  if (db==metaDataLink.getAttribute("db")) or (len(metaDataLinks)==1):
         """Javascript"""  
                   
         return file("../lib/python/Products/zogiLib/js/navigation.js").read()                      link=getUniqueElementText(metaDataLink.getElementsByTagName("metadata-url"))
                       label=getUniqueElementText(metaDataLink.getElementsByTagName("label"))
                       url=getUniqueElementText(metaDataLink.getElementsByTagName("url"))
   
                       return self.formatHTML(link,label,url)
                           
     def generateTopJavaScript(self):              metaDataLinks=context.getElementsByTagName("meta-baselink")
         """generate script"""  
         ret="""var baseUrl = '%s'; """% self.REQUEST['URL0']  
         ret+="""newParameter('fn', '%s', '', 1);  
                 newParameter('pn', '%s', '1', 1);  
                 newParameter('ws', '%s', '1.0', 1);  
                 newParameter('mo', '%s', '', 1);  
                 newParameter('mk', '%s', '', 3);  
                 newParameter('wx', '%s', '0.0', 2);  
                 newParameter('wy', '%s', '0.0', 2);  
                 newParameter('ww', '%s', '1.0', 2);  
                 newParameter('wh', '%s', '1.0', 2);  
                 newParameter('pt', '%s', '%s', 9);  
                 newParameter('brgt', '%s', '0.0', 1);  
                 newParameter('cont', '%s', '0.0', 1);  
                 newParameter('rot', '%s', '0.0', 1);  
                 newParameter('rgba', '%s', '', 1);  
                 newParameter('rgbm', '%s', '', 1);  
                 newParameter('ddpix', '%s', '', 9);  
                 newParameter('ddpiy', '%s', '', 9);"""%(getString(self,'fn'),  
                  getString(self,'pn',1),  
                  getString(self,'ws',1.0),  
                  getString(self,'mo',''),  
                  getString(self,'mk',''),  
                  getString(self,'wx',0.0),  
                  getString(self,'wy',0.0),  
                  getString(self,'ww',1.0),  
                  getString(self,'wh',1.0),  
                  getString(self,'pt',100),getString(self,'pt',100),  
                  getString(self,'brgt',0.0),  
                  getString(self,'cont',0.0),  
                  getString(self,'rot',0.0),  
                  getString(self,'rgba','0/0/0'),  
                  getString(self,'rgbm','0/0/0'),  
                  getString(self,'ddpix',0.0),  
                  getString(self,'ddpiy',0.0)  
                  )  
   
         ret+="""              for metaDataLink in metaDataLinks:
   
         var wwidth, wheight;                  if db==metaDataLink.getAttribute("db") or (len(metaDataLinks)==1):
         if (self.innerHeight) // all except Explorer  
         {  
         wwidth = self.innerWidth;  
         wheight = self.innerHeight;  
         }  
         else if (document.documentElement && document.documentElement.clientHeight)  
         // Explorer 6 Strict Mode  
         {  
         wwidth = document.documentElement.clientWidth;  
         wheight = document.documentElement.clientHeight;  
         }  
         else if (document.body) // other Explorers  
         {  
         wwidth = document.body.clientWidth;  
         wheight = document.body.clientHeight;  
         }  
   
                       link=getUniqueElementText(metaDataLink.getElementsByTagName("metadata-url"))
                       label=getUniqueElementText(metaDataLink.getElementsByTagName("label"))
                       url=getUniqueElementText(metaDataLink.getElementsByTagName("url"))
                   
         """                      return self.formatHTML(link+'fn=%s&pn=%s&object=%s'%(fn,pn,ob),label,url)
         return ret          return ret
   
   
       def getDLInfo(self):
           """get DLInfo from digilib server"""
           paramH={}
           baseUrl=self.dlServerURL+"/dlInfo-xml.jsp"
           try:
               url=urllib.urlopen(baseUrl+'?'+self.REQUEST['QUERY_STRING'])
               dom=xml.dom.minidom.parse(url)
               params=dom.getElementsByTagName('parameter')
               for param in params:
                   paramH[param.getAttribute('name')]=param.getAttribute('value')
               return paramH
           except:
               return {}
           
                                   
       def createHeadJS(self):
           """generate all javascript tags for head"""
           self.checkQuery()
           bt = self.REQUEST.SESSION.get('browserType', {})
           if bt['staticHTML']:
               return
                                   
           pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/zogilib_head_js')).__of__(self)
           return pt()
                   
       def createParamJS(self):
           """generate javascript for parameters only"""
           self.checkQuery()
           bt = self.REQUEST.SESSION['browserType']
           if bt['staticHTML']:
               return
                   
     def generateScalerImg(self,requestString):          pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/zogilib_param_js')).__of__(self)
         """generate Scaler Tag"""  
         retStr=self.zogilibBaseUrl+requestString  
         jS="""<script type="text/javascript">  
         document.write("<img id=\\\"pic\\\" src=\\\"%s&dw="+wwidth+"&dh="+wheight+"\\\"/>")</script>"""%retStr  
         return jS  
   
     def changeZogiLibForm(self):  
         """Main configuration"""  
         pt=PageTemplateFile('Products/zogiLib/zpt/changeZogiLibForm.zpt').__of__(self)  
         return pt()          return pt()
           
     def changeZogiLib(self,title,zogilibBaseUrl, localFileBase,RESPONSE=None):  
         """change it"""  
         self.title=title  
         self.zogilibBaseUrl=zogilibBaseUrl  
         self.localFileBase=localFileBase  
   
         if RESPONSE is not None:      def getScalerUrl(self,requestString=None):
             RESPONSE.redirect('manage_main')          """send scaler url"""
           if requestString:
               return self.dlServerURL+'/servlet/Scaler?'+requestString
           else:
               return self.dlServerURL+'/servlet/Scaler?'
   
       def scaledImage(self,requestString=None):
           """scaled Image"""
                           
     def nav_html(self,fileName):          if not requestString:
         """navigations frame"""              requestString=self.REQUEST['QUERY_STRING']
   
         # suche nach index.meta mit zogilib thumb info          self.REQUEST.RESPONSE.redirect(self.getScalerUrl(requestString))
           
           return True
       
           
       def createScalerImg(self, requestString=None, bottom=0, side=0, width=500, height=500):
           """generate Scaler IMG Tag"""
           self.checkQuery()
           bt = self.REQUEST.SESSION['browserType']
           # override with parameters from session
           if  self.REQUEST.SESSION.has_key('scalerDiv'):
               (requestString, bottom, side, width, height) = self.REQUEST.SESSION['scalerDiv']
           # if not explicitly defined take normal request
           if not requestString:
               requestString = self.getAllDLParams()
           url = self.dlServerURL+'/servlet/Scaler?'+requestString
           # construct bottom and side insets
           b_par = ""
           s_par = ""
           if (bottom != 0) or (side != 0):
               b_par = "-" + str(int(bottom))
               s_par = "-" + str(int(side))
           tag = ""
           if bt['staticHTML']:
               tag += '<div id="scaler"><img id="pic" src="%s&dw=%i&dh=%i" /></div>'%(url, int(width-side), int(height-bottom))
           else:
               if bt['isN4']:
                   # N4 needs layers
                   tag += '<ilayer id="scaler">'
               else:
                   tag += '<div id="scaler">'
               tag += '<script type="text/javascript">'
               tag += "var ps = bestPicSize(getElement('scaler'));"
               # write img tag with javascript
               tag += 'document.write(\'<img id="pic" src="%s&dw=\'+(ps.width%s)+\'&dh=\'+(ps.height%s)+\'" />\');'%(url, s_par, b_par)
               tag += '</script>'
               if bt['isN4']:
                   tag += '</ilayer>'
               else:
                   tag += '</div>'
           return tag
                   
         templ=readNavTemp(self.localFileBase+"/"+fileName)      def createScalerDiv(self, requestString = None, bottom = 0, side = 0, width=500, height=500):
         if not templ:          """generate scaler img and table with navigation arrows"""
             templ=readNavTemp(self.localFileBase+"/"+fileName.split("/")[0])          self.checkQuery()
             if not templ:          if requestString != None or bottom != 0 or side != 0:
                 return self.topTemplate.document_src()              self.REQUEST.SESSION['scalerDiv'] = (requestString, bottom, side, width, height)
           else:
               if self.REQUEST.SESSION.has_key('scalerDiv'):
                   # make shure to remove unused parameter
                   del self.REQUEST.SESSION['scalerDiv']
   
         return urllib.urlopen(templ).read()          pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/zogilib_img_div')).__of__(self)
           return pt()
           
       def createAuxDiv(self):
           """generate other divs"""
           self.checkQuery()
           bt = self.REQUEST.SESSION['browserType']
           if bt['staticHTML']:
               return
           if bt['isN4']:
               f = 'zpt/zogilib_divsN4.zpt'
           else:
               f = 'zpt/zogiLib_divs.zpt'
           pt=PageTemplateFile(os.path.join(package_home(globals()),f)).__of__(self)
           return pt()
           
     def index_html(self):  
         """main action"""  
   
       def option_js(self):
           """javascript"""
           return sendFile(self, 'js/option.js', 'text/plain')
   
       def dl_lib_js(self):
           """javascript"""
           return sendFile(self, 'js/dllib.js', 'text/plain')
   
       def js_lib_js(self):
           """javascript"""
           return sendFile(self, 'js/baselib.js', 'text/plain')
   
       def optionwindow(self):
           """showoptions"""
           self.checkQuery()
           bt = self.REQUEST.SESSION['browserType']
           if bt['staticHTML']:
               pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/optionwindow_static.zpt')).__of__(self)
           else:
               tp = "viewingTools.zpt"
               if hasattr(self, tp):
                   pt = getattr(self, tp)
               else:
                   pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/optionwindow.zpt')).__of__(self)
   
         pt=PageTemplateFile('Products/zogiLib/zpt/zogiLibMain.zpt').__of__(self)  
         return pt()          return pt()
   
     def storeQuery(self):      def mark1(self):
         """storeQuery in session"""          """mark image"""
         self.REQUEST.SESSION['query']={}          return sendFile(self, 'images/mark1.gif', 'image/gif')
         for fm in self.REQUEST.form.keys():  
             self.REQUEST.SESSION['query'][fm]=self.REQUEST.form[fm]      def mark2(self):
           """mark image"""
           return sendFile(self, 'images/mark2.gif', 'image/gif')
   
       def mark3(self):
           """mark image"""
           return sendFile(self, 'images/mark3.gif', 'image/gif')
   
       def mark4(self):
           """mark image"""
           return sendFile(self, 'images/mark4.gif', 'image/gif')
   
       def mark5(self):
           """mark image"""
           return sendFile(self, 'images/mark5.gif', 'image/gif')
   
       def mark6(self):
           """mark image"""
           return sendFile(self, 'images/mark6.gif', 'image/gif')
   
       def mark7(self):
           """mark image"""
           return sendFile(self, 'images/mark7.gif', 'image/gif')
   
       def mark8(self):
           """mark image"""
           return sendFile(self, 'images/mark8.gif', 'image/gif')
   
       def corner1(self):
           """mark image"""
           return sendFile(self, 'images/olinks.gif', 'image/gif')
   
       def corner2(self):
           """mark image"""
           return sendFile(self, 'images/orechts.gif', 'image/gif')
   
       def corner3(self):
           """mark image"""
           return sendFile(self, 'images/ulinks.gif', 'image/gif')
   
       def corner4(self):
           """mark image"""
           return sendFile(self, 'images/urechts.gif', 'image/gif')
   
       def up_img(self):
           """mark image"""
           return sendFile(self, 'images/up.gif', 'image/gif')
   
       def down_img(self):
           """mark image"""
           return sendFile(self, 'images/down.gif', 'image/gif')
   
       def left_img(self):
           """mark image"""
           return sendFile(self, 'images/left.gif', 'image/gif')
   
       def right_img(self):
           """mark image"""
           return sendFile(self, 'images/right.gif', 'image/gif')
   
     def setParam(self,pn=None,ws=None,rot=None):  
         """gotopage"""  
         ret=""  
   
         if pn:  
             self.REQUEST.SESSION['query']['pn']=pn  
   
         if ws:      def index_html(self):
             self.REQUEST.SESSION['query']['ws']=ws          """main action"""
           self.checkQuery()
           bt = self.REQUEST.SESSION['browserType']
           tp = "zogiLibMainTemplate"
           
           if hasattr(self, tp):
               pt = getattr(self, tp)
           else:
               tpt = self.layout
   
         if rot:              if bt['staticHTML']:
             self.REQUEST.SESSION['query']['rot']=rot                  tpt = "static"
                           
         for param in self.REQUEST.SESSION['query'].keys():              pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/zogiLibMain_%s'%tpt)).__of__(self)
                           
             ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&"          return pt()
                   
         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)  
   
     def mirrorPage(self,mi):      def storeQuery(self, more = None):
         """mirror"""          """storeQuery in session"""
         ret=""          dlParams = {}
           for fm in self.REQUEST.form.keys():
               dlParams[fm] = self.REQUEST.form[fm]
           # look for more
           if more:
               for fm in more.split('&'):
         try:          try:
             splitted=self.REQUEST.SESSION['query']['mo'].split(',')                      pv = fm.split('=')
                       dlParams[pv[0]] = pv[1]
         except:          except:
             splitted=[]                      pass
                   
         if mi=="h":          # parse digilib mode parameter
           if 'mo' in dlParams:
               if len(dlParams['mo']) > 0:
                   modes=dlParams['mo'].split(',')
           else:
               modes=[]
                                           
             if 'hmir' in splitted:          wid = self.getWID()
                 splitted.remove('hmir')          self.REQUEST.set('wid', wid)
           self.setSubSession('dlQuery', dlParams)
           self.setSubSession('dlModes', modes)
           self.setSubSession('dlInfo', self.getDLInfo())
           if not self.REQUEST.SESSION.has_key('browserType'):
               self.REQUEST.SESSION['browserType'] = browserCheck(self)
               
           return
   
       def checkQuery(self):
           """check if the query has been stored"""
           if not (self.REQUEST.SESSION and self.getSubSession('dlQuery')) :
               print "ZOGILIB: have to store query!!"
               self.storeQuery()
           return
   
       def zogilibPath(self, otherbase=None):
           """returns an URL to the zogiLib instance"""
           url = self.REQUEST['URL1']
           # should end with "/"
           if len(url) > 0 and url[-1] != '/':
               url += '/'
           if type(otherbase) is str:
               url += otherbase
             else:              else:
                 splitted.append('hmir')              url += self.basePath
           # should end with "/"
           if len(url) > 0 and url[-1] != '/':
               url += '/'
           return url
   
       def zogilibAction(self, action, otherbase=None, wid=None):
           """returns a URL with zogilib path, action and wid"""
           url = self.zogilibPath(otherbase)
           url += action
           if wid:
               url += '?wid=' + wid
           else:
               url += '?wid=' + self.getWID()
           return url
   
         if mi=="v":      def getSubSession(self, key, default=None):
           """returns an element from a session with a wid"""
           wid = self.getWID()
           return self.REQUEST.SESSION.get(key+'_'+wid, default)
   
       def setSubSession(self, key, value):
           """puts an element in a session with a wid"""
           wid = self.getWID()
           self.REQUEST.SESSION.set(key+'_'+wid, value)
           return
   
       def getWID(self):
           """returns a (new) window id"""
           wid = self.REQUEST.get('wid')
           if not wid:
               wid = 'digi_'+str(int(random.random()*10000))
               print "new WID:", wid
           return wid
   
             if 'vmir' in splitted:      def getDLParam(self, param, default=None):
                 splitted.remove('vmir')          """returns parameter or default"""
             else:          try:
                 splitted.append('vmir')              return self.getSubSession('dlQuery').get(param, default)
           except:
               return default
   
       def setDLParam(self, param, value):
           """sets parameter"""
           dlParams = self.getSubSession('dlQuery')
           #try:
           dlParams[param] = value
           #except:
           #    self.setSubSession('dlQuery', {param: value})
           return
   
       def getAllDLParams(self):
           """parameter string for digilib"""
           dlParams = self.getSubSession('dlQuery')
           # save modes
           modes = self.getSubSession('dlModes')
           dlParams['mo'] = string.join(modes, ',')
           # assemble query string
           ret = ""
           for param in dlParams.keys():
               if dlParams[param] is None: continue
               val = str(dlParams[param])
               if val != "":
                   ret += param + "=" + val + "&"
   
           # omit trailing "&"
           return ret.rstrip('&')
   
           
       def setDLParams(self,pn=None,ws=None,rot=None,brgt=None,cont=None):
           """setze Parameter"""
   
           self.setDLParam('brgt', brgt)
           self.setDLParam('cont', cont)
           self.setDLParam('ws', ws)
           self.setDLParam('rot', rot)
   
         self.REQUEST.SESSION['query']['mo']=string.join(splitted,",")          if pn:
               # unmark
               self.setDLParam('mk', None)
               self.setDLParam('pn', pn)
                   
           return self.display()
                   
                   
       def display(self):
           """(re)display page"""
           if not self.getDLParam('wid'):
               wid = self.getWID()
               self.setDLParam('wid', wid)
                   
         for param in self.REQUEST.SESSION['query'].keys():          params = self.getAllDLParams()
                           
             ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&"          if self.basePath:
               self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?'+params)
           else:
               self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+params)
                   
         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)      def getMetaFileName(self):
           url=self.dlServerURL+'/dlContext-xml.jsp?'+self.getAllDLParams()
           return urlbase
   
       def getToolbarPageURL(self):
           """returns a toolbar-enabled page URL"""
           url=self.dlToolbarBaseURL+self.getAllDLParams()
           return url
       
       def getDLTarget(self):
           """returns dlTarget"""
           self.checkQuery()
           s = self.dlTarget
           if s == None:
               s = ""
   #         s = 'dl'
   #         if self.getDLParam('fn'):
   #             s += "_" + self.getDLParam('fn')
   #         if self.getDLParam('pn'):
   #             s += "_" + self.getDLParam('pn')
           return s
   
       def setStaticHTML(self, static=True):
           """sets the preference to static HTML"""
           self.checkQuery()
           self.REQUEST.SESSION['browserType']['staticHTML'] = static
           return
   
       def isStaticHTML(self):
           """returns if the page is using static HTML only"""
           self.checkQuery()
           return self.REQUEST.SESSION['browserType']['staticHTML']
   
       def getPT(self):
           """pagenums"""
           di = self.getSubSession('dlInfo')
           if di:
               return int(di['pt'])
           else:
               return 1
                   
     def decode(self,strR):      def getPN(self):
         """decode &"""          """Pagenum"""
         print re.sub('\&amp','\&',strR)          pn = self.getDLParam('pn')
         return re.sub('\&amp','\&',strR)          try:
               return int(pn)
           except:
               return 1
           
     def wholePage(self):      def getBiggerWS(self):
         """zoom out"""          """ws+1"""
         ret=""          ws = self.getDLParam('ws')
           try:
               return float(ws)+0.5
           except:
               return 1.5
                   
         self.REQUEST.SESSION['query']['ww']=1      def getSmallerWS(self):
         self.REQUEST.SESSION['query']['wh']=1          """ws-1"""
         self.REQUEST.SESSION['query']['wx']=0          ws=self.getDLParam('ws')
         self.REQUEST.SESSION['query']['wy']=0          try:
               return max(float(ws)-0.5, 1)
           except:
               return 1
                           
         for param in self.REQUEST.SESSION['query'].keys():      def hasMode(self, mode):
           """returns if mode is in the diglib mo parameter"""
           wid = self.getWID()
           return (mode in self.REQUEST.SESSION['dlModes_'+wid])
   
       def hasNextPage(self):
           """returns if there is a next page"""
           pn = self.getPN()
           pt = self.getPT()
           return (pn < pt)
      
       def hasPrevPage(self):
           """returns if there is a previous page"""
           pn = self.getPN()
           return (pn > 1)
   
       def canMoveLeft(self):
           """returns if its possible to move left"""
           wx = float(self.getDLParam('wx') or 0)
           return (wx > 0)
   
       def canMoveRight(self):
           """returns if its possible to move right"""
           wx = float(self.getDLParam('wx') or 0)
           ww = float(self.getDLParam('ww') or 1)
           return (wx + ww < 1)
   
       def canMoveUp(self):
           """returns if its possible to move up"""
           wy = float(self.getDLParam('wy') or 0)
           return (wy > 0)
   
       def canMoveDown(self):
           """returns if its possible to move down"""
           wy = float(self.getDLParam('wy') or 0)
           wh = float(self.getDLParam('wh') or 1)
           return (wy + wh < 1)
   
   
       def dl_StaticHTML(self):
           """set rendering to static HTML"""
           self.checkQuery()
           self.REQUEST.SESSION['browserType']['staticHTML'] = True
           return self.display()
   
       def dl_DynamicHTML(self):
           """set rendering to dynamic HTML"""
           self.checkQuery()
           self.REQUEST.SESSION['browserType']['staticHTML'] = False
           return self.display()
           
       def dl_HMirror(self):
           """mirror action"""
           modes = self.getSubSession('dlModes')
           if 'hmir' in modes:
               modes.remove('hmir')
           else:
               modes.append('hmir')
                           
             ret+=param+"="+str(self.REQUEST.SESSION['query'][param])+"&"          return self.display()
                   
         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)      def dl_VMirror(self):
           """mirror action"""
           modes = self.getSubSession('dlModes')
           if 'vmir' in modes:
               modes.remove('vmir')
           else:
               modes.append('vmir')
                   
     def prevPage(self,pn=None):          return self.display()
         """next page"""  
         ret=""  
   
         if pn and pn>0:      def dl_Zoom(self, z):
             pn=str(int(pn)-1)          """general zoom action"""
           ww1 = float(self.getDLParam('ww') or 1)
           wh1 = float(self.getDLParam('wh') or 1)
           wx = float(self.getDLParam('wx') or 0)
           wy = float(self.getDLParam('wy') or 0)
           ww2 = ww1 * z
           wh2 = wh1 * z
           wx += (ww1 - ww2) / 2
           wy += (wh1 - wh2) / 2
           ww2 = max(min(ww2, 1), 0)
           wh2 = max(min(wh2, 1), 0)
           wx = max(min(wx, 1), 0)
           wy = max(min(wy, 1), 0)
           self.setDLParam('ww', cropf(ww2))
           self.setDLParam('wh', cropf(wh2))
           self.setDLParam('wx', cropf(wx))
           self.setDLParam('wy', cropf(wy))
           return self.display()
           
       def dl_ZoomIn(self):
           """zoom in action"""
           z = 0.7071
           return self.dl_Zoom(z)
   
       def dl_ZoomOut(self):
           """zoom out action"""
           z = 1.4142
           return self.dl_Zoom(z)
   
       def dl_Move(self, dx, dy):
           """general move action"""
           ww = float(self.getDLParam('ww') or 1)
           wh = float(self.getDLParam('wh') or 1)
           wx = float(self.getDLParam('wx') or 0)
           wy = float(self.getDLParam('wy') or 0)
           wx += dx * 0.5 * ww
           wy += dy * 0.5 * wh
           wx = max(min(wx, 1), 0)
           wy = max(min(wy, 1), 0)
           self.setDLParam('wx', cropf(wx))
           self.setDLParam('wy', cropf(wy))
           return self.display()
           
       def dl_MoveLeft(self):
           """move left action"""
           return self.dl_Move(-1, 0)
       
       def dl_MoveRight(self):
           """move left action"""
           return self.dl_Move(1, 0)
       
       def dl_MoveUp(self):
           """move left action"""
           return self.dl_Move(0, -1)
       
       def dl_MoveDown(self):
           """move left action"""
           return self.dl_Move(0, 1)
       
       def dl_WholePage(self):
           """zoom out action"""
           self.setDLParam('ww', 1)
           self.setDLParam('wh', 1)
           self.setDLParam('wx', 0)
           self.setDLParam('wy', 0)
           return self.display()
           
       def dl_PrevPage(self):
           """next page action"""
           pn = self.getPN() - 1
           if pn < 1:
               pn = 1
           self.setDLParam('pn', pn)
           # unmark
           self.setDLParam('mk', None)
           return self.display()
           
       def dl_NextPage(self):
           """next page action"""
           pn = self.getPN() + 1
           pt = self.getPT()
           if pn > pt:
               pn = pt
           self.setDLParam('pn', pn)
           # unmark
           self.setDLParam('mk', None)
           return self.display()
   
       def dl_FirstPage(self):
           """first page action"""
           self.setDLParam('pn', 1)
           # unmark
           self.setDLParam('mk', None)
           return self.display()
       
       def dl_LastPage(self):
           """last page action"""
           self.setDLParam('pn', self.getPT())
           # unmark
           self.setDLParam('mk', None)
           return self.display()
   
       def dl_Unmark(self):
           """action to remove last mark"""
           mk = self.getDLParam('mk')
           if mk:
               marks = mk.split(',')
               marks.pop()
               mk = string.join(marks, ',')
               self.setDLParam('mk', mk)
           return self.display()
   
       def dl_db(self,db):
           """set db"""
           self.setDLParam('db',db)
           self.display()
                   
       def changeZogiLibForm(self):
           """Main configuration"""
           pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/changeZogiLibForm.zpt')).__of__(self)
           return pt()
   
         self.REQUEST.form['pn']=pn      def changeZogiLib(self,title,dlServerURL, version, basePath, dlTarget, dlToolbarBaseURL, RESPONSE=None):
         print "hi",self.REQUEST.form.keys()          """change it"""
         for param in self.REQUEST.form.keys():          self.title=title
             print param          self.dlServerURL=dlServerURL
             ret+=param+"="+str(self.REQUEST.form[param])+"&"          self.basePath = basePath
           self.layout=version
           self.dlTarget = dlTarget
                   
         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)          if dlToolbarBaseURL:
               self.dlToolbarBaseURL = dlToolbarBaseURL
           else:
               self.dlToolbarBaseURL = dlServerURL + "/digimage.jsp?"
   
           if RESPONSE is not None:
               RESPONSE.redirect('manage_main')
           
     def nextPage(self,pn=None):  
         """next page"""  
         ret=""  
                   
         try:  
             pn=str(int(pn)+1)  
         except:  
             pn=str(2)  
   
         self.REQUEST.form['pn']=pn      ##
         print "hi",self.REQUEST.form.keys()      ## odds and ends
         for param in self.REQUEST.form.keys():      ##
             print param  
             ret+=param+"="+str(self.REQUEST.form[param])+"&"      def repairZogilib(self, obj=None):
           """change stuff that broke on upgrading"""
   
           msg = ""
   
           if not obj:
               obj = self.getPhysicalRoot()
   
           print "starting in ", obj
           
           entries=obj.ZopeFind(obj,obj_metatypes=['zogiLib'],search_sub=1)
   
           for entry in entries:
               print "  found ", entry
               #
               # replace digilibBaseUrl by dlServerURL
               if hasattr(entry[1], 'digilibBaseUrl'):
                   msg += "  fixing digilibBaseUrl in "+entry[0]+"\n"
                   entry[1].dlServerURL = re.sub('/servlet/Scaler\?','',entry[1].digilibBaseUrl)
                   del entry[1].digilibBaseUrl
                   
               #
               # add dlToolbarBaseURL
               if not hasattr(entry[1], 'dlToolbarBaseURL'):
                   msg += "  fixing dlToolbarBaseURL in "+entry[0]+"\n"
                   entry[1].dlToolbarBaseURL = entry[1].dlServerURL + "/digimage.jsp?"
                   
         self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+'?'+ret)          return msg+"\n\nfixed all zogilib instances in: "+obj.title
   
                   
 def manage_addZogiLibForm(self):  def manage_addZogiLibForm(self):
     """interface for adding zogilib"""      """interface for adding zogilib"""
     pt=PageTemplateFile('Products/zogiLib/zpt/addZogiLibForm').__of__(self)      pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiLibForm')).__of__(self)
     return pt()      return pt()
   
 def manage_addZogiLib(self,id,title,zogilibBaseUrl, localFileBase,RESPONSE=None):  def manage_addZogiLib(self,id,title,dlServerURL,version="book",basePath="",dlTarget=None,dlToolbarBaseURL=None,RESPONSE=None):
     """add dgilib"""      """add dgilib"""
     newObj=zogiLib(id,title,zogilibBaseUrl, localFileBase)      newObj=zogiLib(id,title,dlServerURL, version, basePath, dlTarget, dlToolbarBaseURL)
     self.Destination()._setObject(id,newObj)      self.Destination()._setObject(id,newObj)
     if RESPONSE is not None:      if RESPONSE is not None:
         RESPONSE.redirect('manage_main')          RESPONSE.redirect('manage_main')
   
   
   class zogiLibPageTemplate(ZopePageTemplate):
       """pageTemplate Objekt"""
       meta_type="zogiLib_pageTemplate"
   
   
   ## def __init__(self, id, text=None, contentType=None):
   ##         self.id = str(id)
   ##         self.ZBindings_edit(self._default_bindings)
   ##         if text is None:
   ##             text = open(self._default_cont).read()
   ##         self.pt_edit(text, contentType)
   
   def manage_addZogiLibPageTemplateForm(self):
       """Form for adding"""
       pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/addZogiLibPageTemplateForm')).__of__(self)
       return pt()
   
   def manage_addZogiLibPageTemplate(self, id='zogiLibMainTemplate', title=None, layout=None, text=None,
                              REQUEST=None, submit=None):
       "Add a Page Template with optional file content."
   
       id = str(id)
       self._setObject(id, zogiLibPageTemplate(id))
       ob = getattr(self, id)
       if not layout: layout = "book"
       ob.pt_edit(open(os.path.join(package_home(globals()),'zpt/zogiLibMain_%s.zpt'%layout)).read(),None)
       if title:
           ob.pt_setTitle(title)
       try:
           u = self.DestinationURL()
       except AttributeError:
           u = REQUEST['URL1']
           
       u = "%s/%s" % (u, urllib.quote(id))
       REQUEST.RESPONSE.redirect(u+'/manage_main')
       return ''
   

Removed from v.1.1.1.1  
changed lines
  Added in v.1.58


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>