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() 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()