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 from wtforms.widgets import TextArea
@ -39,3 +39,14 @@ class NumberStringField(StringField):
self.data = str(value) self.data = str(value)
else: else:
self.data = value 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 import pytest
from wtforms import Form from wtforms import Form
from wtforms.fields import StringField
import pendulum import pendulum
from werkzeug.datastructures import ImmutableMultiDict from werkzeug.datastructures import ImmutableMultiDict
from atst.forms.fields import NewlineListField from atst.forms.fields import NewlineListField, FormFieldWrapper
class NewlineListForm(Form): class NewlineListForm(Form):
@ -38,3 +39,37 @@ def test_newline_list_value(input_, expected):
assert form.validate() assert form.validate()
assert form.newline_list._value() == expected 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()