Commit 1837e5f8 by aagusti

perbaikan routelist

1 parent f912c31b
$(document).ready(function () {
$('#parent_nm').bind('typeahead:selected', function (obj, datum, name) {
$('#parent_id').val(datum.id);
});
$('#parent_nm').on('input',
function (e) {
let val = $('#parent_nm').val();
if (val === null || val === "") {
$('#parent_id').val("");
}
});
});
\ No newline at end of file
......@@ -4,4 +4,13 @@ $(document).ready(function () {
$('#parent_kd').val(datum.kode);
console.log(datum.kode);
});
$('#parent_nm').on('input',
function (e) {
let val = $('#parent_nm').val();
if (val === null || val === "") {
$('#parent_id').val("");
$('#parent_kd').val("");
}
});
});
\ No newline at end of file
......@@ -161,13 +161,15 @@ class BaseView(object):
def delete_msg(self, row):
return f'Data ID {row.id} sudah dihapus.'
def route_list(self, msg=None, error="", **kwargs):
def route_list(self, **kwargs):
msg = kwargs.get("msg")
error = kwargs.get("error", "")
list_url = kwargs.get("list_url", None)
if msg:
self.ses.flash(msg, error)
list_url = kwargs.get("list_url", None)
if not list_url:
list_url = self.req.route_url(self.list_route)
log.error(list_url)
if self.headers:
return HTTPFound(location=get_urls(list_url),
headers=self.headers)
......@@ -336,10 +338,10 @@ class BaseView(object):
def cancel_act(self, **kwargs):
return self.route_list(**kwargs)
def after_add(self, **kwargs):
def after_add(self, row=None, **kwargs):
return self.route_list(**kwargs)
def after_edit(self, **kwargs):
def after_edit(self, row=None, **kwargs):
return self.route_list(**kwargs)
def after_view(self, **kwargs):
......
import logging
import colander
from datatables import ColumnDT
from deform import (widget, )
from pyramid.view import (view_config, )
from sqlalchemy.orm import aliased
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 ResProvinsi, ResDati2, ResDesa, User
from . import DataTables
from .partner_base import PartnerSchema
from .. import get_urls
from ..views import BaseView
log = logging.getLogger(__name__)
SESS_ADD_FAILED = 'Tambah pemda gagal'
SESS_EDIT_FAILED = 'Edit pemda gagal'
......@@ -20,14 +27,34 @@ def company_widget(node, kw):
class AddSchema(PartnerSchema):
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/company.js"})
),
oid="parent_nm", title="Induk")
def after_bind(self, node, kw):
self["email"].missing = colander.drop
request = kw["request"]
self["parent_nm"].widget = widget.AutocompleteInputWidget(
size=60, min_length=3,
requirements=(("typeahead", None), ("deform", None),
{"js": "opensipkd.base:static/js/form/company.js"}),
values=get_urls(f"{request.route_url('company')}/hon/act"))
class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop,
widget=widget.HiddenWidget(readonly=True),
visible=False,)
visible=False, )
partner_id = colander.SchemaNode(colander.Integer(),
widget=widget.HiddenWidget(),
missing=colander.drop,
......@@ -35,7 +62,7 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(),title="Action")
id = colander.SchemaNode(colander.String(), title="Action")
kode = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=32),
......@@ -46,6 +73,14 @@ class ListSchema(colander.Schema):
colander.String(),
validator=colander.Length(max=64),
oid="nama")
parent_nm = colander.SchemaNode(
colander.String(),
validator=colander.Length(max=64),
oid="parent_nm",
field="alias.nama"
)
status = colander.SchemaNode(
colander.Integer(),
widget=widget.CheckboxWidget(),
......@@ -116,16 +151,19 @@ class ViewCompany(BaseView):
found = User.get_by_identity(value.get('email'))
if found:
err_user()
value["status"]="status" in value and value["status"] and 1 or 0
value["is_vendor"]="is_vendor" in value and value["is_vendor"] and 1 or 0
value["is_customer"]="is_customer" in value and value["is_customer"] and 1 or 0
value["status"] = "status" in value and value["status"] and 1 or 0
value["is_vendor"] = "is_vendor" in value and value["is_vendor"] and 1 or 0
value["is_customer"] = "is_customer" in value and value["is_customer"] and 1 or 0
def get_bindings(self, row=None):
provinsi_list = ResProvinsi.get_list()
partner = row and row.partner or None
dati2_list = partner and partner.provinsi_id and ResDati2.get_list(partner.provinsi_id) or []
kecamatan_list = partner and partner.dati2_id and ResKecamatan.get_list(partner.dati2_id) or []
desa_list = partner and partner.kecamatan_id and ResDesa.get_list(partner.kecamatan_id) or []
dati2_list = partner and partner.provinsi_id and ResDati2.get_list(
partner.provinsi_id) or []
kecamatan_list = partner and partner.dati2_id and ResKecamatan.get_list(
partner.dati2_id) or []
desa_list = partner and partner.kecamatan_id and ResDesa.get_list(
partner.kecamatan_id) or []
return dict(provinsi_list=provinsi_list,
dati2_list=dati2_list,
kecamatan_list=kecamatan_list,
......@@ -146,7 +184,37 @@ class ViewCompany(BaseView):
@view_config(route_name='company-act', renderer='json',
permission='view')
def view_act(self):
return super().view_act()
request = self.req
ses = request.session
params = request.params
url_dict = request.matchdict
alias = aliased(ResCompany)
if url_dict['act'] == 'grid':
columns = [ColumnDT(self.table.id, mData='id'),
ColumnDT(self.table.kode, mData='kode'),
ColumnDT(self.table.nama, mData='nama'),
ColumnDT(alias.nama, mData='parent_nm'),
ColumnDT(self.table.status, mData='status'),
# ColumnDT(Departemen.level_id, mData='level_id'),
]
query = DBSession.query().select_from(ResCompany).outerjoin(
alias, ResCompany.parent_id == 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 = DBSession.query(self.table) \
.filter(self.table.status == 1,
self.table.nama.ilike('%%%s%%' % term)) \
.order_by(self.table.nama)
rows = q.all()
r = []
for k in rows:
d = dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama)
r.append(d)
log.error(r)
return r
@view_config(route_name='company-add',
renderer='templates/form.pt', permission='company')
......@@ -154,12 +222,17 @@ class ViewCompany(BaseView):
return super(ViewCompany, self).view_add()
def get_values(self, row, istime=False):
d = super().get_values(row,istime)
d = super().get_values(row, istime)
partner = row.partner
if partner :
if partner:
p = partner.to_dict()
del p["id"]
d.update(p)
if "parent_id" in d and d["parent_id"]:
parent = ResCompany.query_id(d["parent_id"]).first()
if parent:
d["parent_nm"] = parent.nama
return d
@view_config(route_name='company-edit',
......@@ -173,6 +246,11 @@ class ViewCompany(BaseView):
return super(ViewCompany, self).view_delete()
def save_request(self, values, row=None):
# Save Partner First
parent_id = "parent_id" in values and values["parent_id"] or None
if parent_id:
del values["parent_id"]
if 'partner_id' in values:
part = Partner.query_id(values['partner_id']).first()
values["id"] = part.id
......@@ -185,8 +263,12 @@ class ViewCompany(BaseView):
part.from_dict(values)
DBSession.add(part)
DBSession.flush()
# Save Company
if part:
values["partner_id"] = part.id
if parent_id:
values["parent_id"] = parent_id
if "id" in self.req.matchdict:
values["id"] = self.req.matchdict["id"]
......@@ -197,4 +279,3 @@ class ViewCompany(BaseView):
DBSession.add(part)
DBSession.flush()
return row
......@@ -9,7 +9,7 @@ from pyramid.view import (view_config, )
from sqlalchemy import func
from sqlalchemy.orm import aliased
from opensipkd.models import DBSession, Departemen, Partner, PartnerDepartemen
from opensipkd.models import DBSession, Departemen, Partner, PartnerDepartemen, ResCompany
from opensipkd.tools import (get_ext, get_random_string, get_settings)
from .company import company_widget
from .upload import AddSchema as UploadSchema
......@@ -46,10 +46,11 @@ class AddSchema(colander.Schema):
widget=widget.AutocompleteInputWidget(
size=60, min_length=3,
requirements=(("typeahead", None), ("deform", None),
{"js": "opensipkd.base:static/js/form/departemen.js"})
{"js": "opensipkd.base:static/js/form/departemen.js"}),
# options={"allowClear": True}
),
oid="parent_nm", title="Induk")
parent_kd = colander.SchemaNode(colander.String(),
widget=widget.TextInputWidget(css_class="readonly"),
missing=colander.drop, oid="parent_kd", title="Kode Induk")
......@@ -76,19 +77,13 @@ class AddSchema(colander.Schema):
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('departemen')}/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/departemen.js"}),
values=get_urls(f"{request.route_url('departemen')}/hon/act"))
values=get_urls(f"{request.route_url('departemen')}/hon/act"),
)
if request.user.company_id:
self["company_id"].widget = widget.HiddenWidget()
self["company_id"].default = request.user.company_id
......@@ -101,12 +96,13 @@ class EditSchema(AddSchema):
class ListSchema(colander.Schema):
id = colander.SchemaNode(colander.String(), title="Action", visible=False)
kode = colander.SchemaNode(colander.String(), title="Kode", width='100pt')
kode = colander.SchemaNode(colander.String(), title="Kode")
nama = colander.SchemaNode(colander.String(), title="Nama")
status = colander.SchemaNode(colander.Boolean(), title="Status", width='50pt',
widget=widget.CheckboxWidget())
level_id = colander.SchemaNode(colander.Integer(), title="Level", width='50pt')
parent = colander.SchemaNode(colander.String(), title="Induk", width='200pt')
level_id = colander.SchemaNode(colander.Integer(), title="Level", width='40pt')
parent = colander.SchemaNode(colander.String(), title="Induk")
company_nm = colander.SchemaNode(colander.String(), title="Company")
class ViewDepartemen(BaseView):
......@@ -171,6 +167,15 @@ class ViewDepartemen(BaseView):
for k, v in values.items():
if not v:
setattr(row, k, None)
values["level_id"] = 1
if "parent_id" in values and values["parent_id"]:
qry_parent = self.table.query_id(values["parent_id"])
parent = qry_parent.first()
if parent and parent.level_id:
values["level_id"] = parent.level_id + 1
if "parent_id" not in values:
values["parent_id"] = None
row = super().save_request(values, row)
return row
......@@ -199,9 +204,12 @@ class ViewDepartemen(BaseView):
ColumnDT(Departemen.nama, mData='nama'),
ColumnDT(dep_alias.nama, mData='parent'),
ColumnDT(Departemen.status, mData='status'),
ColumnDT(Departemen.level_id, mData='level_id'), ]
ColumnDT(Departemen.level_id, mData='level_id'),
ColumnDT(ResCompany.nama, mData='company_nm'), ]
query = DBSession.query().select_from(Departemen).outerjoin(
dep_alias, Departemen.parent_id == dep_alias.id)
dep_alias, Departemen.parent_id == dep_alias.id).outerjoin(
ResCompany, self.table.company_id == ResCompany.id
)
query = self.filter_company(query)
row_table = DataTables(request.GET, query, columns)
return row_table.output_result()
......@@ -300,6 +308,9 @@ class ViewDepartemen(BaseView):
r.append(d)
return r
def get_bindings(self, row=None):
return {"company_list": ResCompany.get_list()}
@view_config(route_name='departemen-add', renderer='templates/form.pt',
permission='departemen')
def view_add(self):
......
import colander
import json
from deform import (Form, widget, ValidationFailure, )
from pyramid.httpexceptions import (HTTPFound, )
from deform import (widget, )
from pyramid.view import (view_config, )
from sqlalchemy import or_
from sqlalchemy.orm import aliased
......@@ -11,7 +9,7 @@ from opensipkd.models import DBSession as PartnerDBSession, DBSession, \
from opensipkd.models import Departemen, Jabatan
from opensipkd.models import Partner, PartnerDepartemen
from opensipkd.tools import dmy, date_from_str
from opensipkd.tools.buttons import btn_cancel, btn_save, btn_delete, btn_close
from . import widget_os
from ..views import ColumnDT, DataTables, BaseView
SESS_ADD_FAILED = 'Tambah posisi partner gagal'
......@@ -19,20 +17,26 @@ SESS_EDIT_FAILED = 'Edit posisi partner gagal'
class AddSchema(colander.Schema):
nama_widget = widget.AutocompleteInputWidget(
size=60,
values='/partner/hon/act',
min_length=2,
style="z-index: 100000 !important;")
departemen_widget = widget.AutocompleteInputWidget(
size=60,
values='/departemen/hon/act',
min_length=1)
min_length=2,
style="z-index: 100001 !important;")
nama_widget = widget.AutocompleteInputWidget(
size=60,
values='/partner/hon/act',
min_length=1)
jabatan_widget = widget.AutocompleteInputWidget(
size=60,
values='/jabatan/hon/act',
min_length=1)
min_length=2,
style="z-index: 99999 !important;")
partner_id = colander.SchemaNode(
colander.Integer(),
......@@ -66,11 +70,12 @@ class AddSchema(colander.Schema):
mulai = colander.SchemaNode(
colander.String(),
oid="mulai",
widget=widget.DateInputWidget(format="dd-mm-yyyy"))
widget=widget_os.DateInputWidget(css_class="date", format="dd-mm-yyyy"))
selesai = colander.SchemaNode(
colander.String(),
oid="selesai",
widget=widget.DateInputWidget(format="dd-mm-yyyy"))
widget=widget_os.DateInputWidget(css_class="date", format="dd-mm-yyyy",
style="z-index: 9999 !important;"))
class EditSchema(AddSchema):
......
<html metal:use-macro="load: ./base3.1.pt">
<html metal:use-macro="load: ./base3.1.pt"
tal:define="scripts scripts|scripts" >
<div metal:fill-slot="content">
<div class="panel panel-default">
<div class="panel-heading">
......@@ -12,15 +13,15 @@
<div metal:fill-slot="scripts">
<script>
// $(document).ready(function () {
$(document).ready(function () {
// $(".read-only").attr("readonly", true);
// $(".readonly").attr("readonly", true);
// $(".date").attr("readonly", true);
$(".readonly").attr("readonly", true);
$(".date").attr("readonly", true);
// $(".date").datepicker({
// format: 'dd-mm-yyyy'
// });
<!--? ${structure:scripts}-->
// });
${structure:scripts}
});
</script>
<div metal:define-slot="scripts"></div>
</div>
......
import json
import logging
from colander import SchemaNode, null, Mapping, Invalid #, string_types
from deform.widget import Widget, _StrippedString, Select2Widget, default_resources, \
ResourceRegistry, default_resource_registry
from deform.widget import string_types
from deform.form import Button
from iso8601.iso8601 import ISO8601_REGEX
from deform.i18n import _
from colander import SchemaNode, null, Mapping, Invalid # , string_types
from colander import compat
from deform import widget
from deform.form import Button
from deform.i18n import _
from deform.widget import Widget, _StrippedString, Select2Widget, \
DateInputWidget as WidgetDateInputWidget
from deform.widget import string_types
from iso8601.iso8601 import ISO8601_REGEX
_logging = logging.getLogger(__name__)
......@@ -704,3 +705,7 @@ class TextInputWidget(widget.TextInputWidget):
if isinstance(self.button, compat.string_types):
self.button = Button(self.button, type="button")
class DateInputWidget(WidgetDateInputWidget):
type_name = "text"
......@@ -18,9 +18,11 @@
'${oid}',
function deform_cb(oid) {
if (!Modernizr.inputtypes['date'] ||"${type_name}" != "date" || window.forceDateTimePolyfill){
console.log(${options_json});
$('#' + oid).pickadate(${options_json});
}
}
);
</script>
</div>
from sqlalchemy import Column, String, SmallInteger, Integer, DateTime, ForeignKey
from sqlalchemy.orm import relationship, backref
from .users import User
from .meta import Base
from .base import NamaModel, DefaultModel, DBSession, KodeModel
from .meta import Base
from .partner import Partner
from .users import User
class Route(Base, NamaModel):
......@@ -42,7 +42,14 @@ class UserDeviceModel(Base, KodeModel):
expired = Column(DateTime(timezone=True))
user = relationship(User, backref=backref("devices"))
class ResCompany(Base, NamaModel):
__tablename__ = 'company'
id = Column(Integer, primary_key=True)
partner_id = Column(Integer, ForeignKey(Partner.id))
partner = relationship(Partner, backref=backref("company"))
partner = relationship("Partner", backref=backref("company"))
parent_id = Column(Integer, ForeignKey("company.id"))
children = relationship("ResCompany")
parent = relationship(
"ResCompany", remote_side=[id], primaryjoin="ResCompany.parent_id==ResCompany.id"
)
......@@ -10,6 +10,7 @@ from sqlalchemy.orm import (
backref
)
from . import ResCompany
from ..models import DBSession, Base
from ..models import (NamaModel,
TABLE_ARGS)
......@@ -26,7 +27,7 @@ class Departemen(Base, NamaModel):
level_id = Column(SmallInteger)
children = relationship(
"Departemen", backref=backref('parent', remote_side=[id]))
company_id = Column(Integer)
company_id = Column(Integer, ForeignKey(ResCompany.id))
def get_parents(self, start=False):
allparents = []
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!