[Erp5-report] r20291 - in /erp5/trunk/products/ERP5: ./ Document/ tests/

nobody at svn.erp5.org nobody at svn.erp5.org
Thu Apr 3 16:32:03 CEST 2008


Author: alex
Date: Thu Apr  3 16:32:01 2008
New Revision: 20291

URL: http://svn.erp5.org?rev=20291&view=rev
Log:
Add support for individual variations in Resource and Variated API.
Original work by Daniel Feliubadalo and Romain Courteaud.

Added:
    erp5/trunk/products/ERP5/tests/testResourceVariation.py
Modified:
    erp5/trunk/products/ERP5/Document/Resource.py
    erp5/trunk/products/ERP5/Variated.py

Modified: erp5/trunk/products/ERP5/Document/Resource.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/Resource.py?rev=20291&r1=20290&r2=20291&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/Resource.py (original)
+++ erp5/trunk/products/ERP5/Document/Resource.py Thu Apr  3 16:32:01 2008
@@ -82,7 +82,8 @@
     def getVariationRangeCategoryItemList(self, base_category_list=(), base=1, 
                                           root=1, display_id='title', 
                                           display_base_category=1,
-                                          current_category=None, **kw):
+                                          current_category=None,
+                                          omit_individual_variation=0, **kw):
         """
           Returns possible variations
 
@@ -113,41 +114,40 @@
         """
         result = []
         if base_category_list is ():
-          base_category_list = self.getVariationBaseCategoryList()
-        elif type(base_category_list) is type('a'):
+          base_category_list = self.getVariationBaseCategoryList(
+              omit_individual_variation=omit_individual_variation)
+        elif isinstance(base_category_list, str):
           base_category_list = (base_category_list,)
 
+        individual_variation_list = self.searchFolder(
+            portal_type=self.getPortalVariationTypeList(),
+            sort_on=[('title','ascending')])
+        individual_variation_list = [x.getObject() for x in
+            individual_variation_list]
         other_base_category_dict = dict([(i,1) for i in base_category_list])
-        other_variations = self.searchFolder( \
-                               portal_type=self.getPortalVariationTypeList(),
-                               sort_on=[('title','ascending')])
-        other_variations = [x.getObject() for x in other_variations]
-        other_variations = [x for x in other_variations if x is not None]
-
-        for object in other_variations:
-          for base_category in object.getVariationBaseCategoryList():
-            if (base_category_list is ()) or \
-               (base_category in base_category_list):
-              other_base_category_dict[base_category] = 0
-              # XXX now, call Renderer a lot of time.
-              # Better implementation needed
-              result.extend(Renderer(
-                                   base_category=base_category, 
-                                   display_base_category=display_base_category,
-                                   display_none_category=0, base=base,
-                                   current_category=current_category,
-                                   display_id=display_id).\
-                                                     render([object]))
-
-        other_base_category_item_list = filter(lambda x: x[1]==1, 
-            other_base_category_dict.items())
-        other_base_category_list = map(lambda x: x[0],
-            other_base_category_item_list)
+ 
+        if not omit_individual_variation:              
+          for variation in individual_variation_list:
+            for base_category in variation.getVariationBaseCategoryList():
+              if base_category_list is ()\
+                  or base_category in base_category_list:
+                other_base_category_dict[base_category] = 0
+                # XXX now, call Renderer a lot of time.
+                # Better implementation needed
+                result.extend(Renderer(
+                    base_category=base_category, 
+                    display_base_category=display_base_category,
+                    display_none_category=0, base=base,
+                    current_category=current_category,
+                    display_id=display_id).render([variation]))
+
+        other_base_category_list = [x for x, y in
+            other_base_category_dict.iteritems() if y == 1]
         # Get category variation
-        if len(other_base_category_list) != 0:
-          result += Variated.getVariationRangeCategoryItemList(
+        if other_base_category_list:
+          result.extend(Variated.getVariationRangeCategoryItemList(
               self, base_category_list=other_base_category_list,
-              base=base, display_base_category=display_base_category, **kw)
+              base=base, display_base_category=display_base_category, **kw))
         # Return result
         return result
 
