From db06c264d7670e223942352a22f1733ac7a6f937 Mon Sep 17 00:00:00 2001
From: Arnaud Fontaine <arnaud.fontaine@nexedi.com>
Date: Mon, 29 Nov 2010 02:10:34 +0000
Subject: [PATCH] Add Category Acquired Membership Arity Constraint and its
 test for ZODB Property Sheets

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@40819 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 ...tegoryAcquiredMembershipArityConstraint.py | 57 +++++++++++++++++++
 .../tests/testDynamicClassGeneration.py       | 30 ++++++++--
 2 files changed, 81 insertions(+), 6 deletions(-)
 create mode 100644 product/ERP5Type/Core/CategoryAcquiredMembershipArityConstraint.py

diff --git a/product/ERP5Type/Core/CategoryAcquiredMembershipArityConstraint.py b/product/ERP5Type/Core/CategoryAcquiredMembershipArityConstraint.py
new file mode 100644
index 0000000000..31d158f576
--- /dev/null
+++ b/product/ERP5Type/Core/CategoryAcquiredMembershipArityConstraint.py
@@ -0,0 +1,57 @@
+##############################################################################
+#
+# Copyright (c) 2002-2010 Nexedi SARL and Contributors. All Rights Reserved.
+#                         Sebastien Robin <seb@nexedi.com>
+#                         Romain Courteaud <romain@nexedi.com>
+#                         Arnaud Fontaine <arnaud.fontaine@nexedi.com>
+#
+# WARNING: This program as such is intended to be used by professional
+# programmers who take the whole responsability of assessing all potential
+# consequences resulting from its eventual inadequacies and bugs
+# End users who are looking for a ready-to-use solution with commercial
+# garantees and support are strongly adviced to contract a Free Software
+# Service Company
+#
+# This program is Free Software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+#
+##############################################################################
+
+from Products.ERP5Type.Core.CategoryMembershipArityConstraint \
+          import CategoryMembershipArityConstraint
+
+class CategoryAcquiredMembershipArityConstraint(CategoryMembershipArityConstraint):
+  """
+  This constraint checks if an object respects the arity with
+  Acquisition.
+
+  This is only relevant for ZODB Property Sheets (filesystem Property
+  Sheets rely on Products.ERP5Type.Constraint.CategoryAcquiredMembershipArity
+  instead).
+
+  For example, if we would like to check whether the object respects a
+  minimum arity of '1' and a maximum arity of '1 for the Portal Type
+  'Organisation' and the Base Category 'source', then we would create
+  a 'Category Acquired Membership Arity Constraint' within that
+  Property Sheet and set 'Minimum arity' to '1', 'Maximum Arity' to
+  '1', 'Portal Types' to 'Organisation', 'Base Categories' to
+  'source', then set the 'Predicate' if necessary (known as
+  'condition' for filesystem Property Sheets).
+  """
+  meta_type = 'ERP5 Category Acquired Membership Arity Constraint'
+  portal_type = 'Category Acquired Membership Arity Constraint'
+
+  def _calculateArity(self, obj, base_category_list, portal_type_list):
+    return len(obj.getAcquiredCategoryMembershipList(
+      base_category, portal_type=portal_type))
diff --git a/product/ERP5Type/tests/testDynamicClassGeneration.py b/product/ERP5Type/tests/testDynamicClassGeneration.py
index 66d26c5032..285d8ae73d 100644
--- a/product/ERP5Type/tests/testDynamicClassGeneration.py
+++ b/product/ERP5Type/tests/testDynamicClassGeneration.py
@@ -375,19 +375,18 @@ class TestZodbPropertySheet(ERP5TypeTestCase):
       portal_type='Content Existence Constraint',
       constraint_portal_type='python: ("Content Existence Constraint")')
 
-  def _newCategoryMembershipArityConstraint(self):
+  def _newCategoryMembershipArityConstraint(self, reference, portal_type):
     """
     Create a new Category Membership Arity Constraint within test
-    Property Sheet
+    Property Sheet, allowing testing of Category Acquired Membership
+    Arity Constraint too
     """
-    reference = 'test_category_membership_arity_constraint'
-
     self.getPortal().portal_categories.newContent(
       id=reference, portal_type='Base Category')
 
     self.test_property_sheet.newContent(
       reference=reference,
-      portal_type='Category Membership Arity Constraint',
+      portal_type=portal_type,
       min_arity=1,
       max_arity=1,
       constraint_portal_type=('Test Migration',),
@@ -429,7 +428,15 @@ class TestZodbPropertySheet(ERP5TypeTestCase):
 
       # Create a Category Membership Arity Constraint in the test
       # Property Sheet
-      self._newCategoryMembershipArityConstraint()
+      self._newCategoryMembershipArityConstraint(
+        'test_category_membership_arity_constraint',
+        'Category Membership Arity Constraint')
+
+      # Create a Category Acquired Membership Arity Constraint in the
+      # test Property Sheet
+      self._newCategoryMembershipArityConstraint(
+        'test_category_acquired_membership_arity_constraint',
+        'Category Acquired Membership Arity Constraint')
 
       # Create all the test Properties
       for operation_type in ('change', 'delete', 'assign'):
@@ -875,6 +882,17 @@ class TestZodbPropertySheet(ERP5TypeTestCase):
                           ('test_category_membership_arity_constraint/'\
                            'Test Migration',))
 
+  def testCategoryAcquiredMembershipArityConstraint(self):
+    """
+    Take the test module and check whether the Category Acquired
+    Membership Arity Constraint is there. Until a Base Category is set
+    on the Test Module, the constraint should fail
+    """
+    self._checkConstraint(
+      'test_category_acquired_membership_arity_constraint',
+      self.test_module.setCategoryList,
+      ('test_category_acquired_membership_arity_constraint/Test Migration',))
+
 TestZodbPropertySheet = skip("ZODB Property Sheets code is not enabled yet")(
   TestZodbPropertySheet)
 
-- 
2.30.9