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: """
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
21: import Globals
22: from Globals import package_home
23: from AccessControl import ClassSecurityInfo
24:
25:
26: class OSAS_handlerObject(Folder):
27: """
28: Grundlegende Klasse fuer Handler zur Zeit noch in Entwicklung
29:
30: """
31: meta_type="OSAS_HandlerObject__neu"
32:
33:
34: def __init__(self,id,title,prefix,objectTypes,ignorePath=""):
35: """inititialisiere die Klasse
36:
37: :Parameters:
38: - `id` : Zope ID des Objektes
39: - `title`: Titel des Objektes
40: - `prefix` : URL bzw. URL Rumpf der Zusammen mit dem Pfad des Objectes die Anzeige URL ergibt
41: - `objectType` : liste von Objekttypen die mittels dieses Handlers angezeigt werden können.
42: - `ignorePath` : Pfad der bei dem übergebenen Pfad element ingnoriert werden soll. Optional.
43: """
44: self.id=id
45: self.title=title
46: self.prefix=prefix
47: self.objectTypes=toList(objectTypes)
48: self.ignorePath=ignorePath
49:
50: manage_options = Folder.manage_options+(
51: {'label':'Main Config','action':'changeHandlerObjectForm'},
52: )
53:
54: def changeHandlerObjectForm(self):
55: """Main configuration"""
56: pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeHandlerObjectForm.zpt')).__of__(self)
57: return pt()
58:
59: def changeHandlerObject(self,title,prefix,objectTypes,ignorePath=None,RESPONSE=None):
60: """Change RootFolderName"""
61: self.title=title
62: self.prefix=prefix
63: self.ignorePath=ignorePath
64: self.objectTypes=toList(objectTypes)
65:
66: if RESPONSE is not None:
67: RESPONSE.redirect('manage_main')
68:
69:
70: def manage_addHandlerObjectForm(self):
71: """form for adding a handler Object"""
72: pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','addHandlerObjectForm.zpt')).__of__(self)
73: return pt()
74:
75: def manage_addHandlerObject(self,id,title,prefix,objectTypes,ignorePath,RESPONSE=None):
76: """add the OSAS_root"""
77: newObj=OSAS_handlerObject(id,title,prefix,objectTypes,ignorePath)
78: self._setObject(id,newObj)
79:
80: if RESPONSE is not None:
81: RESPONSE.redirect('manage_main')
82:
83:
84: class OSAS_root(Folder,Implicit):
85: """Implicit Folder of the Storage Systems"""
86:
87: security=ClassSecurityInfo()
88:
89: def __init__(self,id,rootFolderName,serverUrl,uploadServletUrl=None):
90: """initialize a new instance
91:
92:
93: @param id: Zope ID des Objektes
94: @param rootFolderName : path zum root folder des Storagesystems
95: @param uploadServerletUrl : url des UploadServlets (required fuer batch upload)
96:
97: """
98:
99: self.id = id
100: self.rootFolderName = rootFolderName
101: self.uploadServletUrl=uploadServletUrl
102: self.serverUrl=serverUrl
103: meta_type="OSAS_Root"
104:
105: manage_options = Folder.manage_options+(
106: {'label':'Main Config','action':'changeRootForm'},
107: )
108:
109:
110: OSASObjectTypes=OSAS_helpers.OSASObjectTypes
111:
112: security.declareProtected("View management screens","getOSASObjectTypes")
113: def getOSASObjectTypes(self):
114: """return list of objecttypes"""
115: return OSASObjectTypes
116:
117: def setProxy(self,name,value):
118: """set proxy"""
119: self.REQUEST.SESSION[name]=value
120: return True
121:
122: def listToSingle(self,path):
123: """list to single"""
124: if type(path)==ListType:
125: return path[0]
126: else:
127: return path
128:
129: def splitPath(self,path):
130: """split path"""
131: if type(path)==ListType:
132: path=path[0]
133: return os.path.split(path)
134:
135: def changeRootForm(self):
136: """Main configuration"""
137: pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt','changeRootForm.zpt')).__of__(self)
138:
139: return pt()
140:
141: def changeRoot(self,rootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
142: """Change RootFolderName"""
143: self.rootFolderName=rootFolderName
144: self.serverUrl=serverUrl
145: self.uploadServletUrl=uploadServletUrl
146:
147: if RESPONSE is not None:
148: RESPONSE.redirect('manage_main')
149:
150: localDate=localDate
151:
152: def getUploadServletUrl(self):
153: """gibt url des servlets zurueck"""
154: return self.uploadServletUrl
155:
156:
157: def validateIndexMeta(self,data):
158: """TO BE DONE testet ob data ein gueltiges index.meta file ist, zur Zeit wird dom erzeugt ohne validierung.
159: @param data: zu testendes XML file als string
160: @return: zeiger auf dom falls ok, None andernfalls (z.Z: immmer dom falls parse possible)
161: """
162: try:
163: return xml.dom.minidom.parseString(xmlneu)
164: except:
165: return None
166:
167: security.declareProtected('View management screens','uploadExternalXMLString','uploadExternalXMLUrl','uploadExternalXML')
168:
169: def uploadExternalXMLString(self,index_meta_url,xml_string):
170: """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
171:
172: @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server.
173: @param xml_string: string mit index_meta ersetzt obiges index.meta
174: @return: 'error' als String bei Fehler 'ok' bei ok.
175: """
176:
177: return self.uploadExternalXML(index_meta_url,xml_string)
178:
179:
180: def uploadExternalXMLUrl(self,index_meta_url,xml_url):
181: """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
182:
183: @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server.
184: @param xml_url: externe url auf ein index_meta ersetzt obiges index.meta
185: @return: 'error' als String bei Fehler 'ok' bei ok.
186: """
187:
188: return self.uploadExternalXML(index_meta_url,xml_url)
189:
190:
191: def uploadExternalXML(self,index_meta_url,xml_url=None,xml_string=None):
192: """lese ein xml file aus xml_url und schreibe es in den lokalen Filebaum
193:
194: @param index_meta_url: url eines index.meta files auf dem lokalen Server, es gilt rootFolderName + pfad teil der url = pfad auf dem Server.
195: @param xml_url: (optional, default=None) externe url auf ein index_meta ersetzt obiges index.meta
196: @param xml_string: (optional, default=None) string mit index_meta ersetzt obiges index.meta
197: @return: 'error' als String bei Fehler 'ok' bei ok.
198: """
199:
200: if xml_url:
201: xmlneu=urllib.urlopen(xml_url).read()
202: else:
203: xmlneu=xml_string
204:
205: dom=self.validateIndexMeta(xmlneu)
206: if not dom:
207: zLOG.LOG('OSAS_Root (downloadExternalXML)',zLOG.ERROR,'cannot parse: %s', xml_url)
208: return "error"
209:
210:
211: path=self.rootFolderName+urlparse(index_meta_url)[2]
212:
213: fh=open(path,'w')
214:
215: fh.write(xmlneu)
216: fh.close()
217: return "ok"
218:
219: security.declareProtected('View','getIndexMetaFile')
220:
221:
222: def getIndexMetaFile(self,index_meta):
223: """gibt index metafile aus
224: @param index_meta: index_meta ist eine URI entweder url des index_meta oder file mit file://
225: """
226: filearray=[]
227: urlparsed=urlparse(index_meta)[1:]
228:
229: for x in urlparsed:
230:
231: if not (x==''):
232: filearray.append(x)
233:
234: path=os.sep.join(filearray)
235:
236: realPath=os.path.normpath(os.path.join(self.rootFolderName,path))
237:
238: if realPath.find(self.rootFolderName) <0: #versuch auf Pfad unterhalb des Rootfolder zuzugreifen
239: return {}
240:
241:
242: if not os.path.isfile(realPath):
243: return None,"(ERROR) path %s does not exist."%path
244:
245:
246: fh=file(realPath,'r')
247: str=fh.read()
248: fh.close()
249: return str
250:
251:
252: Globals.InitializeClass(OSAS_root)
253:
254: def manage_addOSAS_rootForm(self):
255: """interface for adding the OSAS_root"""
256: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addOSAS_rootForm.zpt')).__of__(self)
257: return pt()
258:
259: def manage_addOSAS_root(self,id,RootFolderName,uploadServletUrl,serverUrl,RESPONSE=None):
260: """add the OSAS_root"""
261: newObj=OSAS_root(id,RootFolderName,serverUrl,uploadServletUrl)
262: self._setObject(id,newObj)
263: if RESPONSE is not None:
264: RESPONSE.redirect('manage_main')
265:
266:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>