Annotation of OSA_system2/OSAS_root.py, revision 1.7

1.2       dwinter     1: """ OSAS_contains the basic classes for configuring the OSAS and
                      2: basic objects for displaying data.
                      3: All site specific adaptation should be made in OSAS_Root
                      4: """
1.1       dwinter     5: 
                      6: from OSAS_helpers import *
                      7: import OSAS_helpers
                      8: from OFS.SimpleItem import SimpleItem
                      9: from time import localtime,strftime
                     10: from Acquisition import Implicit
                     11: from OFS.Folder import Folder
                     12: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                     13: from Products.PageTemplates.PageTemplate import PageTemplate
                     14: import urllib
                     15: from urlparse import *
                     16: import re
                     17: import xml.dom.minidom
                     18: from types import *
                     19: import zLOG
                     20: import os.path
1.2       dwinter    21: import Globals
1.1       dwinter    22: from Globals import package_home
1.2       dwinter    23: from AccessControl import ClassSecurityInfo
1.6       dwinter    24: import xmlrpclib
                     25: from xml.sax import make_parser
                     26: from xml.sax.handler import ContentHandler
                     27: import sys
1.1       dwinter    28: 
1.6       dwinter    29: class OSAS_add_contextData(Folder):
                     30:     """Einfuegen eines Documentes in eine Collection"""
                     31:     
                     32:     security=ClassSecurityInfo()
                     33: 
                     34:             
                     35:     meta_type='OSAS_addObjectToCollection'    
                     36: 
                     37:     def XmlToTree(self,URL,pwstr=None):
                     38:         """Collection XML to Tree"""
                     39:         def spaces(depth):
                     40:             
                     41:             tmp=""
                     42:             k=0
                     43:             while k<2*depth:
                     44:                 k+=1
                     45:                 tmp=tmp+"&nbsp;"+"&nbsp;"
                     46:             return tmp
                     47: 
                     48:         class requestHandler(ContentHandler):
                     49:             def __init__(self):
                     50:                 self.depth=0
                     51:                 self.retStr=""
                     52:                 
                     53:             def startElement(self,name,attrs):
                     54:                 if name=="element":
                     55:                     self.depth+=1
                     56:                     begin=""
                     57:                     end=""
                     58:                     if self.depth==1:
                     59:                         begin="<b>"
                     60:                         end="</b>"
                     61:                         
                     62:                     self.retStr+=spaces(self.depth)+"<input type='radio' name='collection' value='%s'>%s</input>"%(attrs.get('url'),begin+urllib.unquote(attrs.get('name')))+end+"<br>\n"
                     63: 
                     64: 
                     65:                     
                     66:             def endElement(self,name):
                     67:                 if name=="element":
                     68:                     self.depth-=1
                     69: 
                     70:         if pwstr=="":
                     71:             pwstr=None
                     72:             
                     73:        
                     74: 
                     75:         try:
                     76:             if pwstr:
                     77:                 URL+="/getCollectionTreeXML?pwstr=%s"%pwstr    
                     78:             else:
                     79:                 URL+="/getCollectionTreeXML"
                     80:             parser=make_parser()
                     81:             curHandler=requestHandler()
                     82:             parser.setContentHandler(curHandler)
                     83: 
                     84:             parser.parse(urllib.urlopen(URL))
                     85:             return curHandler.retStr.encode('utf-8')
                     86: 
                     87:         except:
                     88:             zLOG.LOG('OSAS_Root (addFileToDollection)',zLOG.ERROR,'%s %s'%sys.exc_info()[:2])
                     89:        return URL
                     90:             return urllib.urlopen(URL).read()
                     91:        
                     92:       
                     93:     def __init__(self,id,collection):
                     94:         self.id=id
                     95:         self.collection=collection
                     96: 
                     97:   
                     98:    
                     99: 
                    100:     def getPartners(self,URL):
                    101:         """Zeige Partnerliste"""
                    102:         class requestHandler(ContentHandler):
                    103:             def __init__(self):
                    104:                 self.ret=[]
                    105:                 
                    106:             def startElement(self,name,attrs):
                    107:                 if name=="partner":
                    108:                     self.ret.append((attrs.get('id'),attrs.get('title').encode('utf-8')))
                    109: 
                    110: 
                    111:         URL+="/getPartnersXML"
                    112:         parser=make_parser()   
                    113:    curHandler=requestHandler()
                    114:         parser.setContentHandler(curHandler)
                    115:    parser.parse(urllib.urlopen(URL))           
                    116:         try:   
                    117:                   
                    118:            return curHandler.ret
                    119:         except:
                    120:            return [("",URL)]
                    121: 
                    122:     
                    123:     
                    124:     def addContextData(self,path):
                    125:         """Hinzufuegen zu einer Sammlung"""
                    126: 
                    127:         server=xmlrpclib.Server(self.serverUrl)
                    128:         
                    129: 
                    130:         self.REQUEST.SESSION['images']=server.getImages(path)
                    131: 
                    132: 
                    133:         self.REQUEST.SESSION['movies']=server.getMovies(path)
                    134: 
                    135: 
                    136:         
                    137:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','contextDataMain.zpt')).__of__(self)
                    138:         return pt()
                    139:     
                    140:     index_html=addContextData
                    141:     
                    142:     def addContextData2(self,path,collection,thumb,streamingfile,rawfile,label,description,content_type,responsible,weight,credits=None):
                    143:         """Hinzufuegen der Resource"""
                    144:         splitted=path.split("/")
                    145:         #print "BLU"
                    146:         id=splitted[len(splitted)-1]
                    147:         title=splitted[len(splitted)-1]
                    148:         metalink=self.REQUEST['SERVER_URL']+path+"/index.meta"
                    149:         
                    150:         #link=TOBEDONE"
                    151:         """Hinzufuegen der Ressource"""
1.7     ! dwinter   152:    gifPath=path.replace("/mpiwg/online/","")
        !           153:    rawPath=path.replace("/mpiwg/online/permanent/einstein_exhibition/movies/","")
        !           154:         thumbUrl="http://einst3.mpiwg-berlin.mpg.de/"+gifPath+"/"+thumb
        !           155:         link="rtsp://einst1.mpiwg-berlin.mpg.de/"+gifPath+"/"+streamingfile
        !           156:         rawFile="file:///Volumes/einstein_movies/"+rawPath+"/"+rawfile
1.6       dwinter   157: 
                    158:         
                    159:         params=urllib.urlencode({'id':id,'title':title,'link':link,'thumbUrl':thumbUrl,'rawFile':rawFile,'label':label,'description':description,'contentType':content_type,'responsible':responsible,'weight':weight,'credits':credits,'metalink':metalink})
                    160: 
                    161:         #retStr=urllib.urlopen(collection+"/addMovie",params).read()
                    162:         try:
                    163:             server=xmlrpclib.Server(collection,allow_none=True)
                    164:             retStr=server.addMovie(id,title,label,description,content_type,responsible,link,thumbUrl,rawFile,metalink,weight,credits)
                    165:         except:
                    166:             zLOG.LOG('OSAS_Root (addFileToDollection2)',zLOG.ERROR,'%s %s'%sys.exc_info()[:2])
                    167:             return "An Error occured adding the resource\n", collection,params
                    168:         
                    169:    #print "added"
                    170:    if not retStr:
                    171:             return "An Error occured adding the resource\n", collection,params
                    172:    
                    173:         #print collection+"/"+id+"/copyIndex_meta2echo_resource"
                    174: 
                    175:         urllib.urlopen(collection+"/"+id+"/copyIndex_meta2echo_resource").read()
                    176:    #print "copy2res"
                    177:         urllib.urlopen(collection+"/"+id+"/generate_label").read()
                    178:    #print "label"
                    179:         urllib.urlopen(collection+"/"+id+"/generate_title").read()
                    180:    #print "title"
                    181:         return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?path='+path)
                    182:         
                    183:     manage_options = Folder.manage_options+(
                    184:             {'label':'Main Config','action':'add_contextData_config'},
                    185:             )
                    186:         
                    187:      
                    188:     def add_contextData_config(self):
                    189:         """Main configuration"""
                    190:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeAddContextData.zpt')).__of__(self)
                    191:         return pt()
                    192:     
                    193:     
                    194:     def change_OSAS_add_contextData(self,collection,pwstr=None,RESPONSE=None):
                    195:         """Change"""
                    196:         self.pwstr=pwstr
                    197:         self.collection=collection
                    198:         if RESPONSE is not None:
                    199:             RESPONSE.redirect('manage_main')
                    200:             
                    201: def manage_AddOSAS_add_contextDataForm(self):
                    202:     """interface for adding the OSAS_add_Metadata"""
                    203:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addContextData.zpt')).__of__(self)
                    204:     return pt()
                    205: 
                    206: def manage_AddOSAS_add_contextData(self,id,collection,RESPONSE=None):
                    207:     """add the OSAS_root"""
                    208:     newObj=OSAS_add_contextData(id,collection)
                    209:     self.Destination()._setObject(id,newObj)
                    210:     if RESPONSE is not None:
                    211:         RESPONSE.redirect('manage_main')
                    212: 
                    213:             
                    214: 
                    215: 
                    216:     
