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