diff --git a/hub/services/feeds.py b/hub/services/feeds.py new file mode 100644 index 0000000..5205318 --- /dev/null +++ b/hub/services/feeds.py @@ -0,0 +1,73 @@ +""" +RSS Feeds for the Servala website +""" + +from django.contrib.syndication.views import Feed +from django.urls import reverse +from django.utils.feedgenerator import Rss201rev2Feed +from django.utils.html import strip_tags +from .models import Article + + +class ArticleRSSFeed(Feed): + """RSS feed for published articles""" + + title = "Servala Articles" + link = "/articles/" + description = "Latest articles about cloud services, consulting partners, and technology insights from Servala" + feed_type = Rss201rev2Feed + + def items(self): + """Return the latest 20 published articles""" + return Article.objects.filter(is_published=True).order_by("-article_date")[:20] + + def item_title(self, item): + """Return the article title""" + return item.title + + def item_description(self, item): + """Return the article excerpt with 'Read more' link""" + # Use the excerpt and add a read more link + excerpt = strip_tags(item.excerpt) + return f"{excerpt} Read more..." + + def item_link(self, item): + """Return the link to the article detail page""" + return item.get_absolute_url() + + def item_guid(self, item): + """Return a unique identifier for the item""" + return f"article-{item.id}" + + def item_pubdate(self, item): + """Return the publication date""" + # Convert date to datetime for RSS compatibility + from datetime import datetime, time + from django.utils import timezone + + # Combine the date with midnight time and make it timezone-aware + dt = datetime.combine(item.article_date, time.min) + return timezone.make_aware(dt, timezone.get_current_timezone()) + + def item_author_name(self, item): + """Return the author name""" + return item.author.get_full_name() or item.author.username + + def item_categories(self, item): + """Return categories for the article""" + categories = [] + + # Add related entity as category + if item.related_service: + categories.append(f"Service: {item.related_service.name}") + if item.related_consulting_partner: + categories.append(f"Partner: {item.related_consulting_partner.name}") + if item.related_cloud_provider: + categories.append(f"Provider: {item.related_cloud_provider.name}") + + # Add meta keywords as categories if available + if item.meta_keywords: + keywords = [keyword.strip() for keyword in item.meta_keywords.split(",")] + categories.extend(keywords) + + return categories