@@ -169,31 +169,37 @@
         *old parameters: base=1, current_category=None, 
                          display_id='getTitle' (default value getTitleOrId)
       """
+      base_category_list = base_category_list or \
+          self.getVariationBaseCategoryList()
+      
+      individual_bc_list = self.getIndividualVariationBaseCategoryList()
+      other_bc_list = [x for x in base_category_list if x not
+          in individual_bc_list]
+      
       result = Variated.getVariationCategoryItemList(self, 
-                            base_category_list=base_category_list, 
+                            base_category_list=other_bc_list, 
                             display_base_category=display_base_category, 
                             display_id=display_id, base=base, **kw)
+      
       if not omit_individual_variation:
-        other_variations = self.searchFolder(
-                              portal_type=self.getPortalVariationTypeList())
-
-        other_variations = map(lambda x: x.getObject(), other_variations)
-        other_variations = filter(lambda x: x is not None, other_variations)
-
-        for object in other_variations:
-          for base_category in object.getVariationBaseCategoryList():
-            if (base_category_list is ()) or \
-               (base_category in base_category_list):
+        individual_variation_list = self.searchFolder(
+            portal_type=self.getPortalVariationTypeList())
+        individual_variation_list = [x.getObject() for x in
+            individual_variation_list]
+
+        for variation in individual_variation_list:
+          for base_category in variation.getVariationBaseCategoryList():
+            if (base_category_list is () or base_category in
+                base_category_list) and base_category in individual_bc_list:
               # XXX append object, relative_url ?
               # XXX now, call Renderer a lot of time.
               # Better implementation needed
               result.extend(Renderer(
-                             base_category=base_category, 
-                             display_base_category=display_base_category,
-                             display_none_category=0, base=base,
-                             current_category=current_category,
-                             display_id=display_id, **kw).\
-                                               render([object]))
+                  base_category=base_category,
+                  display_base_category=display_base_category,
+                  display_none_category=0, base=base,
+                  current_category=current_category, display_id=display_id,
+                  **kw).render([variation]))
       return result
 
     security.declareProtected(Permissions.AccessContentsInformation,
@@ -231,7 +237,7 @@
       vcil = self.getVariationCategoryItemList(
                     base_category_list=base_category_list,
                     omit_individual_variation=omit_individual_variation,**kw)
-      return map(lambda x: x[1], vcil)
+      return [x[1] for x in vcil]
 
     # Unit conversion
     security.declareProtected(Permissions.AccessContentsInformation, 'convertQuantity')

Modified: erp5/trunk/products/ERP5/Variated.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Variated.py?rev=20291&r1=20290&r2=20291&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Variated.py (original)
+++ erp5/trunk/products/ERP5/Variated.py Thu Apr  3 16:32:01 2008
@@ -62,7 +62,7 @@
   security.declareProtected(Permissions.AccessContentsInformation, 
                             'getVariationBaseCategoryList')
   def getVariationBaseCategoryList(self, omit_optional_variation=0,
-      omit_option_base_category=None):
+      omit_option_base_category=None, omit_individual_variation=0):
     """
       Return the list of variation base category.
       If omit_optional_variation==1, do not include base category
@@ -81,6 +81,12 @@
       # of a good API.
       option_base_category_list = self.getPortalOptionBaseCategoryList()
       vbcl = [x for x in vbcl if x not in option_base_category_list]
