1
2
3
4
5
6
7
8
9
10
11
12
13 import marshal, re, sys, time
14
15 import Globals, App.Management, Acquisition, App.Undo
16 import AccessControl.Role, AccessControl.Owned, App.Common
17 from webdav.Resource import Resource
18 from ExtensionClass import Base
19 from ComputedAttribute import ComputedAttribute
20 from AccessControl import getSecurityManager, Unauthorized
21 from AccessControl.ZopeSecurityPolicy import getRoles
22 from Acquisition import aq_base, aq_parent, aq_inner, aq_acquire
23 from DocumentTemplate.html_quote import html_quote
24 from DocumentTemplate.ustr import ustr
25 from zExceptions.ExceptionFormatter import format_exception
26 from zExceptions import Redirect
27
28 from OFS.CopySupport import CopySource
29 from OFS.Traversable import Traversable
30
31 HTML=Globals.HTML
32
33 import logging
34 logger = logging.getLogger()
35
36
37
38 -class ZItem(Base, CopySource, App.Management.Tabs, Traversable,
39 AccessControl.Owned.Owned,
40 ):
41
42
43 """A common base class for simple, non-container objects."""
44
45 isPrincipiaFolderish=0
46 isTopLevelPrincipiaApplicationObject=0
47
50
53
56
57
58 id=''
59
60 getId__roles__=None
62 """Return the id of the object as a string.
63
64 This method should be used in preference to accessing an id attribute
65 of an object directly. The getId method is public.
66 """
67 name=getattr(self, 'id', None)
68 if callable(name):
69 return name()
70 if name is not None:
71 return name
72 if hasattr(self, '__name__'):
73 return self.__name__
74 raise AttributeError, 'This object has no id'
75
76
77 __name__=ComputedAttribute(lambda self: self.getId())
78
79
80
81 icon=''
82
83
84 meta_type='simple item'
85
86
87 title=''
88
89
90 __propsets__=()
91
92 manage_options=(
93
94 AccessControl.Owned.Owned.manage_options
95 )
96
97
98 REQUEST=Acquisition.Acquired
99
100
101 __allow_access_to_unprotected_subobjects__=1
102
111
113 """Return the title if it is not blank and the id otherwise.
114
115 If the title is not blank, then the id is included in parens.
116 """
117 title=self.title
118 if callable(title):
119 title=title()
120 id = self.getId()
121 return title and ("%s (%s)" % (title,id)) or id
122
126
128
129 return self.getId()
130
134
135 _manage_editedDialog=Globals.DTMLFile('dtml/editedDialog', globals())
138
145
146 try:
147 if error_type is None: error_type =sys.exc_info()[0]
148 if error_value is None: error_value=sys.exc_info()[1]
149
150
151 if tb is None and error_tb is None:
152 tb=sys.exc_info()[2]
153 if type(tb) is not type('') and (error_tb is None):
154 error_tb = pretty_tb(error_type, error_value, tb)
155 elif type(tb) is type('') and not error_tb:
156 error_tb = tb
157
158
159 if hasattr(error_type, '__name__'):
160 error_type=error_type.__name__
161
162 if hasattr(self, '_v_eek'):
163
164 raise error_type, error_value, tb
165 self._v_eek=1
166
167 if str(error_type).lower() in ('redirect',):
168 raise error_type, error_value, tb
169
170 if not error_message:
171 try:
172 s = ustr(error_value)
173 except:
174 s = error_value
175 try:
176 match = tagSearch(s)
177 except TypeError:
178 match = None
179 if match is not None:
180 error_message=error_value
181
182 if client is None: client=self
183 if not REQUEST: REQUEST=self.aq_acquire('REQUEST')
184
185 try:
186 if hasattr(client, 'standard_error_message'):
187 s=getattr(client, 'standard_error_message')
188 else:
189 client = client.aq_parent
190 s=getattr(client, 'standard_error_message')
191 kwargs = {'error_type': error_type,
192 'error_value': error_value,
193 'error_tb': error_tb,
194 'error_traceback': error_tb,
195 'error_message': error_message,
196 'error_log_url': error_log_url}
197
198 if getattr(aq_base(s),'isDocTemp',0):
199 v = s(client, REQUEST, **kwargs)
200 elif callable(s):
201 v = s(**kwargs)
202 else:
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
226 """
227 """
228 raise Redirect, "%s/manage_main" % URL1
229
230
231
234 objectIds=objectItems=objectValues
235
236
237
239 """Psuedo stat, used by FTP for directory listings.
240 """
241 from AccessControl.User import nobody
242 mode=0100000
243
244 if (hasattr(aq_base(self),'manage_FTPget')):
245 try:
246 if getSecurityManager().validate(
247 None, self, 'manage_FTPget', self.manage_FTPget):
248 mode=mode | 0440
249 except Unauthorized:
250 pass
251
252 if nobody.allowed(
253 self.manage_FTPget,
254 getRoles(self, 'manage_FTPget', self.manage_FTPget, ()),
255 ):
256 mode=mode | 0004
257
258
259 if hasattr(aq_base(self),'PUT'):
260 try:
261 if getSecurityManager().validate(None, self, 'PUT', self.PUT):
262 mode=mode | 0220
263 except Unauthorized:
264 pass
265
266 if nobody.allowed(
267 self.PUT,
268 getRoles(self, 'PUT', self.PUT, ()),
269 ):
270 mode=mode | 0002
271
272
273 if hasattr(aq_base(self), 'get_size'):
274 size=self.get_size()
275 elif hasattr(aq_base(self),'manage_FTPget'):
276 size=len(self.manage_FTPget())
277 else:
278 size=0
279
280 if hasattr(aq_base(self), 'bobobase_modification_time'):
281 mtime=self.bobobase_modification_time().timeTime()
282 else:
283 mtime=time.time()
284
285 owner=group='Zope'
286 if hasattr(aq_base(self), 'get_local_roles'):
287 for user, roles in self.get_local_roles():
288 if 'Owner' in roles:
289 owner=user
290 break
291 return marshal.dumps((mode,0,0,1,owner,group,size,mtime,mtime,mtime))
292
294 """Directory listing for FTP.
295
296 In the case of non-Foldoid objects, the listing should contain one
297 object, the object itself.
298 """
299
300 ob=self
301 while 1:
302 if App.Common.is_acquired(ob):
303 raise ValueError('FTP List not supported on acquired objects')
304 if not hasattr(ob,'aq_parent'):
305 break
306 ob=ob.aq_parent
307
308 stat=marshal.loads(self.manage_FTPstat(REQUEST))
309 id = self.getId()
310 return marshal.dumps((id,stat))
311
314
316 """Show the physical path of the object and its context if available.
317 """
318 try:
319 path = '/'.join(self.getPhysicalPath())
320 except:
321 return Base.__repr__(self)
322 context_path = None
323 context = aq_parent(self)
324 container = aq_parent(aq_inner(self))
325 if aq_base(context) is not aq_base(container):
326 try:
327 context_path = '/'.join(context.getPhysicalPath())
328 except:
329 context_path = None
330 res = '<%s' % self.__class__.__name__
331 res += ' at %s' % path
332 if context_path:
333 res += ' used for %s' % context_path
334 res += '>'
335 return res
336
338 tb = format_exception(t, v, tb, as_html=as_html)
339 tb = '\n'.join(tb)
340 return tb
341