--- OSA_system2/OSAS_browser.py 2005/01/21 14:03:24 1.7
+++ OSA_system2/OSAS_browser.py 2005/10/10 18:11:11 1.19
@@ -9,11 +9,19 @@ 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):
"""Webfrontend für das Storagesystem
@@ -25,101 +33,163 @@ class OSAS_storeOnline(SimpleItem):
_v_fileSystem={} #chache fuer filesystem
_v_metaFiles={} #chache fuer indexMeta
-
- def __init__(self,id):
- """initialize a new instance
- @param id: Zope id"""
- self.id = id
-
+ 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')()
- else:
- pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeOnline_index_html.zpt')).__of__(self)
- return pt()
+ realPath=os.path.split(path)[0]
+ objects=self.readObjectsFromPath(realPath)
- 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
+ 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
"""
- realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
- #suche index.meta
- while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):
- realPath=os.path.split(realPath)[0]
-
- if realPath=='' or realPath=='/':
- if os.path.exists(os.path.join(realPath,'index.meta')):
- return os.path.join(realPath,'index.meta')
- else:
- return None
+ html=[]
+ server=xmlrpclib.Server(self.serverUrl)
+
+
+ f=server.getFile(path+"/index.meta")
+
+ if not f:
+
+ return self.getMetaInfoFromIndexMeta(path)
+ #return "NO_METADATA"
else:
- return os.path.join(realPath,'index.meta')
+
+ 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"""
+ # 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.
"""
-
- indexMeta=self.findIndexMeta(path) # suche index.meta
+ 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(os.path.join(self.rootFolderName,path))
+ path=os.path.normpath(path)
try:
- dom=xml.dom.minidom.parse(indexMeta)
+
+ dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
except:
zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
- #ist path ein directory?
- dirs=dom.getElementsByTagName('dir')
- 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)
+ 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:
- 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))
- if checkpath==path:
-
- return dir.toxml()
+ dirs=xml.xpath.Evaluate(xpath,dom)
- #ist path ein file?
- files=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=""
+ if len(dirs)>0:
+ return dirs[0].toxml
- checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
- if checkpath==path:
-
- return dir.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):
"""Gebe alle path untergeordenten Objekte aus
@@ -128,7 +198,9 @@ class OSAS_storeOnline(SimpleItem):
@todo: Rueckgabe einer Beschreibung gemaess Metadaten
"""
ret={}
- indexMeta=self.findIndexMeta(path)#findex index.meta zu path.
+ startPath=path
+ server=xmlrpclib.Server(self.serverUrl)
+ indexMeta,stats=server.findIndexMetaWithStats(path)#findex index.meta zu path.
if not indexMeta:
return ret
@@ -140,16 +212,17 @@ class OSAS_storeOnline(SimpleItem):
- #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]):
- 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')
@@ -174,24 +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 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)
+
+ 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:
- 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):
"""Liest files aus dem path und speichert im cache _v_filesystem.
@@ -199,7 +291,7 @@ 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.
@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))
if metaDataId:
@@ -220,29 +312,52 @@ class OSAS_storeOnline(SimpleItem):
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
if self._v_fileSystem.has_key(realPath) and (self._v_fileSystem[realPath][0]==stats[stat.ST_MTIME]):
- return self._v_fileSystem[realPath][1]
-
- dir=os.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
@@ -257,11 +372,12 @@ 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:
+ try:
path=path.replace(getattr(handler[1],'ignorePath',''),'')
except:
- pass
+ pass
url=handler[1].prefix%path
text=handler[1].title
string="""%s"""%(url,text)
@@ -278,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())
@@ -297,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
@@ -317,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))
@@ -346,18 +473,9 @@ 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
- """
- tmp=OSAS_helpers.getMetaFile(self,path)
- #zLOG.LOG("EE",zLOG.INFO,type(tmp))
-
- return tmp
InitializeClass(OSAS_storeOnline)
-
+
def manage_addOSAS_storeOnlineForm(self):
"""interface for adding the OSAS_storeOnline"""
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnline.zpt')).__of__(self)