Commit ee8de6ab by aa.gusti
2 parents 3bd3d623 91807abe
...@@ -4,6 +4,7 @@ group_id/groups.group_name,perm_name ...@@ -4,6 +4,7 @@ group_id/groups.group_name,perm_name
"Superuser","user-group" "Superuser","user-group"
"Superuser","upload-logo" "Superuser","upload-logo"
"Superuser","departemen" "Superuser","departemen"
"Superuser","partner-departemen"
"Superuser","partner" "Superuser","partner"
"Superuser","parameter" "Superuser","parameter"
"Superuser","permission" "Superuser","permission"
......
...@@ -6,6 +6,7 @@ user-group,User Group ...@@ -6,6 +6,7 @@ user-group,User Group
edit-title,Edit Title edit-title,Edit Title
upload-logo,Upload Logo upload-logo,Upload Logo
departemen,Departemen departemen,Departemen
partner-departemen,Partner Departemen
partner,Partner partner,Partner
parameter,Parameter parameter,Parameter
permission,Permission permission,Permission
......
...@@ -77,9 +77,9 @@ partner-add,/partner/add,Partner Add ...@@ -77,9 +77,9 @@ partner-add,/partner/add,Partner Add
departemen,/departemen,Organisasi departemen,/departemen,Organisasi
departemen-act,/departemen/{act}/act,Organisasi Act departemen-act,/departemen/{act}/act,Organisasi Act
departemen-add,/departemen/add,Organisasi Tambah departemen-add,/departemen/add,Organisasi Tambah
departemen-edt,/departemen/{id}/edt,Organisasi Edit departemen-edit,/departemen/{id}/edit,Organisasi Edit
departemen-view,/departemen/{id}/view,Organisasi view departemen-view,/departemen/{id}/view,Organisasi view
departemen-del,/departemen/{id}/del,Organisasi Hapus departemen-delete,/departemen/{id}/delete,Organisasi Hapus
departemen-rpt,/departemen/{rpt}/rpt,Organisasi Report departemen-rpt,/departemen/{rpt}/rpt,Organisasi Report
departemen-chg,/departemen/chg,Ubah Organisasi departemen-chg,/departemen/chg,Ubah Organisasi
departemen-upload,/departemen/upload,Upload Departemen,1,0 departemen-upload,/departemen/upload,Upload Departemen,1,0
......
...@@ -192,7 +192,8 @@ class BaseView(object): ...@@ -192,7 +192,8 @@ class BaseView(object):
def get_values(self, row): def get_values(self, row):
d = row.to_dict() d = row.to_dict()
d["tanggal"] = dmy(row.tanggal) if 'tanggal' in d and d['tanggal']:
d["tanggal"] = dmy(row.tanggal)
return d return d
def view_edit(self): def view_edit(self):
......
import colander import colander
import json
from deform import (Form, widget, ValidationFailure, ) from deform import (Form, widget, ValidationFailure, )
from pyramid.httpexceptions import (HTTPFound, ) from pyramid.httpexceptions import (HTTPFound, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
...@@ -9,6 +10,7 @@ from ..models import DBSession as PartnerDBSession, DBSession ...@@ -9,6 +10,7 @@ from ..models import DBSession as PartnerDBSession, DBSession
from ..models import Departemen, Jabatan from ..models import Departemen, Jabatan
from ..models import Partner, PartnerDepartemen from ..models import Partner, PartnerDepartemen
from opensipkd.tools import dmy, date_from_str from opensipkd.tools import dmy, date_from_str
from opensipkd.tools.buttons import btn_cancel, btn_save, btn_delete, btn_close
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah posisi partner gagal' SESS_ADD_FAILED = 'Tambah posisi partner gagal'
...@@ -62,10 +64,12 @@ class AddSchema(colander.Schema): ...@@ -62,10 +64,12 @@ class AddSchema(colander.Schema):
title="Jabatan") title="Jabatan")
mulai = colander.SchemaNode( mulai = colander.SchemaNode(
colander.String(), colander.String(),
oid="mulai") oid="mulai",
widget=widget.TextInputWidget(css_class="date"))
selesai = colander.SchemaNode( selesai = colander.SchemaNode(
colander.String(), colander.String(),
oid="selesai") oid="selesai",
widget=widget.TextInputWidget(css_class="date"))
class EditSchema(AddSchema): class EditSchema(AddSchema):
...@@ -73,21 +77,199 @@ class EditSchema(AddSchema): ...@@ -73,21 +77,199 @@ class EditSchema(AddSchema):
missing=colander.drop, missing=colander.drop,
widget=widget.HiddenWidget()) widget=widget.HiddenWidget())
class ViewPartner(BaseView): class ViewPartner(BaseView):
def __init__(self, request):
super(ViewPartner, self).__init__(request)
self.form_scripts = """
$(document).ready(function () {
$('#pegawai_nm').typeahead({
"hint" : true,
"highlight": true,
"minLength": 1,
"remote" : {
url: "/partner/hon/act?term=%QUERY",
beforeSend: function () {
$('#partner_nm').addClass("loading");
},
filter: function(parsedResponse){
$('#partner_nm').removeClass('loading');
return parsedResponse;
}
},
},{
"name" : 'partner_nm',
"displayKey": 'value',
});
$('#partner_nm').bind('typeahead:selected', function(obj, datum, name) {
$('#partner_id').val(datum.id);
$('#partner_nm').val(datum.nama);
});
$('#departemen_nm').typeahead({
"hint" : true,
"highlight": true,
"minLength": 1,
"remote" : {
url: "/departemen/hon/act?term=%QUERY",
beforeSend: function () {
$('#departemen_nm').addClass("loading");
},
filter: function(parsedResponse){
$('#departemen_nm').removeClass('loading');
return parsedResponse;
}
},
},{
"name" : 'departemen_nm',
"displayKey": 'value',
});
$('#departemen_nm').bind('typeahead:selected', function(obj, datum, name) {
$('#departemen_id').val(datum.id);
});
$('#jabatan_nm').typeahead({
"hint" : true,
"highlight": true,
"minLength": 1,
"remote" : {
url: "/partner/departemen/hon_jabatannm/act?term=%QUERY",
beforeSend: function () {
$('#jabatan_nm').addClass("loading");
},
filter: function(parsedResponse){
$('#jabatan_nm').removeClass('loading');
return parsedResponse;
}
},
},{
"name" : 'jabatan_nm',
"displayKey": 'value',
});
$('#jabatan_nm').bind('typeahead:selected', function(obj, datum, name) {
$('#jabatan_id').val(datum.id);
$('#jabatan_nm').val(datum.value);
});
});
"""
self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, {
"searchable": True, "orderable": True, "targets": [1, 2],
}])
self.list_cols = [{'title': "ID", 'data': "id"},
{'title': "NIP", 'data': "nik", 'width': '100pt'},
{'title': "Nama", 'data': "nama"},
{'title': "Unit Kerja", 'data': "departemen"},
{'title': "Jabatan", 'data': "jabatan"},
{'title': "Jenis Jabatan", 'data': "jenis"},
{'title': "Mulai", 'data': "mulai"},
{'title': "Selesai", 'data': "selesai"},]
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
'btn_close'
self.form_params = dict(scripts="")
self.list_url = 'partner/departemen'
self.list_route = 'partner-departemen'
@staticmethod
def form_validator(form, value):
def err_partner():
raise colander.Invalid(form,
'Partner Belum Dipilih')
def err_departemen():
raise colander.Invalid(form,
'Departemen Kerja Belum Dipilih')
def err_jabatan():
raise colander.Invalid(form,
'Partner Belum Dipilih')
if not value['jabatan_id']:
err_jabatan()
elif not value['departemen_id']:
err_departemen()
elif not value['partner_id']:
err_partner()
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req)
schema.request = self.req
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons)
def save(self, values, user, row=None):
if not row:
row = PartnerDepartemen()
row.from_dict(values)
PartnerDBSession.add(row)
PartnerDBSession.flush()
return row
def save_request(self, values, row=None):
request = self.req
if 'id' in request.matchdict:
values['id'] = request.matchdict['id']
if 'mulai' in values:
if values['mulai']:
values['mulai'] = date_from_str(values['mulai'])
else:
values['mulai'] = None
if 'selesai' in values:
if values['selesai']:
values['selesai'] = date_from_str(values['selesai'])
else:
values['selesai'] = None
query_struktural = DBSession.query(Jabatan.jenis).\
filter(Jabatan.id == values['jabatan_id']).scalar()
values['struktural_id'] = query_struktural
row = self.save(values, request.user, row)
request.session.flash('Posisi Partner sudah disimpan.')
def route_list(self, ):
return HTTPFound(location=self.req.route_url(self.list_route))
def session_failed(self, session_name):
r = dict(form=self.request.session[session_name])
del self.request.session[session_name]
return r
def query_id(self):
return PartnerDBSession.query(PartnerDepartemen).filter_by(id=self.req.matchdict['id'])
def id_not_found(self):
msg = 'Posisi Partner ID %s Tidak Ditemukan.' % self.req.matchdict['id']
self.request.session.flash(msg, 'error')
return route_list()
######## ########
# List # # List #
######## ########
@view_config(route_name='partner-departemen', renderer='templates/posisi/list.pt', @view_config(route_name='partner-departemen', renderer='templates/list.pt',
permission='partner-departemen') permission='view')
def view_list(self): def view_list(self):
return dict(a={}) return super().view_list()
########## ##########
# Action # # Action #
########## ##########
@view_config(route_name='partner-departemen-act', renderer='json', @view_config(route_name='partner-departemen-act', renderer='json',
permission='read') permission='view')
def view_act(self): def view_act(self):
request = self.req request = self.req
ses = request.session ses = request.session
...@@ -204,63 +386,84 @@ class ViewPartner(BaseView): ...@@ -204,63 +386,84 @@ class ViewPartner(BaseView):
r.append(d) r.append(d)
return r return r
@view_config(route_name='partner-departemen-view',
renderer='templates/form_input.pt', permission='partner-departemen')
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
if not row:
return self.id_not_found()
form = self.get_form(EditSchema, buttons=(btn_close,))
if request.POST:
return self.route_list()
values = row.to_dict()
values['nama'] = row.partner.nama
values['jabatan'] = row.jabatan.nama
values['departemen'] = row.departemen.nama
values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai)
if not row.struktural_id:
values['struktural_id'] = 0
else:
jb = Jabatan.query_id(row.struktural_id).first()
if jb:
values['struktural_nm'] = jb.nama
form.set_appstruct(self.get_values(row, values))
return dict(form=form.render(readonly=True), scripts=self.form_scripts)
######### #########
# Add # # Add #
######### #########
@view_config(route_name='partner-departemen-add', renderer='templates/posisi/add.pt', @view_config(route_name='partner-departemen-add', renderer='templates/form_input.pt',
permission='partner-departemen-add') permission='partner-departemen')
def view_add(self): def view_add(self):
request = self.req request = self.req
form = get_form(request, AddSchema) form = self.get_form(AddSchema)
values = {} values = {}
if request.POST: if request.POST:
if 'simpan' in request.POST: if 'save' in request.POST:
controls = request.POST.items() controls = request.POST.items()
try: try:
controls = form.validate(controls) controls = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
# form.render(appstruct = e.cstruct) form.render(appstruct = e.cstruct)
return dict(form=form) return dict(form=form.render(), scripts=self.form_scripts)
save_request(request, dict(controls)) self.save_request(dict(controls))
return route_list(request) return self.route_list()
elif SESS_ADD_FAILED in request.session:
return session_failed(request, SESS_ADD_FAILED)
values['departemen_id'] = self.ses['departemen_id'] values['departemen_id'] = self.ses['departemen_id']
values['departemen_nm'] = self.ses['departemen_nm'] values['departemen_nm'] = self.ses['departemen_nm']
values['departemen_kd'] = self.ses['departemen_kd'] values['departemen_kd'] = self.ses['departemen_kd']
# values['jabatan_id'] = self.ses['jabatan']
# values['partner_id'] = self.ses['partner_id']
form.set_appstruct(values) form.set_appstruct(values)
return dict(form=form) return dict(form=form.render(), scripts=self.form_scripts)
# return dict(form=form.render())
########## ##########
# Edit # # Edit #
########## ##########
@view_config(route_name='partner-departemen-edit', renderer='templates/posisi/edt.pt', @view_config(route_name='partner-departemen-edit', renderer='templates/form_input.pt',
permission='partner-departemen') permission='partner-departemen')
def view_edt(self): def view_edt(self):
request = self.req request = self.req
q = query_id(request) row = self.query_id().first()
row = q.first()
if not row: if not row:
return id_not_found(request) return self.id_not_found()
uid = row.id
form = get_form(request, EditSchema) form = self.get_form(EditSchema)
if request.POST: if request.POST:
if 'simpan' in request.POST: if 'save' in request.POST:
controls = request.POST.items() controls = request.POST.items()
try: try:
controls = form.validate(controls) controls = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
form.render(appstruct=e.cstruct) form.render(appstruct=e.cstruct)
return dict(form=form) return dict(form=form.render(), scripts=self.form_scripts)
self.save_request(dict(controls), row)
return self.route_list()
save_request(request, dict(controls), row)
return route_list(request)
elif SESS_EDIT_FAILED in request.session:
return self.session_failed(SESS_EDIT_FAILED)
values = row.to_dict() values = row.to_dict()
values['nama'] = row.partner.nama values['nama'] = row.partner.nama
values['jabatan'] = row.jabatan.nama values['jabatan'] = row.jabatan.nama
...@@ -274,25 +477,24 @@ class ViewPartner(BaseView): ...@@ -274,25 +477,24 @@ class ViewPartner(BaseView):
if jb: if jb:
values['struktural_nm'] = jb.nama values['struktural_nm'] = jb.nama
form.render(appstruct=values) form.set_appstruct(self.get_values(row, values))
return dict(form=form) return dict(form=form.render(), scripts=self.form_scripts)
########## ##########
# Delete # # Delete #
########## ##########
@view_config(route_name='partner-departemen-delete', renderer='templates/posisi/del.pt', @view_config(route_name='partner-departemen-delete', renderer='templates/form_input.pt',
permission='partner-departemen-delete') permission='partner-departemen')
def view_del(self): def view_del(self):
request = self.req request = self.req
q = query_id(request) q = self.query_id()
row = q.first() row = q.first()
if not row: if not row:
return id_not_found(request) return self.id_not_found()
form = Form(colander.Schema(), buttons=('hapus', 'batal'))
if request.POST: if request.POST:
if 'hapus' in request.POST: if 'delete' in request.POST:
msg = 'Posisi Partner ID %d %s sudah dihapus.' % (row.id, row.partner.nama) msg = 'Posisi Partner ID %d %s sudah dihapus.' % (row.id, row.partner.nama)
# qry_login = PartnerLogin.query_partner(request.params['id']) # qry_login = PartnerLogin.query_partner(request.params['id'])
# if qry_login.first(): # if qry_login.first():
...@@ -304,91 +506,26 @@ class ViewPartner(BaseView): ...@@ -304,91 +506,26 @@ class ViewPartner(BaseView):
q.delete() q.delete()
PartnerDBSession.flush() PartnerDBSession.flush()
request.session.flash(msg) request.session.flash(msg)
return route_list(request) return self.route_list()
return dict(row=row, form=form.render()) form = self.get_form(EditSchema,
buttons=(btn_delete, btn_cancel))
values = row.to_dict()
def form_validator(form, value): values['nama'] = row.partner.nama
def err_partner(): values['jabatan'] = row.jabatan.nama
raise colander.Invalid(form, values['departemen'] = row.departemen.nama
'Partner Belum Dipilih') values['mulai'] = dmy(row.mulai)
values['selesai'] = dmy(row.selesai)
def err_departemen(): if not row.struktural_id:
raise colander.Invalid(form, values['struktural_id'] = 0
'Departemen Kerja Belum Dipilih')
def err_jabatan():
raise colander.Invalid(form,
'Partner Belum Dipilih')
if not value['jabatan_id']:
err_jabatan()
elif not value['departemen_id']:
err_departemen()
elif not value['partner_id']:
err_partner()
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 save(values, request, row=None):
if not row:
row = PartnerDepartemen()
row.from_dict(values)
PartnerDBSession.add(row)
PartnerDBSession.flush()
return row
# if not row:
# row = Produk()
# row.from_dict(values)
# DBSession.add(row)
# DBSession.flush()
# return row
def save_request(request, values, row=None):
if 'id' in request.matchdict:
values['id'] = request.matchdict['id']
if 'mulai' in values:
if values['mulai']:
values['mulai'] = date_from_str(values['mulai'])
else:
values['mulai'] = None
if 'selesai' in values:
if values['selesai']:
values['selesai'] = date_from_str(values['selesai'])
else: else:
values['selesai'] = None jb = Jabatan.query_id(row.struktural_id).first()
query_struktural = DBSession.query(Jabatan.jenis).\ if jb:
filter(Jabatan.id == values['jabatan_id']).scalar() values['struktural_nm'] = jb.nama
values['struktural_id'] = query_struktural form.set_appstruct(self.get_values(row, values))
row = save(values, request, row) return dict(row=row,form=form.render(readonly=True), scripts=self.form_scripts)
request.session.flash('Posisi Partner sudah disimpan.')
def route_list(request):
return HTTPFound(location=request.route_url('partner-departemen'))
def session_failed(request, session_name):
r = dict(form=request.session[session_name])
del request.session[session_name]
return r
def query_id(request):
return PartnerDBSession.query(PartnerDepartemen).filter_by(id=request.matchdict['id'])
def get_values(self, row, values=None):
if not values:
values = row.to_dict()
def id_not_found(request): return values
msg = 'Posisi Partner ID %s Tidak Ditemukan.' % request.matchdict['id']
request.session.flash(msg, 'error')
return route_list(request)
\ No newline at end of file \ No newline at end of file
...@@ -58,7 +58,29 @@ ...@@ -58,7 +58,29 @@
<link href="${home}/static/css/custom.css" rel="stylesheet" type="text/css"> <link href="${home}/static/css/custom.css" rel="stylesheet" type="text/css">
<metal:css define-slot="css_files"></metal:css> <metal:css define-slot="css_files"></metal:css>
<style metal:define-slot="style"></style> <style metal:define-slot="style">
.twitter-typeahead{
font-size: 12px !important;
margin-bottom: 0;
width: 100%;
height: 26px;
position: absolute;
top: 0;
left: 0;
z-index:auto;
}
.twitter-typeahead .tt-query, .twitter-typeahead .tt-hint {
font-size: 12px !important;
margin-bottom: 0;
width: 100%;
height: 26px;
position: absolute;
top: 0;
left: 0;
z-index:auto;
}
</style>
</head> </head>
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
}); });
$("#btn_close").click(function () { $("#btn_close").click(function () {
window.location = '${home}pbb/master'; window.location = '${home}';
return false; return false;
}); });
......
...@@ -84,11 +84,32 @@ class ViewDepartemen(BaseView): ...@@ -84,11 +84,32 @@ class ViewDepartemen(BaseView):
def __init__(self, request): def __init__(self, request):
super(ViewDepartemen, self).__init__(request) super(ViewDepartemen, self).__init__(request)
self.form_scripts = """ self.form_scripts = """
$('#parent_nm').bind('typeahead:selected', function(obj, datum) { $(document).ready(function () {
$('#parent_id').val(datum.id); $('#parent_nm').typeahead({
$('#parent_kd').val(datum.kode); "hint" : true,
"highlight": true,
});""" "minLength": 1,
"remote" : {
url: "/departemen/hon/act?term=%QUERY",
beforeSend: function () {
$('#parent_nm').addClass("loading");
},
filter: function(parsedResponse){
$('#parent_nm').removeClass('loading');
return parsedResponse;
}
},
},{
"name" : 'parent_nm',
"displayKey": 'value',
});
$('#parent_nm').bind('typeahead:selected', function(obj, datum, name) {
$('#parent_id').val(datum.id);
$('#parent_kd').val(datum.kode);
});
});
"""
self.list_col_defs = json.dumps( self.list_col_defs = json.dumps(
[{"searchable": False, "visible": False, "targets": [0], }, { [{"searchable": False, "visible": False, "targets": [0], }, {
...@@ -355,7 +376,7 @@ class ViewDepartemen(BaseView): ...@@ -355,7 +376,7 @@ class ViewDepartemen(BaseView):
######## ########
# Edit # # Edit #
######## ########
@view_config(route_name='departemen-edt', @view_config(route_name='departemen-edit',
renderer='templates/form_input.pt', permission='departemen') renderer='templates/form_input.pt', permission='departemen')
def view_edt(self): def view_edt(self):
request = self.req request = self.req
...@@ -381,7 +402,7 @@ class ViewDepartemen(BaseView): ...@@ -381,7 +402,7 @@ class ViewDepartemen(BaseView):
########## ##########
# Delete # # Delete #
########## ##########
@view_config(route_name='departemen-del', @view_config(route_name='departemen-delete',
renderer='templates/form_input.pt', permission='departemen') renderer='templates/form_input.pt', permission='departemen')
def view_delete(self): def view_delete(self):
request = self.req request = self.req
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!