renderer.py 1.36 KB
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)