Automatically use cached form data
This commit is contained in:
parent
1d5bfed556
commit
26cd9b4cb0
@ -1,7 +1,8 @@
|
|||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
|
from flask import current_app, request as http_request
|
||||||
|
|
||||||
|
|
||||||
class ValidatedForm(FlaskForm):
|
class _ValidatedForm(FlaskForm):
|
||||||
def perform_extra_validation(self, *args, **kwargs):
|
def perform_extra_validation(self, *args, **kwargs):
|
||||||
"""Performs any applicable extra validation. Must
|
"""Performs any applicable extra validation. Must
|
||||||
return True if the form is valid or False otherwise."""
|
return True if the form is valid or False otherwise."""
|
||||||
@ -12,3 +13,11 @@ class ValidatedForm(FlaskForm):
|
|||||||
_data = super().data
|
_data = super().data
|
||||||
_data.pop("csrf_token", None)
|
_data.pop("csrf_token", None)
|
||||||
return _data
|
return _data
|
||||||
|
|
||||||
|
|
||||||
|
class ValidatedForm(_ValidatedForm):
|
||||||
|
def __init__(self, formdata=None, **kwargs):
|
||||||
|
formdata = formdata or {}
|
||||||
|
cached_data = current_app.form_cache.from_request(http_request)
|
||||||
|
cached_data.update(formdata)
|
||||||
|
super().__init__(cached_data, **kwargs)
|
||||||
|
@ -92,14 +92,13 @@ class FinancialVerificationBase(object):
|
|||||||
|
|
||||||
|
|
||||||
class GetFinancialVerificationForm(FinancialVerificationBase):
|
class GetFinancialVerificationForm(FinancialVerificationBase):
|
||||||
def __init__(self, user, request, cached_data=None, is_extended=False):
|
def __init__(self, user, request, is_extended=False):
|
||||||
self.user = user
|
self.user = user
|
||||||
self.request = request
|
self.request = request
|
||||||
self.cached_data = cached_data or {}
|
|
||||||
self.is_extended = is_extended
|
self.is_extended = is_extended
|
||||||
|
|
||||||
def execute(self):
|
def execute(self):
|
||||||
form = self._get_form(self.request, self.is_extended, formdata=self.cached_data)
|
form = self._get_form(self.request, self.is_extended)
|
||||||
form.reset()
|
form.reset()
|
||||||
return form
|
return form
|
||||||
|
|
||||||
@ -194,10 +193,7 @@ def financial_verification(request_id):
|
|||||||
)
|
)
|
||||||
|
|
||||||
form = GetFinancialVerificationForm(
|
form = GetFinancialVerificationForm(
|
||||||
g.current_user,
|
g.current_user, request, is_extended=is_extended
|
||||||
request,
|
|
||||||
is_extended=is_extended,
|
|
||||||
cached_data=app.form_cache.from_request(http_request),
|
|
||||||
).execute()
|
).execute()
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
|
@ -36,10 +36,7 @@ def option_data():
|
|||||||
|
|
||||||
@requests_bp.route("/requests/new/<int:screen>", methods=["GET"])
|
@requests_bp.route("/requests/new/<int:screen>", methods=["GET"])
|
||||||
def requests_form_new(screen):
|
def requests_form_new(screen):
|
||||||
cached_data = current_app.form_cache.from_request(http_request)
|
jedi_flow = JEDIRequestFlow(screen, request=None, current_user=g.current_user)
|
||||||
jedi_flow = JEDIRequestFlow(
|
|
||||||
screen, request=None, current_user=g.current_user, post_data=cached_data
|
|
||||||
)
|
|
||||||
|
|
||||||
return render_template(
|
return render_template(
|
||||||
"requests/screen-%d.html" % int(screen),
|
"requests/screen-%d.html" % int(screen),
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from hashlib import sha256
|
from hashlib import sha256
|
||||||
import json
|
import json
|
||||||
from werkzeug.datastructures import ImmutableMultiDict
|
from werkzeug.datastructures import MultiDict
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_CACHE_NAME = "formcache"
|
DEFAULT_CACHE_NAME = "formcache"
|
||||||
@ -16,10 +16,11 @@ class FormCache(object):
|
|||||||
cache_key = http_request.args.get(self.PARAM_NAME)
|
cache_key = http_request.args.get(self.PARAM_NAME)
|
||||||
if cache_key:
|
if cache_key:
|
||||||
return self.read(cache_key)
|
return self.read(cache_key)
|
||||||
|
return MultiDict()
|
||||||
|
|
||||||
def write(self, formdata, expiry_seconds=3600, key_prefix=DEFAULT_CACHE_NAME):
|
def write(self, formdata, expiry_seconds=3600, key_prefix=DEFAULT_CACHE_NAME):
|
||||||
value = json.dumps(formdata)
|
value = json.dumps(formdata)
|
||||||
hash_ = sha256().hexdigest()
|
hash_ = self._hash()
|
||||||
self.redis.setex(
|
self.redis.setex(
|
||||||
name=self._key(key_prefix, hash_), value=value, time=expiry_seconds
|
name=self._key(key_prefix, hash_), value=value, time=expiry_seconds
|
||||||
)
|
)
|
||||||
@ -28,8 +29,12 @@ class FormCache(object):
|
|||||||
def read(self, formdata_key, key_prefix=DEFAULT_CACHE_NAME):
|
def read(self, formdata_key, key_prefix=DEFAULT_CACHE_NAME):
|
||||||
data = self.redis.get(self._key(key_prefix, formdata_key))
|
data = self.redis.get(self._key(key_prefix, formdata_key))
|
||||||
dict_data = json.loads(data) if data is not None else {}
|
dict_data = json.loads(data) if data is not None else {}
|
||||||
return ImmutableMultiDict(dict_data)
|
return MultiDict(dict_data)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _key(prefix, hash_):
|
def _key(prefix, hash_):
|
||||||
return "{}:{}".format(prefix, hash_)
|
return "{}:{}".format(prefix, hash_)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _hash():
|
||||||
|
return sha256().hexdigest()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user