diff --git a/src/core/homepage_elements/featured/hooks.py b/src/core/homepage_elements/featured/hooks.py index c214302d1f..7de2cda7b1 100755 --- a/src/core/homepage_elements/featured/hooks.py +++ b/src/core/homepage_elements/featured/hooks.py @@ -2,14 +2,18 @@ def yield_homepage_element_context(request, homepage_elements): - if ( - homepage_elements is not None - and homepage_elements.filter(name="Featured Articles").exists() - ): - featured_articles = models.FeaturedArticle.objects.filter( - journal=request.journal - ) - - return {"featured_articles": featured_articles} - else: + if homepage_elements is None: return {} + + featured_element = homepage_elements.filter( + configure_url="featured_articles_setup" + ).first() + + if not featured_element: + return {} + + featured_articles = models.FeaturedArticle.objects.filter( + journal=request.journal + ) + + return {"featured_articles": featured_articles} diff --git a/src/core/homepage_elements/featured/plugin_settings.py b/src/core/homepage_elements/featured/plugin_settings.py index 25d2ca21d6..44bdcb7180 100755 --- a/src/core/homepage_elements/featured/plugin_settings.py +++ b/src/core/homepage_elements/featured/plugin_settings.py @@ -51,6 +51,7 @@ def hook_registry(): "module": "core.homepage_elements.featured.hooks", "function": "yield_homepage_element_context", "name": PLUGIN_NAME, + "configure_url": "featured_articles_setup", } } except OperationalError: diff --git a/src/core/homepage_elements/featured/tests.py b/src/core/homepage_elements/featured/tests.py new file mode 100644 index 0000000000..194b280bad --- /dev/null +++ b/src/core/homepage_elements/featured/tests.py @@ -0,0 +1,57 @@ +from django.test import TestCase + +from core import models as core_models +from core.homepage_elements.featured import hooks, models as featured_models +from utils.testing import helpers + + +class FeaturedHomepageElementHookTests(TestCase): + @classmethod + def setUpTestData(cls): + cls.press = helpers.create_press() + cls.journal, _journal_two = helpers.create_journals() + cls.request = helpers.get_request( + press=cls.press, + journal=cls.journal, + ) + cls.article = helpers.create_article( + cls.journal, + date_published=helpers.get_aware_datetime("2024-01-01"), + ) + + def test_hook_uses_stable_identifier_when_element_is_renamed(self): + homepage_element = core_models.HomepageElement.objects.create( + name="Editor's Picks", + configure_url="featured_articles_setup", + template_path="journal/homepage_elements/featured.html", + object=self.journal, + active=True, + ) + featured = featured_models.FeaturedArticle.objects.create( + article=self.article, + journal=self.journal, + ) + + context = hooks.yield_homepage_element_context( + self.request, + core_models.HomepageElement.objects.filter(pk=homepage_element.pk), + ) + + self.assertIn("featured_articles", context) + self.assertEqual(list(context["featured_articles"]), [featured]) + + def test_hook_returns_empty_context_without_featured_element(self): + other_element = core_models.HomepageElement.objects.create( + name="Popular Articles", + configure_url="popular_articles_setup", + template_path="journal/homepage_elements/popular.html", + object=self.journal, + active=True, + ) + + context = hooks.yield_homepage_element_context( + self.request, + core_models.HomepageElement.objects.filter(pk=other_element.pk), + ) + + self.assertEqual(context, {}) diff --git a/src/journal/tests/test_journal_frontend.py b/src/journal/tests/test_journal_frontend.py index 2fc6448704..17ce6195c2 100644 --- a/src/journal/tests/test_journal_frontend.py +++ b/src/journal/tests/test_journal_frontend.py @@ -2,6 +2,7 @@ from django.urls import reverse from django.utils import timezone from django.urls.base import clear_script_prefix +from django.contrib.contenttypes.models import ContentType from journal import models from journal.tests.utils import make_test_journal @@ -9,6 +10,7 @@ from utils.testing import helpers from utils import setting_handler from core import models as core_models +from core.homepage_elements.featured import models as featured_models from submission import models as submission_models @@ -101,6 +103,29 @@ def test_flat_front_end_pages(self): response = self.client.get(reverse(page), SERVER_NAME=self.journal_domain) self.assertEqual(response.status_code, 200) + def test_homepage_renders_featured_articles_when_element_is_renamed(self): + core_models.HomepageElement.objects.create( + name="Editor's Picks", + configure_url="featured_articles_setup", + template_path="journal/homepage_elements/featured.html", + content_type=ContentType.objects.get_for_model(self.journal), + object_id=self.journal.pk, + active=True, + has_config=True, + ) + featured_models.FeaturedArticle.objects.create( + article=self.published_article, + journal=self.journal, + ) + + response = self.client.get( + reverse("website_index"), + SERVER_NAME=self.journal_domain, + ) + + self.assertEqual(response.status_code, 200) + self.assertContains(response, self.article_title) + def test_issue_page(self): response = self.client.get( reverse( diff --git a/src/journal/views.py b/src/journal/views.py index c202bdf359..69b1bf252d 100755 --- a/src/journal/views.py +++ b/src/journal/views.py @@ -93,7 +93,13 @@ def home(request): # call all registered plugin block hooks to get relevant contexts for hook in settings.PLUGIN_HOOKS.get("yield_homepage_element_context", []): - if hook.get("name") in homepage_element_names: + hook_configure_url = hook.get("configure_url") + hook_is_active = ( + homepage_elements.filter(configure_url=hook_configure_url).exists() + if hook_configure_url + else hook.get("name") in homepage_element_names + ) + if hook_is_active: try: hook_module = plugin_loader.import_module(hook.get("module")) function = getattr(hook_module, hook.get("function"))