diff --git a/atst/app.py b/atst/app.py index 591e5c65..b309806a 100644 --- a/atst/app.py +++ b/atst/app.py @@ -24,6 +24,7 @@ from atst.models.permissions import Permissions from atst.eda_client import MockEDAClient from atst.uploader import Uploader from atst.utils import mailer +from atst.utils.form_cache import FormCache from atst.queue import queue @@ -67,6 +68,8 @@ def make_app(config): if ENV != "prod": app.register_blueprint(dev_routes) + app.form_cache = FormCache(app.redis) + apply_authentication(app) return app diff --git a/atst/utils/form_cache.py b/atst/utils/form_cache.py index e8e249f5..f199bdc5 100644 --- a/atst/utils/form_cache.py +++ b/atst/utils/form_cache.py @@ -16,3 +16,27 @@ def cache_form_data(redis, formdata, expiry_seconds=3600, key_prefix=DEFAULT_CAC def retrieve_form_data(redis, formdata_key, key_prefix="formcache"): data = redis.get("{}:{}".format(key_prefix, formdata_key)) return pickle.loads(data) + + +class FormCache(object): + + def __init__(self, redis): + self.redis = redis + + def from_request(self, http_request): + cache_key = http_request.args.get("formCache") + if cache_key: + return self.read(cache_key) + + def write(self, formdata, expiry_seconds=3600, key_prefix="formcache"): + value = pickle.dumps(formdata) + hash_ = hashlib.sha1(os.urandom(64)).hexdigest() + self.redis.setex(name=self._key(key_prefix, hash_), value=value, time=expiry_seconds) + + def read(self, formdata_key, key_prefix="formcache"): + data = self.redis.get(self._key(key_prefix, formdata_key)) + return pickle.loads(data) + + @staticmethod + def _key(prefix, hash_): + return "{}:{}".format(prefix, hash_)