produlk_vendor.py 9.56 KB
from datetime import datetime

import colander
from datatables import ColumnDT
from deform import widget, Form, ValidationFailure
from opensipkd.base.views import DataTables
from opensipkd.pasar.models.views import (deferred_vendor, deferred_produk,
                                          deferred_departemen)
from pyramid.httpexceptions import HTTPFound
from pyramid.view import view_config

from . import BaseView  # , save_file_upload
from ..models import (DBSession, flush_row, Partner, Produk, PartnerProduk)
from ..models import (Departemen)
from ..tools import (btn_reset, btn_cancel, btn_delete, btn_save)


class AddSchema(colander.Schema):
    kode = colander.SchemaNode(
        colander.String(),
        oid="kode", widget=widget.TextInputWidget()
    )

    # nama = colander.SchemaNode(
    #     colander.String(),
    #     oid="nama ", widget=widget.TextInputWidget()
    # )
    harga = colander.SchemaNode(
        colander.Float(),
        oid="harga",
    )

    disc = colander.SchemaNode(
        colander.Float(),
        missing=colander.drop,
        oid="disc",
    )

    status = colander.SchemaNode(
        colander.Boolean(),
        oid="status",
    )
    partner_id = colander.SchemaNode(
        colander.Integer(), title='Vendor',
        oid="partner_id", widget=deferred_vendor)

    produk_id = colander.SchemaNode(
        colander.Integer(), title='Produk',
        oid="produk_id", widget=deferred_produk)

    departemen_id = colander.SchemaNode(
        colander.Integer(), title='Departemen',
        oid="departemen_id", widget=deferred_departemen)
    modules = colander.SchemaNode(
        colander.String(),
        oid="nama ", widget=widget.TextInputWidget()
    )


class EditSchema(AddSchema):
    id = colander.SchemaNode(
        colander.Integer(), title='ID',
        missing=colander.drop,
        oid="id", widget=widget.HiddenWidget())


def form_validator(form, value):
    pass


def get_form(request, class_form, buttons=None, row=None):
    schema = class_form(validator=form_validator)
    schema = schema.bind(produk=Produk.get_list(),
                         vendor=Partner.get_vendor_list(),
                         departemen=Departemen.get_list())
    schema.request = request
    if row:
        schema.deserialize(row)
    if not buttons:
        buttons = (btn_save, btn_reset)
    return Form(schema, buttons=buttons)


def route_list(request):
    return HTTPFound(location=request.route_url('api-produk-vendor-list'))


def save(values, row):
    if not row:
        row = PartnerProduk()
        row.create_uid = values['user_id']
        row.created = datetime.now()
    else:
        row.update_uid = values['user_id']
        row.updated = datetime.now()

    row.from_dict(values)
    flush_row(row)
    return row


def save_request(request, values, row=None):
    values['status'] = 'status' in values and values['status'] and 1 or 0
    values['disc'] = 'disc' in values and values['disc'] or 0
    values['user_id'] = request.user.id
    row = save(values, row)
    request.session.flash('Data %s Berhasil disimpan' % values['kode'])
    return row


form_params_edit = dict(scripts="""
$(document).ready(function(){
});
""")

form_params_view = dict(scripts="""
$(document).ready(function(){
});
""")


def id_not_found(request):
    id = request.matchdict['id']
    request.session.flash('Data %s Tidak Ditemukan' % id, 'error')
    return route_list(request)


def query_id(request):
    id = request.matchdict['id']
    return PartnerProduk.query_id(id)


