Annotation of OSA_system2/OSAS_root.py, revision 1.6

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

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