Diff for /OSA_system2/OSAS_browser.py between versions 1.9 and 1.23

version 1.9, 2005/02/10 20:23:24 version 1.23, 2010/02/15 19:09:10
Line 8  from Products.PageTemplates.PageTemplate Line 8  from Products.PageTemplates.PageTemplate
 from OFS.Folder import Folder  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 logging
   
   #ersetzt logging
   def logger(txt,method,txt2):
       """logging"""
       logging.info(txt+ txt2)
   
   
   import base64
   import bz2
 import os  import os
 import os.path  import os.path
 import stat  import stat
   import Ft.Xml.XPath
 import xml.dom.minidom  import xml.dom.minidom
 from types import *  from types import *
 import xmlrpclib  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 fuer das Storagesystem
     liefert Browserumgebung       liefert Browserumgebung 
     """      """
     meta_type="OSAS_StoreOnline__neu"      meta_type="OSAS_StoreOnline__neu"
Line 27  class OSAS_storeOnline(SimpleItem): Line 41  class OSAS_storeOnline(SimpleItem):
     security=ClassSecurityInfo()      security=ClassSecurityInfo()
   
     _v_fileSystem={} #chache fuer filesystem      _v_fileSystem={} #chache fuer filesystem
       _v_metaFiles={} #chache fuer indexMeta
   
       def getParentType(self,path):
           """getFileType des parentordners"""
   
           realPath=os.path.split(path)[0]
   
           objects=self.readObjectsFromPath(realPath)
   
           try:
               return objects[os.path.join(realPath,".")][0]
           except:
               return ""
       def getHandlersOfPath(self):
           """handler des actullen path"""
           path=self.REQUEST['path']
           objects=self.readObjectsFromPath(path)
           
           typeObject=objects.get(os.path.join(path,"."),None)
           if not typeObject:
               return("",[],"")
           type=typeObject[0]
   
           handler=self.giveHandlers(path,type)
   
           
           return (os.path.split(path)[1],handler,objects[os.path.join(path,".")][1],type)
   
                  
       def getMetaFile(self,path):
           """get index.meta and translate it to 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:
                     
              dom = xml.dom.minidom.parseString(f)
              
              try:
                  name=getText(dom.getElementsByTagName("name")[0].childNodes)
              except:
                  name="NOT_DEFINED!!!"
              try:
                  creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
              except:
                  creator="NOT_DEFINED!!!"
   
              try:
                  creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
              except:
                  creation_date="NOT_DEFINED!!!"
   
              try:
                  description=getText(dom.getElementsByTagName("description")[0].childNodes)
              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:
                       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
           """
   
           xmlInfos=self.findEntryInIndexMeta(path)
   
           if xmlInfos:
               return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
           else:
               return ""
      
       def findEntryInIndexMeta(self,path):
           """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.
           @param path: Pfad auf das Object relativ zum rootFolderName
           @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
           """
           
           server=xmlrpclib.Server(self.serverUrl)
           indexMeta=server.findIndexMeta(path) # suche index.meta
   
           if not indexMeta:
               return None
   
           realPath=os.path.split(indexMeta)[0]
           path=os.path.normpath(path)
   
           try:
               dom = NonvalidatingReader.parseString(server.getFile(indexMeta),"http://www.mpiwg-berlin.mpg.de/")
              
           except:
               logger("OSAS_browser (findEntryInIndexMeta)",logging.ERROR,"Cannot parse: %s"%indexMeta)
               return None
          
           path=path.replace(realPath,'')
           (searchPath,name)=os.path.split(path)
           if (len(searchPath)>0) and (searchPath[0]=="/"):
               if len(searchPath)<=1:
                   searchPath=""
               else:
                   searchPath=searchPath[1:]
           #ist path ein directory? 
           xpath="/resource/dir[name='%s' and path='%s']"%(name,searchPath)
           dirs=Ft.Xml.XPath.Evaluate(xpath,contextNode=dom)
   
   
           if len(dirs)>0:
               return dirs[0].toxml
   
           #ist path ein file?      
           xpath="/resource/file[name='%s' and path='%s']"%(name,searchPath)
   
   
           dirs=Ft.Xml.XPath.Evaluate(xpath,contextNode=dom)
           if len(dirs)>0:
               return dirs[0].toxml()
           
           return None
   
   
       def getSubDirsFromIndexMeta(self,path):
           
           """Gebe alle path untergeordenten Objekte aus
           @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
           @return: Directory [pfad auf das Objekt]->(fileType,''), fileType ist hierbei OSAS_dir_archive falls Object ein directory und OSAS_file_archive falls das Object ein File ist,der zweite Eintrag des Tupels ist zur Zeit immer '', spaeter wird hier die Beschreibung gemaess Metadaten stehen, wie bei readObjectsFromPath.
           @todo: Rueckgabe einer Beschreibung gemaess Metadaten
           """
           ret={}
           startPath=path
           server=xmlrpclib.Server(self.serverUrl)
           indexMeta,stats=server.findIndexMetaWithStats(path)#findex index.meta zu path.
   
           if not indexMeta:
               return ret
   
           realPath=os.path.split(indexMeta)[0]
           path=path.replace(realPath,"")
           if path and (path[0]==os.sep): #falls am Anfang os.sep steht loesche dieses.
               path=path[1:]
   
   
   
           #teste ob schon im cache zur Zeit kein chache wenn index.meta file nicht im selben ordner wie path.
   
           #if self._v_metaFiles.has_key(startPath) and (self._v_metaFiles[realPath][0]==stats[stat.ST_MTIME]) and (path==""):
           #
           #    return self._v_metaFiles[startPath][1]
   
           try:
               dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
           except:
               logger("OSAS_browser (getSubDirsFromIndexMeta)",logging.ERROR,"Cannot parse: %s"%indexMeta)
               return ret
   
           dirs=[]
           dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
       
           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=""
   
               #print "PP",pathX,path
               if pathX==path:
                   if dir.tagName=="dir":
                       fileType="OSAS_dir_archive"
                   else:
                       fileType="OSAS_file_archive"
   
                   object=os.path.join(realPath,pathX,name)
                   ret[object.encode('utf-8')]=(fileType,'')
   
           self._v_metaFiles[startPath]=(stats[stat.ST_MTIME],ret) # speicher im chache
         
           return ret
   
         
           
