diff --git a/product/ERP5/Document/TradeCondition.py b/product/ERP5/Document/TradeCondition.py index 012f04e24b1492b07cf76ed7ec04e5ad3197dab1..2d7f378e2abc1eeb08aa661fc61581e6b829c219 100644 --- a/product/ERP5/Document/TradeCondition.py +++ b/product/ERP5/Document/TradeCondition.py @@ -37,6 +37,7 @@ from Products.ERP5.Document.Transformation import Transformation from Products.ERP5.Document.Path import Path from Products.ERP5.AggregatedAmountList import AggregatedAmountList from Products.ERP5Type.XMLMatrix import XMLMatrix +from Products.ZSQLCatalog.SQLCatalog import Query, ComplexQuery import zope.interface @@ -387,17 +388,27 @@ class TradeCondition(Path, Transformation, XMLMatrix): reference = self.getReference() if not reference or (start_date is None and stop_date is None): return self - effective_model_list = [] - model_object_list = [result.getObject() for result in \ - self.portal_catalog(portal_type=self.portal_type, - reference=reference, - sort_on=(('version','descending'),), - effective_date="<=%s"%start_date, - expiration_date=">=%s"%stop_date, - limit=1)] - if len(model_object_list): - return model_object_list[0] - return None + + return self.getPortalObject().portal_catalog.unrestrictedGetResultValue( + query=ComplexQuery( + ComplexQuery( + Query(effective_date=None), + Query(effective_date=start_date, + range='ngt'), + logical_operator='OR'), + ComplexQuery( + Query(expiration_date=None), + Query(expiration_date=stop_date, + range='min'), + logical_operator='OR'), + Query(reference=reference), + Query(validation_state=( + 'deleted', 'invalidated'), + operator='NOT'), + Query(portal_type=self.getPortalType()), + logical_operator='AND'), + sort_on=(('version','descending'),)) + security.declareProtected(Permissions.AccessContentsInformation, 'getModelIneritanceEffectiveProperty') diff --git a/product/ERP5/tests/testTradeCondition.py b/product/ERP5/tests/testTradeCondition.py index d499c588a5792198830f7b0b798b4eae20b3ab68..0873efaad2eca0cf264242ca3eac92047b774d94 100644 --- a/product/ERP5/tests/testTradeCondition.py +++ b/product/ERP5/tests/testTradeCondition.py @@ -1822,6 +1822,37 @@ class TestEffectiveTradeCondition(TradeConditionTestCase): start_date=DateTime('2009/06/01'), stop_date=DateTime('2009/06/01'))) + def test_getEffectiveModel_without_dates(self): + # a trade condition without effective / expiration date is effective + self.trade_condition.setReference(self.id()) + self.trade_condition.setEffectiveDate(None) + self.trade_condition.setExpirationDate(None) + transaction.commit() + self.tic() + self.assertEquals(self.trade_condition, + self.trade_condition.getEffectiveModel( + start_date=DateTime('2009/06/01'), + stop_date=DateTime('2009/06/01'))) + + self.trade_condition.setEffectiveDate(None) + self.trade_condition.setExpirationDate('2009/12/31') + transaction.commit() + self.tic() + self.assertEquals(self.trade_condition, + self.trade_condition.getEffectiveModel( + start_date=DateTime('2009/06/01'), + stop_date=DateTime('2009/06/01'))) + + self.trade_condition.setEffectiveDate('2009/01/01') + self.trade_condition.setExpirationDate(None) + transaction.commit() + self.tic() + self.assertEquals(self.trade_condition, + self.trade_condition.getEffectiveModel( + start_date=DateTime('2009/06/01'), + stop_date=DateTime('2009/06/01'))) + + def test_getEffectiveModel_return_self_when_no_reference(self): # when no reference defined, getEffectiveModel returns the trade condition. self.trade_condition.setReference(None)