Update of /cvs-repository/Packages/webdav In directory cvs.zope.org:/tmp/cvs-serv32028/lib/python/webdav
Modified Files: Tag: tseaver-hasattr_geddon-branch Collection.py Lockable.py NullResource.py Resource.py common.py davcmds.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/webdav/Collection.py 1.24.66.3 => 1.24.66.3.22.1 === --- Packages/webdav/Collection.py:1.24.66.3 Fri Jul 30 17:49:05 2004 +++ Packages/webdav/Collection.py Sat May 28 20:41:38 2005 @@ -22,6 +22,7 @@ from urllib import unquote from WriteLockInterface import WriteLockInterface from zExceptions import MethodNotAllowed, NotFound +from ZODB.utils import safe_hasattr from webdav.common import Locked, PreconditionFailed class Collection(Resource): @@ -52,8 +53,8 @@ # Note that we are willing to acquire the default document # here because what we really care about is whether doing # a GET on this collection / would yield a 200 response. - if hasattr(self, 'index_html'): - if hasattr(self.index_html, 'HEAD'): + if safe_hasattr(self, 'index_html'): + if safe_hasattr(self.index_html, 'HEAD'): return self.index_html.HEAD(REQUEST, RESPONSE) raise MethodNotAllowed, ( 'Method not supported for this resource.' === Packages/webdav/Lockable.py 1.8 => 1.8.122.1 === --- Packages/webdav/Lockable.py:1.8 Wed Aug 14 18:11:40 2002 +++ Packages/webdav/Lockable.py Sat May 28 20:41:38 2005 @@ -18,6 +18,7 @@ from LockItem import LockItem from AccessControl import ClassSecurityInfo from Globals import PersistentMapping +from ZODB.utils import safe_hasattr import Acquisition class ResourceLockedError(Exception): pass @@ -67,8 +68,8 @@ for token, lock in locks.items(): if not lock.isValid(): del locks[token] - if (not locks) and hasattr(Acquisition.aq_base(self), - '__no_valid_write_locks__'): + if (not locks) and safe_hasattr(Acquisition.aq_base(self), + '__no_valid_write_locks__'): self.__no_valid_write_locks__() return locks else: @@ -124,14 +125,15 @@ except: # The locks may be totally messed up, so we'll just delete # and replace. - if hasattr(self, '_dav_writelocks'): del self._dav_writelocks + if safe_hasattr(self, '_dav_writelocks'): + del self._dav_writelocks if WriteLockInterface.isImplementedBy(self): self._dav_writelocks = PersistentMapping() # Call into a special hook used by LockNullResources to delete # themselves. Could be used by other objects who want to deal # with the state of empty locks. - if hasattr(Acquisition.aq_base(self), '__no_valid_write_locks__'): + if safe_hasattr(Acquisition.aq_base(self), '__no_valid_write_locks__'): self.__no_valid_write_locks__() === Packages/webdav/NullResource.py 1.39.62.5 => 1.39.62.5.2.1 === --- Packages/webdav/NullResource.py:1.39.62.5 Wed Mar 16 08:58:55 2005 +++ Packages/webdav/NullResource.py Sat May 28 20:41:38 2005 @@ -25,6 +25,7 @@ import OFS.SimpleItem from zExceptions import Unauthorized, NotFound, Forbidden, BadRequest from zExceptions import MethodNotAllowed +from ZODB.utils import safe_hasattr from common import isDavCollection from common import Locked, Conflict, PreconditionFailed, UnsupportedMediaType from OFS.CopySupport import CopyError @@ -166,7 +167,7 @@ name=self.__name__ parent = self.__parent__ - if hasattr(aq_base(parent), name): + if safe_hasattr(aq_base(parent), name): raise MethodNotAllowed, 'The name %s is in use.' % name if not isDavCollection(parent): raise Forbidden, 'Cannot create collection at this location.' === Packages/webdav/Resource.py 1.55.10.9 => 1.55.10.9.6.1 === --- Packages/webdav/Resource.py:1.55.10.9 Wed Dec 22 18:29:30 2004 +++ Packages/webdav/Resource.py Sat May 28 20:41:38 2005 @@ -26,6 +26,7 @@ import ExtensionClass from Acquisition import aq_base from AccessControl import getSecurityManager +from ZODB.utils import safe_hasattr from ZPublisher.HTTPRangeSupport import HTTPRangeInterface from zExceptions import Unauthorized, Forbidden from zExceptions import BadRequest, MethodNotAllowed @@ -70,7 +71,7 @@ # Also, we sniff for a ZServer response object, because we don't # want to write duplicate headers (since ZS writes Date # and Connection itself). - if not hasattr(response, '_server_version'): + if not safe_hasattr(response, '_server_version'): response.setHeader('Connection', 'close') response.setHeader('Date', rfc1123_date(), 1) # XXMSXX response.setHeader('MS-Author-Via', 'DAV') @@ -84,7 +85,7 @@ def dav__validate(self, object, methodname, REQUEST): msg='<strong>You are not authorized to access this resource.</strong>' method=None - if hasattr(object, methodname): + if safe_hasattr(object, methodname): method=getattr(object, methodname) else: try: method=object.aq_acquire(methodname) @@ -160,25 +161,25 @@ self.dav__init(REQUEST, RESPONSE) content_type=None - if hasattr(self, 'content_type'): + if safe_hasattr(self, 'content_type'): content_type=absattr(self.content_type) if content_type is None: url=urlfix(REQUEST['URL'], 'HEAD') name=unquote(filter(None, url.split( '/')[-1])) content_type, encoding=mimetypes.guess_type(name) if content_type is None: - if hasattr(self, 'default_content_type'): + if safe_hasattr(self, 'default_content_type'): content_type=absattr(self.default_content_type) if content_type is None: content_type = 'application/octet-stream' RESPONSE.setHeader('Content-Type', content_type.lower()) - if hasattr(aq_base(self), 'get_size'): + if safe_hasattr(aq_base(self), 'get_size'): RESPONSE.setHeader('Content-Length', absattr(self.get_size)) - if hasattr(self, '_p_mtime'): + if safe_hasattr(self, '_p_mtime'): mtime=rfc1123_date(self._p_mtime) RESPONSE.setHeader('Last-Modified', mtime) - if hasattr(aq_base(self), 'http__etag'): + if safe_hasattr(aq_base(self), 'http__etag'): etag = self.http__etag(readonly=1) if etag: RESPONSE.setHeader('Etag', etag) @@ -272,7 +273,7 @@ def PROPPATCH(self, REQUEST, RESPONSE): """Set and/or remove properties defined on the resource.""" self.dav__init(REQUEST, RESPONSE) - if not hasattr(aq_base(self), 'propertysheets'): + if not safe_hasattr(aq_base(self), 'propertysheets'): raise MethodNotAllowed, ( 'Method not supported for this resource.') # Lock checking @@ -304,7 +305,7 @@ seamless across namespaces (e.g. from Zope to Apache), COPY is currently only supported within the Zope namespace.""" self.dav__init(REQUEST, RESPONSE) - if not hasattr(aq_base(self), 'cb_isCopyable') or \ + if not safe_hasattr(aq_base(self), 'cb_isCopyable') or \ not self.cb_isCopyable(): raise MethodNotAllowed, 'This object may not be copied.' @@ -337,9 +338,9 @@ except: t, v, tb=sys.exc_info() raise t, v - if hasattr(parent, '__null_resource__'): + if safe_hasattr(parent, '__null_resource__'): raise Conflict, 'Object ancestors must already exist.' - existing=hasattr(aq_base(parent), name) + existing=safe_hasattr(aq_base(parent), name) if existing and oflag=='F': raise PreconditionFailed, 'Destination resource exists.' try: @@ -407,7 +408,7 @@ namespace.""" self.dav__init(REQUEST, RESPONSE) self.dav__validate(self, 'DELETE', REQUEST) - if not hasattr(aq_base(self), 'cb_isMoveable') or \ + if not safe_hasattr(aq_base(self), 'cb_isMoveable') or \ not self.cb_isMoveable(): raise MethodNotAllowed, 'This object may not be moved.' @@ -431,9 +432,9 @@ except: t, v, tb=sys.exc_info() raise t, v - if hasattr(parent, '__null_resource__'): + if safe_hasattr(parent, '__null_resource__'): raise Conflict, 'The resource %s must exist.' % parent_path - existing=hasattr(aq_base(parent), name) + existing=safe_hasattr(aq_base(parent), name) if existing and flag=='F': raise PreconditionFailed, 'Resource %s exists.' % dest try: === Packages/webdav/common.py 1.17.66.1 => 1.17.66.1.30.1 === --- Packages/webdav/common.py:1.17.66.1 Mon Nov 17 17:34:22 2003 +++ Packages/webdav/common.py Sat May 28 20:41:38 2005 @@ -18,6 +18,7 @@ import time, urllib, re from App.Common import iso8601_date, rfc850_date, rfc1123_date from App.Common import aq_base +from ZODB.utils import safe_hasattr import random _randGen = random.Random(time.time()) @@ -52,12 +53,12 @@ def is_acquired(ob): # Return true if this object is not a direct # subobject of its aq_parent object. - if not hasattr(ob, 'aq_parent'): + if not safe_hasattr(ob, 'aq_parent'): return 0 - if hasattr(aq_base(ob.aq_parent), absattr(ob.id)): + if safe_hasattr(aq_base(ob.aq_parent), absattr(ob.id)): return 0 - if hasattr(aq_base(ob), 'isTopLevelPrincipiaApplicationObject') and \ - ob.isTopLevelPrincipiaApplicationObject: + if (safe_hasattr(aq_base(ob), 'isTopLevelPrincipiaApplicationObject') + and ob.isTopLevelPrincipiaApplicationObject): return 0 return 1 === Packages/webdav/davcmds.py 1.20.66.2 => 1.20.66.2.30.1 === --- Packages/webdav/davcmds.py:1.20.66.2 Mon Nov 17 17:34:22 2003 +++ Packages/webdav/davcmds.py Sat May 28 20:41:38 2005 @@ -26,6 +26,7 @@ from cStringIO import StringIO from urllib import quote from AccessControl import getSecurityManager +from ZODB.utils import safe_hasattr from zExceptions import BadRequest, Forbidden from common import isDavCollection from common import PreconditionFailed @@ -102,7 +103,7 @@ iscol=isDavCollection(obj) if iscol and url[-1] != '/': url=url+'/' result.write('<d:response>\n<d:href>%s</d:href>\n' % safe_quote(url)) - if hasattr(aq_base(obj), 'propertysheets'): + if safe_hasattr(aq_base(obj), 'propertysheets'): propsets=obj.propertysheets.values() obsheets=obj.propertysheets else: @@ -112,14 +113,14 @@ if self.allprop: stats=[] for ps in propsets: - if hasattr(aq_base(ps), 'dav__allprop'): + if safe_hasattr(aq_base(ps), 'dav__allprop'): stats.append(ps.dav__allprop()) stats=''.join(stats) or '<d:status>200 OK</d:status>\n' result.write(stats) elif self.propname: stats=[] for ps in propsets: - if hasattr(aq_base(ps), 'dav__propnames'): + if safe_hasattr(aq_base(ps), 'dav__propnames'): stats.append(ps.dav__propnames()) stats=''.join(stats) or '<d:status>200 OK</d:status>\n' result.write(stats) @@ -127,7 +128,8 @@ rdict={} for name, ns in self.propnames: ps=obsheets.get(ns, None) - if ps is not None and hasattr(aq_base(ps), 'dav__propstat'): + if (ps is not None + and safe_hasattr(aq_base(ps), 'dav__propstat')): stat=ps.dav__propstat(name, rdict) else: prop='<n:%s xmlns:n="%s"/>' % (name, ns) @@ -152,15 +154,16 @@ result.write('</d:response>\n') if depth in ('1', 'infinity') and iscol: for ob in obj.listDAVObjects(): - if hasattr(ob,"meta_type"): + if safe_hasattr(ob,"meta_type"): if ob.meta_type=="Broken Because Product is Gone": continue - dflag=hasattr(ob, '_p_changed') and (ob._p_changed == None) - if hasattr(ob, '__locknull_resource__'): + dflag = (safe_hasattr(ob, '_p_changed') + and (ob._p_changed == None)) + if safe_hasattr(ob, '__locknull_resource__'): # Do nothing, a null resource shouldn't show up to DAV if dflag: ob._p_deactivate() - elif hasattr(ob, '__dav_resource__'): + elif safe_hasattr(ob, '__dav_resource__'): uri=os.path.join(url, absattr(ob.id)) depth=depth=='infinity' and depth or 0 self.apply(ob, uri, depth, result, top=0) @@ -403,7 +406,7 @@ if depth == 'infinity' and iscol: for ob in obj.objectValues(): - if hasattr(obj, '__dav_resource__'): + if safe_hasattr(obj, '__dav_resource__'): uri = os.path.join(url, absattr(ob.id)) self.apply(ob, creator, depth, token, result, uri, top=0) @@ -465,7 +468,7 @@ if iscol: for ob in obj.objectValues(): - if hasattr(ob, '__dav_resource__') and \ + if safe_hasattr(ob, '__dav_resource__') and \ WriteLockInterface.isImplementedBy(ob): uri = os.path.join(url, absattr(ob.id)) self.apply(ob, token, uri, result, top=0) @@ -519,8 +522,9 @@ if iscol: for ob in obj.objectValues(): - dflag = hasattr(ob,'_p_changed') and (ob._p_changed == None) - if hasattr(ob, '__dav_resource__'): + dflag = (safe_hasattr(ob,'_p_changed') + and (ob._p_changed == None)) + if safe_hasattr(ob, '__dav_resource__'): uri = os.path.join(url, absattr(ob.id)) self.apply(ob, token, user, uri, result, top=0) if dflag: _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins