|
@@ -14,6 +14,8 @@ def iter_field(field, leafs_only=True, path=(), parent=None):
|
|
|
yield from iter_field(subfield, leafs_only, path + (subfield_name,), parent)
|
|
yield from iter_field(subfield, leafs_only, path + (subfield_name,), parent)
|
|
|
|
|
|
|
|
elif issubclass(field.field_class, FieldList):
|
|
elif issubclass(field.field_class, FieldList):
|
|
|
|
|
+ if path and not leafs_only:
|
|
|
|
|
+ yield path, field.field_class, parent
|
|
|
yield from iter_field(field.args[0], leafs_only, path, path)
|
|
yield from iter_field(field.args[0], leafs_only, path, path)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -23,7 +25,7 @@ def iter_field(field, leafs_only=True, path=(), parent=None):
|
|
|
def iter_form_class(form_class, leafs_only=True, path=()):
|
|
def iter_form_class(form_class, leafs_only=True, path=()):
|
|
|
field = getattr(form_class, path[-1]) if path else form_class
|
|
field = getattr(form_class, path[-1]) if path else form_class
|
|
|
|
|
|
|
|
- if path and not leafs_only:
|
|
|
|
|
|
|
+ if not leafs_only:
|
|
|
yield path, field, None
|
|
yield path, field, None
|
|
|
|
|
|
|
|
try:
|
|
try:
|
|
@@ -40,7 +42,7 @@ def iter_form(form, leafs_only=True):
|
|
|
if iterate_on:
|
|
if iterate_on:
|
|
|
value = rgetattr(form, iterate_on)
|
|
value = rgetattr(form, iterate_on)
|
|
|
for n, entry in enumerate(value.entries):
|
|
for n, entry in enumerate(value.entries):
|
|
|
- yield key + (n,), entry
|
|
|
|
|
|
|
+ yield iterate_on + (n, *key[len(iterate_on):]), entry
|
|
|
continue
|
|
continue
|
|
|
yield key, field
|
|
yield key, field
|
|
|
|
|
|
|
@@ -65,12 +67,32 @@ def iter_schema_class(schema, leafs_only=True, path=()):
|
|
|
for key, field in schema.__fields__.items():
|
|
for key, field in schema.__fields__.items():
|
|
|
yield from iter_schema_class_field(field, leafs_only, path + (key,))
|
|
yield from iter_schema_class_field(field, leafs_only, path + (key,))
|
|
|
|
|
|
|
|
|
|
+def get_schema_value(schema, key):
|
|
|
|
|
+ parent = None
|
|
|
|
|
+ idx = None
|
|
|
|
|
+ if is_int(key[-1]):
|
|
|
|
|
+ *parent, idx = key
|
|
|
|
|
+ try:
|
|
|
|
|
+ if parent:
|
|
|
|
|
+ return rgetattr(getattr(schema, parent[0])[idx], tuple(parent[1:]))
|
|
|
|
|
+ else:
|
|
|
|
|
+ return rgetattr(schema, key)
|
|
|
|
|
+ except AttributeError:
|
|
|
|
|
+ if parent:
|
|
|
|
|
+ return recursive_get(getattr(schema, parent[0])[idx], *parent[1:])
|
|
|
|
|
+ else:
|
|
|
|
|
+ return recursive_get(schema, *key)
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
def iter_schema(schema, leafs_only=True):
|
|
def iter_schema(schema, leafs_only=True):
|
|
|
def get_schema_value(schema, key):
|
|
def get_schema_value(schema, key):
|
|
|
try:
|
|
try:
|
|
|
return rgetattr(schema, key)
|
|
return rgetattr(schema, key)
|
|
|
except AttributeError:
|
|
except AttributeError:
|
|
|
- return recursive_get(getattr(schema, key[0]), *key[1:])
|
|
|
|
|
|
|
+ try:
|
|
|
|
|
+ return recursive_get(getattr(schema, key[0]), *key[1:])
|
|
|
|
|
+ except AttributeError:
|
|
|
|
|
+ return recursive_get(schema, *key)
|
|
|
|
|
|
|
|
for key, field, iterate_on in iter_schema_class(schema.__class__, leafs_only):
|
|
for key, field, iterate_on in iter_schema_class(schema.__class__, leafs_only):
|
|
|
if iterate_on:
|
|
if iterate_on:
|
|
@@ -78,10 +100,11 @@ def iter_schema(schema, leafs_only=True):
|
|
|
sub_values = get_schema_value(schema, iterate_on)
|
|
sub_values = get_schema_value(schema, iterate_on)
|
|
|
if isinstance(sub_values, list):
|
|
if isinstance(sub_values, list):
|
|
|
for n, sub_value in enumerate(sub_values):
|
|
for n, sub_value in enumerate(sub_values):
|
|
|
- yield key + (n,), sub_value
|
|
|
|
|
|
|
+ yield iterate_on + (n, *key[len(iterate_on):]), get_schema_value(sub_value, key[len(iterate_on):])
|
|
|
else:
|
|
else:
|
|
|
raise NotImplementedError()
|
|
raise NotImplementedError()
|
|
|
except AttributeError:
|
|
except AttributeError:
|
|
|
|
|
+ print('attr error')
|
|
|
...
|
|
...
|
|
|
|
|
|
|
|
continue
|
|
continue
|