Refactor ApiViews initialization and enhance request handling; remove duplicate …

…before_delete method in Views class
1 parent ed1f2f78
......@@ -359,7 +359,7 @@ def _add_route(config, route):
_logging.warning(f"Route {route.get('kode')} sudah ada di titles")
return
if int(route.get("typ", 0)) == 0:
if int(route.get("typ", 0)) in [0,2]:
config.add_route(route.get("kode"), route.get("path"))
elif int(route.get("typ")) == 1:
......@@ -379,11 +379,21 @@ def _add_view_config(config, paket, route):
# _logging.debug(f"File Name: {file_name}")
attr = f"{route.get('func_name')}"
try:
_views = importlib.import_module(file_name)
class_name = route.get("class_name", None)
if not file_name:
_logging.error(f"File not found: {file_name}")
return
_views = importlib.import_module(file_name)
if not class_name:
class_name = "Views"
if not hasattr(_views, class_name):
_logging.error(
f"Class {class_name} not found in {file_name}")
return
views = getattr(_views, class_name)
template = route.get("template", "form.pt")
if not template:
......@@ -407,9 +417,12 @@ def _add_view_config(config, paket, route):
params["require_csrf"] = True
if route.get("request_method"):
params["request_method"] = route.get("request_method")
config.add_view(views, **params)
if route.get("typ")==2:
params.pop("attr", None)
params.pop("renderer", None)
config.add_view(views.as_view(), **params)
else:
config.add_view(views, **params)
except Exception as e:
_logging.error("Add View Config :{code} Kode {error}"
......
......@@ -8,21 +8,34 @@ from opensipkd.tools.buttons import btn_save, btn_cancel
from . import api_messages
from ..tools import obj2json
from pyramid.response import Response
class ApiViews:
def __init__(self, request):
self.request = request
self.id = self.request.matchdict.get("id")
from pyramid_restful.views import APIView
class ApiViews(APIView):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.request = kwargs.get("request", None)
self.db_session = DBSession
self.buttons = (btn_save, btn_cancel)
self.table = None
self.pkey = ("id")
self.orders = None
self.psize = int(request.params.get("size", 25))
self.page = int(request.params.get("page", 1))
self.buttons = (btn_save, btn_cancel)
self.bindings = {}
self.form_widget = None
self.id = -1
self.autocomplete = True
self.form_widget = None
self.psize = 25
self.page =1
# def __init__(self, request):
# self.request = request
# self.id = self.request.matchdict.get("id")
def obj2json(self, obj):
return obj2json(obj)
......@@ -83,6 +96,9 @@ class ApiViews:
return query
def query(self, **kw):
self.psize = int(self.request.params.get("size", 25))
self.page = int(self.request.params.get("page", 1))
table = kw.get("table", self.table)
get_filters = kw.get("filters", self.get_filters)
get_joins = kw.get("joins", self.get_joins)
......@@ -108,14 +124,15 @@ class ApiViews:
query = get_groups(query, **kw)
query = get_filters(query, **kw)
query = get_orders(query, **kw)
query = query.limit(self.psize).offset(
(self.page - 1) * self.psize)
return query
return self.query(**kw)
def success(self, data=[], msg=None):
if type(data) is not list:
def success(self, data, msg=None):
"""
Mengubah data menjadi list dan convert objek menjadi string
"""
if not isinstance(data, list):
data = [data]
for i, item in enumerate(data):
data[i] = self.obj2json(item)
......@@ -124,7 +141,8 @@ class ApiViews:
data.update(msg)
return data
def get(self):
def get(self, request, *args, **kwargs):
self.request = request
query=self.query()
if not query.first():
return HTTPNotFound()
......@@ -140,13 +158,13 @@ class ApiViews:
data.append(d)
return Response(json=self.success(data=data))
def post(self, data):
self.request = data
def post(self, request, *args, **kwargs):
self.request = request
return self.request
def delete(self):
query = self.db_session.query(self.table)
query = self.filter_ids(query)
# query = self.filter_ids(query)
row = query.first()
if not row:
return HTTPNotFound()
......
......@@ -286,8 +286,6 @@ class Views(BaseView):
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
def before_delete(self, row):
PartnerFiles.query().filter_by(partner_id=row.id).delete()
@colander.deferred
def partner_widget(node, kw):
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!