about summary refs log tree commit diff
path: root/uploader/flask_extensions.py
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2025-12-10 12:57:14 -0600
committerFrederick Muriuki Muriithi2025-12-10 12:57:14 -0600
commit09fc4bbc3ef66b02f0711dadaf3b10ed53d9d968 (patch)
tree722daa9cee62cc7d66ed58f85fc18dcbf2636a89 /uploader/flask_extensions.py
parent7838bd59c7fe3fbc936c932f1729c7372eb158ed (diff)
downloadgn-uploader-09fc4bbc3ef66b02f0711dadaf3b10ed53d9d968.tar.gz
Feature Flags: Generically deal with HTTP-based feature flags.
* Define a default `FEATURE_FLAGS_HTTP` configuration variable that's
  an empty list to help defining http-based feature flags that can be
  used to turn on/off features
* Build macro to include hidden fields for feature flags where
  necessary.
* Extend flask's `url_for` function to deal with defined feature flags
  in a mostly transparent way
Diffstat (limited to 'uploader/flask_extensions.py')
-rw-r--r--uploader/flask_extensions.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/uploader/flask_extensions.py b/uploader/flask_extensions.py
new file mode 100644
index 0000000..30fbad7
--- /dev/null
+++ b/uploader/flask_extensions.py
@@ -0,0 +1,33 @@
+"""Custom extensions to the default flask functions/classes."""
+import logging
+from typing import Any, Optional
+
+from flask import (request, current_app as app, url_for as flask_url_for)
+
+logger = logging.getLogger(__name__)
+
+
+def url_for(
+        endpoint: str,
+        _anchor: Optional[str] = None,
+        _method: Optional[str] = None,
+        _scheme: Optional[str] = None,
+        _external: Optional[bool] = None,
+        **values: Any) -> str:
+    """Extension to flask's `url_for` function."""
+    flags = {}
+    for flag in app.config["FEATURE_FLAGS_HTTP"]:
+        flag_value = (request.args.get(flag) or request.form.get(flag) or "").strip()
+        if bool(flag_value):
+            flags[flag] = flag_value
+            continue
+        continue
+
+    logger.debug("HTTP FEATURE FLAGS: %s, other variables: %s", flags, values)
+    return flask_url_for(endpoint=endpoint,
+                         _anchor=_anchor,
+                         _method=_method,
+                         _scheme=_scheme,
+                         _external=_external,
+                         **values,
+                         **flags)