Commit 0f33633e authored by Nicolas Dumazet's avatar Nicolas Dumazet

Quantity Unit Definitions: Performance & backward-compatibility (2/2)

* Add a (failing) test where the old system is used for quantities
* Use a cached Python Script to keep the universal quantity definitions:
  * erp5_content_long
  * delete the cache when a global quantity definition is changed via an
    interaction workflow on Definitions
  * Use the catalog to retrieve the global definitions
  * If no Quantity Definitions are defined _at all_, then it falls
    back and uses the properties on categories



git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@32167 20353a03-c40f-0410-a6d1-a30d3c3de9de
parent 8a7186da
No related merge requests found
...@@ -852,29 +852,6 @@ class Resource(XMLMatrix, Variated): ...@@ -852,29 +852,6 @@ class Resource(XMLMatrix, Variated):
if len(result) == 1: if len(result) == 1:
return result[0] return result[0]
def _getGlobalQuantityUnitDefinitionDict(self):
# XXX this info could be cached, as it is the same for all Resources
result = {}
module = self.getPortalObject().quantity_unit_conversion_module
for definition_list in module.objectValues(portal_type= \
'Quantity Unit Conversion Group'):
standard_quantity_unit_uid = definition_list.getQuantityUnitUid()
if standard_quantity_unit_uid is None:
continue
result[standard_quantity_unit_uid] = (None, 1.0)
for definition in definition_list.objectValues(portal_type= \
'Quantity Unit Conversion Definition'):
unit_uid = definition.getQuantityUnitUid()
if unit_uid is None:
continue
quantity = definition.getQuantity()
if not quantity:
continue
result[unit_uid] = (definition.getUid(), quantity)
return result
def _getQuantityUnitDefinitionDict(self): def _getQuantityUnitDefinitionDict(self):
""" """
Returns a dictionary representing the Unit Definitions that hold Returns a dictionary representing the Unit Definitions that hold
...@@ -889,7 +866,8 @@ class Resource(XMLMatrix, Variated): ...@@ -889,7 +866,8 @@ class Resource(XMLMatrix, Variated):
For example, if mass/g is the global standard quantity_unit, all For example, if mass/g is the global standard quantity_unit, all
definitions for mass/* will be expressed in grams. definitions for mass/* will be expressed in grams.
""" """
global_definition_dict = self._getGlobalQuantityUnitDefinitionDict() global_definition_dict = self.\
QuantityUnitConversionModule_getUniversalDefinitionDict()
result = global_definition_dict.copy() result = global_definition_dict.copy()
for definition_list in self.objectValues(portal_type= \ for definition_list in self.objectValues(portal_type= \
......
...@@ -2409,6 +2409,7 @@ class BaseTestUnitConversion(InventoryAPITestCase): ...@@ -2409,6 +2409,7 @@ class BaseTestUnitConversion(InventoryAPITestCase):
InventoryAPITestCase.afterSetUp(self) InventoryAPITestCase.afterSetUp(self)
self.setUpUnitDefinition() self.setUpUnitDefinition()
self._safeTic()
def makeMovement(self, quantity, resource, *variation, **kw): def makeMovement(self, quantity, resource, *variation, **kw):
m = self._makeMovement(quantity=quantity, resource_value=resource, m = self._makeMovement(quantity=quantity, resource_value=resource,
...@@ -2671,6 +2672,65 @@ class TestUnitConversionDefinition(BaseTestUnitConversion): ...@@ -2671,6 +2672,65 @@ class TestUnitConversionDefinition(BaseTestUnitConversion):
self.resource_bylot_overriding\ self.resource_bylot_overriding\
.convertQuantity(1, "unit/lot", "unit/unit")) .convertQuantity(1, "unit/lot", "unit/unit"))
class TestUnitConversionBackwardCompatibility(BaseTestUnitConversion):
QUANTITY_UNIT_DICT = {
# base: (reference, dict_of_others)
'mass': ('kilogram', dict(gram=0.001)),
}
METRIC_TYPE_CATEGORY_LIST = (
'mass/net',
)
def setUpUnitDefinition(self):
# bypass Unit Definition setup
mass_category = self.portal.portal_categories.quantity_unit.mass
mass_category.gram.setProperty('quantity', 0.001)
mass_category.kilogram.setProperty('quantity', 1)
pass
def testBackwardCompatibility(self):
delivery_rule = self.getRuleTool().default_delivery_rule
delivery_rule.validate()
resource = self.portal.product_module.newContent(
portal_type='Product',
quantity_unit_list=('mass/gram',
'mass/kilogram'),)
node = self.portal.organisation_module.newContent(
portal_type='Organisation')
delivery = self.portal.purchase_packing_list_module.newContent(
portal_type='Purchase Packing List',
start_date='2010-01-26',
price_currency='currency_module/EUR',
destination_value=node,
destination_section_value=node)
delivery.newContent(portal_type='Purchase Packing List Line',
resource_value=resource,
quantity=10,
quantity_unit='mass/gram')
delivery.newContent(portal_type='Purchase Packing List Line',
resource_value=resource,
quantity=3,
quantity_unit='mass/kilogram')
delivery.confirm()
delivery.start()
delivery.stop()
transaction.commit()
self.tic()
# inventories of that resource are indexed in grams
self.assertEquals(3010,
self.portal.portal_simulation.getCurrentInventory(
resource_uid=resource.getUid(),
node_uid=node.getUid()))
# converted inventory also works
self.assertEquals(3.01,
self.portal.portal_simulation.getCurrentInventory(
quantity_unit='mass/kilogram',
resource_uid=resource.getUid(),
node_uid=node.getUid()))
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestInventory)) suite.addTest(unittest.makeSuite(TestInventory))
...@@ -2682,6 +2742,7 @@ def test_suite(): ...@@ -2682,6 +2742,7 @@ def test_suite():
suite.addTest(unittest.makeSuite(TestInventoryDocument)) suite.addTest(unittest.makeSuite(TestInventoryDocument))
suite.addTest(unittest.makeSuite(TestUnitConversion)) suite.addTest(unittest.makeSuite(TestUnitConversion))
suite.addTest(unittest.makeSuite(TestUnitConversionDefinition)) suite.addTest(unittest.makeSuite(TestUnitConversionDefinition))
suite.addTest(unittest.makeSuite(TestUnitConversionBackwardCompatibility))
return suite return suite
# vim: foldmethod=marker # vim: foldmethod=marker
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment