eis_carousels.py 8.97 KB
import os
import uuid
#from ..tools import row2dict, xls_reader
from datetime import datetime
from sqlalchemy import not_, func
from pyramid.view import (
    view_config,
    )
from pyramid.httpexceptions import (
    HTTPFound,
    )
import colander
from deform import (
    Form,
    widget,
    ValidationFailure,
    )
from ..models import (
    EisDBSession
    )
from ..models.eis import (
    Eis
    )
    
from ..views import BaseView, ColumnDT, DataTables
    

SESS_ADD_FAILED = 'Tambah carousel gagal'
SESS_EDIT_FAILED = 'Edit carousel gagal'

rek_widget = widget.AutocompleteInputWidget(
        size=60,
        values = '/rekening/act/headof',
        min_length=1)

class Amount(colander.Schema):
    amt_tahun = colander.SchemaNode(
                    colander.Integer(),
                    default = 0,
                    missing = 0)
                    
    amt_bulan = colander.SchemaNode(
                    colander.Integer(),
                    default = 0,
                    missing = 0)
                
    amt_minggu = colander.SchemaNode(
                    colander.Integer(),
                    default = 0,
                    missing = 0)
                
    amt_hari   = colander.SchemaNode(
                    colander.Integer(),
                    default = 0,
                    missing = 0)
                
class AddSchema(colander.Schema):
    tahun = colander.SchemaNode(
                    colander.Integer())
            
    kode  = colander.SchemaNode(
                    colander.String(),
                    validator=colander.Length(max=18),
                    oid='kode')
                    
    nama = colander.SchemaNode(
                    colander.String(),
                    widget =  rek_widget,
                    validator=colander.Length(max=128),
                    oid = 'nama')
                    
    order_id   = colander.SchemaNode(
                    colander.Integer(),
                    default = 0,
                    missing = 0)
                
    amount     = Amount()                
    
    status   = colander.SchemaNode(
                    colander.Boolean())
    aktif   = colander.SchemaNode(
                    colander.Boolean())

class EditSchema(AddSchema):
    id = colander.SchemaNode(colander.String(),
            missing=colander.drop,
            widget=widget.HiddenWidget(readonly=True))
        
