| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- from collections import defaultdict
- from wtforms import Form, FieldList, FormField, Field
- from pydantic import ValidationError, BaseModel
- from .utils import formdata_demangle
- from .translator import SchemaToForm
- class PydanticFieldList(FieldList):
- _baked_instance = None
- def populate_obj(self, obj, name):
- attr = getattr(obj, name)
- for n, v in enumerate(self._baked_instance):
- self.entries[n].form._baked_instance = v
- model = self.entries[n].form.get_model()
- new = model(**v.dict())
- attr.append(new)
- class PydanticForm(Form):
- _errors = {}
- _schema = None
- def __init__(self, *args, **kwargs):
- self._errors = {}
- self.translator = SchemaToForm(self._schema, self)
- super().__init__(*args, **kwargs)
- @property
- def _baked_instance(self):
- return self.translator._schema
- def process(self, formdata=None, obj=None, data=None, **kwargs):
- super().process()
- formdata = self.meta.wrap_formdata(self, formdata)
- input = formdata_demangle(formdata) or data or kwargs
- self.translator(input)
- self.translator.set_data()
- def validate(self):
- if self.translator.errors is not None:
- self.translator.set_errors()
- return False
- self.translator.set_baked()
- return True
- def process_obj(self, obj):
- ...
|