Diff for /ECHO_content/VLPExtension.py between versions 1.71 and 1.81

version 1.71, 2008/08/05 16:47:15 version 1.81, 2008/11/13 14:35:53
Line 2 Line 2
 This module contains extensions which where originally made for the VLP.  This module contains extensions which where originally made for the VLP.
 """  """
 from OFS.Cache import Cacheable  from OFS.Cache import Cacheable
 from Products.ECHO_content.ECHO_collection import *  
 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 File  from OFS.Image import File
 try:  
         from Products.zogiLib import zogiLib  
 except:  
         print "Zogilib not installed, VLP_resource will not work"  
   
 import xml.dom.minidom  import xml.dom.minidom
 import urllib  import urllib
 import xmlrpclib  import xmlrpclib
Line 22  from stat import * Line 16  from stat import *
 from types import *  from types import *
 from Globals import package_home  from Globals import package_home
 import transaction  import transaction
   import Acquisition
   
   from Products.ECHO_content.ECHO_collection import *
   from vlp_xmlhelpers import *
   try:
           from Products.zogiLib import zogiLib
   except:
           print "Zogilib not installed, VLP_resource will not work"
   
   
 def lemmatize(str):  def lemmatize(str):
Line 52  def checkXMLfrag(str): Line 54  def checkXMLfrag(str):
           
     xmltempl = """<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">      xmltempl = """<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     <txt>%s</txt>"""      <txt>%s</txt>"""
   
     try:      try:
         dom=xml.dom.minidom.parseString(xmltempl%str)          dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str))
         return str          return str
     except:      except:
         str=str.replace("& ","&amp; ")          str=str.replace("& ","&amp; ")
   
     dom=xml.dom.minidom.parseString(xmltempl%str)      dom=xml.dom.minidom.parseString(xmltempl%utf8ify(str))
     return str      return str
           
                                             
