Source code for eucrim.feed.feeds

# SPDX-FileCopyrightText: 2024 Thomas Breitner <t.breitner@csl.mpg.de>
#
# SPDX-License-Identifier: EUPL-1.2

from operator import itemgetter
from django.conf import settings
from django.contrib.syndication.views import Feed

from eucrim.feed.models import NewsFeedSettings


ITEMS_PER_MODEL = 30


[docs] class LatestEntriesFeed(Feed):
[docs] def get_object(self, request, *args, **kwargs): self.request = request return self
[docs] def title(self, obj): return NewsFeedSettings.for_request(request=self.request).newsfeed_title
[docs] def description(self, obj): return NewsFeedSettings.for_request(request=self.request).newsfeed_description
[docs] def items(self): from eucrim.news.models import NewsPage from eucrim.event.models import EventPage from eucrim.article.models import ArticlePage from eucrim.issue.models import IssuePage news = NewsPage.objects.live().order_by("-first_published_at")[:ITEMS_PER_MODEL] events = EventPage.objects.live().order_by("-first_published_at")[ :ITEMS_PER_MODEL ] articles = ArticlePage.objects.live().order_by("-first_published_at")[ :ITEMS_PER_MODEL ] issues = IssuePage.public_objects.order_by("-year", "-issue_number")[ :ITEMS_PER_MODEL ] feed_news = [] for obj in news: news_item = { "item_link": obj.full_url, "item_title": f"[News] {obj.title}", "item_pubdate": obj.first_published_at, "item_updateddate": obj.last_published_at, "item_categories": ("News",), "item_description": obj.get_obj_og_description, } feed_news.append(news_item) feed_event = [] for obj in events: event_item = { "item_link": obj.full_url, "item_title": f"[Event] {obj.title}", "item_pubdate": obj.first_published_at, "item_updateddate": obj.last_published_at, "item_categories": ("Events",), "item_description": obj.excerpt, } feed_news.append(event_item) feed_article = [] for obj in articles: article_item = { "item_link": obj.full_url, "item_title": f"[Article] {obj.title}", "item_pubdate": obj.first_published_at, "item_updateddate": obj.last_published_at, "item_categories": ("Article",), "item_description": obj.excerpt if obj.excerpt else obj.auto_excerpt, } feed_article.append(article_item) feed_issue = [] for obj in issues: item_description = "[EN] {}; [FR] {}; [DE] {}".format( obj.focus_en, obj.focus_fr, obj.focus_ge, ) issue_item = { "item_link": obj.full_url, "item_title": f"[Issue] {obj.title}", "item_pubdate": obj.first_published_at, "item_updateddate": obj.last_published_at, "item_categories": ("Issue",), "item_description": item_description, } feed_issue.append(issue_item) feed_items = feed_news + feed_event + feed_article + feed_issue # Sometimes we get items which are live but "first_published_at" is None # Filter out these weird items for now... filtered_feed_items = [ item for item in feed_items if item["item_pubdate"] is not None ] sorted_feed_items = sorted( filtered_feed_items, key=itemgetter("item_pubdate"), reverse=True ) return sorted_feed_items
[docs] def item_title(self, item): return item.get("item_title", None)
[docs] def item_description(self, item): return item.get("item_description", None)
[docs] def item_categories(self, item): return item.get("item_categories", None)
[docs] def item_updateddate(self, item): return item.get("item_updateddate", None)
[docs] def item_pubdate(self, item): return item.get("item_pubdate", None)