Aktiasi Kembali Prvinsi, Departemen, Dati2, Kecamatan dan Desa

1 parent 9c3865e3
...@@ -39,3 +39,46 @@ base-groups-upload,/groups/upload,base,groups,,,,admin,base-groups,Groups Uload, ...@@ -39,3 +39,46 @@ base-groups-upload,/groups/upload,base,groups,,,,admin,base-groups,Groups Uload,
base-upload-logo,/upload/logo,,,,,,admin,base-admin,Upload Logo,1,0,,1,upload.pt,1 base-upload-logo,/upload/logo,,,,,,admin,base-admin,Upload Logo,1,0,,1,upload.pt,1
googleOauth2,/googleOauth2,,,,,,,,Google Oauth2,1,1,,0,json, googleOauth2,/googleOauth2,,,,,,,,Google Oauth2,1,1,,0,json,
googlesignin,/googlesignin,base,,,,1,,,GoogleSignIn,1,1,,0,json, googlesignin,/googlesignin,base,,,,1,,,GoogleSignIn,1,1,,0,json,
base-departemen,/departemen,base,departemen,,view_list,,admin,base-admin,Departemen,1,0,,1,form.pt,
base-departemen-act,/departemen/{act}/act,base,departemen,,,,admin,base-departemen,Departemen Action,1,0,,,json,
base-departemen-add,/departemen/add,base,departemen,,,,admin,base-departemen,Departemen Add,1,0,,,form6.pt,
base-departemen-edit,/departemen/{id}/edit,base,departemen,,,,admin,base-departemen,Departemen Edit,1,0,,,form6.pt,
base-departemen-view,/departemen/{id}/view,base,departemen,,,,admin,base-departemen,Departemen View,1,0,,,form6.pt,
base-departemen-delete,/departemen/{id}/delete,base,departemen,,,,admin,base-departemen,Departemen Delete,1,0,,,form6.pt,
base-departemen-upload,/departemen/upload,base,departemen,,,,admin,base-departemen,Departemen Uload,1,0,,,form6.pt,
base-provinsi,/provinsi,base,provinsi,,view_list,,admin,base-admin,Provinsi,1,0,,1,form.pt,
base-provinsi-act,/provinsi/{act}/act,base,provinsi,,,,admin,base-provinsi,Provinsi Action,1,0,,,json,
base-provinsi-add,/provinsi/add,base,provinsi,,,,admin,base-provinsi,Provinsi Add,1,0,,,form6.pt,
base-provinsi-edit,/provinsi/{id}/edit,base,provinsi,,,,admin,base-provinsi,Provinsi Edit,1,0,,,form6.pt,
base-provinsi-view,/provinsi/{id}/view,base,provinsi,,,,admin,base-provinsi,Provinsi View,1,0,,,form6.pt,
base-provinsi-delete,/provinsi/{id}/delete,base,provinsi,,,,admin,base-provinsi,Provinsi Delete,1,0,,,form6.pt,
base-provinsi-upload,/provinsi/upload,base,provinsi,,,,admin,base-provinsi,Provinsi Uload,1,0,,,form6.pt,
base-dati2,/dati2,base,dati2,,view_list,,admin,base-admin,Dati2,1,0,,1,form.pt,
base-dati2-act,/dati2/{act}/act,base,dati2,,,,admin,base-dati2,Dati2 Action,1,0,,,json,
base-dati2-add,/dati2/add,base,dati2,,,,admin,base-dati2,Dati2 Add,1,0,,,form6.pt,
base-dati2-edit,/dati2/{id}/edit,base,dati2,,,,admin,base-dati2,Dati2 Edit,1,0,,,form6.pt,
base-dati2-view,/dati2/{id}/view,base,dati2,,,,admin,base-dati2,Dati2 View,1,0,,,form6.pt,
base-dati2-delete,/dati2/{id}/delete,base,dati2,,,,admin,base-dati2,Dati2 Delete,1,0,,,form6.pt,
base-dati2-upload,/dati2/upload,base,dati2,,,,admin,base-dati2,Dati2 Uload,1,0,,,form6.pt,
base-kecamatan,/kecamatan,base,kecamatan,,view_list,,admin,base-admin,Kecamatan,1,0,,1,form.pt,
base-kecamatan-act,/kecamatan/{act}/act,base,kecamatan,,,,admin,base-kecamatan,Kecamatan Action,1,0,,,json,
base-kecamatan-add,/kecamatan/add,base,kecamatan,,,,admin,base-kecamatan,Kecamatan Add,1,0,,,form6.pt,
base-kecamatan-edit,/kecamatan/{id}/edit,base,kecamatan,,,,admin,base-kecamatan,Kecamatan Edit,1,0,,,form6.pt,
base-kecamatan-view,/kecamatan/{id}/view,base,kecamatan,,,,admin,base-kecamatan,Kecamatan View,1,0,,,form6.pt,
base-kecamatan-delete,/kecamatan/{id}/delete,base,kecamatan,,,,admin,base-kecamatan,Kecamatan Delete,1,0,,,form6.pt,
base-kecamatan-upload,/kecamatan/upload,base,kecamatan,,,,admin,base-kecamatan,Kecamatan Uload,1,0,,,form6.pt,
base-desa,/desa,base,desa,,view_list,,admin,base-admin,Desa,1,0,,1,form.pt,
base-desa-act,/desa/{act}/act,base,desa,,,,admin,base-desa,Desa Action,1,0,,,json,
base-desa-add,/desa/add,base,desa,,,,admin,base-desa,Desa Add,1,0,,,form6.pt,
base-desa-edit,/desa/{id}/edit,base,desa,,,,admin,base-desa,Desa Edit,1,0,,,form6.pt,
base-desa-view,/desa/{id}/view,base,desa,,,,admin,base-desa,Desa View,1,0,,,form6.pt,
base-desa-delete,/desa/{id}/delete,base,desa,,,,admin,base-desa,Desa Delete,1,0,,,form6.pt,
base-desa-upload,/desa/upload,base,desa,,,,admin,base-desa,Desa Uload,1,0,,,form6.pt,
base-user-area,/user/area,base,user_area,,view_list,,admin,base-admin,User-area,1,0,,1,form.pt,
base-user-area-act,/user/area/{act}/act,base,user_area,,,,admin,base-user-area,User-area Action,1,0,,,json,
base-user-area-add,/user/area/add,base,user_area,,,,admin,base-user-area,User-area Add,1,0,,,form6.pt,
base-user-area-edit,/user/area/{id}/edit,base,user_area,,,,admin,base-user-area,User-area Edit,1,0,,,form6.pt,
base-user-area-view,/user/area/{id}/view,base,user_area,,,,admin,base-user-area,User-area View,1,0,,,form6.pt,
base-user-area-delete,/user/area/{id}/delete,base,user_area,,,,admin,base-user-area,User-area Delete,1,0,,,form6.pt,
$(document).ready(function () {
$('#parent_nm').bind('typeahead:selected', function (obj, datum, name) {
$('#parent_id').val(datum.id);
$('#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 \ No newline at end of file
...@@ -730,6 +730,7 @@ class BaseView(object): ...@@ -730,6 +730,7 @@ class BaseView(object):
bindings = self.get_bindings() bindings = self.get_bindings()
form = self.get_form(self.upload_schema, bindings=bindings) form = self.get_form(self.upload_schema, bindings=bindings)
kw["table"] = table
if self.req.POST: if self.req.POST:
if 'save' in self.req.POST: if 'save' in self.req.POST:
# _here = get_params('temp_files', '/tmp') # _here = get_params('temp_files', '/tmp')
...@@ -743,21 +744,20 @@ class BaseView(object): ...@@ -743,21 +744,20 @@ class BaseView(object):
file_name = upload.save(self.req, "upload", exts) file_name = upload.save(self.req, "upload", exts)
except: except:
self.ses.flash(f'File harus format {exts}', 'error') self.ses.flash(f'File harus format {exts}', 'error')
return self.returned_form(form, table, **kw) return self.returned_form(form, **kw)
fullpath = os.path.join(folder, file_name) fullpath = os.path.join(folder, file_name)
try: try:
self.save_upload(fullpath, **kw) self.save_upload(fullpath, **kw)
except Exception as e: except Exception as e:
self.req.session.flash(str(e), 'error') self.req.session.flash(str(e), 'error')
return self.returned_form(form, table, **kw) return self.returned_form(form, **kw)
elif "cancel" in self.req.POST or 'batal' in self.req.POST or "close" in self.req.POST: elif "cancel" in self.req.POST or 'batal' in self.req.POST or "close" in self.req.POST:
self.cancel_act() self.cancel_act()
return self.route_list() return self.route_list()
return self.returned_form(form, **kw)
return self.returned_form(form, table, **kw)
def get_file(self, filename): def get_file(self, filename):
return open(filename) return open(filename)
......
import colander
from deform import (widget, )
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from ..widgets 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 Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
# self.list_url = 'dati2'
self.list_route = 'base-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())
def list_join(self, query):
return query.join(ResProvinsi, ResProvinsi.id == ResDati2.provinsi_id)
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-upload',
# renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super().view_upload(exts=(".csv", ".tsv"))
# @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()
# @view_config(route_name='dati2-act', renderer='json')
# def view_act(self):
# return super().view_act()
# @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()
from datetime import datetime
import colander
from deform import (widget, )
from opensipkd.models import DBSession, Departemen, Partner
# , PartnerDepartemen
# , ResCompany
from opensipkd.tools import (get_settings)
from opensipkd.tools.buttons import btn_upload
from pyramid.view import (view_config, )
from sqlalchemy import func
from sqlalchemy.orm import aliased
# from .company import company_widget
from .. import get_params
from ..views import ColumnDT, DataTables, BaseView
# , get_urls
SESS_ADD_FAILED = 'Tambah departemen gagal'
SESS_EDIT_FAILED = 'Edit departemen gagal'
def get_departemen_list():
r = [("", "--Pilih Departemen--")]
q = DBSession.query(Departemen).order_by(Departemen.nama)
for row in q:
g = (str(row.id), (f"{row.kode}/ {row.nama}"))
r.append(g)
return r
@colander.deferred
def departemen_widget(node, kw):
values = kw.get('departemen_list', [])
return widget.Select2Widget(values=values, placeholder="Pilih Departemen")
def departemen_widget_form():
return widget.AutocompleteInputWidget(
size=60, min_length=3,
requirements=(("typeahead", None), ("deform", None),
{"js": "opensipkd.base:static/js/form/departemen_form.js"}),
)
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/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")
kode = colander.SchemaNode(colander.String(),
validator=colander.Length(max=32), oid="kode")
nama = colander.SchemaNode(colander.String(), oid="nama")
singkat = colander.SchemaNode(colander.String(), missing=colander.drop,
oid="singkat")
kategori = colander.SchemaNode(colander.String(), missing=colander.drop,
oid="kategori")
alamat = colander.SchemaNode(colander.String(), missing=colander.drop,
oid="alamat")
# company_id = colander.SchemaNode(colander.Integer(),
# widget=company_widget,
# missing=colander.drop,
# oid="company_id")
status = colander.SchemaNode(colander.Boolean(), oid="status")
def after_bind(self, schema, kwargs):
request = kwargs["request"]
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=f"{request.route_url('base-departemen')}/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.String(), title="Action", visible=False)
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='40pt')
parent = colander.SchemaNode(colander.String(), title="Induk")
# company_nm = colander.SchemaNode(colander.String(), title="Company")
class Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.list_schema = ListSchema
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Departemen
# self.list_url = 'departemen'
self.list_route = 'base-departemen'
self.form_scripts = ""
self.list_buttons = self.list_buttons + (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 = self.table.query().filter_by(id=uid)
current = q.first()
else:
current = None
found = self.table.query().filter_by(kode=value['kode']).first()
# if "company_id" in value and value["company_id"]:
# found = found.filter_by(company_id=value["company_id"]).first()
# else:
# found = self.filter_company(found).first()
# if current:
# if found and found.id != current.id:
# err_kode()
# elif found:
# err_kode()
found = Departemen.query_nama(value['nama'])
# if "company_id" in value and value["company_id"]:
# found = found.filter_by(company_id=value["company_id"]).first()
# else:
# found = self.filter_company(found).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
DBSession.add(child)
DBSession.flush()
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)
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
# @view_config(route_name='departemen-view',
# renderer='templates/form.pt', permission='departemen')
# def view_view(self):
# return super(ViewDepartemen, self).view_view()
# @view_config(route_name='departemen',
# renderer='templates/table.pt',
# permission='departemen')
# def view_list(self):
# return super().view_list()
# @view_config(route_name='departemen-act', renderer='json',
# permission='view')
# def view_act(self):
# request = self.req
# ses = request.session
# params = request.params
# url_dict = request.matchdict
# dep_alias = aliased(Departemen)
# if url_dict['act'] == 'grid':
# columns = [ColumnDT(Departemen.id, mData='id'),
# ColumnDT(Departemen.kode, mData='kode'),
# ColumnDT(Departemen.nama, mData='nama'),
# ColumnDT(dep_alias.nama, mData='parent'),
# ColumnDT(Departemen.status, mData='status'),
# 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).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()
# elif url_dict['act'] == 'hon':
# term = 'term' in params and params['term'] or ''
# q = DBSession.query(Departemen). \
# filter(Departemen.status == 1,
# Departemen.nama.ilike('%%%s%%' % term)) \
# .order_by(
# Departemen.nama)
# if self.req.user.company_id:
# q = q.filter(Departemen.company_id == self.req.user.company_id)
# rows = q.all()
# r = []
# for k in rows:
# d = dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama,
# level_id=k.level_id)
# r.append(d)
# return r
# elif url_dict['act'] == 'honk':
# term = 'term' in params and params['term'] or ''
# q = DBSession.query(Departemen) \
# .filter(Departemen.status == 1,
# func.concat(Departemen.nama, ';',
# Departemen.kode)
# .ilike('%%%s%%' % term)) \
# .order_by(Departemen.nama)
# q = self.filter_company(q)
# rows = q.all()
# r = []
# for k in rows:
# d = dict(id=k.id, value=k.nama + ';' + k.kode, kode=k.kode,
# nama=k.nama, level_id=k.level_id)
# r.append(d)
# return r
# elif url_dict['act'] == 'hon_level':
# # todo Check ulang untuk hon
# term = 'term' in params and params['term'] or ''
# settings = get_settings()
# level_id = get_params('departemen_chg_id', 0)
# q = DBSession.query(Departemen).filter(Departemen.status == 1,
# Departemen.nama.ilike(
# '%%%s%%' %
# term)).order_by(
# Departemen.nama)
# if self.req.user.company_id:
# q = q.filter(Departemen.company_id == self.req.user.company_id)
# if int(level_id) > 0:
# q = q.filter(Departemen.level_id == int(level_id))
# if request.user.id > 1 and not request.has_permission(
# "departemen-all"):
# partner = Partner.query_id(request.user.id).first()
# if partner:
# PartnerDepartemen.query_jabatan(partner.id, datetime.now())
# user_dep = PartnerDepartemen.query_user_id().first()
# if not user_dep:
# return []
# kode = user_dep.departemen.kode
# if user_dep.sub_departemen:
# q = q.filter(Departemen.kode.ilike('{}%'.format(kode)))
# else:
# q = q.filter(Departemen.kode == kode)
# rows = q.all()
# r = []
# for k in rows:
# d = dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama,
# level_id=k.level_id)
# r.append(d)
# return r
# elif url_dict['act'] == 'hon_all':
# term = 'term' in params and params['term'] or ''
# settings = get_settings()
# level_id = 'departemen_chg_id' in settings and settings[
# 'departemen_chg_id'] or 0
# q = DBSession.query(Departemen).filter(Departemen.status == 1,
# Departemen.nama.ilike(
# '%%%s%%' %
# term)).order_by(
# Departemen.nama)
# if self.req.user.company_id:
# q = q.filter(Departemen.company_id == self.req.user.company_id)
# if int(level_id) > 0:
# q = q.filter(Departemen.level_id == int(level_id))
# rows = q.all()
# r = []
# for k in rows:
# d = dict(id=k.id, value=k.nama, kode=k.kode, nama=k.nama,
# level_id=k.level_id)
# 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):
# return super(ViewDepartemen, self).view_add()
# @view_config(route_name='departemen-edit',
# renderer='templates/form.pt', permission='departemen')
# def view_edit(self):
# return super(ViewDepartemen, self).view_edit()
# @view_config(route_name='departemen-delete',
# renderer='templates/form.pt', permission='departemen')
# def view_delete(self):
# return super(ViewDepartemen, self).view_delete()
# @view_config(route_name='departemen-upload',
# renderer='templates/form.pt',
# permission='departemen')
# def view_upload(self):
# return super().view_upload(exts=('.csv', '.tsv'), delimiter="\t")
# request = self.req
# form = self.get_form(UploadSchema)
# if request.POST:
# if 'save' in request.POST:
# input_file = request.POST['upload'].file
# filename = request.POST['upload'].filename
# ext = get_ext(filename)
# if ext.lower() != '.csv':
# request.session.flash('File harus format csv', 'error')
# return dict(form=form.render())
# if not input_file:
# return dict(form=form.render())
# input_file.seek(0)
# temp_file_path = '/tmp/' + get_random_string(10) + '.csv'
#
# with open(temp_file_path, 'wb') as output_file:
# shutil.copyfileobj(input_file, output_file)
#
# with open(temp_file_path) as f:
# c = csv.DictReader(f)
# for csv_row in c:
# kode = csv_row['kode']
# if kode:
# xcode = kode.split(".")
# for r in range(len(xcode)):
# xc = xcode[r] and int(xcode[r])
# if not xc and type(xc) == int:
# code = ""
# for t in range(r):
# code += xcode[t] + '.'
#
# if code:
# code = code[:-1]
# self.save_upload(code, csv_row)
#
# self.save_upload(kode, csv_row)
#
# DBSession.flush()
# os.remove(temp_file_path)
#
# return self.route_list()
# return dict(form=form.render())
def get_values(self, row, values=None):
if not values:
values = row.to_dict()
if 'parent_id' in values and values['parent_id']:
parent = row.parent
values["parent_nm"] = parent.nama
values["parent_kd"] = parent.kode
return values
# def save_upload(self, kode, csv_row):
# row = Departemen.query_kode(kode).first()
# if not row:
# row = Departemen()
# row.created = datetime.now()
# row.create_uid = self.req.user.id
# row.level_id = kode.count('.') + 1
# row.status = 1
# else:
# row.updated = datetime.now()
# row.update_uid = self.req.user.id
# row.kode = kode
# row.nama = csv_row['nama']
# DBSession.add(row)
# return row
import colander
from deform import (widget, )
from opensipkd.models import DBSession, ResDesa, kategori_desa, ResKecamatan, ResProvinsi, ResDati2
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 ..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 Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_route = 'base-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().view_upload(exts=('.csv', ".tsv"))
import colander
from deform import (widget, )
from opensipkd.base.views.provinsi import provinsi_widget
from opensipkd.models import DBSession, ResKecamatan, ResDati2, ResProvinsi
from opensipkd.tools.buttons import btn_upload, btn_close, btn_add
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from ..widgets 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_route = 'base-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()
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
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
def list_join(self, query):
return query.join(ResDati2, ResDati2.id == ResKecamatan.dati2_id)
# @view_config(route_name='kecamatan-upload',
# renderer='templates/form.pt', permission='wilayah')
def view_upload(self):
return super().view_upload(exts=(".csv", ".tsv"))
# @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()
# @view_config(route_name='kecamatan-add',
# renderer='templates/form.pt', permission='wilayah')
# def view_add(self):
# return super(Views, self).view_add()
# @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()
import colander
from deform import (widget, )
from pyramid.i18n import TranslationStringFactory
from pyramid.view import (view_config, )
from ..widgets 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 Views(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_scripts = ""
self.form_params = dict(scripts="")
self.list_route = 'base-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()
def view_upload(self):
return super().view_upload(exts=(".csv", ".tsv"))
# @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()
...@@ -27,16 +27,21 @@ class ListSchema(colander.Schema): ...@@ -27,16 +27,21 @@ class ListSchema(colander.Schema):
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
user_id = colander.SchemaNode( user_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
# widget=widget.SelectWidget(values=User.get_list()), widget=widget.SelectWidget(), # (values=User.get_list()
oid="user_id", oid="user_id",
title="User", title="User",
) )
desa_id = colander.SchemaNode( desa_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
# widget=widget.SelectWidget(values=ResDesa.get_list()), widget=widget.SelectWidget(), # values=ResDesa.get_list()
oid="desa_id", oid="desa_id",
title="Kelurahan/Desa", ) title="Kelurahan/Desa", )
def after_bind(self, schema, kw):
user_list = User.get_list()
desa_list = ResDesa.get_list()
schema['user_id'].widget.values = user_list
schema['desa_id'].widget.values = desa_list
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), id = colander.SchemaNode(colander.String(),
...@@ -50,7 +55,7 @@ class Views(BaseView): ...@@ -50,7 +55,7 @@ class Views(BaseView):
self.list_schema = ListSchema self.list_schema = ListSchema
self.add_schema = AddSchema self.add_schema = AddSchema
self.edit_schema = EditSchema self.edit_schema = EditSchema
self.list_route = 'user-area' self.list_route = 'base-user-area'
self.table = UserArea self.table = UserArea
def list_join(self, query, **kwargs): def list_join(self, query, **kwargs):
...@@ -86,3 +91,4 @@ class Views(BaseView): ...@@ -86,3 +91,4 @@ class Views(BaseView):
# permission='user-edit') # permission='user-edit')
# def view_edit(self): # def view_edit(self):
# return super().view_edit() # return super().view_edit()
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!