[Erp5-report] r37257 jerome - in /erp5/trunk/products/ERP5: Tool/ bootstrap/erp5_core/SkinT...

nobody at svn.erp5.org nobody at svn.erp5.org
Fri Jul 23 17:34:29 CEST 2010


Author: jerome
Date: Fri Jul 23 17:34:16 2010
New Revision: 37257

URL: http://svn.erp5.org?rev=37257&view=rev
Log:
When we group by an axis or an axis category in getInventoryList, expose the
uid of this axis on the brain.
This means that if we do group_by_section_category=True, the brains will have
an attribute section_category_uid that will be the uid of the section category
for this brain.
Also add support for select_dict and select_list to have the same feature when
grouping on a related key.
Fix typo from r37215, group_by_project_category was not working

Modified:
    erp5/trunk/products/ERP5/Tool/SimulationTool.py
    erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Resource_zGetInventoryList.xml
    erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
    erp5/trunk/products/ERP5/tests/testInventoryAPI.py

Modified: erp5/trunk/products/ERP5/Tool/SimulationTool.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Tool/SimulationTool.py?rev=37257&r1=37256&r2=37257&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Tool/SimulationTool.py [utf8] (original)
+++ erp5/trunk/products/ERP5/Tool/SimulationTool.py [utf8] Fri Jul 23 17:34:16 2010
@@ -423,13 +423,12 @@ class SimulationTool(BaseTool):
         ctool = getToolByName(self, 'portal_catalog')
         sql_kw = sql_kw.copy()
         new_kw = new_kw.copy()
-        # Some columns cannot be found automatically, prepend table name to
-        # avoid ambiguities.
 
         # Group-by expression  (eg. group_by=['node_uid'])
         group_by = new_kw.pop('group_by', [])
 
         # group by from stock table (eg. group_by_node=True)
+        # prepend table name to avoid ambiguities.
         column_group_by = new_kw.pop('column_group_by', [])
         if column_group_by:
           group_by.extend(['%s.%s' % (table, x) for x in column_group_by])
@@ -450,6 +449,14 @@ class SimulationTool(BaseTool):
         if group_by:
           new_kw['group_by'] = group_by
 
+        # select expression
+        select_dict = new_kw.get('select_dict', dict())
+        related_key_select_expression_list = new_kw.pop(
+                'related_key_select_expression_list', [])
+        if related_key_select_expression_list:
+          select_dict[x] = '%s_%s' % (table, x)
+        new_kw['select_dict'] = select_dict
+
         # Column values
         column_value_dict = new_kw.pop('column_value_dict', {})
         for key, value in column_value_dict.iteritems():
@@ -745,6 +752,18 @@ class SimulationTool(BaseTool):
                       ['catalog.uid=%s' % uid for uid in uid_list])
 
       # build the group by expression
+      # if we group by a criterion, we also add this criterion to the select
+      # expression, unless it is already selected in Resource_zGetInventoryList
+      # the caller can also pass select_dict or select_list. select_expression,
+      # which is deprecated in ZSQLCatalog is not supported here.
+      select_dict = kw.get('select_dict', {})
+      # we support select_list, if passed
+      select_list = kw.get('select_list', [])
+      for select_key in kw.get('select_list', []):
+        select_dict[select_key] = None
+      new_kw['select_dict'] = select_dict
+      related_key_select_expression_list = []
+
       column_group_by_expression_list = []
       related_key_group_by_expression_list = []
       if group_by_node:
@@ -777,42 +796,65 @@ class SimulationTool(BaseTool):
 
       if group_by_section_category:
         related_key_group_by_expression_list.append('section_category_uid')
+        related_key_select_expression_list.append('stock_section_category_uid')
       if group_by_section_category_strict_membership:
         related_key_group_by_expression_list.append(
             'section_category_strict_membership_uid')
+        related_key_select_expression_list.append(
+            'section_category_strict_membership_uid')
       if group_by_mirror_section_category:
         related_key_group_by_expression_list.append('mirror_section_category_uid')
+        related_key_select_expression_list.append('mirror_section_category_uid')
       if group_by_mirror_section_category_strict_membership:
         related_key_group_by_expression_list.append(
             'mirror_section_category_strict_membership_uid')
+        related_key_select_expression_list.append(
+            'mirror_section_category_strict_membership_uid')
       if group_by_node_category:
         related_key_group_by_expression_list.append('node_category_uid')
