leadership support
This commit is contained in:
@ -71,10 +71,9 @@ class TiramisuOptionOption:
|
||||
def isleader(self):
|
||||
if '.' in self._path:
|
||||
parent_schema = self.config.get_schema(self._path.rsplit('.', 1)[0])
|
||||
leader = next(iter(parent_schema['properties'].keys()))
|
||||
if parent_schema['type'] == 'array' and \
|
||||
leader == self._path:
|
||||
return True
|
||||
if parent_schema['type'] == 'array':
|
||||
leader = next(iter(parent_schema['properties'].keys()))
|
||||
return leader == self._path
|
||||
return False
|
||||
|
||||
def isfollower(self):
|
||||
@ -264,14 +263,14 @@ class TiramisuOptionValue(_Value):
|
||||
|
||||
def set(self, value):
|
||||
type_ = self.schema['type']
|
||||
if self.schema.get('isMulti', False):
|
||||
remote = self.form.get(self.path, {}).get('remote', False)
|
||||
if self.index is None and self.schema.get('isMulti', False):
|
||||
if not isinstance(value, list):
|
||||
raise Exception('value must be a list')
|
||||
for val in value:
|
||||
self._validate(type_, val)
|
||||
else:
|
||||
self._validate(type_, value)
|
||||
remote = self.form.get(self.path, {}).get('remote', False)
|
||||
self.config.modify_value(self.path,
|
||||
self.index,
|
||||
value,
|
||||
@ -501,7 +500,7 @@ class Config:
|
||||
def __init__(self,
|
||||
json):
|
||||
self.model_ori = json['model']
|
||||
self.model = self.gen_model(json['model'])
|
||||
self.gen_model(json['model'])
|
||||
self.form = {}
|
||||
for option in json['form']:
|
||||
if 'key' in option:
|
||||
@ -519,24 +518,27 @@ class Config:
|
||||
|
||||
def gen_model(self,
|
||||
model) -> List[Dict]:
|
||||
ret = {}
|
||||
self.model = {}
|
||||
for option in model:
|
||||
key = option['key']
|
||||
if 'index' in option:
|
||||
if key not in ret:
|
||||
ret[key] = copy(option)
|
||||
ret[key]['value'] = {}
|
||||
del ret[key]['index']
|
||||
del ret[key]['owner']
|
||||
if 'hidden' in ret[key]:
|
||||
del ret[key]['hidden']
|
||||
if option.get('hidden') is True:
|
||||
ret[key]['value'][option['index']] = ()
|
||||
else:
|
||||
ret[key]['value'][option['index']] = (option['value'], option['owner'])
|
||||
self.update_model(option)
|
||||
|
||||
def update_model(self,
|
||||
model):
|
||||
key = model['key']
|
||||
if 'index' in model:
|
||||
if key not in self.model:
|
||||
self.model[key] = copy(model)
|
||||
self.model[key]['value'] = {}
|
||||
del self.model[key]['index']
|
||||
del self.model[key]['owner']
|
||||
if 'hidden' in self.model[key]:
|
||||
del self.model[key]['hidden']
|
||||
if model.get('hidden') is True:
|
||||
self.model[key]['value'][model['index']] = ()
|
||||
else:
|
||||
ret[key] = option
|
||||
return ret
|
||||
self.model[key]['value'][model['index']] = (model['value'], model['owner'])
|
||||
else:
|
||||
self.model[key] = model
|
||||
|
||||
def __getattr__(self,
|
||||
subfunc: str) -> Any:
|
||||
@ -594,14 +596,10 @@ class Config:
|
||||
path: str,
|
||||
index: Optional[int],
|
||||
remote: bool) -> None:
|
||||
schema = self.get_schema(path)
|
||||
value = schema.get('value');
|
||||
if value is None and schema.get('isMulti', False):
|
||||
value = []
|
||||
self.updates_value('delete',
|
||||
path,
|
||||
index,
|
||||
value,
|
||||
None,
|
||||
remote,
|
||||
None)
|
||||
|
||||
@ -682,8 +680,10 @@ class Config:
|
||||
if value is None and self.get_schema(path).get('isMulti', False):
|
||||
value = []
|
||||
else:
|
||||
model = self.model.get(path, {})
|
||||
value = model.get('value')
|
||||
if index in self.temp.get(path, {}).get('value', {}):
|
||||
value = self.temp[path].get('value')
|
||||
else:
|
||||
value = self.model.get(path, {}).get('value')
|
||||
if value is not None:
|
||||
if index in value:
|
||||
if len(value[index]):
|
||||
@ -691,7 +691,7 @@ class Config:
|
||||
else:
|
||||
value = PropertiesOptionError(None, None, None, opt_type='option')
|
||||
else:
|
||||
value = None
|
||||
value = self.get_schema(path).get('default')
|
||||
else:
|
||||
value = None
|
||||
return value
|
||||
@ -751,7 +751,7 @@ class Config:
|
||||
del self.updates[-1]
|
||||
|
||||
if update_last_action:
|
||||
if value is None:
|
||||
if action == 'delete' and value is None:
|
||||
if 'value' in last_body:
|
||||
del last_body['value']
|
||||
else:
|
||||
@ -762,7 +762,7 @@ class Config:
|
||||
else:
|
||||
data = {'action': action,
|
||||
'name': path}
|
||||
if value is not None:
|
||||
if action != 'delete' and value is not None:
|
||||
data['value'] = value
|
||||
if index is not None:
|
||||
data['index'] = index
|
||||
@ -777,18 +777,62 @@ class Config:
|
||||
'model': self.model_ori}))
|
||||
|
||||
else:
|
||||
self.temp.setdefault(path, {})['owner'] = 'tmp'
|
||||
self.temp[path]['value'] = value
|
||||
if action == 'delete':
|
||||
self.temp.setdefault(path, {})['owner'] = 'tmp'
|
||||
if index is None:
|
||||
value = self.default_value(path)
|
||||
self.temp[path]['value'] = value
|
||||
if self.option(path).option.isleader():
|
||||
leadership_path = path.rsplit('.', 1)[0]
|
||||
parent_schema = self.get_schema(leadership_path)
|
||||
iter_leadership = list(parent_schema['properties'].keys())
|
||||
for follower in iter_leadership[1:]:
|
||||
for idx in range(len(value)):
|
||||
follower_value = self.get_schema(follower).get('default')
|
||||
# FIXME PropertiesOptionError?
|
||||
self.temp.setdefault(follower, {}).setdefault('value', {})[idx] = (follower_value, 'default')
|
||||
elif self.option(path).option.isleader():
|
||||
old_value = self.option(path).value.get()
|
||||
old_value.pop(index)
|
||||
self.temp[path]['value'] = old_value
|
||||
leadership_path = path.rsplit('.', 1)[0]
|
||||
parent_schema = self.get_schema(leadership_path)
|
||||
iter_leadership = list(parent_schema['properties'].keys())
|
||||
for follower in iter_leadership[1:]:
|
||||
if index in self.temp.get(follower, {}).get('value', {}):
|
||||
del self.temp[follower]['value'][index]
|
||||
if index in self.model.get(follower, {}).get('value', {}):
|
||||
del self.model[follower]['value'][index]
|
||||
else:
|
||||
if index in self.temp.get(path, {}).get('value', {}):
|
||||
del self.temp[path]['value'][index]
|
||||
if index in self.model.get(path, {}).get('value', {}):
|
||||
del self.model[path]['value'][index]
|
||||
elif index is None:
|
||||
self.temp.setdefault(path, {})['owner'] = 'tmp'
|
||||
self.temp[path]['value'] = value
|
||||
else:
|
||||
self.temp.setdefault(path, {}).setdefault('value', {})[index] = (value, 'tmp')
|
||||
self.set_dependencies(path, value)
|
||||
self.set_not_equal(path, value)
|
||||
self.do_copy(path, value)
|
||||
|
||||
def default_value(self, path):
|
||||
schema = self.get_schema(path)
|
||||
value = schema.get('value');
|
||||
if value is None and schema.get('isMulti', False):
|
||||
value = []
|
||||
return value
|
||||
|
||||
def updates_data(self, data):
|
||||
self.updates = []
|
||||
self.temp.clear()
|
||||
# FIXME remove old key ?
|
||||
for model in data['model']:
|
||||
self.model[model['key']] = model
|
||||
for key in data['updates']:
|
||||
if key in self.model:
|
||||
del self.model[key]
|
||||
for model in data['model']:
|
||||
if key == model['key']:
|
||||
self.update_model(model)
|
||||
self.model_ori = data['model']
|
||||
|
||||
def test_value(self,
|
||||
|
Reference in New Issue
Block a user