Diff for /OSA_system2/OSAS_browser.py between versions 1.7 and 1.15

version 1.7, 2005/01/21 14:03:24 version 1.15, 2005/03/03 20:41:00
Line 9  from OFS.Folder import Folder Line 9  from OFS.Folder import Folder
 from OFS.SimpleItem import SimpleItem  from OFS.SimpleItem import SimpleItem
 from Globals import InitializeClass,package_home  from Globals import InitializeClass,package_home
 import zLOG  import zLOG
   import base64
   import bz2
 import os  import os
 import os.path  import os.path
 import stat  import stat
 import xml.dom.minidom  import xml.dom.minidom
 from types import *  from types import *
   import xmlrpclib
   from OSAS_helpers import *
   
   def decodeRPC(string):
       return bz2.decompress(base64.decodestring(string))
   
   
 class OSAS_storeOnline(SimpleItem):  class OSAS_storeOnline(SimpleItem):
     """Webfrontend für das Storagesystem      """Webfrontend für das Storagesystem
Line 26  class OSAS_storeOnline(SimpleItem): Line 34  class OSAS_storeOnline(SimpleItem):
     _v_fileSystem={} #chache fuer filesystem      _v_fileSystem={} #chache fuer filesystem
     _v_metaFiles={} #chache fuer indexMeta      _v_metaFiles={} #chache fuer indexMeta
           
     def __init__(self,id):      def getParentType(self,path):
         """initialize a new instance          """getFileType des parentordners"""
         @param id: Zope id"""  
         self.id = id  
   
           realPath=os.path.split(path)[0]
           
           objects=self.readObjectsFromPath(realPath)
   
     security.declareProtected('View','index_html')          return objects[os.path.join(realPath,".")][0]
     def index_html(self):      
         """main view either standard template zpt/storeOnline_index_html.zpt or storeOnline_index.html in tree"""      def getMetaFile(self,path):
         if hasattr(self,'storeOnline_index.html'):          """get index.meta and translate it to HTML"""
             return getattr(self,'storeOnline_index.html')()          """Lies Metafile ein
           @param path: Pfad des index.met        
           @return: index.meta file
           """
           html=[]
           server=xmlrpclib.Server(self.serverUrl)
           
   
           f=server.getFile(path+"/index.meta")
           
           if not f:
                 
                 return self.getMetaInfoFromIndexMeta(path)
                 #return "NO_METADATA"
         else:          else:
             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeOnline_index_html.zpt')).__of__(self)  
             return pt()  
   
              dom = xml.dom.minidom.parseString(f)
   
     def findIndexMeta(self,path=""):             try:
         """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file                 name=getText(dom.getElementsByTagName("name")[0].childNodes)
         @keyword path: default ist "", Pfad auf das Object relativ zum rootFolderName             except:
         @return: None falls kein index.meta existiert sonst Pfad auf das index.meta                 name="NOT_DEFINED!!!"
         """             try:
         realPath=os.path.normpath(os.path.join(self.rootFolderName,path))                 creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
         #suche index.meta             except:
         while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):                 creator="NOT_DEFINED!!!"
             realPath=os.path.split(realPath)[0]  
              try:
                  creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
              except:
                  creation_date="NOT_DEFINED!!!"
                           
         if realPath=='' or realPath=='/':             try:
             if os.path.exists(os.path.join(realPath,'index.meta')):                 description=getText(dom.getElementsByTagName("description")[0].childNodes)
                 return os.path.join(realPath,'index.meta')             except:
                  description="NOT_DEFINED!!!"
   
              try:
               type=getText(dom.getElementsByTagName("content-type")[0].childNodes) 
              except:
               type=""
              if type=="scanned document":
                       html="<h3>Document: "+name+"</h3>"
              elif type=="folder":
                       html="<h3>Folder: "+name+"</h3>"
             else:              else:
                 return None                      html="<h3>Document: "+name+"</h3>"
   
              html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>" 
              html=html+"<h4>Description</h4><p>"+description+"</p>"
              try:
               bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
               if bib.attributes.has_key('type'):
                 html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
               else:
                 html=html+"<h4>Info</h4>"
               html=html+getBib(bib.childNodes)
   
              except:
               """none"""
   
       #        html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace')
   
              return html
   
   
       def getMetaInfoFromIndexMeta(self,path):
           """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container)
           @param path: Pfad auf das Object relativ zum rootFolderName
           @return: metadata als html
           """
           print "search for ",path
           xmlInfos=self.findEntryInIndexMeta(path)
           print "RRRRRRRRRRRR",xmlInfos
           if xmlInfos:
               return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
         else:          else:
             return os.path.join(realPath,'index.meta')              return ""
   
     def findEntryInIndexMeta(self,path):      def findEntryInIndexMeta(self,path):
         """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.          """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.