Line 159  def manage_addSendMailForm(self, id, toA Line 162  def manage_addSendMailForm(self, id, toA
     return ''      return ''
   
                   
   class VLP_collectionFolder(Folder):
       """klasse fŸr folder innheralb der collection"""
       meta_type="VLP_collectionFolder"
       
 class VLP_essay(Folder):  class VLP_essay(Folder):
     """classe fr VLP essays"""      """classe fr VLP essays"""
   
Line 246  class VLP_essay(Folder): Line 253  class VLP_essay(Folder):
   
         pages = self.objectItems(['DTML Document','File'])                                  pages = self.objectItems(['DTML Document','File'])                        
         pages.sort(sortFind)          pages.sort(sortFind)
           #logging.debug("pageList=%s"%repr(pages))
         return pages          return pages
                   
                   
Line 262  class VLP_essay(Folder): Line 270  class VLP_essay(Folder):
                           
         if pageObj is not None:          if pageObj is not None:
             txt = ""              txt = ""
               if pageObj.meta_type == 'File':
             data = pageObj.data              data = pageObj.data
                   #logging.debug("data=%s txt=%s"%(repr(data),txt))
             while data is not None:              while data is not None:
                 txt += data  
                 if isinstance(data, str):                  if isinstance(data, str):
                           txt += data
                     data = None                      data = None
                 else:                  else:
                           txt += data.data
                     data = data.next                      data = data.next
                   
               else:
                   # not a File object... perhaps its executable
                   txt += pageObj()
                   
             xml = checkXMLfrag(txt)              xml = checkXMLfrag(txt)
   
         return xml          return unicodify(xml)
   
   
     def getPage(self,pagenum):      def getPage(self,pagenum):
Line 468  def manage_addVLP_subCollection(self,id, Line 483  def manage_addVLP_subCollection(self,id,
         if RESPONSE is not None:          if RESPONSE is not None:
                 RESPONSE.redirect('manage_main')                  RESPONSE.redirect('manage_main')
   
   from zope.publisher.interfaces import IPublishTraverse
   from zope.interface import implements
   from zope.publisher.interfaces import NotFound 
   from zope.app import zapi 
   from zope.component import queryMultiAdapter
   from ZPublisher.BaseRequest import DefaultPublishTraverse
   
 class VLP_collection(ECHO_collection):  class VLP_collection(ECHO_collection,Acquisition.Explicit):
     """VLP spezifische Erweiterung der Collection"""      """VLP spezifische Erweiterung der Collection"""
   
           
       
       implements(IPublishTraverse)
       def findObjFromLitName(self,fileName):
           if not fileName[0:3]=="lit":
               logging.error("getOrCreateFolder wrong filename: %s"%fileName)
               return None
           
           
           restName="%08d"%int(fileName[3:])
           
           fs=(restName[0:2],restName[0:4],restName[0:6])
           
           current =self
           for f in fs:
               obj = getattr(current,f,None)
               if not obj: #subfolder existiert nicht
                   return None
               current=obj
               
           return getattr(current,fileName,None)
           
       def publishTraverse(self,request,name):
           """change the traversal if literature object"""
           
           actual_url=request['ACTUAL_URL']
           lastActual=actual_url.split("/")[-1]
           
      
           if name.startswith("lit"): #umleitung wenn lit aufgerufen wirk
               # umleitung auf den eigentlichen folder nur wenn direkt der Folder litXXX oder dessen index_html methode aufgerufen wird
               if lastActual.startswith("lit") or (lastActual=="index_html") or (lastActual=="index_meta"):
                   #obj=self. ZopeFind(self,obj_ids=[name],search_sub=1)
                   ob=self.findObjFromLitName(name)
                   if not ob:
                       return "LIt not found"
                   else:
             
                       logging.error("request:"+repr(ob))
                       request.response.setStatus(200)
                       #if (lastActual=="index_meta"):
                      #     logging.debug("index_meta requested")
                      #     return ob.index_meta
                       return ob
               else: ## andern falls transversiere zum parent.
                   obj = self.aq_parent
                   return obj
           else: # mache gar nichts falls nicht lit aufgerufen wird
    
              
               tr=DefaultPublishTraverse(self, request)
               ob= tr.publishTraverse(request, name)
          
               return ob
            #raise NotFound(self.context, name, request) 
               #return repr(request)
       
     meta_type="VLP_collection"      meta_type="VLP_collection"
     manage_options=ECHO_collection.manage_options+(      manage_options=ECHO_collection.manage_options+(
         {'label':'Change Path','action':'VLP_path_configForm'},          {'label':'Change Path','action':'VLP_path_configForm'},
Line 480  class VLP_collection(ECHO_collection): Line 557  class VLP_collection(ECHO_collection):
         {'label':'Update Metadata','action':'updateCollectionMD'},          {'label':'Update Metadata','action':'updateCollectionMD'},
         )          )
   
   
   
     def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None):      def generateSubCollections(self,errorsTXT="",forceUpdate=False,RESPONSE=None):
         """erzeuge subcollectionen"""          """erzeuge subcollectionen"""
         logging.debug("generateSubCollections")          logging.debug("generateSubCollections")
Line 493  class VLP_collection(ECHO_collection): Line 568  class VLP_collection(ECHO_collection):
         for found in founds:          for found in founds:
             try:              try:
                 litid = str(found.reference)                  litid = str(found.reference)
                 foundCol=self.ZopeFind(self,obj_ids=[litid])                  foundCol=self.findObjFromLitName(litid)
                   #foundCol=self.ZopeFind(self,obj_ids=[litid])
                 if foundCol:                  if foundCol:
                     col = foundCol[0][1]                      col = foundCol
                     logging.debug("generateSubCollections: subcollection %s exists (%s)"%(col.getId(),found.reference))                      logging.debug("generateSubCollections: subcollection %s exists (%s)"%(repr(col),found.reference))
                     if (col.title != found.titlerefdisplay) or (col.label != found.titlerefdisplay):                      if (col.title != found.titlerefdisplay) or (col.label != found.titlerefdisplay):
                         # subcollection seems to have changed                              # subcollection seems to have changed    
                         logging.debug("generateSubCollections: subcollection has changed, recreating!")                          logging.debug("generateSubCollections: subcollection has changed, recreating!")
                         self.manage_delObjects([foundCol[0][0]])                          col.aq_parent.manage_delObjects([col.getId()])
                         manage_addVLP_subCollection(self,litid,found.titlerefdisplay,found.titlerefdisplay)                          manage_addVLP_subCollection(self.getOrCreateFolderForFile(litid),litid,found.titlerefdisplay,found.titlerefdisplay)
                 else:                  else:
                     logging.debug("generateSubCollections: creating new subcollection %s"%found.reference)                      logging.debug("generateSubCollections: creating new subcollection %s"%found.reference)
                     manage_addVLP_subCollection(self,litid,found.titlerefdisplay,found.titlerefdisplay)                      manage_addVLP_subCollection(self.getOrCreateFolderForFile(litid),litid,found.titlerefdisplay,found.titlerefdisplay)
                                   
                 #teste ob es Images auf dem Server gibt mit gleichem Namen (frontmatter)                  #teste ob es Images auf dem Server gibt mit gleichem Namen (frontmatter)
                 if os.path.exists(os.path.join(self.vlp_basis,litid)):                  if os.path.exists(os.path.join(self.vlp_basis,litid)):
                     logging.debug("generateSubCollections: found frontmatter in %s"%litid)                      logging.debug("generateSubCollections: found frontmatter in %s"%litid)
                     obj=getattr(self,litid)                      obj=self.findObjFromLitName(litid)
                     if not self.ZopeFind(obj,obj_ids=[litid]):                      if not self.ZopeFind(obj,obj_ids=[litid]):
                         metalink=self.REQUEST['URL1']+"/"+litid+"/"+litid+"/index_meta"                          metalink=self.REQUEST['URL1']+"/"+litid+"/"+litid+"/index_meta"
                         newObj=VLP_resource(litid,'',metalink,litid,litid,litid,'generated','book','','','','','','')                          newObj=VLP_resource(litid,'',metalink,litid,litid,litid,'generated','book','','','','','','')
Line 520  class VLP_collection(ECHO_collection): Line 596  class VLP_collection(ECHO_collection):
   
                 if RESPONSE is not None:                  if RESPONSE is not None:
                     self.REQUEST.RESPONSE.write("<p>%s</p>\n"%litid)                      self.REQUEST.RESPONSE.write("<p>%s</p>\n"%litid)
                   logging.debug("<p>%s</p>\n"%litid)
   
             except:              except:
                 error=sys.exc_info()[0:2]                  error=sys.exc_info()[0:2]
Line 544  class VLP_collection(ECHO_collection): Line 621  class VLP_collection(ECHO_collection):
         if RESPONSE is not None:          if RESPONSE is not None:
             RESPONSE.redirect('manage_main')              RESPONSE.redirect('manage_main')
   
       
       def getOrCreateFolderForFile(self,fileName):
           
           if not fileName[0:3]=="lit":
               logging.error("getOrCreateFolder wrong filename: %s"%fileName)
               return None
           
           
           restName="%08d"%int(fileName[3:])
           
           fs=(restName[0:2],restName[0:4],restName[0:6])
           
           current =self
           for f in fs:
               obj = getattr(current,f,None)
               if not obj:
                    newObj=VLP_collectionFolder(f)
                    current._setObject(f,newObj)
                    obj = getattr(current,f)
               current=obj
               
           return current
           
     def updateCollection(self,forceUpdate=False,RESPONSE=None):      def updateCollection(self,forceUpdate=False,RESPONSE=None):
         """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""          """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
         errorsTXT="<h2>Errors</h2>"          errorsTXT="<h2>Errors</h2>"
Line 552  class VLP_collection(ECHO_collection): Line 652  class VLP_collection(ECHO_collection):
             RESPONSE.write("<html><body>")              RESPONSE.write("<html><body>")
   
         files=os.listdir(self.vlp_basis)          files=os.listdir(self.vlp_basis)
           i=0
         for fileName in files:          for fileName in files:
               if i<100:
                   i+=1
               else:
                   i=0
                   j=0
                   while j<5:
                       try:
                           transaction.get().commit()  
                           j=6
                       except:
                           logging.error("Commit: %s"%j)
                           j+=1
                           
                   RESPONSE.write("<p>committed</p>")
             if fileName[0:3]=="lit":              if fileName[0:3]=="lit":
                 metalink=self.REQUEST['URL1']+"/"+fileName+"/index_meta"                  metalink=self.REQUEST['URL1']+"/"+fileName+"/index_meta"
                   
                   folder=self.getOrCreateFolderForFile(fileName) #get the folder where fileName lives or should live
                   if not folder: #folder gave an error
                       continue
                 try:                  try:
                     if not hasattr(self,fileName):                      if not hasattr(folder,fileName):
                         # create new resource                          # create new resource
                         logging.debug("updateCollection: new %s"%fileName)                          logging.debug("updateCollection: new %s"%fileName)
                         if RESPONSE is not None:                          if RESPONSE is not None:
                             RESPONSE.write("<p>new: %s</p>\n"%fileName)                              RESPONSE.write("<p>new: %s</p>\n"%fileName)
                           logging.debug("new: %s \n"%fileName)
                         newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','')                          newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','')
                         self._setObject(fileName,newObj)                          
                           folder._setObject(fileName,newObj)
                                   
                     if RESPONSE is not None:                      if RESPONSE is not None:
                         RESPONSE.write("<p>got: %s "%fileName)                          RESPONSE.write("<p>got: %s "%fileName)
                     genObj=getattr(self,fileName)  
                       genObj=getattr(folder,fileName)
                       logging.debug("got: %s "%fileName)
   
                     logging.debug("updateCollection: inspecting %s"%fileName)                      logging.debug("updateCollection: inspecting %s"%fileName)
                     # create index                      # create index
                     if hasattr(genObj,'createIndexFile'):                      if hasattr(genObj,'createIndexFile'):
Line 699  class VLP_resource(ECHO_resource,Cacheab Line 823  class VLP_resource(ECHO_resource,Cacheab
   
   
   
       def identifyMediaType(self):
           """identifiziert den Medientype aus der VLP Datenbank"""
           founds=self.ZSQLSimpleSearch('select * from vl_literature where reference=\''+self.resourceID+'\' order by id')
           if (not founds) or (len(founds)==0):
               self.mediaType="generic" # steht nicht in der Datenbank, dann nimm generisch an
               return self.mediaType
           
           
           if founds[0].referencetype =="Audio":
               self.mediaType ="audio"
           elif founds[0].referencetype =="Film":
               self.mediaType ="video"
           else:
               self.mediaType ="image" # nimm an, dass alle anderen Eintrage in der Datenbank auf images verweisen (Buecher oder Fotografien).
           
           return self.mediaType
            
       def getMediaType(self,cached=False):
           """give the Media-type back, if chached False, then get it from the database"""
           
           if (not hasattr(self,'mediaType')) or (self.mediaType=="") or (not cached):
               self.identifyMediaType()
           
           return self.mediaType
       
           
           
           
     def copyTranscriptionFromDB(self):      def copyTranscriptionFromDB(self):
             """checks if transcription exits in DB"""              """checks if transcription exits in DB"""
             founds=self.ZSQLSimpleSearch('select * from vl_transcript where source=\''+self.resourceID+'\' order by id')              founds=self.ZSQLSimpleSearch('select * from vl_transcript where source=\''+self.resourceID+'\' order by id')
Line 753  class VLP_resource(ECHO_resource,Cacheab Line 905  class VLP_resource(ECHO_resource,Cacheab
     def show(self):      def show(self):
         """show the rendered file"""          """show the rendered file"""
   
         if self.REQUEST.get('p',None):          mt = self.getMediaType()
           
           if (mt in ['video','audio']):
               pt = self.getVLPTemplate('libraryMovieTemplate')
           else: #zur zeit werden alle anderen type auf das libraryTemplate abgebildet.
               
               if self.REQUEST.get('p',None): #make sure that parameter p exists
             #self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None)))              #self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None)))
             params = "pn=%s"%self.file2page(self.REQUEST.get('p',None))              params = "pn=%s"%self.file2page(self.REQUEST.get('p',None))
             mk = self.REQUEST.get('mk',None)              mk = self.REQUEST.get('mk',None)
Line 761  class VLP_resource(ECHO_resource,Cacheab Line 919  class VLP_resource(ECHO_resource,Cacheab
                 params += "&mk=%s"%mk                  params += "&mk=%s"%mk
             self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+'?'+params)              self.REQUEST.RESPONSE.redirect(self.REQUEST['URL']+'?'+params)
                         
         if hasattr(self,'libraryTemplate.html'):              pt = self.getVLPTemplate('libraryTemplate')
                 return getattr(self,'libraryTemplate.html')()  
                   
         pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','library_template.zpt')).__of__(self)  
         pt.content_type="text/html"  
         return pt()          return pt()
   
       def getVLPTemplate(self,name):
           html=name+".html"
           if hasattr(self,html):
                   return getattr(self,html)
           
           pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp',name+'.zpt')).__of__(self)
           pt.content_type="text/html"
           return pt
   
     def index_html(self):      def index_html(self):
             """index_html"""              """index_html"""
             #return self.REQUEST              #return self.REQUEST
Line 794  class VLP_resource(ECHO_resource,Cacheab Line 958  class VLP_resource(ECHO_resource,Cacheab
             RESPONSE.redirect('manage_main')              RESPONSE.redirect('manage_main')
   
   
     def index_meta(self):      def index_meta(self,RESPONSE=None):
         """index_meta"""          """index_meta"""
                   
         pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_meta.zpt')).__of__(self)          pt=PageTemplateFile(os.path.join(package_home(globals()),'vlp','index_meta.zpt')).__of__(self)
         pt.content_type="text/html"          pt.content_type="text/xml"      
         return pt()          x= pt.pt_render()
           #logging.debug("index_meta 4:"+x)
           if RESPONSE:
               RESPONSE.setHeader("Content-Type","text/xml")
           return x
     def file2page(self,p):      def file2page(self,p):
         """converts filename to pagenumber"""          """converts filename to pagenumber"""
         dom=xml.dom.minidom.parse(ECHO_helpers.urlopen(getattr(self,'index.xml').absolute_url()))          
           #dom=xml.dom.minidom.parse(ECHO_helpers.urlopen(getattr(self,'index.xml').absolute_url()))
           index=getattr(self,'index.xml')
    
           txt=index.pt_render()
           dom=xml.dom.minidom.parseString(txt)
                   
         for page in dom.getElementsByTagName('page'):          for page in dom.getElementsByTagName('page'):
                  # pageummer mit lo oder hi sind aequivalent                   # pageummer mit lo oder hi sind aequivalent
                  if (page.getAttribute('file')==p) or ("%slo"%page.getAttribute('file')==p) or ("%shi"%page.getAttribute('file')==p):                   if (page.getAttribute('file')==p) or ("%slo"%page.getAttribute('file')==p) or ("%shi"%page.getAttribute('file')==p):
                          return page.getAttribute('nr')                       nr=page.getAttribute('nr')
                       
                        return nr
                           
         return 0          return 0
   

Removed from v.1.71  
changed lines
  Added in v.1.81


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