From f4dc07b6b90909ab28cda3ec5e37d3f471801a34 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 1 Mar 2022 09:49:34 -0800 Subject: [PATCH] Select theme in context processors --- bookwyrm/context_processors.py | 10 ++- bookwyrm/models/user.py | 11 --- bookwyrm/templates/layout.html | 4 +- bookwyrm/tests/test_context_processors.py | 86 +++++++++++++++++++++++ 4 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 bookwyrm/tests/test_context_processors.py diff --git a/bookwyrm/context_processors.py b/bookwyrm/context_processors.py index 309e84ed..b5110d24 100644 --- a/bookwyrm/context_processors.py +++ b/bookwyrm/context_processors.py @@ -8,8 +8,16 @@ def site_settings(request): # pylint: disable=unused-argument if not request.is_secure(): request_protocol = "http://" + site = models.SiteSettings.objects.get() + theme = "css/themes/bookwyrm-light.scss" + if request.user.is_authenticated and request.user.theme: + theme = request.user.theme.path + elif site.default_theme: + theme = site.default_theme.path + return { - "site": models.SiteSettings.objects.get(), + "site": site, + "site_theme": theme, "active_announcements": models.Announcement.active_announcements(), "thumbnail_generation_enabled": settings.ENABLE_THUMBNAIL_GENERATION, "media_full_url": settings.MEDIA_FULL_URL, diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index e4b98db3..be5c1992 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -174,17 +174,6 @@ class User(OrderedCollectionPageMixin, AbstractUser): property_fields = [("following_link", "following")] field_tracker = FieldTracker(fields=["name", "avatar"]) - @property - def get_theme(self): - """get the theme given the user/site""" - if self.theme: - return self.theme.path - site_model = apps.get_model("bookwyrm", "SiteSettings", require_ready=True) - site = site_model.objects.get() - if site.default_theme: - return site.default_theme.path - return "css/themes/bookwyrm-light.scss" - @property def confirmation_link(self): """helper for generating confirmation links""" diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index 444241e5..51ba7915 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -8,9 +8,7 @@ {% block title %}BookWyrm{% endblock %} - {{ site.name }} - {% with theme_path=user.get_theme %} - - {% endwith %} + diff --git a/bookwyrm/tests/test_context_processors.py b/bookwyrm/tests/test_context_processors.py new file mode 100644 index 00000000..3d634aaf --- /dev/null +++ b/bookwyrm/tests/test_context_processors.py @@ -0,0 +1,86 @@ +""" test for context processor """ +from unittest.mock import patch +from django.contrib.auth.models import AnonymousUser +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models +from bookwyrm.context_processors import site_settings + + +class ContextProcessor(TestCase): + """pages you land on without really trying""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + self.site = models.SiteSettings.objects.create() + + def test_theme_unset(self): + """logged in user, no selected theme""" + request = self.factory.get("") + request.user = self.local_user + settings = site_settings(request) + self.assertEqual(settings["site_theme"], "css/themes/bookwyrm-light.scss") + + def test_theme_unset_logged_out(self): + """logged out user, no selected theme""" + request = self.factory.get("") + request.user = self.anonymous_user + settings = site_settings(request) + self.assertEqual(settings["site_theme"], "css/themes/bookwyrm-light.scss") + + def test_theme_instance_default(self): + """logged in user, instance default theme""" + self.site.default_theme = models.Theme.objects.get(name="BookWyrm Dark") + self.site.save() + + request = self.factory.get("") + request.user = self.local_user + settings = site_settings(request) + self.assertEqual(settings["site_theme"], "css/themes/bookwyrm-dark.scss") + + def test_theme_instance_default_logged_out(self): + """logged out user, instance default theme""" + self.site.default_theme = models.Theme.objects.get(name="BookWyrm Dark") + self.site.save() + + request = self.factory.get("") + request.user = self.anonymous_user + settings = site_settings(request) + self.assertEqual(settings["site_theme"], "css/themes/bookwyrm-dark.scss") + + def test_theme_user_set(self): + """logged in user, user theme""" + self.local_user.theme = models.Theme.objects.get(name="BookWyrm Dark") + self.local_user.save(broadcast=False, update_fields=["theme"]) + + request = self.factory.get("") + request.user = self.local_user + settings = site_settings(request) + self.assertEqual(settings["site_theme"], "css/themes/bookwyrm-dark.scss") + + def test_theme_user_set_instance_default(self): + """logged in user, instance default theme""" + self.site.default_theme = models.Theme.objects.get(name="BookWyrm Dark") + self.site.save() + + self.local_user.theme = models.Theme.objects.get(name="BookWyrm Light") + self.local_user.save(broadcast=False, update_fields=["theme"]) + + request = self.factory.get("") + request.user = self.local_user + settings = site_settings(request) + self.assertEqual(settings["site_theme"], "css/themes/bookwyrm-light.scss")