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>