1.1       dwinter   217: 
1.3       dwinter   218: class OSAS_handlerObject(Folder):
1.1       dwinter   219:     """
1.3       dwinter   220:     Grundlegende Klasse fuer Handler zur Zeit noch in Entwicklung
1.1       dwinter   221: 
                    222:     """
1.3       dwinter   223:     meta_type="OSAS_HandlerObject__neu"
1.2       dwinter   224: 
1.1       dwinter   225:     
                    226:     def __init__(self,id,title,prefix,objectTypes,ignorePath=""):
                    227:         """inititialisiere die Klasse
                    228: 
                    229:         :Parameters:
                    230:          - `id` : Zope ID des Objektes
                    231:          - `title`: Titel des Objektes
                    232:          - `prefix` : URL bzw. URL Rumpf der Zusammen mit dem Pfad des Objectes die Anzeige URL ergibt
1.3       dwinter   233:          - `objectType` : liste von Objekttypen die mittels dieses Handlers angezeigt werden können.
1.1       dwinter   234:          - `ignorePath` : Pfad der bei dem übergebenen Pfad element ingnoriert werden soll. Optional.
                    235:         """
                    236:         self.id=id
                    237:         self.title=title
                    238:         self.prefix=prefix
                    239:         self.objectTypes=toList(objectTypes)
                    240:         self.ignorePath=ignorePath
                    241: 
                    242:     manage_options = Folder.manage_options+(
1.3       dwinter   243:         {'label':'Main Config','action':'changeHandlerObjectForm'},
1.1       dwinter   244:         )
                    245: 
1.3       dwinter   246:     def changeHandlerObjectForm(self):
1.1       dwinter   247:         """Main configuration"""
1.3       dwinter   248:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeHandlerObjectForm.zpt')).__of__(self)
1.1       dwinter   249:         return pt()
                    250: 
1.6       dwinter   251:     def changeHandlerObject(self,title,prefix,objectTypes="",ignorePath=None,newTarget="yes",RESPONSE=None):
1.1       dwinter   252:         """Change RootFolderName"""
                    253:         self.title=title
                    254:         self.prefix=prefix
                    255:         self.ignorePath=ignorePath
                    256:         self.objectTypes=toList(objectTypes)
1.6       dwinter   257:         self.newTarget=newTarget
1.1       dwinter   258:         
                    259:         if RESPONSE is not None:
                    260:             RESPONSE.redirect('manage_main')
                    261: 
                    262: 
1.3       dwinter   263: def manage_addHandlerObjectForm(self):
                    264:     """form for adding a handler Object"""
                    265:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addHandlerObjectForm.zpt')).__of__(self)
1.1       dwinter   266:     return pt()
                    267: 
1.3       dwinter   268: def manage_addHandlerObject(self,id,title,prefix,objectTypes,ignorePath,RESPONSE=None):
1.1       dwinter   269:     """add the OSAS_root"""
1.3       dwinter   270:     newObj=OSAS_handlerObject(id,title,prefix,objectTypes,ignorePath)
1.1       dwinter   271:     self._setObject(id,newObj)
                    272:     
                    273:     if RESPONSE is not None:
                    274:         RESPONSE.redirect('manage_main')
                    275: 
                    276:     
                    277: class OSAS_root(Folder,Implicit):
                    278:     """Implicit Folder of the  Storage Systems"""
1.2       dwinter   279: 
                    280:     security=ClassSecurityInfo()
                    281: 
1.4       dwinter   282:     def __init__(self,id,rootFolderName,serverUrl,uploadServletUrl=None):
1.1       dwinter   283:         """initialize a new instance
                    284: 
                    285: 
                    286:         @param id: Zope ID des Objektes
                    287:         @param rootFolderName : path zum root folder des Storagesystems
                    288:         @param uploadServerletUrl : url des UploadServlets (required fuer batch upload)
                    289: 
                    290:         """
                    291:         
                    292:         self.id = id
                    293:         self.rootFolderName = rootFolderName
                    294:         self.uploadServletUrl=uploadServletUrl
1.4       dwinter   295:         self.serverUrl=serverUrl
1.5       dwinter   296:     meta_type="OSAS_Root"
1.1       dwinter   297: 
                    298:     manage_options = Folder.manage_options+(
                    299:         {'label':'Main Config','action':'changeRootForm'},
                    300:         )
                    301: 
                    302: 
                    303:     OSASObjectTypes=OSAS_helpers.OSASObjectTypes
1.5       dwinter   304: 
1.6       dwinter   305:     def generateMovieThumb(self,name):
                    306:         """generate movie"""
                    307:         server=xmlrpclib.Server(self.serverUrl)
1.7     ! dwinter   308:         name="/mpiwg/online/permanent/einstein_exhibition/movies/"+name
        !           309: 
1.6       dwinter   310:         print "bl",name,os.path.splitext(name)[0]+".gif"
                    311:         ret=server.generateMovieThumb(name,os.path.splitext(name)[0]+".gif")
                    312:         return ret
                    313:     
1.5       dwinter   314:     security.declareProtected("View management screens","getOSASObjectTypes")
                    315:     def getOSASObjectTypes(self):
                    316:         """return list of objecttypes"""
                    317:         return OSASObjectTypes
                    318: 
                    319:     def setProxy(self,name,value):
                    320:         """set proxy"""
                    321:         self.REQUEST.SESSION[name]=value
                    322:         return True
                    323: 
                    324:     def listToSingle(self,path):
                    325:         """list to single"""
                    326:         if type(path)==ListType:
                    327:             return path[0]
                    328:         else:
                    329:             return path
                    330: 
                    331:     def splitPath(self,path):
                    332:         """split path"""
                    333:         if type(path)==ListType:
                    334:             path=path[0]
                    335:         return os.path.split(path)
1.1       dwinter   336:     
                    337:     def changeRootForm(self):
                    338:         """Main configuration"""
                    339:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeRootForm.zpt')).__of__(self)
                    340:         
                    341:         return pt()
                    342: 