Line 67  class OSAS_storeOnline(SimpleItem): Line 130  class OSAS_storeOnline(SimpleItem):
         @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.          @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
         """          """
   
         indexMeta=self.findIndexMeta(path) # suche index.meta          server=xmlrpclib.Server(self.serverUrl)
                   indexMeta=server.findIndexMeta(path) # suche index.meta
           print "found indexMeta",indexMeta
         if not indexMeta:          if not indexMeta:
             return None              return None
   
         realPath=os.path.split(indexMeta)[0]          realPath=os.path.split(indexMeta)[0]
         path=os.path.normpath(os.path.join(self.rootFolderName,path))          path=os.path.normpath(path)
   
         try:          try:
             dom=xml.dom.minidom.parse(indexMeta)              
               dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
         except:          except:
             zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)              zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
         #ist path ein directory?               return None
         dirs=dom.getElementsByTagName('dir')         
         for dir in dirs:          path=path.replace(realPath,'')
             pathes=dir.getElementsByTagName('path')          (searchPath,name)=os.path.split(path)
             if pathes:          if (len(searchPath)>0) and (searchPath[0]=="/"):
                 pathX=OSAS_helpers.getText(pathes[0].childNodes)              if len(searchPath)<=1:
             else:                  searchPath=""
                 pathX=""  
             names=dir.getElementsByTagName('name')  
             if names:  
                 name=OSAS_helpers.getText(names[0].childNodes)  
             else:              else:
                 name=""                  searchPath=searchPath[1:]
           #ist path ein directory? 
           xpath="/resource/dir[name='%s' and path='%s']"%(name,searchPath)
   
             checkpath=os.path.normpath(os.path.join(realPath,pathX,name))          dirs=xml.xpath.Evaluate(xpath,dom)
             if checkpath==path:  
                                   
                 return dir.toxml()          if len(dirs)>0:
               return dirs[0].toxml
   
         #ist path ein file?          #ist path ein file?
         files=dom.getElementsByTagName('file')          xpath="/resource/file[name='%s' and path='%s']"%(name,searchPath)
         for dir in dirs:  
             pathes=dir.getElementsByTagName('path')  
             if pathes:  
                 pathX=OSAS_helpers.getText(pathes[0].childNodes)  
             else:  
                 pathX=""  
             names=dir.getElementsByTagName('name')  
             if names:  
                 name=OSAS_helpers.getText(names[0].childNodes)  
             else:  
                 name=""  
   
             checkpath=os.path.normpath(os.path.join(realPath,pathX,name))  
             if checkpath==path:  
                                   
                 return dir.toxml()          dirs=xml.xpath.Evaluate(xpath,dom)
   
           if len(dirs)>0:
               return dirs[0].toxml()
                   
         return None          return None
   
   
     def getSubDirsFromIndexMeta(self,path):      def getSubDirsFromIndexMeta(self,path):
                   
         """Gebe alle path untergeordenten Objekte aus          """Gebe alle path untergeordenten Objekte aus
Line 128  class OSAS_storeOnline(SimpleItem): Line 180  class OSAS_storeOnline(SimpleItem):
         @todo: Rueckgabe einer Beschreibung gemaess Metadaten          @todo: Rueckgabe einer Beschreibung gemaess Metadaten
         """          """
         ret={}          ret={}
         indexMeta=self.findIndexMeta(path)#findex index.meta zu path.          server=xmlrpclib.Server(self.serverUrl)
           indexMeta,stats=server.findIndexMetaWithStats(path)#findex index.meta zu path.
           print "checking",path,indexMeta
         if not indexMeta:          if not indexMeta:
             return ret              return ret
   
