32 lines
803 B
Python
32 lines
803 B
Python
from typing import Type
|
|
|
|
from django.core.cache import cache
|
|
from django.http.request import HttpRequest
|
|
from wagtail.models import Page
|
|
|
|
|
|
class SingletonPageCache:
|
|
@classmethod
|
|
def get_url_cache_key(cls, model: Type[Page]) -> str:
|
|
return f"singleton_url_{model.__name__}"
|
|
|
|
@classmethod
|
|
def get_url(
|
|
cls, model: Type[Page], request: HttpRequest | None = None
|
|
) -> str | None:
|
|
cache_key = cls.get_url_cache_key(model)
|
|
|
|
url = cache.get(cache_key)
|
|
|
|
if url is None:
|
|
# `.first` is marginally more efficient than `.get`
|
|
page = Page.objects.type(model).first()
|
|
|
|
if page is None:
|
|
return None
|
|
|
|
url = page.get_url(request)
|
|
|
|
cache.set(cache_key, url, 10800)
|
|
|
|
return url
|