Commit 5bdff039 by aa.gusti

perubahan loading routes and menus

1 parent 5a28fb38
import csv
import importlib import importlib
import inspect import inspect
import locale import locale
...@@ -26,7 +27,8 @@ from .security import ( ...@@ -26,7 +27,8 @@ from .security import (
group_finder, get_user, MySecurityPolicy,) group_finder, 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, Route, Parameter, init_model,) DBSession, Base, Parameter, init_model,)
# 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,)
...@@ -133,6 +135,7 @@ def _get_params(request, params, default=None, settings=None, context=None): ...@@ -133,6 +135,7 @@ def _get_params(request, params, default=None, settings=None, context=None):
return get_params(params, default, settings) return get_params(params, default, settings)
BASE_MENUS=[]
@subscriber(BeforeRender) @subscriber(BeforeRender)
def add_global(event): def add_global(event):
...@@ -152,8 +155,9 @@ def add_global(event): ...@@ -152,8 +155,9 @@ def add_global(event):
event['get_urls'] = get_urls event['get_urls'] = get_urls
event['get_csrf_token'] = get_csrf_token event['get_csrf_token'] = get_csrf_token
# event['get_params'] = get_params # event['get_params'] = get_params
event['get_module_menus'] = get_module_menus # event['get_module_menus'] = get_module_menus
event['get_module_submenus'] = get_module_submenus # event['get_module_submenus'] = get_module_submenus
event['get_base_menus'] = BASE_CLASS.get_menus()
# def get_params(request, params, alternate=None, settings=None): # def get_params(request, params, alternate=None, settings=None):
...@@ -436,46 +440,50 @@ def get_home(request): ...@@ -436,46 +440,50 @@ 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 _add_view_config(config, view_name, route): def _add_route(config, route):
if route.get("type") == 0: if int(route.get("type",0)) == 0:
config.add_route(route.get("kode"), route.get("path")) config.add_route(route.get("kode"), route.get("path"))
if route.get("nama"): elif int(route.get("type")) == 1:
titles[route.get("kode")] = route.get("nama")
elif route.get("type") == 1:
config.add_jsonrpc_endpoint(route.get("kode"), route.get("path"), config.add_jsonrpc_endpoint(route.get("kode"), route.get("path"),
default_renderer="json_rpc") default_renderer="json_rpc")
if route.get("nama"):
titles[route.get("kode")] = route.get("nama")
def _add_view_config(config, view_name, route):
_add_route(config, route)
if not route.get("def_func"): if not route.get("def_func"):
return return
...@@ -498,53 +506,53 @@ def _add_view_config(config, view_name, route): ...@@ -498,53 +506,53 @@ def _add_view_config(config, view_name, route):
_logging.error(str(e)) _logging.error(str(e))
_logging.error(route) _logging.error(route)
def add_view_config(config, module, view_name): # def add_view_config(config, module, view_name):
""" # """
Digunakan untuk mengenerate view_config berdasarkan tabel Routes # Digunakan untuk mengenerate view_config berdasarkan tabel Routes
config: config # config: config
module: application module # module: application module
views: class or file tobe imported # views: class or file tobe imported
""" # """
q = DBSession.query(Route).filter( # q = DBSession.query(Route).filter(
Route.module == module, Route.status == 1) # Route.module == module, Route.status == 1)
for row in q.all(): # for row in q.all():
if row.type == 0: # if row.type == 0:
config.add_route(row.kode, row.path) # config.add_route(row.kode, row.path)
if row.nama: # if row.nama:
titles[row.kode] = row.nama # titles[row.kode] = row.nama
elif row.type == 1: # elif row.type == 1:
config.add_jsonrpc_endpoint(row.kode, row.path, # config.add_jsonrpc_endpoint(row.kode, row.path,
default_renderer="json_rpc") # default_renderer="json_rpc")
if not row.def_func: # if not row.def_func:
continue # continue
class_view = row.class_view and f".{row.class_view}" or "" # class_view = row.class_view and f".{row.class_view}" or ""
class_name = f"{view_name}{class_view}" # class_name = f"{view_name}{class_view}"
attr = f"view_{row.def_func}" # attr = f"view_{row.def_func}"
try: # try:
_views = importlib.import_module(class_name) # _views = importlib.import_module(class_name)
views = _views # views = _views
if row.template == "json": # if row.template == "json":
renderers = row.template # renderers = row.template
else: # else:
renderers = "views/templates/" + row.template # renderers = "views/templates/" + row.template
params = dict(attr=f"{attr}", route_name=row.kode, # params = dict(attr=f"{attr}", route_name=row.kode,
renderer=renderers) # renderer=renderers)
if row.permission: # if row.permission:
params["permission"] = row.permission # params["permission"] = row.permission
config.add_view(views.Views, **params) # config.add_view(views.Views, **params)
except Exception as e: # except Exception as e:
_logging.error(str(e)) # _logging.error(str(e))
_logging.error(dict(row.__dict__)) # _logging.error(dict(row.__dict__))
config.scan('.') # config.scan('.')
def set_routes(config, app_id=None): # def set_routes(config, app_id=None):
if app_id and type(app_id) == str: # if app_id and type(app_id) == str:
return _set_routes2(config, app_id) # return _set_routes2(config, app_id)
else: # else:
return _set_routes1(config, app_id) # return _set_routes1(config, app_id)
def get_route_names(rows): def get_route_names(rows):
...@@ -565,22 +573,22 @@ def get_children(rows): ...@@ -565,22 +573,22 @@ def get_children(rows):
) for r in rows if r.is_menu and r.status == 1] ) for r in rows if r.is_menu and r.status == 1]
def get_module_menus(module): # def get_module_menus(module):
query = DBSession.query(Route) \ # query = DBSession.query(Route) \
.filter(Route.module == module, # .filter(Route.module == module,
Route.is_menu == 1, # Route.is_menu == 1,
Route.parent_id == None) # Route.parent_id == None)
result = get_children(query.order_by(Route.order_id)) # result = get_children(query.order_by(Route.order_id))
# _logging.debug(result) # # _logging.debug(result)
return result # return result
def get_module_submenus(parent_id): # def get_module_submenus(parent_id):
q = DBSession.query(Route) \ # q = DBSession.query(Route) \
.filter(Route.parent_id == parent_id) \ # .filter(Route.parent_id == parent_id) \
.order_bY(Route.order_id) # .order_bY(Route.order_id)
return [r.kode for r in q.all()] # return [r.kode for r in q.all()]
partner_idcard_url = 'partner/idcard' partner_idcard_url = 'partner/idcard'
...@@ -610,8 +618,6 @@ def get_config(settings): ...@@ -610,8 +618,6 @@ def get_config(settings):
config.add_request_method(is_devel, 'devel', reify=True) config.add_request_method(is_devel, 'devel', reify=True)
config.add_request_method(get_host, '_host', reify=True) config.add_request_method(get_host, '_host', reify=True)
config.add_request_method(get_host, 'home', reify=True) config.add_request_method(get_host, 'home', reify=True)
# config.add_request_method(get_captcha_url, 'captcha', reify=True)
# config.add_request_method(get_urls, 'route_urls', reify=True)
config.add_request_method(google_signin_client_id, config.add_request_method(google_signin_client_id,
'google_signin_client_id', reify=True) 'google_signin_client_id', reify=True)
config.add_request_method(google_signin_client_ids, config.add_request_method(google_signin_client_ids,
...@@ -661,8 +667,10 @@ def get_config(settings): ...@@ -661,8 +667,10 @@ def get_config(settings):
config.add_renderer('json', json_renderer()) config.add_renderer('json', json_renderer())
config.add_renderer('json_rpc', json_rpc()) config.add_renderer('json_rpc', json_rpc())
config.registry['mailer'] = mailer_factory_from_settings(settings) config.registry['mailer'] = mailer_factory_from_settings(settings)
set_routes(config) # set_routes(config)
routes_by_array(config) BASE_CLASS.route_from_csv(config)
BASE_CLASS.route_from_list(config)
# routes_by_array(config)
config.scan() config.scan()
_logging.debug(config) _logging.debug(config)
return config return config
...@@ -705,12 +713,71 @@ def main(global_config, **settings): ...@@ -705,12 +713,71 @@ def main(global_config, **settings):
return get_config(settings=settings).make_wsgi_app() return get_config(settings=settings).make_wsgi_app()
def routes_by_array(config, routs=routes):
# New Routes By Array def get_route_file(filename):
base_dir = os.path.split(__file__)[0]
fullpath = os.path.join(base_dir, 'scripts', 'data', filename)
return open(fullpath)
class BaseApp():
def __init__(self):
self.menus = []
def route_from_csv(self, config, get_file=get_route_file):
with get_file("routes.csv") as f:
rows = csv.DictReader(f)
self.add_menu(config, rows)
def route_from_list(self, config, routs=routes):
new_routes = []
for route in routs: for route in routs:
if len(route) > 4 and str(route[4]) == '1': d = {"kode": route[0],
config.add_jsonrpc_endpoint( "path": route[1],
route[0], route[1], default_renderer="json_rpc") "nama": route[2],
"type": len(route)>4 and route[4] or 0
}
new_routes.append(d)
self.add_menu(config, new_routes)
def add_menu(self, config, route_menus, parent=None):
route_names = []
for route in route_menus:
route["route_names"]=[route["kode"]]
route["permission"] = route.get("permission", "")
route["icon"] = route.get("icon", None)
route_type = route.get("type", 0)
if route_type=="" or route_type==None:
route_type = 0
else:
route_type = int(route_type)
route["type"] = route_type
route["is_menu"] = route.get("is_menu", 0)
route["path"] = route.get("path", "#")
children = route.get("children", [])
route["children"]=[]
if route.get("class_view"):
_add_view_config(config, "opensipkd.coba.views", route)
elif route["path"] != "#":
_add_route(config, route)
if route.get("is_menu", None):
if not parent:
self.menus.append(route)
else: else:
config.add_route(route[0], route[1]) parent["children"].append(route)
titles[route[0]] = route[2] if children:
route["route_names"].extend(
self.add_menu(config, children, route)
)
route_names.append(route["kode"])
return route_names
def get_menus(self):
return self.menus
BASE_CLASS = BaseApp()
...@@ -69,7 +69,6 @@ parameter-act,/parameter/{act}/act,Act parameter, ...@@ -69,7 +69,6 @@ parameter-act,/parameter/{act}/act,Act parameter,
upload-logo,/upload/logo,Unggah Logo, upload-logo,/upload/logo,Unggah Logo,
upload-background,/upload/background,Unggah Background, upload-background,/upload/background,Unggah Background,
user-rpt,/user/{rpt}/rpt,Urser Report, user-rpt,/user/{rpt}/rpt,Urser Report,
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-add,/partner/add,Partner Add,
...@@ -97,7 +96,6 @@ departemen-user-rpt,/departemen/user/{rpt}/rpt,User Organisasi Report,1,0, ...@@ -97,7 +96,6 @@ departemen-user-rpt,/departemen/user/{rpt}/rpt,User Organisasi Report,1,0,
rpc-user,/rpc/user,WebService User Management,1,1, rpc-user,/rpc/user,WebService User Management,1,1,
recreate-api-key,/recreate-api-key,Buat ulang API Key,1, recreate-api-key,/recreate-api-key,Buat ulang API Key,1,
googleOauth2,/googleOauth2,'Google OAuth2',1 googleOauth2,/googleOauth2,'Google OAuth2',1
googleOauth2,/googleOauth2,'Google OAuth2',1
googlesignin,/googlesignin, "Google SignIn",1 googlesignin,/googlesignin, "Google SignIn",1
permission,/permission,Daftar Permission,1 permission,/permission,Daftar Permission,1
permission-add,/permission/add,Tambah Permission,1 permission-add,/permission/add,Tambah Permission,1
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!