Fix: prevent duplicate cachalot app in Django settings (#10300)

---------

Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com>
This commit is contained in:
Antoine Mérino 2025-07-01 18:11:58 +02:00 committed by GitHub
parent f3b6e15321
commit 733a9674d6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 17 additions and 27 deletions

View File

@ -918,7 +918,6 @@ CELERY_BEAT_SCHEDULE_FILENAME = str(DATA_DIR / "celerybeat-schedule.db")
# Cachalot: Database read cache. # Cachalot: Database read cache.
def _parse_cachalot_settings(): def _parse_cachalot_settings():
global INSTALLED_APPS
ttl = __get_int("PAPERLESS_READ_CACHE_TTL", 3600) ttl = __get_int("PAPERLESS_READ_CACHE_TTL", 3600)
ttl = min(ttl, 31536000) if ttl > 0 else 3600 ttl = min(ttl, 31536000) if ttl > 0 else 3600
_, redis_url = _parse_redis_url( _, redis_url = _parse_redis_url(
@ -936,18 +935,18 @@ def _parse_cachalot_settings():
"CACHALOT_REDIS_URL": redis_url, "CACHALOT_REDIS_URL": redis_url,
"CACHALOT_TIMEOUT": ttl, "CACHALOT_TIMEOUT": ttl,
} }
if result["CACHALOT_ENABLED"]:
INSTALLED_APPS.append("cachalot")
return result return result
_cachalot_settings = _parse_cachalot_settings() cachalot_settings = _parse_cachalot_settings()
CACHALOT_ENABLED = _cachalot_settings["CACHALOT_ENABLED"] CACHALOT_ENABLED = cachalot_settings["CACHALOT_ENABLED"]
CACHALOT_CACHE = _cachalot_settings["CACHALOT_CACHE"] if CACHALOT_ENABLED: # pragma: no cover
CACHALOT_TIMEOUT = _cachalot_settings["CACHALOT_TIMEOUT"] INSTALLED_APPS.append("cachalot")
CACHALOT_QUERY_KEYGEN = _cachalot_settings["CACHALOT_QUERY_KEYGEN"] CACHALOT_CACHE = cachalot_settings["CACHALOT_CACHE"]
CACHALOT_TABLE_KEYGEN = _cachalot_settings["CACHALOT_TABLE_KEYGEN"] CACHALOT_TIMEOUT = cachalot_settings["CACHALOT_TIMEOUT"]
CACHALOT_FINAL_SQL_CHECK = _cachalot_settings["CACHALOT_FINAL_SQL_CHECK"] CACHALOT_QUERY_KEYGEN = cachalot_settings["CACHALOT_QUERY_KEYGEN"]
CACHALOT_TABLE_KEYGEN = cachalot_settings["CACHALOT_TABLE_KEYGEN"]
CACHALOT_FINAL_SQL_CHECK = cachalot_settings["CACHALOT_FINAL_SQL_CHECK"]
# Django default & Cachalot cache configuration # Django default & Cachalot cache configuration
@ -968,7 +967,7 @@ def _parse_caches():
}, },
"read-cache": { "read-cache": {
"BACKEND": _CACHE_BACKEND, "BACKEND": _CACHE_BACKEND,
"LOCATION": _parse_cachalot_settings()["CACHALOT_REDIS_URL"], "LOCATION": cachalot_settings["CACHALOT_REDIS_URL"],
"KEY_PREFIX": _REDIS_KEY_PREFIX, "KEY_PREFIX": _REDIS_KEY_PREFIX,
}, },
} }
@ -977,9 +976,6 @@ def _parse_caches():
CACHES = _parse_caches() CACHES = _parse_caches()
del _cachalot_settings
def default_threads_per_worker(task_workers) -> int: def default_threads_per_worker(task_workers) -> int:
# always leave one core open # always leave one core open
available_cores = max(multiprocessing.cpu_count(), 1) available_cores = max(multiprocessing.cpu_count(), 1)

View File

@ -63,26 +63,20 @@ class TestDbCacheSettings:
}, },
) )
def test_cachalot_custom_settings(self): def test_cachalot_custom_settings(self):
cachalot_settings = _parse_cachalot_settings() settings = _parse_cachalot_settings()
assert "cachalot" in settings.INSTALLED_APPS
caches = _parse_caches()
# Modifiable settings assert settings["CACHALOT_ENABLED"]
assert cachalot_settings["CACHALOT_ENABLED"] assert settings["CACHALOT_TIMEOUT"] == 7200
assert cachalot_settings["CACHALOT_TIMEOUT"] == 7200 assert settings["CACHALOT_CACHE"] == "read-cache"
assert caches["read-cache"]["LOCATION"] == "redis://localhost:6380/7"
# Fixed settings
assert cachalot_settings["CACHALOT_CACHE"] == "read-cache"
assert ( assert (
cachalot_settings["CACHALOT_QUERY_KEYGEN"] settings["CACHALOT_QUERY_KEYGEN"]
== "paperless.db_cache.custom_get_query_cache_key" == "paperless.db_cache.custom_get_query_cache_key"
) )
assert ( assert (
cachalot_settings["CACHALOT_TABLE_KEYGEN"] settings["CACHALOT_TABLE_KEYGEN"]
== "paperless.db_cache.custom_get_table_cache_key" == "paperless.db_cache.custom_get_table_cache_key"
) )
assert cachalot_settings["CACHALOT_FINAL_SQL_CHECK"] is True assert settings["CACHALOT_FINAL_SQL_CHECK"] is True
@pytest.mark.parametrize( @pytest.mark.parametrize(
("env_var_ttl", "expected_cachalot_timeout"), ("env_var_ttl", "expected_cachalot_timeout"),