Annotation of OSA_system2/OSAS_root.py, revision 1.10

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.10    ! dwinter   142:     def addContextData2(self,path,collection,label,description,content_type,responsible,weight,thumb="",streamingfile="",rawfile="",lowresfile="",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/","")
1.10    ! dwinter   154:         lowresPath=path.replace("/mpiwg/online/permanent/einstein_exhibition/movies/","")
1.7       dwinter   155:         thumbUrl="http://einst3.mpiwg-berlin.mpg.de/"+gifPath+"/"+thumb
                    156:         link="rtsp://einst1.mpiwg-berlin.mpg.de/"+gifPath+"/"+streamingfile
                    157:         rawFile="file:///Volumes/einstein_movies/"+rawPath+"/"+rawfile
1.10    ! dwinter   158:         lowresFile="file:///Volumes/einstein_movies/"+lowresPath+"/"+lowresfile
1.6       dwinter   159: 
                    160:         
                    161:         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})
                    162: 
1.8       dwinter   163:                 
1.6       dwinter   164:         try:
                    165:             server=xmlrpclib.Server(collection,allow_none=True)
1.10    ! dwinter   166:             retStr=server.addMovie(id,title,label,description,content_type,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits)
1.6       dwinter   167:         except:
                    168:             zLOG.LOG('OSAS_Root (addFileToDollection2)',zLOG.ERROR,'%s %s'%sys.exc_info()[:2])
                    169:             return "An Error occured adding the resource\n", collection,params
                    170:         
                    171:    #print "added"
                    172:    if not retStr:
                    173:             return "An Error occured adding the resource\n", collection,params
                    174:    
                    175:         #print collection+"/"+id+"/copyIndex_meta2echo_resource"
                    176: 
                    177:         urllib.urlopen(collection+"/"+id+"/copyIndex_meta2echo_resource").read()
                    178:    #print "copy2res"
                    179:         urllib.urlopen(collection+"/"+id+"/generate_label").read()
                    180:    #print "label"
                    181:         urllib.urlopen(collection+"/"+id+"/generate_title").read()
                    182:    #print "title"
1.8       dwinter   183:         return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'/browse?path='+path)
1.6       dwinter   184:         
                    185:     manage_options = Folder.manage_options+(
                    186:             {'label':'Main Config','action':'add_contextData_config'},
                    187:             )
                    188:         
                    189:      
                    190:     def add_contextData_config(self):
                    191:         """Main configuration"""
                    192:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeAddContextData.zpt')).__of__(self)
                    193:         return pt()
                    194:     
                    195:     
                    196:     def change_OSAS_add_contextData(self,collection,pwstr=None,RESPONSE=None):
                    197:         """Change"""
                    198:         self.pwstr=pwstr
                    199:         self.collection=collection
                    200:         if RESPONSE is not None:
                    201:             RESPONSE.redirect('manage_main')
                    202:             
                    203: def manage_AddOSAS_add_contextDataForm(self):
                    204:     """interface for adding the OSAS_add_Metadata"""
                    205:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addContextData.zpt')).__of__(self)
                    206:     return pt()
                    207: 
                    208: def manage_AddOSAS_add_contextData(self,id,collection,RESPONSE=None):
                    209:     """add the OSAS_root"""
                    210:     newObj=OSAS_add_contextData(id,collection)
                    211:     self.Destination()._setObject(id,newObj)
                    212:     if RESPONSE is not None:
                    213:         RESPONSE.redirect('manage_main')
                    214: 
                    215:             
                    216: 
                    217: 
                    218:     
1.1       dwinter   219: 
1.3       dwinter   220: class OSAS_handlerObject(Folder):
1.1       dwinter   221:     """
1.3       dwinter   222:     Grundlegende Klasse fuer Handler zur Zeit noch in Entwicklung
1.1       dwinter   223: 
                    224:     """
1.3       dwinter   225:     meta_type="OSAS_HandlerObject__neu"
1.2       dwinter   226: 
1.1       dwinter   227:     
                    228:     def __init__(self,id,title,prefix,objectTypes,ignorePath=""):
                    229:         """inititialisiere die Klasse
                    230: 
                    231:         :Parameters:
                    232:          - `id` : Zope ID des Objektes
                    233:          - `title`: Titel des Objektes
                    234:          - `prefix` : URL bzw. URL Rumpf der Zusammen mit dem Pfad des Objectes die Anzeige URL ergibt
1.3       dwinter   235:          - `objectType` : liste von Objekttypen die mittels dieses Handlers angezeigt werden können.
1.1       dwinter   236:          - `ignorePath` : Pfad der bei dem übergebenen Pfad element ingnoriert werden soll. Optional.
                    237:         """
                    238:         self.id=id
                    239:         self.title=title
                    240:         self.prefix=prefix
                    241:         self.objectTypes=toList(objectTypes)
                    242:         self.ignorePath=ignorePath
                    243: 
                    244:     manage_options = Folder.manage_options+(
1.3       dwinter   245:         {'label':'Main Config','action':'changeHandlerObjectForm'},
1.1       dwinter   246:         )
                    247: 