+        related_key_select_expression_list.append('node_category_uid')
       if group_by_node_category_strict_membership:
         related_key_group_by_expression_list.append(
             'node_category_strict_membership_uid')
+        related_key_select_expression_list.append(
+            'node_category_strict_membership_uid')
       if group_by_mirror_node_category:
         related_key_group_by_expression_list.append('mirror_node_category_uid')
       if group_by_mirror_node_category_strict_membership:
         related_key_group_by_expression_list.append(
             'mirror_node_category_strict_membership_uid')
+        related_key_select_expression_list.append(
+            'mirror_node_category_strict_membership_uid')
       if group_by_payment_category:
         related_key_group_by_expression_list.append('payment_category_uid')
+        related_key_select_expression_list.append('payment_category_uid')
       if group_by_payment_category_strict_membership:
         related_key_group_by_expression_list.append(
             'payment_category_strict_membership_uid')
+        related_key_select_expression_list.append(
+            'payment_category_strict_membership_uid')
       if group_by_function_category:
         related_key_group_by_expression_list.append('function_category_uid')
+        related_key_select_expression_list.append('function_category_uid')
       if group_by_function_category_strict_membership:
         related_key_group_by_expression_list.append(
             'function_category_strict_membership_uid')
-      if group_by_function_category:
-        related_key_group_by_expression_list.append('function_category_uid')
-      if group_by_function_category_strict_membership:
-        related_key_group_by_expression_list.append(
+        related_key_select_expression_list.append(
             'function_category_strict_membership_uid')
+      if group_by_project_category:
+        related_key_group_by_expression_list.append('project_category_uid')
+        related_key_select_expression_list.append('project_category_uid')
+      if group_by_project_category_strict_membership:
+        related_key_group_by_expression_list.append(
+            'project_category_strict_membership_uid')
+        related_key_select_expression_list.append(
+            'project_category_strict_membership_uid')
 
       if related_key_group_by_expression_list:
         new_kw['related_key_group_by'] = related_key_group_by_expression_list
+      if related_key_select_expression_list:
+        new_kw['related_key_select_expression_list'] =\
+                related_key_select_expression_list
 
       return sql_kw, new_kw
 

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Resource_zGetInventoryList.xml
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Resource_zGetInventoryList.xml?rev=37257&r1=37256&r2=37257&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Resource_zGetInventoryList.xml [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/SkinTemplateItem/portal_skins/erp5_core/Resource_zGetInventoryList.xml [utf8] Fri Jul 23 17:34:16 2010
@@ -131,6 +131,12 @@
                                 </value>
                             </item>
                             <item>
+                                <key> <string>select_expression</string> </key>
+                                <value>
+                                  <dictionary/>
+                                </value>
+                            </item>
+                            <item>
                                 <key> <string>selection_domain</string> </key>
                                 <value>
                                   <dictionary/>
@@ -195,6 +201,7 @@
                             <string>order_by_expression</string>
                             <string>group_by_expression</string>
                             <string>selection_domain</string>
+                            <string>select_expression</string>
                             <string>selection_report</string>
                             <string>ignore_variation</string>
                             <string>standardize</string>
@@ -233,6 +240,7 @@ where_expression\r\n
 order_by_expression\r\n
 group_by_expression\r\n
 selection_domain\r\n
+select_expression\r\n
 selection_report\r\n
 ignore_variation\r\n
 standardize\r\n
@@ -354,7 +362,7 @@ SELECT\n
   COUNT(DISTINCT <dtml-var stock_table_id>.uid) AS stock_uid,\n
   MAX(<dtml-var stock_table_id>.date) AS date\n
 </dtml-if>\n
-\n
+<dtml-if select_expression>, <dtml-var select_expression></dtml-if>\n
 \n
 FROM\n
   catalog, <dtml-var stock_table_id>\n
@@ -526,7 +534,7 @@ SELECT\n
   COUNT(DISTINCT <dtml-var stock_table_id>.uid) AS stock_uid,\n
   MAX(<dtml-var stock_table_id>.date) AS date\n
 </dtml-if>\n
-\n
+<dtml-if select_expression>, <dtml-var select_expression></dtml-if>\n
 \n
 FROM\n
   catalog, <dtml-var stock_table_id>\n

Modified: erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision?rev=37257&r1=37256&r2=37257&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] (original)
+++ erp5/trunk/products/ERP5/bootstrap/erp5_core/bt/revision [utf8] Fri Jul 23 17:34:16 2010
@@ -1 +1 @@
-1636
\ No newline at end of file
+1637
\ No newline at end of file

Modified: erp5/trunk/products/ERP5/tests/testInventoryAPI.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testInventoryAPI.py?rev=37257&r1=37256&r2=37257&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testInventoryAPI.py [utf8] (original)
+++ erp5/trunk/products/ERP5/tests/testInventoryAPI.py [utf8] Fri Jul 23 17:34:16 2010
@@ -798,6 +798,28 @@ class TestInventoryList(InventoryAPITest
                                       group_by_section_category=1)
     self.assertEquals(1, len(inventory_list))
     self.assertEquals(3+2, inventory_list[0].inventory)
+    # section category is exported in the brain
+    self.assertTrue(hasattr(inventory_list[0], 'section_category_uid'))
+    self.assertEquals(self.portal.portal_categories.group.level1.getUid(),
+                      inventory_list[0].section_category_uid)
+
+  def test_GroupBySectionCategoryStrict(self):
+    getInventoryList = self.getSimulationTool().getInventoryList
+    self.section.setGroup('level1')
+    self.other_section.setGroup('level1')
+    m1 = self._makeMovement(quantity=2)
+    m2 = self._makeMovement(destination_section_value=self.other_section, quantity=3)
+
+    inventory_list = getInventoryList(node_uid=self.node.getUid(),
+                                      section_category='group/level1',
+                                      group_by_section_category_strict_membership=1)
+    self.assertEquals(1, len(inventory_list))
+    self.assertEquals(3+2, inventory_list[0].inventory)
+    # section category is exported in the brain
+    self.assertTrue(hasattr(inventory_list[0],
+      'section_category_strict_membership_uid'))
+    self.assertEquals(self.portal.portal_categories.group.level1.getUid(),
+                      inventory_list[0].section_category_strict_membership_uid)
 
   def test_GroupByFunction(self):
     getInventoryList = self.getSimulationTool().getInventoryList
@@ -896,6 +918,21 @@ class TestInventoryList(InventoryAPITest
             if r.getObject().getUse() == 'use1'][0].inventory, 5)
     self.assertEquals([r for r in inventory_list
         if r.getObject().getUse() == 'use2'][0].inventory, 11)
