Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
import logging
|
||||
|
||||
from molodetz.cache import TTLCache
|
||||
from molodetz.constants import SETTINGS_DEFAULTS
|
||||
from molodetz.database.core import db, now_iso
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_settings_cache = TTLCache(ttl=60, max_size=100)
|
||||
_version_cache = TTLCache(ttl=1, max_size=100)
|
||||
_local_versions = {}
|
||||
|
||||
|
||||
def read_cache_version(name):
|
||||
cached = _version_cache.get(name)
|
||||
if cached is not None:
|
||||
return cached
|
||||
try:
|
||||
if "cache_state" not in db.tables:
|
||||
return 0
|
||||
row = db["cache_state"].find_one(name=name)
|
||||
version = int(row["version"]) if row else 0
|
||||
except Exception as exc:
|
||||
logger.warning("cache version read failed for %s: %s", name, exc)
|
||||
return 0
|
||||
_version_cache.set(name, version)
|
||||
return version
|
||||
|
||||
|
||||
def sync_local_cache(name, cache):
|
||||
version = read_cache_version(name)
|
||||
if _local_versions.get(name) != version:
|
||||
cache.clear()
|
||||
_local_versions[name] = version
|
||||
|
||||
|
||||
def bump_cache_version(name, cache=None):
|
||||
try:
|
||||
with db:
|
||||
db.query(
|
||||
"INSERT INTO cache_state (name, version, updated_at) VALUES (:name, 1, :stamp) "
|
||||
"ON CONFLICT(name) DO UPDATE SET version = version + 1, updated_at = excluded.updated_at",
|
||||
name=name,
|
||||
stamp=now_iso(),
|
||||
)
|
||||
except Exception as exc:
|
||||
logger.warning("cache version bump failed for %s: %s", name, exc)
|
||||
_version_cache.pop(name)
|
||||
if cache is not None:
|
||||
cache.clear()
|
||||
_local_versions.pop(name, None)
|
||||
|
||||
|
||||
def get_setting(key, default=None):
|
||||
if default is None:
|
||||
default = SETTINGS_DEFAULTS.get(key, "")
|
||||
sync_local_cache("settings", _settings_cache)
|
||||
cached = _settings_cache.get(key)
|
||||
if cached is not None:
|
||||
return cached
|
||||
value = default
|
||||
if "site_settings" in db.tables:
|
||||
row = db["site_settings"].find_one(uid=f"setting_{key}")
|
||||
if row is None:
|
||||
row = db["site_settings"].find_one(uid=f"default_{key}")
|
||||
if row is not None and row.get("value") is not None:
|
||||
value = str(row["value"])
|
||||
_settings_cache.set(key, value)
|
||||
return value
|
||||
|
||||
|
||||
def get_int_setting(key, default):
|
||||
try:
|
||||
return int(get_setting(key, str(default)))
|
||||
except (TypeError, ValueError):
|
||||
return default
|
||||
|
||||
|
||||
def set_setting(key, value):
|
||||
db["site_settings"].upsert(
|
||||
{"uid": f"setting_{key}", "key": key, "value": str(value), "updated_at": now_iso()},
|
||||
["uid"],
|
||||
)
|
||||
bump_cache_version("settings", _settings_cache)
|
||||
|
||||
|
||||
def all_settings():
|
||||
return {key: get_setting(key, default) for key, default in SETTINGS_DEFAULTS.items()}
|
||||
Reference in New Issue
Block a user