diff --git a/tryton/gui/window/view_form/model/field.py b/tryton/gui/window/view_form/model/field.py index 76b7bc3db7..336d59b376 100644 --- a/tryton/gui/window/view_form/model/field.py +++ b/tryton/gui/window/view_form/model/field.py @@ -87,16 +87,21 @@ class CharField(object): def create(self, model): return False - def state_set(self, model, state='draft'): - state_changes = dict(self.attrs.get('states', {}).get(state, [])) + def state_set(self, model, values=None): + if values is None: + values = {'state': 'draft'} + state_changes = self.attrs.get('states', {}) for key in ('readonly', 'required'): if key in state_changes: - self.get_state_attrs(model)[key] = state_changes[key] + self.get_state_attrs(model)[key] = \ + eval(state_changes[key], values) else: self.get_state_attrs(model)[key] = self.attrs[key] if 'value' in state_changes: - self.set(model, state_changes['value'], test_state=False, - modified=True) + value = eval(state_changes['value'], values) + if value: + self.set(model, value, test_state=False, + modified=True) def get_state_attrs(self, model): if self.name not in model.state_attrs: diff --git a/tryton/gui/window/view_form/view/form.py b/tryton/gui/window/view_form/view/form.py index 189b5c9085..573f9f38f7 100644 --- a/tryton/gui/window/view_form/view/form.py +++ b/tryton/gui/window/view_form/view/form.py @@ -18,13 +18,15 @@ class ViewWidget(object): self.widget._view = self self.widget_name = widget_name - def display(self, model, state='draft'): + def display(self, model, values=None): + if values is None: + values = {'state': 'draft'} if not model: self.widget.display(model, False) return False modelfield = model.mgroup.mfields.get(self.widget_name, None) if modelfield: - modelfield.state_set(model, state) + modelfield.state_set(model, values) self.widget.display(model, modelfield) elif isinstance(self.widget, Action): self.widget.display(model, False) @@ -258,14 +260,14 @@ class ViewForm(ParserView): def display(self): model = self.screen.current_model - if model and ('state' in model.mgroup.fields): - state = model['state'].get(model) - else: - state = 'draft' + values = {'state': 'draft'} + if model: + for field in model.mgroup.fields: + values[field] = model[field].get(model) for widget in self.widgets.values(): - widget.display(model, state) + widget.display(model, values) for button in self.buttons: - button.state_set(state) + button.state_set(values) return True def set_cursor(self, new=False): diff --git a/tryton/gui/window/view_form/view/form_gtk/parser.py b/tryton/gui/window/view_form/view/form_gtk/parser.py index 6d93ef2e8a..2ea3a996de 100644 --- a/tryton/gui/window/view_form/view/form_gtk/parser.py +++ b/tryton/gui/window/view_form/view/form_gtk/parser.py @@ -66,16 +66,16 @@ class Button(object): _('Invalid Form, correct red fields!')) self.form.screen.display() - def state_set(self, state): + def state_set(self, values): if self.attrs.get('states', False): - my_states = self.attrs.get('states', '').split(',') - if state not in my_states: - self.widget.hide() - else: + if eval(self.attrs.get('states', 'True'), values): self.widget.show() + else: + self.widget.hide() else: self.widget.show() + class _container(object): def __init__(self, tooltips): self.cont = []