Annotation of OSA_system2/OSAS_browser.py, revision 1.9

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

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