class view_carousel(BaseView):
    ########                    
    # List #
    ########    
    @view_config(route_name='eis-carousel', renderer='templates/eis-carousel/list.pt',
                 permission='eis-carousel')
    def view_list(self):
        return dict(a={})
        
    ##########                    
    # Action #
    ##########    
    @view_config(route_name='eis-carousel-act', renderer='json',
                 permission='eis-carousel-act')
    def view_act(self):
        ses = self.req.session
        request = self.req
        params = request.params
        url_dict = request.matchdict
        
        if url_dict['act']=='grid':
            columns = []
            columns.append(ColumnDT(Eis.id))
            columns.append(ColumnDT(Eis.tahun))
            columns.append(ColumnDT(Eis.kode))
            columns.append(ColumnDT(Eis.nama))
            columns.append(ColumnDT(Eis.amt_tahun,  ))
            columns.append(ColumnDT(Eis.amt_bulan,  ))
            columns.append(ColumnDT(Eis.amt_minggu,  ))
            columns.append(ColumnDT(Eis.amt_hari,  ))
            columns.append(ColumnDT(Eis.order_id,  ))
            columns.append(ColumnDT(Eis.status,  ))
            columns.append(ColumnDT(Eis.aktif,  ))
            columns.append(ColumnDT(func.to_char(Eis.updated, "DD-MM-YYYY"), ))
            
            query = EisDBSession.query().select_from(Eis)
            rowTable = DataTables(request.GET, query, columns)
            return rowTable.output_result()
        
    @view_config(route_name='eis-carousel-add', renderer='templates/eis-carousel/add.pt',
                 permission='eis-carousel-add')
    def view_add(self):
        request = self.req
        ses = self.ses
        form = get_form(request, AddSchema)
        if request.POST:
            if 'simpan' in request.POST:
                controls = request.POST.items()
                try:
                    controls = form.validate(controls)
                except ValidationFailure as e:
                    #request.session[SESS_ADD_FAILED] = e.render()     
                    #form.set_appstruct(rowd)
                    return dict(form=form)
                    #return HTTPFound(location=request.route_url('carousel-add'))
                save_request(request, dict(controls))
            return route_list(request)
        elif SESS_ADD_FAILED in request.session:
            return dict(form=form)
        
            #return self.session_failed(SESS_ADD_FAILED)
        return dict(form=form)

        
    @view_config(route_name='eis-carousel-edit', renderer='templates/eis-carousel/add.pt',
                 permission='eis-carousel-edit')
    def view_edit(self):
        request = self.req
        row = query_id(request).first()
        if not row:
            return id_not_found(request)
        #values = row.to_dict()
        rowd={}
        rowd['id']          = row.id
        rowd['tahun']       = row.tahun
        rowd['kode']        = row.kode
        rowd['nama']        = row.nama
        rowd['order_id']    = row.order_id
        rowd['status']      = row.status
        rowd['aktif']       = row.aktif
        rowd['amount']        = {}
        rowd['amount']['amt_tahun']  = row.amt_tahun or 0
        rowd['amount']['amt_bulan']  = row.amt_bulan or 0
        rowd['amount']['amt_minggu'] = row.amt_minggu or 0
        rowd['amount']['amt_hari']   = row.amt_hari or 0
        
        form = get_form(request, EditSchema)
        form.set_appstruct(rowd)
        if request.POST:
            if 'simpan' in request.POST:
                controls = request.POST.items()
                try:
                    controls = form.validate(controls)
                except ValidationFailure as e:
                    return dict(form=form)
                save_request(request, dict(controls), row)
            return route_list(request)
        elif SESS_EDIT_FAILED in request.session:
            return session_failed(SESS_EDIT_FAILED)
        return dict(form=form)

    ##########
    # Delete #
    ##########    
    @view_config(route_name='eis-carousel-delete', renderer='templates/eis-carousel/delete.pt',
                 permission='eis-carousel-delete')
    def view_delete(self):
        request = self.req
        q = query_id(request)
        row = q.first()
        
        if not row:
            return self.id_not_found(request)
        form = Form(colander.Schema(), buttons=('hapus','batal'))
        if request.POST:
            if 'hapus' in request.POST:
                msg = 'Carousel ID %d %s sudah dihapus.' % (row.id, row.nama)
                try:
                  q.delete()
                  EisDBSession.flush()
                except:
                  msg = 'Carousel ID %d %s tidak dapat dihapus.' % (row.id, row.nama)
                request.session.flash(msg)
            return route_list(request)
        return dict(row=row,
                     form=form.render())

#######    
# Add #
#######
def form_validator(form, value):
    if 'id' in form.request.matchdict:
        uid = form.request.matchdict['id']
        q = EisDBSession.query(Eis).filter_by(id=uid)
        row = q.first()
    else:
        row = None
            
def get_form(request, class_form, row=None):
    schema = class_form(validator=form_validator)
    schema = schema.bind()
    schema.request = request
    if row:
      schema.deserialize(row)
    return Form(schema, buttons=('simpan','batal'))
    
def session_failed(self, session_name):
    #r = dict(form=self.session[session_name])
    del self.session[session_name]
    #return r

def save_request(request, values, row=None):
    if 'id' in request.matchdict:
        values['id'] = request.matchdict['id']
    row = save(values, request.user, row)
    request.session.flash('Carousel sudah disimpan.')
        
def save(values, user, row=None):
    # print(">>", values)
    # sys.exit()
    if not row:
        row = Eis()
        row.created = datetime.now()
        row.create_uid = user.id
    else:
        row.updated = datetime.now()
        row.update_uid = user.id
    row.from_dict(values)
    row.from_dict(values['amount'])
    row.status = 'status' in values and values['status'] and 1 or 0
    row.aktif = 'aktif' in values and values['aktif'] and 1 or 0
    EisDBSession.add(row)
    EisDBSession.flush()
    return row
    
def route_list(request):
    return HTTPFound(location=request.route_url('eis-carousel'))

########
# Edit #
########
def query_id(request):
    return EisDBSession.query(Eis).filter_by(id=request.matchdict['id'])
    
def id_not_found(request):    
    msg = 'Carousel ID %s Tidak Ditemukan.' % request.matchdict['id']
    request.session.flash(msg, 'error')
    return route_list(request)