Add custom form field wrapper to determine if form data has changes

This commit is contained in:
Patrick Smith 2019-01-31 14:01:55 -05:00
parent 843645122a
commit 6fe9229f89
2 changed files with 48 additions and 2 deletions

View File

@ -1,4 +1,4 @@
from wtforms.fields import Field, StringField, SelectField as SelectField_
from wtforms.fields import Field, FormField, StringField, SelectField as SelectField_
from wtforms.widgets import TextArea
@ -39,3 +39,14 @@ class NumberStringField(StringField):
self.data = str(value)
else:
self.data = value
class FormFieldWrapper(FormField):
def has_changes(self):
if not self.object_data:
return False
for (attr, field) in self._fields.items():
if attr in self.object_data and self.object_data[attr] != field.data:
return True
return False

View File

@ -1,9 +1,10 @@
import pytest
from wtforms import Form
from wtforms.fields import StringField
import pendulum
from werkzeug.datastructures import ImmutableMultiDict
from atst.forms.fields import NewlineListField
from atst.forms.fields import NewlineListField, FormFieldWrapper
class NewlineListForm(Form):
@ -38,3 +39,37 @@ def test_newline_list_value(input_, expected):
assert form.validate()
assert form.newline_list._value() == expected
class PersonForm(Form):
first_name = StringField("first_name")
class FormWithFormField(Form):
person = FormFieldWrapper(PersonForm)
class TestFormFieldWrapper:
class Foo:
person = {"first_name": "Luke"}
obj = Foo()
def test_form_data_does_not_match_object_data(self):
form_data = ImmutableMultiDict({"person-first_name": "Han"})
form = FormWithFormField(form_data, obj=self.obj)
assert form.person.has_changes()
def test_when_no_form_data(self):
form = FormWithFormField(None, obj=self.obj)
assert not form.person.has_changes()
def test_when_no_obj_data(self):
form_data = ImmutableMultiDict({"person-first_name": "Han"})
form = FormWithFormField(form_data)
assert not form.person.has_changes()
def test_when_form_data_matches_obj_dta(self):
form_data = ImmutableMultiDict({"person-first_name": "Luke"})
form = FormWithFormField(form_data, obj=self.obj)
assert not form.person.has_changes()