Diff for /documentViewer/documentViewer.py between versions 1.65.2.2 and 1.69.2.2

version 1.65.2.2, 2010/06/18 19:41:28 version 1.69.2.2, 2010/06/16 16:38:17
Line 2 Line 2
 from OFS.Folder import Folder  from OFS.Folder import Folder
 from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate  from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile   from Products.PageTemplates.PageTemplateFile import PageTemplateFile 
   from Products.PythonScripts.standard import url_quote
 from AccessControl import ClassSecurityInfo  from AccessControl import ClassSecurityInfo
 from AccessControl import getSecurityManager  from AccessControl import getSecurityManager
 from Globals import package_home  from Globals import package_home
   
   from Ft.Xml.Domlette import NonvalidatingReader
   from Ft.Xml.Domlette import PrettyPrint, Print
 from Ft.Xml import EMPTY_NAMESPACE, Parse  from Ft.Xml import EMPTY_NAMESPACE, Parse
 import Ft.Xml.Domlette  
   from xml.dom.minidom import parse, parseString
   
   from extraFunction import *
   
   
   import Ft.Xml.XPath
   import cStringIO
   import xmlrpclib
 import os.path  import os.path
 import sys  import sys
   import cgi
 import urllib  import urllib
 import urllib2  
 import logging  import logging
 import math  import math
   
 import urlparse   import urlparse 
 import cStringIO  from types import *
   
 def logger(txt,method,txt2):  def logger(txt,method,txt2):
     """logging"""      """logging"""
Line 43  def getTextFromNode(nodename): Line 55  def getTextFromNode(nodename):
 def serializeNode(node, encoding='utf-8'):  def serializeNode(node, encoding='utf-8'):
     """returns a string containing node as XML"""      """returns a string containing node as XML"""
     buf = cStringIO.StringIO()      buf = cStringIO.StringIO()
     Ft.Xml.Domlette.Print(node, stream=buf, encoding=encoding)      Print(node, stream=buf, encoding=encoding)
     s = buf.getvalue()      s = buf.getvalue()
     buf.close()      buf.close()
     return s      return s
Line 54  def getParentDir(path): Line 66  def getParentDir(path):
     return '/'.join(path.split('/')[0:-1])      return '/'.join(path.split('/')[0:-1])
                   
   
 def getHttpData(url, data=None, num_tries=3, timeout=10):  
     """returns result from url+data HTTP request"""  
     # we do GET (by appending data to url)  
     if isinstance(data, str) or isinstance(data, unicode):  
         # if data is string then append  
         url = "%s?%s"%(url,data)  
     elif isinstance(data, dict) or isinstance(data, list) or isinstance(data, tuple):  
         # urlencode  
         url = "%s?%s"%(url,urllib.urlencode(data))  
       
     response = None  
     errmsg = None  
     for cnt in range(num_tries):  
         try:  
             logging.debug("getHttpData(#%s %ss) url=%s"%(cnt+1,timeout,url))  
             if sys.version_info < (2, 6):  
                 # set timeout on socket -- ugly :-(  
                 import socket                  import socket
                 socket.setdefaulttimeout(float(timeout))  
                 response = urllib2.urlopen(url)  
             else:  
                 response = urllib2.urlopen(url,timeout=float(timeout))  
             # check result?  
             break  
         except urllib2.HTTPError, e:  
             logging.error("getHttpData: HTTP error(%s): %s"%(e.code,e))  
             errmsg = str(e)  
             # stop trying  
             break  
         except urllib2.URLError, e:  
             logging.error("getHttpData: URLLIB error(%s): %s"%(e.reason,e))  
             errmsg = str(e)  
             # stop trying  
             #break  
   
     if response is not None:  
         data = response.read()  
         response.close()  
         return data  
       
     raise IOError("ERROR fetching HTTP data from %s: %s"%(url,errmsg))  
     #return None  
   
   def urlopen(url,timeout=2):
           """urlopen mit timeout"""
           socket.setdefaulttimeout(timeout)
           ret=urllib.urlopen(url)
           socket.setdefaulttimeout(5)
           return ret
   
   
 ##  ##
 ## documentViewer class  ## documentViewer class
 ##  ##
 class documentViewer(Folder):  class documentViewer(Folder, extraFunction):
     """document viewer"""      """document viewer"""
       #textViewerUrl="http://127.0.0.1:8080/HFQP/testXSLT/getPage?"
       
     meta_type="Document viewer"      meta_type="Document viewer"
           
     security=ClassSecurityInfo()      security=ClassSecurityInfo()
