Commit 547be401 authored by Hanno Schlichting's avatar Hanno Schlichting Committed by GitHub

Merge pull request #63 from zopefoundation/apply-hotfix-20160419-rebased

Apply hotfix 20160419 rebased
parents 0b382a60 cc6c0ee9
......@@ -8,10 +8,12 @@ http://docs.zope.org/zope2/
2.13.25 (unreleased)
--------------------
- Removed docstrings from some methods to avoid publishing them. From
Products.PloneHotfix20160419. [maurits]
- Optimized the `OFS.ObjectManager.__contains__` method to do the
least amount of work necessary.
2.13.24 (2016-02-29)
--------------------
......
......@@ -202,13 +202,13 @@ class Application(ApplicationDefaultPermissions,
return self
def getPhysicalPath(self):
"""Get the physical path of the object.
Returns a path (an immutable sequence of strings) that can be used to
access this object again later, for example in a copy/paste operation.
getPhysicalRoot() and getPhysicalPath() are designed to operate
together.
"""
# Get the physical path of the object.
#
# Returns a path (an immutable sequence of strings) that can be used to
# access this object again later, for example in a copy/paste
# operation. getPhysicalRoot() and getPhysicalPath() are designed to
# operate together.
#
# We're at the base of the path.
return ('',)
......
......@@ -144,9 +144,7 @@ class Cacheable:
security.declarePrivate('ZCacheable_getObAndView')
def ZCacheable_getObAndView(self, view_name):
"""
Returns self and view_name unchanged.
"""
# Returns self and view_name unchanged.
return self, view_name
security.declarePrivate('ZCacheable_get')
......
......@@ -93,7 +93,7 @@ class DTMLMethod(RestrictedDTML,
security.declareProtected(View, '__call__')
def __call__(self, client=None, REQUEST={}, RESPONSE=None, **kw):
"""Render using the given client object
o If client is not passed, we are being called as a sub-template:
don't do any error propagation.
......@@ -201,14 +201,12 @@ class DTMLMethod(RestrictedDTML,
security.declareProtected(change_dtml_methods, 'getCacheNamespaceKeys')
def getCacheNamespaceKeys(self):
""" Return the cacheNamespaceKeys.
"""
# Return the cacheNamespaceKeys.
return self._cache_namespace_keys
security.declareProtected(change_dtml_methods, 'setCacheNamespaceKeys')
def setCacheNamespaceKeys(self, keys, REQUEST=None):
""" Set the list of names looked up to provide a cache key.
"""
# Set the list of names looked up to provide a cache key.
ks = []
for key in keys:
key = str(key).strip()
......@@ -356,14 +354,12 @@ class DTMLMethod(RestrictedDTML,
security.declareProtected(view_management_screens, 'PrincipiaSearchSource')
def PrincipiaSearchSource(self):
""" Support for searching - the document's contents are searched.
"""
# Support for searching - the document's contents are searched.
return self.read()
security.declareProtected(view_management_screens, 'document_src')
def document_src(self, REQUEST=None, RESPONSE=None):
""" Return unprocessed document source.
"""
# Return unprocessed document source.
if RESPONSE is not None:
RESPONSE.setHeader('Content-Type', 'text/plain')
return self.read()
......
......@@ -65,23 +65,23 @@ def manage_addFile(self, id, file='', title='', precondition='',
precondition = str(precondition)
id, title = cookId(id, title, file)
self=self.this()
# First, we create the file without data:
self._setObject(id, File(id,title,'',content_type, precondition))
newFile = self._getOb(id)
# Now we "upload" the data. By doing this in two steps, we
# can use a database trick to make the upload more efficient.
if file:
newFile.manage_upload(file)
if content_type:
newFile.content_type=content_type
notify(ObjectCreatedEvent(newFile))
if REQUEST is not None:
REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
......@@ -436,8 +436,7 @@ class File(Persistent, Implicit, PropertyManager,
security.declareProtected(View, 'PrincipiaSearchSource')
def PrincipiaSearchSource(self):
""" Allow file objects to be searched.
"""
# Allow file objects to be searched.
if self.content_type.startswith('text/'):
return str(self.data)
return ''
......@@ -473,9 +472,9 @@ class File(Persistent, Implicit, PropertyManager,
self.update_data(filedata, content_type, len(filedata))
else:
self.ZCacheable_invalidate()
notify(ObjectModifiedEvent(self))
if REQUEST:
message="Saved changes."
return self.manage_main(self,REQUEST,manage_tabs_message=message)
......@@ -494,9 +493,9 @@ class File(Persistent, Implicit, PropertyManager,
content_type=self._get_content_type(file, data, self.__name__,
'application/octet-stream')
self.update_data(data, content_type, size)
notify(ObjectModifiedEvent(self))
if REQUEST:
message="Saved changes."
return self.manage_main(self,REQUEST,manage_tabs_message=message)
......@@ -600,10 +599,8 @@ class File(Persistent, Implicit, PropertyManager,
security.declareProtected(View, 'get_size')
def get_size(self):
"""Get the size of a file or image.
Returns the size of the file or image.
"""
# Get the size of a file or image.
# Returns the size of the file or image.
size=self.size
if size is None: size=len(self.data)
return size
......@@ -613,10 +610,8 @@ class File(Persistent, Implicit, PropertyManager,
security.declareProtected(View, 'getContentType')
def getContentType(self):
"""Get the content type of a file or image.
Returns the content type (MIME type) of a file or image.
"""
# Get the content type of a file or image.
# Returns the content type (MIME type) of a file or image.
return self.content_type
......@@ -677,18 +672,18 @@ def manage_addImage(self, id, file, title='', precondition='', content_type='',
# First, we create the image without data:
self._setObject(id, Image(id,title,'',content_type, precondition))
newFile = self._getOb(id)
# Now we "upload" the data. By doing this in two steps, we
# can use a database trick to make the upload more efficient.
if file:
newFile.manage_upload(file)
if content_type:
newFile.content_type=content_type
notify(ObjectCreatedEvent(newFile))
if REQUEST is not None:
try: url=self.DestinationURL()
except: url=REQUEST['URL1']
......@@ -812,7 +807,7 @@ class Image(File):
if isinstance(data, unicode):
raise TypeError('Data can only be str or file-like. '
'Unicode objects are expressly forbidden.')
if size is None: size=len(data)
self.size=size
......
......@@ -303,12 +303,11 @@ class ObjectManager(CopyContainer,
security.declareProtected(access_contents_information, 'hasObject')
def hasObject(self, id):
"""Indicate whether the folder has an item by ID.
This doesn't try to be more intelligent than _getOb, and doesn't
consult _objects (for performance reasons). The common use case
is to check that an object does *not* exist.
"""
# Indicate whether the folder has an item by ID.
#
# This doesn't try to be more intelligent than _getOb, and doesn't
# consult _objects (for performance reasons). The common use case
# is to check that an object does *not* exist.
if (id in ('.', '..') or
id.startswith('_') or
id.startswith('aq_') or
......
......@@ -132,8 +132,7 @@ class OrderSupport(object):
security.declareProtected(manage_properties, 'moveObjectsByDelta')
def moveObjectsByDelta(self, ids, delta, subset_ids=None,
suppress_events=False):
""" Move specified sub-objects by delta.
"""
# Move specified sub-objects by delta.
if isinstance(ids, basestring):
ids = (ids,)
min_position = 0
......@@ -183,32 +182,27 @@ class OrderSupport(object):
security.declareProtected(manage_properties, 'moveObjectsUp')
def moveObjectsUp(self, ids, delta=1, subset_ids=None):
""" Move specified sub-objects up by delta in container.
"""
# Move specified sub-objects up by delta in container.
return self.moveObjectsByDelta(ids, -delta, subset_ids)
security.declareProtected(manage_properties, 'moveObjectsDown')
def moveObjectsDown(self, ids, delta=1, subset_ids=None):
""" Move specified sub-objects down by delta in container.
"""
# Move specified sub-objects down by delta in container.
return self.moveObjectsByDelta(ids, delta, subset_ids)
security.declareProtected(manage_properties, 'moveObjectsToTop')
def moveObjectsToTop(self, ids, subset_ids=None):
""" Move specified sub-objects to top of container.
"""
# Move specified sub-objects to top of container.
return self.moveObjectsByDelta( ids, -len(self._objects), subset_ids )
security.declareProtected(manage_properties, 'moveObjectsToBottom')
def moveObjectsToBottom(self, ids, subset_ids=None):
""" Move specified sub-objects to bottom of container.
"""
# Move specified sub-objects to bottom of container.
return self.moveObjectsByDelta( ids, len(self._objects), subset_ids )
security.declareProtected(manage_properties, 'orderObjects')
def orderObjects(self, key, reverse=None):
""" Order sub-objects by key and direction.
"""
# Order sub-objects by key and direction.
ids = [ id for id, obj in sort( self.objectItems(),
( (key, 'cmp', 'asc'), ) ) ]
if reverse:
......@@ -218,8 +212,7 @@ class OrderSupport(object):
security.declareProtected(access_contents_information,
'getObjectPosition')
def getObjectPosition(self, id):
""" Get the position of an object by its id.
"""
# Get the position of an object by its id.
ids = self.objectIds()
if id in ids:
return ids.index(id)
......@@ -227,22 +220,19 @@ class OrderSupport(object):
security.declareProtected(manage_properties, 'moveObjectToPosition')
def moveObjectToPosition(self, id, position, suppress_events=False):
""" Move specified object to absolute position.
"""
# Move specified object to absolute position.
delta = position - self.getObjectPosition(id)
return self.moveObjectsByDelta(id, delta,
suppress_events=suppress_events)
security.declareProtected(access_contents_information, 'getDefaultSorting')
def getDefaultSorting(self):
""" Get default sorting key and direction.
"""
# Get default sorting key and direction.
return self._default_sort_key, self._default_sort_reverse
security.declareProtected(manage_properties, 'setDefaultSorting')
def setDefaultSorting(self, key, reverse):
""" Set default sorting key and direction.
"""
# Set default sorting key and direction.
self._default_sort_key = key
self._default_sort_reverse = reverse and 1 or 0
......
......@@ -114,8 +114,8 @@ class PropertySheet(Traversable, Persistent, Implicit):
__reserved_ids= ('values','items')
def property_extensible_schema__(self):
"""Return a flag indicating whether new properties may be
added or removed."""
# Return a flag indicating whether new properties may be
# added or removed.
return self._extensible
def __init__(self, id, md=None):
......@@ -171,8 +171,8 @@ class PropertySheet(Traversable, Persistent, Implicit):
security.declareProtected(access_contents_information, 'getPropertyType')
def getPropertyType(self, id):
"""Get the type of property 'id', returning None if no
such property exists"""
# Get the type of property 'id', returning None if no
# such property exists.
pself=self.p_self()
for md in pself._properties:
if md['id']==id:
......@@ -707,7 +707,7 @@ class PropertySheets(Traversable, Implicit, Tabs):
raise BadRequest(
'attempt to delete undeletable property sheet: ' + id)
self.delPropertySheet(id)
if REQUEST is not None:
if REQUEST is not None:
REQUEST.RESPONSE.redirect('%s/manage' % self.absolute_url())
def __len__(self):
......
......@@ -108,13 +108,13 @@ class Traversable:
security.declarePublic('getPhysicalPath')
def getPhysicalPath(self):
"""Get the physical path of the object.
# Get the physical path of the object.
#
# Returns a path (an immutable sequence of strings) that can be used to
# access this object again later, for example in a copy/paste
# operation. getPhysicalRoot() and getPhysicalPath() are designed to
# operate together.
Returns a path (an immutable sequence of strings) that can be used to
access this object again later, for example in a copy/paste operation.
getPhysicalRoot() and getPhysicalPath() are designed to operate
together.
"""
path = (self.getId(),)
p = aq_parent(aq_inner(self))
......
......@@ -95,61 +95,61 @@ class Node:
security.declareProtected(access_contents_information, 'getNodeName')
def getNodeName(self):
"""The name of this node, depending on its type"""
# The name of this node, depending on its type.
return None
security.declareProtected(access_contents_information, 'getNodeValue')
def getNodeValue(self):
"""The value of this node, depending on its type"""
# The value of this node, depending on its type.
return None
security.declareProtected(access_contents_information, 'getParentNode')
def getParentNode(self):
"""The parent of this node. All nodes except Document
DocumentFragment and Attr may have a parent"""
# The parent of this node. All nodes except Document,
# DocumentFragment and Attr may have a parent.
return None
security.declareProtected(access_contents_information, 'getChildNodes')
def getChildNodes(self):
"""Returns a NodeList that contains all children of this node.
If there are no children, this is a empty NodeList"""
# Returns a NodeList that contains all children of this node.
# If there are no children, this is a empty NodeList
return NodeList()
security.declareProtected(access_contents_information, 'getFirstChild')
def getFirstChild(self):
"""The first child of this node. If there is no such node
this returns None."""
# The first child of this node. If there is no such node
# this returns None.
return None
security.declareProtected(access_contents_information, 'getLastChild')
def getLastChild(self):
"""The last child of this node. If there is no such node
this returns None."""
# The last child of this node. If there is no such node
# this returns None.
return None
security.declareProtected(access_contents_information,
'getPreviousSibling')
def getPreviousSibling(self):
"""The node immediately preceding this node. If
there is no such node, this returns None."""
# The node immediately preceding this node.
# If there is no such node, this returns None.
return None
security.declareProtected(access_contents_information, 'getNextSibling')
def getNextSibling(self):
"""The node immediately preceding this node. If
there is no such node, this returns None."""
# The node immediately preceding this node.
# If there is no such node, this returns None.
return None
security.declareProtected(access_contents_information, 'getAttributes')
def getAttributes(self):
"""Returns a NamedNodeMap containing the attributes
of this node (if it is an element) or None otherwise."""
# Returns a NamedNodeMap containing the attributes
# of this node (if it is an element) or None otherwise.
return None
security.declareProtected(access_contents_information, 'getOwnerDocument')
def getOwnerDocument(self):
"""The Document object associated with this node.
When this is a document this is None"""
# The Document object associated with this node.
# When this is a document this is None.
node = self
if hasattr(node, 'aq_parent'):
node = aq_parent(self)
......@@ -161,8 +161,8 @@ class Node:
security.declareProtected(access_contents_information, 'hasChildNodes')
def hasChildNodes(self):
"""Returns true if the node has any children, false
if it doesn't. """
# Returns true if the node has any children, false
# if it doesn't.
return len(self.objectIds())
InitializeClass(Node)
......@@ -180,63 +180,57 @@ class Document(Explicit, Node):
security.declareProtected(access_contents_information, 'getImplementation')
def getImplementation(self):
"""
The DOMImplementation object that handles this document.
"""
# The DOMImplementation object that handles this document.
return DOMImplementation()
security.declareProtected(access_contents_information, 'getDoctype')
def getDoctype(self):
"""
The Document Type Declaration associated with this document.
For HTML documents as well as XML documents without
a document type declaration this returns null.
"""
# The Document Type Declaration associated with this document.
# For HTML documents as well as XML documents without
# a document type declaration this returns null.
return None
security.declareProtected(access_contents_information,
'getDocumentElement')
def getDocumentElement(self):
"""
This is a convenience attribute that allows direct access to
the child node that is the root element of the document.
"""
# This is a convenience attribute that allows direct access to
# the child node that is the root element of the document.
return aq_parent(self)
# Node Methods
# ------------
def getNodeName(self):
"""The name of this node, depending on its type"""
# The name of this node, depending on its type.
return '#document'
def getNodeType(self):
"""A code representing the type of the node."""
# A code representing the type of the node.
return DOCUMENT_NODE
def getOwnerDocument(self):
"""The Document object associated with this node.
When this is a document this is None"""
# The Document object associated with this node.
# When this is a document this is None.
return self
def getChildNodes(self):
"""Returns a NodeList that contains all children of this node.
If there are no children, this is a empty NodeList"""
# Returns a NodeList that contains all children of this node.
# If there are no children, this is a empty NodeList.
return NodeList([aq_parent(self)])
def getFirstChild(self):
"""The first child of this node. If there is no such node
this returns None."""
# The first child of this node. If there is no such node
# this returns None.
return aq_parent(self)
def getLastChild(self):
"""The last child of this node. If there is no such node
this returns None."""
# The last child of this node. If there is no such node
# this returns None.
return aq_parent(self)
def hasChildNodes(self):
"""Returns true if the node has any children, false
if it doesn't. """
# Returns true if the node has any children, false
# if it doesn't.
return 1
InitializeClass(Document)
......@@ -283,49 +277,49 @@ class Element(Node):
security.declareProtected(access_contents_information, 'getTagName')
def getTagName(self):
"""The name of the element"""
# The name of the element.
return self.__class__.__name__
# Node Attributes
# ---------------
def getNodeName(self):
"""The name of this node, depending on its type"""
# The name of this node, depending on its type.
return self.getTagName()
def getNodeType(self):
"""A code representing the type of the node."""
# A code representing the type of the node.
return ELEMENT_NODE
def getParentNode(self):
"""The parent of this node. All nodes except Document
DocumentFragment and Attr may have a parent"""
# The parent of this node. All nodes except Document,
# DocumentFragment and Attr may have a parent.
return getattr(self, 'aq_parent', None)
def getChildNodes(self):
"""Returns a NodeList that contains all children of this node.
If there are no children, this is a empty NodeList"""
# Returns a NodeList that contains all children of this node.
# If there are no children, this is a empty NodeList.
return NodeList(self.objectValues())
def getFirstChild(self):
"""The first child of this node. If there is no such node
this returns None"""
# The first child of this node. If there is no such node
# this returns None
children = self.getChildNodes()
if children:
return children._data[0]
return None
def getLastChild(self):
"""The last child of this node. If there is no such node
this returns None."""
# The last child of this node. If there is no such node
# this returns None.
children = self.getChildNodes()
if children:
return children._data[-1]
return None
def getPreviousSibling(self):
"""The node immediately preceding this node. If
there is no such node, this returns None."""
# The node immediately preceding this node.
# If there is no such node, this returns None.
if hasattr(self, 'aq_parent'):
parent = aq_parent(self)
ids=list(parent.objectIds())
......@@ -338,8 +332,8 @@ class Element(Node):
return None
def getNextSibling(self):
"""The node immediately preceding this node. If
there is no such node, this returns None."""
# The node immediately preceding this node.
# If there is no such node, this returns None.
if hasattr(self, 'aq_parent'):
parent = aq_parent(self)
ids=list(parent.objectIds())
......@@ -356,24 +350,23 @@ class Element(Node):
security.declareProtected(access_contents_information, 'getAttribute')
def getAttribute(self, name):
"""Retrieves an attribute value by name."""
# Retrieves an attribute value by name.
return None
security.declareProtected(access_contents_information, 'getAttributeNode')
def getAttributeNode(self, name):
""" Retrieves an Attr node by name or None if
there is no such attribute. """
# Retrieves an Attr node by name or None if
# there is no such attribute.
return None
security.declareProtected(access_contents_information,
'getElementsByTagName')
def getElementsByTagName(self, tagname):
""" Returns a NodeList of all the Elements with a given tag
name in the order in which they would be encountered in a
preorder traversal of the Document tree. Parameter: tagname
The name of the tag to match (* = all tags). Return Value: A new
NodeList object containing all the matched Elements.
"""
# Returns a NodeList of all the Elements with a given tag
# name in the order in which they would be encountered in a
# preorder traversal of the Document tree. Parameter: tagname
# The name of the tag to match (* = all tags). Return Value: A new
# NodeList object containing all the matched Elements.
nodeList = []
for child in self.objectValues():
if (child.getNodeType()==ELEMENT_NODE and \
......@@ -395,8 +388,8 @@ class ElementWithAttributes(Element):
"""
def getAttributes(self):
"""Returns a NamedNodeMap containing the attributes
of this node (if it is an element) or None otherwise."""
# Returns a NamedNodeMap containing the attributes
# of this node (if it is an element) or None otherwise.
attribs={}
for p in self._properties:
if p['type'] == 'string':
......@@ -406,13 +399,13 @@ class ElementWithAttributes(Element):
return NamedNodeMap(attribs)
def getAttribute(self, name):
"""Retrieves an attribute value by name."""
# Retrieves an attribute value by name.
if self.getPropertyType(name) == 'string':
return self.getProperty(name,'')
def getAttributeNode(self, name):
"""Retrieves an Attr node by name or None if
there is no such attribute. """
# Retrieves an Attr node by name or None if
# there is no such attribute.
if self.getPropertyType(name) == 'string':
return Attr(name, self.getProperty(name,'')).__of__(self)
return None
......@@ -426,22 +419,22 @@ class ElementWithTitle(Element):
"""
def getAttributes(self):
"""Returns a NamedNodeMap containing the attributes
of this node (if it is an element) or None otherwise."""
# Returns a NamedNodeMap containing the attributes
# of this node (if it is an element) or None otherwise.
title = self.getAttributeNode('title')
if title is not None:
return NamedNodeMap({'title':title})
return NamedNodeMap()
def getAttribute(self, name):
"""Retrieves an attribute value by name."""
# Retrieves an attribute value by name.
if name=='title' and hasattr(aq_base(self), 'title'):
return self.title
return ''
def getAttributeNode(self, name):
"""Retrieves an Attr node by name or None if
there is no such attribute. """
# Retrieves an Attr node by name or None if
# there is no such attribute.
value=self.getAttribute(name)
if value:
return Attr(name, value).__of__(self)
......@@ -454,8 +447,6 @@ class Root(ElementWithAttributes):
"""
def getOwnerDocument(self):
"""
"""
return Document().__of__(self)
......@@ -479,12 +470,12 @@ class NodeList:
return self._data[index]
def item(self, index):
"""Returns the index-th item in the collection"""
# Returns the index-th item in the collection.
try: return self._data[index]
except IndexError: return None
def getLength(self):
"""The length of the NodeList"""
# The length of the NodeList.
return len(self._data)
__len__=getLength
......@@ -508,7 +499,7 @@ class NamedNodeMap:
self._data = data
def item(self, index):
"""Returns the index-th item in the map"""
# Returns the index-th item in the map.
try: return self._data.values()[index]
except IndexError: return None
......@@ -519,17 +510,16 @@ class NamedNodeMap:
return self._data[key]
def getLength(self):
"""The length of the NodeList"""
# The length of the NodeList.
return len(self._data)
__len__ = getLength
def getNamedItem(self, name):
"""Retrieves a node specified by name. Parameters:
name Name of a node to retrieve. Return Value A Node (of any
type) with the specified name, or None if the specified name
did not identify any node in the map.
"""
# Retrieves a node specified by name. Parameters:
# name Name of a node to retrieve. Return Value A Node (of any
# type) with the specified name, or None if the specified name
# did not identify any node in the map.
if self._data.has_key(name):
return self._data[name]
return None
......@@ -547,22 +537,22 @@ class Attr(Implicit, Node):
self.specified = 1
def getNodeName(self):
"""The name of this node, depending on its type"""
# The name of this node, depending on its type.
return self.name
def getName(self):
"""Returns the name of this attribute."""
# Returns the name of this attribute.
return self.name
def getNodeValue(self):
"""The value of this node, depending on its type"""
# The value of this node, depending on its type.
return self.value
def getNodeType(self):
"""A code representing the type of the node."""
# A code representing the type of the node.
return ATTRIBUTE_NODE
def getSpecified(self):
"""If this attribute was explicitly given a value in the
original document, this is true; otherwise, it is false."""
# If this attribute was explicitly given a value in the
# original document, this is true; otherwise, it is false.
return self.specified
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment