Commit 5ee39d73 by aagusti

penambahan view_next

1 parent 1d304fb0
......@@ -2,6 +2,8 @@ import locale
import logging
import re
import colander
try:
from urllib import (urlencode, quote, quote_plus, )
except ImportError:
......@@ -101,6 +103,8 @@ def has_permission_(request, perm_names, context=None):
if request.has_permission(perm_name, context):
return True
def _get_params(request, params, default=None, settings=None, context=None):
return get_params(params, default, settings)
@subscriber(BeforeRender)
def add_global(event):
......@@ -422,16 +426,12 @@ def main(global_config, **settings):
config.add_request_method(is_devel, 'devel', reify=True)
config.add_request_method(get_host, '_host', reify=True)
config.add_request_method(get_home, 'home', reify=True)
# config.add_request_method(api_has_permission_, 'api_has_permission', reify=True)
config.add_request_method(google_signin_client_id,
'google_signin_client_id', reify=True)
config.add_request_method(google_signin_client_ids,
'google_signin_client_ids', reify=True)
config.add_request_method(allow_register, 'allow_register', reify=True)
config.add_request_method(disable_responsive, 'disable_responsive', reify=True)
# config.add_request_method(get_params, 'get_params', reify=True)
# config.add_request_method(get_ini_params, 'get_ini', reify=True)
config.add_request_method(get_ini, 'get_ini', reify=True)
config.add_translation_dirs('opensipkd.base:locale/')
......
# from pyramid_rpc.amfgateway import PyramidGateway
from pyramid_rpc.jsonrpc import jsonrpc_method
from opensipkd.tools.api import JsonRpcInvalidDataError, JsonRpcInvalidLoginError
from opensipkd.tools.api import JsonRpcInvalidData, JsonRpcInvalidLoginError
from ziggurat_foundations.models.services.user import UserService
from opensipkd.models import Partner, User
......
......@@ -6,7 +6,6 @@ from datetime import datetime
from datatables import ColumnDT
from dateutil.relativedelta import relativedelta
from opensipkd.tools.captcha import get_captcha
from pyramid.httpexceptions import HTTPFound
......@@ -209,6 +208,9 @@ class BaseView(object):
def get_bindings(self, row=None):
return {}
def next_view(self, form, **kwargs):
return self.route_list()
def view_view(self): # row = query_id(request).first()
request = self.req
row = self.query_id().first()
......@@ -218,14 +220,16 @@ class BaseView(object):
form = self.get_form(self.edit_schema, buttons=(btn_close,),
bindings=bindings)
if request.POST:
return self.route_list()
result = self.next_view(form)
if result:
return result
form.set_appstruct(self.get_values(row))
table = self.get_item_table(row)
return dict(form=form.render(readonly=True),
table=table and table.render() or None,
scripts=self.form_scripts)
def before_add(self):
return {}
......@@ -254,8 +258,8 @@ class BaseView(object):
columns = []
for d in self.list_schema():
global_search = hasattr(d, "searchable") and \
hasattr(d, "searchable") == False and False \
or True
hasattr(d, "searchable") == False and False \
or True
if hasattr(d, "field"):
if type(d.field) == str:
columns.append(
......
......@@ -139,7 +139,6 @@
window.onload = function (e) {
const value = document.cookie;
const parts = value.split(`g_state=`);
console.log(parts.length)
if (parts.length === 2) {
document.cookie = document.cookie + ";max-age=0";
}
......
......@@ -8,7 +8,7 @@ from opensipkd.base.views.partner_base import NamaSchema
from opensipkd.jsonrpc_auth import JsonRpcInvalidLogin
from opensipkd.tools import create_now
from opensipkd.tools.api import (
JsonRpcInvalidLoginError, JsonRpcInvalidDataError,
JsonRpcInvalidLoginError, JsonRpcInvalidData,
JsonRpcUserNotFoundError)
from pyramid.i18n import TranslationStringFactory
from pyramid.security import remember, forget
......@@ -234,7 +234,7 @@ def set_profile_(request, data):
controls = form.validate(controls)
except ValidationFailure as e:
print(e.error, type(e.error))
raise JsonRpcInvalidDataError(data=e.error.asdict())
raise JsonRpcInvalidData(data=e.error.asdict())
values = dict(controls)
partner = Partner.query().filter_by(email=values["email"]).first()
if not partner:
......
......@@ -275,3 +275,50 @@ class CaptchaWidget(Widget):
if not pstruct:
return null
return pstruct
class ImageWidget(Widget):
"""
Renders an ``<img src="src"/>`` widget.
**Attributes/Arguments**
template
The template name used to render the widget. Default:
``image``.
readonly_template
The template name used to render the widget in read-only mode.
Default: ``readonly/image``.
strip
If true, during deserialization, strip the value of leading
and trailing whitespace (default ``True``).
"""
template = "opensipkd.base:views/widgets/image.pt"
readonly_template = "image"
strip = True
requirements = ()
def __init__(self, **kw):
super().__init__(**kw)
def serialize(self, field, cstruct, **kw):
if cstruct in (null, None):
cstruct = ""
readonly = kw.get("readonly", self.readonly)
template = readonly and self.readonly_template or self.template
values = self.get_template_values(field, cstruct, kw)
return field.renderer(template, **values)
def deserialize(self, field, pstruct):
if pstruct is null:
return null
elif not isinstance(pstruct, string_types):
raise Invalid(field.schema, "Pstruct is not a string")
if self.strip:
pstruct = pstruct.strip()
if not pstruct:
return null
return pstruct
<span tal:define="name name|field.name;
css_class css_class|field.widget.css_class;
oid oid|field.oid;
style style|field.widget.style;
"
tal:omit-tag="">
<img style="height:30px; width:auto; margin-bottom:5px;" src="${cstruct}">
</span>
<span tal:define="name name|field.name;
css_class css_class|field.widget.css_class;
oid oid|field.oid;
style style|field.widget.style;
"
tal:omit-tag="">
<img style="height:30px; width:auto; margin-bottom:5px;" src="${cstruct}">
<input type="text" name="${name}" value=""
tal:attributes="class string: form-control ${css_class or ''};
style style;
attributes|field.widget.attributes|{};"
id="${oid}"/>
<script>
deform.addCallback(
'${oid}',
function (oid) {
$("#" + oid).on('input', function (evt) {
$(this).val(function (_, val) {
return val.toUpperCase();
});
});
});
</script>
</span>
<span tal:define="name name|field.name;
css_class css_class|field.widget.css_class;
oid oid|field.oid;
style style|field.widget.style;
"
tal:omit-tag="">
<img style="height:30px; width:auto; margin-bottom:5px;" src="${cstruct}">
</span>
......@@ -10,6 +10,7 @@ from chameleon.utils import Markup
from deform import compat
from deform import field
from . import widget
# from deform import widget
log = logging.getLogger(__name__)
......@@ -129,7 +130,7 @@ class DeTable(field.Field):
btn_pdf_js = "{window.open(o%sUri+'/pdf/act%s');}" % (tableid, params)
action_suffix = f"{action_suffix}{params}"
field.Field.__init__(self, schema, **kw)
self.request=kw.get("request")
self.request = kw.get("request")
_buttons = []
for button in buttons:
if isinstance(button, compat.string_types):
......@@ -179,31 +180,28 @@ class DeTable(field.Field):
if hasattr(f, 'visible'):
d["visible"] = f.visible
data.append(f"visible: {f.visible}")
if hasattr(f, 'orderable'):
d["orderable"] = f.orderable
data.append(f"orderable: {f.orderable}")
if hasattr(f, "url"):
request=kw.get("request")
request = kw.get("request")
if request:
d["url"]= request.static_url(f.url)
d["url"] = request.static_url(f.url)
log.debug(d["url"])
if hasattr(f, "action"):
d["action"] = f.action
else:
d["action"]=True
d["action"] = True
if isinstance(f.widget, deform.widget.HiddenWidget):
d["visible"] = False
if isinstance(f.widget, deform.widget.CheckboxWidget):
d["checkbox"] = True
else:
d["checkbox"]=False
d["checkbox"] = False
thousand = hasattr(f, 'thousand') and f.thousand or None
separator = thousand and "separator" in thousand and thousand[
......@@ -213,10 +211,11 @@ class DeTable(field.Field):
point = thousand and "point" in thousand and thousand["point"] or 0
currency = thousand and "currency" in thousand and thousand[
"currency"] or ""
if thousand or type(f.typ) == colander.Float() or type(
f.typ) == colander.Integer():
d["render"] = f"<script>$.fn.dataTable.render.number( '{separator}', " \
f"'{decimal}', {point}, '{currency}' )</script>"
if thousand or isinstance(f.typ, colander.Float) or \
isinstance(f.typ, colander.Integer):
d["render"] = \
f"<script>$.fn.dataTable.render.number( '{separator}', " \
f"'{decimal}', {point}, '{currency}' )</script>"
if 'className' not in d:
d["className"] = "text-right"
columns.append(d)
......
import decimal
import json
import logging
from datetime import datetime
import colander
from icecream import ic
from pyramid.httpexceptions import HTTPForbidden
from pyramid.httpexceptions import HTTPNotFound
from pyramid.renderers import null_renderer, render
from pyramid.renderers import null_renderer, render, JSON
from pyramid.response import Response
from pyramid.security import NO_PERMISSION_REQUIRED, remember
from pyramid_rpc.jsonrpc import (
......@@ -255,6 +259,13 @@ class EndpointPredicate(object):
# return a valid JSON-RPC response.
return True
def json_rpc():
json_r = JSON()
json_r.add_adapter(datetime.datetime, lambda v, request: v.isoformat())
json_r.add_adapter(datetime.date, lambda v, request: v.isoformat())
json_r.add_adapter(decimal.Decimal, lambda v, request: str(v))
json_r.add_adapter(colander.null, lambda v, request: None)
return json_r
def includeme(config):
""" Set up standard configurator registrations. Use via:
......
......@@ -33,7 +33,7 @@ requires = [
'google-api-python-client',
'google',
'pyjwt',
'z3c.rml',
# 'z3c.rml',
'opensipkd-tools @git+https://git.opensipkd.com/aa.gusti/opensipkd-tools.git',
]
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!