+    
+    # in such case, it's interesting to pass a select expression, to be have on
+    # brain the information of which category is used
+    inventory_list = getInventoryList(node_uid=(self.node.getUid(),
+                                                self.other_node.getUid()),
+                                      group_by=('strict_use_uid', ),
+                                      select_list=['strict_use_uid'])
+    self.assertEquals(2, len(inventory_list))
+    self.assertTrue(hasattr(inventory_list[0], 'strict_use_uid'))
+    use = self.portal.portal_categories.use
+    self.assertEquals([r for r in inventory_list
+      if r.strict_use_uid == use.use1.getUid()][0].inventory, 5)
+    self.assertEquals([r for r in inventory_list
+      if r.strict_use_uid == use.use2.getUid()][0].inventory, 11)
+
     # group_by can also be passed as string
     inventory_list = getInventoryList(node_uid=(self.node.getUid(),
                                                 self.other_node.getUid()),
@@ -906,6 +943,23 @@ class TestInventoryList(InventoryAPITest
     self.assertEquals([r for r in inventory_list
         if r.getObject().getUse() == 'use2'][0].inventory, 11)
 
+    # if we group by "use_uid" instead of "strict_use_uid", then we'll have
+    # summary lines.
+    inventory_list = getInventoryList(node_uid=(self.node.getUid(),
+                                                self.other_node.getUid()),
+                                      group_by=('use_uid', ),
+                                      select_list=['use_uid'])
+    self.assertEquals(3, len(inventory_list))
+    self.assertTrue(hasattr(inventory_list[0], 'use_uid'))
+    use = self.portal.portal_categories.use
+    self.assertEquals([r for r in inventory_list
+      if r.use_uid == use.use1.getUid()][0].inventory, 5)
+    self.assertEquals([r for r in inventory_list
+      if r.use_uid == use.use2.getUid()][0].inventory, 11)
+    # the summary line
+    self.assertEquals([r for r in inventory_list
+      if r.use_uid == use.getUid()][0].inventory, 11+5)
+
     # the name of a column can also be used, from stock or other tables
     inventory_list = getInventoryList(node_uid=(self.node.getUid(),
                                                 self.other_node.getUid()),




More information about the Erp5-report mailing list