|
|
@@ -1,5 +1,5 @@
|
|
|
from wtforms import FieldList, FormField
|
|
|
-from .iterators import iter_schema, iter_form
|
|
|
+from .iterators import iter_schema, iter_form, get_schema_value
|
|
|
from .utils import *
|
|
|
from pydantic import ValidationError
|
|
|
|
|
|
@@ -39,38 +39,80 @@ class SchemaToForm:
|
|
|
def errors(self):
|
|
|
return self._errors
|
|
|
|
|
|
+ @classmethod
|
|
|
+ def get_field(cls, form, key):
|
|
|
+ for k in key:
|
|
|
+ if is_int(k):
|
|
|
+ sub_form = form.entries[k]
|
|
|
+ else:
|
|
|
+ sub_form = getattr(form, k)
|
|
|
+ return cls.get_field(sub_form, key[1:])
|
|
|
+
|
|
|
+ return form
|
|
|
+
|
|
|
+ @classmethod
|
|
|
+ def get_schema(cls, schema, key):
|
|
|
+ for k in key:
|
|
|
+ if is_int(k):
|
|
|
+ sub = schema[k]
|
|
|
+ else:
|
|
|
+ sub = getattr(schema, k)
|
|
|
+ return cls.get_schema(sub, key[1:])
|
|
|
+
|
|
|
+ return schema
|
|
|
+
|
|
|
def set_data(self):
|
|
|
for src_key, value in iter_schema(self.schema):
|
|
|
dest_key = self.lut(src_key)
|
|
|
if is_int(dest_key[-1]):
|
|
|
- *dest_field, idx = dest_key
|
|
|
- dest_field = rgetattr(self.form, dest_key[:-1])
|
|
|
- dest_field.entries[idx].data = value
|
|
|
+ *parent_key, idx = dest_key
|
|
|
+
|
|
|
+ try:
|
|
|
+ dest_field = rgetattr(self.form, tuple(parent_key))
|
|
|
+ dest_field.entries[idx].data = value
|
|
|
+ except AttributeError:
|
|
|
+ dest_field = getattr(
|
|
|
+ rgetattr(self.form, tuple(parent_key[:-1])).entries[idx],
|
|
|
+ parent_key[-1]
|
|
|
+ )
|
|
|
+ dest_field.data = value
|
|
|
+
|
|
|
else:
|
|
|
- dest_field = rgetattr(self.form, dest_key)
|
|
|
+ dest_field = self.get_field(self.form, dest_key)
|
|
|
setattr(dest_field, 'data', value)
|
|
|
|
|
|
def set_baked(self):
|
|
|
- for k, field in iter_form(self.form, leafs_only=False):
|
|
|
- if isinstance(field, FormField):
|
|
|
- field._baked_instance = rgetattr(self.schema, k)
|
|
|
+ for k, field in iter_form(self.form):
|
|
|
+ field._baked_instance = self.get_schema(self.schema, k)
|
|
|
|
|
|
def set_errors(self):
|
|
|
for k, error_list in nested_dict_iter(self.errors):
|
|
|
+
|
|
|
try:
|
|
|
- field = rgetattr(self.form, k)
|
|
|
+ print(k)
|
|
|
+ field = self.get_field(self.form, k)
|
|
|
+ print(k, field.__class__)
|
|
|
if isinstance(field, FormField):
|
|
|
setattr(field.form, '_errors', error_list)
|
|
|
else:
|
|
|
setattr(field, 'errors', error_list)
|
|
|
except TypeError:
|
|
|
- *field_list, n = k
|
|
|
- rgetattr(self.form, tuple(field_list)).entries[n].errors = error_list
|
|
|
+ try:
|
|
|
+ *field_list, n = k
|
|
|
+ rgetattr(self.form, tuple(field_list)).entries[n].errors = error_list
|
|
|
+ except TypeError:
|
|
|
+ *field_list, n, key = k
|
|
|
+ getattr(rgetattr(self.form, tuple(field_list))[n], key).errors = error_list
|
|
|
+
|
|
|
|
|
|
for k, error_list in nested_dict_iter(self.errors):
|
|
|
try:
|
|
|
rgetattr(self.form, k)
|
|
|
except TypeError:
|
|
|
- *field_list, n = k
|
|
|
- form = rgetattr(self.form, tuple(field_list))
|
|
|
- form.errors = [entry.errors for entry in form.entries]
|
|
|
+ try:
|
|
|
+ *field_list, n = k
|
|
|
+ form = rgetattr(self.form, tuple(field_list))
|
|
|
+ except TypeError:
|
|
|
+ *field_list, n, key = k
|
|
|
+ form = rgetattr(self.form, tuple(field_list))
|
|
|
+ form.errors = [entry.errors for entry in form.entries]
|