Index: zope/app/container/browser/tests/test_contents_functional.py =================================================================== --- zope/app/container/browser/tests/test_contents_functional.py (r��vision 87253) +++ zope/app/container/browser/tests/test_contents_functional.py (copie de travail) @@ -337,7 +337,31 @@ body = response.getBody() self.assert_("cannot be moved" in body) + def test_copy_then_delete_with_unicode_name(self): + """Tests unicode on object copied then deleted (#238579).""" + # create a file with an accentuated unicode name + root = self.getRootFolder() + root[u'voil\xe0'] = File() + transaction.commit() + + # copy the object + response = self.publish('/@@contents.html', basic='mgr:mgrpw', form={ + 'ids' : (u'voil\xe0',), + 'container_copy_button' : '' }) + self.assertEqual(response.getStatus(), 302) + self.assertEqual(response.getHeader('Location'), + 'http://localhost/@@contents.html') + response = self.publish('/@@contents.html', basic='mgr:mgrpw') + self.assertEqual(response.getStatus(), 200) + + # delete the object + del root[u'voil\xe0'] + transaction.commit() + response = self.publish('/@@contents.html', basic='mgr:mgrpw') + self.assertEqual(response.getStatus(), 200) + + def test_suite(): suite = unittest.TestSuite() Test.layer = AppContainerLayer Index: zope/app/container/traversal.py =================================================================== --- zope/app/container/traversal.py (r��vision 87253) +++ zope/app/container/traversal.py (copie de travail) @@ -95,7 +95,10 @@ v = container.get(name, _marker) if v is _marker: - v = getattr(container, name, _marker) + try: + v = getattr(container, name, _marker) + except UnicodeEncodeError: + raise TraversalError(container, name) if v is _marker: raise TraversalError(container, name) Index: zope/app/container/tests/test_containertraversable.py =================================================================== --- zope/app/container/tests/test_containertraversable.py (r��vision 87253) +++ zope/app/container/tests/test_containertraversable.py (copie de travail) @@ -59,6 +59,11 @@ self.failUnless(T.traverse('bar', []) is bar) self.assertRaises(TraversalError , T.traverse, 'morebar', []) + def test_unicode_attr(self): + # test traversal with unicode + voila = Container() + c = Container({}, {u'voil\xe0': voila}) + self.failUnless(ContainerTraversable(c).traverse(u'voil\xe0', []) is voila) def test_suite():