Commit 91d58e76 by aagusti

captcha berubah nama file jadi png

1 parent b7afeeb8
env_base/bin/activate
\ No newline at end of file \ No newline at end of file
...@@ -9,6 +9,7 @@ from pyramid.httpexceptions import ( ...@@ -9,6 +9,7 @@ from pyramid.httpexceptions import (
HTTPSeeOther) HTTPSeeOther)
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.interfaces import IRoutesMapper from pyramid.interfaces import IRoutesMapper
from pyramid.response import Response
from pyramid.view import view_config from pyramid.view import view_config
from opensipkd.base import get_params from opensipkd.base import get_params
...@@ -42,7 +43,7 @@ def not_found(request): ...@@ -42,7 +43,7 @@ def not_found(request):
@view_config(context=HTTPInternalServerError, renderer='templates/500.pt') @view_config(context=HTTPInternalServerError, renderer='templates/500.pt')
def internal_server_error(request): def internal_server_error(request):
return {} return {}
# response = Response('Internal error') # response = Response('Terjadi kesahala')
# response.status_int = 500 # response.status_int = 500
# return response # return response
......
import os
import re
from datetime import datetime from datetime import datetime
from dateutil.relativedelta import relativedelta from dateutil.relativedelta import relativedelta
from opensipkd.tools.captcha import get_captcha
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from .. import DBSession, get_params from .. import DBSession, get_params
from opensipkd.tools import dmy, dmy_to_date, get_settings from opensipkd.tools import dmy, dmy_to_date, get_settings, get_ext
import colander import colander
from deform import (widget, Form, ValidationFailure, ) from deform import (widget, Form, ValidationFailure, )
from email.utils import parseaddr from email.utils import parseaddr
from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete from opensipkd.tools.buttons import btn_save, btn_cancel, btn_close, btn_delete
from ..models import User
class BaseView(object): class BaseView(object):
def __init__(self, request): def __init__(self, request):
...@@ -94,7 +99,7 @@ class BaseView(object): ...@@ -94,7 +99,7 @@ class BaseView(object):
self.jenis = 'jenis' in self.params and self.params[ self.jenis = 'jenis' in self.params and self.params[
'jenis'] or self.jenis 'jenis'] or self.jenis
self.ses['jenis'] = self.jenis self.ses['jenis'] = self.jenis
self.list_route = '' self.list_route = 'home'
self.list_col_defs = "" self.list_col_defs = ""
self.list_cols = "" self.list_cols = ""
self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \ self.list_buttons = 'btn_view, btn_add, btn_edit, btn_delete, ' \
...@@ -114,7 +119,9 @@ class BaseView(object): ...@@ -114,7 +119,9 @@ class BaseView(object):
self.home = self.req.route_url('home')[:-1] self.home = self.req.route_url('home')[:-1]
self.buttons = None self.buttons = None
self.headers = None self.headers = None
self.bindings = None self.bindings = {}
self.autocomplete = 'on'
# self.captcha = ""
def route_list(self, msg=None, error=""): def route_list(self, msg=None, error=""):
if msg: if msg:
...@@ -133,12 +140,12 @@ class BaseView(object): ...@@ -133,12 +140,12 @@ class BaseView(object):
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):
buttons = self.buttons and self.buttons or buttons buttons = self.buttons and self.buttons or buttons
bindings = self.bindings and self.bindings or bindings 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, **bindings) schema = schema.bind(request=self.req, **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, autocomplete=self.autocomplete)
def session_failed(self, session_name): def session_failed(self, session_name):
r = dict(form=self.req.session[session_name]) r = dict(form=self.req.session[session_name])
...@@ -187,7 +194,8 @@ class BaseView(object): ...@@ -187,7 +194,8 @@ class BaseView(object):
return self.route_list() return self.route_list()
form = self.before_add(form) form = self.before_add(form)
table = self.get_item_table() table = self.get_item_table()
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)
def before_save(self, row, values): def before_save(self, row, values):
return row return row
...@@ -196,6 +204,7 @@ class BaseView(object): ...@@ -196,6 +204,7 @@ class BaseView(object):
pass pass
def save(self, values, user, row=None): def save(self, values, user, row=None):
self.ses["old_email"] = user and user.email or None
if not row: if not row:
row = self.table() row = self.table()
row.created = datetime.now() row.created = datetime.now()
...@@ -246,7 +255,6 @@ class BaseView(object): ...@@ -246,7 +255,6 @@ 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()
form = self.get_form(self.edit_schema) form = self.get_form(self.edit_schema)
if request.POST: if request.POST:
if 'save' in request.POST: if 'save' in request.POST:
...@@ -301,3 +309,36 @@ def email_validator(node, value): ...@@ -301,3 +309,36 @@ def email_validator(node, value):
name, email = parseaddr(value) name, email = parseaddr(value)
if not email or email.find('@') < 0: if not email or email.find('@') < 0:
raise colander.Invalid(node, 'Invalid email format') raise colander.Invalid(node, 'Invalid email format')
class Store(dict):
def preview_url(self, name):
return ""
store = Store()
reg_exts = ['.png', '.jpg', '.pdf', '.jpeg']
def image_validator(node, value):
ext = get_ext(value["filename"])
if ext not in reg_exts:
raise colander.Invalid(node, f'Extension harus salahsatu dari {reg_exts}')
username_re = re.compile('^[a-z0-9_]{6,16}$', re.IGNORECASE)
def user_name_validator(node, value):
if not username_re.match(value):
raise colander.Invalid(node,
'Value must be between 6 and 16 characters and can only contain uppercase and lowercase alphanumeric characters or an underscore')
def need_captcha():
is_captcha = get_params("reg_captcha")
return is_captcha == '1' or is_captcha == "True" or is_captcha=="true" or is_captcha == True
def get_url_captcha(request):
captcha = get_captcha(request)
return os.path.join(request.route_url('home'),'captcha',captcha)
\ No newline at end of file \ No newline at end of file
...@@ -12,7 +12,7 @@ from pyramid.view import view_config ...@@ -12,7 +12,7 @@ from pyramid.view import view_config
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
# from . import get_login_headers # from . import get_login_headers
from .register import mobile_found_partner, save_partner, nik_found # from .register import mobile_found_partner, save_partner, nik_found
from .user_group import save as save_groups from .user_group import save as save_groups
from ..models import DBSession, Partner, Group, ExternalIdentity, User, ExternalIdentityService from ..models import DBSession, Partner, Group, ExternalIdentity, User, ExternalIdentityService
from opensipkd.tools import get_settings from opensipkd.tools import get_settings
......
...@@ -105,6 +105,7 @@ ...@@ -105,6 +105,7 @@
<a href="#" class="dropdown-toggle txt-color-white" data-toggle="dropdown">My Account <b class="caret"></b></a> <a href="#" class="dropdown-toggle txt-color-white" data-toggle="dropdown">My Account <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a style="text-transform:capitalize" href="${home}logout">${request.user.nice_username()} Logout</a></li> <li><a style="text-transform:capitalize" href="${home}logout">${request.user.nice_username()} Logout</a></li>
<li><a style="text-transform:capitalize" href="${home}profile">Profile</a></li>
<li><a style="text-transform:capitalize" href="${home}password">Ubah password</a></li> <li><a style="text-transform:capitalize" href="${home}password">Ubah password</a></li>
<li tal:condition="request.user.api_key"> <li tal:condition="request.user.api_key">
<a style="text-transform:capitalize" href="${home}recreate-api-key"> <a style="text-transform:capitalize" href="${home}recreate-api-key">
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
tal:define="home request.route_url('home')[:-1];"> tal:define="home request.route_url('home')[:-1];">
<div metal:fill-slot="scripts"> <div metal:fill-slot="scripts">
<script> <script tal:condition="${captcha}">
$(document).ready(function () { $(document).ready(function () {
$("#captcha").parent().prepend('<img style="height:30px; width:auto; margin-bottom:5px;'+ $("#captcha").parent().prepend('<img style="height:30px; width:auto; margin-bottom:5px;'+
'" src="${home}/captcha/${captcha}.png">') '" src="${home}/captcha/${captcha}.png">')
...@@ -14,7 +14,6 @@ tal:define="home request.route_url('home')[:-1];"> ...@@ -14,7 +14,6 @@ tal:define="home request.route_url('home')[:-1];">
}); });
}); });
</script> </script>
</div> </div>
</html> </html>
...@@ -114,7 +114,7 @@ def view_login(request): ...@@ -114,7 +114,7 @@ def view_login(request):
return redirect_login(request, user) return redirect_login(request, user)
elif 'register' in request.POST: elif 'register' in request.POST:
register_form = get_params("register_form", 'register-external') register_form = get_params("register_form", 'register')
return HTTPFound(location=request.route_url(register_form)) return HTTPFound(location=request.route_url(register_form))
elif 'login failed' in request.session: elif 'login failed' in request.session:
......
...@@ -247,55 +247,23 @@ class CaptchaWidget(Widget): ...@@ -247,55 +247,23 @@ class CaptchaWidget(Widget):
If true, during deserialization, strip the value of leading If true, during deserialization, strip the value of leading
and trailing whitespace (default ``True``). 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" template = "opensipkd.base:views/widgets/captcha.pt"
readonly_template = "opensipkd.base:views/widgets/captcha" readonly_template = "textinput"
strip = True strip = True
# mask = None
# mask_placeholder = "_"
requirements = () requirements = ()
# def __init__(self, **kw): def __init__(self, **kw):
# super(CaptchaWidget, self).__init__(**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): def serialize(self, field, cstruct, **kw):
if cstruct in (null, None): if cstruct in (null, None):
cstruct = "" cstruct = ""
readonly = kw.get("readonly", self.readonly) readonly = kw.get("readonly", self.readonly)
template = readonly and self.readonly_template or self.template template = readonly and self.readonly_template or self.template
# values = self.get_template_values(field, cstruct, kw) values = self.get_template_values(field, cstruct, kw)
return field.renderer(template, None) return field.renderer(template, **values)
def deserialize(self, field, pstruct): def deserialize(self, field, pstruct):
if pstruct is null: if pstruct is null:
......
<span tal:define="name name|field.name; <span tal:define="name name|field.name;
css_class css_class|field.widget.css_class; css_class css_class|field.widget.css_class;
oid oid|field.oid; oid oid|field.oid;
captcha captcha|field.widget.captcha;
style style|field.widget.style; style style|field.widget.style;
url url|field.widget.url;
" "
tal:omit-tag=""> tal:omit-tag="">
<img style="height:30px; width:auto; margin-bottom:5px;" src="${url}">
<input type="text" name="${name}" value="${cstruct}" <input type="text" name="${name}" value="${cstruct}"
tal:attributes="class string: form-control ${css_class or ''}; tal:attributes="class string: form-control ${css_class or ''};
style style; style style;
attributes|field.widget.attributes|{};" attributes|field.widget.attributes|{};"
id="${oid}"/> 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> </span>
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!