Annotation of OSA_system2/OSAS_server.py, revision 1.2
1.1 dwinter 1: import os
2: import os.path
3: import stat
4: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
5: from Globals import InitializeClass,package_home
6: from OFS.SimpleItem import SimpleItem
7: import xml.dom.minidom
8: import OSAS_helpers
9: from OSAS_helpers import *
10:
11: class OSAS_storeOnlineServer(SimpleItem):
12: """Server for store Online system"""
1.2 ! dwinter 13:
! 14: _v_metaFiles={} #chache fuer indexMeta
! 15: meta_type="OSAS_server"
! 16: def getSubDirsFromIndexMeta(self,path):
! 17:
! 18: """Gebe alle path untergeordenten Objekte aus
! 19: @param path: optional, default ist "", Pfad auf das Object relativ zum rootFolderName
! 20: @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.
! 21: @todo: Rueckgabe einer Beschreibung gemaess Metadaten
! 22: """
! 23: ret={}
! 24: #server=xmlrpclib.Server(self.serverUrl)
! 25: indexMeta,stats=self.findIndexMetaWithStats(path)#findex index.meta zu path.
! 26:
! 27: if not indexMeta:
! 28: return ret
! 29:
! 30: realPath=os.path.split(indexMeta)[0]
! 31: path=path.replace(realPath,"")
! 32: if path and (path[0]==os.sep): #falls am Anfang os.sep steht lösche dieses.
! 33: path=path[1:]
! 34:
! 35:
! 36:
! 37: #teste ob schon im cache
! 38:
! 39: if self._v_metaFiles.has_key(path) and (self._v_metaFiles[path][0]==stats[stat.ST_MTIME]):
! 40: return self._v_metaFiles[path][1]
1.1 dwinter 41:
1.2 ! dwinter 42: try:
! 43: dom=xml.dom.minidom.parse(indexMeta)
! 44: except:
! 45: zLOG.LOG("OSAS_browser (getSubDirsFromIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
! 46: return ret
! 47:
! 48: dirs=[]
! 49: dirs=dom.getElementsByTagName('dir')+dom.getElementsByTagName('file')
1.1 dwinter 50:
1.2 ! dwinter 51: for dir in dirs:
! 52: pathes=dir.getElementsByTagName('path')
! 53: if pathes:
! 54: pathX=OSAS_helpers.getText(pathes[0].childNodes)
! 55: else:
! 56: pathX=""
! 57: names=dir.getElementsByTagName('name')
! 58: if names:
! 59: name=OSAS_helpers.getText(names[0].childNodes)
! 60: else:
! 61: name=""
! 62:
! 63: #print "PP",pathX,path
! 64: if pathX==path:
! 65: if dir.tagName=="dir":
! 66: fileType="OSAS_dir_archive"
! 67: else:
! 68: fileType="OSAS_file_archive"
! 69:
! 70: object=os.path.join(realPath,pathX,name)
! 71: ret[object.encode('utf-8')]=(fileType,'')
! 72:
! 73: self._v_metaFiles[path]=(stats[stat.ST_MTIME],ret) # speicher im chache
! 74:
! 75: return ret
! 76:
! 77:
! 78:
1.1 dwinter 79: def findIndexMeta(self,realPath=""):
80: """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
81: @keyword path: default ist "", Pfad auf das Object
82: @return: None falls kein index.meta existiert sonst Pfad auf das index.meta
83: """
84:
85: #suche index.meta
86: while (not os.path.exists(os.path.join(realPath,'index.meta'))) and (not ((realPath=="") or (realPath=="/"))):
87: realPath=os.path.split(realPath)[0]
88:
89: if realPath=='' or realPath=='/':
90: if os.path.exists(os.path.join(realPath,'index.meta')):
91: return (os.path.join(realPath,'index.meta'))
92: else:
93: return None
94: else:
95: return os.path.join(realPath,'index.meta')
96:
97: def findIndexMetaWithStats(self,path=""):
98: """finde Rueckwaerts im Baum von Pfad ausgehend, dass erste index.meta file
99: @keyword path: default ist "", Pfad auf das Object
100: @return: None falls kein index.meta existiert sonst Tupel (Pfad auf das index.meta,stats(indexMeta)
101: """
102:
103: indexMeta=self.findIndexMeta(path)
104: if indexMeta:
105: return (indexMeta,self.getStat(indexMeta))
106: else:
107: return (None,[])
108:
109:
110: def getStat(self,path=""):
111: """Gibt stat von path aus
112: @keyword path: default ist "", Pfad
113: @return: stat[path]"""
114:
115: if not os.path.exists(path):
116: #return None,"(ERROR) path %s does not exist."%path
117: return None
118: else:
119: return [x for x in os.stat(path)]
120:
121:
122:
123:
124: def listdir(self,path=""):
125: """list dir"""
126: return os.listdir(path)
127:
128:
129: def getMetaFile(self,path):
130: """get index.meta and translate it to HTML"""
131: html=[]
132:
133: if not os.path.exists(path+"/index.meta"):
134:
135: return self.getMetaInfoFromIndexMeta(path)
136: #return "NO_METADATA"
137: else:
138:
139: f = os.popen("cat "+path+"/index.meta","r")
140: lines = f.read()
141:
142: dom = xml.dom.minidom.parseString(lines)
143: try:
144: name=getText(dom.getElementsByTagName("name")[0].childNodes)
145: except:
146: name="NOT_DEFINED!!!"
147: try:
148: creator=getText(dom.getElementsByTagName("creator")[0].childNodes)
149: except:
150: creator="NOT_DEFINED!!!"
151:
152: try:
153: creation_date=getText(dom.getElementsByTagName("archive-creation-date")[0].childNodes)
154: except:
155: creation_date="NOT_DEFINED!!!"
156:
157: try:
158: description=getText(dom.getElementsByTagName("description")[0].childNodes)
159: except:
160: description="NOT_DEFINED!!!"
161:
162: try:
163: type=getText(dom.getElementsByTagName("content-type")[0].childNodes)
164: except:
165: type=""
166: if type=="scanned document":
167: html="<h3>Document: "+name+"</h3>"
168: elif type=="folder":
169: html="<h3>Folder: "+name+"</h3>"
170: else:
171: html="<h3>Document: "+name+"</h3>"
172:
173: html=html+"<p><i>created by: "+creator+" at: "+creation_date+"</i></p>"
174: html=html+"<h4>Description</h4><p>"+description+"</p>"
175: try:
176: bib = dom.getElementsByTagName("meta")[0].getElementsByTagName("bib")[0]
177: if bib.attributes.has_key('type'):
178: html=html+"<h4>Info ("+bib.attributes['type'].value+")</h4>"
179: else:
180: html=html+"<h4>Info</h4>"
181: html=html+getBib(bib.childNodes)
182:
183: except:
184: """none"""
185:
186: # html=html.encode('utf-8','replace')+getBib(bib.childNodes).encode('utf-8','replace')
187:
188: return html
189:
190:
191: def getMetaInfoFromIndexMeta(self,path):
192: """metadaten zu path als html aus dem index.meta file zu path (meta tag im file bzw. dir container)
193: @param path: Pfad auf das Object relativ zum rootFolderName
194: @return: metadata als html
195: """
196: xmlInfos=self.findEntryInIndexMeta(path)
197: if xmlInfos:
198: return OSAS_helpers.getMetaInfoFromXML(path,xmlInfos)
199: else:
200: return ""
201:
202: def findEntryInIndexMeta(self,path):
203: """Finde im naechstgelegenden index.meta relativ zu path den entprechenden Eintrag fuer diesen Pfad.
204: @param path: Pfad auf das Object relativ zum rootFolderName
205: @return: den Teil von Index.meta der Informationen zu path enthaelt, None wenn error.
206: """
207:
208: indexMeta=self.findIndexMeta(path) # suche index.meta
209:
210: if not indexMeta:
211: return None
212:
213: realPath=os.path.split(indexMeta)[0]
214: path=os.path.normpath(path)
215:
216: try:
217: dom=xml.dom.minidom.parse(indexMeta)
218: except:
219: zLOG.LOG("OSAS_browser (findEntryInIndexMeta)",zLOG.ERROR,"Cannot parse: %s"%indexMeta)
220: #ist path ein directory?
221: dirs=dom.getElementsByTagName('dir')
222: for dir in dirs:
223: pathes=dir.getElementsByTagName('path')
224: if pathes:
225: pathX=OSAS_helpers.getText(pathes[0].childNodes)
226: else:
227: pathX=""
228: names=dir.getElementsByTagName('name')
229: if names:
230: name=OSAS_helpers.getText(names[0].childNodes)
231: else:
232: name=""
233:
234: checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
235: if checkpath==path:
236:
237: return dir.toxml()
238:
239: #ist path ein file?
240: files=dom.getElementsByTagName('file')
241: for dir in dirs:
242: pathes=dir.getElementsByTagName('path')
243: if pathes:
244: pathX=OSAS_helpers.getText(pathes[0].childNodes)
245: else:
246: pathX=""
247: names=dir.getElementsByTagName('name')
248: if names:
249: name=OSAS_helpers.getText(names[0].childNodes)
250: else:
251: name=""
252:
253: checkpath=os.path.normpath(os.path.join(realPath,pathX,name))
254: if checkpath==path:
255:
256: return dir.toxml()
257:
258:
259: return None
260:
261:
262: def manage_addOSAS_storeOnlineServerForm(self):
263: """interface for adding the OSAS_storeOnline"""
264: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addStoreOnlineServer.zpt')).__of__(self)
265: return pt()
266:
267: def manage_addOSAS_storeOnlineServer(self,id,RESPONSE=None):
268: """add the OSAS_storeOnline
269: @param id: id
270: """
271: newObj=OSAS_storeOnlineServer(id)
272: self._setObject(id,newObj)
273: if RESPONSE is not None:
274: RESPONSE.redirect('manage_main')
275:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>