Commit b4d257e4 by aa.gusti

wilayah to partner

1 parent 418142c3
from .base import *
from .common import *
from .users import *
from .wilayah import *
from .partner import *
from .departemen import *
# from .meta import *
from .pegawai import *
from .wilayah import *
# from .targets import *
# from .wilayah import *
......@@ -170,5 +170,9 @@ class NamaModel(KodeModel):
return cls.query_nama(nama, db_session).first()
@classmethod
def query_list(cls):
return DBSession.query(cls.id, cls.nama).order_by(cls.nama)
@classmethod
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 (
Integer,
String,
SmallInteger,
DateTime
DateTime, ForeignKey
)
from opensipkd.base.models.common import NamaModel
from .wilayah import ResProvinsi, ResDesa, ResKecamatan, ResDati2
from ..models import (Base)
......@@ -58,6 +59,10 @@ 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))
# npwp = Column(String(16))
# npwpd = Column(String(16))
#
......
......@@ -22,7 +22,6 @@ class ResProvinsi(Base, NamaModel):
ibu_kota = Column(String(64))
kategori_dati2 = (
("kota", "Kota"),
("kabupaten", "Kabupaten"),
......@@ -38,12 +37,24 @@ class ResDati2(Base, NamaModel):
ibu_kota = Column(String(64))
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):
__tablename__ = 'res_kecamatan'
__table_args__ = (TABLE_ARGS,)
ibu_kota = Column(String(64))
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 = (
......@@ -57,3 +68,10 @@ class ResDesa(Base, NamaModel):
__table_args__ = (TABLE_ARGS,)
kategori = Column(String(32))
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, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, )
from . import widget_os
from .provinsi import provinsi_widget
from ..models import DBSession, ResDati2, kategori_dati2, ResProvinsi
from ..views import ColumnDT, DataTables, BaseView
......@@ -15,8 +16,21 @@ SESS_EDIT_FAILED = 'Edit dati2 gagal'
@colander.deferred
def dati2_widget(node, kw):
default_url = "/kecamatan/select/act?dati2_id="
default_slave = "kecamatan_id"
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):
......@@ -136,11 +150,17 @@ class ViewDati2(BaseView):
ColumnDT(ResDati2.kode, mData='kode'),
ColumnDT(ResDati2.nama, mData='nama'),
ColumnDT(ResDati2.status, mData='status'),
ColumnDT(ResProvinsi.nama, mData='provinsi'),]
ColumnDT(ResProvinsi.nama, mData='provinsi'), ]
query = DBSession.query().select_from(ResDati2) \
.join(ResProvinsi, ResProvinsi.id == ResDati2.provinsi_id)
row_table = DataTables(request.GET, query, columns)
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',
renderer='templates/form_input.pt', permission='dati2')
......
......@@ -141,6 +141,12 @@ class ViewDesa(BaseView):
.join(ResKecamatan, ResKecamatan.id == ResDesa.kecamatan_id)
row_table = DataTables(request.GET, query, columns)
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',
renderer='templates/form_input.pt', permission='desa')
......
......@@ -5,6 +5,7 @@ from deform import (widget, Form, )
from opensipkd.tools.buttons import btn_close, btn_cancel, btn_save
from pyramid.view import (view_config, )
from . import widget_os
from .dati2 import dati2_widget
from ..models import DBSession, ResKecamatan, ResDati2
from ..views import ColumnDT, DataTables, BaseView
......@@ -15,8 +16,21 @@ SESS_EDIT_FAILED = 'Edit kecamatan gagal'
@colander.deferred
def kecamatan_widget(node, kw):
default_url = "/desa/select/act?kecamatan_id="
default_slave = "desa_id"
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):
......@@ -137,6 +151,12 @@ class ViewDati2(BaseView):
.join(ResDati2, ResDati2.id == ResKecamatan.dati2_id)
row_table = DataTables(request.GET, query, columns)
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',
renderer='templates/form_input.pt', permission='kecamatan')
......
......@@ -7,7 +7,7 @@ from deform import (
widget,
ValidationFailure,
)
from opensipkd.base.models import User
from opensipkd.base.models import User, ResProvinsi, ResDati2, ResKecamatan, ResDesa
from pyramid.httpexceptions import (
HTTPFound,
)
......@@ -16,6 +16,10 @@ from pyramid.view import (
)
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 Partner
# from ..models.partner import PartnerUserModel
......@@ -45,26 +49,49 @@ class AddSchema(colander.Schema):
missing=colander.drop,
validator=colander.Length(max=128),
oid="alamat_2")
kelurahan = colander.SchemaNode(
colander.String(),
# kelurahan = colander.SchemaNode(
# 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,
validator=colander.Length(max=64),
oid="kelurahan")
kecamatan = colander.SchemaNode(
colander.String(),
oid="provinsi_id",
url="",
slave="dati2_id",
)
dati2_id = colander.SchemaNode(
colander.Integer(),
widget=dati2_widget,
missing=colander.drop,
validator=colander.Length(max=64),
oid="kecamatan")
kota = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="dati2_id")
kecamatan_id = colander.SchemaNode(
colander.Integer(),
missing=colander.drop,
oid="kota")
provinsi = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
widget=kecamatan_widget,
oid="kecamatan_id")
desa_id = colander.SchemaNode(
colander.Integer(),
widget=desa_widget,
missing=colander.drop,
oid="provinsi")
oid="desa_id")
email = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=128),
......@@ -135,8 +162,8 @@ class ViewPartner(BaseView):
ColumnDT(Partner.status, mData='status'),
]
query = DBSession.query().select_from(Partner)
rowTable = DataTables(request.GET, query, columns)
return rowTable.output_result()
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
elif url_dict['act'] == 'hok':
term = 'term' in params and params['term'] or ''
......@@ -166,9 +193,6 @@ class ViewPartner(BaseView):
keys = row.keys()
r = [dict(zip(keys, k)) for k in q.all()]
# for k in q.all():
# d = )
# r.append(d)
return r
elif url_dict['act'] == 'vendor': # vendor only
......@@ -227,7 +251,7 @@ class ViewPartner(BaseView):
if not row:
return id_not_found(request)
form = get_form(request, EditSchema)
form = get_form(request, EditSchema, row=row)
if request.POST:
if 'save' in request.POST:
controls = request.POST.items()
......@@ -306,7 +330,6 @@ def form_validator(form, value):
row = q.first()
else:
row = None
q = Partner.query_kode(value['kode'])
found = q.first()
if row:
......@@ -318,10 +341,18 @@ def form_validator(form, value):
def get_form(request, class_form, row=None, buttons=(btn_save, btn_cancel)):
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
if row:
schema.deserialize(row)
# if row:
# schema.deserialize(row)
return Form(schema, buttons=buttons)
......@@ -370,6 +401,7 @@ def id_not_found(request):
request.session.flash(msg, 'error')
return route_list(request)
def get_partner_list():
r = []
q = DBSession.query(Partner).order_by(Partner.nama)
......
......@@ -8,6 +8,7 @@ from pyramid.httpexceptions import (HTTPFound, )
from pyramid.view import (view_config, )
from sqlalchemy.orm import aliased
from . import widget_os
from ..models import DBSession, ResProvinsi, kategori_provinsi, flush
from ..views import ColumnDT, DataTables, BaseView
......@@ -17,8 +18,21 @@ SESS_EDIT_FAILED = 'Edit provinsi gagal'
@colander.deferred
def provinsi_widget(node, kw):
default_url = "/dati2/select/act?provinsi_id="
default_slave = "dati2_id"
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):
......
<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 deform.widget import Widget, _StrippedString
from deform.widget import Widget, _StrippedString, Select2Widget
class DokumenWidget(Widget):
......@@ -163,3 +163,21 @@ class BlokKavNoWidget(Widget):
raise Invalid(field.schema, "Blok Kav No RT/RW tidak lengkap", 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!