Line 144  class documentViewer(Folder): Line 123  class documentViewer(Folder):
         #self['template'] = templateFolder # Zope-2.12 style          #self['template'] = templateFolder # Zope-2.12 style
         self._setObject('template',templateFolder) # old style          self._setObject('template',templateFolder) # old style
         try:          try:
             import MpdlXmlTextServer              from Products.XMLRpcTools.XMLRpcTools import XMLRpcServerProxy
             textServer = MpdlXmlTextServer.MpdlXmlTextServer(id='fulltextclient',serverName=textServerName)              xmlRpcClient = XMLRpcServerProxy(id='fulltextclient', serverUrl=textServerName, use_xmlrpc=False)
             #templateFolder['fulltextclient'] = xmlRpcClient              #templateFolder['fulltextclient'] = xmlRpcClient
             templateFolder._setObject('fulltextclient',textServer)              templateFolder._setObject('fulltextclient',xmlRpcClient)
         except Exception, e:          except Exception, e:
             logging.error("Unable to create MpdlXmlTextServer for fulltextclient: "+str(e))              logging.error("Unable to create XMLRpcTools for fulltextclient: "+str(e))
         try:          try:
             from Products.zogiLib.zogiLib import zogiLib              from Products.zogiLib.zogiLib import zogiLib
             zogilib = zogiLib(id="zogilib", title="zogilib for docuviewer", dlServerURL=imageScalerUrl, layout="book")              zogilib = zogiLib(id="zogilib", title="zogilib for docuviewer", dlServerURL=imageScalerUrl, layout="book")
Line 159  class documentViewer(Folder): Line 138  class documentViewer(Folder):
             logging.error("Unable to create zogiLib for zogilib: "+str(e))              logging.error("Unable to create zogiLib for zogilib: "+str(e))
                   
                   
     # proxy text server methods to fulltextclient  
     def getTextPage(self, **args):  
         """get page"""  
         return self.template.fulltextclient.getTextPage(**args)  
   
     def getQuery(self, **args):  
         """get query"""  
         return self.template.fulltextclient.getQuery(**args)  
   
     def getSearch(self, **args):  
         """get search"""  
         return self.template.fulltextclient.getSearch(**args)  
   
     def getNumPages(self, docinfo):  
         """get numpages"""  
         return self.template.fulltextclient.getNumPages(docinfo)  
   
     def getTranslate(self, **args):  
         """get translate"""  
         return self.template.fulltextclient.getTranslate(**args)  
   
     def getLemma(self, **args):  
         """get lemma"""  
         return self.template.fulltextclient.getLemma(**args)  
   
     def getToc(self, **args):  
         """get toc"""  
         return self.template.fulltextclient.getToc(**args)  
   
     def getTocPage(self, **args):  
         """get tocpage"""  
         return self.template.fulltextclient.getTocPage(**args)  
   
       
     security.declareProtected('View','thumbs_rss')      security.declareProtected('View','thumbs_rss')
     def thumbs_rss(self,mode,url,viewMode="auto",start=None,pn=1):      def thumbs_rss(self,mode,url,viewMode="auto",start=None,pn=1):
         '''          '''
Line 217  class documentViewer(Folder): Line 162  class documentViewer(Folder):
         pt = getattr(self.template, 'thumbs_main_rss')          pt = getattr(self.template, 'thumbs_main_rss')
                   
         if viewMode=="auto": # automodus gewaehlt          if viewMode=="auto": # automodus gewaehlt
             if docinfo.has_key("textURL") or docinfo.has_key('textURLPath'): #texturl gesetzt und textViewer konfiguriert              if docinfo.get("textURL",'') and self.textViewerUrl: #texturl gesetzt und textViewer konfiguriert
                 viewMode="text"                  viewMode="text"
             else:              else:
                 viewMode="images"                  viewMode="images"
