from django.contrib.syndication.views import Feed from django.urls import reverse from django.utils.html import strip_tags from django.utils.feedgenerator import Atom1Feed from blog.models import Blog, Cat_Blog class LatestArticlesFeed(Feed): """ Flux RSS pour les derniers articles du blog """ title = "Blog Duhaz - Derniers articles" link = "/blog/" description = "Les derniers articles publiés sur le blog Duhaz" # Métadonnées du flux author_name = "Mr Duhaz" feed_copyright = "Copyright (c) Duhaz" # Nombre d'articles dans le flux feed_size = 20 def items(self): """Retourne les derniers articles publiés""" return Blog.objects.filter(b_publier=True).order_by('-b_publdate')[:self.feed_size] def item_title(self, item): """Titre de l'article""" return item.b_titre def item_description(self, item): """Description de l'article (sans HTML)""" return strip_tags(item.b_description) def item_link(self, item): """Lien vers l'article""" return reverse('blog_play', args=[item.b_titre_slugify]) def item_pubdate(self, item): """Date de publication""" return item.b_publdate def item_categories(self, item): """Catégories de l'article""" return [cat.cb_titre for cat in item.b_cat.all()] def item_author_name(self, item): """Auteur de l'article""" return "Mr Duhaz" class LatestArticlesAtomFeed(LatestArticlesFeed): """ Flux Atom pour les derniers articles (alternative au RSS) """ feed_type = Atom1Feed subtitle = LatestArticlesFeed.description class CategoryArticlesFeed(Feed): """ Flux RSS par catégorie """ author_name = "Mr Duhaz" feed_copyright = "Copyright (c) Duhaz" feed_size = 20 def get_object(self, request, cat_slug): """Récupère la catégorie depuis l'URL""" return Cat_Blog.objects.get(cb_titre_slgify=cat_slug) def title(self, obj): return f"Blog Duhaz - Articles de la catégorie {obj.cb_titre}" def link(self, obj): return reverse('blog_cat', args=[obj.cb_titre_slgify]) def description(self, obj): return f"Les derniers articles de la catégorie {obj.cb_titre}" def items(self, obj): """Retourne les articles de la catégorie""" return Blog.objects.filter( b_publier=True, b_cat=obj ).order_by('-b_publdate')[:self.feed_size] def item_title(self, item): return item.b_titre def item_description(self, item): return strip_tags(item.b_description) def item_link(self, item): return reverse('blog_play', args=[item.b_titre_slugify]) def item_pubdate(self, item): return item.b_publdate def item_categories(self, item): return [cat.cb_titre for cat in item.b_cat.all()]