Enhance obj2json to handle nested dictionaries and add support for 'fp' key; upd…

…ate captcha handling in BaseView and improve error logging in CaptchaWidget
1 parent 18eb923e
......@@ -12,4 +12,9 @@ def obj2json(values):
values[key] = float(val)
elif isinstance(val, colander._null):
values[key] = ""
elif isinstance(val, dict):
if 'fp' in val:
values[key] = "FILEBLOB"
else:
values[key] = obj2json(val)
return values
......@@ -634,10 +634,14 @@ class BaseView(object):
data = form.cstruct
if "captcha" in form:
kode_captcha, file_name = img_captcha(self.req)
self.req.session["captcha"] = kode_captcha
self.req.session["captcha_code"] = kode_captcha
url = self.get_captcha_url()
cstruct = url+file_name
data["captcha"] = cstruct
error = kwargs.get("error", "")
if error:
error["data"]=data
return self.resp_xhr({"error": error})
return self.resp_xhr({"data": data})
......@@ -881,7 +885,7 @@ class BaseView(object):
control.append(("upload", ctrl[1]))
control.append(("uid", ""))
control.append(("__end__", f"{ctrl[0]}:mapping"))
log.debug(f"Control: {ctrl}")
log.debug("Control: %s", ctrl)
else:
control.append(ctrl)
controls = iter(control)
......@@ -892,7 +896,9 @@ class BaseView(object):
if self.req.is_xhr:
error = e.error.asdict()
# error.update(value)
return self.resp_xhr({"error": error})
# return self.resp_xhr({"error": error})
form.set_appstruct(e.cstruct)
return self.returned_form(form, error=error)
for f in e.field.children:
if isinstance(f.typ, colander.Date):
......@@ -1243,7 +1249,7 @@ class BaseView(object):
if "fp" in value and value["fp"] and value["fp"] != b'':
if not path:
path = BASE_CLASS.temp_files
path = os.join(path, "upload")
path = os.path.join(path, "upload")
if not os.path.exists(path):
os.makedirs(path)
......
......@@ -366,7 +366,7 @@ class CaptchaWidget(Widget):
"""
template = "opensipkd.base:widgets/templates/captcha.pt"
readonly_template = "textinput"
readonly_template = "opensipkd.base:widgets/templates/captcha.pt"
strip = True
requirements = ()
request = None
......@@ -401,21 +401,21 @@ class CaptchaWidget(Widget):
if not pstruct:
return null
captcha_message = "Captcha tidak sesuai"
captcha_session = self.request.session.get("captcha_code", "")
if captcha_session:
captcha_message = "Captcha tidak sesuai"
if pstruct != captcha_session:
_logging.error(f"Captcha tidak sesuai: {pstruct} != {captcha_session}")
raise Invalid(field.schema, captcha_message)
_logging.error(
"Captcha tidak sesuai terkirim: %s session %s", pstruct, captcha_session)
_logging.error(self.request.session.items())
self.request.session.pop("captcha_code", None)
raise Invalid(field.schema, msg=captcha_message)
else:
# captcha_file = os.path.join(settings['captcha_files'], f"{pstruct}.png")
# captcha_exists = os.path.exists(captcha_file)
# if not captcha_exists:
# _logging.error(f"Captcha file not found: {captcha_file}")
_logging.error(f"Captcha session not found for input: {pstruct}")
captcha_message = "Captcha tidak ditemukan"
_logging.error("Captcha session not found for input: %s", pstruct)
_logging.error(self.request.session.items())
raise Invalid(field.schema, captcha_message)
raise Invalid(field.schema, msg=captcha_message)
return pstruct
......@@ -987,7 +987,6 @@ class FilterWidget(Widget):
#
class CSRFWidget(widget.HiddenWidget):
def serialize(self, field, cstruct, **kw):
......@@ -1006,4 +1005,3 @@ class CSRFWidget(widget.HiddenWidget):
if not pstruct:
return null
return pstruct
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!