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