1
2
3
4
5
6
7
8
9
10
11
12
13 import marshal, re, sys, time
14
15 import Globals, Acquisition
16 import App
17 import App.Management
18 import AccessControl
19 import AccessControl.Role, AccessControl.Owned, App.Common
20 from ExtensionClass import Base
21 from ComputedAttribute import ComputedAttribute
22 from AccessControl import getSecurityManager, Unauthorized
23 from AccessControl.ZopeSecurityPolicy import getRoles
24 from Acquisition import aq_base, aq_parent, aq_inner
25 from DocumentTemplate.html_quote import html_quote
26 from DocumentTemplate.ustr import ustr
27 from zExceptions.ExceptionFormatter import format_exception
28 from zExceptions import Redirect
29
30 from OFS.CopySupport import CopySource
31 from OFS.Traversable import Traversable
32
33 from Products.ZenUtils.Utils import unused
34
35
36 HTML=Globals.HTML
37
38 import logging
39 logger = logging.getLogger()
40
41 -class ZItem(Base, CopySource, App.Management.Tabs, Traversable,
42 AccessControl.Owned.Owned,
43 ):
44
45
46 """A common base class for simple, non-container objects."""
47
48 isPrincipiaFolderish=0
49 isTopLevelPrincipiaApplicationObject=0
50
51
52 id=''
53
54 getId__roles__=None
56 """Return the id of the object as a string.
57
58 This method should be used in preference to accessing an id attribute
59 of an object directly. The getId method is public.
60 """
61 name=getattr(self, 'id', None)
62 if callable(name):
63 return name()
64 if name is not None:
65 return name
66 if hasattr(self, '__name__'):
67 return self.__name__
68 raise AttributeError, 'This object has no id'
69
70
71 __name__=ComputedAttribute(lambda self: self.getId())
72
73
74
75 icon=''
76
77
78 meta_type='simple item'
79
80
81 title=''
82
83
84 __propsets__=()
85
86 manage_options=(
87 AccessControl.Owned.Owned.manage_options
88 )
89
90
91 REQUEST=Acquisition.Acquired
92
93
94 __allow_access_to_unprotected_subobjects__=1
95
104
106 """Return the title if it is not blank and the id otherwise
107 """
108 return self.title_or_id()
109
111 """Return the title if it is not blank and the id otherwise.
112
113 If the title is not blank, then the id is included in parens.
114 """
115 title=self.title
116 if callable(title):
117 title=title()
118 id = self.getId()
119 return title and ("%s (%s)" % (title,id)) or id
120
124
126
127 return self.getId()
128
132
133 _manage_editedDialog=Globals.DTMLFile('dtml/editedDialog', globals())
136
137 """
138 def raise_standardErrorMessage(
139 self, client=None, REQUEST={},
140 error_type=None, error_value=None, tb=None,
141 error_tb=None, error_message='',
142 tagSearch=re.compile(r'[a-zA-Z]>').search,
143 error_log_url=''):
144
145 try:
146 if error_type is None: error_type =sys.exc_info()[0]
147 if error_value is None: error_value=sys.exc_info()[1]
148
149 # allow for a few different traceback options
150 if tb is None and error_tb is None:
151 tb=sys.exc_info()[2]
152 if type(tb) is not type('') and (error_tb is None):
153 error_tb = pretty_tb(error_type, error_value, tb)
154 elif type(tb) is type('') and not error_tb:
155 error_tb = tb
156
157 # turn error_type into a string
158 if hasattr(error_type, '__name__'):
159 error_type=error_type.__name__
160
161 if hasattr(self, '_v_eek'):
162 # Stop if there is recursion.
163 raise error_type, error_value, tb
164 self._v_eek=1
165
166 if str(error_type).lower() in ('redirect',):
167 raise error_type, error_value, tb
168
169 if not error_message:
170 try:
171 s = ustr(error_value)
172 except:
173 s = error_value
174 try:
175 match = tagSearch(s)
176 except TypeError:
177 match = None
178 if match is not None:
179 error_message=error_value
180
181 if client is None: client=self
182 if not REQUEST: REQUEST=self.aq_acquire('REQUEST')
183
184 try:
185 if hasattr(client, 'standard_error_message'):
186 s=client.standard_error_message
187 else:
188 client = client.aq_parent
189 s=client.standard_error_message
190 kwargs = {'error_type': error_type,
191 'error_value': error_value,
192 'error_tb': error_tb,
193 'error_traceback': error_tb,
194 'error_message': error_message,
195 'error_log_url': error_log_url}
196
197 if getattr(aq_base(s),'isDocTemp',0):
198 v = s(client, REQUEST, **kwargs)
199 elif callable(s):
200 v = s(**kwargs)
201 else:
202 __pychecker__='self="s"'
203 v = HTML.__call__(s, client, REQUEST, **kwargs)
204 except:
205 logger.error(
206 'Exception while rendering an error message',
207 exc_info=True
208 )
209 try:
210 strv = str(error_value)
211 except:
212 strv = ('<unprintable %s object>' %
213 str(type(error_value).__name__))
214 v = strv + (
215 (" (Also, the following error occurred while attempting "
216 "to render the standard error message, please see the "
217 "event log for full details: %s)")%(
218 html_quote(sys.exc_info()[1]),
219 ))
220 raise error_type, v, tb
221 finally:
222 if hasattr(self, '_v_eek'): del self._v_eek
223 tb=None
224 """
225
227 """
228 """
229 raise Redirect, "%s/manage_main" % URL1
230
231
232
234 unused(spec)
235 return ()
236 objectIds=objectItems=objectValues
237
238
239
241 """Psuedo stat, used by FTP for directory listings.
242 """
243 from AccessControl.User import nobody
244 mode=0100000
245
246 if (hasattr(aq_base(self),'manage_FTPget')):
247 try:
248 if getSecurityManager().validate(
249 None, self, 'manage_FTPget', self.manage_FTPget):
250 mode=mode | 0440
251 except Unauthorized:
252 pass
253
254 if nobody.allowed(
255 self.manage_FTPget,
256 getRoles(self, 'manage_FTPget', self.manage_FTPget, ()),
257 ):
258 mode=mode | 0004
259
260
261 if hasattr(aq_base(self),'PUT'):
262 try:
263 if getSecurityManager().validate(None, self, 'PUT', self.PUT):
264 mode=mode | 0220
265 except Unauthorized:
266 pass
267
268 if nobody.allowed(
269 self.PUT,
270 getRoles(self, 'PUT', self.PUT, ()),
271 ):
272 mode=mode | 0002
273
274
275 if hasattr(aq_base(self), 'get_size'):
276 size=self.get_size()
277 elif hasattr(aq_base(self),'manage_FTPget'):
278 size=len(self.manage_FTPget())
279 else:
280 size=0
281
282 if hasattr(aq_base(self), 'bobobase_modification_time'):
283 mtime=self.bobobase_modification_time().timeTime()
284 else:
285 mtime=time.time()
286
287 owner=group='Zope'
288 if hasattr(aq_base(self), 'get_local_roles'):
289 for user, roles in self.get_local_roles():
290 if 'Owner' in roles:
291 owner=user
292 break
293 return marshal.dumps((mode,0,0,1,owner,group,size,mtime,mtime,mtime))
294
296 """Directory listing for FTP.
297
298 In the case of non-Foldoid objects, the listing should contain one
299 object, the object itself.
300 """
301
302 ob=self
303 while 1:
304 if App.Common.is_acquired(ob):
305 raise ValueError('FTP List not supported on acquired objects')
306 if not hasattr(ob,'aq_parent'):
307 break
308 ob=ob.aq_parent
309
310 stat=marshal.loads(self.manage_FTPstat(REQUEST))
311 id = self.getId()
312 return marshal.dumps((id,stat))
313
316
318 """Show the physical path of the object and its context if available.
319 """
320 try:
321 path = '/'.join(self.getPhysicalPath())
322 except:
323 return Base.__repr__(self)
324 context_path = None
325 context = aq_parent(self)
326 container = aq_parent(aq_inner(self))
327 if aq_base(context) is not aq_base(container):
328 try:
329 context_path = '/'.join(context.getPhysicalPath())
330 except:
331 context_path = None
332 res = '<%s' % self.__class__.__name__
333 res += ' at %s' % path
334 if context_path:
335 res += ' used for %s' % context_path
336 res += '>'
337 return res
338
340 tb = format_exception(t, v, tb, as_html=as_html)
341 tb = '\n'.join(tb)
342 return tb
343
344
345
346