From ac1d365eb9090481fe312a0fcb0cabb601c57a35 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Mon, 11 Aug 2025 09:46:39 -0400 Subject: [PATCH 1/2] purge sitetree cache on change - matches our caching between dev/prod - adds signal to purge sitetree caches on change Note: we _should_ migrate to redis for caching, it wasn't around when we first added it --- Makefile | 3 +++ pydotorg/apps.py | 8 ++++++++ pydotorg/settings/base.py | 1 + pydotorg/settings/local.py | 4 ++-- pydotorg/signals.py | 14 ++++++++++++++ 5 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 pydotorg/apps.py create mode 100644 pydotorg/signals.py diff --git a/Makefile b/Makefile index ae0c143dc..c64f2de89 100644 --- a/Makefile +++ b/Makefile @@ -17,11 +17,14 @@ default: help .state/db-migrated: # Call migrate target make migrate + docker compose run --rm web ./manage.py createcachetable # Mark the state so we don't rebuild this needlessly. mkdir -p .state && touch .state/db-migrated .state/db-initialized: .state/docker-build-web .state/db-migrated + # Ensure cache table + docker compose run --rm web ./manage.py createcachetable # Load all fixtures docker compose run --rm web ./manage.py loaddata fixtures/*.json diff --git a/pydotorg/apps.py b/pydotorg/apps.py new file mode 100644 index 000000000..44992e7d9 --- /dev/null +++ b/pydotorg/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class PyDotOrgConfig(AppConfig): + name = "pydotorg" + + def ready(self): + import pydotorg.signals # noqa: F401 diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index 2c392b355..512b9632d 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -208,6 +208,7 @@ 'django_countries', 'sorl.thumbnail', + 'pydotorg', 'banners', 'blogs', 'boxes', diff --git a/pydotorg/settings/local.py b/pydotorg/settings/local.py index 6525d9837..5735c9865 100644 --- a/pydotorg/settings/local.py +++ b/pydotorg/settings/local.py @@ -64,8 +64,8 @@ CACHES = { 'default': { - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - 'LOCATION': 'pythondotorg-local-cache', + 'BACKEND': 'django.core.cache.backends.db.DatabaseCache', + 'LOCATION': 'django_cache_table', } } diff --git a/pydotorg/signals.py b/pydotorg/signals.py new file mode 100644 index 000000000..1d19f34ce --- /dev/null +++ b/pydotorg/signals.py @@ -0,0 +1,14 @@ +from django.db.models.signals import m2m_changed, post_delete, post_save +from django.dispatch import receiver + +from sitetree.models import Tree, TreeItem +from sitetree.sitetreeapp import get_sitetree + +@receiver(post_save, sender=Tree) +@receiver(post_save, sender=TreeItem) +@receiver(post_delete, sender=TreeItem) +@receiver(m2m_changed, sender=TreeItem.access_permissions) +def purge_sitetree_cache(sender, instance, **kwargs): + cache_ = get_sitetree().cache + cache_.empty() + cache_.reset() From 51b12a44576b886f066d8a53b2a7d3ea4c5b9b8e Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Mon, 11 Aug 2025 10:19:28 -0400 Subject: [PATCH 2/2] fix test --- sponsors/tests/test_models.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sponsors/tests/test_models.py b/sponsors/tests/test_models.py index 3566f0b08..e7bb7a64c 100644 --- a/sponsors/tests/test_models.py +++ b/sponsors/tests/test_models.py @@ -8,7 +8,7 @@ from django import forms from django.conf import settings from django.core.mail import EmailMessage -from django.test import TestCase +from django.test import TestCase, override_settings from django.utils import timezone from ..models import ( @@ -327,6 +327,12 @@ def test_singleton_object_cannot_be_deleted(self): self.assertIn("Singleton object cannot be delete. Try updating it instead.", str(context.exception)) + @override_settings(CACHES={ + "default": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", + "LOCATION": "pythondotorg-local-cache", + } + }) def test_current_year_is_cached(self): # cleans cached from previous test runs cache.clear()