--- OSA_system2/OSAS_browser.py 2005/02/11 16:27:01 1.10
+++ OSA_system2/OSAS_browser.py 2005/03/17 19:26:51 1.17
@@ -9,6 +9,8 @@ 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
@@ -17,6 +19,9 @@ 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
@@ -28,6 +33,34 @@ class OSAS_storeOnline(SimpleItem):
_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
@@ -101,7 +134,9 @@ class OSAS_storeOnline(SimpleItem):
@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:
@@ -115,7 +150,7 @@ class OSAS_storeOnline(SimpleItem):
server=xmlrpclib.Server(self.serverUrl)
indexMeta=server.findIndexMeta(path) # suche index.meta
-
+
if not indexMeta:
return None
@@ -127,44 +162,30 @@ class OSAS_storeOnline(SimpleItem):
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
@@ -177,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.
@@ -190,10 +212,11 @@ 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.parseString(server.getFile(indexMeta))
@@ -226,7 +249,7 @@ class OSAS_storeOnline(SimpleItem):
object=os.path.join(realPath,pathX,name)
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
@@ -261,9 +284,6 @@ class OSAS_storeOnline(SimpleItem):
-
-
-
def readObjectsFromPath(self,path="",metaDataId=None):
"""Liest files aus dem path und speichert im cache _v_filesystem.
@@ -302,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
@@ -330,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',''),'')
@@ -351,18 +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={}
+
+ objects=self.getSubDirsFromIndexMeta(path)
+
+ print "obje",objects
+
+ im=self.readObjectsFromPath(path)
+ if not im:
+ im={}
- im=self.getSubDirsFromIndexMeta(path)
+
+
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):
return cmp(x.lower(),y.lower())
@@ -372,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