From 5903e60057ee26b163326cfb9e5dc5292b30ab83 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Tue, 8 Feb 2022 21:23:38 +0100
Subject: [PATCH] Invalidate both database backends

---
 CHANGELOG.rst                     |  1 +
 aleksis/core/util/core_helpers.py | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 18bc5e283..2449b5d35 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -15,6 +15,7 @@ Fixed
 * Inviting newly created persons for registration failed
 * [Docker] Do not clear cache in migration container die to session invalidation issues
 * Notification email about user changes was broken
+* SQL cache invalidation could fail when hitting OOT database
 
 `2.7.3`_ - 2022-02-03
 ---------------------
diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py
index fc83b6050..6988dd531 100644
--- a/aleksis/core/util/core_helpers.py
+++ b/aleksis/core/util/core_helpers.py
@@ -17,6 +17,8 @@ from django.utils.crypto import get_random_string
 from django.utils.functional import lazy
 from django.utils.module_loading import import_string
 
+from cachalot.api import invalidate
+from cachalot.signals import post_invalidation
 from cache_memoize import cache_memoize
 
 
@@ -403,6 +405,8 @@ class OOTRouter:
     default_db = "default"
     oot_db = "default_oot"
 
+    _cachalot_invalidating = []
+
     @property
     def oot_labels(self):
         return settings.DATABASE_OOT_LABELS
@@ -441,3 +445,20 @@ class OOTRouter:
             return False
 
         return None
+
+    @classmethod
+    def _invalidate_cachalot(cls, sender, **kwargs):
+        if sender in cls._cachalot_invalidating:
+            return
+        cls._cachalot_invalidating.append(sender)
+
+        if kwargs["db_alias"] == cls.default_db:
+            invalidate(sender, db_alias=cls.oot_db)
+        elif kwargs["db_alias"] == cls.oot_db:
+            invalidate(sender, db_alias=cls.default_db)
+
+        if sender in cls._cachalot_invalidating:
+            cls._cachalot_invalidating.remove(sender)
+
+
+post_invalidation.connect(OOTRouter._invalidate_cachalot)
-- 
GitLab