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