tiramisu-json format 1.0

This commit is contained in:
2019-04-03 19:42:59 +02:00
parent 9da87804c2
commit a0b08ea1c8
134 changed files with 221 additions and 242 deletions

View File

@ -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,