Browse Source

Add support for process from object

theenglishway (time) 6 năm trước cách đây
mục cha
commit
b5eee8ea94
3 tập tin đã thay đổi với 21 bổ sung5 xóa
  1. 4 1
      pydantic_form/form.py
  2. 2 1
      pydantic_form/iterators.py
  3. 15 3
      tests/test_process.py

+ 4 - 1
pydantic_form/form.py

@@ -24,7 +24,10 @@ class PydanticForm(Form):
     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
+        input = (formdata_demangle(formdata)
+                 or {k: getattr(obj, k) for k in self._fields if hasattr(obj, k)}
+                 or data
+                 or kwargs)
         self.translator(input)
         self.translator.set_data()
 

+ 2 - 1
pydantic_form/iterators.py

@@ -86,7 +86,8 @@ def iter_schema(schema, leafs_only=True):
                     for n, sub_value in enumerate(sub_values):
                         yield iterate_on + (n, *key[len(iterate_on):]), get_schema_value(sub_value, key[len(iterate_on):])
                 else:
-                    raise NotImplementedError()
+                    print(f'Found unsupported type {type(sub_values)} while iterating on schema')
+
             except AttributeError as e:
                 ...
 

+ 15 - 3
tests/test_process.py

@@ -2,8 +2,8 @@ import pytest
 from wtforms import FormField, FieldList
 
 from pydantic_form.translator import iter_form, SchemaToForm
-from pydantic_form.utils import recursive_get, formdata_mangle, nested_dict_iter
-
+from pydantic_form.utils import recursive_get, formdata_mangle, nested_dict_iter, rgetattr
+from unittest.mock import MagicMock, Mock
 
 @pytest.fixture
 def data(request, scenario):
@@ -18,14 +18,26 @@ SCENARIOS = [
     'scenario_double_nested'
 ]
 
+
+def make_mock(**attrs):
+    m = Mock()
+    for k, v in attrs.items():
+        if isinstance(v, dict):
+            setattr(m, k, make_mock(**v))
+        else:
+            setattr(m, k, v)
+    return m
+
+
 @pytest.mark.parametrize(
     'kwargs_factory',
     [
         lambda data: {'data': data},
         lambda data: {'formdata': formdata_mangle(data)},
+        lambda data: {'obj': make_mock(**data)},
         lambda data: data,
     ], ids=[
-        'data', 'formdata', 'kwargs'
+        'data', 'formdata', 'obj', 'kwargs'
     ]
 )
 @pytest.mark.parametrize(