# 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 link(self, obj):
return f"{settings.WAGTAILADMIN_BASE_URL}/feed/"
[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_link(self, item):
return item.get("item_link", 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)