Multi: don't touch slave's value if it's default one's + don't check slave properties (if, for example, disabled for example)

This commit is contained in:
2013-05-17 18:11:14 +02:00
parent d6098f353e
commit 1d8c248d1b
2 changed files with 91 additions and 18 deletions

View File

@ -93,18 +93,21 @@ class Values(object):
return self._values
def getitem(self, opt, validate=True, force_permissive=False,
force_properties=None):
force_properties=None, validate_properties=True):
if opt in self._cache:
exp = time()
value, created = self._cache[opt]
if exp < created:
return value
val = self._getitem(opt, validate, force_permissive, force_properties)
if validate and force_permissive is False and force_properties is None:
val = self._getitem(opt, validate, force_permissive, force_properties,
validate_properties)
if validate and validate_properties and force_permissive is False and \
force_properties is None:
self._set_cache(opt, val)
return val
def _getitem(self, opt, validate, force_permissive, force_properties):
def _getitem(self, opt, validate, force_permissive, force_properties,
validate_properties):
# options with callbacks
setting = self.context.cfgimpl_get_settings()
value = self._get_value(opt, validate)
@ -133,9 +136,10 @@ class Values(object):
if self.is_default_owner(opt) and \
'force_store_value' in setting[opt]:
self.setitem(opt, value, is_write=False)
setting.validate_properties(opt, False, False, value=value,
force_permissive=force_permissive,
force_properties=force_properties)
if validate_properties:
setting.validate_properties(opt, False, False, value=value,
force_permissive=force_permissive,
force_properties=force_properties)
return value
def __setitem__(self, opt, value):
@ -152,13 +156,15 @@ class Values(object):
self._setvalue(opt, value, force_permissive=force_permissive,
is_write=is_write)
def _setvalue(self, opt, value, force_permissive=False, force_properties=None, is_write=True):
def _setvalue(self, opt, value, force_permissive=False, force_properties=None,
is_write=True, validate_properties=True):
self.context.cfgimpl_reset_cache()
setting = self.context.cfgimpl_get_settings()
setting.validate_properties(opt, False, is_write,
value=value,
force_permissive=force_permissive,
force_properties=force_properties)
if validate_properties:
setting.validate_properties(opt, False, is_write,
value=value,
force_permissive=force_permissive,
force_properties=force_properties)
self._values[opt] = (setting.getowner(), value)
def getowner(self, opt):
@ -276,11 +282,13 @@ class Multi(list):
for slave in self.opt.impl_get_master_slaves():
values = self.context.cfgimpl_get_values()
if not values.is_default_owner(slave):
values[slave].append(slave.impl_getdefault_multi(),
force=True)
#get multi without valid properties
values.getitem(slave, validate_properties=False).append(
slave.impl_getdefault_multi(),
force=True)
self._validate(value)
#assume not checking mandatory property
self.context.cfgimpl_get_values()._setvalue(self.opt, self)
#set value without valid properties
self.context.cfgimpl_get_values()._setvalue(self.opt, self, validate_properties=not force)
super(Multi, self).append(value)
def _validate(self, value):
@ -302,6 +310,10 @@ class Multi(list):
" which is a slave").format(self.opt._name))
elif self.opt.impl_get_multitype() == multitypes.master:
for slave in self.opt.impl_get_master_slaves():
self.context.cfgimpl_get_values()[slave].pop(key, force=True)
self.context.cfgimpl_get_values()._setvalue(self.opt, self)
values = self.context.cfgimpl_get_values()
if not values.is_default_owner(slave):
#get multi without valid properties
values.getitem(slave, validate_properties=False).pop(key, force=True)
#set value without valid properties
self.context.cfgimpl_get_values()._setvalue(self.opt, self, validate_properties=not force)
return super(Multi, self).pop(key)