Line 59  class OSAS_storeOnline(SimpleItem): Line 293  class OSAS_storeOnline(SimpleItem):
                   
   
       
   
      
   
     def readObjectsFromPath(self,path="",metaDataId=None):      def readObjectsFromPath(self,path="",metaDataId=None):
         """Liest files aus dem path und speichert im cache _v_filesystem.          """Liest files aus dem path und speichert im cache _v_filesystem.
   
Line 75  class OSAS_storeOnline(SimpleItem): Line 306  class OSAS_storeOnline(SimpleItem):
         if metaDataId:          if metaDataId:
             metaData=getattr(self,metaDataId)              metaData=getattr(self,metaDataId)
             if not (getattr(metaData,'meta_type','')=='OSAS_Metadata__neu'):              if not (getattr(metaData,'meta_type','')=='OSAS_Metadata__neu'):
                 zLOG.LOG('OSAS_browser (readObjectsFromPath)',zLOG.ERROR,"%s is not OSAS_Metadata")                  logger('OSAS_browser (readObjectsFromPath)',logging.ERROR,"%s is not OSAS_Metadata")
                 metaData=None                  metaData=None
         else:          else:
             metaDatas=self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_Metadata__neu'],search_sub=1)              metaDatas=self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_Metadata__neu'],search_sub=1)
             if metaDatas:              if metaDatas:
                 metaData=metaDatas[0][1]                  metaData=metaDatas[0][1]
             else:              else:
                 zLOG.LOG('OSAS_browser (readObjectsFromPath)',zLOG.INFO,"There is no OSAS_Metadata Object")                  logger('OSAS_browser (readObjectsFromPath)',logging.INFO,"There is no OSAS_Metadata Object")
                 metaData=None                  metaData=None
                                   
         #print "md",metaData          #print "md",metaData
