--- OSA_system2/OSAS_root.py 2004/11/29 09:48:07 1.1.1.1 +++ OSA_system2/OSAS_root.py 2005/03/07 21:25:41 1.7 @@ -1,4 +1,7 @@ -""" OSAS_contains the basic classes for configuring the OSAS and basic objects for displaying data. All site specific adaptation should be made in OSAS_Root""" +""" OSAS_contains the basic classes for configuring the OSAS and +basic objects for displaying data. +All site specific adaptation should be made in OSAS_Root +""" from OSAS_helpers import * import OSAS_helpers @@ -15,15 +18,210 @@ import xml.dom.minidom from types import * import zLOG import os.path +import Globals from Globals import package_home +from AccessControl import ClassSecurityInfo +import xmlrpclib +from xml.sax import make_parser +from xml.sax.handler import ContentHandler +import sys +class OSAS_add_contextData(Folder): + """Einfuegen eines Documentes in eine Collection""" + + security=ClassSecurityInfo() + + + meta_type='OSAS_addObjectToCollection' + + def XmlToTree(self,URL,pwstr=None): + """Collection XML to Tree""" + def spaces(depth): + + tmp="" + k=0 + while k<2*depth: + k+=1 + tmp=tmp+" "+" " + return tmp + + class requestHandler(ContentHandler): + def __init__(self): + self.depth=0 + self.retStr="" + + def startElement(self,name,attrs): + if name=="element": + self.depth+=1 + begin="" + end="" + if self.depth==1: + begin="" + end="" + + self.retStr+=spaces(self.depth)+"%s"%(attrs.get('url'),begin+urllib.unquote(attrs.get('name')))+end+"
\n" + + + + def endElement(self,name): + if name=="element": + self.depth-=1 + + if pwstr=="": + pwstr=None + + + + try: + if pwstr: + URL+="/getCollectionTreeXML?pwstr=%s"%pwstr + else: + URL+="/getCollectionTreeXML" + parser=make_parser() + curHandler=requestHandler() + parser.setContentHandler(curHandler) + + parser.parse(urllib.urlopen(URL)) + return curHandler.retStr.encode('utf-8') + + except: + zLOG.LOG('OSAS_Root (addFileToDollection)',zLOG.ERROR,'%s %s'%sys.exc_info()[:2]) + return URL + return urllib.urlopen(URL).read() + + + def __init__(self,id,collection): + self.id=id + self.collection=collection + + + + + def getPartners(self,URL): + """Zeige Partnerliste""" + class requestHandler(ContentHandler): + def __init__(self): + self.ret=[] + + def startElement(self,name,attrs): + if name=="partner": + self.ret.append((attrs.get('id'),attrs.get('title').encode('utf-8'))) + + + URL+="/getPartnersXML" + parser=make_parser() + curHandler=requestHandler() + parser.setContentHandler(curHandler) + parser.parse(urllib.urlopen(URL)) + try: + + return curHandler.ret + except: + return [("",URL)] -class OSAS_viewerObject(Folder): + + + def addContextData(self,path): + """Hinzufuegen zu einer Sammlung""" + + server=xmlrpclib.Server(self.serverUrl) + + + self.REQUEST.SESSION['images']=server.getImages(path) + + + self.REQUEST.SESSION['movies']=server.getMovies(path) + + + + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','contextDataMain.zpt')).__of__(self) + return pt() + + index_html=addContextData + + def addContextData2(self,path,collection,thumb,streamingfile,rawfile,label,description,content_type,responsible,weight,credits=None): + """Hinzufuegen der Resource""" + splitted=path.split("/") + #print "BLU" + id=splitted[len(splitted)-1] + title=splitted[len(splitted)-1] + metalink=self.REQUEST['SERVER_URL']+path+"/index.meta" + + #link=TOBEDONE" + """Hinzufuegen der Ressource""" + gifPath=path.replace("/mpiwg/online/","") + rawPath=path.replace("/mpiwg/online/permanent/einstein_exhibition/movies/","") + thumbUrl="http://einst3.mpiwg-berlin.mpg.de/"+gifPath+"/"+thumb + link="rtsp://einst1.mpiwg-berlin.mpg.de/"+gifPath+"/"+streamingfile + rawFile="file:///Volumes/einstein_movies/"+rawPath+"/"+rawfile + + + 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}) + + #retStr=urllib.urlopen(collection+"/addMovie",params).read() + try: + server=xmlrpclib.Server(collection,allow_none=True) + retStr=server.addMovie(id,title,label,description,content_type,responsible,link,thumbUrl,rawFile,metalink,weight,credits) + except: + zLOG.LOG('OSAS_Root (addFileToDollection2)',zLOG.ERROR,'%s %s'%sys.exc_info()[:2]) + return "An Error occured adding the resource\n", collection,params + + #print "added" + if not retStr: + return "An Error occured adding the resource\n", collection,params + + #print collection+"/"+id+"/copyIndex_meta2echo_resource" + + urllib.urlopen(collection+"/"+id+"/copyIndex_meta2echo_resource").read() + #print "copy2res" + urllib.urlopen(collection+"/"+id+"/generate_label").read() + #print "label" + urllib.urlopen(collection+"/"+id+"/generate_title").read() + #print "title" + return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL2']+'?path='+path) + + manage_options = Folder.manage_options+( + {'label':'Main Config','action':'add_contextData_config'}, + ) + + + def add_contextData_config(self): + """Main configuration""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeAddContextData.zpt')).__of__(self) + return pt() + + + def change_OSAS_add_contextData(self,collection,pwstr=None,RESPONSE=None): + """Change""" + self.pwstr=pwstr + self.collection=collection + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + +def manage_AddOSAS_add_contextDataForm(self): + """interface for adding the OSAS_add_Metadata""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addContextData.zpt')).__of__(self) + return pt() + +def manage_AddOSAS_add_contextData(self,id,collection,RESPONSE=None): + """add the OSAS_root""" + newObj=OSAS_add_contextData(id,collection) + self.Destination()._setObject(id,newObj) + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + + + + +class OSAS_handlerObject(Folder): """ - Grundlegende Klasse fuer Viewer zur Zeit noch in Entwicklung + Grundlegende Klasse fuer Handler zur Zeit noch in Entwicklung """ - meta_type="OSAS_ViewerObject__neu" + meta_type="OSAS_HandlerObject__neu" + def __init__(self,id,title,prefix,objectTypes,ignorePath=""): """inititialisiere die Klasse @@ -32,7 +230,7 @@ class OSAS_viewerObject(Folder): - `id` : Zope ID des Objektes - `title`: Titel des Objektes - `prefix` : URL bzw. URL Rumpf der Zusammen mit dem Pfad des Objectes die Anzeige URL ergibt - - `objectType` : liste von Objekttypen die mittels dieses Viewers angezeigt werden können. + - `objectType` : liste von Objekttypen die mittels dieses Handlers angezeigt werden können. - `ignorePath` : Pfad der bei dem übergebenen Pfad element ingnoriert werden soll. Optional. """ self.id=id @@ -42,33 +240,34 @@ class OSAS_viewerObject(Folder): self.ignorePath=ignorePath manage_options = Folder.manage_options+( - {'label':'Main Config','action':'changeViewerObjectForm'}, + {'label':'Main Config','action':'changeHandlerObjectForm'}, ) - def changeViewerObjectForm(self): + def changeHandlerObjectForm(self): """Main configuration""" - pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeViewerObjectForm.zpt')).__of__(self) + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeHandlerObjectForm.zpt')).__of__(self) return pt() - def changeViewerObject(self,title,prefix,objectTypes,ignorePath=None,RESPONSE=None): + def changeHandlerObject(self,title,prefix,objectTypes="",ignorePath=None,newTarget="yes",RESPONSE=None): """Change RootFolderName""" self.title=title self.prefix=prefix self.ignorePath=ignorePath self.objectTypes=toList(objectTypes) + self.newTarget=newTarget if RESPONSE is not None: RESPONSE.redirect('manage_main') -def manage_addViewerObjectForm(self): - """form for adding a viewer Object""" - pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addViewerObjectForm.zpt')).__of__(self) +def manage_addHandlerObjectForm(self): + """form for adding a handler Object""" + pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addHandlerObjectForm.zpt')).__of__(self) return pt() -def manage_addViewerObject(self,id,title,prefix,objectTypes,ignorePath,RESPONSE=None): +def manage_addHandlerObject(self,id,title,prefix,objectTypes,ignorePath,RESPONSE=None): """add the OSAS_root""" - newObj=OSAS_viewerObject(id,title,prefix,objectTypes,ignorePath) + newObj=OSAS_handlerObject(id,title,prefix,objectTypes,ignorePath) self._setObject(id,newObj) if RESPONSE is not None: @@ -77,7 +276,10 @@ def manage_addViewerObject(self,id,title class OSAS_root(Folder,Implicit): """Implicit Folder of the Storage Systems""" - def __init__(self,id,rootFolderName,uploadServletUrl=None): + + security=ClassSecurityInfo() + + def __init__(self,id,rootFolderName,serverUrl,uploadServletUrl=None): """initialize a new instance @@ -90,8 +292,8 @@ class OSAS_root(Folder,Implicit): self.id = id self.rootFolderName = rootFolderName self.uploadServletUrl=uploadServletUrl - - meta_type="OSAS_Root__neu" + self.serverUrl=serverUrl + meta_type="OSAS_Root" manage_options = Folder.manage_options+( {'label':'Main Config','action':'changeRootForm'}, @@ -99,6 +301,38 @@ class OSAS_root(Folder,Implicit): OSASObjectTypes=OSAS_helpers.OSASObjectTypes + + def generateMovieThumb(self,name): + """generate movie""" + server=xmlrpclib.Server(self.serverUrl) + name="/mpiwg/online/permanent/einstein_exhibition/movies/"+name + + print "bl",name,os.path.splitext(name)[0]+".gif" + ret=server.generateMovieThumb(name,os.path.splitext(name)[0]+".gif") + return ret + + security.declareProtected("View management screens","getOSASObjectTypes") + def getOSASObjectTypes(self): + """return list of objecttypes""" + return OSASObjectTypes + + def setProxy(self,name,value): + """set proxy""" + self.REQUEST.SESSION[name]=value + return True + + def listToSingle(self,path): + """list to single""" + if type(path)==ListType: + return path[0] + else: + return path + + def splitPath(self,path): + """split path""" + if type(path)==ListType: + path=path[0] + return os.path.split(path) def changeRootForm(self): """Main configuration""" @@ -106,10 +340,10 @@ class OSAS_root(Folder,Implicit): return pt() - def changeRoot(self,rootFolderName,uploadServletUrl,RESPONSE=None): + def changeRoot(self,rootFolderName,uploadServletUrl,serverUrl,RESPONSE=None): """Change RootFolderName""" self.rootFolderName=rootFolderName - + self.serverUrl=serverUrl self.uploadServletUrl=uploadServletUrl if RESPONSE is not None: @@ -122,21 +356,56 @@ class OSAS_root(Folder,Implicit): return self.uploadServletUrl - def downloadExternalXML(self,index_meta_url,xml_url): - """lade lese ein xml file aus URL und schreibe es in den localen Filebaum + def validateIndexMeta(self,data): + """TO BE DONE testet ob data ein gueltiges index.meta file ist, zur Zeit wird dom erzeugt ohne validierung. + @param data: zu testendes XML file als string + @return: zeiger auf dom falls ok, None andernfalls (z.Z: immmer dom falls parse possible) + """ + try: + return xml.dom.minidom.parseString(xmlneu) + except: + return None + + security.declareProtected('View management screens','uploadExternalXMLString','uploadExternalXMLUrl','uploadExternalXML') + + def uploadExternalXMLString(self,index_meta_url,xml_string): + """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. - @param xml_url: externe url file hier ersetzt obiges index.meta + @param xml_string: string mit index_meta ersetzt obiges index.meta @return: 'error' als String bei Fehler 'ok' bei ok. """ + + return self.uploadExternalXML(index_meta_url,xml_string) + + + def uploadExternalXMLUrl(self,index_meta_url,xml_url): + """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum + @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. + @param xml_url: externe url auf ein index_meta ersetzt obiges index.meta + @return: 'error' als String bei Fehler 'ok' bei ok. + """ + + return self.uploadExternalXML(index_meta_url,xml_url) - xmlneu=urllib.urlopen(xml_url).read() + + def uploadExternalXML(self,index_meta_url,xml_url=None,xml_string=None): + """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum - try: - dom=xml.dom.minidom.parseString(xmlneu) - except: + @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server. + @param xml_url: (optional, default=None) externe url auf ein index_meta ersetzt obiges index.meta + @param xml_string: (optional, default=None) string mit index_meta ersetzt obiges index.meta + @return: 'error' als String bei Fehler 'ok' bei ok. + """ + if xml_url: + xmlneu=urllib.urlopen(xml_url).read() + else: + xmlneu=xml_string + + dom=self.validateIndexMeta(xmlneu) + if not dom: zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url) return "error" @@ -149,15 +418,49 @@ class OSAS_root(Folder,Implicit): fh.close() return "ok" + security.declareProtected('View','getIndexMetaFile') + + + def getIndexMetaFile(self,index_meta): + """gibt index metafile aus + @param index_meta: index_meta ist eine URI entweder url des index_meta oder file mit file:// + """ + filearray=[] + urlparsed=urlparse(index_meta)[1:] + + for x in urlparsed: + + if not (x==''): + filearray.append(x) + + path=os.sep.join(filearray) + + realPath=os.path.normpath(os.path.join(self.rootFolderName,path)) + if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen + return {} + + + if not os.path.isfile(realPath): + return None,"(ERROR) path %s does not exist."%path + + + fh=file(realPath,'r') + str=fh.read() + fh.close() + return str + + +Globals.InitializeClass(OSAS_root) + def manage_addOSAS_rootForm(self): """interface for adding the OSAS_root""" pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self) return pt() -def manage_addOSAS_root(self,id,RootFolderName,uploadServletUrl,RESPONSE=None): +def manage_addOSAS_root(self,id,RootFolderName,uploadServletUrl,serverUrl,RESPONSE=None): """add the OSAS_root""" - newObj=OSAS_root(id,RootFolderName,uploadServletUrl) + newObj=OSAS_root(id,RootFolderName,serverUrl,uploadServletUrl) self._setObject(id,newObj) if RESPONSE is not None: RESPONSE.redirect('manage_main')