Automatically use cached form data

This commit is contained in:
richard-dds 2018-11-19 14:30:24 -05:00
parent 1d5bfed556
commit 26cd9b4cb0
4 changed files with 22 additions and 15 deletions

View File

@ -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)

View File

@ -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(

View File

@ -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),

View File

@ -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()