Update of /cvs-repository/Packages/OFS In directory cvs.zope.org:/tmp/cvs-serv32028/lib/python/OFS
Modified Files: Tag: tseaver-hasattr_geddon-branch Application.py Cache.py CopySupport.py DTMLDocument.py FindSupport.py Image.py ObjectManager.py OrderSupport.py PropertyManager.py PropertySheets.py SimpleItem.py Traversable.py ZDOM.py Log Message: - Removed all uses of the 'hasattr' builtin from the core, where the object being tested derives (or might) from Persistent. XXX: currently, this branch imports a 'safe_hasattr' from ZODB.utils, which adds a dependency on ZODB for some packages; we probably need a better location, and perhas a C implementation? === Packages/OFS/Application.py 1.191.2.14 => 1.191.2.14.4.1 === --- Packages/OFS/Application.py:1.191.2.14 Tue Jan 18 11:21:13 2005 +++ Packages/OFS/Application.py Sat May 28 20:41:31 2005 @@ -30,6 +30,7 @@ import ZDOM from zLOG import LOG, ERROR, WARNING, INFO from zExceptions import Redirect as RedirectException, Forbidden +from ZODB.utils import safe_hasattr from HelpSys.HelpSys import HelpSys from Acquisition import aq_base from App.Product import doInstall @@ -200,7 +201,8 @@ finished_dict[id(base)] = None try: # Try to re-register ZClasses if they need it. - if hasattr(base,'_register') and hasattr(base,'_zclass_'): + if (safe_hasattr(base,'_register') + and safe_hasattr(base,'_zclass_')): class_id=getattr(base._zclass_, '__module__', None) if class_id and not reg_has_key(class_id): ob._register() @@ -210,14 +212,14 @@ 'Registered ZClass: %s' % ob.id ) # Include subobjects. - if hasattr(base, 'objectItems'): + if safe_hasattr(base, 'objectItems'): m = list(ob.objectItems()) items.extend(m) # Try to find ZClasses-in-ZClasses. - if hasattr(base, 'propertysheets'): + if safe_hasattr(base, 'propertysheets'): ps = ob.propertysheets - if (hasattr(ps, 'methods') and - hasattr(ps.methods, 'objectItems')): + if (safe_hasattr(ps, 'methods') and + safe_hasattr(ps.methods, 'objectItems')): m = list(ps.methods.objectItems()) items.extend(m) except: @@ -311,14 +313,14 @@ app = self.getApp() # Ensure that Control Panel exists. - if not hasattr(app, 'Control_Panel'): + if not safe_hasattr(app, 'Control_Panel'): cpl=ApplicationManager() cpl._init() app._setObject('Control_Panel', cpl) self.commit('Added Control_Panel') # b/c: Ensure that a ProductFolder exists. - if not hasattr(aq_base(app.Control_Panel), 'Products'): + if not safe_hasattr(aq_base(app.Control_Panel), 'Products'): app.Control_Panel.Products=App.Product.ProductFolder() self.commit('Added Control_Panel.Products') @@ -370,7 +372,7 @@ # Ensure that there is a transient object container in the temp folder config = getConfiguration() - if not hasattr(aq_base(tf), 'session_data'): + if not safe_hasattr(aq_base(tf), 'session_data'): from Products.Transience.Transience import TransientObjectContainer addnotify = getattr(config, 'session_add_notify_script_path', None) delnotify = getattr(config, 'session_delete_notify_script_path', @@ -427,7 +429,7 @@ # do nothing if we've already installed one return # Ensure that a browser ID manager exists - if not hasattr(app, 'browser_id_manager'): + if not safe_hasattr(app, 'browser_id_manager'): from Products.Sessions.BrowserIdManager import BrowserIdManager bid = BrowserIdManager('browser_id_manager', 'Browser Id Manager') app._setObject('browser_id_manager', bid) @@ -440,7 +442,7 @@ # do nothing if we've already installed one return # Ensure that a session data manager exists - if not hasattr(app, 'session_data_manager'): + if not safe_hasattr(app, 'session_data_manager'): from Products.Sessions.SessionDataManager import SessionDataManager sdm = SessionDataManager('session_data_manager', title='Session Data Manager', @@ -454,12 +456,13 @@ app = self.getApp() # Ensure that Owner role exists. - if hasattr(app, '__ac_roles__') and not ('Owner' in app.__ac_roles__): + if (safe_hasattr(app, '__ac_roles__') + and not ('Owner' in app.__ac_roles__)): app.__ac_roles__=app.__ac_roles__ + ('Owner',) self.commit('Added Owner role') # ensure the Authenticated role exists. - if hasattr(app, '__ac_roles__'): + if safe_hasattr(app, '__ac_roles__'): if not 'Authenticated' in app.__ac_roles__: app.__ac_roles__=app.__ac_roles__ + ('Authenticated',) self.commit('Added Authenticated role') @@ -478,9 +481,9 @@ app = self.getApp() # Install the initial user. - if hasattr(app, 'acl_users'): + if safe_hasattr(app, 'acl_users'): users = app.acl_users - if hasattr(users, '_createInitialUser'): + if safe_hasattr(users, '_createInitialUser'): app.acl_users._createInitialUser() self.commit('Created initial user') @@ -491,7 +494,7 @@ return # Install an error_log - if not hasattr(app, 'error_log'): + if not safe_hasattr(app, 'error_log'): from Products.SiteErrorLog.SiteErrorLog import SiteErrorLog error_log = SiteErrorLog() app._setObject('error_log', error_log) @@ -502,8 +505,10 @@ app = self.getApp() if app._getInitializerFlag('virtual_hosting'): return - if not app.objectIds('Virtual Host Monster') and not hasattr(app, 'virtual_hosting'): - from Products.SiteAccess.VirtualHostMonster import VirtualHostMonster + if (not app.objectIds('Virtual Host Monster') + and not safe_hasattr(app, 'virtual_hosting')): + from Products.SiteAccess.VirtualHostMonster \ + import VirtualHostMonster vhm=VirtualHostMonster() vhm.id='virtual_hosting' vhm.addToContainer(app) @@ -671,7 +676,7 @@ pname="Products.%s" % product_name try: product=__import__(pname, global_dict, global_dict, silly) - if hasattr(product, '__module_aliases__'): + if safe_hasattr(product, '__module_aliases__'): for k, v in product.__module_aliases__: if not have_module(k): if type(v) is _st and have_module(v): v=modules[v] @@ -777,7 +782,7 @@ for name,method in pgetattr( product, 'methods', {}).items(): - if not hasattr(Folder.Folder, name): + if not safe_hasattr(Folder.Folder, name): setattr(Folder.Folder, name, method) if name[-9:]!='__roles__': # not Just setting roles if (permissions.has_key(name) and @@ -826,13 +831,13 @@ if ext == '.dtml': ob = Globals.DTMLFile(base, std_dir) fn = base - if hasattr(app, fn): + if safe_hasattr(app, fn): continue app.manage_addProduct['OFSP'].manage_addDTMLMethod( id=fn, file=open(ob.raw)) elif ext in ('.pt', '.zpt'): ob = PageTemplateFile(fn, std_dir, __name__=fn) - if hasattr(app, fn): + if safe_hasattr(app, fn): continue app.manage_addProduct['PageTemplates'].manage_addPageTemplate( id=fn, title='', text=open(ob.filename)) @@ -895,11 +900,14 @@ def pgetattr(product, name, default=install_products, __init__=0): - if not __init__ and hasattr(product, name): return getattr(product, name) - if hasattr(product, '__init__'): + if not __init__ and safe_hasattr(product, name): + return getattr(product, name) + if safe_hasattr(product, '__init__'): product=product.__init__ - if hasattr(product, name): return getattr(product, name) + if safe_hasattr(product, name): + return getattr(product, name) - if default is not install_products: return default + if default is not install_products: + return default raise AttributeError, name === Packages/OFS/Cache.py 1.10.68.1 => 1.10.68.1.32.1 === --- Packages/OFS/Cache.py:1.10.68.1 Mon Nov 17 17:34:07 2003 +++ Packages/OFS/Cache.py Sat May 28 20:41:31 2005 @@ -24,6 +24,7 @@ from AccessControl import getSecurityManager from AccessControl.Role import _isBeingUsedAsAMethod from AccessControl import Unauthorized +from ZODB.utils import safe_hasattr ZCM_MANAGERS = '__ZCacheManager_ids__' @@ -54,7 +55,7 @@ It causes objects to be found only if they are in the list of cache managers. ''' - if (hasattr(aq_base(container), ZCM_MANAGERS) and + if (safe_hasattr(aq_base(container), ZCM_MANAGERS) and name in getattr(container, ZCM_MANAGERS)): return 1 return 0 @@ -292,7 +293,7 @@ ob = self used_ids = {} while ob is not None: - if hasattr(aq_base(ob), ZCM_MANAGERS): + if safe_hasattr(aq_base(ob), ZCM_MANAGERS): ids = getattr(ob, ZCM_MANAGERS) for id in ids: manager = getattr(ob, id, None) @@ -384,7 +385,7 @@ subobs = ob.objectValues() for subob in subobs: subpath = path + (subob.getId(),) - if hasattr(aq_base(subob), 'objectValues'): + if safe_hasattr(aq_base(subob), 'objectValues'): if sm.checkPermission( 'Access contents information', subob): findCacheables( === Packages/OFS/CopySupport.py 1.85.2.10 => 1.85.2.10.2.1 === --- Packages/OFS/CopySupport.py:1.85.2.10 Fri Feb 18 08:47:16 2005 +++ Packages/OFS/CopySupport.py Sat May 28 20:41:31 2005 @@ -23,6 +23,7 @@ from AccessControl.Permissions import delete_objects as DeleteObjects from Acquisition import aq_base, aq_inner, aq_parent from zExceptions import Unauthorized, BadRequest +from ZODB.utils import safe_hasattr from webdav.Lockable import ResourceLockedError from cgi import escape @@ -48,7 +49,7 @@ def _setOb(self, id, object): setattr(self, id, object) def _delOb(self, id): delattr(self, id) def _getOb(self, id, default=_marker): - if hasattr(aq_base(self), id): + if safe_hasattr(aq_base(self), id): return getattr(self, id) if default is _marker: raise AttributeError, id @@ -335,14 +336,14 @@ # (the object will not yet have been connected to the acquisition # heirarchy). - if not hasattr(object, 'meta_type'): + if not safe_hasattr(object, 'meta_type'): raise CopyError, MessageDialog( title = 'Not Supported', message = ('The object <EM>%s</EM> does not support this' \ ' operation' % escape(absattr(object.id))), action = 'manage_main') - if not hasattr(self, 'all_meta_types'): + if not safe_hasattr(self, 'all_meta_types'): raise CopyError, MessageDialog( title = 'Not Supported', message = 'Cannot paste into this object.', @@ -472,7 +473,7 @@ def cb_isCopyable(self): # Is object copyable? Returns 0 or 1 - if not (hasattr(self, '_canCopy') and self._canCopy(0)): + if not (safe_hasattr(self, '_canCopy') and self._canCopy(0)): return 0 if not self.cb_userHasCopyOrMovePermission(): return 0 @@ -480,9 +481,9 @@ def cb_isMoveable(self): # Is object moveable? Returns 0 or 1 - if not (hasattr(self, '_canCopy') and self._canCopy(1)): + if not (safe_hasattr(self, '_canCopy') and self._canCopy(1)): return 0 - if hasattr(self, '_p_jar') and self._p_jar is None: + if safe_hasattr(self, '_p_jar') and self._p_jar is None: return 0 try: n=aq_parent(aq_inner(self))._reserved_names except: n=() === Packages/OFS/DTMLDocument.py 1.48.68.3 => 1.48.68.3.30.1 === --- Packages/OFS/DTMLDocument.py:1.48.68.3 Thu Jan 8 18:33:47 2004 +++ Packages/OFS/DTMLDocument.py Sat May 28 20:41:31 2005 @@ -27,6 +27,7 @@ import Globals from AccessControl import getSecurityManager from zExceptions.TracebackSupplement import PathTracebackSupplement +from ZODB.utils import safe_hasattr done='done' @@ -108,7 +109,7 @@ __traceback_supplement__ = (PathTracebackSupplement, self) kw['document_id'] =self.getId() kw['document_title']=self.title - if hasattr(self, 'aq_explicit'): + if safe_hasattr(self, 'aq_explicit'): bself=self.aq_explicit else: bself=self === Packages/OFS/FindSupport.py 1.31.68.3 => 1.31.68.3.22.1 === --- Packages/OFS/FindSupport.py:1.31.68.3 Fri Jun 4 12:47:16 2004 +++ Packages/OFS/FindSupport.py Sat May 28 20:41:31 2005 @@ -23,6 +23,7 @@ from string import translate from AccessControl.DTML import RestrictedDTML from AccessControl import ClassSecurityInfo +from ZODB.utils import safe_hasattr class FindSupport(ExtensionClass.Base): """Find support for Zope Folders""" @@ -81,10 +82,10 @@ obj_expr=(Eval(obj_expr), md, md._push, md._pop) base=obj - if hasattr(obj, 'aq_base'): + if safe_hasattr(obj, 'aq_base'): base=obj.aq_base - if hasattr(base, 'objectItems'): + if safe_hasattr(base, 'objectItems'): try: items=obj.objectItems() except: return result else: @@ -103,24 +104,24 @@ else: p=id dflag=0 - if hasattr(ob, '_p_changed') and (ob._p_changed == None): + if safe_hasattr(ob, '_p_changed') and (ob._p_changed == None): dflag=1 - if hasattr(ob, 'aq_base'): + if safe_hasattr(ob, 'aq_base'): bs=ob.aq_base else: bs=ob if ( (not obj_ids or absattr(bs.getId()) in obj_ids) and - (not obj_metatypes or (hasattr(bs, 'meta_type') and + (not obj_metatypes or (safe_hasattr(bs, 'meta_type') and bs.meta_type in obj_metatypes)) and (not obj_searchterm or - (hasattr(ob, 'PrincipiaSearchSource') and + (safe_hasattr(ob, 'PrincipiaSearchSource') and ob.PrincipiaSearchSource().find(str(obj_searchterm)) >= 0) or - (hasattr(ob, 'SearchableText') and + (safe_hasattr(ob, 'SearchableText') and ob.SearchableText().find(str(obj_searchterm)) >= 0) ) and @@ -136,7 +137,7 @@ dflag=0 is_zclass = getattr(bs, 'meta_type', None) == 'Z Class' - if search_sub and (hasattr(bs, 'objectItems') or is_zclass): + if search_sub and (safe_hasattr(bs, 'objectItems') or is_zclass): if is_zclass: subob = ob.propertysheets.methods sub_p = '%s/propertysheets/methods' % p @@ -189,10 +190,10 @@ obj_expr=(Eval(obj_expr), md, md._push, md._pop) base=obj - if hasattr(obj, 'aq_base'): + if safe_hasattr(obj, 'aq_base'): base=obj.aq_base - if not hasattr(base, 'objectItems'): + if not safe_hasattr(base, 'objectItems'): return result try: items=obj.objectItems() except: return result @@ -206,21 +207,21 @@ else: p=id dflag=0 - if hasattr(ob, '_p_changed') and (ob._p_changed == None): + if safe_hasattr(ob, '_p_changed') and (ob._p_changed == None): dflag=1 - if hasattr(ob, 'aq_base'): + if safe_hasattr(ob, 'aq_base'): bs=ob.aq_base else: bs=ob if ( (not obj_ids or absattr(bs.getId()) in obj_ids) and - (not obj_metatypes or (hasattr(bs, 'meta_type') and + (not obj_metatypes or (safe_hasattr(bs, 'meta_type') and bs.meta_type in obj_metatypes)) and (not obj_searchterm or - (hasattr(ob, 'PrincipiaSearchSource') and + (safe_hasattr(ob, 'PrincipiaSearchSource') and ob.PrincipiaSearchSource().find(obj_searchterm) >= 0 )) and @@ -238,7 +239,7 @@ add_result((p, ob)) dflag=0 - if search_sub and hasattr(bs, 'objectItems'): + if search_sub and safe_hasattr(bs, 'objectItems'): self.ZopeFindAndApply(ob, obj_ids, obj_metatypes, obj_searchterm, obj_expr, obj_mtime, obj_mspec, @@ -267,7 +268,7 @@ -def mtime_match(ob, t, q, fn=hasattr): +def mtime_match(ob, t, q, fn=safe_hasattr): if not fn(ob, '_p_mtime'): return 0 return q=='<' and (ob._p_mtime < t) or (ob._p_mtime > t) @@ -278,11 +279,11 @@ fn=pr.append while 1: - if hasattr(ob, permission): + if safe_hasattr(ob, permission): p=getattr(ob, permission) if type(p) is lt: map(fn, p) - if hasattr(ob, 'aq_parent'): + if safe_hasattr(ob, 'aq_parent'): ob=ob.aq_parent continue break @@ -293,7 +294,7 @@ map(fn, ('Manager', 'Anonymous')) break - if hasattr(ob, 'aq_parent'): + if safe_hasattr(ob, 'aq_parent'): ob=ob.aq_parent continue break === Packages/OFS/Image.py 1.145.2.11 => 1.145.2.11.2.1 === --- Packages/OFS/Image.py:1.145.2.11 Thu Jan 27 13:47:11 2005 +++ Packages/OFS/Image.py Sat May 28 20:41:31 2005 @@ -29,6 +29,7 @@ from DateTime import DateTime from Cache import Cacheable from mimetools import choose_boundary +from ZODB.utils import safe_hasattr from ZPublisher import HTTPRangeSupport from ZPublisher.HTTPRequest import FileUpload from ZPublisher.Iterators import filestream_iterator @@ -366,12 +367,12 @@ # we were able to handle this by returning a 304 return '' - if self.precondition and hasattr(self, str(self.precondition)): + if self.precondition and safe_hasattr(self, str(self.precondition)): # Grab whatever precondition was defined and then # execute it. The precondition will raise an exception # if something violates its terms. c=getattr(self, str(self.precondition)) - if hasattr(c,'isDocTemp') and c.isDocTemp: + if safe_hasattr(c,'isDocTemp') and c.isDocTemp: c(REQUEST['PARENTS'][1],REQUEST) else: c() @@ -492,7 +493,7 @@ if isinstance(file, FileUpload) and not file: raise ValueError, 'File not specified' - if hasattr(file, '__class__') and file.__class__ is Pdata: + if safe_hasattr(file, '__class__') and file.__class__ is Pdata: size=len(file) return file, size @@ -831,7 +832,7 @@ def cookId(id, title, file): - if not id and hasattr(file,'filename'): + if not id and safe_hasattr(file,'filename'): filename=file.filename title=title or filename id=filename[max(filename.rfind('/'), === Packages/OFS/ObjectManager.py 1.163.12.12 => 1.163.12.12.2.1 === --- Packages/OFS/ObjectManager.py:1.163.12.12 Sun Mar 27 11:36:23 2005 +++ Packages/OFS/ObjectManager.py Sat May 28 20:41:31 2005 @@ -29,6 +29,7 @@ from AccessControl.SecurityInfo import ClassSecurityInfo from webdav.Lockable import ResourceLockedError from ZODB.POSException import ConflictError +from ZODB.utils import safe_hasattr from urllib import quote from cStringIO import StringIO import marshal @@ -75,7 +76,7 @@ # An object by the given id exists either in this # ObjectManager or in the acquisition path. flags = getattr(obj, '__replaceable__', NOT_REPLACEABLE) - if hasattr(aq_base(self), id): + if safe_hasattr(aq_base(self), id): # The object is located in this ObjectManager. if not flags & REPLACEABLE: raise BadRequest, ( @@ -161,8 +162,9 @@ # Look at _product_meta_types, if there is one _pmt=() - if hasattr(self, '_product_meta_types'): _pmt=self._product_meta_types - elif hasattr(self, 'aq_acquire'): + if safe_hasattr(self, '_product_meta_types'): + _pmt=self._product_meta_types + elif safe_hasattr(self, 'aq_acquire'): try: _pmt=self.aq_acquire('_product_meta_types') except: pass external_candidates.extend(list(_pmt)) @@ -238,7 +240,7 @@ # sub-items are returned. That could have a measurable hit # on performance as things are currently implemented, so for # the moment we just make sure not to expose private attrs. - if id[:1] != '_' and hasattr(aq_base(self), id): + if id[:1] != '_' and safe_hasattr(aq_base(self), id): return getattr(self, id) if default is _marker: raise AttributeError, id @@ -265,7 +267,7 @@ # Try to give user the local role "Owner", but only if # no local roles have been set on the object yet. - if hasattr(object, '__ac_local_roles__'): + if safe_hasattr(object, '__ac_local_roles__'): if object.__ac_local_roles__ is None: user=getSecurityManager().getUser() if user is not None: @@ -280,7 +282,7 @@ for object in self.objectValues(): try: s=object._p_changed except: s=0 - if hasattr(aq_base(object), 'manage_afterAdd'): + if safe_hasattr(aq_base(object), 'manage_afterAdd'): object.manage_afterAdd(item, container) if s is None: object._p_deactivate() @@ -288,7 +290,7 @@ for object in self.objectValues(): try: s=object._p_changed except: s=0 - if hasattr(aq_base(object), 'manage_afterClone'): + if safe_hasattr(aq_base(object), 'manage_afterClone'): object.manage_afterClone(item) if s is None: object._p_deactivate() @@ -297,7 +299,7 @@ try: s=object._p_changed except: s=0 try: - if hasattr(aq_base(object), 'manage_beforeDelete'): + if safe_hasattr(aq_base(object), 'manage_beforeDelete'): object.manage_beforeDelete(item, container) except BeforeDeleteException, ob: raise @@ -368,13 +370,17 @@ return tuple(map(lambda dict: dict.copy(), self._objects)) def objectIds_d(self,t=None): - if hasattr(self, '_reserved_names'): n=self._reserved_names - else: n=() - if not n: return self.objectIds(t) + if safe_hasattr(self, '_reserved_names'): + n=self._reserved_names + else: + n=() + if not n: + return self.objectIds(t) r=[] a=r.append for id in self.objectIds(t): - if id not in n: a(id) + if id not in n: + a(id) return r def objectValues_d(self,t=None): @@ -388,13 +394,17 @@ return r def objectMap_d(self,t=None): - if hasattr(self, '_reserved_names'): n=self._reserved_names - else: n=() - if not n: return self._objects + if safe_hasattr(self, '_reserved_names'): + n=self._reserved_names + else: + n=() + if not n: + return self._objects r=[] a=r.append for d in self._objects: - if d['id'] not in n: a(d.copy()) + if d['id'] not in n: + a(d.copy()) return r def superValues(self,t): @@ -408,9 +418,10 @@ have=seen.has_key x=0 while x < 100: - if not hasattr(obj,'_getOb'): break + if not safe_hasattr(obj,'_getOb'): + break get=obj._getOb - if hasattr(obj,'_objects'): + if safe_hasattr(obj,'_objects'): for i in obj._objects: try: id=i['id'] @@ -420,7 +431,7 @@ seen[physicalPath]=1 except: pass - if hasattr(obj,'aq_parent'): + if safe_hasattr(obj,'aq_parent'): obj=obj.aq_parent relativePhysicalPath = ('..',) + relativePhysicalPath else: @@ -467,22 +478,22 @@ def tpValues(self): # Return a list of subobjects, used by tree tag. r=[] - if hasattr(aq_base(self), 'tree_ids'): + if safe_hasattr(aq_base(self), 'tree_ids'): tree_ids=self.tree_ids try: tree_ids=list(tree_ids) except TypeError: pass - if hasattr(tree_ids, 'sort'): + if safe_hasattr(tree_ids, 'sort'): tree_ids.sort() for id in tree_ids: - if hasattr(self, id): + if safe_hasattr(self, id): r.append(self._getOb(id)) else: obj_ids=self.objectIds() obj_ids.sort() for id in obj_ids: o=self._getOb(id) - if hasattr(o, 'isPrincipiaFolderish') and \ + if safe_hasattr(o, 'isPrincipiaFolderish') and \ o.isPrincipiaFolderish: r.append(o) return r @@ -493,7 +504,8 @@ if not id: # can't use getId() here (breaks on "old" exported objects) id=self.id - if hasattr(id, 'im_func'): id=id() + if safe_hasattr(id, 'im_func'): + id=id() ob=self else: ob=self._getOb(id) @@ -561,7 +573,8 @@ filepath, customImporters=customImporters) if verify: self._verifyObjectPaste(ob, validate_src=0) id=ob.id - if hasattr(id, 'im_func'): id=id() + if safe_hasattr(id, 'im_func'): + id=id() self._setObject(id, ob, set_owner=set_owner) # try to make ownership implicit if possible in the context @@ -580,7 +593,7 @@ while 1: if App.Common.is_acquired(ob): raise ValueError('FTP List not supported on acquired objects') - if not hasattr(ob,'aq_parent'): + if not safe_hasattr(ob,'aq_parent'): break ob=ob.aq_parent @@ -609,7 +622,7 @@ files.sort() - if not (hasattr(self,'isTopLevelPrincipiaApplicationObject') and + if not (safe_hasattr(self,'isTopLevelPrincipiaApplicationObject') and self.isTopLevelPrincipiaApplicationObject): files.insert(0,('..',self.aq_parent)) files.insert(0, ('.', self)) @@ -662,7 +675,7 @@ def __getitem__(self, key): v=self._getOb(key, None) if v is not None: return v - if hasattr(self, 'REQUEST'): + if safe_hasattr(self, 'REQUEST'): request=self.REQUEST method=request.get('REQUEST_METHOD', 'GET') if request.maybe_webdav_client and not method in ('GET', 'POST'): @@ -687,11 +700,13 @@ def all_meta_types(self, interfaces=None): if interfaces is None: - if hasattr(self, '_product_interfaces'): + if safe_hasattr(self, '_product_interfaces'): interfaces=self._product_interfaces - elif hasattr(self, 'aq_acquire'): - try: interfaces=self.aq_acquire('_product_interfaces') - except: pass # Bleah generic pass is bad + elif safe_hasattr(self, 'aq_acquire'): + try: + interfaces=self.aq_acquire('_product_interfaces') + except: + pass # Bleah generic pass is bad return ObjectManager.all_meta_types(self, interfaces) === Packages/OFS/OrderSupport.py 1.2.2.5 => 1.2.2.5.2.1 === --- Packages/OFS/OrderSupport.py:1.2.2.5 Wed Jan 26 10:37:26 2005 +++ Packages/OFS/OrderSupport.py Sat May 28 20:41:31 2005 @@ -23,6 +23,7 @@ from Acquisition import aq_base from DocumentTemplate.sequence import sort from Globals import InitializeClass +from ZODB.utils import safe_hasattr from IOrderSupport import IOrderedContainer from ObjectManager import ObjectManager @@ -260,15 +261,15 @@ def tpValues(self): # Return a list of subobjects, used by tree tag. r=[] - if hasattr(aq_base(self), 'tree_ids'): + if safe_hasattr(aq_base(self), 'tree_ids'): tree_ids=self.tree_ids try: tree_ids=list(tree_ids) except TypeError: pass - if hasattr(tree_ids, 'sort'): + if safe_hasattr(tree_ids, 'sort'): tree_ids.sort() for id in tree_ids: - if hasattr(self, id): + if safe_hasattr(self, id): r.append(self._getOb(id)) else: # this part is different from the ObjectManager code === Packages/OFS/PropertyManager.py 1.52.2.4 => 1.52.2.4.30.1 === --- Packages/OFS/PropertyManager.py:1.52.2.4 Thu Jan 8 18:33:47 2004 +++ Packages/OFS/PropertyManager.py Sat May 28 20:41:31 2005 @@ -24,6 +24,7 @@ from zExceptions import BadRequest from cgi import escape from types import ListType +from ZODB.utils import safe_hasattr class PropertyManager(ExtensionClass.Base, ZDOM.ElementWithAttributes): @@ -122,8 +123,10 @@ propertysheets=vps(DefaultPropertySheets) def valid_property_id(self, id): - if not id or id[:1]=='_' or (id[:3]=='aq_') \ - or (' ' in id) or hasattr(aq_base(self), id) or escape(id) != id: + if (not id or id[:1]=='_' or (id[:3]=='aq_') + or (' ' in id) + or safe_hasattr(aq_base(self), id) + or escape(id) != id): return 0 return 1 @@ -151,7 +154,7 @@ def _wrapperCheck(self, object): # Raise an error if an object is wrapped. - if hasattr(object, 'aq_base'): + if safe_hasattr(object, 'aq_base'): raise ValueError, 'Invalid property value: wrapped object' return @@ -174,7 +177,7 @@ raise BadRequest, 'Invalid or duplicate property id' if type in ('selection', 'multiple selection'): - if not hasattr(self, value): + if not safe_hasattr(self, value): raise BadRequest, 'No select variable %s' % value self._properties=self._properties + ( {'id':id, 'type':type, 'select_variable':value},) @@ -333,7 +336,7 @@ propdict=self.propdict() nd=self._reserved_names for id in ids: - if not hasattr(aq_base(self), id): + if not safe_hasattr(aq_base(self), id): raise BadRequest, ( 'The property <em>%s</em> does not exist' % escape(id)) if (not 'd' in propdict[id].get('mode', 'wd')) or (id in nd): === Packages/OFS/PropertySheets.py 1.89.4.10 => 1.89.4.10.6.1 === --- Packages/OFS/PropertySheets.py:1.89.4.10 Mon Jan 3 15:10:40 2005 +++ Packages/OFS/PropertySheets.py Sat May 28 20:41:31 2005 @@ -24,6 +24,7 @@ from webdav.common import urlbase from ExtensionClass import Base from Globals import Persistent +from ZODB.utils import safe_hasattr from Traversable import Traversable from Acquisition import aq_base from AccessControl import getSecurityManager @@ -181,7 +182,7 @@ def _wrapperCheck(self, object): # Raise an error if an object is wrapped. - if hasattr(object, 'aq_base'): + if safe_hasattr(object, 'aq_base'): raise ValueError, 'Invalid property value: wrapped object' return @@ -198,7 +199,7 @@ 'Properties cannot be added to this property sheet') pself=self.p_self() self=self.v_self() - if hasattr(aq_base(self),id): + if safe_hasattr(aq_base(self),id): if not (id=='title' and not self.__dict__.has_key(id)): raise BadRequest, ( 'Invalid property id, <em>%s</em>. It is in use.' % @@ -253,7 +254,7 @@ if not self.hasProperty(id): raise BadRequest, 'The property %s does not exist.' % escape(id) vself=self.v_self() - if hasattr(vself, '_reserved_names'): + if safe_hasattr(vself, '_reserved_names'): nd=vself._reserved_names else: nd=() if (not 'd' in self.propertyInfo(id).get('mode', 'wd')) or (id in nd): @@ -331,7 +332,7 @@ else: # It's a non-xml property. Escape value. attrs='' - if not hasattr(self,"dav__"+name): + if not safe_hasattr(self,"dav__"+name): value = xml_escape(value) prop=' <n:%s%s>%s</n:%s>' % (name, attrs, value, name) @@ -382,7 +383,7 @@ else: # It's a non-xml property. Escape value. attrs='' - if not hasattr(self, 'dav__%s' % name): + if not safe_hasattr(self, 'dav__%s' % name): value = xml_escape(value) prop='<n:%s%s xmlns:n="%s">%s</n:%s>\n' % ( name, attrs, xml_id, value, name) @@ -503,7 +504,7 @@ def getProperty(self, id, default=None): method='dav__%s' % id - if not hasattr(self, method): + if not safe_hasattr(self, method): return default return getattr(self, method)() @@ -518,7 +519,7 @@ def _propertyMap(self): # Only use getlastmodified if returns a value - if hasattr(self.v_self(), '_p_mtime'): + if safe_hasattr(self.v_self(), '_p_mtime'): return self.pm + ({'id':'getlastmodified', 'mode':'r'},) return self.pm @@ -543,21 +544,21 @@ def dav__getcontenttype(self): vself=self.v_self() - if hasattr(vself, 'content_type'): + if safe_hasattr(vself, 'content_type'): return absattr(vself.content_type) - if hasattr(vself, 'default_content_type'): + if safe_hasattr(vself, 'default_content_type'): return absattr(vself.default_content_type) return '' def dav__getcontentlength(self): vself=self.v_self() - if hasattr(vself, 'get_size'): + if safe_hasattr(vself, 'get_size'): return vself.get_size() return '' def dav__source(self): vself=self.v_self() - if hasattr(vself, 'document_src'): + if safe_hasattr(vself, 'document_src'): url=urlbase(vself.absolute_url()) return '\n <n:link>\n' \ ' <n:src>%s</n:src>\n' \ @@ -648,7 +649,7 @@ propsets=self.__propsets__() r=[] for n in propsets: - if hasattr(n,'id'): id=n.id + if safe_hasattr(n,'id'): id=n.id else: id='' r.append((id, n.__of__(self))) @@ -656,8 +657,9 @@ def get(self, name, default=None): for propset in self.__propsets__(): - if propset.id==name or (hasattr(propset, 'xml_namespace') and \ - propset.xml_namespace()==name): + if (propset.id == name + or (safe_hasattr(propset, 'xml_namespace') and + propset.xml_namespace()==name)): return propset.__of__(self) return default === Packages/OFS/SimpleItem.py 1.106.12.2 => 1.106.12.2.32.1 === --- Packages/OFS/SimpleItem.py:1.106.12.2 Tue Dec 16 09:50:13 2003 +++ Packages/OFS/SimpleItem.py Sat May 28 20:41:31 2005 @@ -35,6 +35,7 @@ from zExceptions import Redirect import time from zLOG import LOG, BLATHER +from ZODB.utils import safe_hasattr import marshal import ZDOM @@ -68,7 +69,7 @@ return name() if name is not None: return name - if hasattr(self, '__name__'): + if safe_hasattr(self, '__name__'): return self.__name__ raise AttributeError, 'This object has no id' @@ -159,10 +160,10 @@ error_tb = tb # turn error_type into a string - if hasattr(error_type, '__name__'): + if safe_hasattr(error_type, '__name__'): error_type=error_type.__name__ - if hasattr(self, '_v_eek'): + if safe_hasattr(self, '_v_eek'): # Stop if there is recursion. raise error_type, error_value, tb self._v_eek=1 @@ -186,7 +187,7 @@ if not REQUEST: REQUEST=self.aq_acquire('REQUEST') try: - if hasattr(client, 'standard_error_message'): + if safe_hasattr(client, 'standard_error_message'): s=getattr(client, 'standard_error_message') else: client = client.aq_parent @@ -218,7 +219,7 @@ "to render the standard error message.)") raise error_type, v, tb finally: - if hasattr(self, '_v_eek'): del self._v_eek + if safe_hasattr(self, '_v_eek'): del self._v_eek tb=None def manage(self, URL1): @@ -239,8 +240,8 @@ mode=0100000 # check read permissions - if (hasattr(aq_base(self),'manage_FTPget') and - hasattr(self.manage_FTPget, '__roles__')): + if (safe_hasattr(aq_base(self),'manage_FTPget') and + safe_hasattr(self.manage_FTPget, '__roles__')): try: if getSecurityManager().validateValue(self.manage_FTPget): mode=mode | 0440 @@ -250,7 +251,8 @@ mode=mode | 0004 # check write permissions - if hasattr(aq_base(self),'PUT') and hasattr(self.PUT, '__roles__'): + if (safe_hasattr(aq_base(self),'PUT') + and safe_hasattr(self.PUT, '__roles__')): try: if getSecurityManager().validateValue(self.PUT): mode=mode | 0220 @@ -260,20 +262,20 @@ mode=mode | 0002 # get size - if hasattr(aq_base(self), 'get_size'): + if safe_hasattr(aq_base(self), 'get_size'): size=self.get_size() - elif hasattr(aq_base(self),'manage_FTPget'): + elif safe_hasattr(aq_base(self),'manage_FTPget'): size=len(self.manage_FTPget()) else: size=0 # get modification time - if hasattr(aq_base(self), 'bobobase_modification_time'): + if safe_hasattr(aq_base(self), 'bobobase_modification_time'): mtime=self.bobobase_modification_time().timeTime() else: mtime=time.time() # get owner and group owner=group='Zope' - if hasattr(aq_base(self), 'get_local_roles'): + if safe_hasattr(aq_base(self), 'get_local_roles'): for user, roles in self.get_local_roles(): if 'Owner' in roles: owner=user @@ -288,7 +290,7 @@ while 1: if App.Common.is_acquired(ob): raise ValueError('FTP List not supported on acquired objects') - if not hasattr(ob,'aq_parent'): + if not safe_hasattr(ob,'aq_parent'): break ob=ob.aq_parent === Packages/OFS/Traversable.py 1.19.4.3 => 1.19.4.3.32.1 === --- Packages/OFS/Traversable.py:1.19.4.3 Wed Dec 10 12:53:31 2003 +++ Packages/OFS/Traversable.py Sat May 28 20:41:31 2005 @@ -21,6 +21,7 @@ from AccessControl import Unauthorized from AccessControl.ZopeGuards import guarded_getattr from ZODB.POSException import ConflictError +from ZODB.utils import safe_hasattr from urllib import quote NotFound = 'NotFound' @@ -112,7 +113,7 @@ if not path: return self get=getattr - has=hasattr + has=safe_hasattr N=None M=_marker === Packages/OFS/ZDOM.py 1.12 => 1.12.134.1 === --- Packages/OFS/ZDOM.py:1.12 Wed Aug 14 17:42:56 2002 +++ Packages/OFS/ZDOM.py Sat May 28 20:41:31 2005 @@ -16,6 +16,7 @@ All standard Zope objects support DOM to a limited extent. """ import Acquisition +from ZODB.utils import safe_hasattr # Node type codes @@ -141,7 +142,7 @@ """The Document object associated with this node. When this is a document this is None""" node = self - if hasattr(node, 'aq_parent'): + if safe_hasattr(node, 'aq_parent'): node = self.aq_parent return node.getOwnerDocument() return node @@ -316,7 +317,7 @@ def getPreviousSibling(self): """The node immediately preceding this node. If there is no such node, this returns None.""" - if hasattr(self, 'aq_parent'): + if safe_hasattr(self, 'aq_parent'): parent = self.aq_parent ids=list(parent.objectIds()) id=self.id @@ -330,7 +331,7 @@ def getNextSibling(self): """The node immediately preceding this node. If there is no such node, this returns None.""" - if hasattr(self, 'aq_parent'): + if safe_hasattr(self, 'aq_parent'): parent = self.aq_parent ids=list(parent.objectIds()) id=self.id @@ -365,7 +366,7 @@ if (child.getNodeType()==ELEMENT_NODE and \ child.getTagName()==tagname or tagname== '*'): nodeList.append(child) - if hasattr(child, 'getElementsByTagName'): + if safe_hasattr(child, 'getElementsByTagName'): n1 = child.getElementsByTagName(tagname) nodeList = nodeList + n1._data return NodeList(nodeList) @@ -419,7 +420,7 @@ def getAttribute(self, name): """Retrieves an attribute value by name.""" - if name=='title' and hasattr(self.aq_base, 'title'): + if name=='title' and safe_hasattr(self.aq_base, 'title'): return self.title return '' _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins