Commit 413488dc by aagusti

perbaikan init

1 parent 3e68055a
# Basis Aplikasi openSIPKD # Basis Aplikasi openSIPKD Minimalis
Ini adalah basis dari seluruh aplikasi openSIPKD. Ini adalah basis dari seluruh aplikasi openSIPKD.
......
"""menus add valu and action
Revision ID: 671617e55c56
Revises: f95c10a7ae98
Create Date: 2022-12-27 17:59:55.766347
"""
# revision identifiers, used by Alembic.
revision = '671617e55c56'
down_revision = 'f95c10a7ae98'
branch_labels = None
depends_on = None
from alembic import op
import sqlalchemy as sa
def upgrade():
context = op.get_context()
helpers = context.opts['helpers']
if not helpers.table_has_column('menus', 'valu'):
op.add_column('menus',
sa.Column('valu', sa.String(256)))
if not helpers.table_has_column('menus', 'meth'):
op.add_column('menus',
sa.Column('meth', sa.String(256)))
if not helpers.table_has_column('menus', 'page_typ'):
op.add_column('menus',
sa.Column('page_typ', sa.String(256)))
def downgrade():
pass
...@@ -15,8 +15,7 @@ from pyramid.paster import (get_appsettings, setup_logging, ) ...@@ -15,8 +15,7 @@ from pyramid.paster import (get_appsettings, setup_logging, )
from opensipkd.models.handlers import LogDBSession from opensipkd.models.handlers import LogDBSession
from opensipkd.models import ( from opensipkd.models import (
init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission, init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission,
User, Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa, User, Route)
Menus)
from sqlalchemy.dialects import oracle from sqlalchemy.dialects import oracle
from sqlalchemy import text from sqlalchemy import text
...@@ -309,13 +308,4 @@ def main(argv=sys.argv): ...@@ -309,13 +308,4 @@ def main(argv=sys.argv):
append_csv(GroupPermission, 'group_permission.csv', append_csv(GroupPermission, 'group_permission.csv',
['group_id', 'perm_name']) ['group_id', 'perm_name'])
append_csv(Route, 'routes.csv', ['kode']) append_csv(Route, 'routes.csv', ['kode'])
append_csv(Menus, 'menus.csv', ['kode'])
append_csv(Eselon, 'eselon.csv', ['kode'])
append_csv(Jabatan, 'jabatan.csv', ['kode'])
restore_csv(ResProvinsi, 'provinsi.csv')
transaction.commit() transaction.commit()
restore_csv(ResDati2, 'dati2.csv')
transaction.commit()
restore_csv(ResKecamatan, 'kecamatan.csv')
transaction.commit()
restore_csv(ResDesa, 'desa.csv')
...@@ -23,7 +23,7 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete, ...@@ -23,7 +23,7 @@ from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete,
btn_view, btn_add, btn_edit, btn_csv, \ btn_view, btn_add, btn_edit, btn_csv, \
btn_pdf btn_pdf
from opensipkd.models import User, Menus from opensipkd.models import User
from ..scripts.initializedb import append_csv from ..scripts.initializedb import append_csv
from ..tools.api import auth_from_rpc from ..tools.api import auth_from_rpc
......
...@@ -2,9 +2,9 @@ import colander ...@@ -2,9 +2,9 @@ import colander
from deform import (widget, ) from deform import (widget, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from opensipkd.models import ResProvinsi, ResDati2, ResDesa, User # from opensipkd.models import ResProvinsi, ResDati2, ResDesa, User
from .partner_base import PartnerSchema, NamaSchema from .partner_base import PartnerSchema, NamaSchema
from opensipkd.models import DBSession, ResCompany, ResKecamatan, Partner from opensipkd.models import DBSession, ResCompany, Partner
from ..views import BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah pemda gagal' SESS_ADD_FAILED = 'Tambah pemda gagal'
......
import colander
from deform import (widget, )
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from . import widget_os
from .provinsi import provinsi_widget
from opensipkd.models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import BaseView
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah dati2 gagal'
SESS_EDIT_FAILED = 'Edit dati2 gagal'
@colander.deferred
def dati2_widget(node, kw):
values = kw.get('dati2_list', [])
url = node and hasattr(node, 'slave_url') and node.slave_url or ""
slave = node and hasattr(node, 'slave') and node.slave or ""
values.insert(0, ("", "Pilih Kab/Kota..."))
return widget_os.Select2MsWidget(values=values,
url=url,
slave=slave,
placeholder="Pilih Kota/Kabupaten"
)
class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget,
validator=colander.Length(max=32),
oid="kode")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(
values=kategori_dati2),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
provinsi = colander.SchemaNode(colander.String(), field=ResProvinsi.nama)
class ViewDati2(BaseView):
def __init__(self, request):
super(ViewDati2, self).__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_url = 'dati2'
self.list_route = 'dati2'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDati2
self.list_schema = ListSchema
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(ResDati2).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResDati2.query_kode(value['kode']) \
.filter(ResDati2.provinsi_id == value["provinsi_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResDati2.query_nama(value['nama']) \
.filter(ResDati2.provinsi_id == value["provinsi_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_bindings(self, row=None):
return dict(provinsi_list=ResProvinsi.get_list())
@view_config(route_name='dati2',
renderer='templates/table.pt',
permission='wilayah')
def view_list(self):
return super(ViewDati2, self).view_list()
@view_config(route_name='dati2-view',
renderer='templates/form.pt', permission='wilayah')
def view_view(self): # row = query_id(request).first()
return super(ViewDati2, self).view_view()
def list_join(self, query):
return query.join(ResProvinsi, ResProvinsi.id == ResDati2.provinsi_id)
@view_config(route_name='dati2-act', renderer='json')
def view_act(self):
return super().view_act()
def next_act(self):
url_dict = self.req.matchdict
if url_dict['act'] == 'select':
provinsi_id = self.req.params["provinsi_id"]
data = ResDati2.get_list(provinsi_id)
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='dati2-add',
renderer='templates/form.pt', permission='wilayah')
def view_add(self):
return super(ViewDati2, self).view_add()
@view_config(route_name='dati2-edit',
renderer='templates/form.pt', permission='wilayah')
def view_edt(self):
return super(ViewDati2, self).view_edit()
@view_config(route_name='dati2-delete',
renderer='templates/form.pt', permission='wilayah')
def view_delete(self):
return super(ViewDati2, self).view_delete()
@view_config(route_name='dati2-upload',
renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super(ViewDati2, self).view_upload(exts=(".csv",))
from pyramid.view import (
view_config,
)
import colander
from deform import (
Form,
widget,
ValidationFailure,
)
from pyramid.httpexceptions import (
HTTPFound,
)
from pyramid.view import (
view_config,
)
from opensipkd.models import Departemen
from ..views import BaseView
SESS_ADD_FAILED = 'Tambah departemen gagal'
SESS_EDIT_FAILED = 'Edit departemen gagal'
class AddSchema(colander.Schema):
cur_departemen_nm = colander.SchemaNode(
colander.String(),
widget=widget.TextInputWidget(readonly=True),
title="Departemen Kini",
missing=colander.drop)
departemen_id = colander.SchemaNode(
colander.Integer(),
widget=widget.HiddenWidget(),
oid="departemen_id", )
departemen_nm = colander.SchemaNode(
colander.String(),
# missing = colander.drop,
oid="departemen_nm",
title="Pilih Departemen")
departemen_kd = colander.SchemaNode(
colander.String(),
# widget = widget.HiddenWidget(),
oid="departemen_kd",
title="Kode")
level_id = colander.SchemaNode(
colander.String(),
# widget = widget.HiddenWidget(),
oid="level_id",
title="Level")
callback = colander.SchemaNode(
colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(),
)
class ChangeDepartemen(BaseView):
########
# List #
########
@view_config(route_name='departemen-chg', renderer='templates/departemen/chg.pt')
def view_departemen_chg(self):
request = self.req
ses = request.session
params = request.params
url_dict = request.matchdict
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:
return dict(form=form)
values = dict(controls)
save_request(request, values)
if 'callback' in values and values['callback']:
return HTTPFound(values['callback'])
return route_list(request)
referer = 'REFERER' in request.headers and request.headers['REFERER'] or ''
values = dict(cur_departemen_nm=ses["departemen_nm"],
callback=referer)
form.render(appstruct=values)
return dict(form=form)
#######
# Add #
#######
def form_validator(form, value):
def err_departemen():
raise colander.Invalid(form,
'Departemen Tidak Ditemukan')
q = Departemen.query_id(value['departemen_id'])
found = q.first()
if not found:
err_departemen()
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_request(request, values, row=None):
request.session['departemen_id'] = values['departemen_id']
row = Departemen.query_id(values['departemen_id']).first()
request.session['departemen_nm'] = row.nama
request.session['departemen_kd'] = row.kode
request.session.flash(
'Departemen %s %s sudah diubah.' % (request.session['departemen_kd'], request.session['departemen_nm']))
def route_list(request):
return HTTPFound(location=request.route_url('home'))
import os
# from ..tools import row2dict, xls_reader
from datetime import datetime
from pyramid.view import (
view_config,
)
from opensipkd.tools.report import (
open_rml_row,
open_rml_pdf,
pdf_response,
csv_response,
)
from opensipkd.models import DBSession
from opensipkd.models import (
Departemen,
)
from ..views import (BaseView, )
class view_rpt(BaseView):
@view_config(route_name='departemen-rpt', renderer='csv')
def view_csv(self):
request = self.req
ses = request.session
params = request.params
url_dict = request.matchdict
uid = request.user.id
tgl = datetime.now().strftime('%d-%m-%Y')
if url_dict['rpt']=='csv' :
query = query_reg(request)
row = query.first()
header = row.keys()
rows = []
for item in query.all():
rows.append(list(item))
filename = 'partner.csv'
value = {
'header': header,
'rows' : rows,
}
return csv_response(request, value, filename)
elif url_dict['rpt']=='pdf':
query = query_reg(request)
_here = os.path.dirname(__file__) #get current folder -> views
path = os.path.dirname(_here) #mundur 1 level
path = os.path.join(path, 'reports')
rml_row = open_rml_row(path+'/departemen.row.rml')
rows=[]
for r in query.all():
s = rml_row.format(kode=r.kode, nama=r.nama, status=r.status and "Aktif" or "Pasif", kategori=r.kategori)
rows.append(s)
pdf, filename = open_rml_pdf(path+'/departemen.rml', rows=rows,
company=request.company,
departement = request.session['departemen_nm'],
address = request.address,
alamat=Departemen.query_id(request.session['departemen_id']).first(),
periode = '01-01-2017 s.d 31-12-2017')
return pdf_response(request, pdf, filename)
# ##########
# # query #
# ##########
def query_reg(request):
return DBSession.query(Departemen.kode,
Departemen.nama,
Departemen.status,
Departemen.kategori).\
filter(Departemen.status==1).\
order_by(Departemen.id)
import colander
from deform import (widget, )
from opensipkd.tools.buttons import btn_upload, btn_close, btn_add
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from .dati2 import dati2_widget
from .kecamatan import kecamatan_widget
from .provinsi import provinsi_widget
from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2
from ..views import BaseView
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah desa gagal'
SESS_EDIT_FAILED = 'Edit desa gagal'
@colander.deferred
def desa_widget(node, kw):
values = kw.get('desa_list', [])
return widget.Select2Widget(values=values,
placeholder="Pilih Desa/Kelurahan")
class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(colander.String(),
widget=provinsi_widget,
validator=colander.Length(max=32),
oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(colander.String(),
widget=dati2_widget,
validator=colander.Length(max=32),
oid="dati2_id",
slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=",
title="Kabupaten/Kota",
)
kecamatan_id = colander.SchemaNode(colander.String(),
widget=kecamatan_widget,
validator=colander.Length(max=32),
oid="kecamatan_id",
title="Kecamatan")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_desa),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
kecamatan = colander.SchemaNode(colander.String(), field=ResKecamatan.nama)
class ViewDesa(BaseView):
def __init__(self, request):
super(ViewDesa, self).__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_url = 'desa'
self.list_route = 'desa'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResDesa
self.list_schema = ListSchema
self.list_buttons = (btn_add, btn_close, btn_upload)
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(ResDesa).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResDesa.query_kode(value['kode']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResDesa.query_nama(value['nama']) \
.filter(ResDesa.kecamatan_id == value["kecamatan_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list()
kecamatan = row and row.kecamatan or None
kecamatan_list = kecamatan and ResKecamatan.get_list(kecamatan.dati2_id) or []
dati2 = kecamatan and kecamatan.dati2 or None
dati2_list = dati2 and ResDati2.get_list(dati2.provinsi_id) or []
return dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
)
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
kecamatan = row and row.kecamatan or None
d["dati2_id"] = kecamatan and kecamatan.dati2_id or None
dati2 = kecamatan and kecamatan.dati2 or None
d["provinsi_id"] = dati2 and dati2.provinsi_id or None
return d
@view_config(route_name='desa-view',
renderer='templates/form.pt', permission='wilayah')
def view_view(self):
return super().view_view()
@view_config(route_name='desa',
renderer='templates/table.pt',
permission='wilayah')
def view_list(self):
return super(ViewDesa, self).view_list()
def list_join(self, query):
return query.outerjoin(ResKecamatan)
@view_config(route_name='desa-act', renderer='json',
permission='view')
def view_act(self):
return super().view_act()
def next_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'select':
kecamatan_id = request.params["kecamatan_id"]
data = ResDesa.get_list(kecamatan_id)
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='desa-add',
renderer='templates/form.pt', permission='wilayah')
def view_add(self):
return super(ViewDesa, self).view_add()
@view_config(route_name='desa-edit',
renderer='templates/form.pt', permission='wilayah')
def view_edt(self):
return super(ViewDesa, self).view_edit()
@view_config(route_name='desa-delete',
renderer='templates/form.pt', permission='wilayah')
def view_delete(self):
return super(ViewDesa, self).view_delete()
@view_config(route_name='desa-upload',
renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super(ViewDesa, self).view_upload(exts=('.csv',))
import colander
from deform import (
widget,
)
from pyramid.view import (
view_config,
)
from .partner_base import NamaSchema
from opensipkd.models import (
DBSession,
Eselon
)
from ..views import BaseView
SESS_ADD_FAILED = 'Tambah eselon gagal'
SESS_EDIT_FAILED = 'Edit eselon gagal'
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(
colander.String(),
oid="nama")
status = colander.SchemaNode(
colander.Boolean(),
oid="status")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget())
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(),title="Action")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="nama")
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(),
oid="status")
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'eselon'
self.list_route = 'eselon'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Eselon
self.list_schema = ListSchema
@view_config(route_name='eselon', renderer='templates/table.pt',
permission='eselon')
def view_list(self):
return super(Views, self).view_list()
@view_config(route_name='eselon-act', renderer='json',
permission='read')
def view_act(self):
return super(Views, self).view_act()
def next_act(self):
params = self.params
url_dict = self.req.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
qry = Eselon.query(). \
filter(Eselon.kode.ilike('%%%s%%' % term)). \
order_by(Eselon.kode)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.kode,
nama=row.nama
)
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or ''
qry = Eselon.query(). \
filter(Eselon.nama.ilike('%%%s%%' % term)). \
order_by(Eselon.nama)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.nama,
kode=row.kode,
)
r.append(d)
return r
@view_config(route_name='eselon-add', renderer='templates/form.pt',
permission='eselon')
def view_add(self):
return super().view_add()
@view_config(route_name='eselon-edit', renderer='templates/form.pt',
permission='eselon')
def view_edit(self):
return super().view_edit()
@view_config(route_name='eselon-view', renderer='templates/form.pt',
permission='eselon')
def view_view(self):
return super().view_view()
@view_config(route_name='eselon-delete', renderer='templates/form_input.pt',
permission='eselon')
def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Nama %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
# edit
def err_ruang():
raise colander.Invalid(form,
'Nama ruang %s tidak boleh lebih dari 1 karakter.' % (
value['ruang']))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Eselon).filter_by(id=uid)
eselon = q.first()
else:
eselon = None
q = Eselon.query_kode(value['kode'])
found = q.first()
if eselon:
if found and found.id != eselon.id:
err_kode()
elif found:
err_kode()
found = Eselon.query_nama(value['nama']).first()
if eselon:
if found and found.id != eselon.id:
err_nama()
elif found:
err_nama()
import os
import colander
from deform import (widget, )
from opensipkd.tools.report import csv_response, open_rml_pdf, open_rml_row, \
pdf_response
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from opensipkd.models import (
DBSession,
Jabatan,
Eselon, Departemen
)
from .partner_base import NamaSchema
from ..views import BaseView, deferred_jenis
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah jabatan gagal'
SESS_EDIT_FAILED = 'Edit jabatan gagal'
JENIS = ((1, _('structural', default='Structural')),
(2, _('functional', default='Functional')),
(3, _('finance', default='Finance')),
)
def daftar_eselon():
return DBSession.query(Eselon.id, Eselon.nama).order_by(Eselon.kode).all()
@colander.deferred
def deferred_eselon(node, kw):
values = kw.get('daftar_eselon', [])
return widget.SelectWidget(values=values)
class AddSchema(colander.Schema):
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode")
nama = colander.SchemaNode(
colander.String(),
oid="nama")
nama_pendek = colander.SchemaNode(
colander.String(),
oid="nama_pendek",
missing=colander.drop)
nama_lain = colander.SchemaNode(
colander.String(),
oid="nama_lain",
missing=colander.drop)
jenis = colander.SchemaNode(
colander.Integer(),
oid="jenis",
widget=deferred_jenis,
title=_("type", default="Jenis"))
eselon_id = colander.SchemaNode(
colander.Integer(),
oid="eselon_id",
widget=deferred_eselon,
title=_("eselon", default="Eselon"))
status = colander.SchemaNode(
colander.Boolean(),
oid="status")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget())
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
oid="kode",
title="Kode",
width="100pt")
nama = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="nama")
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(),
oid="status")
class ViewJabatan(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'jabatan'
self.list_route = 'jabatan'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Jabatan
self.list_schema = ListSchema
# self.list_buttons = (btn_view, btn_add, btn_edit, btn_delete, btn_close)
def get_bindings(self, row=None):
return dict(daftar_jenis=JENIS,
daftar_eselon=daftar_eselon())
@view_config(route_name='jabatan', renderer='templates/table.pt',
permission='jabatan')
def view_list(self):
return super().view_list()
@view_config(route_name='jabatan-act', renderer='json',
permission='read')
def view_act(self):
return super().view_act()
def next_act(self):
request = self.req
params = request.params
url_dict = request.matchdict
if url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
qry = DBSession.query(Jabatan). \
filter(Jabatan.status == 1). \
filter(Jabatan.kode.ilike('%%%s%%' % term)). \
order_by(Jabatan.kode)
r = []
for row in qry.all():
d = dict(
id=row.id,
value=row.nama,
# value = row.nama,
# kode = row.kode,
nama=row.kode
)
r.append(d)
return r
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
q = DBSession.query(Jabatan.id, Jabatan.kode, Jabatan.nama,
Jabatan.jenis). \
filter(Jabatan.nama.ilike('%%%s%%' % term)). \
order_by(Jabatan.nama)
rows = q.all()
r = []
for k in rows:
if k[3] == 1:
nama_jenis = 'Struktural'
elif k[3] == 2:
nama_jenis = 'Fungsional'
else:
nama_jenis = 'Keuangan'
d = {}
d['id'] = k[0]
d['value'] = k[2] + ' (' + nama_jenis + ')'
d['kode'] = k[1]
d['nama'] = k[2]
r.append(d)
return r
elif url_dict['act'] == 'headofnama':
term = 'term' in params and params['term'] or ''
q = DBSession.query(Jabatan.id, Jabatan.kode, Jabatan.nama,
Jabatan.jenis). \
filter(Jabatan.nama.ilike('%%%s%%' % term)). \
order_by(Jabatan.nama)
rows = q.all()
r = []
for k in rows:
if k[3] == 1:
nama_jenis = 'Keuangan'
elif k[3] == 2:
nama_jenis = 'Struktural'
else:
nama_jenis = 'Fungsional'
d = {'id': k[0], 'value': k[2] + ' (' + nama_jenis + ')',
'kode': k[1], 'nama': k[2]}
r.append(d)
return r
elif url_dict['act'] == 'csv':
query = query_reg(request)
row = query.first()
header = row.keys()
rows = []
for item in query.all():
rows.append(list(item))
filename = 'jabatan.csv'
value = {
'header': header,
'rows': rows,
}
return csv_response(request, value, filename)
elif url_dict['act'] == 'pdf':
query = query_reg(request)
_here = os.path.dirname(__file__) # get current folder -> views
path = os.path.dirname(_here) # mundur 1 level
path = os.path.join(path, 'reports')
rml_row = open_rml_row(path + '/jabatan.row.rml')
rows = []
for r in query.all():
s = rml_row.format(kode=r.kode, nama=r.nama,
status=r.status and "Aktif" or "Pasif")
rows.append(s)
pdf, filename = open_rml_pdf(path + '/jabatan.rml', rows=rows,
company=request.company,
departement=request.session[
'departemen_nm'],
address=request.address,
alamat=Departemen.query_id(
request.session[
'departemen_id']).first(),
periode='01-01-2017 s.d 31-12-2017')
return pdf_response(request, pdf, filename)
@view_config(route_name='jabatan-add',
renderer='templates/form.pt',
permission='jabatan')
def view_add(self):
return super().view_add()
@view_config(route_name='jabatan-edit',
renderer='templates/form.pt',
permission='jabatan')
def view_edit(self):
return super().view_edit()
@view_config(route_name='jabatan-view', renderer='templates/form.pt',
permission='jabatan')
def view_view(self):
return super().view_view()
@view_config(route_name='jabatan-delete', renderer='templates/form.pt',
permission='jabatan')
def view_delete(self):
return super().view_delete()
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(Jabatan).filter_by(id=uid)
jabatan = q.first()
else:
jabatan = None
q = Jabatan.query_kode(value[
'kode']) # DBSession.query(Jabatan).filter_by(kode=value['kode'])
found = q.first()
if jabatan:
if found and found.id != jabatan.id:
err_kode()
elif found:
err_kode()
found = Jabatan.query_nama(value['nama']).first()
if jabatan:
if found and found.id != jabatan.id:
err_nama()
elif found:
err_nama()
def query_reg(request):
return DBSession.query(Jabatan.kode,
Jabatan.nama,
Jabatan.status, ). \
filter(Jabatan.status == 1). \
order_by(Jabatan.id)
import os
from datetime import datetime
from opensipkd.tools.report import (
open_rml_row,
open_rml_pdf,
pdf_response,
csv_response,
)
from pyramid.view import (
view_config,
)
from opensipkd.models import DBSession
from opensipkd.models import (
Jabatan,
Departemen,
)
from ..views import (BaseView, )
class view_rpt(BaseView):
@view_config(route_name='jabatan-rpt', renderer='csv')
def view_csv(self):
request = self.req
ses = request.session
params = request.params
url_dict = request.matchdict
uid = request.user.id
tgl = datetime.now().strftime('%d-%m-%Y')
if url_dict['rpt'] == 'csv':
query = query_reg(request)
row = query.first()
header = row.keys()
rows = []
for item in query.all():
rows.append(list(item))
filename = 'jabatan.csv'
value = {
'header': header,
'rows': rows,
}
return csv_response(request, value, filename)
elif url_dict['rpt'] == 'pdf':
query = query_reg(request)
_here = os.path.dirname(__file__) # get current folder -> views
path = os.path.dirname(_here) # mundur 1 level
path = os.path.join(path, 'reports')
rml_row = open_rml_row(path + '/jabatan.row.rml')
rows = []
for r in query.all():
s = rml_row.format(kode=r.kode, nama=r.nama, status=r.status and "Aktif" or "Pasif")
rows.append(s)
pdf, filename = open_rml_pdf(path + '/jabatan.rml', rows=rows,
company=request.company,
departement=request.session['departemen_nm'],
address=request.address,
alamat=Departemen.query_id(request.session['departemen_id']).first(),
periode='01-01-2017 s.d 31-12-2017')
return pdf_response(request, pdf, filename)
# ##########
# # query #
# ##########
def query_reg(request):
return DBSession.query(Jabatan.kode,
Jabatan.nama,
Jabatan.status, ). \
filter(Jabatan.status == 1). \
order_by(Jabatan.id)
import colander
from deform import (widget, )
from opensipkd.tools.buttons import btn_upload, btn_close, btn_add
from pyramid.i18n import TranslationStringFactory
from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.models import DBSession, ResKecamatan, ResDati2, ResProvinsi
from pyramid.view import (view_config, )
from . import widget_os
from .dati2 import dati2_widget
from ..views import BaseView
SESS_ADD_FAILED = 'Tambah kecamatan gagal'
SESS_EDIT_FAILED = 'Edit kecamatan gagal'
_ = TranslationStringFactory("opensipkd")
@colander.deferred
def kecamatan_widget(node, kw):
values = kw.get('kecamatan_list', [])
url = node and hasattr(node, 'slave_url') and node.slave_url or ""
slave = node and hasattr(node, 'slave') and node.slave or ""
values.insert(0, ("", "Pilih Kecamatan..."))
return widget_os.Select2MsWidget(values=values,
url=url,
slave=slave,
placeholder="Pilih Kecamatan")
class AddSchema(colander.Schema):
provinsi_id = colander.SchemaNode(
colander.String(),
widget=provinsi_widget,
validator=colander.Length(max=32),
oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(
colander.String(),
widget=dati2_widget,
validator=colander.Length(max=32),
oid="dati2_id")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width='100pt', title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
kabupaten = colander.SchemaNode(colander.String(), field=ResDati2.nama)
class Views(BaseView):
def __init__(self, request):
super(Views, self).__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'kecamatan'
self.list_route = 'kecamatan'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResKecamatan
self.list_schema = ListSchema
self.list_buttons = (btn_add, btn_close, btn_upload)
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(ResKecamatan).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResKecamatan.query_kode(value['kode']) \
.filter(ResKecamatan.dati2_id == value["dati2_id"])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResKecamatan.query_nama(value['nama']) \
.filter(ResKecamatan.dati2_id == value["dati2_id"]).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
@view_config(route_name='kecamatan-view',
renderer='templates/form.pt', permission='wilayah')
def view_view(self): # row = query_id(request).first()
return super().view_view()
@view_config(route_name='kecamatan',
renderer='templates/table.pt',
permission='wilayah')
def view_list(self):
return super(Views, self).view_list()
@view_config(route_name='kecamatan-act', renderer='json',
permission='view')
def view_act(self):
return super().view_act()
def list_join(self, query):
return query.join(ResDati2, ResDati2.id == ResKecamatan.dati2_id)
def next_act(self):
request = self.req
url_dict = request.matchdict
if url_dict['act'] == 'select':
dati2_id = request.params["dati2_id"]
data = ResKecamatan.get_list(dati2_id)
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='kecamatan-add',
renderer='templates/form.pt', permission='wilayah')
def view_add(self):
return super(Views, self).view_add()
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list()
kecamatan = row
dati2 = kecamatan and kecamatan.dati2 or None
dati2_list = dati2 and ResDati2.get_list(dati2.provinsi_id) or []
return dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
)
def get_values(self, row, istime=False):
d = super().get_values(row, istime)
kecamatan = row
dati2 = kecamatan and kecamatan.dati2 or None
d["provinsi_id"] = dati2 and dati2.provinsi_id or None
return d
@view_config(route_name='kecamatan-edit',
renderer='templates/form.pt', permission='wilayah')
def view_edt(self):
return super(Views, self).view_edit()
@view_config(route_name='kecamatan-delete',
renderer='templates/form.pt', permission='wilayah')
def view_delete(self):
return super(Views, self).view_delete()
@view_config(route_name='kecamatan-upload',
renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super(Views, self).view_upload(exts=(".csv",))
import colander
from deform import (widget, )
from pyramid.i18n import TranslationStringFactory
from opensipkd.models import Menus, flush
from pyramid.view import (view_config, )
from sqlalchemy.orm import aliased
from ..views import ColumnDT, DataTables, BaseView
from .. import get_urls
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah menu gagal'
SESS_EDIT_FAILED = 'Edit menu gagal'
def get_menu_list():
q = Menus.get_list()
return [(str(row.id), f"{row.kode}/ {row.nama}") for row in q]
@colander.deferred
def menu_widget(node, kw):
values = kw.get('menu_list', [])
return widget.Select2Widget(values=values)
class AddSchema(colander.Schema):
# parent_id = colander.SchemaNode(
# colander.Integer(),
# widget=widget.HiddenWidget(), oid="parent_id", missing=colander.drop,
# )
#
# parent_nm = colander.SchemaNode(
# colander.String(), missing=colander.drop,
# widget=widget.AutocompleteInputWidget(
# size=60, min_length=3,
# requirements=(("typeahead", None), ("deform", None),
# {"js": "opensipkd.base:static/js/form/menu.js"})
# ),
# oid="parent_nm", title="Parent")
# parent_kd = colander.SchemaNode(colander.String(),
# widget=widget.TextInputWidget(css_class="readonly"),
# missing=colander.drop, oid="parent_kd", title="Kode Induk")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
valu = colander.SchemaNode(colander.String(), oid="valu",
title="Action",
missing=colander.drop)
meth = colander.SchemaNode(colander.String(), oid="meth",
title="Method",
missing=colander.drop)
page_typ = colander.SchemaNode(colander.String(), oid="page_typ",
title="Page Type")
icon = colander.SchemaNode(colander.String(),
missing=colander.drop)
class_name = colander.SchemaNode(colander.String(), oid="url",
missing=colander.drop)
need_login = colander.SchemaNode(colander.Integer(),
widget=widget.RadioChoiceWidget(
values=(("-1", "Unlogged"),
("0", "All"),
("1", "Logged User"),
)))
title = colander.SchemaNode(colander.String())
status = colander.SchemaNode(colander.Boolean(), oid="status")
def after_bind(self, schema, kwargs):
request = kwargs["request"]
# self["parent_nm"] = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=AutocompleteInputWidget(
# size=60, min_length=3,
# values=f"{request.route_url('menu')}/hon/act"),
# oid="parent_nm",
# title="Induk", )
# self["parent_nm"].widget = widget.AutocompleteInputWidget(
# size=60, min_length=3,
# requirements=(("typeahead", None), ("deform", None),
# {"js": "opensipkd.base:static/js/form/menu.js"}),
# values=f"{request.route_url('menu')}/hon/act")
# if request.user.company_id:
# self["company_id"].widget = widget.HiddenWidget()
# self["company_id"].default = request.user.company_id
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True))
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), title="Kode", width='100pt')
nama = colander.SchemaNode(colander.String(), title="Nama")
status = colander.SchemaNode(colander.Boolean(), title="Status",
width='50pt')
need_login = colander.SchemaNode(colander.Integer(), title="Login",
width='50pt')
valu = colander.SchemaNode(colander.String(), title="Value",
width='50pt')
meth = colander.SchemaNode(colander.String(), title="Method",
width='50pt')
page_typ = colander.SchemaNode(colander.String(), title="Type",
width='50pt')
level_id = colander.SchemaNode(colander.String(), title="Level",
width='50pt')
parent = colander.SchemaNode(colander.String(), title="Induk",
width='200pt')
class ViewMenus(BaseView):
def __init__(self, request):
super(ViewMenus, self).__init__(request)
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Menus
self.list_route = 'menu'
self.form_scripts = ""
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = Menus.query_id(uid)
current = q.first()
else:
current = None
found = Menus.query_kode(value['kode']).first()
if current:
if found and found.id != current.id:
err_kode()
elif found:
err_kode()
found = Menus.query_nama(value['nama']).first()
if current:
if found and found.id != current.id:
err_nama()
elif found:
err_nama()
def update_children(self, children):
for child in children:
child.level_id = child.parent.level_id + 1
flush(child)
if child.children:
self.update_children(child.children)
def save_request(self, values, row=None): # save(self, row, values):
# for k, v in values.items():
# if not v:
# setattr(row, k, None)
# row = super().save_request(values, row)
for k, v in self.req.GET.items():
if k not in values:
if v:
values[k] = v
values["status"] = "status" in values and values["status"] or 0
return self.save(values, self.req.user, row)
@view_config(route_name='menu',
renderer='templates/table.pt',
permission='menu')
def view_list(self):
return super().view_list()
@view_config(route_name='menu-view',
renderer='templates/form.pt', permission='menu')
def view_view(self):
return super(ViewMenus, self).view_view()
@view_config(route_name='menu-act', renderer='json',
permission='view')
def view_act(self):
request = self.req
params = request.params
url_dict = request.matchdict
table_alias = aliased(Menus)
if url_dict['act'] == 'grid':
columns = [ColumnDT(Menus.id, mData='id'),
ColumnDT(Menus.kode, mData='kode'),
ColumnDT(Menus.nama, mData='nama'),
ColumnDT(table_alias.nama, mData='parent'),
ColumnDT(Menus.status, mData='status'),
ColumnDT(Menus.need_login, mData='need_login'),
ColumnDT(Menus.level_id, mData='level_id'),
ColumnDT(Menus.meth, mData='meth'),
ColumnDT(Menus.valu, mData='valu'),
ColumnDT(Menus.page_typ, mData='page_typ'), ]
query = Menus.query_grid() \
.outerjoin(table_alias, Menus.parent_id == table_alias.id)
query = self.filter_company(query)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
elif url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or ''
q = Menus.query(). \
filter(Menus.status == 1,
Menus.nama.ilike('%%%s%%' % term)) \
.order_by(
Menus.nama)
return [dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama,
level_id=k.level_id) for k in q.all()]
@view_config(route_name='menu-add', renderer='templates/form.pt',
permission='menu')
def view_add(self):
return super(ViewMenus, self).view_add()
@view_config(route_name='menu-edit',
renderer='templates/form.pt', permission='menu')
def view_edit(self):
return super(ViewMenus, self).view_edit()
@view_config(route_name='menu-delete',
renderer='templates/form.pt', permission='menu')
def view_delete(self):
return super(ViewMenus, self).view_delete()
...@@ -10,8 +10,8 @@ from pyramid.view import ( ...@@ -10,8 +10,8 @@ from pyramid.view import (
view_config, view_config,
) )
from opensipkd.models import ( # from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa) # ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.models.common import ResCompany from opensipkd.models.common import ResCompany
from opensipkd.tools import Upload, img_exts from opensipkd.tools import Upload, img_exts
...@@ -230,18 +230,18 @@ class ViewPartner(BaseView): ...@@ -230,18 +230,18 @@ class ViewPartner(BaseView):
value["status"] = 'status' in value and value['status'] and 1 or 0 value["status"] = 'status' in value and value['status'] and 1 or 0
def get_bindings(self, row=None): def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list() # provinsi_list = ResProvinsi.get_list()
dati2_list = row and row.provinsi_id and ResDati2.get_list( # dati2_list = row and row.provinsi_id and ResDati2.get_list(
row.provinsi_id) or [] # row.provinsi_id) or []
kecamatan_list = row and row.dati2_id and ResKecamatan.get_list( # kecamatan_list = row and row.dati2_id and ResKecamatan.get_list(
row.dati2_id) or [] # row.dati2_id) or []
desa_list = row and row.kecamatan_id and ResDesa.get_list( # desa_list = row and row.kecamatan_id and ResDesa.get_list(
row.kecamatan_id) or [] # row.kecamatan_id) or []
return dict( return dict(
provinsi_list=provinsi_list, # provinsi_list=provinsi_list,
dati2_list=dati2_list, # dati2_list=dati2_list,
kecamatan_list=kecamatan_list, # kecamatan_list=kecamatan_list,
desa_list=desa_list, # desa_list=desa_list,
company_list=ResCompany.get_list() company_list=ResCompany.get_list()
) )
......
import colander import colander
from deform import FileData, widget from deform import FileData, widget
from opensipkd.base.views.dati2 import dati2_widget # from opensipkd.base.views.dati2 import dati2_widget
from opensipkd.base.views.desa import desa_widget # from opensipkd.base.views.desa import desa_widget
from opensipkd.base.views.kecamatan import kecamatan_widget # from opensipkd.base.views.kecamatan import kecamatan_widget
from opensipkd.base.views.provinsi import provinsi_widget # from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.tools import mem_tmp_store from opensipkd.tools import mem_tmp_store
from .. import get_urls from .. import get_urls
...@@ -71,38 +71,38 @@ class PartnerSchema(NamaSchema): ...@@ -71,38 +71,38 @@ class PartnerSchema(NamaSchema):
# validator=colander.Length(max=64), # validator=colander.Length(max=64),
# missing=colander.drop, # missing=colander.drop,
# oid="provinsi") # oid="provinsi")
provinsi_id = colander.SchemaNode( # provinsi_id = colander.SchemaNode(
colander.Integer(), # colander.Integer(),
widget=provinsi_widget, # widget=provinsi_widget,
missing=colander.drop, # missing=colander.drop,
oid="provinsi_id", # oid="provinsi_id",
slave="dati2_id", # slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=", # slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi", # title="Provinsi",
#
) # )
dati2_id = colander.SchemaNode( # dati2_id = colander.SchemaNode(
colander.Integer(), # colander.Integer(),
widget=dati2_widget, # widget=dati2_widget,
missing=colander.drop, # missing=colander.drop,
slave="kecamatan_id", # slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=", # slave_url="/kecamatan/select/act?dati2_id=",
title="Kab/Kota", # title="Kab/Kota",
oid="dati2_id") # oid="dati2_id")
kecamatan_id = colander.SchemaNode( # kecamatan_id = colander.SchemaNode(
colander.Integer(), # colander.Integer(),
missing=colander.drop, # missing=colander.drop,
widget=kecamatan_widget, # widget=kecamatan_widget,
slave="desa_id", # slave="desa_id",
slave_url="/desa/select/act?kecamatan_id=", # slave_url="/desa/select/act?kecamatan_id=",
title="Kecamatan", # title="Kecamatan",
oid="kecamatan_id") # oid="kecamatan_id")
desa_id = colander.SchemaNode( # desa_id = colander.SchemaNode(
colander.Integer(), # colander.Integer(),
widget=desa_widget, # widget=desa_widget,
missing=colander.drop, # missing=colander.drop,
title="Desa/Kelurahan", # title="Desa/Kelurahan",
oid="desa_id") # oid="desa_id")
email = colander.SchemaNode( email = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=128), validator=colander.Length(max=128),
...@@ -134,6 +134,6 @@ class PartnerSchema(NamaSchema): ...@@ -134,6 +134,6 @@ class PartnerSchema(NamaSchema):
def after_bind(self, schema, kwargs): def after_bind(self, schema, kwargs):
request = kwargs["request"] request = kwargs["request"]
prefix = get_urls(request.route_url("home")) prefix = get_urls(request.route_url("home"))
self["provinsi_id"].slave_url = f"{prefix}/dati2/select/act?provinsi_id=" # self["provinsi_id"].slave_url = f"{prefix}/dati2/select/act?provinsi_id="
self["dati2_id"].slave_url = f"{prefix}/kecamatan/select/act?dati2_id=" # self["dati2_id"].slave_url = f"{prefix}/kecamatan/select/act?dati2_id="
self["kecamatan_id"].slave_url = f"{prefix}/desa/select/act?kecamatan_id=" # self["kecamatan_id"].slave_url = f"{prefix}/desa/select/act?kecamatan_id="
...@@ -6,8 +6,7 @@ from pyramid.view import ( ...@@ -6,8 +6,7 @@ from pyramid.view import (
) )
from opensipkd.models import DBSession from opensipkd.models import DBSession
from opensipkd.models import (Partner, Departemen, from opensipkd.models import (Partner)
)
from opensipkd.tools.report import ( from opensipkd.tools.report import (
open_rml_row, open_rml_row,
open_rml_pdf, open_rml_pdf,
...@@ -57,7 +56,7 @@ class ViewRpt(BaseView): ...@@ -57,7 +56,7 @@ class ViewRpt(BaseView):
pdf, filename = open_rml_pdf(path + '/partner.rml', rows=rows, pdf, filename = open_rml_pdf(path + '/partner.rml', rows=rows,
company=request.company, company=request.company,
departement=request.departement, departement=request.departement,
alamat=Departemen.query_id(request.session['departemen_id']).first().alamat, ) )
return pdf_response(request, pdf, filename) return pdf_response(request, pdf, filename)
......
import os
from datetime import datetime
from pyramid.view import (
view_config,
)
from opensipkd.models import DBSession as PartnerDBSession
from opensipkd.models import (
Departemen,
Jabatan,
Partner,
PartnerDepartemen
)
from opensipkd.tools import (dmy)
from opensipkd.tools.report import (
open_rml_row,
open_rml_pdf,
pdf_response,
csv_response,
)
from ..views import (BaseView)
#############
# CSV & PDF #
#############
class view_rpt(BaseView):
@view_config(route_name='partner-departemen-rpt', renderer='csv')
def view_csv(self):
request = self.req
ses = request.session
params = request.params
url_dict = request.matchdict
uid = request.user.id
tgl = datetime.now().strftime('%d-%m-%Y')
if url_dict['rpt'] == 'csv':
query = query_reg(request)
row = query.first()
header = row.keys()
rows = []
for item in query.all():
rows.append(list(item))
filename = 'posisi.csv'
value = {
'header': header,
'rows': rows,
}
return csv_response(request, value, filename)
elif url_dict['rpt'] == 'pdf':
query = query_reg(request)
_here = os.path.dirname(__file__) # get current folder -> views
path = os.path.dirname(_here) # mundur 1 level
path = os.path.join(path, 'reports')
rml_row = open_rml_row(path + '/posisi.row.rml')
rows = []
for r in query.all():
s = rml_row.format(nip=r.nik, nama=r.nama, organisasi=r.departemen, jabatan=r.jabatan,
mulai=dmy(r.mulai), selesai=dmy(r.selesai))
rows.append(s)
pdf, filename = open_rml_pdf(path + '/posisi.rml', rows=rows,
company=request.company,
departement=request.session['departemen_nm'],
address=request.address,
alamat=Departemen.query_id(request.session['departemen_id']).first(),
periode='01-01-2017 s.d 31-12-2017')
return pdf_response(request, pdf, filename)
#########
# RPT #
#########
def query_reg(request):
return PartnerDBSession.query(PartnerDepartemen.id,
PartnerDepartemen.mulai,
PartnerDepartemen.selesai,
Partner.nik.label('nik'),
Partner.nama.label('nama'),
Departemen.nama.label('departemen'),
Jabatan.nama.label('jabatan'), ). \
join(Partner).join(Departemen). \
filter(PartnerDepartemen.partner_id == Partner.id,
PartnerDepartemen.departemen_id == Departemen.id,
PartnerDepartemen.jabatan_id == Jabatan.id). \
order_by(PartnerDepartemen.id)
def query_id(request):
return PartnerDBSession.query(PartnerDepartemen).filter_by(id=request.matchdict['id'])
import colander
from deform import (widget, )
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from . import widget_os
from opensipkd.models import DBSession, ResProvinsi, kategori_provinsi
from ..views import BaseView
_ = TranslationStringFactory("opensipkd")
SESS_ADD_FAILED = 'Tambah provinsi gagal'
SESS_EDIT_FAILED = 'Edit provinsi gagal'
@colander.deferred
def provinsi_widget(node, kw):
values = kw.get('provinsi_list', [])
url = node and hasattr(node, 'slave_url') and node.slave_url or ""
slave = node and hasattr(node, 'slave') and node.slave or ""
values.insert(0, ("", "Pilih Propinsi..."))
readonly = kw.get("readonly", False)
return widget_os.Select2MsWidget(values=values,
readonly=readonly,
url=url,
slave=slave,
placeholder="Pilih Provinsi")
class AddSchema(colander.Schema):
kode = colander.SchemaNode(colander.String(),
oid="kode",
validator=colander.Length(max=32), )
kategori = colander.SchemaNode(colander.String(),
widget=widget.SelectWidget(values=kategori_provinsi),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
ibu_kota = colander.SchemaNode(colander.String(), oid="nama", missing=colander.drop)
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True),
visible=False)
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.Integer(),
title=_("action", default="Action"))
kode = colander.SchemaNode(colander.String(), width=100)
nama = colander.SchemaNode(colander.String())
ibu_kota=colander.SchemaNode(colander.String())
class ViewProvinsi(BaseView):
def __init__(self, request):
super(ViewProvinsi, self).__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_route = 'provinsi'
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = ResProvinsi
########
# List #
########
def form_validator(self, form, value):
def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama))
def err_nama():
raise colander.Invalid(form,
'Uraian %s sudah digunakan oleh kode %s' % (
value['nama'], found.kode))
if 'id' in form.request.matchdict:
uid = form.request.matchdict['id']
q = DBSession.query(ResProvinsi).filter_by(id=uid)
row = q.first()
else:
row = None
q = ResProvinsi.query_kode(value['kode'])
found = q.first()
if row:
if found and found.id != row.id:
err_kode()
elif found:
err_kode()
found = ResProvinsi.query_nama(value['nama']).first()
if found:
if found and found.id != row.id:
err_nama()
elif found:
err_nama()
@view_config(route_name='provinsi-view',
renderer='templates/form.pt', permission='provinsi')
def view_view(self): # row = query_id(request).first()
return super(ViewProvinsi, self).view_view()
@view_config(route_name='provinsi',
renderer='templates/table.pt',
permission='provinsi')
def view_list(self):
return super(ViewProvinsi, self).view_list()
@view_config(route_name='provinsi-act', renderer='json',
permission='view')
def view_act(self):
return super(ViewProvinsi, self).view_act()
@view_config(route_name='provinsi-add',
renderer='templates/form.pt', permission='provinsi')
def view_add(self):
return super(ViewProvinsi, self).view_add()
@view_config(route_name='provinsi-edit',
renderer='templates/form.pt', permission='provinsi')
def view_edt(self):
return super(ViewProvinsi, self).view_edit()
@view_config(route_name='provinsi-delete',
renderer='templates/form.pt', permission='provinsi')
def view_delete(self):
return super(ViewProvinsi, self).view_delete()
from pyramid_rpc.jsonrpc import jsonrpc_method # from pyramid_rpc.jsonrpc import jsonrpc_method
#
from opensipkd.models import Menus # from opensipkd.models import Menus
#
#
@jsonrpc_method(method='get_menu', endpoint='rpc') # @jsonrpc_method(method='get_menu', endpoint='rpc')
def get_menu(request, data): # def get_menu(request, data):
""" # """
Digunakan untuk login pada aplikasi lain # Digunakan untuk login pada aplikasi lain
:param request: # :param request:
:param data: # :param data:
{ # {
"user_name": "user_name", # "user_name": "user_name",
"password": "password" # "password": "password"
} # }
:return: # :return:
result: "data": # result: "data":
{ # {
"user_name": "user_name", # "user_name": "user_name",
"nik": nik, # "nik": nik,
"nama": nik, # "nama": nik,
"group": [group], # "group": [group],
"departemens": [departemen] # "departemens": [departemen]
} # }
error:"error":{} # error:"error":{}
""" # """
is_list = type(data) is list # is_list = type(data) is list
data = is_list and data[0] or data # data = is_list and data[0] or data
level_id = data.get("level") # level_id = data.get("level")
group = data.get("group") # group = data.get("group")
qry = Menus.query() # qry = Menus.query()
if level_id: # if level_id:
qry = qry.filter(Menus.level_id == level_id or Menus.level_id == None) # qry = qry.filter(Menus.level_id == level_id or Menus.level_id == None)
if group: # if group:
grp = Menus.query().filter(kode=group).first() # grp = Menus.query().filter(kode=group).first()
if grp: # if grp:
qry = qry.filter( # qry = qry.filter(
Menus.parent_id == grp.id or Menus.parent_id == None) # Menus.parent_id == grp.id or Menus.parent_id == None)
if request.user: # if request.user:
qry = qry.filter_by(need_login=True) # qry = qry.filter_by(need_login=True)
else: # else:
qry = qry.filter_by(need_login=False) # qry = qry.filter_by(need_login=False)
resp = [ # resp = [
{ # {
"type": "link", # "type": "link",
"label": row.nama, # "label": row.nama,
"className": row.class_name, # "className": row.class_name,
"name": row.kode, # "name": row.kode,
"id": row.kode, # "id": row.kode,
"url": row.url, # "url": row.url,
"icon": row.icon # "icon": row.icon
} # }
for row in qry.all()] # for row in qry.all()]
#
result = is_list and [resp] or resp # result = is_list and [resp] or resp
return result # return result
# from datetime import datetime
#
# import colander
# from deform import (
# Form,
# widget,
# ValidationFailure,
# )
# from pyramid.httpexceptions import (
# HTTPFound,
# )
# from pyramid.view import (
# view_config,
# )
# from sqlalchemy.orm import aliased
#
# from opensipkd.models import DBSession
# from opensipkd.models import DepartemenUser, User, Departemen
# from ..views import ColumnDT, DataTables, BaseView
#
# SESS_ADD_FAILED = 'Tambah departemen gagal'
# SESS_EDIT_FAILED = 'Edit departemen gagal'
#
#
# class AddSchema(colander.Schema):
# departemen_id = colander.SchemaNode(
# colander.Integer(),
# widget=widget.HiddenWidget(),
# oid="departemen_id",
# title="Departemen")
#
# departemen_nm = colander.SchemaNode(
# colander.String(),
# oid="departemen_nm",
# title="Departemen")
#
# user_id = colander.SchemaNode(
# colander.Integer(),
# widget=widget.HiddenWidget(),
# oid="user_id",
# title="User")
#
# user_nm = colander.SchemaNode(
# colander.String(),
# oid="user_nm",
# title="User")
#
# sub_departemen = colander.SchemaNode(
# colander.Boolean(),
# widget=widget.CheckboxWidget(),
# oid="sub_departemen",
# title="Allow Sub")
#
#
# class EditSchema(AddSchema):
# id = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# widget=widget.HiddenWidget(readonly=True))
#
#
# class ViewDepartemenUser(BaseView):
# ########
# # List #
# ########
# @view_config(route_name='departemen-user', renderer='templates/departemen_user/list.pt',
# permission='departemen')
# def view_list(self):
# return dict(a={})
#
# ##########
# # Action #
# ##########
# @view_config(route_name='departemen-user-act', renderer='json',
# permission='departemen')
# def view_act(self):
# request = self.req
# ses = request.session
# params = request.params
# url_dict = request.matchdict
# dep_alias = aliased(DepartemenUser)
# if url_dict['act'] == 'grid':
# columns = [
# ColumnDT(DepartemenUser.id, mData='id'),
# ColumnDT(User.user_name, mData='user_name'),
# ColumnDT(Departemen.nama, mData='dept_name'),
# ColumnDT(DepartemenUser.sub_departemen, mData='allow_sub'),
# ]
# query = DBSession.query().select_from(DepartemenUser) \
# .join(User, User.id == DepartemenUser.user_id) \
# .join(Departemen, DepartemenUser.departemen_id == Departemen.id)
#
# rowTable = DataTables(request.GET, query, columns)
# return rowTable.output_result()
#
# @view_config(route_name='departemen-user-add', renderer='templates/departemen_user/add.pt',
# permission='departemen')
# def view_departemen_add(self):
# request = self.req
# ses = request.session
# params = request.params
# url_dict = request.matchdict
# 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:
# return dict(form=e.render())
# save_request(request, dict(controls))
# return route_list(request)
# return dict(form=form.render())
#
# ########
# # Edit #
# ########
# @view_config(route_name='departemen-user-edt', renderer='templates/departemen_user/add.pt',
# permission='departemen')
# def view_departemen_edt(self):
# request = self.req
# ses = request.session
# params = request.params
# url_dict = request.matchdict
# row = query_id(request).first()
# if not row:
# return id_not_found(request)
#
# form = get_form(request, EditSchema)
# if request.POST:
# if 'simpan' in request.POST:
# controls = request.POST.items()
# try:
# controls = form.validate(controls)
# except ValidationFailure as e:
# return dict(form=e.render())
#
# save_request(request, dict(controls), row)
# return route_list(request)
#
# values = row.to_dict()
# values['departemen_nm'] = row.departemen.nama + ';' + row.departemen.kode
# values['user_nm'] = row.user.user_name + '(' + row.user.email + ')'
# form = form.render(appstruct=values)
# return dict(form=form)
#
# ##########
# # Delete #
# ##########
# @view_config(route_name='departemen-user-del',
# renderer='templates/departemen_user/del.pt',
# permission='departemen')
# def view_delete(self):
# request = self.req
# q = query_id(request)
# row = q.first()
#
# if not row:
# return id_not_found(request)
# form = Form(colander.Schema(), buttons=('hapus', 'batal'))
# if request.POST:
# if 'hapus' in request.POST:
# msg = 'Departemen User ID %d departemen %s sudah dihapus.' % (row.id, row.departemen.nama)
# q.delete()
# DBSession.flush()
# request.session.flash(msg)
# return route_list(request)
# return dict(row=row, form=form.render())
#
#
# #######
# # Add #
# #######
# def form_validator(form, value):
# def err_kode():
# raise colander.Invalid(form,
# 'Kode %s sudah digunakan oleh %s' % (
# value['kode'], found.nama))
#
# def err_nama():
# raise colander.Invalid(form,
# 'Uraian %s sudah digunakan oleh kode %s' % (
# value['nama'], found.kode))
#
# # if 'id' in form.request.matchdict:
# # uid = form.request.matchdict['id']
# # q = DBSession.query(DepartemenUser).filter_by(id=uid)
# # urusan = q.first()
# # else:
# # urusan = None
# #
# # q = DepartemenUser.query_kode(value['kode']) # DBSession.query().filter_by(kode=value['kode'])
# # found = q.first()
# # if urusan:
# # if found and found.id != urusan.id:
# # err_kode()
# # elif found:
# # err_kode()
# #
# # found = DepartemenUser.query_nama(value['nama']).first()
# # if urusan:
# # if found and found.id != urusan.id:
# # err_nama()
# # elif found:
# # err_nama()
#
#
# 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 update_children(children):
# for child in children:
# child.level_id = child.parent.level_id + 1
# DBSession.add(child)
# DBSession.flush()
# if child.children:
# update_children(child.children)
#
#
# def save(values, user, row=None):
# if not row:
# row = DepartemenUser()
# row.created = datetime.now()
# row.create_uid = user.id
# else:
# row.updated = datetime.now()
# row.update_uid = user.id
#
# row.from_dict(values)
# row.sub_departemen = 'sub_departemen' in values and values['sub_departemen'] and 1 or 0
# DBSession.add(row)
# DBSession.flush()
# return row
#
#
# 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("Departemen User {nama} sudah disimpan.".format(nama=row.departemen.nama))
#
#
# def route_list(request):
# return HTTPFound(location=request.route_url('departemen-user'))
#
#
# def query_id(request):
# return DBSession.query(DepartemenUser).filter_by(id=request.matchdict['id'])
#
#
# def id_not_found(request):
# msg = 'DepartemenUser ID %s Tidak Ditemukan.' % request.matchdict['id']
# request.session.flash(msg, 'error')
# return route_list(request)
...@@ -25,9 +25,7 @@ from datetime import timedelta, datetime ...@@ -25,9 +25,7 @@ from datetime import timedelta, datetime
from importlib import import_module from importlib import import_module
import colander import colander
import requests
from deform import widget, Form, ValidationFailure, Button from deform import widget, Form, ValidationFailure, Button
from icecream import ic
from pyramid.httpexceptions import HTTPFound, HTTPNotFound from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.renderers import render_to_response from pyramid.renderers import render_to_response
from pyramid.security import remember, forget from pyramid.security import remember, forget
......
...@@ -18,8 +18,8 @@ from .user import EmailValidator as EmailValidatorBase ...@@ -18,8 +18,8 @@ from .user import EmailValidator as EmailValidatorBase
from .user_group import save as save_groups from .user_group import save as save_groups
from .user_login import (ChangePassword, change_password_validator, from .user_login import (ChangePassword, change_password_validator,
regenerate_security_code, send_email_security_code) regenerate_security_code, send_email_security_code)
from opensipkd.models import DBSession, UserService, Departemen from opensipkd.models import (
from opensipkd.models import (User, Partner, Group, UserGroup, PartnerDepartemen) DBSession, UserService, User, Partner, Group, UserGroup)
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
...@@ -65,18 +65,18 @@ def login_(request, data): ...@@ -65,18 +65,18 @@ def login_(request, data):
now = datetime.now() now = datetime.now()
partner = Partner.query().filter_by(email=user.email).first() partner = Partner.query().filter_by(email=user.email).first()
departemen = None departemen = None
if partner: # if partner:
partner_dep = Departemen.query() \ # partner_dep = Departemen.query() \
.join(PartnerDepartemen, # .join(PartnerDepartemen,
Departemen.id == PartnerDepartemen.departemen_id) \ # Departemen.id == PartnerDepartemen.departemen_id) \
.join(Partner, Partner.id == PartnerDepartemen.partner_id) \ # .join(Partner, Partner.id == PartnerDepartemen.partner_id) \
.filter(Partner.email == user.email, # .filter(Partner.email == user.email,
PartnerDepartemen.mulai <= now, # PartnerDepartemen.mulai <= now,
PartnerDepartemen.selesai >= now).first() # PartnerDepartemen.selesai >= now).first()
if partner_dep: # if partner_dep:
departemen = dict(id=partner_dep.id, # departemen = dict(id=partner_dep.id,
kode=partner_dep.kode, # kode=partner_dep.kode,
nama=partner_dep.nama) # nama=partner_dep.nama)
return dict(id=user.id, return dict(id=user.id,
user_name=user.user_name, user_name=user.user_name,
......
import json import json
import logging import logging
from colander import SchemaNode, null, Mapping, Invalid, string_types from colander import SchemaNode, null, Mapping, Invalid
# , string_types
from deform.widget import Widget, _StrippedString, Select2Widget, default_resources, \ from deform.widget import Widget, _StrippedString, Select2Widget, default_resources, \
ResourceRegistry, default_resource_registry ResourceRegistry, default_resource_registry
from iso8601.iso8601 import ISO8601_REGEX from iso8601.iso8601 import ISO8601_REGEX
...@@ -280,7 +281,7 @@ class CaptchaWidget(Widget): ...@@ -280,7 +281,7 @@ class CaptchaWidget(Widget):
def deserialize(self, field, pstruct): def deserialize(self, field, pstruct):
if pstruct is null: if pstruct is null:
return null return null
elif not isinstance(pstruct, string_types): elif not isinstance(pstruct, str): #string_types
raise Invalid(field.schema, "Pstruct is not a string") raise Invalid(field.schema, "Pstruct is not a string")
if self.strip: if self.strip:
pstruct = pstruct.strip() pstruct = pstruct.strip()
......
...@@ -4,7 +4,7 @@ import logging ...@@ -4,7 +4,7 @@ import logging
from datetime import datetime from datetime import datetime
import colander import colander
from icecream import ic # from icecream import ic
from pyramid.httpexceptions import HTTPForbidden from pyramid.httpexceptions import HTTPForbidden
from pyramid.httpexceptions import HTTPNotFound from pyramid.httpexceptions import HTTPNotFound
from pyramid.renderers import null_renderer, render, JSON from pyramid.renderers import null_renderer, render, JSON
...@@ -116,7 +116,7 @@ def make_error_response(request, error, id=None): ...@@ -116,7 +116,7 @@ def make_error_response(request, error, id=None):
'id': id, 'id': id,
'error': error.as_dict(), 'error': error.as_dict(),
} }
ic(out) # ic(out)
body = render(renderer, out, request=request).encode('utf-8') body = render(renderer, out, request=request).encode('utf-8')
response = Response(body, charset='utf-8') response = Response(body, charset='utf-8')
......
from .base import * from .base import *
from .common import * from .common import *
from .users import * from .users import *
from .menus import * # from .menus import *
from .partner import * from .partner import *
from .departemen import *
from .pegawai import *
from .wilayah import *
\ No newline at end of file \ No newline at end of file
# from .departemen import *
# from .pegawai import *
# from .wilayah import *
\ No newline at end of file \ No newline at end of file
from sqlalchemy import (
Column,
Integer,
ForeignKey,
String,
SmallInteger,
)
from sqlalchemy.orm import (
relationship,
backref
)
from ..models import DBSession, Base
from ..models import (NamaModel,
TABLE_ARGS)
class Departemen(Base, NamaModel):
__tablename__ = 'departemen'
__table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('public.departemen.id'))
kategori = Column(String(32))
alamat = Column(String(255))
singkat = Column(String(32))
level_id = Column(SmallInteger)
children = relationship(
"Departemen", backref=backref('parent', remote_side=[id]))
company_id = Column(Integer)
def get_parents(self, start=False):
allparents = []
if start:
allparents.append(self.nama)
p = self.parent
while p:
allparents.append(p.nama)
p = p.parent
return allparents
@property
def parents(self, start=False):
return self.get_parents()
@property
def name_get(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@property
def uraian_all(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
# class DepartemenUser(Base, DefaultModel):
# __tablename__ = 'departemen_user'
# user_id = Column(Integer, ForeignKey(User.id), unique=True)
# departemen_id = Column(Integer, ForeignKey(Departemen.id))
# sub_departemen = Column(SmallInteger, nullable=True)
# departemen = relationship("Departemen", backref="user_departemen")
# user = relationship("User", backref="user_departemen")
# __table_args__ = TABLE_ARGS
#
# @classmethod
# def query_user_id(cls, user_id):
# return DBSession.query(cls).filter_by(user_id=user_id)
#
# @classmethod
# def get_kode(cls, user_id):
# row = cls.query_user_id(user_id).first()
# return row and row.departemen.kode or None
#
# @classmethod
# def ids(cls, user_id):
# r = ()
# departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# ).join(Departemen).filter(cls.departemen_id == Departemen.id,
# cls.user_id == user_id).all()
# for departemen in departemens:
# if departemen.sub_departemen:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
# else:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
# for i in range(len(rows)):
# r = r + (rows[i])
# return r
#
# @classmethod
# def departemen_granted(cls, user_id, departemen_id):
# departemens = DBSession.query(cls.departemen_id, cls.sub_departemen, Departemen.kode
# ).join(Departemen).filter(cls.departemen_id == Departemen.id,
# cls.user_id == user_id).all()
# for departemen in departemens:
# if departemen.sub_departemen:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode.ilike('%s%%' % departemen.kode)).all()
# else:
# rows = DBSession.query(Departemen.id).filter(Departemen.kode == departemen.kode).all()
# for i in range(len(rows)):
# if int(rows[i][0]) == int(departemen_id):
# return True
# return False
#
# @classmethod
# def get_filtered(cls, request):
# filter = "'%s' LIKE public.departemens.kode||'%%'" % request.session['departemen_kd']
# q1 = DBSession.query(Departemen.kode, UserDepartemen.sub_departemen).join(UserDepartemen). \
# filter(UserDepartemen.user_id == request.user.id,
# UserDepartemen.departemen_id == Departemen.id,
# text(filter))
# return q1.first()
from sqlalchemy import (
Column,
Integer,
ForeignKey,
String,
SmallInteger, Boolean,
)
from sqlalchemy.orm import (
relationship,
backref
)
from ..models import DBSession, Base
from ..models import (NamaModel,
TABLE_ARGS)
class Menus(Base, NamaModel):
__tablename__ = 'menus'
__table_args__ = (TABLE_ARGS,)
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('public.menus.id'))
level_id = Column(SmallInteger)
order_id = Column(SmallInteger)
valu = Column(String(256)) # value/action
meth = Column(String(256)) # new method
page_typ = Column(String(256)) # PageType
url = Column(String(256))
icon = Column(String(256))
css_class = Column(String(256))
need_login = Column(SmallInteger, server_default="1")
permissions = Column(String(128), server_default="")
title = Column(String(256))
children = relationship(
"Menus", backref=backref('parent', remote_side=[id]))
def get_parents(self, start=False):
allparents = []
if start:
allparents.append(self.nama)
p = self.parent
while p:
allparents.append(p.nama)
p = p.parent
return allparents
@property
def parents(self, start=False):
return self.get_parents()
@property
def name_get(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@property
def uraian_all(self):
allparents = self.get_parents(True)
return '/'.join(reversed(allparents))
@classmethod
def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all()
@classmethod
def query_grid(cls):
return DBSession.query().select_from(cls)
@classmethod
def get(cls, parent=None):
if not parent:
return cls.query().filter(cls.parent_id == None)
else:
row = cls.query().filter(cls.kode == parent).first()
if row:
return cls.query().filter(cls.parent_id == row.id)
...@@ -7,7 +7,7 @@ from sqlalchemy import ( ...@@ -7,7 +7,7 @@ from sqlalchemy import (
) )
from .common import NamaModel from .common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2 # from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from .meta import (Base) from .meta import (Base)
from sqlalchemy.orm import relationship, backref from sqlalchemy.orm import relationship, backref
...@@ -62,20 +62,20 @@ class Partner(Base, PartnerModel): ...@@ -62,20 +62,20 @@ class Partner(Base, PartnerModel):
perkawinan = Column(String(2)) perkawinan = Column(String(2))
pekerjaan = Column(String(32)) pekerjaan = Column(String(32))
kewarganegaraan = Column(String(10)) kewarganegaraan = Column(String(10))
provinsi_id = Column(Integer, ForeignKey(ResProvinsi.id)) # provinsi_id = Column(Integer, ForeignKey(ResProvinsi.id))
dati2_id = Column(Integer, ForeignKey(ResDati2.id)) # dati2_id = Column(Integer, ForeignKey(ResDati2.id))
kecamatan_id = Column(Integer, ForeignKey(ResKecamatan.id)) # kecamatan_id = Column(Integer, ForeignKey(ResKecamatan.id))
desa_id = Column(Integer, ForeignKey(ResDesa.id)) # desa_id = Column(Integer, ForeignKey(ResDesa.id))
company_id = Column(Integer) company_id = Column(Integer)
nip = Column(String(32)) nip = Column(String(32))
res_provinsi = relationship( # res_provinsi = relationship(
"ResProvinsi", backref=backref('partner')) # "ResProvinsi", backref=backref('partner'))
res_dati2 = relationship( # res_dati2 = relationship(
"ResDati2", backref=backref('partner')) # "ResDati2", backref=backref('partner'))
res_kecamatan = relationship( # res_kecamatan = relationship(
"ResKecamatan", backref=backref('partner')) # "ResKecamatan", backref=backref('partner'))
res_desa = relationship( # res_desa = relationship(
"ResDesa", backref=backref('partner')) # "ResDesa", backref=backref('partner'))
# npwp = Column(String(16)) # npwp = Column(String(16))
# npwpd = Column(String(16)) # npwpd = Column(String(16))
......
from sqlalchemy import (
Column,
Integer,
BigInteger,
DateTime,
ForeignKey,
UniqueConstraint,
String,
SmallInteger, func
)
from sqlalchemy.orm import (
relationship,
backref
)
from opensipkd.models import Partner
from ..models import DBSession, Base
from ..models import (DefaultModel, NamaModel, TABLE_ARGS,
User, Departemen)
class Eselon(Base, NamaModel):
__tablename__ = 'eselon'
pangkat = Column(String(32))
ruang = Column(String(1))
tunjangan = Column(BigInteger)
__table_args__ = TABLE_ARGS
def __init__(self):
pass
class Jabatan(Base, NamaModel):
__tablename__ = 'jabatan'
jenis = Column(SmallInteger)
nama_lain = Column(String(128))
nama_pendek = Column(String(128))
eselon_id = Column(SmallInteger, ForeignKey(Eselon.id))
__table_args__ = TABLE_ARGS
def __init__(self):
pass
# class Pangkat(Base, NamaModel):
# __tablename__ = 'pangkat'
# pangkat = Column(String(32))
# ruang = Column(String(1))
# __table_args__ = TABLE_ARGS
#
# def __init__(self):
# pass
class PartnerDepartemen(Base, DefaultModel):
__tablename__ = 'partner_departemen'
partner_id = Column(Integer, ForeignKey(Partner.id))
departemen_id = Column(Integer, ForeignKey(Departemen.id))
# fungsional_id = Column(Integer, ForeignKey(Jabatan.id))
jabatan_id = Column(SmallInteger, ForeignKey(Jabatan.id))
mulai = Column(DateTime(timezone=False))
selesai = Column(DateTime(timezone=False))
partner = relationship(Partner, backref=backref("partner_departemen"))
departemen = relationship(Departemen, foreign_keys=[departemen_id], backref=backref("partner_departemen"))
# fungsional = relationship(Jabatan, foreign_keys=[fungsional_id], backref=backref("partner_funsional"), )
jabatan = relationship(Jabatan, foreign_keys=[jabatan_id], backref=backref("partner_jabatan", ))
__table_args__ = (UniqueConstraint('partner_id', 'departemen_id', 'jabatan_id',
'mulai', name='partner_dept_uq'),
TABLE_ARGS)
@classmethod
def query_jabatan(cls, partner_id, tanggal):
query = DBSession.query(cls). \
filter(cls.partner_id == partner_id,
tanggal >= cls.mulai,
tanggal <= cls.selesai)
return query
# class PartnerPangkat(Base, DefaultModel):
# __tablename__ = 'partner_pangkat'
# partner_id = Column(Integer, ForeignKey(Partner.id))
# pangkat_id = Column(Integer, ForeignKey(Pangkat.id))
# tmt = Column(DateTime(timezone=False))
# partner = relationship(Partner, backref=backref("partner_pangkat"))
# pangkat = relationship(Pangkat, backref=backref("partner_pangkat"))
# __table_args__ = (UniqueConstraint('partner_id', 'pangkat_id'),
# TABLE_ARGS)
# @classmethod
# def query_pangkat(cls, partner_id, tanggal):
# tmt = DBSession.query(func.max(cls.tmt)). \
# filter(
# cls.partner_id == partner_id,
# cls.tmt <= tanggal).first()
# return DBSession.query(cls). \
# filter(cls.partner_id == partner_id,
# cls.tmt <= tmt)
#
# class PartnerLogin(Base):
# __tablename__ = 'partner_login'
# partner_id = Column(Integer, ForeignKey(Partner.id), unique=True)
# user_id = Column(Integer, ForeignKey(User.id), primary_key=True, ) # ,
# partner = relationship(Partner, backref=backref('partner_login'))
# users = relationship(User, backref=backref('partner_login'))
# __table_args__ = TABLE_ARGS
#
# @classmethod
# def query_user(cls, user_id):
# return DBSession.query(cls).filter_by(user_id=user_id)
from datetime import datetime
from sqlalchemy import (
Column,
Integer,
BigInteger,
UniqueConstraint,
String,
func,
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.exc import NoResultFound
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
relationship,
backref
)
from ..models import NamaModel, Base, DBSession
class Targets(Base, NamaModel):
__tablename__ = 'targets'
__table_args__ = {'extend_existing': True}
tahun = Column(Integer, nullable=False)
jenis = Column(Integer, nullable=False)
m01 = Column(BigInteger, nullable=False)
m02 = Column(BigInteger, nullable=False)
m03 = Column(BigInteger, nullable=False)
m04 = Column(BigInteger, nullable=False)
m05 = Column(BigInteger, nullable=False)
m06 = Column(BigInteger, nullable=False)
m07 = Column(BigInteger, nullable=False)
m08 = Column(BigInteger, nullable=False)
m09 = Column(BigInteger, nullable=False)
m10 = Column(BigInteger, nullable=False)
m11 = Column(BigInteger, nullable=False)
m12 = Column(BigInteger, nullable=False)
@classmethod
def query_jenis_sum(cls, tahun, jenis):
return DBSession.query(cls.tahun, cls.jenis,
func.sum(cls.m01).label('m01'), func.sum(cls.m02).label('m02'),
func.sum(cls.m03).label('m03'), func.sum(cls.m04).label('m04'),
func.sum(cls.m05).label('m05'), func.sum(cls.m06).label('m06'),
func.sum(cls.m06).label('m07'), func.sum(cls.m08).label('m08'),
func.sum(cls.m09).label('m09'), func.sum(cls.m10).label('m10'),
func.sum(cls.m11).label('m11'), func.sum(cls.m12).label('m12'),
). \
group_by(cls.tahun, cls.jenis, ). \
filter(cls.tahun == tahun, cls.jenis == jenis)
class TargetJenis(Base, NamaModel):
__tablename__ = 'target_jenis'
__table_args__ = {'extend_existing': True}
from sqlalchemy.orm import relationship, backref
from opensipkd.models import TABLE_ARGS
from sqlalchemy import (
Column,
ForeignKey,
String,
SmallInteger,
)
from .meta import Base
from .common import (NamaModel)
kategori_provinsi = (
("provinsi", "Provinsi"),
("provinsi administratif", "Provinsi Administratif"),
)
class ResProvinsi(Base, NamaModel):
__tablename__ = 'res_provinsi'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
ibu_kota = Column(String(64))
kategori_dati2 = (
("kota", "Kota"),
("kabupaten", "Kabupaten"),
("kota administratif", "Kota Administratif"),
("kabupaten administratif", "Kabupaten Administratif"),
)
class ResDati2(Base, NamaModel):
__tablename__ = 'res_dati2'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
ibu_kota = Column(String(64))
provinsi_id = Column(SmallInteger, ForeignKey(ResProvinsi.id))
provinsi = relationship(ResProvinsi, backref=backref("dati2"))
@classmethod
def get_list(cls, provinsi_id):
qry = cls.query_list()
if provinsi_id:
qry = qry.filter(cls.provinsi_id == provinsi_id)
return qry.all()
class ResKecamatan(Base, NamaModel):
__tablename__ = 'res_kecamatan'
__table_args__ = (TABLE_ARGS,)
ibu_kota = Column(String(64))
dati2_id = Column(SmallInteger, ForeignKey(ResDati2.id))
dati2 = relationship(ResDati2, backref=backref("kecamatan"))
@classmethod
def get_list(cls, dati2_id=None):
qry = cls.query_list()
if dati2_id:
qry = qry.filter(cls.dati2_id == dati2_id)
return qry.all()
kategori_desa = (
("desa", "Desa"),
("kelurahan", "Kelurahan")
)
class ResDesa(Base, NamaModel):
__tablename__ = 'res_desa'
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
kecamatan_id = Column(SmallInteger, ForeignKey(ResKecamatan.id))
kecamatan = relationship(ResKecamatan, backref=backref("desa"))
@classmethod
def get_list(cls, kecamatan_id):
qry = cls.query_list()
if kecamatan_id:
qry = qry.filter(cls.kecamatan_id == kecamatan_id)
return qry.all()
...@@ -20,21 +20,21 @@ requires = [ ...@@ -20,21 +20,21 @@ requires = [
'pyramid_mailer', 'pyramid_mailer',
'ziggurat-foundations', 'ziggurat-foundations',
'zope.sqlalchemy', 'zope.sqlalchemy',
'pytz', # 'pytz',
'deform >= 2.0a2', 'deform >= 2.0a2',
'psycopg2-binary', 'psycopg2-binary',
'pyramid_chameleon', 'pyramid_chameleon',
'pyramid_rpc', 'pyramid_rpc',
'requests', # 'requests',
'sqlalchemy-datatables', 'sqlalchemy-datatables',
'py3o.template', # 'py3o.template',
'wheezy.captcha', 'wheezy.captcha',
'icecream', # 'icecream',
'google-api-python-client', 'google-api-python-client',
'google', 'google',
'pyjwt', # 'pyjwt',
'z3c.rml', # 'z3c.rml',
'opensipkd-tools @git+https://git.opensipkd.com/aa.gusti/opensipkd-tools.git', # 'opensipkd-tools @git+https://git.opensipkd.com/aa.gusti/opensipkd-tools.git',
] ]
dev_requires = [ dev_requires = [
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!