renderer.py
1.36 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
import os
import yaml
import colander
from deform import field
from deform.widget import MappingWidget
class PanelWidget(MappingWidget):
# templates/user/panel.pt
template = 'panel'
class Panel(field.Field):
widget = PanelWidget()
here = os.path.abspath(os.path.dirname(__file__))
my_templates = os.path.join(here, 'templates', 'user')
search_path = [my_templates]
Panel.set_zpt_renderer(search_path)
here = os.path.abspath(os.path.dirname(__file__))
schema = colander.Schema()
def get_widgets(form, fields, level=0):
r = []
for field_id in fields:
if field_id.find('Group') == 0:
field = get_widgets(form, fields[field_id], level+1)
else:
# templates/user/mapping_item.pt
form[field_id].my_level = level
field = form[field_id].render_template('mapping_item')
r.append(field)
return '\n'.join(r)
def render(form, yml_file):
for button in form.buttons:
if isinstance(button, tuple):
button = button[0]
yml_file = os.path.join(here, yml_file)
with open(yml_file) as f:
y = yaml.safe_load(f)
panels = []
for title in y['Panels']:
panel = Panel(schema)
panel.title = title
fields = y['Panels'][title]
panel.my_widgets = get_widgets(form, fields)
panels.append(panel.render())
return '\n'.join(panels)