view_form.py 8.82 KB
from datetime import datetime

import colander
from deform import widget, FileData
from opensipkd.base.views import widget_os
from pyramid.view import view_config

from opensipkd.coba import COBA_UPLOAD
from opensipkd.coba.models import Coba
from opensipkd.tools import mem_tmp_store, Upload, ymd, hms
from . import BaseView

items = (("1", "Satu"), ('2', 'Dua'), ('3', 'Tiga'), ('4', 'Empat'), ('5', 'Lima'),
         ("6", "Enam"), ('7', 'Tujuh'), ('8', 'Delapan'), ('9', 'Sembilan'),
         ('10', 'Sepuluh'), ("11", "Sebelas"), ('12', 'Dua Belas'),
         ('13', 'Tiga Belas'), ('14', 'Empat Belas'), ('15', 'Lima Belas'))
from opensipkd.base import get_urls


class AddSchema(colander.Schema):
    kode = colander.SchemaNode(
        colander.String(),
        widget=widget.TextInputWidget(mask="9999.9999.9999"),
        validator=colander.Length(min=3, max=10),
    )
    nama = colander.SchemaNode(
        colander.String(),
        validator=colander.Length(min=3, max=64),
        title="Text"
    )
    money = colander.SchemaNode(
        colander.String(),
        widget=widget.MoneyInputWidget()
    )

    date_os = colander.SchemaNode(
        colander.String(),
        widget=widget_os.BootStrapDateInputWidget(type_name="text")
    )

    date_ori = colander.SchemaNode(
        colander.String(),
        widget=widget.DateInputWidget(type_name="text")
    )

    date_part = colander.SchemaNode(
        colander.String(),
        widget=widget.DatePartsWidget()
    )

    time_ori = colander.SchemaNode(
        colander.String(),
        widget=widget.TimeInputWidget()
    )

    date_time = colander.SchemaNode(
        colander.String(),
        widget=widget.DateTimeInputWidget()
    )

    check_box = colander.SchemaNode(
        colander.Integer(),
        widget=widget.CheckboxWidget(true_val="1", false_val="0")
    )
    select_combo = colander.SchemaNode(
        colander.Integer(),
        widget=widget.SelectWidget(values=items)
    )

    select_combo2 = colander.SchemaNode(
        colander.Integer(),
        widget=widget.Select2Widget(values=items)
    )

    file_upload = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(tmpstore=mem_tmp_store,
                                       template='opensipkd.coba:views/templates/file_upload.pt',
                                       readonly_template='opensipkd.coba:views/templates/readonly/file_upload.pt')
    )

    img_upload = colander.SchemaNode(
        FileData(),
        widget=widget.FileUploadWidget(tmpstore=mem_tmp_store,
                                       template='opensipkd.coba:views/templates/img_upload.pt',
                                       readonly_template='opensipkd.coba:views/templates/readonly/img_upload.pt')
    )

    option_list = colander.SchemaNode(
        colander.Integer(),
        widget=widget.RadioChoiceWidget(values=items)
    )

    option_box = colander.SchemaNode(
        colander.Set(),
        widget=widget.CheckboxChoiceWidget(values=items)
    )


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()
        # Set to String
        if "option_box" in value:
            value["option_box"] = str(value["option_box"])

        if "time_ori" in value:
            value["time_ori"] = datetime.strptime(value["time_ori"], "%H:%M:%S")

        if "check_box" in value:
            value["check_box"] = value["check_box"] and 1 or 0

            # Save File Upload to Folder
        if "file_upload" in value:
            upload = Upload(COBA_UPLOAD)
            value["file_upload"] = upload.save_fp(value["file_upload"])
        if "img_upload" in value:
            upload = Upload(COBA_UPLOAD)
            value["img_upload"] = upload.save_fp(value["img_upload"])

    def get_values(self, row, istime=False):
        d = super().get_values(row, istime)
        folder = COBA_UPLOAD + '/'
        url = get_urls(self.req.static_url(folder))
        if "file_upload" in d:
            filename = row.file_upload
            preview_url = "/".join([url, filename])
            d["file_upload"] = {"uid": filename.split(".")[0],
                                "filename": filename,
                                "preview_url": preview_url
                                }

        if "img_upload" in d:
            filename = row.img_upload
            preview_url = "/".join([url, filename])
            d["img_upload"] = {"uid": filename.split(".")[0],
                               "filename": filename,
                               "preview_url": preview_url
                               }
        d["date_ori"] = ymd(row.date_ori)
        d["date_os"] = ymd(row.date_os)
        d["date_part"] = ymd(row.date_part)
        d["date_time"] = ymd(row.date_time) + 'T' + hms(row.date_time) + 'Z'
        d["time_ori"] = hms(row.time_ori)
        d["option_box"] = set(row.option_box)
        d["check_box"] = row.check_box and "1" or "0"
        return d

    # @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,
    )