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