--- OSA_system2/OSAS_root.py 2004/11/29 09:48:07 1.1
+++ OSA_system2/OSAS_root.py 2007/01/31 14:30:30 1.13
@@ -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
@@ -13,17 +16,223 @@ from urlparse import *
import re
import xml.dom.minidom
from types import *
-import zLOG
+import logging
+
+#ersetzt logging
+def logger(txt,method,txt2):
+ """logging"""
+ logging.info(txt+ txt2)
+
+
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:
+ logger('OSAS_Root (addFileToDollection)',logging.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)]
+
+
+
+ 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,label,description,content_type,responsible,weight,thumb="",streamingfile="",rawfile="",lowresfile="",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/","")
+ lowresPath=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
+ lowresFile="rtsp://einst1.mpiwg-berlin.mpg.de/"+gifPath+"/"+lowresfile
+
+
+ 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})
+
+
+ try:
+ server=xmlrpclib.Server(collection,allow_none=True)
+ retStr=server.addMovie(id,title,label,description,content_type,responsible,link,thumbUrl,rawFile,lowresFile,metalink,weight,credits)
+ except:
+ logger('OSAS_Root (addFileToDollection2)',logging.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"
-class OSAS_viewerObject(Folder):
+ 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']+'/browse?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 +241,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 +251,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 +287,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 +303,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 +312,46 @@ class OSAS_root(Folder,Implicit):
OSASObjectTypes=OSAS_helpers.OSASObjectTypes
+
+ def extendDict(self,dict1,dict2):
+ """add two dicts"""
+ ret=dict1
+ for name in dict2.keys():
+ ret[name]=dict2[name]
+ return ret
+
+
+ def generateMovieThumb(self,name):
+ """generate movie"""
+ server=xmlrpclib.Server(self.serverUrl)
+ name="/mpiwg/online/permanent/einstein_exhibition/movies/"+name
+
+
+ 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 +359,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,22 +375,57 @@ 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.
+ """
- zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url)
+ if xml_url:
+ xmlneu=urllib.urlopen(xml_url).read()
+ else:
+ xmlneu=xml_string
+
+ dom=self.validateIndexMeta(xmlneu)
+ if not dom:
+ logger('OSAS_Root (downloadExternalXML)',logging.ERROR,'cannot parse: %s', xml_url)
return "error"
@@ -149,15 +437,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')