Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions src/core/homepage_elements/featured/hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
1 change: 1 addition & 0 deletions src/core/homepage_elements/featured/plugin_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
57 changes: 57 additions & 0 deletions src/core/homepage_elements/featured/tests.py
Original file line number Diff line number Diff line change
@@ -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, {})
25 changes: 25 additions & 0 deletions src/journal/tests/test_journal_frontend.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@
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
from press.models import Press
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


Expand Down Expand Up @@ -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(
Expand Down
8 changes: 7 additions & 1 deletion src/journal/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down