Line 98  class OSAS_storeOnline(SimpleItem): Line 329  class OSAS_storeOnline(SimpleItem):
             return None              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=server.listdir(realPath)  
         ret={}          ret={}
         for filename in dir:          for filename in dir:
   
             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]:
                                     
                     ret[object]=(fileType,metaData.getDisplayFieldsAsStr(object))                      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]:
   
                       ret[object]=(fileType,metaData.getDisplayFieldsAsStr(decodeRPC(indexMetas[filename][1])))
                 else:                  else:
                     ret[object]=(fileType,'')                      metaDataStr=self.findEntryInIndexMeta(object)
   
                       if metaDataStr:
                           display=metaData.getDisplayFieldsAsStr(metaDataStr)
   
                           dom = NonvalidatingReader.parseString(metaDataStr,"http://www.mpiwg-berlin.mpg.de/")
                           if len(Ft.Xml.XPath.Evaluate("/file/meta/video-file",contextNode=dom))>0:
                               fileType='OSAS_videoFile'
                               
                       else:
                           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 128  class OSAS_storeOnline(SimpleItem): Line 381  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 149  class OSAS_storeOnline(SimpleItem): Line 403  class OSAS_storeOnline(SimpleItem):
          - (string) handler sind die Ergebnisse von giveHandlers fuer dieses Objekt           - (string) handler sind die Ergebnisse von giveHandlers fuer dieses Objekt
          - (string) metainformationen die Metainformationen zum Objekt als Ergebnis von readObjectsFromPath           - (string) metainformationen die Metainformationen zum Objekt als Ergebnis von readObjectsFromPath
         """          """
         objects=self.readObjectsFromPath(path)  
         if not objects:  
             objects={}  
   
         server=xmlrpclib.Server(self.serverUrl)          objects=self.getSubDirsFromIndexMeta(path)
         im=server.getSubDirsFromIndexMeta(path)  
           
           
           im=self.readObjectsFromPath(path)
           if not im:
               im={}
   
   
   
           
         for key in im.keys():          for key in im.keys():
             #virtuelle pfade hinzufuegen              #relle  pfade hinzufuegen, virtueller wird ueberschrieben
                           
             if not objects.has_key(key):  
                 objects[key]=im[key]                  objects[key]=im[key]
                                   
                   
           
         def sortLow(x,y):          def sortLow(x,y):
             return cmp(x.lower(),y.lower())              return cmp(x.lower(),y.lower())
                   
Line 170  class OSAS_storeOnline(SimpleItem): Line 430  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])
             if objects[object][0]=="OSAS_dir":              if not(os.path.split(object)[1]=="."):
                   if objects[object][0] in OSASDirObjects:
                                   
                 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 181  class OSAS_storeOnline(SimpleItem): Line 443  class OSAS_storeOnline(SimpleItem):
                                   
                 ret.append((string,handler,objects[object][1]))                  ret.append((string,handler,objects[object][1]))
             else:              else:
   
                 ret.append((os.path.split(object)[1],handler,objects[object][1]))                  ret.append((os.path.split(object)[1],handler,objects[object][1]))
   
                                             
Line 190  class OSAS_storeOnline(SimpleItem): Line 453  class OSAS_storeOnline(SimpleItem):
     def path_to_link(self,pathTmp=""):      def path_to_link(self,pathTmp=""):
         """generates navigation bar for viewfiles          """generates navigation bar for viewfiles
         @keyword pathTmp: optional, generisch="", pfad der erstellt werden soll          @keyword pathTmp: optional, generisch="", pfad der erstellt werden soll
         @return: html Fragment, pathTmp zerlegt, dass jeder Teil von Pfad unterhalb von rootFolderName direkt angesprunden werden kann.          @return: html Fragment, pathTmp zerlegt, dass jeder Teil von Pfad unterhalb von rootFolderName direkt angesprungen werden kann.
         """          """
   
         path=os.path.normpath(os.path.join(self.rootFolderName,pathTmp))          path=os.path.normpath(os.path.join(self.rootFolderName,pathTmp))
Line 219  class OSAS_storeOnline(SimpleItem): Line 482  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  
         """  
         server=xmlrpclib.Server(self.serverUrl)  
         tmp=server.getMetaFile(path)  
         #zLOG.LOG("EE",zLOG.INFO,type(tmp))  
           
         return tmp  
   
 InitializeClass(OSAS_storeOnline)  InitializeClass(OSAS_storeOnline)
           

Removed from v.1.9  
changed lines
  Added in v.1.23


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