Line 243  class documentViewer(Folder): Line 188  class documentViewer(Folder):
             return "ERROR: template folder missing!"              return "ERROR: template folder missing!"
                           
         if not getattr(self, 'digilibBaseUrl', None):          if not getattr(self, 'digilibBaseUrl', None):
             self.digilibBaseUrl = self.findDigilibUrl() or "http://digilib.mpiwg-berlin.mpg.de/digitallibrary"              self.digilibBaseUrl = self.findDigilibUrl() or "http://nausikaa.mpiwg-berlin.mpg.de/digitallibrary"
                           
         docinfo = self.getDocinfo(mode=mode,url=url)          docinfo = self.getDocinfo(mode=mode,url=url)
                   
           
         if tocMode != "thumbs":          if tocMode != "thumbs":
             # get table of contents              # get table of contents
             docinfo = self.getToc(mode=tocMode, docinfo=docinfo)              docinfo = self.getToc(mode=tocMode, docinfo=docinfo)
                           
         if viewMode=="auto": # automodus gewaehlt          if viewMode=="auto": # automodus gewaehlt
             if docinfo.has_key('textURL') or docinfo.has_key('textURLPath'): #texturl gesetzt und textViewer konfiguriert              if docinfo.get("textURL",''): #texturl gesetzt und textViewer konfiguriert
                 viewMode="text_dict"                  viewMode="text_dict"
             else:              else:
                 viewMode="images"                  viewMode="images"
Line 266  class documentViewer(Folder): Line 212  class documentViewer(Folder):
         ret=""          ret=""
         if mk is None:          if mk is None:
             return ""              return ""
         if not isinstance(mk, list):          if type(mk) is not ListType:
             mk=[mk]              mk=[mk]
         for m in mk:          for m in mk:
             ret+="mk=%s"%m              ret+="mk=%s"%m
Line 305  class documentViewer(Folder): Line 251  class documentViewer(Folder):
                 params["url"] = getParentDir(params["url"])                  params["url"] = getParentDir(params["url"])
                                   
         # quote values and assemble into query string          # quote values and assemble into query string
         #ps = "&".join(["%s=%s"%(k,urllib.quote(v)) for (k, v) in params.items()])          ps = "&".join(["%s=%s"%(k,urllib.quote(v)) for (k, v) in params.items()])
         ps = urllib.urlencode(params)  
         url=self.REQUEST['URL1']+"?"+ps          url=self.REQUEST['URL1']+"?"+ps
         return url          return url
   
Line 359  class documentViewer(Folder): Line 304  class documentViewer(Folder):
                                   
     def getDirinfoFromDigilib(self,path,docinfo=None,cut=0):      def getDirinfoFromDigilib(self,path,docinfo=None,cut=0):
         """gibt param von dlInfo aus"""          """gibt param von dlInfo aus"""
           num_retries = 3
         if docinfo is None:          if docinfo is None:
             docinfo = {}              docinfo = {}
                   
Line 370  class documentViewer(Folder): Line 316  class documentViewer(Folder):
           
         logging.debug("documentViewer (getparamfromdigilib) dirInfo from %s"%(infoUrl))          logging.debug("documentViewer (getparamfromdigilib) dirInfo from %s"%(infoUrl))
                   
         txt = getHttpData(infoUrl)          for cnt in range(num_retries):
         if txt is None:              try:
                   # dom = NonvalidatingReader.parseUri(imageUrl)
                   txt=urllib.urlopen(infoUrl).read()
                   dom = Parse(txt)
                   break
               except:
                   logging.error("documentViewer (getdirinfofromdigilib) error reading %s (try %d)"%(infoUrl,cnt))
           else:
             raise IOError("Unable to get dir-info from %s"%(infoUrl))              raise IOError("Unable to get dir-info from %s"%(infoUrl))
   
         dom = Parse(txt)  
         sizes=dom.xpath("//dir/size")          sizes=dom.xpath("//dir/size")
         logging.debug("documentViewer (getparamfromdigilib) dirInfo:size"%sizes)          logging.debug("documentViewer (getparamfromdigilib) dirInfo:size"%sizes)
                   
Line 390  class documentViewer(Folder): Line 342  class documentViewer(Folder):
                           
     def getIndexMeta(self, url):      def getIndexMeta(self, url):
         """returns dom of index.meta document at url"""          """returns dom of index.meta document at url"""
           num_retries = 3
         dom = None          dom = None
         metaUrl = None          metaUrl = None
         if url.startswith("http://"):          if url.startswith("http://"):