1.3       dwinter   248:     def changeHandlerObjectForm(self):
1.1       dwinter   249:         """Main configuration"""
1.3       dwinter   250:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeHandlerObjectForm.zpt')).__of__(self)
1.1       dwinter   251:         return pt()
                    252: 
1.6       dwinter   253:     def changeHandlerObject(self,title,prefix,objectTypes="",ignorePath=None,newTarget="yes",RESPONSE=None):
1.1       dwinter   254:         """Change RootFolderName"""
                    255:         self.title=title
                    256:         self.prefix=prefix
                    257:         self.ignorePath=ignorePath
                    258:         self.objectTypes=toList(objectTypes)
1.6       dwinter   259:         self.newTarget=newTarget
1.1       dwinter   260:         
                    261:         if RESPONSE is not None:
                    262:             RESPONSE.redirect('manage_main')
                    263: 
                    264: 
1.3       dwinter   265: def manage_addHandlerObjectForm(self):
                    266:     """form for adding a handler Object"""
                    267:     pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addHandlerObjectForm.zpt')).__of__(self)
1.1       dwinter   268:     return pt()
                    269: 
1.3       dwinter   270: def manage_addHandlerObject(self,id,title,prefix,objectTypes,ignorePath,RESPONSE=None):
1.1       dwinter   271:     """add the OSAS_root"""
1.3       dwinter   272:     newObj=OSAS_handlerObject(id,title,prefix,objectTypes,ignorePath)
1.1       dwinter   273:     self._setObject(id,newObj)
                    274:     
                    275:     if RESPONSE is not None:
                    276:         RESPONSE.redirect('manage_main')
                    277: 
                    278:     
                    279: class OSAS_root(Folder,Implicit):
                    280:     """Implicit Folder of the  Storage Systems"""
1.2       dwinter   281: 
                    282:     security=ClassSecurityInfo()
                    283: 
1.4       dwinter   284:     def __init__(self,id,rootFolderName,serverUrl,uploadServletUrl=None):
1.1       dwinter   285:         """initialize a new instance
                    286: 
                    287: 
                    288:         @param id: Zope ID des Objektes
                    289:         @param rootFolderName : path zum root folder des Storagesystems
                    290:         @param uploadServerletUrl : url des UploadServlets (required fuer batch upload)
                    291: 
                    292:         """
                    293:         
                    294:         self.id = id
                    295:         self.rootFolderName = rootFolderName
                    296:         self.uploadServletUrl=uploadServletUrl
1.4       dwinter   297:         self.serverUrl=serverUrl
1.5       dwinter   298:     meta_type="OSAS_Root"
1.1       dwinter   299: 
                    300:     manage_options = Folder.manage_options+(
                    301:         {'label':'Main Config','action':'changeRootForm'},
                    302:         )
                    303: 
                    304: 
                    305:     OSASObjectTypes=OSAS_helpers.OSASObjectTypes
1.5       dwinter   306: 
1.9       dwinter   307:     def extendDict(self,dict1,dict2):
                    308:         """add two dicts"""
                    309:         ret=dict1
                    310:         for name in dict2.keys():
                    311:             ret[name]=dict2[name]
                    312:         return ret
                    313:     
                    314:         
1.6       dwinter   315:     def generateMovieThumb(self,name):
                    316:         """generate movie"""
                    317:         server=xmlrpclib.Server(self.serverUrl)
1.7       dwinter   318:         name="/mpiwg/online/permanent/einstein_exhibition/movies/"+name
                    319: 
1.8       dwinter   320:         
1.6       dwinter   321:         ret=server.generateMovieThumb(name,os.path.splitext(name)[0]+".gif")
                    322:         return ret
                    323:     
1.5       dwinter   324:     security.declareProtected("View management screens","getOSASObjectTypes")
                    325:     def getOSASObjectTypes(self):
                    326:         """return list of objecttypes"""
                    327:         return OSASObjectTypes
                    328: 
                    329:     def setProxy(self,name,value):
                    330:         """set proxy"""
                    331:         self.REQUEST.SESSION[name]=value
                    332:         return True
                    333: 
                    334:     def listToSingle(self,path):
                    335:         """list to single"""
                    336:         if type(path)==ListType:
                    337:             return path[0]
                    338:         else:
                    339:             return path
                    340: 
                    341:     def splitPath(self,path):
                    342:         """split path"""
                    343:         if type(path)==ListType:
                    344:             path=path[0]
                    345:         return os.path.split(path)
1.1       dwinter   346:     
                    347:     def changeRootForm(self):
                    348:         """Main configuration"""
                    349:         pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeRootForm.zpt')).__of__(self)
                    350:         
                    351:         return pt()
                    352: 
