diff --git a/atst/forms/fields.py b/atst/forms/fields.py index c69c8ed6..584aeca8 100644 --- a/atst/forms/fields.py +++ b/atst/forms/fields.py @@ -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 diff --git a/tests/forms/test_fields.py b/tests/forms/test_fields.py index e3cfa3ba..8e6f4002 100644 --- a/tests/forms/test_fields.py +++ b/tests/forms/test_fields.py @@ -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()