Annotation of OSA_system2/OSAS_browser.py, revision 1.8

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>