Annotation of OSA_system2/OSAS_browser.py, revision 1.6
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
12: import os
13: import os.path
14: import stat
1.2 dwinter 15: import xml.dom.minidom
1.3 dwinter 16: from types import *
1.1 dwinter 17:
18: class OSAS_storeOnline(SimpleItem):
19: """Webfrontend für das Storagesystem
20: liefert Browserumgebung
21: """
22: meta_type="OSAS_StoreOnline__neu"
23:
24: security=ClassSecurityInfo()
25:
26: _v_fileSystem={} #chache fuer filesystem
1.3 dwinter 27: _v_metaFiles={} #chache fuer indexMeta
1.1 dwinter 28:
29: def __init__(self,id):
30: """initialize a new instance"""
31: self.id = id
32:
33:
34:
35: security.declareProtected('View','index_html')
36: def index_html(self):
1.2 dwinter 37: """main view either standard template zpt/storeOnline_index_html.zpt or storeOnline_index.html in tree"""
1.1 dwinter 38: if hasattr(self,'storeOnline_index.html'):
39: return getattr(self,'storeOnline_index.html')()
40: else:
41: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','storeOnline_index_html.zpt')).__of__(self)
42: return pt()
43:
44:
1.2 dwinter 45: def findIndexMeta(self,path=""):
46: """finde index_meta fuer diesen eventuell virtuellen Pfad
47: @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
48: @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
49: """
50: realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
51: #suche index.meta
52: while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):
53: realPath=os.path.split(realPath)[0]
54: if realPath=='' or realPath=='/':
55: return None
56: else:
57: return os.path.join(realPath,'index.meta')
58:
59: def findEntryInIndexMeta(self,path):
60: """fragm xml zum path
61: @param path: Pfad auf das Object relativ zum rootFolderName
1.3 dwinter 62: @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
1.2 dwinter 63: """
64:
65: indexMeta=self.findIndexMeta(path)
1.3 dwinter 66: if not indexMeta:
67: return None
1.2 dwinter 68: realPath=os.path.split(indexMeta)[0]
69: path=os.path.normpath(os.path.join(self.rootFolderName,path))
70:
71: dom=xml.dom.minidom.parse(indexMeta)
72:
73: #ist path ein directory?
74: dirs=dom.getElementsByTagName('dir')
75: for dir in dirs:
76: pathes=dir.getElementsByTagName('path')
77: if pathes:
78: pathX=OSAS_helpers.getText(pathes[0].childNodes)
79: else:
80: pathX=""
81: names=dir.getElementsByTagName('name')
82: if names:
83: name=OSAS_helpers.getText(names[0].childNodes)
84: else:
85: name=""
86:
87: checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
88: if checkpath==path:
89:
90: return dir.toxml()
91:
92: #ist path ein file?
93: files=dom.getElementsByTagName('file')
94: for dir in dirs:
95: pathes=dir.getElementsByTagName('path')
96: if pathes:
97: pathX=OSAS_helpers.getText(pathes[0].childNodes)
98: else:
99: pathX=""
100: names=dir.getElementsByTagName('name')
101: if names:
102: name=OSAS_helpers.getText(names[0].childNodes)
103: else:
104: name=""
105:
106: checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
107: if checkpath==path:
108:
109: return dir.toxml()
110:
111:
112: return None
113:
114: def getSubDirsFromIndexMeta(self,path):
115:
116: """Gebe alle path untergeordenten Objekte aus
117: @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
118: @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.
119: """
120: ret={}
121: indexMeta=self.findIndexMeta(path)
122: if not indexMeta:
123: return ret
124: realPath=os.path.split(indexMeta)[0]
125: path=path.replace(realPath,"")
126: if path and (path[0]==os.sep):
127: path=path[1:]
128:
1.3 dwinter 129: stats=os.stat(indexMeta)
130:
131: #teste ob schon im cache
1.5 dwinter 132: if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
133: #print "cache",path
134: return self._v_metaFiles[path][1]
1.3 dwinter 135:
1.2 dwinter 136: dom=xml.dom.minidom.parse(indexMeta)
137:
138: dirs=[]
139: dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
140:
141: for dir in dirs:
142: pathes=dir.getElementsByTagName('path')
143: if pathes:
144: pathX=OSAS_helpers.getText(pathes[0].childNodes)
145: else:
146: pathX=""
147: names=dir.getElementsByTagName('name')
148: if names:
149: name=OSAS_helpers.getText(names[0].childNodes)
150: else:
151: name=""
152:
1.5 dwinter 153: #print "PP",pathX,path
1.2 dwinter 154: if pathX==path:
155: if dir.tagName=="dir":
156: fileType="OSAS_dir_archive"
157: else:
158: fileType="OSAS_file_archive"
159:
160: object=os.path.join(realPath,pathX,name)
161: ret[object]=(fileType,'')
162:
1.5 dwinter 163: self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache
1.2 dwinter 164: return ret
165:
166:
167: def getMetaInfoFromIndexMeta(self,path):
168: """metadaten zu path als html aus dem index.meta file zu path
169: @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
170: @return: metadata als html
171: """
172: xmlInfos=self.findEntryInIndexMeta(path)
1.3 dwinter 173: if xmlInfos:
174: return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
175: else:
176: return ""
1.1 dwinter 177:
178:
179: def readObjectsFromPath(self,path=""):
180: """Liest files aus dem path und speichert im cache _v_filesystem.
181:
182: @param path : path relativ zum root folder des Storagesystems
1.2 dwinter 183: @return: directory der Form [pfad zum Objekt] -> (fileType,metadatum als String)
1.1 dwinter 184: """
185:
186: realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
187: metaData=self.testmd #test
188:
189: if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
190: return {}
191:
192:
193: if not os.path.exists(realPath):
1.2 dwinter 194: #return None,"(ERROR) path %s does not exist."%path
195: return None
196:
1.1 dwinter 197: stats=os.stat(realPath)
198:
1.3 dwinter 199: #teste ob schon im cache
200: if self._v_fileSystem.has_key(realPath) and (self._v_fileSystem[realPath][0]==stats[stat.ST_MTIME]):
1.1 dwinter 201:
1.3 dwinter 202: return self._v_fileSystem[realPath][1]
1.1 dwinter 203:
204: dir=os.listdir(realPath)
205: ret={}
206: for filename in dir:
207: object=os.path.join(realPath,filename)
208: fileType=OSAS_helpers.checkOSASFileType(object)
209:
210: if fileType:
1.2 dwinter 211:
1.1 dwinter 212: ret[object]=(fileType,metaData.getDisplayFieldsAsStr(object))
213:
214: self._v_fileSystem[realPath]=(stats[stat.ST_MTIME],ret) # speicher im chache
215:
216: return ret
217:
218: def giveHandlers(self,path,type):
1.4 dwinter 219: """teste ob fuer diesen Typ, handler definiert sind und gibt einen entsprechenden Link zurueck, der das Object mit diesem Handler ausfuehrt.
1.2 dwinter 220: @param path: Pfad auf das Objekt
221: @param type: Typ des Objektes
222: @return: (string) html-Fragment, link der das Objekt mit diesem Handler anzeigt.
223: """
1.1 dwinter 224: ret=[]
225:
1.4 dwinter 226: for handler in self.ZopeFind(self.aq_parent,obj_metatypes=['OSAS_HandlerObject__neu'],search_sub=1):
227: if type in handler[1].objectTypes:
1.6 ! dwinter 228: try:
! 229: path=path.replace(getattr(handler[1],'ignorePath',''),'')
! 230: except:
! 231: pass
1.4 dwinter 232: url=handler[1].prefix%path
233: text=handler[1].title
1.1 dwinter 234: string="""<a target="_blank" href="%s">%s</a>"""%(url,text)
235: ret.append(string)
236: return ret
237:
238:
239: def generateTree(self,path=""):
1.2 dwinter 240: """erzeuge liest die Objekte aus die im Pfad gespeichert sind
241: @param path: optional mit default='', Pfad relativ zu rootFolderName
242: @return: List von Tripeln, (link_html,array of handlers,metainformationen) hierbei ist
243: - (string) link_html ein html-Fragement, falls das Objekt vom Typ OSAS_dir ist, ist dies ein Link auf dieses Verzeichnis, sonst der Dateiname
244: - (string) handler sind die Ergebnisse von giveHandlers fuer dieses Objekt
245: - (string) metainformationen die Metainformationen zum Objekt als Ergebnis von readObjectsFromPath
246: """
1.1 dwinter 247: objects=self.readObjectsFromPath(path)
1.2 dwinter 248: if not objects:
249: objects={}
250: im=self.getSubDirsFromIndexMeta(path)
251: for key in im.keys():
252: #virtuelle pfade hinzufuegen
253:
254: if not objects.has_key(key):
255: objects[key]=im[key]
256:
257:
1.1 dwinter 258: def sortLow(x,y):
259: return cmp(x.lower(),y.lower())
260:
261: ret=[]
262:
263: objectSorted=objects.keys()
264: objectSorted.sort(sortLow)
265: for object in objectSorted:
266: handler=self.giveHandlers(object,objects[object][0])
267: if objects[object][0]=="OSAS_dir":
268:
269: string="""<a href="?path=%s">%s</a>"""%(object,os.path.split(object)[1])
270:
271: ret.append((string,handler,objects[object][1]))
1.2 dwinter 272: elif objects[object][0]=="OSAS_dir_archive":
273: string="""<a href="?path=%s">%s (A)</a>"""%(object,os.path.split(object)[1])
274:
275: ret.append((string,handler,objects[object][1]))
1.1 dwinter 276: else:
277: ret.append((os.path.split(object)[1],handler,objects[object][1]))
278:
279:
280: return ret
281:
282:
283: def path_to_link(self,pathTmp=""):
284: """generates navigation bar for viewfiles"""
285:
286: path=os.path.normpath(os.path.join(self.rootFolderName,pathTmp))
287:
288: URL=self.absolute_url()
289: string=""
290:
291: tmppath=os.path.dirname(path)
292: i=0
293: pathes=[[path, os.path.basename(path)]]
294:
295: while not (len(tmppath)==1):
296:
297: i=i+1
298: if i>20: break
299:
300: pathes.append([tmppath, os.path.basename(tmppath)])
301: tmppath=os.path.dirname(tmppath)
302:
303: while i>=0:
304: if pathes[i][0].find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
305: string=string+"<a>"+pathes[i][1]+"</a>/"
306: else:
307: string=string+"<a href="+URL+"?path="+pathes[i][0]+">"+pathes[i][1]+"</a>/"
308:
309: i=i-1
310: return string
311:
312: def getMetaFile(self,path):
313: """Lese Metafile ein"""
1.3 dwinter 314: tmp=OSAS_helpers.getMetaFile(self,path)
315: #zLOG.LOG("EE",zLOG.INFO,type(tmp))
316:
317: return tmp
1.1 dwinter 318:
319: InitializeClass(OSAS_storeOnline)
320:
321: def manage_addOSAS_storeOnlineForm(self):
322: """interface for adding the OSAS_root"""
323: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnline.zpt')).__of__(self)
324: return pt()
325:
326: def manage_addOSAS_storeOnline(self,id,RESPONSE=None):
327: """add the OSAS_root"""
328: newObj=OSAS_storeOnline(id)
329: self._setObject(id,newObj)
330: if RESPONSE is not None:
331: RESPONSE.redirect('manage_main')
332:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>