Commit b4d257e4 by aa.gusti

wilayah to partner

1 parent 418142c3
from .base import * from .base import *
from .common import * from .common import *
from .users import * from .users import *
from .wilayah import *
from .partner import * from .partner import *
from .departemen import * from .departemen import *
# from .meta import * # from .meta import *
from .pegawai import * from .pegawai import *
from .wilayah import *
# from .targets import * # from .targets import *
# from .wilayah import * # from .wilayah import *
...@@ -170,5 +170,9 @@ class NamaModel(KodeModel): ...@@ -170,5 +170,9 @@ class NamaModel(KodeModel):
return cls.query_nama(nama, db_session).first() return cls.query_nama(nama, db_session).first()
@classmethod @classmethod
def query_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama)
@classmethod
def get_list(cls): def get_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama).all() return cls.query_list().all()
...@@ -3,10 +3,11 @@ from sqlalchemy import ( ...@@ -3,10 +3,11 @@ from sqlalchemy import (
Integer, Integer,
String, String,
SmallInteger, SmallInteger,
DateTime DateTime, ForeignKey
) )
from opensipkd.base.models.common import NamaModel from opensipkd.base.models.common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from ..models import (Base) from ..models import (Base)
...@@ -58,6 +59,10 @@ class Partner(Base, PartnerModel): ...@@ -58,6 +59,10 @@ 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))
dati2_id = Column(Integer, ForeignKey(ResDati2.id))
kecamatan_id = Column(Integer, ForeignKey(ResKecamatan.id))
desa_id = Column(Integer, ForeignKey(ResDesa.id))
# npwp = Column(String(16)) # npwp = Column(String(16))
# npwpd = Column(String(16)) # npwpd = Column(String(16))
# #
......
...@@ -22,7 +22,6 @@ class ResProvinsi(Base, NamaModel): ...@@ -22,7 +22,6 @@ class ResProvinsi(Base, NamaModel):
ibu_kota = Column(String(64)) ibu_kota = Column(String(64))
kategori_dati2 = ( kategori_dati2 = (
("kota", "Kota"), ("kota", "Kota"),
("kabupaten", "Kabupaten"), ("kabupaten", "Kabupaten"),
...@@ -38,12 +37,24 @@ class ResDati2(Base, NamaModel): ...@@ -38,12 +37,24 @@ class ResDati2(Base, NamaModel):
ibu_kota = Column(String(64)) ibu_kota = Column(String(64))
provinsi_id = Column(SmallInteger, ForeignKey(ResProvinsi.id)) provinsi_id = Column(SmallInteger, ForeignKey(ResProvinsi.id))
@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): class ResKecamatan(Base, NamaModel):
__tablename__ = 'res_kecamatan' __tablename__ = 'res_kecamatan'
__table_args__ = (TABLE_ARGS,) __table_args__ = (TABLE_ARGS,)
ibu_kota = Column(String(64)) ibu_kota = Column(String(64))
dati2_id = Column(SmallInteger, ForeignKey(ResDati2.id)) dati2_id = Column(SmallInteger, ForeignKey(ResDati2.id))
@classmethod
def get_list(cls, dati2_id):
qry = cls.query_list()
if dati2_id:
qry = qry.filter(cls.dati2_id == dati2_id)
return qry.all()
kategori_desa = ( kategori_desa = (
...@@ -57,3 +68,10 @@ class ResDesa(Base, NamaModel): ...@@ -57,3 +68,10 @@ class ResDesa(Base, NamaModel):
__table_args__ = (TABLE_ARGS,) __table_args__ = (TABLE_ARGS,)
kategori = Column(String(32)) kategori = Column(String(32))
kecamatan_id = Column(SmallInteger, ForeignKey(ResKecamatan.id)) kecamatan_id = Column(SmallInteger, ForeignKey(ResKecamatan.id))
@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()
...@@ -5,6 +5,7 @@ from deform import (widget, Form, ) ...@@ -5,6 +5,7 @@ from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import widget_os
from .provinsi import provinsi_widget from .provinsi import provinsi_widget
from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
...@@ -15,8 +16,21 @@ SESS_EDIT_FAILED = 'Edit dati2 gagal' ...@@ -15,8 +16,21 @@ SESS_EDIT_FAILED = 'Edit dati2 gagal'
@colander.deferred @colander.deferred
def dati2_widget(node, kw): def dati2_widget(node, kw):
default_url = "/kecamatan/select/act?dati2_id="
default_slave = "kecamatan_id"
values = kw.get('dati2_list', []) values = kw.get('dati2_list', [])
return widget.Select2Widget(values=values) url = kw.get('dati2_url', [])
slave = kw.get('dati2_slave', [])
if not url:
url = default_url
if not slave:
slave = default_slave
values.insert(0, ("", "Pilih Kab/Kota..."))
return widget_os.Select2MsWidget(values=values,
url=url,
slave=slave)
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
...@@ -136,11 +150,17 @@ class ViewDati2(BaseView): ...@@ -136,11 +150,17 @@ class ViewDati2(BaseView):
ColumnDT(ResDati2.kode, mData='kode'), ColumnDT(ResDati2.kode, mData='kode'),
ColumnDT(ResDati2.nama, mData='nama'), ColumnDT(ResDati2.nama, mData='nama'),
ColumnDT(ResDati2.status, mData='status'), ColumnDT(ResDati2.status, mData='status'),
ColumnDT(ResProvinsi.nama, mData='provinsi'),] ColumnDT(ResProvinsi.nama, mData='provinsi'), ]
query = DBSession.query().select_from(ResDati2) \ query = DBSession.query().select_from(ResDati2) \
.join(ResProvinsi, ResProvinsi.id == ResDati2.provinsi_id) .join(ResProvinsi, ResProvinsi.id == ResDati2.provinsi_id)
row_table = DataTables(request.GET, query, columns) row_table = DataTables(request.GET, query, columns)
return row_table.output_result() return row_table.output_result()
elif url_dict['act'] == 'select':
provinsi_id = request.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', @view_config(route_name='dati2-add',
renderer='templates/form_input.pt', permission='dati2') renderer='templates/form_input.pt', permission='dati2')
......
...@@ -141,6 +141,12 @@ class ViewDesa(BaseView): ...@@ -141,6 +141,12 @@ class ViewDesa(BaseView):
.join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id) .join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id)
row_table = DataTables(request.GET, query, columns) row_table = DataTables(request.GET, query, columns)
return row_table.output_result() return row_table.output_result()
elif url_dict['act'] == 'select':
kecamatan_id = request.params["kecamatan_id"]
data = ResKecamatan.get_list(kecamatan_id)
result = {f"{k[0]}": k[1] for k in data}
return result
@view_config(route_name='desa-add', @view_config(route_name='desa-add',
renderer='templates/form_input.pt', permission='desa') renderer='templates/form_input.pt', permission='desa')
......
...@@ -5,6 +5,7 @@ from deform import (widget, Form, ) ...@@ -5,6 +5,7 @@ from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from . import widget_os
from .dati2 import dati2_widget from .dati2 import dati2_widget
from ..models import DBSession, ResKecamatan, ResDati2 from ..models import DBSession, ResKecamatan, ResDati2
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
...@@ -15,8 +16,21 @@ SESS_EDIT_FAILED = 'Edit kecamatan gagal' ...@@ -15,8 +16,21 @@ SESS_EDIT_FAILED = 'Edit kecamatan gagal'
@colander.deferred @colander.deferred
def kecamatan_widget(node, kw): def kecamatan_widget(node, kw):
default_url = "/desa/select/act?kecamatan_id="
default_slave = "desa_id"
values = kw.get('kecamatan_list', []) values = kw.get('kecamatan_list', [])
return widget.Select2Widget(values=values) url = kw.get('kecamatan_url', [])
slave = kw.get('kecamatan_slave', [])
if not url:
url = default_url
if not slave:
slave = default_slave
values.insert(0, ("", "Pilih Kecamatan..."))
return widget_os.Select2MsWidget(values=values,
url=url,
slave=slave,
placeholder="Pilih Kecamatan")
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
...@@ -137,6 +151,12 @@ class ViewDati2(BaseView): ...@@ -137,6 +151,12 @@ class ViewDati2(BaseView):
.join(ResDati2, ResDati2.id == ResKecamatan.dati2_id) .join(ResDati2, ResDati2.id == ResKecamatan.dati2_id)
row_table = DataTables(request.GET, query, columns) row_table = DataTables(request.GET, query, columns)
return row_table.output_result() return row_table.output_result()
elif 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', @view_config(route_name='kecamatan-add',
renderer='templates/form_input.pt', permission='kecamatan') renderer='templates/form_input.pt', permission='kecamatan')
......
...@@ -7,7 +7,7 @@ from deform import ( ...@@ -7,7 +7,7 @@ from deform import (
widget, widget,
ValidationFailure, ValidationFailure,
) )
from opensipkd.base.models import User from opensipkd.base.models import User, ResProvinsi, ResDati2, ResKecamatan, ResDesa
from pyramid.httpexceptions import ( from pyramid.httpexceptions import (
HTTPFound, HTTPFound,
) )
...@@ -16,6 +16,10 @@ from pyramid.view import ( ...@@ -16,6 +16,10 @@ from pyramid.view import (
) )
from opensipkd.tools.buttons import btn_save, btn_cancel, btn_delete from opensipkd.tools.buttons import btn_save, btn_cancel, btn_delete
from .dati2 import dati2_widget
from .desa import desa_widget
from .kecamatan import kecamatan_widget
from .provinsi import provinsi_widget
from ..models import DBSession from ..models import DBSession
from ..models import Partner from ..models import Partner
# from ..models.partner import PartnerUserModel # from ..models.partner import PartnerUserModel
...@@ -45,26 +49,49 @@ class AddSchema(colander.Schema): ...@@ -45,26 +49,49 @@ class AddSchema(colander.Schema):
missing=colander.drop, missing=colander.drop,
validator=colander.Length(max=128), validator=colander.Length(max=128),
oid="alamat_2") oid="alamat_2")
kelurahan = colander.SchemaNode( # kelurahan = colander.SchemaNode(
colander.String(), # colander.String(),
# missing=colander.drop,
# validator=colander.Length(max=64),
# oid="kelurahan")
# kecamatan = colander.SchemaNode(
# colander.String(),
# missing=colander.drop,
# validator=colander.Length(max=64),
# oid="kecamatan")
# kota = colander.SchemaNode(
# colander.String(),
# validator=colander.Length(max=64),
# missing=colander.drop,
# oid="kota")
# provinsi = colander.SchemaNode(
# colander.String(),
# validator=colander.Length(max=64),
# missing=colander.drop,
# oid="provinsi")
provinsi_id = colander.SchemaNode(
colander.Integer(),
widget=provinsi_widget,
missing=colander.drop, missing=colander.drop,
validator=colander.Length(max=64), oid="provinsi_id",
oid="kelurahan") url="",
kecamatan = colander.SchemaNode( slave="dati2_id",
colander.String(), )
dati2_id = colander.SchemaNode(
colander.Integer(),
widget=dati2_widget,
missing=colander.drop, missing=colander.drop,
validator=colander.Length(max=64), oid="dati2_id")
oid="kecamatan") kecamatan_id = colander.SchemaNode(
kota = colander.SchemaNode( colander.Integer(),
colander.String(),
validator=colander.Length(max=64),
missing=colander.drop, missing=colander.drop,
oid="kota") widget=kecamatan_widget,
provinsi = colander.SchemaNode( oid="kecamatan_id")
colander.String(), desa_id = colander.SchemaNode(
validator=colander.Length(max=64), colander.Integer(),
widget=desa_widget,
missing=colander.drop, missing=colander.drop,
oid="provinsi") oid="desa_id")
email = colander.SchemaNode( email = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=128), validator=colander.Length(max=128),
...@@ -135,8 +162,8 @@ class ViewPartner(BaseView): ...@@ -135,8 +162,8 @@ class ViewPartner(BaseView):
ColumnDT(Partner.status, mData='status'), ColumnDT(Partner.status, mData='status'),
] ]
query = DBSession.query().select_from(Partner) query = DBSession.query().select_from(Partner)
rowTable = DataTables(request.GET, query, columns) row_table = DataTables(request.GET, query, columns)
return rowTable.output_result() return row_table.output_result()
elif url_dict['act'] == 'hok': elif url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or '' term = 'term' in params and params['term'] or ''
...@@ -166,9 +193,6 @@ class ViewPartner(BaseView): ...@@ -166,9 +193,6 @@ class ViewPartner(BaseView):
keys = row.keys() keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()] r = [dict(zip(keys, k)) for k in q.all()]
# for k in q.all():
# d = )
# r.append(d)
return r return r
elif url_dict['act'] == 'vendor': # vendor only elif url_dict['act'] == 'vendor': # vendor only
...@@ -227,7 +251,7 @@ class ViewPartner(BaseView): ...@@ -227,7 +251,7 @@ class ViewPartner(BaseView):
if not row: if not row:
return id_not_found(request) return id_not_found(request)
form = get_form(request, EditSchema) form = get_form(request, EditSchema, row=row)
if request.POST: if request.POST:
if 'save' in request.POST: if 'save' in request.POST:
controls = request.POST.items() controls = request.POST.items()
...@@ -306,7 +330,6 @@ def form_validator(form, value): ...@@ -306,7 +330,6 @@ def form_validator(form, value):
row = q.first() row = q.first()
else: else:
row = None row = None
q = Partner.query_kode(value['kode']) q = Partner.query_kode(value['kode'])
found = q.first() found = q.first()
if row: if row:
...@@ -318,10 +341,18 @@ def form_validator(form, value): ...@@ -318,10 +341,18 @@ def form_validator(form, value):
def get_form(request, class_form, row=None, buttons=(btn_save, btn_cancel)): def get_form(request, class_form, row=None, buttons=(btn_save, btn_cancel)):
schema = class_form(validator=form_validator) schema = class_form(validator=form_validator)
schema = schema.bind() 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 []
schema = schema.bind(provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
desa_list=desa_list
)
schema.request = request schema.request = request
if row: # if row:
schema.deserialize(row) # schema.deserialize(row)
return Form(schema, buttons=buttons) return Form(schema, buttons=buttons)
...@@ -370,6 +401,7 @@ def id_not_found(request): ...@@ -370,6 +401,7 @@ def id_not_found(request):
request.session.flash(msg, 'error') request.session.flash(msg, 'error')
return route_list(request) return route_list(request)
def get_partner_list(): def get_partner_list():
r = [] r = []
q = DBSession.query(Partner).order_by(Partner.nama) q = DBSession.query(Partner).order_by(Partner.nama)
......
...@@ -8,6 +8,7 @@ from pyramid.httpexceptions import (HTTPFound, ) ...@@ -8,6 +8,7 @@ from pyramid.httpexceptions import (HTTPFound, )
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
from sqlalchemy.orm import aliased from sqlalchemy.orm import aliased
from . import widget_os
from ..models import DBSession, ResProvinsi, kategori_provinsi, flush from ..models import DBSession, ResProvinsi, kategori_provinsi, flush
from ..views import ColumnDT, DataTables, BaseView from ..views import ColumnDT, DataTables, BaseView
...@@ -17,8 +18,21 @@ SESS_EDIT_FAILED = 'Edit provinsi gagal' ...@@ -17,8 +18,21 @@ SESS_EDIT_FAILED = 'Edit provinsi gagal'
@colander.deferred @colander.deferred
def provinsi_widget(node, kw): def provinsi_widget(node, kw):
default_url = "/dati2/select/act?provinsi_id="
default_slave = "dati2_id"
values = kw.get('provinsi_list', []) values = kw.get('provinsi_list', [])
return widget.Select2Widget(values=values) url = kw.get('provinsi_url', [])
slave = kw.get('provinsi_slave', [])
if not url:
url = default_url
if not slave:
slave = default_slave
values.insert(0, ("", "Pilih Propinsi..."))
return widget_os.Select2MsWidget(values=values,
url=url,
slave=slave,
placeholder="Pilih Provinsi")
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
......
<div i18n:domain="deform"
tal:omit-tag=""
tal:define="oid oid|field.oid;
name name|field.name;
css_class css_class|field.widget.css_class;
style style|field.widget.style;">
${field.start_mapping()}
<div class="row">
<div class="col-xs-4">
<div class="input-group">
<span class="input-group-addon" i18n:translate="">Blok/Kav/No</span>
<input type="text" name="blok_kav_no" value="${blok_kav_no}"
class="span2 form-control ${css_class or ''}"
tal:attributes="style style;
blok_kav_no_attributes|field.widget.blok_kav_no_attributes|{};"
maxlength="15" minlength="1" placeholder="Blok Kav No"
id="${oid}"/>
</div>
</div>
<div class="col-xs-2">
<div class="input-group">
<span class="input-group-addon" i18n:translate="">RT</span>
<input type="text" name="rt" value="${rt}"
class="span2 form-control ${css_class or ''}"
tal:attributes="style style;
rt_attributes|field.widget.rt_attributes|{};"
maxlength="3" minlength="3" placeholder="RT"
id="${oid}-rt/>">
</div>
<script type="text/javascript">
deform.addCallback(
'${oid}-rt',
function (oid) {
$("#" + oid).mask("999",
{placeholder:"_"});
});
</script>
</div>
<div class="col-xs-2">
<div class="input-group">
<span class="input-group-addon" i18n:translate="">RW</span>
<input type="text" name="rw" value="${rw}"
class="span2 form-control ${css_class or ''}"
tal:attributes="style style;
rw_attributes|field.widget.rw_attributes|{};"
maxlength="2" minlength="2" placeholder="RW"
id="${oid}-rw/>">
</div>
<script type="text/javascript">
deform.addCallback(
'${oid}-rw',
function (oid) {
$("#" + oid).mask("99",
{placeholder:"_"});
});
</script>
</div>
</div>
${field.end_mapping()}
</div>
from colander import SchemaNode, null, Mapping, Invalid, text_ from colander import SchemaNode, null, Mapping, Invalid, text_
from deform.widget import Widget, _StrippedString from deform.widget import Widget, _StrippedString, Select2Widget
class DokumenWidget(Widget): class DokumenWidget(Widget):
...@@ -163,3 +163,21 @@ class BlokKavNoWidget(Widget): ...@@ -163,3 +163,21 @@ class BlokKavNoWidget(Widget):
raise Invalid(field.schema, "Blok Kav No RT/RW tidak lengkap", result) raise Invalid(field.schema, "Blok Kav No RT/RW tidak lengkap", result)
return result return result
class Select2MsWidget(Select2Widget):
"""
Renders ``<select>`` field based on a predefined set of values using
`select2 <https://select2.org/>`_ library.
**Attributes/Arguments**
Same as :func:`~deform.widget.SelectWidget`, with some extra options
listed here.
tags: *bool*
Allow dynamic option creation ( default: ``False`` ).
See `select2 docs on tagging <https://select2.org/tagging>`_ for
more details.
"""
template = "select2_ms.pt"
<div tal:define="
name name|field.name;
style field.widget.style;
oid oid|field.oid;
css_class css_class|field.widget.css_class;
unicode unicode|str;
optgroup_class optgroup_class|field.widget.optgroup_class;
multiple multiple|field.widget.multiple;
url url|field.widget.url;
slave slave|field.widget.slave;"
tal:omit-tag="">
<style>
.select2-selection.form-control {
padding: 0px 0px;
}
.select2-container--default .select2-selection--multiple,
.select2-container--default .select2-selection--single {
border: 1px solid #ccc;
}
</style>
<input type="hidden" name="__start__" value="${name}:sequence"
tal:condition="multiple" />
<select tal:attributes="
name name;
id oid;
class string: form-control ${css_class or ''};
data-placeholder field.widget.placeholder|None;
multiple multiple;
style style;
attributes|field.widget.attributes|{};">
<tal:loop tal:repeat="item values">
<optgroup tal:condition="isinstance(item, optgroup_class)"
tal:attributes="label item.label">
<option tal:repeat="(value, description) item.options"
tal:attributes="
selected python:field.widget.get_select_value(cstruct, value);
class css_class;
label field.widget.long_label_generator and description;
value value"
tal:content="field.widget.long_label_generator and field.widget.long_label_generator(item.label, description) or description"/>
</optgroup>
<option tal:condition="not isinstance(item, optgroup_class)"
tal:attributes="
selected python:field.widget.get_select_value(cstruct, item[0]);
class css_class;
value item[0]">${item[1]}</option>
</tal:loop>
</select>
<script type="text/javascript">
deform.addCallback(
'${field.oid}',
function(oid) {
$('#' + oid).select2({
containerCssClass: 'form-control',
placeholder: "${str(field.widget.placeholder).replace('"','\\"')|""}" || undefined,
allowClear: "${hasattr(field.widget, 'placeholder')}",
tags: ${str(getattr(field.widget, 'tags', 'undefined')).lower()}
});
}
);
</script>
<script type="text/javascript" tal:condition="url and slave">
deform.addCallback(
'${field.oid}',
function(oid) {
$('#' + oid).change(function () {
$("#${slave}").val("");
var value = $(this).val();
if (value) {
$.ajax({
type: "GET",
url: "${url}" + value,
success: function (res) {
if (res) {
$("#${slave}").empty();
$("#${slave}").append('<option value="">Pilih Data...</option>');
$.each(res, function (key, value) {
$("#${slave}").append('<option value="' + key + '">' + value + '</option>');
});
} else {
$("#${slave}").empty();
}
}
});
} else {
$("#${slave}").empty();
}
});
});
</script>
<input type="hidden" name="__end__" value="${name}:sequence"
tal:condition="multiple" />
</div>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!