Add custom form field wrapper to determine if form data has changes
This commit is contained in:
parent
843645122a
commit
6fe9229f89
@ -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
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user