Commit cc434b30 authored by Pete Richards's avatar Pete Richards

remove not-visible fields from forms

parent 8db79a06
...@@ -25,6 +25,13 @@ class BaseRule(object): ...@@ -25,6 +25,13 @@ class BaseRule(object):
self.rule_set = rule_set self.rule_set = rule_set
return self return self
@property
def visible_fields(self):
"""
A list of visible fields for the given rule.
"""
raise NotImplementedError()
def __call__(self, form, form_opts=None, field_args={}): def __call__(self, form, form_opts=None, field_args={}):
""" """
Render rule. Render rule.
...@@ -68,6 +75,17 @@ class NestedRule(BaseRule): ...@@ -68,6 +75,17 @@ class NestedRule(BaseRule):
self.rules = rule_set.configure_rules(self.rules, self) self.rules = rule_set.configure_rules(self.rules, self)
return super(NestedRule, self).configure(rule_set, parent) return super(NestedRule, self).configure(rule_set, parent)
@property
def visible_fields(self):
"""
Return visible fields for all child rules.
"""
visible_fields = []
for rule in self.rules:
for field in rule.visible_fields:
visible_fields.append(field)
return visible_fields
def __iter__(self): def __iter__(self):
""" """
Return rules. Return rules.
...@@ -111,6 +129,10 @@ class Text(BaseRule): ...@@ -111,6 +129,10 @@ class Text(BaseRule):
self.text = text self.text = text
self.escape = escape self.escape = escape
@property
def visible_fields(self):
return []
def __call__(self, form, form_opts=None, field_args={}): def __call__(self, form, form_opts=None, field_args={}):
if self.escape: if self.escape:
return self.text return self.text
...@@ -168,6 +190,10 @@ class Macro(BaseRule): ...@@ -168,6 +190,10 @@ class Macro(BaseRule):
return field return field
@property
def visible_fields(self):
return []
def __call__(self, form, form_opts=None, field_args={}): def __call__(self, form, form_opts=None, field_args={}):
""" """
Render macro rule. Render macro rule.
...@@ -220,6 +246,10 @@ class Container(Macro): ...@@ -220,6 +246,10 @@ class Container(Macro):
self.child_rule.configure(rule_set, self) self.child_rule.configure(rule_set, self)
return super(Container, self).configure(rule_set, parent) return super(Container, self).configure(rule_set, parent)
@property
def visible_fields(self):
return self.child_rule.visible_fields
def __call__(self, form, form_opts=None, field_args={}): def __call__(self, form, form_opts=None, field_args={}):
""" """
Render container. Render container.
...@@ -258,6 +288,10 @@ class Field(Macro): ...@@ -258,6 +288,10 @@ class Field(Macro):
super(Field, self).__init__(render_field) super(Field, self).__init__(render_field)
self.field_name = field_name self.field_name = field_name
@property
def visible_fields(self):
return [self.field_name]
def __call__(self, form, form_opts=None, field_args={}): def __call__(self, form, form_opts=None, field_args={}):
""" """
Render field. Render field.
...@@ -345,6 +379,14 @@ class RuleSet(object): ...@@ -345,6 +379,14 @@ class RuleSet(object):
self.view = view self.view = view
self.rules = self.configure_rules(rules) self.rules = self.configure_rules(rules)
@property
def visible_fields(self):
visible_fields = []
for rule in self.rules:
for field in rule.visible_fields:
visible_fields.append(field)
return visible_fields
def convert_string(self, value): def convert_string(self, value):
""" """
Convert string to rule. Convert string to rule.
......
...@@ -1477,6 +1477,10 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1477,6 +1477,10 @@ class BaseModelView(BaseView, ActionsMixin):
return redirect(return_url) return redirect(return_url)
form = self.create_form() form = self.create_form()
if self._form_create_rules:
for field in form:
if field.name not in self._form_create_rules.visible_fields:
form.__delitem__(field.name)
if self.validate_form(form): if self.validate_form(form):
if self.create_model(form): if self.create_model(form):
...@@ -1514,6 +1518,10 @@ class BaseModelView(BaseView, ActionsMixin): ...@@ -1514,6 +1518,10 @@ class BaseModelView(BaseView, ActionsMixin):
return redirect(return_url) return redirect(return_url)
form = self.edit_form(obj=model) form = self.edit_form(obj=model)
if self._form_edit_rules:
for field in form:
if field.name not in self._form_edit_rules.visible_fields:
form.__delitem__(field.name)
if self.validate_form(form): if self.validate_form(form):
if self.update_model(form, model): if self.update_model(form, model):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment