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():
def route_from_csv_(self, config, paket="tangsel.base.views", rows=[]):
new_routes = []
for row in rows:
status = row.get("status", 0)
status = row.get("status", 0) or 0
if not row["kode"] or not int(status):
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
from decimal import Decimal
from . import api_messages
from deform import Form
from pyramid.response import Response
from pyramid.exceptions import HTTPNotFound
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:
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.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):
ids = self.id.split(".")
if "after_bind" in kwargs and kwargs["after_bind"]:
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))
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:
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
def query(self, **kw):
......@@ -37,19 +83,19 @@ class ApiViews:
orders = kw.get("orders", self.get_orders)
query = self.db_session.query(table)
if self.id:
query = filter_ids(query)
query = filter_ids(query, table=table)
else:
query = orders(query)
query = orders(query, table=table)
query = query.limit(self.psize).offset(
(self.page - 1) * self.psize)
return query
def success(self, data=[], msg=None):
result = dict(api_messages.SUCCESS)
result["data"] = data
result["error"]["msg"] = msg if msg else "Success"
return result
data = {"data": data}
if msg:
data.update(msg)
return data
def get(self):
query=self.query()
......
......@@ -29,6 +29,7 @@ from .common import DataTables
from ..models import DBSession, Partner
# , get_params, get_urls
from ..scripts.initializedb import append_csv
from ..tools import obj2json
from ...detable import DeTable
from opensipkd.base import BASE_CLASS
from pyramid.csrf import new_csrf_token, get_csrf_token
......@@ -936,23 +937,13 @@ class BaseView(object):
def edit_restrict(self, row):
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):
if values.get("data"):
data = []
for val in values["data"]:
data.append(self.obj2json(val))
data.append(obj2json(val))
values["data"] = data
return Response(json=values)
......
......@@ -23,6 +23,7 @@ import os
import re
from datetime import timedelta, datetime
from importlib import import_module
from opensipkd.base.tools import obj2json
from pyramid.request import Response
import colander
from deform import widget, Form, ValidationFailure, Button
......@@ -363,17 +364,23 @@ def redirect_login(request, user):
headers = get_login_headers(request, user)
request.session.flash("Sukses Login")
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:
return Response(json={
"success": True,
"data": [
{
"permission": user.get_permissions(),
"token": user.security_code
}
],
}, headerlist=headers)
return Response(json=data, headerlist=headers)
if not next_url and request.matched_route.name == 'login':
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!