Commit 413488dc by aagusti

perbaikan init

1 parent 3e68055a
# Basis Aplikasi openSIPKD
# Basis Aplikasi openSIPKD Minimalis
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, )
from opensipkd.models.handlers import LogDBSession
from opensipkd.models import (
init_model, DBSession, Base, Group, UserGroup, Permission, GroupPermission,
User, Route, Eselon, Jabatan, ResProvinsi, ResDati2, ResKecamatan, ResDesa,
Menus)
User, Route)
from sqlalchemy.dialects import oracle
from sqlalchemy import text
......@@ -309,13 +308,4 @@ def main(argv=sys.argv):
append_csv(GroupPermission, 'group_permission.csv',
['group_id', 'perm_name'])
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()
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,
btn_view, btn_add, btn_edit, btn_csv, \
btn_pdf
from opensipkd.models import User, Menus
from opensipkd.models import User
from ..scripts.initializedb import append_csv
from ..tools.api import auth_from_rpc
......
......@@ -2,9 +2,9 @@ import colander
from deform import (widget, )
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 opensipkd.models import DBSession, ResCompany, ResKecamatan, Partner
from opensipkd.models import DBSession, ResCompany, Partner
from ..views import BaseView
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 (
view_config,
)
from opensipkd.models import (
ResProvinsi, ResDati2, ResKecamatan, ResDesa)
# from opensipkd.models import (
# ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.models.common import ResCompany
from opensipkd.tools import Upload, img_exts
......@@ -230,18 +230,18 @@ class ViewPartner(BaseView):
value["status"] = 'status' in value and value['status'] and 1 or 0
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list()
dati2_list = row and row.provinsi_id and ResDati2.get_list(
row.provinsi_id) or []
kecamatan_list = row and row.dati2_id and ResKecamatan.get_list(
row.dati2_id) or []
desa_list = row and row.kecamatan_id and ResDesa.get_list(
row.kecamatan_id) or []
# provinsi_list = ResProvinsi.get_list()
# dati2_list = row and row.provinsi_id and ResDati2.get_list(
# row.provinsi_id) or []
# kecamatan_list = row and row.dati2_id and ResKecamatan.get_list(
# row.dati2_id) or []
# desa_list = row and row.kecamatan_id and ResDesa.get_list(
# row.kecamatan_id) or []
return dict(
provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
desa_list=desa_list,
# provinsi_list=provinsi_list,
# dati2_list=dati2_list,
# kecamatan_list=kecamatan_list,
# desa_list=desa_list,
company_list=ResCompany.get_list()
)
......
import colander
from deform import FileData, widget
from opensipkd.base.views.dati2 import dati2_widget
from opensipkd.base.views.desa import desa_widget
from opensipkd.base.views.kecamatan import kecamatan_widget
from opensipkd.base.views.provinsi import provinsi_widget
# from opensipkd.base.views.dati2 import dati2_widget
# from opensipkd.base.views.desa import desa_widget
# from opensipkd.base.views.kecamatan import kecamatan_widget
# from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.tools import mem_tmp_store
from .. import get_urls
......@@ -71,38 +71,38 @@ class PartnerSchema(NamaSchema):
# validator=colander.Length(max=64),
# missing=colander.drop,
# oid="provinsi")
provinsi_id = colander.SchemaNode(
colander.Integer(),
widget=provinsi_widget,
missing=colander.drop,
oid="provinsi_id",
slave="dati2_id",
slave_url="/dati2/select/act?provinsi_id=",
title="Provinsi",
)
dati2_id = colander.SchemaNode(
colander.Integer(),
widget=dati2_widget,
missing=colander.drop,
slave="kecamatan_id",
slave_url="/kecamatan/select/act?dati2_id=",
title="Kab/Kota",
oid="dati2_id")
kecamatan_id = colander.SchemaNode(
colander.Integer(),
missing=colander.drop,
widget=kecamatan_widget,
slave="desa_id",
slave_url="/desa/select/act?kecamatan_id=",
title="Kecamatan",
oid="kecamatan_id")
desa_id = colander.SchemaNode(
colander.Integer(),
widget=desa_widget,
missing=colander.drop,
title="Desa/Kelurahan",
oid="desa_id")
# provinsi_id = colander.SchemaNode(
# colander.Integer(),
# widget=provinsi_widget,
# missing=colander.drop,
# oid="provinsi_id",
# slave="dati2_id",
# slave_url="/dati2/select/act?provinsi_id=",
# title="Provinsi",
#
# )
# dati2_id = colander.SchemaNode(
# colander.Integer(),
# widget=dati2_widget,
# missing=colander.drop,
# slave="kecamatan_id",
# slave_url="/kecamatan/select/act?dati2_id=",
# title="Kab/Kota",
# oid="dati2_id")
# kecamatan_id = colander.SchemaNode(
# colander.Integer(),
# missing=colander.drop,
# widget=kecamatan_widget,
# slave="desa_id",
# slave_url="/desa/select/act?kecamatan_id=",
# title="Kecamatan",
# oid="kecamatan_id")
# desa_id = colander.SchemaNode(
# colander.Integer(),
# widget=desa_widget,
# missing=colander.drop,
# title="Desa/Kelurahan",
# oid="desa_id")
email = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=128),
......@@ -134,6 +134,6 @@ class PartnerSchema(NamaSchema):
def after_bind(self, schema, kwargs):
request = kwargs["request"]
prefix = get_urls(request.route_url("home"))
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["kecamatan_id"].slave_url = f"{prefix}/desa/select/act?kecamatan_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["kecamatan_id"].slave_url = f"{prefix}/desa/select/act?kecamatan_id="
......@@ -6,8 +6,7 @@ from pyramid.view import (
)
from opensipkd.models import DBSession
from opensipkd.models import (Partner, Departemen,
)
from opensipkd.models import (Partner)
from opensipkd.tools.report import (
open_rml_row,
open_rml_pdf,
......@@ -57,7 +56,7 @@ class ViewRpt(BaseView):
pdf, filename = open_rml_pdf(path + '/partner.rml', rows=rows,
company=request.company,
departement=request.departement,
alamat=Departemen.query_id(request.session['departemen_id']).first().alamat, )
)
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 opensipkd.models import Menus
@jsonrpc_method(method='get_menu', endpoint='rpc')
def get_menu(request, data):
"""
Digunakan untuk login pada aplikasi lain
:param request:
:param data:
{
"user_name": "user_name",
"password": "password"
}
:return:
result: "data":
{
"user_name": "user_name",
"nik": nik,
"nama": nik,
"group": [group],
"departemens": [departemen]
}
error:"error":{}
"""
is_list = type(data) is list
data = is_list and data[0] or data
level_id = data.get("level")
group = data.get("group")
qry = Menus.query()
if level_id:
qry = qry.filter(Menus.level_id == level_id or Menus.level_id == None)
if group:
grp = Menus.query().filter(kode=group).first()
if grp:
qry = qry.filter(
Menus.parent_id == grp.id or Menus.parent_id == None)
if request.user:
qry = qry.filter_by(need_login=True)
else:
qry = qry.filter_by(need_login=False)
resp = [
{
"type": "link",
"label": row.nama,
"className": row.class_name,
"name": row.kode,
"id": row.kode,
"url": row.url,
"icon": row.icon
}
for row in qry.all()]
result = is_list and [resp] or resp
return result
# from pyramid_rpc.jsonrpc import jsonrpc_method
#
# from opensipkd.models import Menus
#
#
# @jsonrpc_method(method='get_menu', endpoint='rpc')
# def get_menu(request, data):
# """
# Digunakan untuk login pada aplikasi lain
# :param request:
# :param data:
# {
# "user_name": "user_name",
# "password": "password"
# }
# :return:
# result: "data":
# {
# "user_name": "user_name",
# "nik": nik,
# "nama": nik,
# "group": [group],
# "departemens": [departemen]
# }
# error:"error":{}
# """
# is_list = type(data) is list
# data = is_list and data[0] or data
# level_id = data.get("level")
# group = data.get("group")
# qry = Menus.query()
# if level_id:
# qry = qry.filter(Menus.level_id == level_id or Menus.level_id == None)
# if group:
# grp = Menus.query().filter(kode=group).first()
# if grp:
# qry = qry.filter(
# Menus.parent_id == grp.id or Menus.parent_id == None)
# if request.user:
# qry = qry.filter_by(need_login=True)
# else:
# qry = qry.filter_by(need_login=False)
# resp = [
# {
# "type": "link",
# "label": row.nama,
# "className": row.class_name,
# "name": row.kode,
# "id": row.kode,
# "url": row.url,
# "icon": row.icon
# }
# for row in qry.all()]
#
# result = is_list and [resp] or resp
# 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
from importlib import import_module
import colander
import requests
from deform import widget, Form, ValidationFailure, Button
from icecream import ic
from pyramid.httpexceptions import HTTPFound, HTTPNotFound
from pyramid.renderers import render_to_response
from pyramid.security import remember, forget
......
......@@ -18,8 +18,8 @@ from .user import EmailValidator as EmailValidatorBase
from .user_group import save as save_groups
from .user_login import (ChangePassword, change_password_validator,
regenerate_security_code, send_email_security_code)
from opensipkd.models import DBSession, UserService, Departemen
from opensipkd.models import (User, Partner, Group, UserGroup, PartnerDepartemen)
from opensipkd.models import (
DBSession, UserService, User, Partner, Group, UserGroup)
_ = TranslationStringFactory('user')
......@@ -65,18 +65,18 @@ def login_(request, data):
now = datetime.now()
partner = Partner.query().filter_by(email=user.email).first()
departemen = None
if partner:
partner_dep = Departemen.query() \
.join(PartnerDepartemen,
Departemen.id == PartnerDepartemen.departemen_id) \
.join(Partner, Partner.id == PartnerDepartemen.partner_id) \
.filter(Partner.email == user.email,
PartnerDepartemen.mulai <= now,
PartnerDepartemen.selesai >= now).first()
if partner_dep:
departemen = dict(id=partner_dep.id,
kode=partner_dep.kode,
nama=partner_dep.nama)
# if partner:
# partner_dep = Departemen.query() \
# .join(PartnerDepartemen,
# Departemen.id == PartnerDepartemen.departemen_id) \
# .join(Partner, Partner.id == PartnerDepartemen.partner_id) \
# .filter(Partner.email == user.email,
# PartnerDepartemen.mulai <= now,
# PartnerDepartemen.selesai >= now).first()
# if partner_dep:
# departemen = dict(id=partner_dep.id,
# kode=partner_dep.kode,
# nama=partner_dep.nama)
return dict(id=user.id,
user_name=user.user_name,
......
import json
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, \
ResourceRegistry, default_resource_registry
from iso8601.iso8601 import ISO8601_REGEX
......@@ -280,7 +281,7 @@ class CaptchaWidget(Widget):
def deserialize(self, field, pstruct):
if pstruct is 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")
if self.strip:
pstruct = pstruct.strip()
......
......@@ -4,7 +4,7 @@ import logging
from datetime import datetime
import colander
from icecream import ic
# from icecream import ic
from pyramid.httpexceptions import HTTPForbidden
from pyramid.httpexceptions import HTTPNotFound
from pyramid.renderers import null_renderer, render, JSON
......@@ -116,7 +116,7 @@ def make_error_response(request, error, id=None):
'id': id,
'error': error.as_dict(),
}
ic(out)
# ic(out)
body = render(renderer, out, request=request).encode('utf-8')
response = Response(body, charset='utf-8')
......
from .base import *
from .common import *
from .users import *
from .menus import *
# from .menus import *
from .partner import *
from .departemen import *
from .pegawai import *
from .wilayah import *
\ No newline at end of file
# from .departemen import *
# from .pegawai import *
# from .wilayah import *
\ 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 (
)
from .common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
# from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from .meta import (Base)
from sqlalchemy.orm import relationship, backref
......@@ -62,20 +62,20 @@ class Partner(Base, PartnerModel):
perkawinan = Column(String(2))
pekerjaan = Column(String(32))
kewarganegaraan = Column(String(10))
provinsi_id = Column(Integer, ForeignKey(ResProvinsi.id))
dati2_id = Column(Integer, ForeignKey(ResDati2.id))
kecamatan_id = Column(Integer, ForeignKey(ResKecamatan.id))
desa_id = Column(Integer, ForeignKey(ResDesa.id))
# provinsi_id = Column(Integer, ForeignKey(ResProvinsi.id))
# dati2_id = Column(Integer, ForeignKey(ResDati2.id))
# kecamatan_id = Column(Integer, ForeignKey(ResKecamatan.id))
# desa_id = Column(Integer, ForeignKey(ResDesa.id))
company_id = Column(Integer)
nip = Column(String(32))
res_provinsi = relationship(
"ResProvinsi", backref=backref('partner'))
res_dati2 = relationship(
"ResDati2", backref=backref('partner'))
res_kecamatan = relationship(
"ResKecamatan", backref=backref('partner'))
res_desa = relationship(
"ResDesa", backref=backref('partner'))
# res_provinsi = relationship(
# "ResProvinsi", backref=backref('partner'))
# res_dati2 = relationship(
# "ResDati2", backref=backref('partner'))
# res_kecamatan = relationship(
# "ResKecamatan", backref=backref('partner'))
# res_desa = relationship(
# "ResDesa", backref=backref('partner'))
# npwp = 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 = [
'pyramid_mailer',
'ziggurat-foundations',
'zope.sqlalchemy',
'pytz',
# 'pytz',
'deform >= 2.0a2',
'psycopg2-binary',
'pyramid_chameleon',
'pyramid_rpc',
'requests',
# 'requests',
'sqlalchemy-datatables',
'py3o.template',
# 'py3o.template',
'wheezy.captcha',
'icecream',
# 'icecream',
'google-api-python-client',
'google',
'pyjwt',
'z3c.rml',
'opensipkd-tools @git+https://git.opensipkd.com/aa.gusti/opensipkd-tools.git',
# 'pyjwt',
# 'z3c.rml',
# 'opensipkd-tools @git+https://git.opensipkd.com/aa.gusti/opensipkd-tools.git',
]
dev_requires = [
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!