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
|
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
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user