Annotation of OSA_system2/OSAS_browser.py, revision 1.15
1.1 dwinter 1: """ Classes for displaying, browsing and organizing the archive
2: """
3:
4:
5: import OSAS_helpers
6: from AccessControl import ClassSecurityInfo
7: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8: from OFS.Folder import Folder
9: from OFS.SimpleItem import SimpleItem
10: from Globals import InitializeClass,package_home
11: import zLOG
1.15 ! dwinter 12: import base64
1.14 dwinter 13: import bz2
1.1 dwinter 14: import os
15: import os.path
16: import stat
1.2 dwinter 17: import xml.dom.minidom
1.3 dwinter 18: from types import *
1.8 dwinter 19: import xmlrpclib
1.10 dwinter 20: from OSAS_helpers import *
1.8 dwinter 21:
1.15 ! dwinter 22: def decodeRPC(string):
! 23: return bz2.decompress(base64.decodestring(string))
! 24:
1.1 dwinter 25:
26: class OSAS_storeOnline(SimpleItem):
27: """Webfrontend für das Storagesystem
28: liefert Browserumgebung
29: """
30: meta_type="OSAS_StoreOnline__neu"
31:
32: security=ClassSecurityInfo()
33:
34: _v_fileSystem={} #chache fuer filesystem
1.10 dwinter 35: _v_metaFiles={} #chache fuer indexMeta
1.15 ! dwinter 36:
! 37: def getParentType(self,path):
! 38: """getFileType des parentordners"""
! 39:
! 40: realPath=os.path.split(path)[0]
! 41:
! 42: objects=self.readObjectsFromPath(realPath)
! 43:
! 44: return objects[os.path.join(realPath,".")][0]
! 45:
1.10 dwinter 46: def getMetaFile(self,path):
47: """get index.meta and translate it to HTML"""
48: """Lies Metafile ein
49: @param path: Pfad des index.met
50: @return: index.meta file
51: """
52: html=[]
53: server=xmlrpclib.Server(self.serverUrl)
54:
55:
56: f=server.getFile(path+"/index.meta")
57:
58: if not f:
59:
60: return self.getMetaInfoFromIndexMeta(path)
61: #return "NO_METADATA"
62: else:
63:
64: dom = xml.dom.minidom.parseString(f)
65:
66: try:
67: name=getText(dom.getElementsByTagName("name")[0].childNodes)
68: except:
69: name="NOT_DEFINED!!!"
70: try:
71: creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
72: except:
73: creator="NOT_DEFINED!!!"
74:
75: try:
76: creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
77: except:
78: creation_date="NOT_DEFINED!!!"
79:
80: try:
81: description=getText(dom.getElementsByTagName("description")[0].childNodes)
82: except:
83: description="NOT_DEFINED!!!"
84:
85: try:
86: type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
87: except:
88: type=""
89: if type=="scanned document":
90: html="<h3>Document: "+name+"</h3>"
91: elif type=="folder":
92: html="<h3>Folder: "+name+"</h3>"
93: else:
94: html="<h3>Document: "+name+"</h3>"
95:
96: html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>"
97: html=html+"<h4>Description</h4><p>"+description+"</p>"
98: try:
99: bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
100: if bib.attributes.has_key('type'):
101: html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
102: else:
103: html=html+"<h4>Info</h4>"
104: html=html+getBib(bib.childNodes)
105:
106: except:
107: """none"""
1.8 dwinter 108:
1.10 dwinter 109: # html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace')
110:
111: return html
112:
113:
114: def getMetaInfoFromIndexMeta(self,path):
115: """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container)
116: @param path: Pfad auf das Object relativ zum rootFolderName
117: @return: metadata als html
118: """
1.15 ! dwinter 119: print "search for ",path
1.10 dwinter 120: xmlInfos=self.findEntryInIndexMeta(path)
1.15 ! dwinter 121: print "RRRRRRRRRRRR",xmlInfos
1.10 dwinter 122: if xmlInfos:
123: return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
124: else:
125: return ""
1.8 dwinter 126:
1.10 dwinter 127: def findEntryInIndexMeta(self,path):
128: """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.
129: @param path: Pfad auf das Object relativ zum rootFolderName
130: @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
131: """
132:
133: server=xmlrpclib.Server(self.serverUrl)
134: indexMeta=server.findIndexMeta(path) # suche index.meta
1.15 ! dwinter 135: print "found indexMeta",indexMeta
1.10 dwinter 136: if not indexMeta:
137: return None
138:
139: realPath=os.path.split(indexMeta)[0]
140: path=os.path.normpath(path)
141:
142: try:
143:
144: dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
145: except:
146: zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
1.15 ! dwinter 147: return None
! 148:
! 149: path=path.replace(realPath,'')
! 150: (searchPath,name)=os.path.split(path)
! 151: if (len(searchPath)>0) and (searchPath[0]=="/"):
! 152: if len(searchPath)<=1:
! 153: searchPath=""
! 154: else:
! 155: searchPath=searchPath[1:]
1.10 dwinter 156: #ist path ein directory?
1.15 ! dwinter 157: xpath="/resource/dir[name='%s' and path='%s']"%(name,searchPath)
! 158:
! 159: dirs=xml.xpath.Evaluate(xpath,dom)
1.10 dwinter 160:
1.15 ! dwinter 161: if len(dirs)>0:
! 162: return dirs[0].toxml
1.10 dwinter 163:
1.15 ! dwinter 164: #ist path ein file?
! 165: xpath="/resource/file[name='%s' and path='%s']"%(name,searchPath)
1.10 dwinter 166:
1.15 ! dwinter 167: dirs=xml.xpath.Evaluate(xpath,dom)
1.10 dwinter 168:
1.15 ! dwinter 169: if len(dirs)>0:
! 170: return dirs[0].toxml()
1.10 dwinter 171:
172: return None
173:
174:
175: def getSubDirsFromIndexMeta(self,path):
176:
177: """Gebe alle path untergeordenten Objekte aus
178: @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
179: @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.
180: @todo: Rueckgabe einer Beschreibung gemaess Metadaten
181: """
182: ret={}
183: server=xmlrpclib.Server(self.serverUrl)
184: indexMeta,stats=server.findIndexMetaWithStats(path)#findex index.meta zu path.
1.15 ! dwinter 185: print "checking",path,indexMeta
1.10 dwinter 186: if not indexMeta:
187: return ret
188:
189: realPath=os.path.split(indexMeta)[0]
190: path=path.replace(realPath,"")
191: if path and (path[0]==os.sep): #falls am Anfang os.sep steht lösche dieses.
192: path=path[1:]
193:
194:
195:
196: #teste ob schon im cache
197:
198: if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
199: return self._v_metaFiles[path][1]
200:
201: try:
202: dom=xml.dom.minidom.parseString(server.getFile(indexMeta))
203: except:
204: zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
205: return ret
206:
207: dirs=[]
208: dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
209:
210: for dir in dirs:
211: pathes=dir.getElementsByTagName('path')
212: if pathes:
213: pathX=OSAS_helpers.getText(pathes[0].childNodes)
214: else:
215: pathX=""
216: names=dir.getElementsByTagName('name')
217: if names:
218: name=OSAS_helpers.getText(names[0].childNodes)
219: else:
220: name=""
221:
222: #print "PP",pathX,path
223: if pathX==path:
224: if dir.tagName=="dir":
225: fileType="OSAS_dir_archive"
226: else:
227: fileType="OSAS_file_archive"
228:
229: object=os.path.join(realPath,pathX,name)
230: ret[object.encode('utf-8')]=(fileType,'')
231:
232: self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache
233:
234: return ret
235:
236:
1.1 dwinter 237:
1.8 dwinter 238: def __init__(self,id,serverUrl):
1.7 dwinter 239: """initialize a new instance
240: @param id: Zope id"""
1.1 dwinter 241: self.id = id
1.8 dwinter 242: self.serverUrl = serverUrl
1.1 dwinter 243:
244:
245: security.declareProtected('View','index_html')
246: def index_html(self):
1.2 dwinter 247: """main view either standard template zpt/storeOnline_index_html.zpt or storeOnline_index.html in tree"""
1.1 dwinter 248: if hasattr(self,'storeOnline_index.html'):
249: return getattr(self,'storeOnline_index.html')()
250: else:
251: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeOnline_index_html.zpt')).__of__(self)
252: return pt()
253:
254:
1.2 dwinter 255: def findIndexMeta(self,path=""):
1.7 dwinter 256: """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
257: @keyword path: default ist "", Pfad auf das Object relativ zum rootFolderName
1.2 dwinter 258: @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
259: """
260: realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
261: #suche index.meta
1.8 dwinter 262: server=xmlrpclib.Server(self.serverUrl)
263: return server.findIndexMeta(realPath)
1.7 dwinter 264:
1.2 dwinter 265:
1.8 dwinter 266:
1.7 dwinter 267: def readObjectsFromPath(self,path="",metaDataId=None):
1.1 dwinter 268: """Liest files aus dem path und speichert im cache _v_filesystem.
269:
1.7 dwinter 270: @keyword path : path relativ zum root folder des Storagesystems
271: @keyword metaDataId: Optional, id des OSAS_Metadata Object, dass benutzt werden soll, generisch wird das erste Object, dass in parent gefunden wird angezeigt.
1.2 dwinter 272: @return: directory der Form [pfad zum Objekt] -> (fileType,metadatum als String)
1.1 dwinter 273: """
1.8 dwinter 274: server=xmlrpclib.Server(self.serverUrl)
1.1 dwinter 275: realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
1.7 dwinter 276:
277: if metaDataId:
278: metaData=getattr(self,metaDataId)
279: if not (getattr(metaData,'meta_type','')=='OSAS_Metadata__neu'):
280: zLOG.LOG('OSAS_browser (readObjectsFromPath)',zLOG.ERROR,"%s is not OSAS_Metadata")
281: metaData=None
282: else:
283: metaDatas=self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_Metadata__neu'],search_sub=1)
284: if metaDatas:
285: metaData=metaDatas[0][1]
286: else:
287: zLOG.LOG('OSAS_browser (readObjectsFromPath)',zLOG.INFO,"There is no OSAS_Metadata Object")
288: metaData=None
289:
290: #print "md",metaData
1.1 dwinter 291: if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
292: return {}
293:
294:
1.8 dwinter 295:
296:
297: stats=server.getStat(realPath)
298:
299: if not stats:
1.2 dwinter 300: return None
301:
1.3 dwinter 302: #teste ob schon im cache
1.15 ! dwinter 303: #if self._v_fileSystem.has_key(realPath) and (self._v_fileSystem[realPath][0]==stats[stat.ST_MTIME]):
! 304: #
! 305: # return self._v_fileSystem[realPath][1]
! 306:
! 307: indexMetas=server.getAllIndexMetasOfSubDirs(realPath)
1.13 dwinter 308: dir=indexMetas.keys()
1.11 dwinter 309:
1.1 dwinter 310: ret={}
311: for filename in dir:
1.15 ! dwinter 312: print "doing",filename,indexMetas
1.1 dwinter 313: object=os.path.join(realPath,filename)
1.13 dwinter 314: fileType=indexMetas[filename][0]
1.15 ! dwinter 315:
1.1 dwinter 316: if fileType:
1.15 ! dwinter 317: if (fileType=='OSAS_dir') and indexMetas.has_key(".") and indexMetas["."][1]:
! 318: print "TEEEEEEEEEE"
! 319: if(OSAS_helpers.isImageFolder(object,decodeRPC(indexMetas["."][1]))):
1.13 dwinter 320: fileType='OSAS_imageFolder'
1.15 ! dwinter 321: elif(OSAS_helpers.isVideoFolder(object,decodeRPC(indexMetas["."][1]))):
! 322: fileType='OSAS_videoFolder'
! 323: if metaData and indexMetas[filename][1]:
! 324: print "do",filename
! 325: ret[object]=(fileType,metaData.getDisplayFieldsAsStr(decodeRPC(indexMetas[filename][1])))
1.7 dwinter 326: else:
1.15 ! dwinter 327: metaDataStr=self.findEntryInIndexMeta(object)
! 328: print "MMMMMDDDDD",metaDataStr
! 329: if metaDataStr:
! 330: display=metaData.getDisplayFieldsAsStr(metaDataStr)
! 331: dom=xml.dom.minidom.parseString(metaDataStr)
! 332:
! 333: if len(xml.xpath.Evaluate("/file/meta/video-file",dom))>0:
! 334: fileType='OSAS_videoFile'
! 335:
! 336: else:
! 337: display=""
! 338: print object,fileType,display
! 339:
! 340: ret[object]=(fileType,display)
1.1 dwinter 341:
342: self._v_fileSystem[realPath]=(stats[stat.ST_MTIME],ret) # speicher im chache
343:
344: return ret
345:
346: def giveHandlers(self,path,type):
1.7 dwinter 347: """teste ob fuer diesen Typ, handler definiert sind und gibt einen entsprechenden Link zurueck, der das Object mit diesem Handler ausfuehrt. Die Handler mussen im parent ordner des browser oder einem Subordner davon liegen.
1.2 dwinter 348: @param path: Pfad auf das Objekt
349: @param type: Typ des Objektes
350: @return: (string) html-Fragment, link der das Objekt mit diesem Handler anzeigt.
351: """
1.1 dwinter 352: ret=[]
353:
1.4 dwinter 354: for handler in self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_HandlerObject__neu'],search_sub=1):
1.15 ! dwinter 355:
1.4 dwinter 356: if type in handler[1].objectTypes:
1.6 dwinter 357: try:
358: path=path.replace(getattr(handler[1],'ignorePath',''),'')
359: except:
360: pass
1.4 dwinter 361: url=handler[1].prefix%path
362: text=handler[1].title
1.1 dwinter 363: string="""<a target="_blank" href="%s">%s</a>"""%(url,text)
364: ret.append(string)
365: return ret
366:
367:
368: def generateTree(self,path=""):
1.2 dwinter 369: """erzeuge liest die Objekte aus die im Pfad gespeichert sind
1.7 dwinter 370:
371: @keyword path: optional mit default='', Pfad relativ zu rootFolderName
1.2 dwinter 372: @return: List von Tripeln, (link_html,array of handlers,metainformationen) hierbei ist
1.7 dwinter 373: - (string) link_html ein html-Fragement, falls das Objekt vom Typ OSAS_dir ist, ist dies ein Link auf dieses Verzeichnis, sonst der Dateiname
374: - (string) handler sind die Ergebnisse von giveHandlers fuer dieses Objekt
375: - (string) metainformationen die Metainformationen zum Objekt als Ergebnis von readObjectsFromPath
1.2 dwinter 376: """
1.1 dwinter 377: objects=self.readObjectsFromPath(path)
1.2 dwinter 378: if not objects:
379: objects={}
1.9 dwinter 380:
1.10 dwinter 381:
382: im=self.getSubDirsFromIndexMeta(path)
1.2 dwinter 383: for key in im.keys():
384: #virtuelle pfade hinzufuegen
385:
386: if not objects.has_key(key):
387: objects[key]=im[key]
388:
389:
1.1 dwinter 390: def sortLow(x,y):
391: return cmp(x.lower(),y.lower())
392:
393: ret=[]
394:
395: objectSorted=objects.keys()
396: objectSorted.sort(sortLow)
397: for object in objectSorted:
1.15 ! dwinter 398:
1.1 dwinter 399: handler=self.giveHandlers(object,objects[object][0])
1.15 ! dwinter 400: print "format",objects[object][0]
1.1 dwinter 401: if objects[object][0]=="OSAS_dir":
402:
403: string="""<a href="?path=%s">%s</a>"""%(object,os.path.split(object)[1])
404:
405: ret.append((string,handler,objects[object][1]))
1.2 dwinter 406: elif objects[object][0]=="OSAS_dir_archive":
407: string="""<a href="?path=%s">%s (A)</a>"""%(object,os.path.split(object)[1])
408:
409: ret.append((string,handler,objects[object][1]))
1.1 dwinter 410: else:
411: ret.append((os.path.split(object)[1],handler,objects[object][1]))
412:
413:
414: return ret
415:
416:
417: def path_to_link(self,pathTmp=""):
1.7 dwinter 418: """generates navigation bar for viewfiles
419: @keyword pathTmp: optional, generisch="", pfad der erstellt werden soll
420: @return: html Fragment, pathTmp zerlegt, dass jeder Teil von Pfad unterhalb von rootFolderName direkt angesprunden werden kann.
421: """
1.1 dwinter 422:
423: path=os.path.normpath(os.path.join(self.rootFolderName,pathTmp))
424:
425: URL=self.absolute_url()
426: string=""
427:
428: tmppath=os.path.dirname(path)
429: i=0
430: pathes=[[path, os.path.basename(path)]]
431:
432: while not (len(tmppath)==1):
433:
434: i=i+1
435: if i>20: break
436:
437: pathes.append([tmppath, os.path.basename(tmppath)])
438: tmppath=os.path.dirname(tmppath)
439:
440: while i>=0:
441: if pathes[i][0].find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
442: string=string+"<a>"+pathes[i][1]+"</a>/"
443: else:
444: string=string+"<a href="+URL+"?path="+pathes[i][0]+">"+pathes[i][1]+"</a>/"
445:
446: i=i-1
447: return string
448:
449:
450: InitializeClass(OSAS_storeOnline)
451:
452: def manage_addOSAS_storeOnlineForm(self):
1.7 dwinter 453: """interface for adding the OSAS_storeOnline"""
1.1 dwinter 454: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnline.zpt')).__of__(self)
455: return pt()
456:
457: def manage_addOSAS_storeOnline(self,id,RESPONSE=None):
1.7 dwinter 458: """add the OSAS_storeOnline
459: @param id: id
460: """
1.1 dwinter 461: newObj=OSAS_storeOnline(id)
462: self._setObject(id,newObj)
463: if RESPONSE is not None:
464: RESPONSE.redirect('manage_main')
465:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>