class ViewData(BaseView):
    @view_config(route_name='api-produk-vendor-list',
                 permission="api-produk-vendor-list",
                 renderer='templates/list.pt')
    def view_list(self):
        params = {'columns': [dict(title="ID"),
                              dict(title="Kode"),
                              dict(title="Internal"),
                              dict(title="Partner"),
                              dict(title="Harga"),
                              dict(title="Discount"),
                              dict(title="Modules"),
                              dict(title="Status"),
                              ],
                  'column_data': [dict(data="id", width="0px"),
                                  dict(data="kode", width="75px"),
                                  dict(data="internal"),
                                  dict(data="partner"),
                                  dict(data="harga"),
                                  dict(data="discount"),
                                  dict(data="modules"),
                                  dict(data="status"),
                                  ],
                  'buttons': [
                      dict(id="btn_add", cls="btn btn btn-success", title="Tambah"),
                      dict(id="btn_edit", cls="btn btn btn-primary", title="Edit"),
                      dict(id="btn_delete", cls="btn btn btn-primary", title="Hapus"),
                      dict(id="btn_close", cls="btn btn-danger", title="Tutup"),
                  ],
                  'route': "/api/produk/vendor",
                  'scripts': """
        $('#btn_edit').click(function() {
            if (mID) window.location = oTableUri + '/' + mID + '/edit';
            else 
            $.SmartMessageBox({
                title : "Edit",
                content : "Pilih Baris yang akan di lihat...",
                buttons : '[Oke]'
            });;
        });

        $('#btn_delete').click(function() {
            if (mID) window.location = oTableUri + '/' + mID + '/delete';
            else 
            $.SmartMessageBox({
                title : "Delete",
                content : "Pilih Baris yang akan di lihat...",
                buttons : '[Oke]'
            });;
        });

        $('#btn_add').click(function() {
            window.location = oTableUri + '/add';
        });

        $("#btn_close").click(function() {
            window.location = '/api/backoffice';
            return false;
        });
                            """}

        return dict(params=params)

    @view_config(route_name='api-produk-vendor-act', renderer='json',
                 permission="api-produk-vendor-list"
                 )
    def view_act(self):
        request = self.req
        url_dict = request.matchdict
        act = url_dict['act']
        if act == "grid":
            columns = [
                ColumnDT(PartnerProduk.id, mData='id'),
                ColumnDT(PartnerProduk.kode, mData='kode'),
                ColumnDT(Produk.kode, mData='internal'),
                ColumnDT(Partner.kode, mData='partner'),
                ColumnDT(PartnerProduk.harga, mData='harga'),
                ColumnDT(PartnerProduk.discount, mData='discount'),
                ColumnDT(PartnerProduk.modules, mData='modules'),
                ColumnDT(PartnerProduk.status, mData='status'),
            ]
            query = DBSession.query().select_from(PartnerProduk)\
                .join(Produk, PartnerProduk.produk_id == Produk.id)\
                .join(Partner, PartnerProduk.partner_id == Partner.id)
            row_table = DataTables(request.GET, query, columns)
            return row_table.output_result()

    @view_config(route_name='api-produk-vendor-add',
                 permission="api-produk-vendor-admin",
                 renderer='templates/form.pt')
    def view_add(self):
        request = self.req
        form = get_form(request, AddSchema)
        # form_params = dict(scripts=None)
        if request.POST:
            controls = request.POST.items()
            try:
                c = form.validate(controls)
            except ValidationFailure as e:
                form.set_appstruct(e.cstruct)
                return dict(form=form, params=form_params_edit)

            values = dict(c.items())
            row = save_request(request, values)
            return route_list(request)

        return dict(form=form, params=form_params_edit)

    @view_config(route_name='api-produk-vendor-edit',
                 permission="api-produk-vendor-admin",
                 renderer='templates/form.pt')
    def view_edit(self):
        request = self.req
        form = get_form(request, AddSchema)
        row = query_id(request).first()
        if not row:
            return id_not_found(request)
        if request.POST:
            controls = request.POST.items()
            try:
                c = form.validate(controls)
            except ValidationFailure as e:
                form.set_appstruct(e.cstruct)
                return dict(form=form, params=form_params_edit)

            values = dict(c.items())
            save_request(request, values, row)
            return route_list(request)
        values = row.to_dict()
        form.render(values)
        return dict(form=form, params=form_params_edit)

    @view_config(route_name='api-produk-vendor-delete',
                 renderer='templates/form.pt',
                 permission="api-produk-vendor-admin")
    def view_delete(self):
        request = self.req
        # form = get_form(request, EditSchema, (btn_cancel, btn_delete))
        form = Form(colander.Schema(), EditSchema, buttons=(btn_cancel,btn_delete))
        for f in form:
            form[f].widget.readonly = True
        query = query_id(request)
        row = query.first()
        if not row:
            return id_not_found(request)

        if request.POST:
            if 'delete' in request.POST:
                request.session.flash('Data %s berhasil dihapus' % row.nama)
                query.delete()

            return route_list(request)

        values = row.to_dict()
        form.render(values)
        return dict(form=form, params={"scripts": None})