Commit 336c590b by aagusti

perbaikan base_view

1 parent f08d1cd8
...@@ -152,7 +152,7 @@ class User(UserMixin, BaseModel, CommonModel, Base): ...@@ -152,7 +152,7 @@ class User(UserMixin, BaseModel, CommonModel, Base):
class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base): class ExternalIdentity(ExternalIdentityMixin, CommonModel, Base):
pass user = relationship(User, backref=backref("external"))
# class GroupRoutePermission(Base, CommonModel): # class GroupRoutePermission(Base, CommonModel):
......
...@@ -112,11 +112,9 @@ class BaseView(object): ...@@ -112,11 +112,9 @@ class BaseView(object):
self.add_schema = "" self.add_schema = ""
self.table = "" self.table = ""
self.home = self.req.route_url('home')[:-1] self.home = self.req.route_url('home')[:-1]
self.form_validator = None
self.buttons = None self.buttons = None
self.headers = None self.headers = None
self.bindings = None
def route_list(self, msg=None, error=""): def route_list(self, msg=None, error=""):
if msg: if msg:
...@@ -126,7 +124,6 @@ class BaseView(object): ...@@ -126,7 +124,6 @@ class BaseView(object):
else: else:
return HTTPFound(location=self.req.route_url(self.list_route)) return HTTPFound(location=self.req.route_url(self.list_route))
def form_validator(self, form, value): def form_validator(self, form, value):
pass pass
...@@ -134,15 +131,13 @@ class BaseView(object): ...@@ -134,15 +131,13 @@ class BaseView(object):
return get_params(params) return get_params(params)
def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **bindings): def get_form(self, class_form, row=None, buttons=(btn_save, btn_cancel), **bindings):
if self.buttons: buttons = self.buttons and self.buttons or buttons
buttons = self.buttons bindings = self.bindings and self.bindings or bindings
schema = class_form(validator=self.form_validator) schema = class_form(validator=self.form_validator)
schema = schema.bind(request=self.req, schema = schema.bind(request=self.req, **bindings)
row=row,
**bindings)
schema.request = self.req schema.request = self.req
# if row: if row:
# schema.deserialize(row) schema.deserialize(row)
return Form(schema, buttons=buttons) return Form(schema, buttons=buttons)
def session_failed(self, session_name): def session_failed(self, session_name):
...@@ -150,7 +145,8 @@ class BaseView(object): ...@@ -150,7 +145,8 @@ class BaseView(object):
del self.req.session[session_name] del self.req.session[session_name]
return r return r
def view_list(self, arg=dict()): def view_list(self, arg=None):
arg = not arg and {} or arg
arg.update(url=self.list_url, col_defs=self.list_col_defs, arg.update(url=self.list_url, col_defs=self.list_col_defs,
cols=self.list_cols, buttons=self.list_buttons) cols=self.list_cols, buttons=self.list_buttons)
return arg return arg
...@@ -160,28 +156,32 @@ class BaseView(object): ...@@ -160,28 +156,32 @@ class BaseView(object):
row = self.query_id().first() row = self.query_id().first()
if not row: if not row:
return self.id_not_found() return self.id_not_found()
bindings = self.get_bindings() bindings = hasattr(self, "get_bindings") and self.get_bindings() or None
form = self.get_form(self.edit_schema, buttons=(btn_close,), **bindings) form = self.get_form(self.edit_schema, buttons=(btn_close,), bindings=bindings)
if request.POST: if request.POST:
return self.route_list() return self.route_list()
form.set_appstruct(self.get_values(row)) form.set_appstruct(self.get_values(row))
table = self.get_item_table(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) return dict(form=form.render(readonly=True), table=table and table.render() or None,
scripts=self.form_scripts)
def before_add(self, form): def before_add(self, form):
return form return form
def validation_failure(self, value):
return value
def view_add(self): def view_add(self):
bindings = self.get_bindings() form = self.get_form(self.add_schema)
form = self.get_form(self.add_schema, **bindings)
if self.req.POST: if self.req.POST:
if 'save' in self.req.POST: if 'save' in self.req.POST:
controls = self.req.POST.items() controls = self.req.POST.items()
try: try:
controls = form.validate(controls) controls = form.validate(controls)
except ValidationFailure as e: except ValidationFailure as e:
form.render(appstruct=e.cstruct) value = self.validation_failure(e.cstruct)
form.render(appstruct=value)
return dict(form=form.render(), scripts=self.form_scripts) return dict(form=form.render(), scripts=self.form_scripts)
self.save_request(dict(controls)) self.save_request(dict(controls))
return self.route_list() return self.route_list()
...@@ -235,11 +235,9 @@ class BaseView(object): ...@@ -235,11 +235,9 @@ class BaseView(object):
return d return d
def get_bindings(self):
return {}
def get_item_table(self, row=None): def get_item_table(self, row=None):
return None return
def before_edit(self, form): def before_edit(self, form):
return form return form
...@@ -248,8 +246,8 @@ class BaseView(object): ...@@ -248,8 +246,8 @@ class BaseView(object):
row = self.query_id().first() row = self.query_id().first()
if not row: if not row:
return self.id_not_found() return self.id_not_found()
bindings = self.get_bindings()
form = self.get_form(self.edit_schema, **bindings) form = self.get_form(self.edit_schema)
if request.POST: if request.POST:
if 'save' in request.POST: if 'save' in request.POST:
controls = request.POST.items() controls = request.POST.items()
...@@ -271,7 +269,6 @@ class BaseView(object): ...@@ -271,7 +269,6 @@ class BaseView(object):
request = self.req request = self.req
q = self.query_id() q = self.query_id()
row = q.first() row = q.first()
if not row: if not row:
return self.id_not_found() return self.id_not_found()
if request.POST: if request.POST:
...@@ -281,8 +278,7 @@ class BaseView(object): ...@@ -281,8 +278,7 @@ class BaseView(object):
DBSession.flush() DBSession.flush()
request.session.flash(msg) request.session.flash(msg)
return self.route_list() return self.route_list()
bindings = self.get_bindings() form = self.get_form(self.edit_schema, buttons=(btn_delete, btn_cancel))
form = self.get_form(self.edit_schema, buttons=(btn_delete, btn_cancel), **bindings)
form.set_appstruct(self.get_values(row)) form.set_appstruct(self.get_values(row))
table = self.get_item_table(row) table = self.get_item_table(row)
return dict(form=form.render(), table=table and table.render() or None, scripts=self.form_scripts) return dict(form=form.render(), table=table and table.render() or None, scripts=self.form_scripts)
......
...@@ -446,6 +446,10 @@ class RegistrasiAdd(BaseView): ...@@ -446,6 +446,10 @@ class RegistrasiAdd(BaseView):
permission='view') permission='view')
def es_reg_edt(self): def es_reg_edt(self):
request = self.req request = self.req
register_form = get_params("register_form")
if register_form:
return HTTPFound(location=request.route_url(register_form))
ses = request.session ses = request.session
query = query_id(request) query = query_id(request)
row = query.first() row = query.first()
......
...@@ -145,9 +145,11 @@ ...@@ -145,9 +145,11 @@
<i <i
class="fa fa-angle-down"></i> </a> class="fa fa-angle-down"></i> </a>
<ul class="dropdown-menu pull-right"> <ul class="dropdown-menu pull-right">
<li><a style="text-transform:capitalize" href="${request.route_url('logout')}">Logout</a></li> <li><a style="text-transform:capitalize" href="${request.route_url('profile')}">Profile</a></li>
<li><a style="text-transform:capitalize" href="${request.route_url('password')}">Ubah password</a> <li tal:condition="not request.user.external">
<a style="text-transform:capitalize" href="${request.route_url('password')}">Ubah password</a>
</li> </li>
<li><a style="text-transform:capitalize" href="${request.route_url('logout')}">Logout</a></li>
<li tal:condition="request.user.api_key"><a <li tal:condition="request.user.api_key"><a
style="text-transform:capitalize" style="text-transform:capitalize"
href="${home}/recreate-api-key">API Key</a></li> href="${home}/recreate-api-key">API Key</a></li>
......
...@@ -143,7 +143,6 @@ def view_login(request): ...@@ -143,7 +143,6 @@ def view_login(request):
if id_info and not user: if id_info and not user:
request.session.flash('Silahkan Melakukan Registrasi') request.session.flash('Silahkan Melakukan Registrasi')
register_form = get_params("register_form", 'register-external') register_form = get_params("register_form", 'register-external')
headers = [("id_info", str(id_info))]
return HTTPFound(location=request.route_url(register_form, _query=id_info), detail=id_info) return HTTPFound(location=request.route_url(register_form, _query=id_info), detail=id_info)
if user: if user:
......
from colander import SchemaNode, null, Mapping, Invalid, text_ from colander import SchemaNode, null, Mapping, Invalid, text_, string_types
from deform.widget import Widget, _StrippedString, Select2Widget from deform.widget import Widget, _StrippedString, Select2Widget
...@@ -228,3 +228,82 @@ class QtyWidget(Widget): ...@@ -228,3 +228,82 @@ class QtyWidget(Widget):
raise Invalid(field.schema, "Data tidak lengkap", result) raise Invalid(field.schema, "Data tidak lengkap", result)
return result return result
class CaptchaWidget(Widget):
"""
Renders an ``<input type="text"/>`` widget.
**Attributes/Arguments**
template
The template name used to render the widget. Default:
``textinput``.
readonly_template
The template name used to render the widget in read-only mode.
Default: ``readonly/textinput``.
strip
If true, during deserialization, strip the value of leading
and trailing whitespace (default ``True``).
mask
A :term:`jquery.maskedinput` input mask, as a string.
a - Represents an alpha character (A-Z,a-z)
9 - Represents a numeric character (0-9)
* - Represents an alphanumeric character (A-Z,a-z,0-9)
All other characters in the mask will be considered mask
literals.
Example masks:
Date: 99/99/9999
US Phone: (999) 999-9999
US SSN: 999-99-9999
When this option is used, the :term:`jquery.maskedinput`
library must be loaded into the page serving the form for the
mask argument to have any effect. See :ref:`masked_input`.
mask_placeholder
The placeholder for required nonliteral elements when a mask
is used. Default: ``_`` (underscore).
"""
template = "opensipkd.base:views/widgets/captcha"
readonly_template = "opensipkd.base:views/widgets/captcha"
strip = True
# mask = None
# mask_placeholder = "_"
requirements = ()
# def __init__(self, **kw):
# super(CaptchaWidget, self).__init__(**kw)
# if getattr(self, "mask", False):
# self.requirements = tuple(
# list(self.requirements) + [("jquery.maskedinput", None)]
# )
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, None)
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;
captcha captcha|field.widget.captcha;
style style|field.widget.style;
"
tal:omit-tag="">
<input type="text" name="${name}" value="${cstruct}"
tal:attributes="class string: form-control ${css_class or ''};
style style;
attributes|field.widget.attributes|{};"
id="${oid}"/>
<script type="text/javascript">
deform.addCallback(
'${oid}',
function (oid) {
$("#" + oid).parent().prepend('<img style="height:30px; width:auto; margin-bottom:5px;' +
'" src="${home}/captcha/${captcha}.png">')
$('#'+oid).on('input', function (evt) {
$(this).val(function (_, val) {
return val.toUpperCase();
});
});
});
</script>
</span>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!