form_api.py
3.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import traceback
import colander
import deform.widget
import logging
from icecream import ic
log = logging.getLogger(__name__)
field_widgets = (deform.widget.TextInputWidget,
deform.widget.MoneyInputWidget,
deform.widget.AutocompleteInputWidget,
deform.widget.TimeInputWidget,
deform.widget.DateInputWidget,
deform.widget.DateTimeInputWidget,
deform.widget.TextAreaWidget,
deform.widget.RichTextWidget,
deform.widget.PasswordWidget,
deform.widget.HiddenWidget,
deform.widget.CheckboxWidget,
deform.widget.SelectWidget,
deform.widget.Select2Widget,
deform.widget.SelectizeWidget,
deform.widget.RadioChoiceWidget,
deform.widget.CheckboxChoiceWidget,
deform.widget.CheckedInputWidget,
deform.widget.CheckedPasswordWidget,
deform.widget.MappingWidget,
deform.widget.SequenceWidget,
deform.widget.FileUploadWidget,
deform.widget.DatePartsWidget,
deform.widget.TextAreaCSVWidget,
deform.widget.TextInputCSVWidget,)
field2remove = (
"_parent", "counter", "bindings", "resource_registry", "renderer",
"validator"
)
def form2dict(obj):
d = {}
if getattr(obj, "__dict__", str(obj)):
for k, v in obj.__dict__.items():
d[k] = v
for k, v in d.items():
try:
if k in field2remove:
d[k] = ""
elif type(v) == colander.Invalid:
d[k] = v.asdict()
elif v and hasattr(v, "__dict__") and \
getattr(v, "__dict__", str(v)):
d[k] = form2dict(v)
elif isinstance(v, list):
lv = []
for l in v:
if l and hasattr(l, "__dict__") and \
getattr(l, "__dict__", str(l)):
lv.append(form2dict(l))
d[k] = lv
elif getattr(v, "__dict__", str(v)) == {}:
d[k] = {}
# elif getattr(v, "__dict__", str(v)):
# d[k] = form2dict(v)
if k == "widget" and type(v) in field_widgets:
d[k].update({"template": v.template})
if k == "missing" and v == colander.drop:
d[k] = True
except Exception as e:
log.error(e)
traceback.print_exc()
return d
def remove_child(data):
resp = []
for d in data:
if "children" in d and d["children"]:
# try:
d["children"] = remove_child(d["children"])
# except:
# pass
res = {}
for x in d:
if x not in field2remove:
res[x] = d[x]
if x == "_cstruct" and not d[x]:
res[x] = ""
resp.append(res)
return resp
def formfield2dict(obj):
resp = form2dict(obj)
log.debug(resp)
children = resp["children"]
children = remove_child(children)
table = "table" in resp and resp["table"] or None
result = dict(title=resp.get("title"),
children=children,
buttons=resp["buttons"],
url=resp.get("url"),
table=table,
)
log.debug(result)
return result