form.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from collections import defaultdict
  2. from wtforms import Form, FieldList, FormField, Field
  3. from pydantic import ValidationError, BaseModel
  4. from .utils import formdata_demangle
  5. from .translator import SchemaToForm
  6. class PydanticFieldList(FieldList):
  7. _baked_instance = None
  8. def populate_obj(self, obj, name):
  9. attr = getattr(obj, name)
  10. for n, v in enumerate(self._baked_instance):
  11. self.entries[n].form._baked_instance = v
  12. model = self.entries[n].form.get_model()
  13. new = model(**v.dict())
  14. attr.append(new)
  15. class PydanticForm(Form):
  16. _errors = {}
  17. _schema = None
  18. def __init__(self, *args, **kwargs):
  19. self._errors = {}
  20. self.translator = SchemaToForm(self._schema, self)
  21. super().__init__(*args, **kwargs)
  22. @property
  23. def _baked_instance(self):
  24. return self.translator._schema
  25. def process(self, formdata=None, obj=None, data=None, **kwargs):
  26. super().process()
  27. formdata = self.meta.wrap_formdata(self, formdata)
  28. input = formdata_demangle(formdata) or data or kwargs
  29. self.translator(input)
  30. self.translator.set_data()
  31. def validate(self):
  32. if self.translator.errors is not None:
  33. self.translator.set_errors()
  34. return False
  35. self.translator.set_baked()
  36. return True
  37. def process_obj(self, obj):
  38. ...