Refactor JSON serialization in BaseView and user_login, and implement obj2json u…

…tility for consistent data formatting
1 parent 74734adf
...@@ -542,7 +542,7 @@ class BaseApp(): ...@@ -542,7 +542,7 @@ class BaseApp():
def route_from_csv_(self, config, paket="tangsel.base.views", rows=[]): def route_from_csv_(self, config, paket="tangsel.base.views", rows=[]):
new_routes = [] new_routes = []
for row in rows: for row in rows:
status = row.get("status", 0) status = row.get("status", 0) or 0
if not row["kode"] or not int(status): if not row["kode"] or not int(status):
continue continue
......
import colander
from datetime import datetime, date
from decimal import Decimal
def obj2json(values):
for key, val in values.items():
if isinstance(val, datetime):
values[key] = val.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(val, date):
values[key] = val.strftime('%Y-%m-%d')
elif isinstance(val, Decimal):
values[key] = float(val)
elif isinstance(val, colander._null):
values[key] = ""
return values
import datetime import datetime
from decimal import Decimal from decimal import Decimal
from . import api_messages from deform import Form
from pyramid.response import Response from pyramid.response import Response
from pyramid.exceptions import HTTPNotFound from pyramid.exceptions import HTTPNotFound
from opensipkd.base.models import DBSession from opensipkd.base.models import DBSession
from opensipkd.tools.pbb import FixSppt
from opensipkd.tools.buttons import btn_save, btn_cancel
from . import api_messages
...@@ -17,18 +20,61 @@ class ApiViews: ...@@ -17,18 +20,61 @@ class ApiViews:
self.orders = None self.orders = None
self.psize = int(request.params.get("size", 25)) self.psize = int(request.params.get("size", 25))
self.page = int(request.params.get("page", 1)) self.page = int(request.params.get("page", 1))
self.buttons = (btn_save, btn_cancel)
self.bindings = {}
self.form_widget = None
self.autocomplete = True
def get_bindings(self, row=None):
"""Get form bindings for the specified row."""
return {}
def form_validator(self, form, controls):
"""Get Validator Form"""
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel),
**kwargs):
buttons = self.buttons and self.buttons or buttons
if "bindings" in kwargs and kwargs["bindings"]:
bindings = kwargs["bindings"]
elif self.bindings:
bindings = self.bindings
else:
bindings = self.get_bindings(row)
form_params = {}
if "validator" in kwargs and kwargs["validator"]:
form_params["validator"] = kwargs["validator"]
else:
form_params["validator"] = self.form_validator
def filter_ids(self, query): if "after_bind" in kwargs and kwargs["after_bind"]:
ids = self.id.split(".") form_params["after_bind"] = kwargs["after_bind"]
if self.form_widget:
form_params["widget"] = self.form_widget
schema = class_form(**form_params)
schema = schema.bind(request=self.request, **bindings)
schema.request = self.request
if row:
schema.deserialize(row)
return Form(schema, buttons=buttons, autocomplete=self.autocomplete)
def filter_ids(self, query, **kw):
# table = kw.get("table", self.table)
ids = FixSppt(self.id).row_dotted.split(".")
filters = dict(zip(self.pkey, ids)) filters = dict(zip(self.pkey, ids))
return query.filter_by(**filters) return query.filter_by(**filters)
def get_orders(self, query): def get_orders(self, query, **kw):
table = kw.get("table", self.table)
if not self.orders: if not self.orders:
self.orders = self.pkey self.orders = self.pkey
for k in self.orders:
query = query.order_by(getattr(self.table,k)) query = query.order_by(*(getattr(table, k) for k in self.orders))
return query return query
def query(self, **kw): def query(self, **kw):
...@@ -37,19 +83,19 @@ class ApiViews: ...@@ -37,19 +83,19 @@ class ApiViews:
orders = kw.get("orders", self.get_orders) orders = kw.get("orders", self.get_orders)
query = self.db_session.query(table) query = self.db_session.query(table)
if self.id: if self.id:
query = filter_ids(query) query = filter_ids(query, table=table)
else: else:
query = orders(query) query = orders(query, table=table)
query = query.limit(self.psize).offset( query = query.limit(self.psize).offset(
(self.page - 1) * self.psize) (self.page - 1) * self.psize)
return query return query
def success(self, data=[], msg=None): def success(self, data=[], msg=None):
result = dict(api_messages.SUCCESS) data = {"data": data}
result["data"] = data if msg:
result["error"]["msg"] = msg if msg else "Success" data.update(msg)
return result return data
def get(self): def get(self):
query=self.query() query=self.query()
......
...@@ -29,6 +29,7 @@ from .common import DataTables ...@@ -29,6 +29,7 @@ from .common import DataTables
from ..models import DBSession, Partner from ..models import DBSession, Partner
# , get_params, get_urls # , get_params, get_urls
from ..scripts.initializedb import append_csv from ..scripts.initializedb import append_csv
from ..tools import obj2json
from ...detable import DeTable from ...detable import DeTable
from opensipkd.base import BASE_CLASS from opensipkd.base import BASE_CLASS
from pyramid.csrf import new_csrf_token, get_csrf_token from pyramid.csrf import new_csrf_token, get_csrf_token
...@@ -936,23 +937,13 @@ class BaseView(object): ...@@ -936,23 +937,13 @@ class BaseView(object):
def edit_restrict(self, row): def edit_restrict(self, row):
return False return False
def obj2json(self, values):
for key, val in values.items():
if isinstance(val, datetime):
values[key] = val.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(val, date):
values[key] = val.strftime('%Y-%m-%d')
elif isinstance(val, Decimal):
values[key] = float(val)
elif isinstance(val, colander._null):
values[key] = ""
return values
def resp_xhr(self, values): def resp_xhr(self, values):
if values.get("data"): if values.get("data"):
data = [] data = []
for val in values["data"]: for val in values["data"]:
data.append(self.obj2json(val)) data.append(obj2json(val))
values["data"] = data values["data"] = data
return Response(json=values) return Response(json=values)
......
...@@ -23,6 +23,7 @@ import os ...@@ -23,6 +23,7 @@ import os
import re import re
from datetime import timedelta, datetime from datetime import timedelta, datetime
from importlib import import_module from importlib import import_module
from opensipkd.base.tools import obj2json
from pyramid.request import Response from pyramid.request import Response
import colander import colander
from deform import widget, Form, ValidationFailure, Button from deform import widget, Form, ValidationFailure, Button
...@@ -363,17 +364,23 @@ def redirect_login(request, user): ...@@ -363,17 +364,23 @@ def redirect_login(request, user):
headers = get_login_headers(request, user) headers = get_login_headers(request, user)
request.session.flash("Sukses Login") request.session.flash("Sukses Login")
next_url = request.params.get('next') next_url = request.params.get('next')
partner = Partner.query_email(user.email).first()
mobile = partner and partner.mobile or ""
nama = partner and partner.nama or ""
data = {
"data": [
{
"permission": user.get_permissions(),
"token": user.security_code,
"mobile": mobile,
"email": user.email,
"nama": nama,
}
],
}
if request.is_xhr: if request.is_xhr:
return Response(json={ return Response(json=data, headerlist=headers)
"success": True,
"data": [
{
"permission": user.get_permissions(),
"token": user.security_code
}
],
}, headerlist=headers)
if not next_url and request.matched_route.name == 'login': if not next_url and request.matched_route.name == 'login':
url = get_params('modules_default', 'base-home') url = get_params('modules_default', 'base-home')
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!