Allow states attribute to use every fields for evaluation
This commit is contained in:
1 parent
86fec51e17
commit
a519206c35
3 files changed
+25
-18
No files matched your search
@@ -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:
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
Reference in new issue
Block a user