tiramisu-json format 1.0
This commit is contained in:
@ -117,7 +117,7 @@ class TiramisuOptionProperty:
|
||||
props = self.config.get_properties(self.model, self.path, self.index, only_raises)
|
||||
else:
|
||||
props = []
|
||||
if self.config.get_hidden(self.path,
|
||||
if self.config.is_hidden(self.path,
|
||||
self.index):
|
||||
props.append('hidden')
|
||||
return props
|
||||
@ -132,11 +132,7 @@ class _Value:
|
||||
withwarning: bool) -> None:
|
||||
leadership_len = None
|
||||
for key, option in schema['properties'].items():
|
||||
hidden = self.temp.get(key, {}).get('hidden', None)
|
||||
model_display = not self.model.get(key, {}).get('hidden', False) and \
|
||||
self.model.get(key, {}).get('display', True)
|
||||
|
||||
if hidden is False or (hidden is None and model_display is True):
|
||||
if self.config.is_hidden(key, None) is False:
|
||||
if option['type'] in ['object', 'array']:
|
||||
# optiondescription or leadership
|
||||
self._dict_walk(ret,
|
||||
@ -293,26 +289,22 @@ class _Option:
|
||||
if type not in ['all', 'option']:
|
||||
raise NotImplementedError()
|
||||
for path, schema in self.schema['properties'].items():
|
||||
if type == 'all' or schema['type'] not in ['object', 'array']:
|
||||
hidden = self.temp.get(path, {}).get('hidden', None)
|
||||
model_display = not self.model.get(path, {}).get('hidden', False) and \
|
||||
self.model.get(path, {}).get('display', True)
|
||||
if hidden is False or (hidden is None and model_display is True):
|
||||
if schema['type'] in ['object', 'array']:
|
||||
yield TiramisuOptionDescription(self.config,
|
||||
schema,
|
||||
self.model,
|
||||
self.form,
|
||||
self.temp,
|
||||
path)
|
||||
else:
|
||||
yield TiramisuOption(self.config,
|
||||
schema,
|
||||
self.model,
|
||||
self.form,
|
||||
self.temp,
|
||||
path,
|
||||
self.index)
|
||||
if type == 'all' or schema['type'] not in ['object', 'array'] and self.config.is_hidden(path, None):
|
||||
if schema['type'] in ['object', 'array']:
|
||||
yield TiramisuOptionDescription(self.config,
|
||||
schema,
|
||||
self.model,
|
||||
self.form,
|
||||
self.temp,
|
||||
path)
|
||||
else:
|
||||
yield TiramisuOption(self.config,
|
||||
schema,
|
||||
self.model,
|
||||
self.form,
|
||||
self.temp,
|
||||
path,
|
||||
self.index)
|
||||
|
||||
|
||||
class TiramisuOptionDescription(_Option):
|
||||
@ -355,10 +347,7 @@ class TiramisuOptionDescription(_Option):
|
||||
raise APIError(_('please specify a valid sub function ({})').format(subfunc))
|
||||
|
||||
def group_type(self):
|
||||
hidden = self.temp.get(self.path, {}).get('hidden', None)
|
||||
model_display = not self.model.get(self.path, {}).get('hidden', False) and \
|
||||
self.model.get(self.path, {}).get('display', True)
|
||||
if hidden is False or (hidden is None and model_display):
|
||||
if self.config.is_hidden(self.path, None):
|
||||
# FIXME
|
||||
return 'default'
|
||||
raise PropertiesOptionError(None, None, None, opt_type='optiondescription')
|
||||
@ -499,14 +488,14 @@ class Config:
|
||||
# config
|
||||
def __init__(self,
|
||||
json):
|
||||
self.model_ori = json['model']
|
||||
self.gen_model(json['model'])
|
||||
self.model = json['model']
|
||||
self.form = json['form']
|
||||
self.form = {}
|
||||
for option in json['form']:
|
||||
if 'key' in option:
|
||||
# support pattern
|
||||
for key, option in json['form'].items():
|
||||
if key != 'null':
|
||||
if 'pattern' in option:
|
||||
option['pattern'] = re.compile(option['pattern'])
|
||||
self.form[option['key']] = option
|
||||
self.temp = {}
|
||||
self.schema = json['schema']
|
||||
self.updates = []
|
||||
@ -516,30 +505,6 @@ class Config:
|
||||
else:
|
||||
self.root = ''
|
||||
|
||||
def gen_model(self,
|
||||
model) -> List[Dict]:
|
||||
self.model = {}
|
||||
for option in model:
|
||||
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:
|
||||
self.model[key]['value'][model['index']] = (model['value'], model['owner'])
|
||||
else:
|
||||
self.model[key] = model
|
||||
|
||||
def __getattr__(self,
|
||||
subfunc: str) -> Any:
|
||||
if subfunc == 'property':
|
||||
@ -618,7 +583,7 @@ class Config:
|
||||
props.append('mandatory')
|
||||
if model.get('readOnly'):
|
||||
props.append('frozen')
|
||||
if only_raises and self.get_hidden(path,
|
||||
if only_raises and self.is_hidden(path,
|
||||
index):
|
||||
props.append('hidden')
|
||||
if self.form.get(path, {}).get('clearable'):
|
||||
@ -655,19 +620,23 @@ class Config:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_hidden(self,
|
||||
def is_hidden(self,
|
||||
path: str,
|
||||
index: Optional[int]) -> bool:
|
||||
property_ = 'hidden'
|
||||
if property_ in self.temp.get(path, {}):
|
||||
value = self.temp[path][property_]
|
||||
else:
|
||||
if index is None:
|
||||
value = self.model.get(path, {}).get(property_, False)
|
||||
for property_, needs in {'hidden': True, 'display': False}.items():
|
||||
if property_ in self.temp.get(path, {}):
|
||||
value = self.temp[path][property_]
|
||||
else:
|
||||
value = self.model.get(path, {}).get(property_, False) or \
|
||||
self.model.get(path, {}).get('value', {}).get(index) == ()
|
||||
return value
|
||||
if self.isfollower(path):
|
||||
if self.model.get(path, {}).get('null', {}).get(property_, None) == needs:
|
||||
return True
|
||||
elif self.model.get(path, {}).get(property_, None) == needs:
|
||||
return True
|
||||
index = str(index)
|
||||
if index is not None and index in self.model.get(path, {}) and self.model.get(path, {}).get(index, {}).get(property_, None) == needs:
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_value(self,
|
||||
path: str,
|
||||
@ -680,20 +649,28 @@ class Config:
|
||||
if value is None and self.get_schema(path).get('isMulti', False):
|
||||
value = []
|
||||
else:
|
||||
if index in self.temp.get(path, {}).get('value', {}):
|
||||
value = self.temp[path].get('value')
|
||||
index = str(index)
|
||||
if 'delete' in self.temp.get(path, {}):
|
||||
value = None
|
||||
elif index in self.temp.get(path, {}):
|
||||
if 'delete' in self.temp[path][index]:
|
||||
value = None
|
||||
else:
|
||||
value = self.temp[path]
|
||||
else:
|
||||
value = self.model.get(path, {}).get('value')
|
||||
if value is not None:
|
||||
if index in value:
|
||||
if len(value[index]):
|
||||
value = value[index][0]
|
||||
else:
|
||||
value = PropertiesOptionError(None, None, None, opt_type='option')
|
||||
value = self.model.get(path)
|
||||
if self.isfollower(path):
|
||||
if self.is_hidden(path, index):
|
||||
value = PropertiesOptionError(None, None, None, opt_type='option')
|
||||
elif value is not None and index in value:
|
||||
value = value[index]['value']
|
||||
else:
|
||||
value = self.get_schema(path).get('default')
|
||||
else:
|
||||
value = None
|
||||
if value is not None and index in value and 'value' in value[index]:
|
||||
value = value[index]['value']
|
||||
else:
|
||||
value = self.get_schema(path).get('default')
|
||||
return value
|
||||
|
||||
def get_owner(self,
|
||||
@ -706,13 +683,14 @@ class Config:
|
||||
owner = self.model.get(path, {}).get('owner', 'default')
|
||||
else:
|
||||
if 'value' in self.temp.get(path, {}):
|
||||
value = self.temp[path]['value']
|
||||
value = self.temp[path]
|
||||
else:
|
||||
value = self.model.get(path, {}).get('value', {})
|
||||
value = self.model.get(path, {})
|
||||
index = str(index)
|
||||
if self.is_hidden(path, index):
|
||||
raise PropertiesOptionError(None, None, None, opt_type='option')
|
||||
if index in value:
|
||||
if not value[index]:
|
||||
raise PropertiesOptionError(None, None, None, opt_type='option')
|
||||
owner = value[index][1]
|
||||
owner = value[index]['owner']
|
||||
else:
|
||||
owner = 'default'
|
||||
return owner
|
||||
@ -774,45 +752,44 @@ class Config:
|
||||
if match:
|
||||
if remote:
|
||||
self.updates_data(self.send_data({'updates': self.updates,
|
||||
'model': self.model_ori}))
|
||||
'model': self.model}))
|
||||
|
||||
else:
|
||||
if action == 'delete':
|
||||
self.temp.setdefault(path, {})['owner'] = 'tmp'
|
||||
if index is None:
|
||||
# leader or standard option
|
||||
# set value to default value
|
||||
value = self.default_value(path)
|
||||
self.temp[path]['value'] = value
|
||||
self.temp[path] = {'value': value, 'owner': 'default'}
|
||||
if self.option(path).option.isleader():
|
||||
# if leader, set follower to default 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:]:
|
||||
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')
|
||||
# delete all values
|
||||
self.temp[follower] = {'delete': True}
|
||||
elif self.option(path).option.isleader():
|
||||
# if remove an indexed leader value
|
||||
old_value = self.option(path).value.get()
|
||||
old_value.pop(index)
|
||||
self.temp[path]['value'] = old_value
|
||||
self.temp[path] = {'value': old_value, 'owner': 'tmp'}
|
||||
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]
|
||||
# remove value for this index and reduce len
|
||||
#FIXME on ne reduce pas la longueur !!!!
|
||||
self.temp.setdefault(follower, {})[str(index)] = {'delete': True}
|
||||
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]
|
||||
# it's a follower with index
|
||||
self.temp.setdefault(path, {})[str(index)] = {'delete': True}
|
||||
elif index is None:
|
||||
self.temp.setdefault(path, {})['owner'] = 'tmp'
|
||||
self.temp[path]['value'] = value
|
||||
# set a value for a not follower option
|
||||
self.temp[path] = {'value': value, 'owner': 'tmp'}
|
||||
else:
|
||||
self.temp.setdefault(path, {}).setdefault('value', {})[index] = (value, 'tmp')
|
||||
# set a value for a follower option
|
||||
self.temp.setdefault(path, {})[str(index)] = {'value': value, 'owner': 'tmp'}
|
||||
self.set_dependencies(path, value)
|
||||
self.set_not_equal(path, value)
|
||||
self.do_copy(path, value)
|
||||
@ -827,13 +804,7 @@ class Config:
|
||||
def updates_data(self, data):
|
||||
self.updates = []
|
||||
self.temp.clear()
|
||||
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']
|
||||
self.model = data['model']
|
||||
|
||||
def test_value(self,
|
||||
path: str,
|
||||
|
Reference in New Issue
Block a user