1.4       dwinter   343:     def changeRoot(self,rootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
1.1       dwinter   344:         """Change RootFolderName"""
                    345:         self.rootFolderName=rootFolderName
1.4       dwinter   346:         self.serverUrl=serverUrl
1.1       dwinter   347:         self.uploadServletUrl=uploadServletUrl
                    348:         
                    349:         if RESPONSE is not None:
                    350:             RESPONSE.redirect('manage_main')
                    351: 
                    352:     localDate=localDate
                    353:     
                    354:     def getUploadServletUrl(self):
                    355:         """gibt  url des servlets zurueck"""
                    356:         return self.uploadServletUrl
                    357:         
                    358: 
1.2       dwinter   359:     def validateIndexMeta(self,data):
                    360:         """TO BE DONE testet ob data ein gueltiges index.meta file ist, zur Zeit wird dom erzeugt ohne validierung.
                    361:         @param data: zu testendes XML file als string
                    362:         @return: zeiger auf dom  falls ok, None  andernfalls (z.Z: immmer dom falls parse possible)
                    363:         """
                    364:         try:
                    365:             return xml.dom.minidom.parseString(xmlneu)
                    366:         except:
                    367:             return None
                    368:         
                    369:     security.declareProtected('View management screens','uploadExternalXMLString','uploadExternalXMLUrl','uploadExternalXML')
                    370:     
                    371:     def uploadExternalXMLString(self,index_meta_url,xml_string):
                    372:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   373:         
                    374:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
1.2       dwinter   375:         @param xml_string: string mit index_meta ersetzt obiges index.meta
1.1       dwinter   376:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    377:         """
1.2       dwinter   378: 
                    379:         return self.uploadExternalXML(index_meta_url,xml_string)
                    380: 
                    381: 
                    382:     def uploadExternalXMLUrl(self,index_meta_url,xml_url):
                    383:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   384:         
1.2       dwinter   385:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
                    386:         @param xml_url: externe url auf ein index_meta ersetzt obiges index.meta
                    387:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    388:         """
                    389: 
                    390:         return self.uploadExternalXML(index_meta_url,xml_url)
1.1       dwinter   391: 
1.2       dwinter   392:     
                    393:     def uploadExternalXML(self,index_meta_url,xml_url=None,xml_string=None):
                    394:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   395:         
1.2       dwinter   396:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
                    397:         @param xml_url: (optional, default=None) externe url auf ein index_meta ersetzt obiges index.meta
                    398:         @param xml_string: (optional, default=None) string mit index_meta ersetzt obiges index.meta
                    399:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    400:         """
1.1       dwinter   401: 
1.2       dwinter   402:         if xml_url:
                    403:             xmlneu=urllib.urlopen(xml_url).read()
                    404:         else:
                    405:             xmlneu=xml_string
                    406:         
                    407:         dom=self.validateIndexMeta(xmlneu)
                    408:         if not dom:
1.1       dwinter   409:             zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url)
                    410:             return "error"
                    411: 
                    412: 
                    413:         path=self.rootFolderName+urlparse(index_meta_url)[2]
                    414: 
                    415:         fh=open(path,'w')
                    416: 
                    417:         fh.write(xmlneu)
                    418:         fh.close()
                    419:         return "ok"
                    420: 
1.2       dwinter   421:     security.declareProtected('View','getIndexMetaFile')
                    422: 
                    423:    
                    424:     def getIndexMetaFile(self,index_meta):
                    425:         """gibt index metafile aus
                    426:         @param index_meta: index_meta ist eine URI entweder url des index_meta oder file mit file://
                    427:         """
                    428:         filearray=[]
                    429:         urlparsed=urlparse(index_meta)[1:]
                    430: 
                    431:         for x in urlparsed:
                    432:             
                    433:             if not (x==''):
                    434:                 filearray.append(x)
                    435: 
                    436:         path=os.sep.join(filearray)
                    437: 
                    438:         realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
1.1       dwinter   439:         
1.2       dwinter   440:         if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
                    441:             return {}
                    442:             
                    443: 
                    444:         if not os.path.isfile(realPath):
                    445:             return None,"(ERROR) path %s does not exist."%path
                    446: 
                    447:     
                    448:         fh=file(realPath,'r')
                    449:         str=fh.read()
                    450:         fh.close()
                    451:         return str
                    452: 
                    453: 
                    454: Globals.InitializeClass(OSAS_root)
                    455: 
1.1       dwinter   456: def manage_addOSAS_rootForm(self):
                    457:     """interface for adding the OSAS_root"""
                    458:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self)
                    459:     return pt()
                    460: 
1.4       dwinter   461: def manage_addOSAS_root(self,id,RootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
1.1       dwinter   462:     """add the OSAS_root"""
1.4       dwinter   463:     newObj=OSAS_root(id,RootFolderName,serverUrl,uploadServletUrl)
1.1       dwinter   464:     self._setObject(id,newObj)
                    465:     if RESPONSE is not None:
                    466:         RESPONSE.redirect('manage_main')
                    467: 
                    468:     

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