From a6eb7254c4586403eab003636dd205a14138e826 Mon Sep 17 00:00:00 2001 From: Iacopo Spalletti Date: Fri, 21 Apr 2023 00:00:21 +0200 Subject: [PATCH] Add include_in_rss field to Post (#728) * Added include_in_rss field to Post * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --------- Co-authored-by: Gerben Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- changes/663.feature | 1 + djangocms_blog/admin.py | 2 +- djangocms_blog/feeds.py | 6 +++++- djangocms_blog/managers.py | 7 +++++++ .../migrations/0040_post_include_in_rss.py | 17 +++++++++++++++++ djangocms_blog/models.py | 1 + tests/test_views.py | 15 +++++++++++++++ 7 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 changes/663.feature create mode 100644 djangocms_blog/migrations/0040_post_include_in_rss.py diff --git a/changes/663.feature b/changes/663.feature new file mode 100644 index 00000000..ea407f33 --- /dev/null +++ b/changes/663.feature @@ -0,0 +1 @@ +Add include in rss field to post, to be able to exclude blog items from rss feed. diff --git a/djangocms_blog/admin.py b/djangocms_blog/admin.py index 042a8501..f53846af 100644 --- a/djangocms_blog/admin.py +++ b/djangocms_blog/admin.py @@ -124,7 +124,7 @@ class PostAdmin(PlaceholderAdminMixin, FrontendEditableAdminMixin, ModelAppHookC if apps.is_installed("djangocms_blog.liveblog"): actions += ["enable_liveblog", "disable_liveblog"] _fieldsets = [ - (None, {"fields": ["title", "subtitle", "slug", "publish", ["categories", "app_config"]]}), + (None, {"fields": ["title", "subtitle", "slug", "publish", "include_in_rss", ["categories", "app_config"]]}), # left empty for sites, author and related fields (None, {"fields": [[]]}), ( diff --git a/djangocms_blog/feeds.py b/djangocms_blog/feeds.py index 5e215298..d3a47cc8 100644 --- a/djangocms_blog/feeds.py +++ b/djangocms_blog/feeds.py @@ -39,7 +39,11 @@ def description(self): return _("Blog articles on %(site_name)s") % {"site_name": Site.objects.get_current().name} def items(self, obj=None): - return Post.objects.namespace(self.namespace).published().order_by("-date_published")[: self.feed_items_number] + return ( + Post.objects.namespace(self.namespace) + .published_on_rss() + .order_by("-date_published")[: self.feed_items_number] + ) def item_title(self, item): return mark_safe(item.safe_translation_getter("title")) diff --git a/djangocms_blog/managers.py b/djangocms_blog/managers.py index 48cbb6bd..5ed465f5 100644 --- a/djangocms_blog/managers.py +++ b/djangocms_blog/managers.py @@ -98,6 +98,10 @@ def published(self, current_site=True): else: return queryset + def published_on_rss(self, current_site=True): + queryset = self.published_future(current_site) + return queryset.exclude(include_in_rss=False) + def published_future(self, current_site=True): if current_site: queryset = self.on_site() @@ -144,6 +148,9 @@ def get_queryset(self, *args, **kwargs): def published(self, current_site=True): return self.get_queryset().published(current_site) + def published_on_rss(self, current_site=True): + return self.get_queryset().published_on_rss(current_site) + def available(self, current_site=True): return self.get_queryset().available(current_site) diff --git a/djangocms_blog/migrations/0040_post_include_in_rss.py b/djangocms_blog/migrations/0040_post_include_in_rss.py new file mode 100644 index 00000000..241bc57a --- /dev/null +++ b/djangocms_blog/migrations/0040_post_include_in_rss.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2 on 2021-10-25 12:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("djangocms_blog", "0039_auto_20200331_2227"), + ] + + operations = [ + migrations.AddField( + model_name="post", + name="include_in_rss", + field=models.BooleanField(default=True, verbose_name="include in RSS feed"), + ), + ] diff --git a/djangocms_blog/models.py b/djangocms_blog/models.py index d84fa2fd..68f6ae74 100644 --- a/djangocms_blog/models.py +++ b/djangocms_blog/models.py @@ -205,6 +205,7 @@ class Post(KnockerModel, BlogMetaMixin, TranslatableModel): date_published_end = models.DateTimeField(_("published until"), null=True, blank=True) date_featured = models.DateTimeField(_("featured date"), null=True, blank=True) publish = models.BooleanField(_("publish"), default=False) + include_in_rss = models.BooleanField(_("include in RSS feed"), default=True) categories = models.ManyToManyField( "djangocms_blog.BlogCategory", verbose_name=_("category"), related_name="blog_posts", blank=True ) diff --git a/tests/test_views.py b/tests/test_views.py index 0b76409e..a53e6984 100644 --- a/tests/test_views.py +++ b/tests/test_views.py @@ -423,6 +423,21 @@ def test_feed(self): feed.config = self.app_config_1 self.assertEqual(list(feed.items("tag-2")), [posts[0]]) + with smart_override("en"): + with switch_language(posts[0], "en"): + posts[0].include_in_rss = False + posts[0].save() + + request = self.get_page_request(pages[1], self.user, path=posts[0].get_absolute_url()) + + feed = LatestEntriesFeed() + feed.namespace, feed.config = get_app_instance(request) + self.assertEqual(len(list(feed.items())), 0) + self.reload_urlconf() + + posts[0].include_in_rss = True + posts[0].save() + class SitemapViewTest(BaseTest): def test_sitemap(self):