kelurahan.py 5.17 KB
import colander
from deform import widget
from tangsel.tools.pbb import FixKecamatan
from pyramid.view import view_config
from sqlalchemy import func

from . import BaseView
from .kecamatan import kecamatan_widget, get_kecamatan_list
from ..models import Kelurahan, PbbmDBSession, Kecamatan


class ListSchema(colander.Schema):
    id = colander.SchemaNode(
        colander.String(),
        field=func.concat(
            Kelurahan.kd_propinsi,
            func.concat(
                Kelurahan.kd_dati2,
                func.concat(Kelurahan.kd_kecamatan,
                            Kelurahan.kd_kelurahan)
            )
        ),
        title="Aksi"
    )
    kode = colander.SchemaNode(
        colander.String(),
        field=func.concat(Kelurahan.kd_propinsi, '.').concat(Kelurahan.kd_dati2).concat('.').
        concat(Kelurahan.kd_kecamatan).concat(
            '.').concat(Kelurahan.kd_kelurahan)
    )
    nm_kelurahan = colander.SchemaNode(
        colander.String(),
        title="Nama Desa",
    )

    kecamatan = colander.SchemaNode(
        colander.String(),
        title="Nama Kecamatan",
        field=Kecamatan.nm_kecamatan
    )


class AddSchema(colander.Schema):
    parent_kode = colander.SchemaNode(
        colander.String(),
        widget=kecamatan_widget,
        oid="parent_kode",
        title="Kecamatan",
    )
    kd_kelurahan = colander.SchemaNode(
        colander.String(),
        widget=widget.TextInputWidget(
            mask="999",
            max_len=3,
            min_len=3,
        ),
        oid="kd_kelurahan",
        title="Kode", )

    nm_kelurahan = colander.SchemaNode(
        colander.String(),
        oid="nm_kelurahan",
        title="Nama", )

    kd_sektor = colander.SchemaNode(
        colander.String(),
        widget=widget.SelectWidget(
            values=(("10", "PEDESAAN"), ("20", "PERKOTAAN")))
    )


class EditSchema(AddSchema):
    id = colander.SchemaNode(colander.String(),
                             missing=colander.drop,
                             widget=widget.HiddenWidget(readonly=True))


class Views(BaseView):
    def __init__(self, request):
        super().__init__(request)
        self.list_schema = ListSchema
        self.add_schema = AddSchema
        self.edit_schema = EditSchema
        self.list_route = 'pbbm-kelurahan'
        self.table = Kelurahan
        self.db_session = PbbmDBSession
        self.bindings = {"kecamatan_list": get_kecamatan_list()}
        self.list_buttons = ()

    @view_config(route_name='pbbm-kelurahan', renderer='templates/form.pt',
                 permission='pbbm-admin')
    def view_list(self):
        return super().view_list(allow_edit=False, allow_delete=False,)

    @view_config(route_name='pbbm-kelurahan-act', renderer='json',
                 permission='pbbm-admin')
    def view_act(self):
        return super().view_act()

    def query_id(self):
        q = self.table.query_id(self.req.matchdict['id'])
        return q

    def list_join(self, query):
        return query.join(Kecamatan, Kecamatan.kd_kecamatan == Kelurahan.kd_kecamatan). \
            order_by(Kelurahan.kd_kecamatan, Kelurahan.kd_kelurahan)

    def get_values(self, row, istime=False, null=False):
        d = super().get_values(row, istime, null)
        d["parent_kode"] = d["kd_propinsi"] + d["kd_dati2"] + d["kd_kecamatan"]
        kecamatan = Kecamatan.query_id(d["parent_kode"]).first()
        d["nm_kecamatan"] = kecamatan.nm_kecamatan
        return d

    def form_validator(self, form, value):
        parent_kd = value["parent_kode"]

        fx_parent = FixKecamatan(parent_kd)

        def err_kode():
            raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
                value['kd_kelurahan'], found.nm_kelurahan))

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

        found = Kelurahan.query_id(
            f"{parent_kd}{value['kd_kelurahan']}").first()
        if current:
            if found and found.kode != current.kode:
                err_kode()
        elif found:
            err_kode()
        value["kd_propinsi"] = fx_parent["kd_propinsi"]
        value["kd_dati2"] = fx_parent["kd_dati2"]
        value["kd_kecamatan"] = fx_parent["kd_kecamatan"]

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

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

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

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