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>