1.4       dwinter   353:     def changeRoot(self,rootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
1.1       dwinter   354:         """Change RootFolderName"""
                    355:         self.rootFolderName=rootFolderName
1.4       dwinter   356:         self.serverUrl=serverUrl
1.1       dwinter   357:         self.uploadServletUrl=uploadServletUrl
                    358:         
                    359:         if RESPONSE is not None:
                    360:             RESPONSE.redirect('manage_main')
                    361: 
                    362:     localDate=localDate
                    363:     
                    364:     def getUploadServletUrl(self):
                    365:         """gibt  url des servlets zurueck"""
                    366:         return self.uploadServletUrl
                    367:         
                    368: 
1.2       dwinter   369:     def validateIndexMeta(self,data):
                    370:         """TO BE DONE testet ob data ein gueltiges index.meta file ist, zur Zeit wird dom erzeugt ohne validierung.
                    371:         @param data: zu testendes XML file als string
                    372:         @return: zeiger auf dom  falls ok, None  andernfalls (z.Z: immmer dom falls parse possible)
                    373:         """
                    374:         try:
                    375:             return xml.dom.minidom.parseString(xmlneu)
                    376:         except:
                    377:             return None
                    378:         
                    379:     security.declareProtected('View management screens','uploadExternalXMLString','uploadExternalXMLUrl','uploadExternalXML')
                    380:     
                    381:     def uploadExternalXMLString(self,index_meta_url,xml_string):
                    382:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   383:         
                    384:         @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   385:         @param xml_string: string mit index_meta ersetzt obiges index.meta
1.1       dwinter   386:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    387:         """
1.2       dwinter   388: 
                    389:         return self.uploadExternalXML(index_meta_url,xml_string)
                    390: 
                    391: 
                    392:     def uploadExternalXMLUrl(self,index_meta_url,xml_url):
                    393:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   394:         
1.2       dwinter   395:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
                    396:         @param xml_url: externe url auf ein index_meta ersetzt obiges index.meta
                    397:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    398:         """
                    399: 
                    400:         return self.uploadExternalXML(index_meta_url,xml_url)
1.1       dwinter   401: 
1.2       dwinter   402:     
                    403:     def uploadExternalXML(self,index_meta_url,xml_url=None,xml_string=None):
                    404:         """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
1.1       dwinter   405:         
1.2       dwinter   406:         @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. 
                    407:         @param xml_url: (optional, default=None) externe url auf ein index_meta ersetzt obiges index.meta
                    408:         @param xml_string: (optional, default=None) string mit index_meta ersetzt obiges index.meta
                    409:         @return: 'error' als String bei Fehler 'ok' bei ok.
                    410:         """
1.1       dwinter   411: 
1.2       dwinter   412:         if xml_url:
                    413:             xmlneu=urllib.urlopen(xml_url).read()
                    414:         else:
                    415:             xmlneu=xml_string
                    416:         
                    417:         dom=self.validateIndexMeta(xmlneu)
                    418:         if not dom:
1.1       dwinter   419:             zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url)
                    420:             return "error"
                    421: 
                    422: 
                    423:         path=self.rootFolderName+urlparse(index_meta_url)[2]
                    424: 
                    425:         fh=open(path,'w')
                    426: 
                    427:         fh.write(xmlneu)
                    428:         fh.close()
                    429:         return "ok"
                    430: 
1.2       dwinter   431:     security.declareProtected('View','getIndexMetaFile')
                    432: 
                    433:    
                    434:     def getIndexMetaFile(self,index_meta):
                    435:         """gibt index metafile aus
                    436:         @param index_meta: index_meta ist eine URI entweder url des index_meta oder file mit file://
                    437:         """
                    438:         filearray=[]
                    439:         urlparsed=urlparse(index_meta)[1:]
                    440: 
                    441:         for x in urlparsed:
                    442:             
                    443:             if not (x==''):
                    444:                 filearray.append(x)
                    445: 
                    446:         path=os.sep.join(filearray)
                    447: 
                    448:         realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
1.1       dwinter   449:         
1.2       dwinter   450:         if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
                    451:             return {}
                    452:             
                    453: 
                    454:         if not os.path.isfile(realPath):
                    455:             return None,"(ERROR) path %s does not exist."%path
                    456: 
                    457:     
                    458:         fh=file(realPath,'r')
                    459:         str=fh.read()
                    460:         fh.close()
                    461:         return str
                    462: 
                    463: 
                    464: Globals.InitializeClass(OSAS_root)
                    465: 
1.1       dwinter   466: def manage_addOSAS_rootForm(self):
                    467:     """interface for adding the OSAS_root"""
                    468:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self)
                    469:     return pt()
                    470: 
1.4       dwinter   471: def manage_addOSAS_root(self,id,RootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
1.1       dwinter   472:     """add the OSAS_root"""
1.4       dwinter   473:     newObj=OSAS_root(id,RootFolderName,serverUrl,uploadServletUrl)
1.1       dwinter   474:     self._setObject(id,newObj)
                    475:     if RESPONSE is not None:
                    476:         RESPONSE.redirect('manage_main')
                    477: 
                    478:     

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