version 1.1, 2004/11/29 09:48:07
|
version 1.10, 2005/04/13 16:29:54
|
Line 1
|
Line 1
|
""" 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 * |
from OSAS_helpers import * |
import OSAS_helpers |
import OSAS_helpers |
Line 15 import xml.dom.minidom
|
Line 18 import xml.dom.minidom
|
from types import * |
from types import * |
import zLOG |
import zLOG |
import os.path |
import os.path |
|
import Globals |
from Globals import package_home |
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="<b>" |
|
end="</b>" |
|
|
|
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" |
|
|
|
|
|
|
|
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)] |
|
|
|
|
|
|
|
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="file:///Volumes/einstein_movies/"+lowresPath+"/"+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: |
|
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']+'/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_viewerObject(Folder): |
|
|
|
|
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=""): |
def __init__(self,id,title,prefix,objectTypes,ignorePath=""): |
"""inititialisiere die Klasse |
"""inititialisiere die Klasse |
Line 32 class OSAS_viewerObject(Folder):
|
Line 232 class OSAS_viewerObject(Folder):
|
- `id` : Zope ID des Objektes |
- `id` : Zope ID des Objektes |
- `title`: Titel des Objektes |
- `title`: Titel des Objektes |
- `prefix` : URL bzw. URL Rumpf der Zusammen mit dem Pfad des Objectes die Anzeige URL ergibt |
- `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. |
- `ignorePath` : Pfad der bei dem übergebenen Pfad element ingnoriert werden soll. Optional. |
""" |
""" |
self.id=id |
self.id=id |
Line 42 class OSAS_viewerObject(Folder):
|
Line 242 class OSAS_viewerObject(Folder):
|
self.ignorePath=ignorePath |
self.ignorePath=ignorePath |
|
|
manage_options = Folder.manage_options+( |
manage_options = Folder.manage_options+( |
{'label':'Main Config','action':'changeViewerObjectForm'}, |
{'label':'Main Config','action':'changeHandlerObjectForm'}, |
) |
) |
|
|
def changeViewerObjectForm(self): |
def changeHandlerObjectForm(self): |
"""Main configuration""" |
"""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() |
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""" |
"""Change RootFolderName""" |
self.title=title |
self.title=title |
self.prefix=prefix |
self.prefix=prefix |
self.ignorePath=ignorePath |
self.ignorePath=ignorePath |
self.objectTypes=toList(objectTypes) |
self.objectTypes=toList(objectTypes) |
|
self.newTarget=newTarget |
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
RESPONSE.redirect('manage_main') |
|
|
|
|
def manage_addViewerObjectForm(self): |
def manage_addHandlerObjectForm(self): |
"""form for adding a viewer Object""" |
"""form for adding a handler Object""" |
pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addViewerObjectForm.zpt')).__of__(self) |
pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addHandlerObjectForm.zpt')).__of__(self) |
return pt() |
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""" |
"""add the OSAS_root""" |
newObj=OSAS_viewerObject(id,title,prefix,objectTypes,ignorePath) |
newObj=OSAS_handlerObject(id,title,prefix,objectTypes,ignorePath) |
self._setObject(id,newObj) |
self._setObject(id,newObj) |
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
Line 77 def manage_addViewerObject(self,id,title
|
Line 278 def manage_addViewerObject(self,id,title
|
|
|
class OSAS_root(Folder,Implicit): |
class OSAS_root(Folder,Implicit): |
"""Implicit Folder of the Storage Systems""" |
"""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 |
"""initialize a new instance |
|
|
|
|
Line 90 class OSAS_root(Folder,Implicit):
|
Line 294 class OSAS_root(Folder,Implicit):
|
self.id = id |
self.id = id |
self.rootFolderName = rootFolderName |
self.rootFolderName = rootFolderName |
self.uploadServletUrl=uploadServletUrl |
self.uploadServletUrl=uploadServletUrl |
|
self.serverUrl=serverUrl |
meta_type="OSAS_Root__neu" |
meta_type="OSAS_Root" |
|
|
manage_options = Folder.manage_options+( |
manage_options = Folder.manage_options+( |
{'label':'Main Config','action':'changeRootForm'}, |
{'label':'Main Config','action':'changeRootForm'}, |
Line 100 class OSAS_root(Folder,Implicit):
|
Line 304 class OSAS_root(Folder,Implicit):
|
|
|
OSASObjectTypes=OSAS_helpers.OSASObjectTypes |
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): |
def changeRootForm(self): |
"""Main configuration""" |
"""Main configuration""" |
pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeRootForm.zpt')).__of__(self) |
pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeRootForm.zpt')).__of__(self) |
|
|
return pt() |
return pt() |
|
|
def changeRoot(self,rootFolderName,uploadServletUrl,RESPONSE=None): |
def changeRoot(self,rootFolderName,uploadServletUrl,serverUrl,RESPONSE=None): |
"""Change RootFolderName""" |
"""Change RootFolderName""" |
self.rootFolderName=rootFolderName |
self.rootFolderName=rootFolderName |
|
self.serverUrl=serverUrl |
self.uploadServletUrl=uploadServletUrl |
self.uploadServletUrl=uploadServletUrl |
|
|
if RESPONSE is not None: |
if RESPONSE is not None: |
Line 122 class OSAS_root(Folder,Implicit):
|
Line 366 class OSAS_root(Folder,Implicit):
|
return self.uploadServletUrl |
return self.uploadServletUrl |
|
|
|
|
def downloadExternalXML(self,index_meta_url,xml_url): |
def validateIndexMeta(self,data): |
"""lade lese ein xml file aus URL und schreibe es in den localen Filebaum |
"""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 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: 'error' als String bei Fehler 'ok' bei ok. |
""" |
""" |
|
|
|
return self.uploadExternalXML(index_meta_url,xml_string) |
|
|
xmlneu=urllib.urlopen(xml_url).read() |
|
|
|
try: |
def uploadExternalXMLUrl(self,index_meta_url,xml_url): |
dom=xml.dom.minidom.parseString(xmlneu) |
"""lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum |
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: 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) |
|
|
|
|
|
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 |
|
|
|
@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) |
zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url) |
return "error" |
return "error" |
|
|
Line 149 class OSAS_root(Folder,Implicit):
|
Line 428 class OSAS_root(Folder,Implicit):
|
fh.close() |
fh.close() |
return "ok" |
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): |
def manage_addOSAS_rootForm(self): |
"""interface for adding the OSAS_root""" |
"""interface for adding the OSAS_root""" |
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self) |
pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self) |
return pt() |
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""" |
"""add the OSAS_root""" |
newObj=OSAS_root(id,RootFolderName,uploadServletUrl) |
newObj=OSAS_root(id,RootFolderName,serverUrl,uploadServletUrl) |
self._setObject(id,newObj) |
self._setObject(id,newObj) |
if RESPONSE is not None: |
if RESPONSE is not None: |
RESPONSE.redirect('manage_main') |
RESPONSE.redirect('manage_main') |