Skip to content

Commit

Permalink
Merge pull request #52 from zopefoundation/nonetype-decode-error
Browse files Browse the repository at this point in the history
Prevent AttributeError 'NoneType' object has no attribute 'decode'.
  • Loading branch information
mauritsvanrees committed Feb 7, 2018
2 parents ba646bd + 7fdf578 commit a6745a2
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
3 changes: 2 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ Changelog
1.10.1 (unreleased)
-------------------

- Nothing changed yet.
- Prevent AttributeError 'NoneType' object has no attribute 'decode'.
[maurits]


1.10.0 (2017-12-07)
Expand Down
38 changes: 38 additions & 0 deletions Products/GenericSetup/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,30 @@
</dummy>
"""

_NONE_PROPERTY_EXPORT = """\
<?xml version="1.0"?>
<dummy>
<property name="foo_boolean" type="boolean">False</property>
<property name="foo_date" type="date">1970/01/01 00:00:00 UTC</property>
<property name="foo_float" type="float">0.0</property>
<property name="foo_int" type="int">0</property>
<property name="foo_lines" type="lines"/>
<property name="foo_long" type="long">0</property>
<property name="foo_string" type="string"></property>
<property name="foo_tokens" type="tokens"/>
<property name="foo_selection" select_variable="foobarbaz"
type="selection"></property>
<property name="foo_mselection" select_variable="foobarbaz"
type="multiple selection"/>
<property name="foo_boolean0" type="boolean">False</property>
<property name="foo_date_naive" type="date">1970/01/01 00:00:00</property>
<property name="foo_boolean_nodel">False</property>
<property name="foo_date_nodel">1970/01/01 00:00:00 UTC</property>
<property name="foo_float_nodel">0.0</property>
<property name="foo_int_nodel">0</property>
</dummy>
"""

_NORMAL_PROPERTY_EXPORT = u"""\
<?xml version="1.0"?>
<dummy>
Expand Down Expand Up @@ -380,6 +404,20 @@ def test__extractProperties_empty(self):

self.assertEqual(doc.toprettyxml(' '), _EMPTY_PROPERTY_EXPORT)

def test__extractProperties_none(self):
from Products.GenericSetup.utils import PrettyDocument
context = self._makeContext()
# When a text property is None, in 1.10.0 you get an AttributeError:
# 'NoneType' object has no attribute 'decode'
context.foo_text = None
helpers = self._makeOne(context=context)
doc = helpers._doc = PrettyDocument()
node = doc.createElement('dummy')
node.appendChild(helpers._extractProperties())
doc.appendChild(node)

self.assertEqual(doc.toprettyxml(' '), _NONE_PROPERTY_EXPORT)

def test__extractProperties_normal(self):
from Products.GenericSetup.utils import PrettyDocument
helpers = self._makeOne()
Expand Down
2 changes: 2 additions & 0 deletions Products/GenericSetup/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -657,6 +657,8 @@ def _extractProperties(self):
node.setAttribute('name', prop_id)

prop = self.context.getProperty(prop_id)
if prop is None:
continue
if isinstance(prop, (tuple, list)):
for value in prop:
if isinstance(value, six.binary_type):
Expand Down

0 comments on commit a6745a2

Please sign in to comment.