renderer.py 1.38 KB
import os
import yaml
import colander
from deform import field
from deform.widget import MappingWidget


schema = colander.Schema()


class PanelWidget(MappingWidget):
    # templates/user/panel.pt
    template = 'panel'


class Panel(field.Field):
    widget = PanelWidget()


def get_widgets(form, fields, level=0):
    r = []
    for field_id in fields:
        if isinstance(field_id, str):
            form[field_id].my_level = level
            # templates/user/mapping_item.pt
            field = form[field_id].render_template('mapping_item')
        else:
            for group_id in field_id:
                field_ids = field_id[group_id]
            field = get_widgets(form, field_ids, level+1)
        r.append(field)
    return '\n'.join(r)


def render(form, yml_template):
    yml_file = yml_template + '.yml'
    full_path = None
    for path in Panel.default_renderer.loader.search_path:
        full_path = os.path.join(path, yml_file)
        if os.path.exists(full_path):
            break
    if not full_path:
        raise Exception(f'File {yml_file} tidak ditemukan')
    with open(full_path) 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)