view_form.py 4.33 KB
import colander
from deform import widget
from pyramid.view import view_config
from opensipkd.coba.models import Coba
from . import BaseView
from opensipkd.base.views import widget_os

class AddSchema(colander.Schema):
    kode = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(min=3, max=10),
    )
    nama = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(min=3, max=64),
    )


class EditSchema(AddSchema):
    id = colander.SchemaNode(
        colander.Integer(),
        widget=widget.HiddenWidget()
    )


class ListSchema(colander.Schema):
    id = colander.SchemaNode(
        colander.Integer(),
        title="Action"
    )
    kode = colander.SchemaNode(
        colander.String(),
        title="Kode",
    )

    nama = colander.SchemaNode(
        colander.String(),
        title="Nama",
        field="nama"
    )


class Views(BaseView):
    def __init__(self, request):
        super().__init__(request)
        self.add_schema = AddSchema
        self.edit_schema = EditSchema
        self.list_schema = ListSchema
        self.list_route = "coba-form"
        self.table = Coba
        self.list_buttons = self.list_buttons + self.list_report

    def form_validator(self, form, value):
        exc = colander.Invalid(form, '')
        def err_kode():
            exc['kode'] = 'Kode %s sudah digunakan oleh %s' % (
                value['kode'], found.nama)
            raise exc

        def err_nama():
            exc['nama'] = 'Nama %s sudah digunakan oleh kode %s' % (
                value['nama'], found.kode)
            raise exc

        if 'id' in form.request.matchdict:
            uid = form.request.matchdict['id']
            q =Coba.query_id(uid)
            current = q.first()
        else:
            current = None

        found =Coba.query_kode(value['kode']).first()
        if current:
            if found and found.id != current.id:
                err_kode()
        elif found:
            err_kode()

        found =Coba.query_nama(value['nama']).first()
        if current:
            if found and found.id != current.id:
                err_nama()
        elif found:
            err_nama()

    
    @view_config(route_name='coba-form', renderer='templates/list.pt',
                 permission='view')
    def view_list(self):
        return super(Views, self).view_list()

    @view_config(route_name='coba-form-act', renderer='json',
                 permission='view')
    def view_act(self):
        return super().view_act()

    @view_config(route_name='coba-form-add', renderer='templates/form.pt',
                 permission='bphtb-admin')
    def view_add(self):
        return super().view_add()

    @view_config(route_name='coba-form-edit', renderer='templates/form.pt',
                 permission='view')
    def view_edit(self):
        return super().view_edit()

    @view_config(route_name='coba-form-delete', renderer='templates/form.pt',
                 permission='view')
    def view_delete(self):
        return super().view_delete()

    @view_config(route_name='coba-form-view', renderer='templates/form.pt', 
                 permission='view')
    def view_view(self):
        return super().view_view()


def _coba_list():
    qry =Coba.query().order_by(Coba.nama)
    return qry


def coba_list(kecamatan_id=None):
    qry = _coba_list(kecamatan_id)
    return [(r.id, r.nm_coba) for r in qry]


def coba_select(kecamatan_id=None):
    result = coba_list(kecamatan_id)
    result.insert(0, ('', 'Semua Coba'))
    return result


@colander.deferred
def coba_widget(node, kw):
    values = kw.get('coba_list', [])
    url = node and hasattr(node, 'slave_url') and node.slave_url or ""
    slave = node and hasattr(node, 'slave') and node.slave or ""
    return widget_os.Select2MsWidget(values=values,
                                     url=url,
                                     slave=slave,
                                     placeholder="Pilih Coba",
                                     style="width:200px;")

class CobaFilterSchema():
    coba_id = colander.SchemaNode(
        colander.Integer(),
        widget=coba_widget,
        title="Coba",
        oid="coba_id",
        missing=colander.drop,
    )