From 0c8c76114249113afa5b65716b515df2fca5ab90 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=A9rome=20Perrin?= <jerome@nexedi.com>
Date: Fri, 16 Feb 2007 16:14:36 +0000
Subject: [PATCH] Use allowType in newContent to check if we can create
 content.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@12825 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/Core/Folder.py      | 22 ++++++++++++++--------
 product/ERP5Type/tests/testFolder.py |  5 +++++
 2 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/product/ERP5Type/Core/Folder.py b/product/ERP5Type/Core/Folder.py
index 98a649e28e..6b22dcd6bd 100644
--- a/product/ERP5Type/Core/Folder.py
+++ b/product/ERP5Type/Core/Folder.py
@@ -77,6 +77,7 @@ class FolderMixIn(ExtensionClass.Base):
     This method is public, since TypeInformation.constructInstance will perform
     the security check.
     """
+    pt = self._getTypesTool()
     if container is None:
       container = self
     if id is None:
@@ -98,14 +99,19 @@ class FolderMixIn(ExtensionClass.Base):
         factory_name = 'newTemp%s' %(portal_type.replace(' ', ''))
         m = getattr(Document, factory_name)
         return m(container, new_id)
-
-    self.portal_types.constructContent(type_name=portal_type,
-                                       container=container,
-                                       id=new_id,
-                                       created_by_builder=created_by_builder,
-                                       activate_kw=activate_kw,
-                                       is_indexable=is_indexable
-                                       ) # **kw) removed due to CMF bug
+    
+    myType = pt.getTypeInfo(self)
+    if myType is not None:
+      if not myType.allowType( portal_type ):
+        raise ValueError('Disallowed subobject type: %s' % portal_type)
+
+    pt.constructContent( type_name=portal_type,
+                         container=container,
+                         id=new_id,
+                         created_by_builder=created_by_builder,
+                         activate_kw=activate_kw,
+                         is_indexable=is_indexable
+                         ) # **kw) removed due to CMF bug
     # TODO :the **kw makes it impossible to create content not based on
     # ERP5TypeInformation, because factory method often do not support
     # keywords arguments.
diff --git a/product/ERP5Type/tests/testFolder.py b/product/ERP5Type/tests/testFolder.py
index 4c299c489a..348f329ea6 100644
--- a/product/ERP5Type/tests/testFolder.py
+++ b/product/ERP5Type/tests/testFolder.py
@@ -146,6 +146,11 @@ class TestFolder(ERP5TypeTestCase, LogInterceptor):
                     'Add portal content', roles=[], acquire=0)
       self._assertAllowedContentTypes(self.other_folder, [])
       self._assertAllowedContentTypes(self.folder, type_list)
+    
+    def test_NewContentAndAllowedContentTypes(self):
+      self._setAllowedContentTypesForFolderType(('Folder', ))
+      self.assertRaises(ValueError, self.folder.newContent,
+                        portal_type='Category')
 
 if __name__ == '__main__':
     framework()
-- 
2.30.9