Commit 2202f042 by aa.gusti

penambahan routes

1 parent 37c7afb0
...@@ -3,14 +3,12 @@ import importlib ...@@ -3,14 +3,12 @@ import importlib
import inspect import inspect
import locale import locale
import logging import logging
from sqlalchemy import or_
import re import re
import urllib
from .routes import routes from .routes import routes
# from opensipkd.tools.captcha import get_captcha_url
try: try:
from urllib import (urlencode, quote, quote_plus, ) from urllib import (urlencode, quote, quote_plus, )
except ImportError: except ImportError:
...@@ -24,13 +22,13 @@ from pyramid.renderers import JSON ...@@ -24,13 +22,13 @@ from pyramid.renderers import JSON
from pyramid_mailer import mailer_factory_from_settings from pyramid_mailer import mailer_factory_from_settings
import datetime import datetime
import decimal import decimal
from sqlalchemy import engine_from_config, or_ from sqlalchemy import engine_from_config
from .security import ( from .security import (
group_finder, get_user, MySecurityPolicy,) get_user, MySecurityPolicy,)
from pyramid.csrf import get_csrf_token from pyramid.csrf import get_csrf_token
from opensipkd.models import ( from opensipkd.models import (
DBSession, Base, Parameter, init_model,) DBSession, Base, Parameter, init_model, Route,)
# Route,
from opensipkd.tools import ( from opensipkd.tools import (
DefaultTimeZone, money, should_int, thousand, as_timezone, split, DefaultTimeZone, money, should_int, thousand, as_timezone, split,
get_settings, dmy, dmyhms,) get_settings, dmy, dmyhms,)
...@@ -444,36 +442,43 @@ def get_home(request): ...@@ -444,36 +442,43 @@ def get_home(request):
return request.route_url('home')[:-1] return request.route_url('home')[:-1]
# def _set_routes1(config, app_id): def _set_routes1(config, app_id):
# q = DBSession.query(Route).filter(Route.path != None, q = DBSession.query(Route).filter(Route.path != None,
# Route.module == None, Route.status == 1) Route.module == None, Route.status == 1)
# if not app_id: if not app_id:
# q.filter(or_(Route.app_id == 0, None == Route.app_id)) q.filter(or_(Route.app_id == 0, None == Route.app_id))
# else: else:
# q.filter(Route.app_id == app_id) q.filter(Route.app_id == app_id)
# for route in q: for route in q:
# if route.type == 0: if route.type == 0:
# config.add_route(route.kode, route.path) config.add_route(route.kode, route.path)
# if route.nama: if route.nama:
# titles[route.kode] = route.nama titles[route.kode] = route.nama
# elif route.type == 1: elif route.type == 1:
# config.add_jsonrpc_endpoint(route.kode, route.path, config.add_jsonrpc_endpoint(route.kode, route.path,
# default_renderer="json_rpc") default_renderer="json_rpc")
# def _set_routes2(config, module="base"): def _set_routes2(config, module="base"):
# q = DBSession.query(Route).filter( q = DBSession.query(Route).filter(
# Route.module == module, Route.status == 1) Route.module == module, Route.status == 1)
# for route in q: for route in q:
# if route.type == 0: if route.type == 0:
# config.add_route(route.kode, route.path) config.add_route(route.kode, route.path)
# if route.nama: if route.nama:
# titles[route.kode] = route.nama titles[route.kode] = route.nama
# elif route.type == 1: elif route.type == 1:
# config.add_jsonrpc_endpoint( config.add_jsonrpc_endpoint(
# route.kode, route.path, default_renderer="json_rpc") route.kode, route.path, default_renderer="json_rpc")
# return q return q
def set_routes(config, app_id=None):
if app_id and type(app_id) == str:
return _set_routes2(config, app_id)
else:
return _set_routes1(config, app_id)
def _add_route(config, route): def _add_route(config, route):
...@@ -553,13 +558,6 @@ def _add_view_config(config, view_name, route): ...@@ -553,13 +558,6 @@ def _add_view_config(config, view_name, route):
# config.scan('.') # config.scan('.')
# def set_routes(config, app_id=None):
# if app_id and type(app_id) == str:
# return _set_routes2(config, app_id)
# else:
# return _set_routes1(config, app_id)
def get_route_names(rows): def get_route_names(rows):
return [r.kode for r in rows if not r.is_menu] return [r.kode for r in rows if not r.is_menu]
...@@ -724,6 +722,10 @@ def get_route_file(filename): ...@@ -724,6 +722,10 @@ def get_route_file(filename):
return open(fullpath) return open(fullpath)
def routes_by_array(config, routs):
BaseApp().route_from_list(config, routs)
class BaseApp(): class BaseApp():
def __init__(self): def __init__(self):
self.menus = [] self.menus = []
...@@ -768,8 +770,8 @@ class BaseApp(): ...@@ -768,8 +770,8 @@ class BaseApp():
route["is_menu"] = route.get("is_menu", 0) route["is_menu"] = route.get("is_menu", 0)
url_path = route.get("path", None) url_path = route.get("path", None)
if not url_path: if not url_path:
# pjdl /pjdl pjdl-add /pjdl/add
url_path = "/"+route["kode"].replace("-", "/") url_path = "/"+route["kode"].replace("-", "/")
route["path"] = url_path route["path"] = url_path
children = route.get("children", []) children = route.get("children", [])
...@@ -795,4 +797,4 @@ class BaseApp(): ...@@ -795,4 +797,4 @@ class BaseApp():
return self.menus return self.menus
BASE_CLASS = BaseApp()
\ No newline at end of file \ No newline at end of file
BASE_CLASS = BaseApp()
# kode, path, nama
routes = [ routes = [
("user-area", "/user/area", "User Area"), ("user-area", "/user/area", "User Area"),
("user-area-add", "/user/area/add", "Tambah User Area"), ("user-area-add", "/user/area/add", "Tambah User Area"),
...@@ -5,12 +6,16 @@ routes = [ ...@@ -5,12 +6,16 @@ routes = [
("user-area-delete", "/user/area/{id}/delete", "Hapus User Area"), ("user-area-delete", "/user/area/{id}/delete", "Hapus User Area"),
("user-area-view", "/user/area/{id}/view", "Lihat User Area"), ("user-area-view", "/user/area/{id}/view", "Lihat User Area"),
("user-area-act", "/user/area/{act}/act", "Action User Area"), ("user-area-act", "/user/area/{act}/act", "Action User Area"),
("user-area-upload", "/user/area/upload", "Upload User Area"), ("user-area-upload", "/user/area/upload", "Upload User Area"),
("user-departemen", "/user/departemen", "User Departemen"), ("user-departemen", "/user/departemen", "User Departemen"),
("user-departemen-add", "/user/departemen/add", "Tambah User Departemen"), ("user-departemen-add", "/user/departemen/add", "Tambah User Departemen"),
("user-departemen-edit", "/user/departemen/{id}/edit", "Edit User Departemen"), ("user-departemen-edit",
("user-departemen-delete", "/user/departemen/{id}/delete", "Hapus User Departemen"), "/user/departemen/{id}/edit", "Edit User Departemen"),
("user-departemen-view", "/user/departemen/{id}/view", "Lihat User Departemen"), ("user-departemen-delete",
("user-departemen-act", "/user/departemen/{act}/act", "Action User Departemen"), "/user/departemen/{id}/delete", "Hapus User Departemen"),
("user-departemen-view",
"/user/departemen/{id}/view", "Lihat User Departemen"),
("user-departemen-act",
"/user/departemen/{act}/act", "Action User Departemen"),
("user-departemen-upload", "/user/departemen/upload", "Upload User Departemen"), ("user-departemen-upload", "/user/departemen/upload", "Upload User Departemen"),
]
\ No newline at end of file \ No newline at end of file
]
...@@ -2,7 +2,8 @@ from datetime import datetime ...@@ -2,7 +2,8 @@ from datetime import datetime
import colander import colander
from deform import (widget, ) from deform import (widget, )
from opensipkd.models import DBSession, Departemen, Partner, PartnerDepartemen, ResCompany from opensipkd.models import (
DBSession, Departemen, Partner, PartnerDepartemen, ResCompany)
from opensipkd.tools import (get_settings) from opensipkd.tools import (get_settings)
from opensipkd.tools.buttons import btn_upload from opensipkd.tools.buttons import btn_upload
from pyramid.view import (view_config, ) from pyramid.view import (view_config, )
...@@ -40,43 +41,91 @@ def departemen_widget_form(): ...@@ -40,43 +41,91 @@ def departemen_widget_form():
) )
dep_alias = aliased(Departemen)
class ListSchema(colander.Schema):
id = colander.SchemaNode(
colander.String(),
title="Action",
visible=False)
kode = colander.SchemaNode(
colander.String()
)
nama = colander.SchemaNode(
colander.String(),
)
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",
field=dep_alias.nama)
company_nm = colander.SchemaNode(
colander.String(),
title="Company",
field=ResCompany.nama)
class AddSchema(colander.Schema): class AddSchema(colander.Schema):
parent_id = colander.SchemaNode( parent_id = colander.SchemaNode(
colander.Integer(), colander.Integer(),
widget=widget.HiddenWidget(), oid="parent_id", missing=colander.drop, widget=widget.HiddenWidget(),
missing=colander.drop,
oid="parent_id",
) )
parent_nm = colander.SchemaNode( parent_nm = colander.SchemaNode(
colander.String(), missing=colander.drop, colander.String(), missing=colander.drop,
widget=widget.AutocompleteInputWidget( widget=widget.AutocompleteInputWidget(
size=60, min_length=3, size=60,
min_length=3,
requirements=(("typeahead", None), ("deform", None), requirements=(("typeahead", None), ("deform", None),
{"js": "opensipkd.base:static/js/form/departemen.js"}), {"js": "opensipkd.base:static/js/form/departemen.js"}),
# options={"allowClear": True} # options={"allowClear": True}
), ),
oid="parent_nm", title="Induk") oid="parent_nm", title="Induk")
parent_kd = colander.SchemaNode(colander.String(), parent_kd = colander.SchemaNode(
widget=widget.TextInputWidget(css_class="readonly"), colander.String(),
missing=colander.drop, oid="parent_kd", title="Kode Induk") widget=widget.TextInputWidget(css_class="readonly"),
missing=colander.drop,
kode = colander.SchemaNode(colander.String(), oid="parent_kd", title="Kode Induk")
validator=colander.Length(max=32), oid="kode")
kode = colander.SchemaNode(
nama = colander.SchemaNode(colander.String(), oid="nama") colander.String(),
validator=colander.Length(max=32),
singkat = colander.SchemaNode(colander.String(), missing=colander.drop, oid="kode")
oid="singkat")
nama = colander.SchemaNode(
kategori = colander.SchemaNode(colander.String(), missing=colander.drop, colander.String(),
oid="kategori") validator=colander.Length(max=128),
oid="nama")
alamat = colander.SchemaNode(colander.String(), missing=colander.drop,
oid="alamat") singkat = colander.SchemaNode(
company_id = colander.SchemaNode(colander.Integer(), colander.String(),
widget=company_widget, missing=colander.drop,
missing=colander.drop, oid="singkat")
oid="company_id")
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( status = colander.SchemaNode(
colander.Integer(), colander.Integer(),
...@@ -85,12 +134,13 @@ class AddSchema(colander.Schema): ...@@ -85,12 +134,13 @@ class AddSchema(colander.Schema):
def after_bind(self, schema, kwargs): def after_bind(self, schema, kwargs):
request = kwargs["request"] request = kwargs["request"]
self["parent_nm"].widget = widget.AutocompleteInputWidget( self["parent_nm"].widget.values = f"{request.route_url('departemen')}/hon/act"
size=60, min_length=3, # self["parent_nm"].widget = widget.AutocompleteInputWidget(
requirements=(("typeahead", None), ("deform", None), # size=60, min_length=3,
{"js": "opensipkd.base:static/js/form/departemen.js"}), # requirements=(("typeahead", None), ("deform", None),
values=get_urls(f"{request.route_url('departemen')}/hon/act"), # {"js": "opensipkd.base:static/js/form/departemen.js"}),
) # values=f"{request.route_url('departemen')}/hon/act",
# )
if request.user.company_id: if request.user.company_id:
self["company_id"].widget = widget.HiddenWidget() self["company_id"].widget = widget.HiddenWidget()
...@@ -98,37 +148,34 @@ class AddSchema(colander.Schema): ...@@ -98,37 +148,34 @@ class AddSchema(colander.Schema):
class EditSchema(AddSchema): class EditSchema(AddSchema):
id = colander.SchemaNode(colander.String(), missing=colander.drop, id = colander.SchemaNode(
widget=widget.HiddenWidget(readonly=True)) colander.Integer(),
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 ViewDepartemen(BaseView): class Views(BaseView):
def __init__(self, request): def __init__(self, request):
super(ViewDepartemen, self).__init__(request) super().__init__(request)
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.table = Departemen self.table = Departemen
# self.list_url = 'departemen'
self.list_route = 'departemen' self.list_route = 'departemen'
self.form_scripts = "" self.form_scripts = ""
self.list_buttons = self.list_buttons + (btn_upload,) self.list_buttons = self.list_buttons + (btn_upload,)
def view_buttons(self, row):
buttons = super().view_buttons()
return buttons + (btn_upload,)
def form_validator(self, form, value): def form_validator(self, form, value):
def err_kode(): def err_kode():
raise colander.Invalid(form, 'Kode %s sudah digunakan oleh %s' % ( msg = 'Kode %s sudah digunakan oleh %s' % (
value['kode'], found.nama)) value['kode'], found.nama)
exc = colander.Invalid(form, msg)
exc["kode"] = msg
raise exc
def err_nama(): def err_nama():
raise colander.Invalid(form, raise colander.Invalid(form,
...@@ -183,15 +230,18 @@ class ViewDepartemen(BaseView): ...@@ -183,15 +230,18 @@ class ViewDepartemen(BaseView):
parent = qry_parent.first() parent = qry_parent.first()
if parent and parent.level_id: if parent and parent.level_id:
values["level_id"] = parent.level_id + 1 values["level_id"] = parent.level_id + 1
if "parent_id" not in values: if "parent_id" not in values:
values["parent_id"] = None values["parent_id"] = None
row = super().save_request(values, row) row = super().save_request(values, row)
return row return row
@view_config(route_name='departemen-view', @view_config(route_name='departemen-view',
renderer='templates/form.pt', permission='departemen') renderer='templates/form.pt',
permission='departemen')
def view_view(self): def view_view(self):
return super(ViewDepartemen, self).view_view() return super().view_view()
@view_config(route_name='departemen', @view_config(route_name='departemen',
renderer='templates/table.pt', renderer='templates/table.pt',
...@@ -199,31 +249,40 @@ class ViewDepartemen(BaseView): ...@@ -199,31 +249,40 @@ class ViewDepartemen(BaseView):
def view_list(self): def view_list(self):
return super().view_list() return super().view_list()
def list_join(self, query):
query = query.outerjoin(
dep_alias, Departemen.parent_id == dep_alias.id)\
.outerjoin(
ResCompany, self.table.company_id == ResCompany.id
)
return query
@view_config(route_name='departemen-act', renderer='json', @view_config(route_name='departemen-act', renderer='json',
permission='view') permission='view')
def view_act(self): def view_act(self):
request = self.req request = self.req
ses = request.session # ses = request.session
params = request.params params = request.params
url_dict = request.matchdict url_dict = request.matchdict
dep_alias = aliased(Departemen) # dep_alias = aliased(Departemen)
if url_dict['act'] == 'grid': # if url_dict['act'] == 'grid':
columns = [ColumnDT(Departemen.id, mData='id'), # columns = [ColumnDT(Departemen.id, mData='id'),
ColumnDT(Departemen.kode, mData='kode'), # ColumnDT(Departemen.kode, mData='kode'),
ColumnDT(Departemen.nama, mData='nama'), # ColumnDT(Departemen.nama, mData='nama'),
ColumnDT(dep_alias.nama, mData='parent'), # ColumnDT(dep_alias.nama, mData='parent'),
ColumnDT(Departemen.status, mData='status'), # 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'), ] # ColumnDT(ResCompany.nama, mData='company_nm'), ]
query = DBSession.query().select_from(Departemen).outerjoin( # query = DBSession.query().select_from(Departemen).outerjoin(
dep_alias, Departemen.parent_id == dep_alias.id).outerjoin( # dep_alias, Departemen.parent_id == dep_alias.id).outerjoin(
ResCompany, self.table.company_id == ResCompany.id # ResCompany, self.table.company_id == ResCompany.id
) # )
query = self.filter_company(query) # query = self.filter_company(query)
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'] == 'hon': # el
if url_dict['act'] == 'hon':
term = 'term' in params and params['term'] or '' term = 'term' in params and params['term'] or ''
q = DBSession.query(Departemen). \ q = DBSession.query(Departemen). \
filter(Departemen.status == 1, filter(Departemen.status == 1,
...@@ -245,7 +304,7 @@ class ViewDepartemen(BaseView): ...@@ -245,7 +304,7 @@ class ViewDepartemen(BaseView):
q = DBSession.query(Departemen) \ q = DBSession.query(Departemen) \
.filter(Departemen.status == 1, .filter(Departemen.status == 1,
func.concat(Departemen.nama, ';', func.concat(Departemen.nama, ';',
Departemen.kode) \ Departemen.kode)
.ilike('%%%s%%' % term)) \ .ilike('%%%s%%' % term)) \
.order_by(Departemen.nama) .order_by(Departemen.nama)
q = self.filter_company(q) q = self.filter_company(q)
...@@ -316,6 +375,8 @@ class ViewDepartemen(BaseView): ...@@ -316,6 +375,8 @@ class ViewDepartemen(BaseView):
level_id=k.level_id) level_id=k.level_id)
r.append(d) r.append(d)
return r return r
else:
return super().view_act()
def get_bindings(self, row=None): def get_bindings(self, row=None):
return {"company_list": ResCompany.get_list()} return {"company_list": ResCompany.get_list()}
...@@ -323,17 +384,17 @@ class ViewDepartemen(BaseView): ...@@ -323,17 +384,17 @@ class ViewDepartemen(BaseView):
@view_config(route_name='departemen-add', renderer='templates/form.pt', @view_config(route_name='departemen-add', renderer='templates/form.pt',
permission='departemen') permission='departemen')
def view_add(self): def view_add(self):
return super(ViewDepartemen, self).view_add() return super().view_add()
@view_config(route_name='departemen-edit', @view_config(route_name='departemen-edit',
renderer='templates/form.pt', permission='departemen') renderer='templates/form.pt', permission='departemen')
def view_edit(self): def view_edit(self):
return super(ViewDepartemen, self).view_edit() return super().view_edit()
@view_config(route_name='departemen-delete', @view_config(route_name='departemen-delete',
renderer='templates/form.pt', permission='departemen') renderer='templates/form.pt', permission='departemen')
def view_delete(self): def view_delete(self):
return super(ViewDepartemen, self).view_delete() return super().view_delete()
@view_config(route_name='departemen-upload', @view_config(route_name='departemen-upload',
renderer='templates/form.pt', renderer='templates/form.pt',
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!