--- OSA_system2/OSAS_browser.py 2005/02/10 19:50:18 1.8
+++ OSA_system2/OSAS_browser.py 2005/04/06 09:18:41 1.18
@@ -9,13 +9,18 @@ from OFS.Folder import Folder
from OFS.SimpleItem import SimpleItem
from Globals import InitializeClass,package_home
import zLOG
+import base64
+import bz2
import os
import os.path
import stat
import xml.dom.minidom
from types import *
import xmlrpclib
+from OSAS_helpers import *
+def decodeRPC(string):
+ return bz2.decompress(base64.decodestring(string))
class OSAS_storeOnline(SimpleItem):
@@ -29,37 +34,161 @@ class OSAS_storeOnline(SimpleItem):
_v_fileSystem={} #chache fuer filesystem
_v_metaFiles={} #chache fuer indexMeta
-
-
- def __init__(self,id,serverUrl):
- """initialize a new instance
- @param id: Zope id"""
- self.id = id
- self.serverUrl = serverUrl
-
+ def getParentType(self,path):
+ """getFileType des parentordners"""
- 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')()
+ 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:
- pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeOnline_index_html.zpt')).__of__(self)
- return pt()
+
+ 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="
Document: "+name+"
"
+ elif type=="folder":
+ html="Folder: "+name+"
"
+ else:
+ html="Document: "+name+"
"
+
+ html=html+"created by: "+creator+" at: "+creation_date+"
"
+ html=html+"Description
"+description+"
"
+ try:
+ bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
+ if bib.attributes.has_key('type'):
+ html=html+"Info ("+bib.attributes['type'].value+")
"
+ else:
+ html=html+"Info
"
+ html=html+getBib(bib.childNodes)
+ except:
+ """none"""
- 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
+ # 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
"""
- realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
- #suche index.meta
+
+ 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)
- return server.findIndexMeta(realPath)
+ 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=xml.dom.minidom.parseString(server.getFile(indexMeta))
+ except:
+ zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.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=xml.xpath.Evaluate(xpath,dom)
+
+ if len(dirs)>0:
+ return dirs[0].toxml
+
+ #ist path ein file?
+ xpath="/resource/file[name='%s' and path='%s']"%(name,searchPath)
+
+ dirs=xml.xpath.Evaluate(xpath,dom)
+
+ if len(dirs)>0:
+ return dirs[0].toxml()
+ return None
-
def getSubDirsFromIndexMeta(self,path):
@@ -69,6 +198,7 @@ class OSAS_storeOnline(SimpleItem):
@todo: Rueckgabe einer Beschreibung gemaess Metadaten
"""
ret={}
+ startPath=path
server=xmlrpclib.Server(self.serverUrl)
indexMeta,stats=server.findIndexMetaWithStats(path)#findex index.meta zu path.
@@ -82,16 +212,17 @@ class OSAS_storeOnline(SimpleItem):
- #teste ob schon im cache
-
- if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
- return self._v_metaFiles[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.parse(indexMeta)
+ dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
except:
zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
-
+ return ret
dirs=[]
dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
@@ -116,14 +247,43 @@ class OSAS_storeOnline(SimpleItem):
fileType="OSAS_file_archive"
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[startPath]=(stats[stat.ST_MTIME],ret) # speicher im chache
+
return ret
-
+
+ def __init__(self,id,serverUrl):
+ """initialize a new instance
+ @param id: Zope id"""
+ self.id = id
+ self.serverUrl = serverUrl
+
+
+ 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:
+ 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):
"""Liest files aus dem path und speichert im cache _v_filesystem.
@@ -162,20 +322,42 @@ class OSAS_storeOnline(SimpleItem):
#teste ob schon im cache
if self._v_fileSystem.has_key(realPath) and (self._v_fileSystem[realPath][0]==stats[stat.ST_MTIME]):
- return self._v_fileSystem[realPath][1]
-
- dir=server.listdir(realPath)
+ return self._v_fileSystem[realPath][1]
+
+ indexMetas=server.getAllIndexMetasOfSubDirs(realPath)
+ dir=indexMetas.keys()
+
ret={}
for filename in dir:
+
object=os.path.join(realPath,filename)
- fileType=OSAS_helpers.checkOSASFileType(object)
+ fileType=indexMetas[filename][0]
if fileType:
- if metaData:
-
- ret[object]=(fileType,metaData.getDisplayFieldsAsStr(object))
+ if (fileType=='OSAS_dir') and indexMetas.has_key(".") and indexMetas["."][1]:
+
+ 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:
- ret[object]=(fileType,'')
+ metaDataStr=self.findEntryInIndexMeta(object)
+
+ 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'
+
+ else:
+ display=""
+
+
+ ret[object]=(fileType,display)
self._v_fileSystem[realPath]=(stats[stat.ST_MTIME],ret) # speicher im chache
@@ -190,6 +372,7 @@ class OSAS_storeOnline(SimpleItem):
ret=[]
for handler in self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_HandlerObject__neu'],search_sub=1):
+
if type in handler[1].objectTypes:
try:
path=path.replace(getattr(handler[1],'ignorePath',''),'')
@@ -211,16 +394,24 @@ class OSAS_storeOnline(SimpleItem):
- (string) handler sind die Ergebnisse von giveHandlers fuer dieses Objekt
- (string) metainformationen die Metainformationen zum Objekt als Ergebnis von readObjectsFromPath
"""
- objects=self.readObjectsFromPath(path)
- if not objects:
- objects={}
- im=self.getSubDirsFromIndexMeta(path)
+
+ objects=self.getSubDirsFromIndexMeta(path)
+
+
+
+ im=self.readObjectsFromPath(path)
+ if not im:
+ im={}
+
+
+
+
for key in im.keys():
- #virtuelle pfade hinzufuegen
+ #relle pfade hinzufuegen, virtueller wird ueberschrieben
+
+ objects[key]=im[key]
- if not objects.has_key(key):
- objects[key]=im[key]
-
+
def sortLow(x,y):
return cmp(x.lower(),y.lower())
@@ -230,18 +421,21 @@ class OSAS_storeOnline(SimpleItem):
objectSorted=objects.keys()
objectSorted.sort(sortLow)
for object in objectSorted:
+
handler=self.giveHandlers(object,objects[object][0])
- if objects[object][0]=="OSAS_dir":
-
- string="""%s"""%(object,os.path.split(object)[1])
-
- ret.append((string,handler,objects[object][1]))
- elif objects[object][0]=="OSAS_dir_archive":
- string="""%s (A)"""%(object,os.path.split(object)[1])
-
- ret.append((string,handler,objects[object][1]))
- else:
- ret.append((os.path.split(object)[1],handler,objects[object][1]))
+ if not(os.path.split(object)[1]=="."):
+ if objects[object][0] in OSASDirObjects:
+
+ string="""%s"""%(object,os.path.split(object)[1])
+
+ ret.append((string,handler,objects[object][1]))
+ elif objects[object][0]=="OSAS_dir_archive":
+ string="""%s (A)"""%(object,os.path.split(object)[1])
+
+ ret.append((string,handler,objects[object][1]))
+ else:
+
+ ret.append((os.path.split(object)[1],handler,objects[object][1]))
return ret
@@ -250,7 +444,7 @@ class OSAS_storeOnline(SimpleItem):
def path_to_link(self,pathTmp=""):
"""generates navigation bar for viewfiles
@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))
@@ -279,16 +473,6 @@ class OSAS_storeOnline(SimpleItem):
i=i-1
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)