Skip to content
This repository has been archived by the owner on Sep 5, 2019. It is now read-only.

Commit

Permalink
Use the field_id defined by the intermediate representation for the f…
Browse files Browse the repository at this point in the history
…orm field id
  • Loading branch information
Denis Krienbühl committed Aug 24, 2017
1 parent b1606a7 commit eb97752
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 21 deletions.
2 changes: 1 addition & 1 deletion onegov/form/parser/core.py
Expand Up @@ -607,7 +607,7 @@ def parse_field_block(field_block, field_classes,
result.id = '_'.join((
result.parent.id, label_to_field_id(result.label)
))
elif fieldset_label:
elif fieldset_label not in (None, '...'):
result.id = label_to_field_id(' '.join((
fieldset_label, result.label
)))
Expand Down
51 changes: 31 additions & 20 deletions onegov/form/parser/form.py
Expand Up @@ -60,76 +60,85 @@ def handle_field(builder, field, dependency=None):
else:
validators = []

field_id = builder.add_field(
builder.add_field(
field_class=StringField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
validators=validators
)

elif field.type == 'textarea':
field_id = builder.add_field(
builder.add_field(
field_class=TextAreaField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
widget=with_options(TextArea, rows=field.rows)
)

elif field.type == 'password':
field_id = builder.add_field(
builder.add_field(
field_class=PasswordField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required
)

elif field.type == 'email':
field_id = builder.add_field(
builder.add_field(
field_class=EmailField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
validators=[Email()]
)

elif field.type == 'stdnum':
field_id = builder.add_field(
builder.add_field(
field_class=StringField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
validators=[Stdnum(field.format)]
)

elif field.type == 'date':
field_id = builder.add_field(
builder.add_field(
field_class=DateField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
)

elif field.type == 'datetime':
field_id = builder.add_field(
builder.add_field(
field_class=DateTimeLocalField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
)

elif field.type == 'time':
field_id = builder.add_field(
builder.add_field(
field_class=TimeField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required
)

elif field.type == 'fileinput':
field_id = builder.add_field(
builder.add_field(
field_class=UploadField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
Expand All @@ -141,8 +150,9 @@ def handle_field(builder, field, dependency=None):
)

elif field.type == 'radio':
field_id = builder.add_field(
builder.add_field(
field_class=RadioField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
Expand All @@ -152,8 +162,9 @@ def handle_field(builder, field, dependency=None):
)

elif field.type == 'checkbox':
field_id = builder.add_field(
builder.add_field(
field_class=MultiCheckboxField,
field_id=field.id,
label=field.label,
dependency=dependency,
required=field.required,
Expand All @@ -170,12 +181,10 @@ def handle_field(builder, field, dependency=None):
if not choice.fields:
continue

dependency = FieldDependency(field_id, choice.label)
dependency = FieldDependency(field.id, choice.label)

for field in choice.fields:
handle_field(builder, field, dependency)

return field_id
for choice_field in choice.fields:
handle_field(builder, choice_field, dependency)


class WTFormsClassBuilder(object):
Expand Down Expand Up @@ -252,17 +261,19 @@ def get_unique_field_id(self, label, dependency):

return field_id

def add_field(self, field_class, label, required,
dependency=None, field_id=None, pricing=None, **kwargs):
def add_field(self, field_class, field_id, label, required,
dependency=None, pricing=None, **kwargs):
validators = kwargs.pop('validators', [])

if hasattr(self.form_class, field_id):
raise errors.DuplicateLabelError(label=label)

# labels in wtforms are not escaped correctly - for safety we make sure
# that the label is properly html escaped. See also:
# https://github.com/wtforms/wtforms/issues/315
# -> quotes are allowed because the label is rendered between tags,
# not as part of the attributes
label = escape(label, quote=False)
field_id = field_id or self.get_unique_field_id(label, dependency)

self.validators_extend(validators, required, dependency)

Expand All @@ -277,4 +288,4 @@ def add_field(self, field_class, label, required,
if dependency:
self.mark_as_dependent(field_id, dependency)

return field_id
return getattr(self.form_class, field_id)

0 comments on commit eb97752

Please sign in to comment.