+ {% trans "Outdated cache keys" %}
+
+
+ {% blocktrans trimmed %}
+ This will scan for keys in the Django redis cache that use no prefix (the current prefix is {{ prefix }}
), and identify Activity Streams for users with deleted accounts.
+ {% endblocktrans %}
+
+
+ {% if outdated_identified is not None %}
+
+ {% blocktrans trimmed with keys=outdated_identified|intcomma %}
+ {{ keys }} identified
+ {% endblocktrans %}
+
+
+ {% if outdated_identified > 0 %}
+
+ {% endif %}
+ {% else %}
+
+ {% endif %}
+
+
+
+
+ {% trans "Advanced" %}
+
+
+
+ {% trans "Clear Django Cache" %}
+
+
+
+
+
+ {% blocktrans trimmed %}
+ This is NOT recommended and should only be used if something has gone very wrong with your cache. All sessions will be cleared and users will be logged out of their accounts.
+ {% endblocktrans %}
+
+
+ {% if cache_deleted %}
+
+ {% blocktrans trimmed with keys=cache_deleted|intcomma %}
+ {{ keys }} keys deleted
+ {% endblocktrans %}
+
+ {% else %}
+
+ {% endif %}
+
+
+
+{% else %}
+
+
+
{% trans "Errors" %}
+ {% for error in errors %}
+
{{ error }}
+{% endfor %}
+
+
+{% endif %}
+
+{% endblock %}
diff --git a/bookwyrm/tests/views/admin/test_redis.py b/bookwyrm/tests/views/admin/test_redis.py
new file mode 100644
index 0000000000..e59bf32dec
--- /dev/null
+++ b/bookwyrm/tests/views/admin/test_redis.py
@@ -0,0 +1,93 @@
+""" test for app action functionality """
+from unittest.mock import patch
+
+from django.contrib.auth.models import Group
+from django.template.response import TemplateResponse
+from django.test import TestCase
+from django.test.client import RequestFactory
+
+from bookwyrm import models, views
+from bookwyrm.management.commands import initdb
+from bookwyrm.tests.validate_html import validate_html
+
+
+class RedisStatusViews(TestCase):
+ """every response to a get request, html or json"""
+
+ @classmethod
+ def setUpTestData(cls):
+ """we need basic test data and mocks"""
+ with (
+ patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"),
+ patch("bookwyrm.activitystreams.populate_stream_task.delay"),
+ patch("bookwyrm.lists_stream.populate_lists_task.delay"),
+ ):
+ cls.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="admin")
+ cls.local_user.groups.set([group])
+ models.SiteSettings.objects.create()
+
+ def setUp(self):
+ """individual test setup"""
+ self.factory = RequestFactory()
+
+ def test_redis_status_get(self):
+ """there are so many views, this just makes sure it LOADS"""
+ view = views.RedisStatus.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_redis_status_post_scan_keys(self):
+ """count keys in redis"""
+ view = views.RedisStatus.as_view()
+ request = self.factory.post("", {"dry_run": True})
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+ self.assertTrue("outdated_identified" in result.context_data)
+ self.assertFalse("outdated_deleted" in result.context_data)
+ self.assertFalse("cache_deleted" in result.context_data)
+
+ def test_redis_status_post_erase_keys(self):
+ """count keys in redis"""
+ view = views.RedisStatus.as_view()
+ request = self.factory.post("")
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+ self.assertFalse("outdated_identified" in result.context_data)
+ self.assertTrue("outdated_deleted" in result.context_data)
+ self.assertFalse("cache_deleted" in result.context_data)
+
+ def test_redis_status_post_erase_cache(self):
+ """count keys in redis"""
+ view = views.RedisStatus.as_view()
+ request = self.factory.post("", {"erase_cache": True})
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+ self.assertFalse("outdated_identified" in result.context_data)
+ self.assertFalse("outdated_deleted" in result.context_data)
+ self.assertTrue("cache_deleted" in result.context_data)
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index cd75eb0c02..18d485a443 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -369,6 +369,7 @@
re_path(
r"^settings/celery/ping/?$", views.celery_ping, name="settings-celery-ping"
),
+ re_path(r"^settings/redis/?$", views.RedisStatus.as_view(), name="settings-redis"),
re_path(
r"^settings/schedules/(?P