+    else:
+      vbcl.extend(self.getOptionalVariationBaseCategoryList())
+      
+    if omit_individual_variation == 0:
+      vbcl.extend(self.getIndividualVariationBaseCategoryList())
+      
     return vbcl
 
   security.declareProtected(Permissions.AccessContentsInformation, 
@@ -222,7 +228,8 @@
   security.declareProtected(Permissions.AccessContentsInformation,
                                     'getVariationBaseCategoryItemList')
   def getVariationBaseCategoryItemList(self, display_id='title_or_id',
-        omit_optional_variation=0, omit_option_base_category=None):
+        omit_optional_variation=0, omit_option_base_category=None,
+        omit_individual_variation=0):
       """
         Returns base category of the resource
         as a list of tuples (title, id). This is mostly
@@ -236,7 +243,8 @@
         omit_optional_variation = omit_option_base_category
 
       variation_base_category_list = self.getVariationBaseCategoryList(
-          omit_optional_variation=omit_optional_variation)
+          omit_optional_variation=omit_optional_variation,
+          omit_individual_variation=omit_individual_variation)
       result = []
       for base_category in variation_base_category_list:
         bc = self.portal_categories.resolveCategory(base_category)
@@ -348,16 +356,18 @@
   security.declareProtected(Permissions.AccessContentsInformation,
                             'getVariationRangeCategoryList')
   def getVariationRangeCategoryList(self, base_category_list=(), base=1,
-                                    root=1, current_category=None):
+                                    root=1, current_category=None,
+                                    omit_individual_variation=0):
     """
       Returns the range of acceptable categories
     """
     vrcil = self.getVariationRangeCategoryItemList(
-                               base_category_list=base_category_list,
-                               base=base, root=root, 
-                               current_category=current_category)
+                          base_category_list=base_category_list,
+                          base=base, root=root, 
+                          current_category=current_category,
+                          omit_individual_variation=omit_individual_variation)
     # display is on left
-    return map(lambda x: x[1], vrcil)
+    return [x[1] for x in vrcil]
 
   # Context related methods
   security.declarePublic('newVariationValue')

Added: erp5/trunk/products/ERP5/tests/testResourceVariation.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testResourceVariation.py?rev=20291&view=auto
==============================================================================
--- erp5/trunk/products/ERP5/tests/testResourceVariation.py (added)
+++ erp5/trunk/products/ERP5/tests/testResourceVariation.py Thu Apr  3 16:32:01 2008
@@ -1,0 +1,747 @@
+#############################################################################
+#
+# Copyright (c) 2007 Nexedi SA and Contributors. All Rights Reserved.
+#                    Daniel Feliubadalo  <daniel at sip2000.com>
+#                    Romain Courteaud  <romain at nexedi.com>
+#                    Alexandre Boeglin  <alex at 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.
+#
+##############################################################################
+
+"""
+Tests Resource Variations
+"""
+import unittest
+from Testing import ZopeTestCase
+from zLOG import LOG
+from Products.ERP5Type.tests.ERP5TypeTestCase import ERP5TypeTestCase
+from Products.ERP5Type.tests.utils import reindex
+from Products.DCWorkflow.DCWorkflow import ValidationFailed
+from AccessControl.SecurityManagement import newSecurityManager
+from AccessControl import getSecurityManager
+from Products.ERP5Type.tests.Sequence import Sequence, SequenceList
+from DateTime import DateTime
+
+class ResourceVariationTestCase(ERP5TypeTestCase):
+  """Tests starts with a preference activated for self.my_organisation, logged in
+  as a user with Manager role.
+
+  All documents created appart from this configuration will be deleted in
+  teardown. So users of this test case are encouraged to create new documents
+  rather than modifying default documents.
+  """
+  def logMessage(self, msg, tab=0):
+    """
+    Log a message.
+    """
+    if tab:
+      msg = '  %s' % msg
+    ZopeTestCase._print('\n%s' % msg)
+    LOG('testResource.play', 0, msg)
+
+  def _doWorkflowAction(self, ob, action, **kw):
+    self.portal.portal_workflow.doActionFor(ob, action,
+                                            comment = 'for unit test',**kw)
+
+  @reindex
+  def _makeOneResource(self, portal_type='Product',
+                       validation_state='draft', **kw):
+    """
+    Creates an resource
+
+    The default settings is for self.section.
+    You can pass a list of mapping as lines, then lines will be created
+    using this information.
+    """
+    rs = self.portal.getDefaultModule(portal_type).newContent(
+                              portal_type=portal_type,**kw)
+
+    if validation_state == 'validated':
+      rs.validate()
+    return rs
+
+  @reindex
+  def _makeOneResourceIndividualVariation(self, resource, **kw):
+    """
+    Creates a Individual variation sub object, and edit it with kw.
+    """
+    iv = resource.newContent(portal_type='%s Individual Variation' % \
+                              resource.getPortalType(), **kw)
+    return iv
+
+  def login(self):
+    """
+    Login Manager roles.
+    """
+    uf = self.getPortal().acl_users
+    uf._doAddUser('testmanager', 'test', ['Manager', 'Assignee', 'Assignor',
+                               'Associate', 'Auditor', 'Author'], [])
+    user = uf.getUserById('testmanager').__of__(uf)
+    newSecurityManager(None, user)
+    
+  def loginUser(self):
+    """
+    Login without Manager roles.
+    """
+    uf = self.getPortal().acl_users
+    uf._doAddUser('user', 'user',
+                  ['Assignee', 'Assignor', 'Associate',
+                   'Auditor', 'Author'], [])
+    user = uf.getUserById('user').__of__(uf)
+    newSecurityManager(None, user)
+
+  def afterSetUp(self):
+    """
+    - create categories
+    - create preference
+    - make sure categories are included to portal types
+    """
+    self.portal = self.getPortal()
+    self.portal_categories = self.portal.portal_categories
+    self.portal_preferences = self.portal.portal_preferences
+    self.product_module = self.portal.product_module
+    self.service_module = self.portal.service_module
+    self.component_module = self.portal.component_module
+
+    # create variation categories
+    category_type=('line', 'variation')
+    if not self.portal_categories.hasContent('required_size'):
+      size = self.portal_categories.newContent(portal_type='Base Category',
+                                title='Required Size',
+                                reference='required_size',
+                                id='required_size',
+                                category_type=category_type)
+    else:
+      size = self.portal_categories['required_size']
+
+    size.newContent(portal_type='Category', title='Large',
+                    reference='l',id='l')
+    size.newContent(portal_type='Category', title='Medium',
+                    reference='l',id='m')
+    size.newContent(portal_type='Category', title='Small',
+                    reference='l',id='s')
+    size.newContent(portal_type='Category', title='XL',
+                    reference='l',id='xl')
+    size.newContent(portal_type='Category', title='XXL',
+                    reference='l',id='xxl')
+
+    if not self.portal_categories.hasContent('option_colour'):
+      colour = self.portal_categories.newContent(portal_type='Base Category',
+                                title='Optional Colour',
+                                reference='option_colour',
+                                id='option_colour',
+                                category_type=category_type)
+    else:
+      colour = self.portal_categories['option_colour']
+
+    colour.newContent(portal_type='Category', title='Blue',
+                      reference='l',id='blue')
+    colour.newContent(portal_type='Category', title='Green',
+                      reference='l',id='green')
+    colour.newContent(portal_type='Category', title='Red',
+                      reference='l',id='red')
+
+    if not self.portal_categories.hasContent('individual_aspect'):
+      aspect = self.portal_categories.newContent(portal_type='Base Category',
+                                title='Individual Aspect',
+                                reference='individual_aspect',
+                                id='individual_aspect',
+                                category_type=category_type)
+
+    aspect.newContent(portal_type='Category', title='Aspect 1',
+                      reference='A1',id='a1')
+    aspect.newContent(portal_type='Category', title='Aspect 2',
+                      reference='A2',id='a2')
+
+    #create resource variation preferences
+    if not self.portal_preferences.hasContent('test_site_preference'):
+      preference = self.portal_preferences.newContent(portal_type='Preference',
+                                title='Default Site Preference',
+                                id='test_site_preference')
+      preference.enable()
+
+    value='individual_aspect'
+    self.portal_preferences['test_site_preference'
+                ].setPreferredProductIndividualVariationBaseCategory(value)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredServiceIndividualVariationBaseCategory(value)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredComponentIndividualVariationBaseCategory(value)
+
+    value=('required_size',)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredProductVariationBaseCategoryList(value)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredServiceVariationBaseCategoryList(value)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredComponentVariationBaseCategoryList(value)
+
+    value=('option_colour',)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredProductOptionalVariationBaseCategory(value)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredServiceOptionalVariationBaseCategory(value)
+    self.portal_preferences['test_site_preference'
+                ].setPreferredComponentOptionalVariationBaseCategory(value)
+                
+    self.portal_preferences['test_site_preference'].enable()
+    # all this available to catalog
+
+    #adding to base categories of resources
+    #for use setRequiredSizeList and setOptionColourList methods
+    self.portal.portal_types['Product'].base_category_list = [
+                                            'required_size',
+                                            'option_colour',
+                                            'individual_aspect']
+    self.portal.portal_types['Service'].base_category_list = [
+                                            'required_size',
+                                            'option_colour',
+                                            'individual_aspect']
+    self.portal.portal_types['Component'].base_category_list = [
+                                            'required_size',
+                                            'option_colour',
+                                            'individual_aspect']
+                                            
+    get_transaction().commit()
+    self.tic()
+
+  def beforeTearDown(self):
+    """Remove all documents.
+    """
+    get_transaction().abort()
+    self.product_module.manage_delObjects(
+                      list(self.service_module.objectIds()))
+    self.service_module.manage_delObjects(
+                      list(self.service_module.objectIds()))
+    self.component_module.manage_delObjects(
+                      list(self.component_module.objectIds()))
+    self.portal_categories.manage_delObjects((['required_size',
+                                    'individual_aspect','option_colour']))
+
+    get_transaction().commit()
+    self.tic()
+
+  def getBusinessTemplateList(self):
+    """Returns list of BT to be installed."""
+    return ('erp5_base', 'erp5_pdm')
+  
+  def _testResourceDefaultConfig(self,resource):
+    """
+    Check variation API when creating a default resource.
+    This should use what is defined in preferences.
+    """
+    # XXX Check default config
+    self.assertSameSet(['required_size', 
+                        'option_colour', 
+                        'individual_aspect'],
+                        resource.getVariationBaseCategoryList())
+                        
+    self.assertSameSet(['required_size/l',
+                        'required_size/m', 
+                        'required_size/s', 
+                        'required_size/xl', 
+                        'required_size/xxl', 
+                        'individual_aspect/a1', 
+                        'individual_aspect/a2', 
+                        'option_colour/blue', 
+                        'option_colour/green', 
+                        'option_colour/red'], 
+                        resource.getVariationRangeCategoryList())
+                        
+    self.assertSameSet([], resource.getVariationCategoryList())
+    
+  def _testResourceWithoutVariation(self,resource):
+    """
+    Check variation API when creating a resource and removing its variation
+    axes
+    """
+    resource.edit(variation_base_category_list=[],
+                  optional_variation_base_category_list=[],
+                  individual_variation_base_category_list=[])
+
+    self.assertSameSet([], resource.getVariationBaseCategoryList())
+    self.assertSameSet([], resource.getVariationRangeCategoryList())
+    self.assertSameSet([], resource.getVariationCategoryList())
+
+    # XXX What happens when we create an individual variation
+    resource_circular = self._makeOneResourceIndividualVariation(
+              resource,
+              id='1',
+              title='Circular')
+
+    self.assertSameSet([], resource.getVariationBaseCategoryList())
+    self.assertSameSet([], resource.getVariationRangeCategoryList())
+    self.assertSameSet([], resource.getVariationCategoryList())
+
+  def _testResourceCategoryVariation(self,resource):
+    """
+    Check variation API when defining only category as variation
+    axes
+    """
+    # Define variations
+    resource.setRequiredSizeList(['l', 'm','s'])
+
+    resource.setOptionColourList(['blue'])
+
+    self.assertSameSet(['required_size','option_colour','individual_aspect'],
+                       resource.getVariationBaseCategoryList())
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'option_colour/blue'],
+                       resource.getVariationCategoryList())
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/a1',
+                        'individual_aspect/a2'],
+                        resource.getVariationRangeCategoryList())
+
+    # Now, define aspect categories, which should not be used as variation
+    resource.setIndividualAspectList(['a1'])
+
+    self.assertSameSet(['required_size','option_colour','individual_aspect'],
+                       resource.getVariationBaseCategoryList())
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'option_colour/blue'],
+                       resource.getVariationCategoryList())
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/a1',
+                        'individual_aspect/a2'],
+                       resource.getVariationRangeCategoryList())
+
+  def _testResourceIndividualVariation(self,resource):
+    """
+    Check variation API when defining individual variation
+    """
+    # Creating individual variations of resource
+    resource_iv1 = self._makeOneResourceIndividualVariation(resource,
+              id='1',
+              title='Circular',
+    )
+
+    resource_iv2 = self._makeOneResourceIndividualVariation(resource,
+              id='2',
+              title='Triangular',
+    )
+
+    resource_iv3 = self._makeOneResourceIndividualVariation(resource,
+              id='3',
+              title='Square',
+    )
+    # Check default parameter
+    self.assertSameSet([],
+                       resource.getVariationCategoryList())
+    self.assertSameSet(['individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                        resource.getVariationCategoryList(
+                                omit_individual_variation=0))
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                        resource.getVariationRangeCategoryList())
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                        resource.getVariationRangeCategoryList(
+                                omit_individual_variation=0))
+
+    # Now, define aspect categories, which should not be used as variation
+    resource.setIndividualAspectList(['a1'])
+
+    # Check default parameter
+    self.assertSameSet([],
+                       resource.getVariationCategoryList())
+    self.assertSameSet(['individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                       resource.getVariationCategoryList(
+                                omit_individual_variation=0))
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                       resource.getVariationRangeCategoryList())
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                       resource.getVariationRangeCategoryList(
+                                omit_individual_variation=0))
+
+  def _testResourceVariation(self,resource):
+    """
+    Combine individual and category variations
+    """
+    resource.setRequiredSizeList(['l', 'm', 's'])
+
+    resource.setOptionColourList(['blue'])
+
+    # creating individual variations of resource
+    resource_iv1=self._makeOneResourceIndividualVariation(resource,
+              id='1',
+              title='Circular',
+    )
+
+    resource_iv2=self._makeOneResourceIndividualVariation(resource,
+              id='2',
+              title='Triangular',
+    )
+
+    resource_iv3=self._makeOneResourceIndividualVariation(resource,
+              id='3',
+              title='Square',
+    )
+
+    self.assertSameSet(['option_colour',],
+                             resource.getOptionalVariationBaseCategoryList())
+
+    self.assertSameSet(['individual_aspect',],
+                             resource.getIndividualVariationBaseCategoryList())
+
+    # Check default parameters
+    self.assertSameSet(['required_size','option_colour','individual_aspect'],
+                             resource.getVariationBaseCategoryList())
+
+    self.assertSameSet(['required_size','option_colour','individual_aspect'],
+                             resource.getVariationBaseCategoryList(
+                                         omit_individual_variation=0,
+                                         omit_optional_variation=0))
+
+    self.assertSameSet(['required_size','option_colour'],
+                             resource.getVariationBaseCategoryList(
+                                         omit_individual_variation=1,
+                                         omit_optional_variation=0))
+
+    self.assertSameSet(['required_size',],
+                             resource.getVariationBaseCategoryList(
+                                         omit_individual_variation=1,
+                                         omit_optional_variation=1))
+
+    # Check default parameters
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'option_colour/blue'],
+                             resource.getVariationCategoryList())
+
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'option_colour/blue',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                             resource.getVariationCategoryList(
+                                         omit_individual_variation=0))
+
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'option_colour/blue'],
+                             resource.getVariationCategoryList(
+                                         omit_individual_variation=1))
+
+    # Check default parameters
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                             resource.getVariationRangeCategoryList())
+
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red',
+                        'individual_aspect/'+resource_iv1.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv2.getRelativeUrl(),
+                        'individual_aspect/'+resource_iv3.getRelativeUrl()],
+                             resource.getVariationRangeCategoryList(
+                                         omit_individual_variation=0))
+
+    self.assertSameSet(['required_size/l',
+                        'required_size/m',
+                        'required_size/s',
+                        'required_size/xl',
+                        'required_size/xxl',
+                        'option_colour/blue',
+                        'option_colour/green',
+                        'option_colour/red'],
+                            resource.getVariationRangeCategoryList(
+                                         omit_individual_variation=1))
+
+class TestResourceVariation(ResourceVariationTestCase):
+  """
+  Test Resource Variation
+
+  Test basic cases of gathering data to render forms, the purpose of those
+  tests is to exercise basic variation results.
+  """
+  def getTitle(self):
+    return "Resource Variations"
+
+  def testResourceDefaultConfig(self):
+    """
+    Check variation API when creating a default resource.
+    This should use what is defined in preferences.
+    """
+    self.logMessage('testResourceDefaultConfig')
+    # Create Product
+    product = self._makeOneResource(
+              id='1',
+              portal_type='Product',
+              title='Product One',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceDefaultConfig(product)
+    # Create Service
+    service = self._makeOneResource(
+              id='1',
+              portal_type='Service',
+              title='Service One',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceDefaultConfig(service)
+    # Create Component
+    component = self._makeOneResource(
+              id='1',
+              portal_type='Component',
+              title='Component One',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceDefaultConfig(component)
+
+  def testResourceWithoutVariation(self):
+    """
+    Check variation API when creating a resource and removing its variation
+    axes
+    """
+    self.logMessage('testResourceWithoutVariation')
+    # Create Product
+    product = self._makeOneResource(
+              id='2',
+              portal_type='Product',
+              title='Product Two',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceWithoutVariation(product)
+    # Create Service
+    service = self._makeOneResource(
+              id='2',
+              portal_type='Service',
+              title='Service Two',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceWithoutVariation(service)
+    # Create Component
+    component = self._makeOneResource(
+              id='2',
+              portal_type='Component',
+              title='Component Two',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceWithoutVariation(component)
+
+  def testResourceCategoryVariation(self):
+    """
+    Check variation API when defining only category as variation
+    axes
+    """
+    self.logMessage('testResourceCategoryVariation')
+    # Create Product
+    product = self._makeOneResource(
+              id='3',
+              portal_type='Product',
+              title='Product Three',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceCategoryVariation(product)
+    # Create Service
+    service = self._makeOneResource(
+              id='3',
+              portal_type='Service',
+              title='Service Three',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceCategoryVariation(service)
+    # Create Component
+    component = self._makeOneResource(
+              id='3',
+              portal_type='Component',
+              title='Component Three',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceCategoryVariation(component)
+
+  def testResourceIndividualVariation(self):
+    """
+    Check variation API when defining individual variation
+    """
+    self.logMessage('testResourceIndividualVariation')
+    # Create Product
+    product = self._makeOneResource(
+              id='4',
+              portal_type='Product',
+              title='Product Four',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceIndividualVariation(product)
+    # Create Service
+    service = self._makeOneResource(
+              id='4',
+              portal_type='Service',
+              title='Service Four',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceIndividualVariation(service)
+    # Create Component
+    component = self._makeOneResource(
+              id='4',
+              portal_type='Component',
+              title='Component Four',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceIndividualVariation(component)
+
+  def testResourceVariation(self):
+    """
+    Combine individual and category variations
+    """
+    # Resource Variation test.
+    self.logMessage('testResourceVariation')
+    # Create Product
+    product = self._makeOneResource(
+              id='5',
+              portal_type='Product',
+              title='Product Five',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceVariation(product)
+    # Create Service
+    service = self._makeOneResource(
+              id='5',
+              portal_type='Service',
+              title='Service Five',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceVariation(service)
+    # Create Component
+    component = self._makeOneResource(
+              id='5',
+              portal_type='Component',
+              title='Component Five',
+              validation_state='validated',
+              variation_base_category='required_size',
+              optional_variation_base_category='option_colour',
+              individual_variation_base_category='individual_aspect')
+    self._testResourceVariation(component)
+              
+def test_suite():
+  suite = unittest.TestSuite()
+  suite.addTest(unittest.makeSuite(TestResourceVariation))
+  return suite
+




More information about the Erp5-report mailing list