diff --git a/product/ERP5Form/PreferenceTool.py b/product/ERP5Form/PreferenceTool.py index 48bee75c01e3f41e6986cfa52da0a6d0b35c84fc..f6c4932d6eb5834ec677bd72847faed29f917da0 100644 --- a/product/ERP5Form/PreferenceTool.py +++ b/product/ERP5Form/PreferenceTool.py @@ -40,6 +40,7 @@ from Products.ERP5Type.Accessor.TypeDefinition import list_types from Products.ERP5Form import _dtmldir from Products.ERP5Form.Document.Preference import Priority +_marker = [] def updatePreferenceClassPropertySheetList(): # The Preference class should be imported from the common location @@ -124,11 +125,10 @@ class PreferenceMethod(Method): def __call__(self, instance, *args, **kw): def _getPreference(user_name=None): - MARKER = [] value = None for pref in instance._getSortedPreferenceList(): - value = getattr(pref, self._preference_name, MARKER) - if value is not MARKER: + value = getattr(pref, self._preference_name, _marker) + if value is not _marker: # If callable, store the return value. if callable(value): value = value() @@ -144,8 +144,13 @@ class PreferenceMethod(Method): # all values are null values, one of them must be returned. # Therefore, return a default value, only if explicitly specified, # instead of returning None. - if value in self._null and args: - return args[0] + default = _marker + if 'default' in kw: + default = kw['default'] + elif args: + default = args[0] + if value in self._null and default is not _marker: + return default return value class PreferenceTool(BaseTool): @@ -176,11 +181,15 @@ class PreferenceTool(BaseTool): BaseTool.inheritedAttribute('manage_afterAdd')(self, item, container) security.declareProtected(Permissions.View, "getPreference") - def getPreference(self, pref_name, default=None) : + def getPreference(self, pref_name, default=_marker) : """ get the preference on the most appopriate Preference object. """ method = getattr(self, 'get%s' % convertToUpperCase(pref_name), None) if method is not None: - return method(default=default) + if default is not _marker: + kw = {'default': default} + else: + kw = {} + return method(**kw) return default security.declareProtected(Permissions.ModifyPortalContent, "setPreference") diff --git a/product/ERP5Form/tests/testPreferences.py b/product/ERP5Form/tests/testPreferences.py index 7075d9052fdad1755335dcf67c3f0d1f3b75f10b..2a8d85dc1b60f2b1cc4d18397fc51f48433135eb 100644 --- a/product/ERP5Form/tests/testPreferences.py +++ b/product/ERP5Form/tests/testPreferences.py @@ -376,13 +376,24 @@ class TestPreferences(ERP5TypeTestCase): state = method('default') self.assertEquals(state, 'default') + method = lambda *args: pref_tool.getPreference('preferred_accounting_transaction_simulation_state', *args) + state = method() + self.assertEquals(state, None) + state = method('default') + self.assertEquals(state, 'default') + method = pref_tool.getPreferredAccountingTransactionSimulationStateList state_list = method() self.assertEquals(state_list, None) state_list = method(('default',)) self.assertEquals(state_list, ('default',)) - + method = lambda *args: pref_tool.getPreference('preferred_accounting_transaction_simulation_state_list', *args) + state_list = method() + self.assertEquals(state_list, None) + state_list = method(('default',)) + self.assertEquals(state_list, ('default',)) + def test_suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestPreferences))