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+" "+" "
! 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>