Line 401  class documentViewer(Folder): Line 354  class documentViewer(Folder):
             metaUrl=server+url.replace("/mpiwg/online","")              metaUrl=server+url.replace("/mpiwg/online","")
             if not metaUrl.endswith("index.meta"):              if not metaUrl.endswith("index.meta"):
                 metaUrl += "/index.meta"                  metaUrl += "/index.meta"
           logging.debug("METAURL: %s"%metaUrl)
           for cnt in range(num_retries):
               try:
                   # patch dirk encoding fehler treten dann nicht mehr auf
                   # dom = NonvalidatingReader.parseUri(metaUrl)
                   txt=urllib.urlopen(metaUrl).read()
                   dom = Parse(txt)
                   break
               except:
                   logging.error("ERROR documentViewer (getIndexMeta) %s (%s)"%sys.exc_info()[0:2])
                                   
         logging.debug("(getIndexMeta): METAURL: %s"%metaUrl)          if dom is None:
         txt=getHttpData(metaUrl)  
         if txt is None:  
             raise IOError("Unable to read index meta from %s"%(url))              raise IOError("Unable to read index meta from %s"%(url))
                   
         dom = Parse(txt)  
         return dom          return dom
           
     def getPresentationInfoXML(self, url):      def getPresentationInfoXML(self, url):
         """returns dom of info.xml document at url"""          """returns dom of info.xml document at url"""
           num_retries = 3
         dom = None          dom = None
         metaUrl = None          metaUrl = None
         if url.startswith("http://"):          if url.startswith("http://"):
Line 422  class documentViewer(Folder): Line 383  class documentViewer(Folder):
             server=self.digilibBaseUrl+"/servlet/Texter?fn="              server=self.digilibBaseUrl+"/servlet/Texter?fn="
             metaUrl=server+url.replace("/mpiwg/online","")              metaUrl=server+url.replace("/mpiwg/online","")
                   
         txt=getHttpData(metaUrl)          for cnt in range(num_retries):
         if txt is None:              try:
                   # patch dirk encoding fehler treten dann nicht mehr auf
                   # dom = NonvalidatingReader.parseUri(metaUrl)
                   txt=urllib.urlopen(metaUrl).read()
                   dom = Parse(txt)
                   break
               except:
                   logging.error("ERROR documentViewer (getPresentationInfoXML) %s (%s)"%sys.exc_info()[0:2])
                   
           if dom is None:
             raise IOError("Unable to read infoXMLfrom %s"%(url))              raise IOError("Unable to read infoXMLfrom %s"%(url))
                           
         dom = Parse(txt)  
         return dom          return dom
                                                   
                   
Line 569  class documentViewer(Folder): Line 538  class documentViewer(Folder):
             viewerUrl = getTextFromNode(viewerUrls[0])              viewerUrl = getTextFromNode(viewerUrls[0])
             docinfo['viewerURL'] = viewerUrl              docinfo['viewerURL'] = viewerUrl
                   
         # old style text URL  
         textUrls = dom.xpath("//texttool/text")          textUrls = dom.xpath("//texttool/text")
         if textUrls and (len(textUrls) > 0):          if textUrls and (len(textUrls) > 0):
             textUrl = getTextFromNode(textUrls[0])              textUrl = getTextFromNode(textUrls[0])
Line 581  class documentViewer(Folder): Line 549  class documentViewer(Folder):
                           
             docinfo['textURL'] = textUrl              docinfo['textURL'] = textUrl
           
         # new style text-url-path  
         textUrls = dom.xpath("//texttool/text-url-path")          textUrls = dom.xpath("//texttool/text-url-path")
         if textUrls and (len(textUrls) > 0):          if textUrls and (len(textUrls) > 0):
             textUrl = getTextFromNode(textUrls[0])              textUrl = getTextFromNode(textUrls[0])
             docinfo['textURLPath'] = textUrl              docinfo['textURLPath'] = textUrl
             if not docinfo['imagePath']:              if not docinfo['imagePath']:
                 # text-only, no page images                  # text-only, no page images
                 docinfo = self.getNumPages(docinfo)                  docinfo = self.getNumPages(docinfo) #im moment einfach auf eins setzen, navigation ueber die thumbs geht natuerlich nicht    
                     
         presentationUrls = dom.xpath("//texttool/presentation")          presentationUrls = dom.xpath("//texttool/presentation")
         docinfo = self.getBibinfoFromIndexMeta(url, docinfo=docinfo, dom=dom)   # get info von bib tag          docinfo = self.getBibinfoFromIndexMeta(url, docinfo=docinfo, dom=dom)   # get info von bib tag

Removed from v.1.65.2.2  
changed lines
  Added in v.1.69.2.2


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