Annotation of OSA_system2/OSAS_root.py, revision 1.9

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:     
1.8       dwinter   142:     def addContextData2(self,path,collection,label,description,content_type,responsible,weight,thumb="",streamingfile="",rawfile="",credits=None):
1.6       dwinter   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: 
1.8       dwinter   161:                 
1.6       dwinter   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"
1.8       dwinter   181:         return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'/browse?path='+path)
1.6       dwinter   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.9     ! dwinter   305:     def extendDict(self,dict1,dict2):
        !           306:         """add two dicts"""
        !           307:         ret=dict1
        !           308:         for name in dict2.keys():
        !           309:             ret[name]=dict2[name]
        !           310:         return ret
        !           311:     
        !           312:         
1.6       dwinter   313:     def generateMovieThumb(self,name):
                    314:         """generate movie"""
                    315:         server=xmlrpclib.Server(self.serverUrl)
1.7       dwinter   316:         name="/mpiwg/online/permanent/einstein_exhibition/movies/"+name
                    317: 
1.8       dwinter   318:         
1.6       dwinter   319:         ret=server.generateMovieThumb(name,os.path.splitext(name)[0]+".gif")
                    320:         return ret
                    321:     
1.5       dwinter   322:     security.declareProtected("View management screens","getOSASObjectTypes")
                    323:     def getOSASObjectTypes(self):
                    324:         """return list of objecttypes"""
                    325:         return OSASObjectTypes
                    326: 
                    327:     def setProxy(self,name,value):
                    328:         """set proxy"""
                    329:         self.REQUEST.SESSION[name]=value
                    330:         return True
                    331: 
                    332:     def listToSingle(self,path):
                    333:         """list to single"""
                    334:         if type(path)==ListType:
                    335:             return path[0]
                    336:         else:
                    337:             return path
                    338: 
                    339:     def splitPath(self,path):
                    340:         """split path"""
                    341:         if type(path)==ListType:
                    342:             path=path[0]
                    343:         return os.path.split(path)
1.1       dwinter   344:     
                    345:     def changeRootForm(self):
                    346:         """Main configuration"""
                    347:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeRootForm.zpt')).__of__(self)
                    348:         
                    349:         return pt()
                    350: 
1.4       dwinter   351:     def changeRoot(self,rootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
1.1       dwinter   352:         """Change RootFolderName"""
                    353:         self.rootFolderName=rootFolderName
1.4       dwinter   354:         self.serverUrl=serverUrl
1.1       dwinter   355:         self.uploadServletUrl=uploadServletUrl
                    356:         
                    357:         if RESPONSE is not None:
                    358:             RESPONSE.redirect('manage_main')
                    359: 
                    360:     localDate=localDate
                    361:     
                    362:     def getUploadServletUrl(self):
                    363:         """gibt  url des servlets zurueck"""
                    364:         return self.uploadServletUrl
                    365:         
                    366: 
1.2       dwinter   367:     def validateIndexMeta(self,data):
                    368:         """TO BE DONE testet ob data ein gueltiges index.meta file ist, zur Zeit wird dom erzeugt ohne validierung.
                    369:         @param data: zu testendes XML file als string
                    370:         @return: zeiger auf dom  falls ok, None  andernfalls (z.Z: immmer dom falls parse possible)
                    371:         """
                    372:         try:
                    373:             return xml.dom.minidom.parseString(xmlneu)
                    374:         except:
                    375:             return None
                    376:         
                    377:     security.declareProtected('View management screens','uploadExternalXMLString','uploadExternalXMLUrl','uploadExternalXML')
                    378:     
                    379:     def uploadExternalXMLString(self,index_meta_url,xml_string):
                    380:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   381:         
                    382:         @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   383:         @param xml_string: string mit index_meta ersetzt obiges index.meta
1.1       dwinter   384:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    385:         """
1.2       dwinter   386: 
                    387:         return self.uploadExternalXML(index_meta_url,xml_string)
                    388: 
                    389: 
                    390:     def uploadExternalXMLUrl(self,index_meta_url,xml_url):
                    391:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   392:         
1.2       dwinter   393:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
                    394:         @param xml_url: externe url auf ein index_meta ersetzt obiges index.meta
                    395:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    396:         """
                    397: 
                    398:         return self.uploadExternalXML(index_meta_url,xml_url)
1.1       dwinter   399: 
1.2       dwinter   400:     
                    401:     def uploadExternalXML(self,index_meta_url,xml_url=None,xml_string=None):
                    402:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   403:         
1.2       dwinter   404:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
                    405:         @param xml_url: (optional, default=None) externe url auf ein index_meta ersetzt obiges index.meta
                    406:         @param xml_string: (optional, default=None) string mit index_meta ersetzt obiges index.meta
                    407:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    408:         """
1.1       dwinter   409: 
1.2       dwinter   410:         if xml_url:
                    411:             xmlneu=urllib.urlopen(xml_url).read()
                    412:         else:
                    413:             xmlneu=xml_string
                    414:         
                    415:         dom=self.validateIndexMeta(xmlneu)
                    416:         if not dom:
1.1       dwinter   417:             zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url)
                    418:             return "error"
                    419: 
                    420: 
                    421:         path=self.rootFolderName+urlparse(index_meta_url)[2]
                    422: 
                    423:         fh=open(path,'w')
                    424: 
                    425:         fh.write(xmlneu)
                    426:         fh.close()
                    427:         return "ok"
                    428: 
1.2       dwinter   429:     security.declareProtected('View','getIndexMetaFile')
                    430: 
                    431:    
                    432:     def getIndexMetaFile(self,index_meta):
                    433:         """gibt index metafile aus
                    434:         @param index_meta: index_meta ist eine URI entweder url des index_meta oder file mit file://
                    435:         """
                    436:         filearray=[]
                    437:         urlparsed=urlparse(index_meta)[1:]
                    438: 
                    439:         for x in urlparsed:
                    440:             
                    441:             if not (x==''):
                    442:                 filearray.append(x)
                    443: 
                    444:         path=os.sep.join(filearray)
                    445: 
                    446:         realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
1.1       dwinter   447:         
1.2       dwinter   448:         if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
                    449:             return {}
                    450:             
                    451: 
                    452:         if not os.path.isfile(realPath):
                    453:             return None,"(ERROR) path %s does not exist."%path
                    454: 
                    455:     
                    456:         fh=file(realPath,'r')
                    457:         str=fh.read()
                    458:         fh.close()
                    459:         return str
                    460: 
                    461: 
                    462: Globals.InitializeClass(OSAS_root)
                    463: 
1.1       dwinter   464: def manage_addOSAS_rootForm(self):
                    465:     """interface for adding the OSAS_root"""
                    466:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self)
                    467:     return pt()
                    468: 
1.4       dwinter   469: def manage_addOSAS_root(self,id,RootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
1.1       dwinter   470:     """add the OSAS_root"""
1.4       dwinter   471:     newObj=OSAS_root(id,RootFolderName,serverUrl,uploadServletUrl)
1.1       dwinter   472:     self._setObject(id,newObj)
                    473:     if RESPONSE is not None:
                    474:         RESPONSE.redirect('manage_main')
                    475: 
                    476:     

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