Commit c453d871 by aagusti

perbaikan module login

1 parent 648628a1
...@@ -74,12 +74,12 @@ group-rpt,/group/{rpt}/rpt,Group Report ...@@ -74,12 +74,12 @@ group-rpt,/group/{rpt}/rpt,Group Report
routes-rpt,/routes/{rpt}/rpt,Routes Report routes-rpt,/routes/{rpt}/rpt,Routes Report
partner,/partner,Partner partner,/partner,Partner
partner-add,/partner/add,Partner Add
partner-act,/partner/{act}/act,Partner Action partner-act,/partner/{act}/act,Partner Action
partner-rpt,/partner/{rpt}/rpt,Partner Report partner-rpt,/partner/{rpt}/rpt,Partner Report
partner-edt,/partner/{id}/edt,Partner Edt partner-edit,/partner/{id}/edit,Partner Edt
partner-view,/partner/{id}/view,Partner view partner-view,/partner/{id}/view,Partner view
partner-del,/partner/{id}/del,Partner Del partner-delete,/partner/{id}/delete,Partner Del
partner-add,/partner/add,Partner Add
departemen,/departemen,Organisasi departemen,/departemen,Organisasi
departemen-act,/departemen/{act}/act,Organisasi Act departemen-act,/departemen/{act}/act,Organisasi Act
......
...@@ -129,6 +129,7 @@ class BaseView(object): ...@@ -129,6 +129,7 @@ class BaseView(object):
self.headers = None self.headers = None
self.bindings = {} self.bindings = {}
self.autocomplete = 'on' self.autocomplete = 'on'
self.action_suffix = "/grid/act"
def delete_msg(self, row): def delete_msg(self, row):
return f'Data ID {row.id} sudah dihapus.' return f'Data ID {row.id} sudah dihapus.'
...@@ -291,6 +292,7 @@ class BaseView(object): ...@@ -291,6 +292,7 @@ class BaseView(object):
def save_request(self, values, row=None): def save_request(self, values, row=None):
params = self.req.params params = self.req.params
for k, v in params.items(): for k, v in params.items():
if k not in values:
if v: if v:
values[k] = v values[k] = v
return self.save(values, self.req.user, row) return self.save(values, self.req.user, row)
...@@ -308,7 +310,6 @@ class BaseView(object): ...@@ -308,7 +310,6 @@ class BaseView(object):
for f in d: for f in d:
if type(d[f]) is str: if type(d[f]) is str:
d[f] = d[f].strip() d[f] = d[f].strip()
return d return d
def get_item_table(self, row=None): def get_item_table(self, row=None):
...@@ -336,8 +337,8 @@ class BaseView(object): ...@@ -336,8 +337,8 @@ class BaseView(object):
form.set_appstruct(e.cstruct) form.set_appstruct(e.cstruct)
return dict(form=form.render(), table=table and table.render() or None, return dict(form=form.render(), table=table and table.render() or None,
scripts=self.form_scripts, css=resources["css"], js=resources["js"]) scripts=self.form_scripts, css=resources["css"], js=resources["js"])
c = dict(controls)
self.save_request(dict(controls), row) self.save_request(c, row)
return self.route_list() return self.route_list()
values = self.get_values(row) values = self.get_values(row)
form.set_appstruct(values) form.set_appstruct(values)
...@@ -354,6 +355,8 @@ class BaseView(object): ...@@ -354,6 +355,8 @@ class BaseView(object):
row = q.first() row = q.first()
if not row: if not row:
return self.id_not_found() return self.id_not_found()
if not self.bindings:
self.bindings = self.get_bindings(row)
if request.POST: if request.POST:
if 'delete' in request.POST: if 'delete' in request.POST:
msg = self.delete_msg(row) msg = self.delete_msg(row)
......
from datetime import datetime
import colander import colander
from deform import ( from deform import (
Form,
widget, widget,
ValidationFailure,
)
from opensipkd.tools.buttons import btn_save, btn_cancel, btn_delete
from pyramid.httpexceptions import (
HTTPFound,
) )
from pyramid.view import ( from pyramid.view import (
view_config, view_config,
) )
from opensipkd.base.models import ( from opensipkd.base.models import (
User, ResProvinsi, ResDati2, ResKecamatan, ResDesa) ResProvinsi, ResDati2, ResKecamatan, ResDesa)
from opensipkd.base.models.common import ResCompany from opensipkd.base.models.common import ResCompany
from .company import company_widget from .company import company_widget
from .partner_base import PartnerSchema from .partner_base import PartnerSchema, NamaSchema
from ..models import DBSession from ..models import DBSession
from ..models import Partner from ..models import Partner
from ..views import ColumnDT, DataTables, BaseView from ..views import BaseView
SESS_ADD_FAILED = 'Tambah partner gagal' SESS_ADD_FAILED = 'Tambah partner gagal'
SESS_EDIT_FAILED = 'Edit partner gagal' SESS_EDIT_FAILED = 'Edit partner gagal'
...@@ -39,6 +31,7 @@ class AddSchema(PartnerSchema): ...@@ -39,6 +31,7 @@ class AddSchema(PartnerSchema):
company_id = colander.SchemaNode( company_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=company_widget, widget=company_widget,
missing=colander.drop,
oid="company_id", oid="company_id",
title="Company") title="Company")
...@@ -56,38 +49,45 @@ class EditSchema(AddSchema): ...@@ -56,38 +49,45 @@ class EditSchema(AddSchema):
) )
class ListSchema(NamaSchema):
id = colander.SchemaNode(colander.String(),
missing=colander.drop,
widget=widget.HiddenWidget(),
)
status = colander.SchemaNode(
colander.Boolean(),
oid="status")
class ViewPartner(BaseView): class ViewPartner(BaseView):
def __init__(self, request):
super().__init__(request)
self.form_params = dict(scripts="")
self.list_url = 'partner'
self.list_route = 'partner'
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = Partner
self.list_schema = ListSchema
######## ########
# List # # List #
######## ########
@view_config(route_name='partner', renderer='templates/partner/list.pt', @view_config(route_name='partner', renderer='templates/table.pt',
permission='user-view') permission='user-view')
def view_list(self): def view_list(self):
return dict() return super().view_list()
@view_config(route_name='partner-act', renderer='json', @view_config(route_name='partner-act', renderer='json',
permission='user-view') permission='user-view')
def view_act(self): def view_act(self):
return super().view_act()
def next_act(self):
request = self.req request = self.req
params = request.params params = request.params
url_dict = request.matchdict url_dict = request.matchdict
if url_dict['act'] == 'hok':
if url_dict['act'] == 'grid':
columns = [
ColumnDT(Partner.id, mData='id'),
ColumnDT(Partner.kode, mData='kode'),
ColumnDT(Partner.nama, mData='nama'),
ColumnDT(Partner.is_vendor, mData='is_vendor'),
ColumnDT(Partner.is_customer, mData='is_customer'),
ColumnDT(Partner.status, mData='status'),
]
query = DBSession.query().select_from(Partner)
if self.req.user.company_id:
query = query.filter(Partner.company_id == self.req.user.company_id)
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 '' term = 'term' in params and params['term'] or ''
prefix = 'prefix' in params and params['prefix'] or '' prefix = 'prefix' in params and params['prefix'] or ''
q = DBSession.query(Partner.id, Partner.kode.label('value'), q = DBSession.query(Partner.id, Partner.kode.label('value'),
...@@ -150,102 +150,29 @@ class ViewPartner(BaseView): ...@@ -150,102 +150,29 @@ class ViewPartner(BaseView):
@view_config(route_name='partner-add', renderer='templates/form_input.pt', @view_config(route_name='partner-add', renderer='templates/form_input.pt',
permission='user-edit') permission='user-edit')
def view_add(self): def view_add(self):
request = self.req return super().view_add()
form = get_form(request, AddSchema)
if request.POST:
if 'save' in request.POST:
controls = request.POST.items()
try:
controls = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form.render(), scripts="")
save_request(request, dict(controls))
return route_list(request)
return dict(form=form.render(), scripts="")
@view_config(route_name='partner-edt', renderer='templates/form_input.pt', @view_config(route_name='partner-edit', renderer='templates/form_input.pt',
permission='user-edit') permission='user-edit')
def view_edt(self): def view_edt(self):
request = self.req return super().view_edit()
q = query_id(request)
row = q.first()
if not row:
return id_not_found(request)
form = get_form(request, EditSchema, row=row)
if request.POST:
if 'save' in request.POST:
controls = request.POST.items()
try:
controls = form.validate(controls)
except ValidationFailure as e:
form.render(appstruct=e.cstruct)
return dict(form=form.render(), scripts="")
save_request(request, dict(controls), row)
return route_list(request)
values = row.to_dict()
form.render(appstruct=values)
return dict(form=form.render(), scripts="")
@view_config(route_name='partner-view', renderer='templates/form_input.pt', @view_config(route_name='partner-view', renderer='templates/form_input.pt',
permission='user-edit') permission='user-edit')
def view_view(self): def view_view(self):
request = self.req return super().view_view()
q = query_id(request)
row = q.first()
if not row:
return id_not_found(request)
form = get_form(request, EditSchema, buttons=(btn_cancel,))
if request.POST:
return route_list(request)
values = row.to_dict()
form.render(appstruct=values)
return dict(form=form.render(readonly=True), scripts="")
@view_config(route_name='partner-del', renderer='templates/form_input.pt', @view_config(route_name='partner-delete', renderer='templates/form_input.pt',
permission='user-edit') permission='user-edit')
def view_del(self): def view_delete(self):
request = self.req return super().view_delete()
q = query_id(request)
row = q.first()
if not row:
return id_not_found(request)
form = get_form(request, EditSchema, buttons=(btn_delete, btn_cancel,))
if request.POST:
if 'delete' in request.POST:
user = User.query(). \
filter_by(partner_id=request.matchdict['id'])
if user.first():
request.session.flash('Partner digunakan oleh User')
return route_list(request)
msg = 'Partner ID %d %s sudah dihapus.' % (row.id, row.nama)
q.delete()
DBSession.flush()
request.session.flash(msg)
return route_list(request)
values = row.to_dict() def form_validator(self, form, value):
form.render(appstruct=values)
return dict(form=form.render(readonly=True), scripts="")
def form_validator(form, value):
def err_kode(): def err_kode():
raise colander.Invalid(form, raise colander.Invalid(form,
'Kode %s sudah digunakan oleh %s' % ( 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama)) value['kode'], found.nama))
# def err_login():
# raise colander.Invalid(form,
# 'Login %s sudah digunakan oleh kode %s' % (
# value['user_nm'], found.row.nama))
if 'id' in form.request.matchdict: if 'id' in form.request.matchdict:
uid = form.request.matchdict['id'] uid = form.request.matchdict['id']
q = DBSession.query(Partner).filter_by(id=uid) q = DBSession.query(Partner).filter_by(id=uid)
...@@ -259,79 +186,22 @@ def form_validator(form, value): ...@@ -259,79 +186,22 @@ def form_validator(form, value):
err_kode() err_kode()
elif found: elif found:
err_kode() err_kode()
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
def get_bindings(self, row=None):
def get_form(request, class_form, row=None, buttons=(btn_save, btn_cancel)):
provinsi_list = ResProvinsi.get_list() provinsi_list = ResProvinsi.get_list()
dati2_list = row and row.provinsi_id and ResDati2.get_list(row.provinsi_id) or [] 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 [] 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 [] desa_list = row and row.kecamatan_id and ResDesa.get_list(row.kecamatan_id) or []
schema = class_form(validator=form_validator) return dict(
schema = schema.bind(
request=request,
provinsi_list=provinsi_list, provinsi_list=provinsi_list,
dati2_list=dati2_list, dati2_list=dati2_list,
kecamatan_list=kecamatan_list, kecamatan_list=kecamatan_list,
desa_list=desa_list, desa_list=desa_list,
company_list=ResCompany.get_list() company_list=ResCompany.get_list()
) )
schema.request = request
return Form(schema, buttons=buttons)
def save(values, user, row=None):
if not row:
row = Partner()
row.created = datetime.now()
row.create_uid = user.id
values['is_vendor'] = 'is_vendor' in values and values['is_vendor'] and 1 or 0
values['is_customer'] = 'is_customer' in values and values['is_customer'] and 1 or 0
row.from_dict(values)
row.updated = datetime.now()
row.update_uid = user.id
row.status = 'status' in values and values['status'] and 1 or row and row.status or 0
DBSession.add(row)
DBSession.flush()
return row
def save_request(request, values, row=None):
if 'id' in request.matchdict:
values['id'] = request.matchdict['id']
row = save(values, request.user, row)
request.session.flash('Partner sudah disimpan.')
def route_list(request):
return HTTPFound(location=request.route_url('partner'))
def session_failed(request, session_name):
r = dict(form=request.session[session_name])
del request.session[session_name]
return r
########
# Edit #
########
def query_id(request):
return DBSession.query(Partner).filter_by(id=request.matchdict['id'])
def id_not_found(request):
msg = 'Partner ID %s Tidak Ditemukan.' % request.matchdict['id']
request.session.flash(msg, 'error')
return route_list(request)
def get_partner_list():
r = []
q = DBSession.query(Partner).order_by(Partner.nama)
for row in q:
g = (str(row.id), (f"{row.kode}/ {row.nama}"))
r.append(g)
return r
@colander.deferred @colander.deferred
......
...@@ -24,7 +24,8 @@ from opensipkd.tools import create_now, get_settings ...@@ -24,7 +24,8 @@ from opensipkd.tools import create_now, get_settings
from opensipkd.tools.api import custom_error from opensipkd.tools.api import custom_error
from opensipkd.base.tools.api import ( from opensipkd.base.tools.api import (
auth_from_rpc, check_token_rpc, update_token) auth_from_rpc, check_token_rpc, update_token)
from ..views.partner import save as save_partner #todo save_partner
# from ..views.partner import save as save_partner
def insert_user(request, values): def insert_user(request, values):
......
...@@ -5,6 +5,7 @@ import re ...@@ -5,6 +5,7 @@ import re
import logging import logging
import colander import colander
import deform
from chameleon.utils import Markup from chameleon.utils import Markup
from deform import compat from deform import compat
from deform import field from deform import field
...@@ -167,10 +168,13 @@ class DeTable(field.Field): ...@@ -167,10 +168,13 @@ class DeTable(field.Field):
d["searchable"] = f.searchable d["searchable"] = f.searchable
data.append(f"searchable: {f.searchable}") data.append(f"searchable: {f.searchable}")
if hasattr(f, 'visible'): if hasattr(f, 'visible') :
d["visible"] = f.visible d["visible"] = f.visible
data.append(f"visible: {f.visible}") data.append(f"visible: {f.visible}")
if isinstance(f.widget,deform.widget.HiddenWidget):
d["visible"] = False
if hasattr(f, 'orderable'): if hasattr(f, 'orderable'):
d["orderable"] = f.orderable d["orderable"] = f.orderable
data.append(f"orderable: {f.orderable}") data.append(f"orderable: {f.orderable}")
...@@ -178,11 +182,10 @@ class DeTable(field.Field): ...@@ -178,11 +182,10 @@ class DeTable(field.Field):
thousand = hasattr(f, 'thousand') and f.thousand or None thousand = hasattr(f, 'thousand') and f.thousand or None
separator = thousand and "separator" in thousand and thousand["separator"] or ',' separator = thousand and "separator" in thousand and thousand["separator"] or ','
decimal = thousand and "decimal" in thousand and thousand["decimal"] or '.' decimal = thousand and "decimal" in thousand and thousand["decimal"] or '.'
point = thousand and "point" in thousand and thousand["point"] or 2 point = thousand and "point" in thousand and thousand["point"] or 0
currency = thousand and "currency" in thousand and thousand["currency"] or "" currency = thousand and "currency" in thousand and thousand["currency"] or ""
if thousand or type(f.typ) == colander.Float() or type(f.typ) == colander.Integer(): if thousand or type(f.typ) == colander.Float() or type(f.typ) == colander.Integer():
d[ d["render"] = f"<script>$.fn.dataTable.render.number( '{separator}', '{decimal}', {point}, '{currency}' )</script>"
"render"] = f"<script>$.fn.dataTable.render.number( '{separator}', '{decimal}', {point}, '{currency}' )</script>"
if 'className' not in d: if 'className' not in d:
d["className"] = "text-right" d["className"] = "text-right"
# if hasattr(f, "edit_link"): # if hasattr(f, "edit_link"):
......
...@@ -36,3 +36,5 @@ class TableWidget(MappingWidget): ...@@ -36,3 +36,5 @@ class TableWidget(MappingWidget):
template = "detable" template = "detable"
readonly_template = "readonly/detable" readonly_template = "readonly/detable"
requirements = (("deform", None),
{"js": "opensipkd.base:static/v3/js/plugin/datatables/jquery.dataTables.min.js"})
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!