Package ZenRelations :: Module ZItem
[hide private]
[frames] | no frames]

Source Code for Module ZenRelations.ZItem

  1  ########################################################################### 
  2  # 
  3  # This program is part of Zenoss Core, an open source monitoring platform. 
  4  # Copyright (C) 2007, Zenoss Inc. 
  5  # 
  6  # This program is free software; you can redistribute it and/or modify it 
  7  # under the terms of the GNU General Public License version 2 as published by 
  8  # the Free Software Foundation. 
  9  # 
 10  # For complete information please visit: http://www.zenoss.com/oss/ 
 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
48 - def manage_afterAdd(self, item, container):
49 pass
50
51 - def manage_beforeDelete(self, item, container):
52 pass
53
54 - def manage_afterClone(self, item):
55 pass
56 57 # Direct use of the 'id' attribute is deprecated - use getId() 58 id='' 59 60 getId__roles__=None
61 - def getId(self):
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 # Alias id to __name__, which will make tracebacks a good bit nicer: 77 __name__=ComputedAttribute(lambda self: self.getId()) 78 79 # Name, relative to SOFTWARE_URL of icon used to display item 80 # in folder listings. 81 icon='' 82 83 # Meta type used for selecting all objects of a given type. 84 meta_type='simple item' 85 86 # Default title. 87 title='' 88 89 # Default propertysheet info: 90 __propsets__=() 91 92 manage_options=( 93 #App.Undo.UndoSupport.manage_options 94 AccessControl.Owned.Owned.manage_options 95 ) 96 97 # Attributes that must be acquired 98 REQUEST=Acquisition.Acquired 99 100 # Allow (reluctantly) access to unprotected attributes 101 __allow_access_to_unprotected_subobjects__=1 102
103 - def title_or_id(self):
104 """Return the title if it is not blank and the id otherwise. 105 """ 106 title=self.title 107 if callable(title): 108 title=title() 109 if title: return title 110 return self.getId()
111
112 - def title_and_id(self):
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
123 - def this(self):
124 # Handy way to talk to ourselves in document templates. 125 return self
126
127 - def tpURL(self):
128 # My URL as used by tree tag 129 return self.getId()
130
131 - def tpValues(self):
132 # My sub-objects as used by the tree tag 133 return ()
134 135 _manage_editedDialog=Globals.DTMLFile('dtml/editedDialog', globals())
136 - def manage_editedDialog(self, REQUEST, **args):
137 return apply(self._manage_editedDialog,(self, REQUEST), args)
138
139 - def raise_standardErrorMessage( 140 self, client=None, REQUEST={}, 141 error_type=None, error_value=None, tb=None, 142 error_tb=None, error_message='', 143 tagSearch=re.compile(r'[a-zA-Z]>').search, 144 error_log_url=''):
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 # allow for a few different traceback options 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 # turn error_type into a string 159 if hasattr(error_type, '__name__'): 160 error_type=error_type.__name__ 161 162 if hasattr(self, '_v_eek'): 163 # Stop if there is recursion. 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
225 - def manage(self, URL1):
226 """ 227 """ 228 raise Redirect, "%s/manage_main" % URL1
229 230 # This keeps simple items from acquiring their parents 231 # objectValues, etc., when used in simple tree tags.
232 - def objectValues(self, spec=None):
233 return ()
234 objectIds=objectItems=objectValues 235 236 # FTP support methods 237
238 - def manage_FTPstat(self,REQUEST):
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 # check write permissions 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 # get size 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 # get modification time 280 if hasattr(aq_base(self), 'bobobase_modification_time'): 281 mtime=self.bobobase_modification_time().timeTime() 282 else: 283 mtime=time.time() 284 # get owner and group 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
293 - def manage_FTPlist(self,REQUEST):
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 # check to see if we are being acquiring or not 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
312 - def __len__(self):
313 return 1
314
315 - def __repr__(self):
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
337 -def pretty_tb(t, v, tb, as_html=1):
338 tb = format_exception(t, v, tb, as_html=as_html) 339 tb = '\n'.join(tb) 340 return tb
341