summaryrefslogtreecommitdiffstats
path: root/core/decorators.py
diff options
context:
space:
mode:
Diffstat (limited to 'core/decorators.py')
-rw-r--r--core/decorators.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/core/decorators.py b/core/decorators.py
new file mode 100644
index 0000000..4934b60
--- /dev/null
+++ b/core/decorators.py
@@ -0,0 +1,41 @@
+from functools import partial, wraps
+
+from django.views.decorators.cache import cache_page as dj_cache_page
+
+from core.models import Config
+
+
+def cache_page(
+ timeout: int | str = "cache_timeout_page_default",
+ *,
+ per_identity: bool = False,
+ key_prefix: str = "",
+):
+ """
+ Decorator for views that caches the page result.
+ timeout can either be the number of seconds or the name of a SystemOptions
+ value.
+ """
+ if isinstance(timeout, str):
+ timeout = Config.lazy_system_value(timeout)
+
+ def decorator(function):
+ @wraps(function)
+ def inner(request, *args, **kwargs):
+ prefix = key_prefix
+ if per_identity:
+ identity_id = request.identity.pk if request.identity else "0"
+ prefix = f"{key_prefix or ''}:ident{identity_id}"
+ _timeout = timeout
+ if callable(_timeout):
+ _timeout = _timeout()
+ return dj_cache_page(timeout=_timeout, key_prefix=prefix)(function)(
+ request, *args, **kwargs
+ )
+
+ return inner
+
+ return decorator
+
+
+per_identity_cache_page = partial(cache_page, per_identity=True)