Line 141  class OSAS_storeOnline(SimpleItem): Line 194  class OSAS_storeOnline(SimpleItem):
   
   
         #teste ob schon im cache          #teste ob schon im cache
         stats=os.stat(indexMeta)          
         if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):          if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
             return self._v_metaFiles[path][1]              return self._v_metaFiles[path][1]
   
         try:          try:
             dom=xml.dom.minidom.parse(indexMeta)              dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
         except:          except:
             zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)              zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
               return ret
   
         dirs=[]          dirs=[]
         dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')          dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
Line 174  class OSAS_storeOnline(SimpleItem): Line 227  class OSAS_storeOnline(SimpleItem):
                     fileType="OSAS_file_archive"                      fileType="OSAS_file_archive"
   
                 object=os.path.join(realPath,pathX,name)                  object=os.path.join(realPath,pathX,name)
                 ret[object]=(fileType,'')                  ret[object.encode('utf-8')]=(fileType,'')
   
         self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache          self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache
         
         return ret          return ret
   
                   
     def getMetaInfoFromIndexMeta(self,path):      
         """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container)      def __init__(self,id,serverUrl):
         @param path: Pfad auf das Object relativ zum rootFolderName          """initialize a new instance
         @return: metadata als html          @param id: Zope id"""
         """          self.id = id
         xmlInfos=self.findEntryInIndexMeta(path)          self.serverUrl = serverUrl
         if xmlInfos:      
             return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)  
       security.declareProtected('View','index_html')
       def index_html(self):
           """main view either standard template zpt/storeOnline_index_html.zpt or storeOnline_index.html in tree"""
           if hasattr(self,'storeOnline_index.html'):
               return getattr(self,'storeOnline_index.html')()
         else:          else:
             return ""              pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeOnline_index_html.zpt')).__of__(self)
               return pt()
   
   
       def findIndexMeta(self,path=""):
           """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
           @keyword path: default ist "", Pfad auf das Object relativ zum rootFolderName
           @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
           """
           realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
           #suche index.meta
           server=xmlrpclib.Server(self.serverUrl)
           return server.findIndexMeta(realPath)
           
         
   
     def readObjectsFromPath(self,path="",metaDataId=None):      def readObjectsFromPath(self,path="",metaDataId=None):
Line 199  class OSAS_storeOnline(SimpleItem): Line 271  class OSAS_storeOnline(SimpleItem):
         @keyword metaDataId: Optional, id des OSAS_Metadata Object, dass benutzt werden soll, generisch wird das erste Object, dass in parent gefunden wird angezeigt.          @keyword metaDataId: Optional, id des OSAS_Metadata Object, dass benutzt werden soll, generisch wird das erste Object, dass in parent gefunden wird angezeigt.
         @return: directory der Form [pfad zum Objekt] -> (fileType,metadatum als String)          @return: directory der Form [pfad zum Objekt] -> (fileType,metadatum als String)
         """          """
                                  server=xmlrpclib.Server(self.serverUrl)             
         realPath=os.path.normpath(os.path.join(self.rootFolderName,path))          realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
   
         if metaDataId:          if metaDataId:
Line 220  class OSAS_storeOnline(SimpleItem): Line 292  class OSAS_storeOnline(SimpleItem):
             return {}              return {}
                           
                   
         if not os.path.exists(realPath):  
             #return None,"(ERROR) path %s does not exist."%path  
             return None  
                   
         stats=os.stat(realPath)          
           stats=server.getStat(realPath)
   
           if not stats:
               return None
   
         #teste ob schon im cache          #teste ob schon im cache
         if self._v_fileSystem.has_key(realPath) and (self._v_fileSystem[realPath][0]==stats[stat.ST_MTIME]):          #if self._v_fileSystem.has_key(realPath) and (self._v_fileSystem[realPath][0]==stats[stat.ST_MTIME]):
           #    
           #   return self._v_fileSystem[realPath][1]
                           
             return self._v_fileSystem[realPath][1]          indexMetas=server.getAllIndexMetasOfSubDirs(realPath)
           dir=indexMetas.keys()
   
         dir=os.listdir(realPath)  
         ret={}          ret={}
         for filename in dir:          for filename in dir:
               print "doing",filename,indexMetas
             object=os.path.join(realPath,filename)              object=os.path.join(realPath,filename)
             fileType=OSAS_helpers.checkOSASFileType(object)              fileType=indexMetas[filename][0]
                           
             if fileType:              if fileType:
                 if metaData:                  if (fileType=='OSAS_dir') and indexMetas.has_key(".") and indexMetas["."][1]:
                       print "TEEEEEEEEEE"
                       if(OSAS_helpers.isImageFolder(object,decodeRPC(indexMetas["."][1]))):
                           fileType='OSAS_imageFolder'
                       elif(OSAS_helpers.isVideoFolder(object,decodeRPC(indexMetas["."][1]))):
                           fileType='OSAS_videoFolder'
                   if metaData and indexMetas[filename][1]:
                       print "do",filename
                       ret[object]=(fileType,metaData.getDisplayFieldsAsStr(decodeRPC(indexMetas[filename][1])))
                   else:
                       metaDataStr=self.findEntryInIndexMeta(object)
                       print "MMMMMDDDDD",metaDataStr
                       if metaDataStr:
                           display=metaData.getDisplayFieldsAsStr(metaDataStr)
                           dom=xml.dom.minidom.parseString(metaDataStr)
   
                           if len(xml.xpath.Evaluate("/file/meta/video-file",dom))>0:
                               fileType='OSAS_videoFile'
                                     
                     ret[object]=(fileType,metaData.getDisplayFieldsAsStr(object))  
                 else:                  else:
                     ret[object]=(fileType,'')                          display=""
                       print object,fileType,display
                       
                       ret[object]=(fileType,display)
                           
         self._v_fileSystem[realPath]=(stats[stat.ST_MTIME],ret) # speicher im chache          self._v_fileSystem[realPath]=(stats[stat.ST_MTIME],ret) # speicher im chache
                   
Line 257  class OSAS_storeOnline(SimpleItem): Line 352  class OSAS_storeOnline(SimpleItem):
         ret=[]          ret=[]
                   
         for handler in self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_HandlerObject__neu'],search_sub=1):          for handler in self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_HandlerObject__neu'],search_sub=1):
               
             if type in handler[1].objectTypes:              if type in handler[1].objectTypes:
         try:          try:
                  path=path.replace(getattr(handler[1],'ignorePath',''),'')                   path=path.replace(getattr(handler[1],'ignorePath',''),'')
Line 281  class OSAS_storeOnline(SimpleItem): Line 377  class OSAS_storeOnline(SimpleItem):
         objects=self.readObjectsFromPath(path)          objects=self.readObjectsFromPath(path)
         if not objects:          if not objects:
             objects={}              objects={}
   
   
         im=self.getSubDirsFromIndexMeta(path)          im=self.getSubDirsFromIndexMeta(path)
         for key in im.keys():          for key in im.keys():
             #virtuelle pfade hinzufuegen              #virtuelle pfade hinzufuegen
Line 297  class OSAS_storeOnline(SimpleItem): Line 395  class OSAS_storeOnline(SimpleItem):
         objectSorted=objects.keys()          objectSorted=objects.keys()
         objectSorted.sort(sortLow)          objectSorted.sort(sortLow)
         for object in objectSorted:          for object in objectSorted:
               
             handler=self.giveHandlers(object,objects[object][0])              handler=self.giveHandlers(object,objects[object][0])
               print "format",objects[object][0]
             if objects[object][0]=="OSAS_dir":              if objects[object][0]=="OSAS_dir":
                                   
                 string="""<a href="?path=%s">%s</a>"""%(object,os.path.split(object)[1])                  string="""<a href="?path=%s">%s</a>"""%(object,os.path.split(object)[1])
Line 346  class OSAS_storeOnline(SimpleItem): Line 446  class OSAS_storeOnline(SimpleItem):
             i=i-1              i=i-1
         return string          return string
   
     def getMetaFile(self,path):  
         """Lies Metafile ein  
         @param path: Pfad des index.met          
         @return: index.meta file  
         """  
         tmp=OSAS_helpers.getMetaFile(self,path)  
         #zLOG.LOG("EE",zLOG.INFO,type(tmp))  
           
         return tmp  
   
 InitializeClass(OSAS_storeOnline)  InitializeClass(OSAS_storeOnline)
           

Removed from v.1.7  
changed lines
  Added in v.1.15


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