[Erp5-report] r19922 - in /erp5/trunk/products/ERP5: Document/ tests/
nobody at svn.erp5.org
nobody at svn.erp5.org
Fri Mar 14 17:20:15 CET 2008
Author: alex
Date: Fri Mar 14 17:20:14 2008
New Revision: 19922
URL: http://svn.erp5.org?rev=19922&view=rev
Log:
* OrderCell.py: isMovement is now a function, depends on whether parent
contains lines.
getTotalPrice, getTotalQuantity return 0.0 if the current object is not
considered a movement.
* DeliveryLine.py (manage_afterAdd, manage_beforeDelete): when adding or
removing a line from a line, reindex the parent, as its "isMovement" value
might change.
* OrderLine.py: _getTotalPrice, getTotalQuantity support hierarchical orders.
* testOrder: test_19b_getTotalQuantityAndPrice verifies that isMovement,
getTotalPrice, getTotalQuantity support hierarchical orders.
Modified:
erp5/trunk/products/ERP5/Document/DeliveryLine.py
erp5/trunk/products/ERP5/Document/OrderCell.py
erp5/trunk/products/ERP5/Document/OrderLine.py
erp5/trunk/products/ERP5/tests/testOrder.py
Modified: erp5/trunk/products/ERP5/Document/DeliveryLine.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/DeliveryLine.py?rev=19922&r1=19921&r2=19922&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/DeliveryLine.py (original)
+++ erp5/trunk/products/ERP5/Document/DeliveryLine.py Fri Mar 14 17:20:14 2008
@@ -373,3 +373,18 @@
parent = self.getParentValue()
if parent is not None:
parent.updateSimulationDeliveryProperties(movement_list, self)
+
+ security.declarePrivate('manage_afterAdd')
+ def manage_afterAdd(self, item, container):
+ "if the container is a line too, reindex it"
+ if self.meta_type == container.meta_type:
+ container.reindexObject()
+ return Movement.manage_afterAdd(self, item, container)
+
+ security.declarePrivate('manage_beforeDelete')
+ def manage_beforeDelete(self, item, container):
+ "if the container is a line too, reindex it"
+ if self.meta_type == container.meta_type:
+ container.reindexObject()
+ return Movement.manage_beforeDelete(self, item, container)
+
Modified: erp5/trunk/products/ERP5/Document/OrderCell.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/OrderCell.py?rev=19922&r1=19921&r2=19922&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/OrderCell.py (original)
+++ erp5/trunk/products/ERP5/Document/OrderCell.py Fri Mar 14 17:20:14 2008
@@ -47,7 +47,6 @@
meta_type = 'ERP5 Order Cell'
portal_type = 'Order Cell'
isCell = 1
- isMovement = 1
# Declarative security
security = ClassSecurityInfo()
@@ -74,3 +73,26 @@
Reindex children and simulation
"""
self.recursiveReindexObject(*k,**kw)
+
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'isMovement')
+ def isMovement(self):
+ """
+ should be considered as a movement if the parent does not have sub lines
+ """
+ return not self.getParentValue().hasLineContent()
+
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'getTotalPrice')
+ def getTotalPrice(self, *args, **kw):
+ "only return a value if self is a movement"
+ if not self.isMovement(): return 0.0
+ return DeliveryCell.getTotalPrice(self, *args, **kw)
+
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'getTotalQuantity')
+ def getTotalQuantity(self, *args, **kw):
+ "only return a value if self is a movement"
+ if not self.isMovement(): return 0.0
+ return DeliveryCell.getTotalQuantity(self, *args, **kw)
+
Modified: erp5/trunk/products/ERP5/Document/OrderLine.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/Document/OrderLine.py?rev=19922&r1=19921&r2=19922&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/Document/OrderLine.py (original)
+++ erp5/trunk/products/ERP5/Document/OrderLine.py Fri Mar 14 17:20:14 2008
@@ -80,6 +80,48 @@
transactional_variable[call_method_key] = result
return result
+ def _getTotalPrice(self, context, fast=1):
+ """
+ if hasLineContent: return sum of lines total price
+ if hasCellContent: return sum of cells total price
+ else: return quantity * price
+ """
+ base_id = 'movement'
+ if self.hasLineContent():
+ return sum(l.getTotalPrice() for l in
+ self.contentValues(meta_type=self.meta_type))
+ elif self.hasCellContent(base_id=base_id):
+ if fast : # Use MySQL
+ aggregate = self.DeliveryLine_zGetTotal()[0]
+ return aggregate.total_price or 0.0
+ return sum([ ( (cell.getQuantity() or 0) *
+ (cell.getPrice(context=context) or 0))
+ for cell in self.getCellValueList()])
+ else:
+ quantity = self.getQuantity() or 0.0
+ price = self.getPrice(context=context) or 0.0
+ return quantity * price
+
+ security.declareProtected(Permissions.AccessContentsInformation,
+ 'getTotalQuantity')
+ def getTotalQuantity(self, fast=1):
+ """
+ if hasLineContent: return sum of lines total quantity
+ if hasCellContent: return sum of cells total quantity
+ else: return quantity
+ """
+ base_id = 'movement'
+ if self.hasLineContent():
+ return sum(l.getTotalQuantity() for l in
+ self.contentValues(meta_type=self.meta_type))
+ elif self.hasCellContent(base_id=base_id):
+ if fast : # Use MySQL
+ aggregate = self.DeliveryLine_zGetTotal()[0]
+ return aggregate.total_quantity or 0.0
+ return sum([cell.getQuantity() for cell in self.getCellValueList()])
+ else:
+ return self.getQuantity()
+
def applyToOrderLineRelatedMovement(self, portal_type='Simulation Movement',
method_id = 'expand'):
"""
Modified: erp5/trunk/products/ERP5/tests/testOrder.py
URL: http://svn.erp5.org/erp5/trunk/products/ERP5/tests/testOrder.py?rev=19922&r1=19921&r2=19922&view=diff
==============================================================================
--- erp5/trunk/products/ERP5/tests/testOrder.py (original)
+++ erp5/trunk/products/ERP5/tests/testOrder.py Fri Mar 14 17:20:14 2008
@@ -1850,12 +1850,11 @@
def test_19_getMovementList(self, quiet=0, run=run_all_test):
"""
Check getMovementList.
- Verify that it manage hierarchical order lines.
+ Verify that it supports hierarchical order lines.
Check that order cells are returned when defined on a leaf line, and not
returned when defined on a non leaf line.
"""
if not run: return
- sequence_list = SequenceList()
portal = self.getPortal()
order_module = portal.getDefaultModule(portal_type=self.order_portal_type)
@@ -1932,6 +1931,199 @@
portal_type=self.order_cell_portal_type,
*cell_key)
self.assertEquals(2-1+len(cell_key_list), len(order.getMovementList()))
+
+ def test_19b_getTotalQuantityAndPrice(self, quiet=0, run=run_all_test):
+ """
+ Check getTotalQuantity and getTotalPrice.
+ Check isMovement.
+ Verify that it supports hierarchical order lines.
+ Note that this depends on isMovement and Order Line reindexation
+ """
+ if not run: return
+
+ portal = self.getPortal()
+ base_id = 'movement'
+ order_line_vcl=['size/Baby']
+ order_module = portal.getDefaultModule(portal_type=self.order_portal_type)
+ order = order_module.newContent(portal_type=self.order_portal_type)
+
+ # No line, no movement
+ self.assertEquals(order.getTotalQuantity(fast=0), 0)
+ self.assertEquals(order.getTotalQuantity(fast=1), 0)
+ self.assertEquals(order.getTotalPrice(fast=0), 0)
+ self.assertEquals(order.getTotalPrice(fast=1), 0)
+
+ # Create a variated resource
+ resource_module = portal.getDefaultModule(self.resource_portal_type)
+ resource = resource_module.newContent(
+ portal_type=self.resource_portal_type,
+ variation_base_category_list=['size'],
+ size_list=self.size_list)
+
+ # One line is considered as a movement
+ order_line = order.newContent(
+ portal_type=self.order_line_portal_type,
+ resource_value=resource,
+ price=2,
+ quantity=3)
+ get_transaction().commit()
+ self.tic()
+
+ self.assertEquals(order_line.isMovement(), True)
+
+ self.assertEquals(order.getTotalQuantity(fast=0), 3)
+ self.assertEquals(order.getTotalQuantity(fast=1), 3)
+ self.assertEquals(order.getTotalPrice(fast=0), 6)
+ self.assertEquals(order.getTotalPrice(fast=1), 6)
+
+ self.assertEquals(order_line.getTotalQuantity(fast=0), 3)
+ self.assertEquals(order_line.getTotalQuantity(fast=1), 3)
+ self.assertEquals(order_line.getTotalPrice(fast=0), 6)
+ self.assertEquals(order_line.getTotalPrice(fast=1), 6)
+
+ # add cell to line, line is not a movement anymore
+ order_line.setVariationCategoryList(order_line_vcl)
+ cell_key = order_line.getCellKeyList(base_id=base_id)[0]
+ cell = order_line.newCell(
+ base_id=base_id,
+ portal_type=self.order_cell_portal_type,
+ *cell_key)
+ cell.edit(mapped_value_property_list=['price', 'quantity'],
+ price=3, quantity=4,
+ predicate_category_list=cell_key,
+ variation_category_list=cell_key)
+ get_transaction().commit()
+ self.tic()
+
+ self.assertEquals(order_line.isMovement(), False)
+ self.assertEquals(cell.isMovement(), True)
+
+ self.assertEquals(order.getTotalQuantity(fast=0), 4)
+ self.assertEquals(order.getTotalQuantity(fast=1), 4)
+ self.assertEquals(order.getTotalPrice(fast=0), 12)
+ self.assertEquals(order.getTotalPrice(fast=1), 12)
+
+ self.assertEquals(order_line.getTotalQuantity(fast=0), 4)
+ self.assertEquals(order_line.getTotalQuantity(fast=1), 4)
+ self.assertEquals(order_line.getTotalPrice(fast=0), 12)
+ self.assertEquals(order_line.getTotalPrice(fast=1), 12)
+
+ self.assertEquals(cell.getTotalQuantity(), 4)
+ self.assertEquals(cell.getTotalPrice(fast=0), 12)
+ self.assertEquals(cell.getTotalPrice(fast=1), 12)
+
+ # add sub_line to line, cell and line are not movements
+ sub_order_line = order_line.newContent(
+ portal_type=self.order_line_portal_type,
+ price=4,
+ quantity=5)
+ get_transaction().commit()
+ self.tic()
+
+ self.assertEquals(order_line.isMovement(), False)
+ self.assertEquals(cell.isMovement(), False)
+ self.assertEquals(sub_order_line.isMovement(), True)
+
+ self.assertEquals(order.getTotalQuantity(fast=0), 5)
+ self.assertEquals(order.getTotalQuantity(fast=1), 5)
+ self.assertEquals(order.getTotalPrice(fast=0), 20)
+ self.assertEquals(order.getTotalPrice(fast=1), 20)
+
+ self.assertEquals(order_line.getTotalQuantity(fast=0), 5)
+ self.assertEquals(order_line.getTotalQuantity(fast=1), 5)
+ self.assertEquals(order_line.getTotalPrice(fast=0), 20)
+ self.assertEquals(order_line.getTotalPrice(fast=1), 20)
+
+ self.assertEquals(cell.getTotalQuantity(), 0)
+ self.assertEquals(cell.getTotalPrice(fast=0), 0)
+ self.assertEquals(cell.getTotalPrice(fast=1), 0)
+
+ self.assertEquals(sub_order_line.getTotalQuantity(fast=0), 5)
+ self.assertEquals(sub_order_line.getTotalQuantity(fast=1), 5)
+ self.assertEquals(sub_order_line.getTotalPrice(fast=0), 20)
+ self.assertEquals(sub_order_line.getTotalPrice(fast=1), 20)
+
+ # add sub_cell to sub_line, only sub_cell is movement
+ sub_order_line.setVariationCategoryList(order_line_vcl)
+ sub_cell_key = sub_order_line.getCellKeyList(base_id=base_id)[0]
+ sub_cell = sub_order_line.newCell(
+ base_id=base_id,
+ portal_type=self.order_cell_portal_type,
+ *cell_key)
+ sub_cell.edit(mapped_value_property_list=['price', 'quantity'],
+ price=5, quantity=6,
+ predicate_category_list=cell_key,
+ variation_category_list=cell_key)
+ get_transaction().commit()
+ self.tic()
+
+ self.assertEquals(order_line.isMovement(), False)
+ self.assertEquals(cell.isMovement(), False)
+ self.assertEquals(sub_order_line.isMovement(), False)
+ self.assertEquals(sub_cell.isMovement(), True)
+
+ self.assertEquals(order.getTotalQuantity(fast=0), 6)
+ self.assertEquals(order.getTotalQuantity(fast=1), 6)
+ self.assertEquals(order.getTotalPrice(fast=0), 30)
+ self.assertEquals(order.getTotalPrice(fast=1), 30)
+
+ self.assertEquals(order_line.getTotalQuantity(fast=0), 6)
+ self.assertEquals(order_line.getTotalQuantity(fast=1), 6)
+ self.assertEquals(order_line.getTotalPrice(fast=0), 30)
+ self.assertEquals(order_line.getTotalPrice(fast=1), 30)
+
+ self.assertEquals(cell.getTotalQuantity(), 0)
+ self.assertEquals(cell.getTotalPrice(fast=0), 0)
+ self.assertEquals(cell.getTotalPrice(fast=1), 0)
+
+ self.assertEquals(sub_order_line.getTotalQuantity(fast=0), 6)
+ self.assertEquals(sub_order_line.getTotalQuantity(fast=1), 6)
+ self.assertEquals(sub_order_line.getTotalPrice(fast=0), 30)
+ self.assertEquals(sub_order_line.getTotalPrice(fast=1), 30)
+
+ self.assertEquals(sub_cell.getTotalQuantity(), 6)
+ self.assertEquals(sub_cell.getTotalPrice(fast=0), 30)
+ self.assertEquals(sub_cell.getTotalPrice(fast=1), 30)
+
+ # delete sub_line, cell is movement again
+ order_line.manage_delObjects([sub_order_line.getId()])
+ get_transaction().commit()
+ self.tic()
+
+ self.assertEquals(order_line.isMovement(), False)
+ self.assertEquals(cell.isMovement(), True)
+
+ self.assertEquals(order.getTotalQuantity(fast=0), 4)
+ self.assertEquals(order.getTotalQuantity(fast=1), 4)
+ self.assertEquals(order.getTotalPrice(fast=0), 12)
+ self.assertEquals(order.getTotalPrice(fast=1), 12)
+
+ self.assertEquals(order_line.getTotalQuantity(fast=0), 4)
+ self.assertEquals(order_line.getTotalQuantity(fast=1), 4)
+ self.assertEquals(order_line.getTotalPrice(fast=0), 12)
+ self.assertEquals(order_line.getTotalPrice(fast=1), 12)
+
+ self.assertEquals(cell.getTotalQuantity(), 4)
+ self.assertEquals(cell.getTotalPrice(fast=0), 12)
+ self.assertEquals(cell.getTotalPrice(fast=1), 12)
+
+ # delete cell, line is movement again
+ order_line.manage_delObjects([cell.getId()])
+ order_line.setVariationCategoryList([])
+ get_transaction().commit()
+ self.tic()
+
+ self.assertEquals(order_line.isMovement(), True)
+
+ self.assertEquals(order.getTotalQuantity(fast=0), 3)
+ self.assertEquals(order.getTotalQuantity(fast=1), 3)
+ self.assertEquals(order.getTotalPrice(fast=0), 6)
+ self.assertEquals(order.getTotalPrice(fast=1), 6)
+
+ self.assertEquals(order_line.getTotalQuantity(fast=0), 3)
+ self.assertEquals(order_line.getTotalQuantity(fast=1), 3)
+ self.assertEquals(order_line.getTotalPrice(fast=0), 6)
+ self.assertEquals(order_line.getTotalPrice(fast=1), 6)
def stepCreateSubOrderLine(self,sequence=None, sequence_list=None, **kw):
"""
More information about the Erp5-report
mailing list