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
...@@ -27,36 +27,29 @@ Link dalam module registrasi: ...@@ -27,36 +27,29 @@ Link dalam module registrasi:
5. Form Upload template 5. Form Upload template
""" """
import os import os
import re
from email.utils import parseaddr from email.utils import parseaddr
import colander import colander
from deform import (Form, widget, ValidationFailure, Button, FileData) from deform import (widget, ValidationFailure, Button, FileData)
from opensipkd.base import get_params from opensipkd.tools import Upload
from opensipkd.tools import get_settings, get_ext, Upload
from opensipkd.tools.captcha import get_captcha from opensipkd.tools.captcha import get_captcha
from pyramid.httpexceptions import HTTPFound from pyramid.httpexceptions import HTTPFound
from pyramid.i18n import TranslationStringFactory from pyramid.i18n import TranslationStringFactory
from pyramid.view import view_config from pyramid.view import view_config
from ziggurat_foundations.models.services.user import UserService from ziggurat_foundations.models.services.user import UserService
from opensipkd.base.views.user import insert as save_user from opensipkd.base import get_params
from opensipkd.base.views.user import insert as save_user, email_validator
from opensipkd.base.views.user_login import send_email_security_code from opensipkd.base.views.user_login import send_email_security_code
from .user_group import save as save_groups from . import widget_os
from ..models import User, DBSession, Partner, Group, UserGroup from .base_views import store, image_validator, need_captcha, get_url_captcha
from ..models import User, DBSession, Partner, UserGroup
from ..views import BaseView from ..views import BaseView
_ = TranslationStringFactory('user') _ = TranslationStringFactory('user')
def email_validator(node, value): class AddSchema(colander.Schema):
name, email = parseaddr(value)
if not email or email.find('@') < 0:
raise colander.Invalid(node, 'Invalid email format')
class NamaSchema(colander.Schema):
nama = colander.SchemaNode( nama = colander.SchemaNode(
colander.String(), colander.String(),
oid="nama") oid="nama")
...@@ -78,109 +71,37 @@ class NamaSchema(colander.Schema): ...@@ -78,109 +71,37 @@ class NamaSchema(colander.Schema):
validator=email_validator, validator=email_validator,
oid="email") oid="email")
def after_bind(self, schema, kw):
class Store(dict): request = kw.get("request")
def preview_url(self, name): is_id_card = get_params('reg_idcard')
return "" if is_id_card == '1' or is_id_card == "True" or is_id_card == "true":
self["kode"] = colander.SchemaNode(
store = Store()
reg_exts = ['.png', '.jpg', '.pdf', '.jpeg']
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 id_card_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}')
class RegSchema(colander.Schema):
user_name = colander.SchemaNode(
colander.String(),
validator=user_name_validator,
# colander.Length(max=16, max_err='Maximum ${max} Digit',
# min=6, min_err='Minimimum ${min} Digit'),
oid="user_name")
kode = colander.SchemaNode(
colander.String(), colander.String(),
validator=colander.Length(max=18, max_err='Maximum ${max} Digit', widget=widget.TextInputWidget(),
min=15, min_err='Minimimum ${min} Digit'),
title="No.Identitas/NIK", title="No.Identitas/NIK",
# missing=colander.drop,
oid="kode") oid="kode")
self["doc_id_card"] = colander.SchemaNode(
detail = NamaSchema()
doc_id_card = colander.SchemaNode(
FileData(), FileData(),
widget=widget.FileUploadWidget(store), widget=widget.FileUploadWidget(store),
validator=id_card_validator) title="Photo Identitas",
validator=image_validator)
# captcha = colander.SchemaNode( if not request.user and need_captcha():
# colander.String(), self["captcha"] = colander.SchemaNode(
# oid="captcha")
def after_bin(self, schema, kwargs):
request = kwargs["request"]
if get_params('reg_idcard') != '1':
del self["doc_id_card"]
if get_params('reg_captcha') != '1':
del self["captcha"]
class RegEditSchema(colander.Schema):
user_name = colander.SchemaNode(
colander.String(), colander.String(),
widget=widget.TextInputWidget(readonly=True), widget=widget_os.CaptchaWidget(url=get_url_captcha(request)),
missing=colander.drop, oid="captcha", title="Captcha")
oid="user_name")
kode = colander.SchemaNode( if request.user and request.user.id:
colander.String(), self["password"] = colander.SchemaNode(
widget=widget.TextInputWidget(readonly=True),
title="No.Identitas/NIK",
missing=colander.drop,
oid="kode")
detail = NamaSchema()
password = colander.SchemaNode(
colander.String(), colander.String(),
widget=widget.PasswordWidget(size=20), widget=widget.PasswordWidget()
# validator = user_name_validator, , oid="password", title="Password")
title="Password",
oid="password")
id = colander.SchemaNode(
colander.Integer(),
missing=colander.drop,
widget=widget.HiddenWidget(readonly=True),
)
# doc_id_card = colander.SchemaNode(
# FileData(),
# widget=widget.String())
def after_bin(self, schema, kwargs):
request = kwargs["request"]
self.kode["widget"] = widget.TextInputWidget(readonly=True)
if "kode" not in request.params:
self.kode["widget"] = widget.TextInputWidget()
if "email" in request.params:
self.detail.email["widget"] = widget.TextInputWidget(readonly=True)
self.detail.email["missing"] = colander.drop
if request.get_params('reg_id_card') != '0': class EditSchema(AddSchema):
del self["doc_id_card"] pass
# def user_name(user_name):
# return User.get_by_identity(email)
def user_found(identity): def user_found(identity):
...@@ -213,16 +134,32 @@ def show_error(request, msg): ...@@ -213,16 +134,32 @@ def show_error(request, msg):
# 3. Cek NIK (kode) pada Partner jika ada dan Partner.id beda reject # 3. Cek NIK (kode) pada Partner jika ada dan Partner.id beda reject
def form_validator(form, value): def reg_buttons():
value.update(value['detail']) btn_register = Button(name='save', css_class='btn-success', type="submit", title="Register")
btn_cancel = Button(name='batal', css_class='btn-primary', type="submit")
return btn_cancel, btn_register
class Registrasi(BaseView):
def __init__(self, request):
super(Registrasi, self).__init__(request)
self.autocomplete = "off"
self.buttons = reg_buttons()
self.add_schema = AddSchema
self.edit_schema = EditSchema
self.table = User
self.list_route = "home"
def form_validator(self, form, value):
form_exc = colander.Invalid(form, '') form_exc = colander.Invalid(form, '')
def err_captcha(): def err_captcha():
msg = 'Captcha harus diisi' msg = 'Captcha harus diisi'
raise colander.Invalid(form['captcha'], msg) raise colander.Invalid(form['captcha'], msg)
def err_email(): def err_email():
exc = colander.Invalid( exc = colander.Invalid(
form['detail']['email'], 'e-mail %s sudah ada yang menggunakan' % value['email']) form['email'], 'e-mail %s sudah ada yang menggunakan' % value['email'])
raise exc raise exc
def err_user(): def err_user():
...@@ -230,21 +167,26 @@ def form_validator(form, value): ...@@ -230,21 +167,26 @@ def form_validator(form, value):
form['user_name'], 'User name %s sudah ada yang menggunakan' % value['user_name']) form['user_name'], 'User name %s sudah ada yang menggunakan' % value['user_name'])
def err_nik(): def err_nik():
if "kode" in form:
raise colander.Invalid( raise colander.Invalid(
form['kode'], 'NIK %s sudah ada yang menggunakan' % value['kode']) form['kode'], 'NIK %s sudah ada yang menggunakan' % value['kode'])
else:
raise colander.Invalid(
form['mobile'], 'Mobile %s sudah ada yang menggunakan' % value['kode'])
def err_login(): def err_login():
raise colander.Invalid( raise colander.Invalid(
form, 'User atau Password tidak sesuai') form["password"], 'User atau Password tidak sesuai')
request = form.request request = form.request
# Check user_name
detail = value['detail']
email = detail['email']
is_logged = form.request.user is_logged = form.request.user
email = value["email"]
if "user_name" not in value or not value["user_name"]:
value["user_name"] = value["mobile"]
if 'user_name' in value: if 'user_name' in value:
user_name = value["user_name"]
# Check Data User # Check Data User
user_name = value["user_name"]
user = user_found(user_name) user = user_found(user_name)
if user and not is_logged: if user and not is_logged:
err_user() err_user()
...@@ -256,14 +198,14 @@ def form_validator(form, value): ...@@ -256,14 +198,14 @@ def form_validator(form, value):
user = user_found(email) user = user_found(email)
if user and not is_logged: if user and not is_logged:
err_email() err_email()
if user and is_logged: if user and is_logged:
if user.id != is_logged.id: if user.id != is_logged.id:
err_email() err_email()
# Check Data Partner # Check Data Partner
if 'id' in request.matchdict: if request.user:
uid = request.matchdict['id'] q = DBSession.query(Partner).filter_by(email=request.user.email)
q = DBSession.query(Partner).filter_by(id=uid)
partner = q.first() partner = q.first()
else: else:
partner = None partner = None
...@@ -275,7 +217,9 @@ def form_validator(form, value): ...@@ -275,7 +217,9 @@ def form_validator(form, value):
elif found: elif found:
err_email() err_email()
# CEK NIK apakah Sudah Ada di tabel Partner? if "kode" not in value or not value["kode"]:
value["kode"] = value["mobile"]
if 'kode' in value: if 'kode' in value:
found_nik = nik_found(value['kode']) found_nik = nik_found(value['kode'])
if partner: if partner:
...@@ -285,209 +229,87 @@ def form_validator(form, value): ...@@ -285,209 +229,87 @@ def form_validator(form, value):
err_nik() err_nik()
# Check Captcha jika registrasi # Check Captcha jika registrasi
if not request.user: if not request.user and need_captcha():
if get_params("reg_captcha") == '1':
if 'captcha' not in value or not value['captcha'] \ if 'captcha' not in value or not value['captcha'] \
or 'captcha' not in request.session or not request.session['captcha']: or 'captcha' not in request.session or not request.session['captcha']:
err_captcha() err_captcha()
captcha = 'captcha' in value and value['captcha'].upper() or None captcha = 'captcha' in value and value['captcha'].upper() or None
if not captcha or captcha != request.session['captcha']: if not captcha or captcha != request.session['captcha']:
del request.session["captcha"]
err_captcha() err_captcha()
# Cek Old Password
if 'password' in value: if 'password' in value:
user = form.request.user user = form.request.user
if not user or not UserService.check_password(user, value['password']): if not user or not UserService.check_password(user, value['password']):
err_login() err_login()
def before_save(self, row, values):
if "doc_id_card" not in values or not values["doc_id_card"]:
return row
def get_form(request, class_form, buttons=('batal', 'simpan'), path = get_params('reg_folder', '/tmp/registrasi')
validator=form_validator): if not os.path.exists(path):
schema = class_form(validator=validator) os.makedirs(path)
schema = schema.bind(request=request)
schema.request = request
return Form(schema, buttons=buttons)
def save_partner(values, row=None): upload = Upload(path)
if not row: values["doc_id_card"] = upload.save(self.req, 'upload')
row = Partner() row.doc_id_card = values["doc_id_card"]
row.is_vendor = 0
row.is_customer = 1
row.status = 0
row.from_dict(values)
DBSession.add(row)
DBSession.flush()
return row return row
def before_edit(self, form):
partner = DBSession.query(Partner). \
join(User, Partner.email == User.email). \
filter(User.id == self.req.user.id).first()
if partner:
values = {}
for f in ["nama", "alamat_1", "alamat_2", "mobile", "email"]:
values[f] = hasattr(partner, f) and getattr(partner, f) or ""
form.set_appstruct(values)
return form
def save_request(values, request, row=None): def after_save(self, row, values):
values.update(values['detail']) if "old_email" in self.ses and self.ses["old_email"]:
# disini yang di cek id partner email = self.ses["old_email"]
if 'id' in request.matchdict: del self.ses["old_email"]
values['id'] = request.matchdict['id'] else:
email = row.email
# Check registrant apakah sudah punya user atau belum partner = Partner.query_email(email).first()
if request.user: if not partner:
# Jika sudah punya user masukan ke group esppt partner = Partner()
user = request.user partner.is_vendor = 0
user_group = UserGroup.get_by_user(user) partner.is_customer = 1
partner.status = 0
if user.email != values['email']: partner.from_dict(values)
user.email = values['email'] DBSession.add(partner)
DBSession.add(user)
DBSession.flush() DBSession.flush()
values['status'] = 1
else:
# Jika Tidak Tambahkan User dan Kirim Email
user_ = dict(user_name=values['user_name'],
email=values['email'])
user, remain = save_user(request, user_)
# if not external identity send security code
if 'external' not in request.session or not request.session['external']:
send_email_security_code(
request, user, remain, 'Welcome new user', 'email-new-user',
'email-new-user.tpl')
data = dict(email=user.email)
ts = _(
'user-added',
default='${email} berhasil ditambahkan dan email untuk ubah ' \
'kata kunci sudah dikirim.',
mapping=data)
request.session.flash(ts)
if row:
if row.email == row.kode:
values['kode'] = values['email']
else:
if 'kode' not in values and not values['kode']:
values['kode'] = values['email']
values['user_id'] = user.id
row = save_partner(values, row)
##Untuk SIMKEL##
# settings = get_settings()
# if 'default_group' in settings:
# groups = settings['default_group'].split(',')
# for group in groups:
# group_data = Group.query_group_name(group).first()
# if not group_data:
# raise custom_error(-1, "Group Not Found.")
# data = dict(group_id=group_data.id,
# user_id=user.id)
# save_groups(data, None)
return row return row
@view_config(route_name='register', renderer='templates/form_input.pt')
def route_list(request):
return HTTPFound(location=request.route_url('home'))
def reg_buttons():
btn_register = Button(name='register', css_class='btn-success', type="submit")
btn_cancel = Button(name='batal', css_class='btn-primary', type="submit")
return btn_cancel, btn_register
class RegistrasiAdd(BaseView):
@view_config(route_name='register', renderer='templates/register.pt')
def view_add(self): def view_add(self):
request = self.req request = self.req
self.bindings = dict(user=None)
if request.user: if request.user:
return HTTPFound(location=request.route_url("profile")) return HTTPFound(location=request.route_url("profile"))
form = get_form(request, RegSchema, reg_buttons()) # self.captcha = need_captcha() and get_captcha(request) or ""
captcha = get_params("reg_captcha") and get_captcha(request) or None return super(Registrasi, self).view_add()
if request.POST:
if 'register' in request.POST:
# input_file = request.POST['upload'].file
# filename = request.POST['upload'].filename.lower()
# ext = get_ext(filename).lower()
# raise ext
controls = request.POST.items()
try:
controls = form.validate(controls)
except ValidationFailure as e:
form.set_appstruct(e.cstruct)
return dict(form=form.render(), captcha=captcha, scripts="")
values = dict(controls)
path = get_params('reg_folder', '/tmp/registrasi') @view_config(route_name='profile', renderer='templates/form_input.pt',
if not os.path.exists(path):
os.makedirs(path)
upload = Upload(path)
values["doc_id_card"] = upload.save(request, 'upload')
save_request(values, request)
request.session.flash('Registrasi Sukses.')
if 'captcha' in request.session:
del (request.session['captcha'])
return route_list(request)
values = {}
if request.user:
values['email'] = request.user.email
form.set_appstruct(values)
return dict(form=form.render(), captcha=get_captcha(request),
scripts="")
@view_config(route_name='profile', renderer='templates/register.pt',
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") register_form = get_params("register_form")
self.bindings = dict(user=self.req.user)
if register_form: if register_form:
return HTTPFound(location=request.route_url(register_form)) return HTTPFound(location=request.route_url(register_form))
return super(Registrasi, self).view_edit()
ses = request.session def query_id(self):
query = query_id(request) return DBSession.query(User). \
row = query.first() filter(User.id == self.req.user.id)
form = get_form(request, RegEditSchema)
if request.POST:
if 'simpan' in request.POST:
controls = request.POST.items()
try:
controls = form.validate(controls)
except ValidationFailure as e:
values = e.cstruct
values['kode'] = row.kode
form.set_appstruct(values)
return dict(form=form)
save_request(dict(controls), request, row)
request.session.flash('Sukses Update Profile.')
return route_list(request)
if row:
values = row.to_dict()
values['detail'] = row.to_dict()
else:
values = dict(detail=dict(email=request.user.email))
form.set_appstruct(values)
return dict(form=form.render(), captcha=get_captcha(request), scripts="")
########
# Edit #
########
def query_id(request):
return DBSession.query(Partner). \
join(User, Partner.email == User.email). \
filter(User.id == request.user.id)
def id_not_found(request): def id_not_found(self):
msg = 'Register ID %s Tidak Ditemukan.' % request.matchdict['id'] return
request.session.flash(msg, 'error')
return route_list(request)
...@@ -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!