diff --git a/entries/feeds.py b/entries/feeds.py new file mode 100644 index 0000000..00b9cb4 --- /dev/null +++ b/entries/feeds.py @@ -0,0 +1,79 @@ +from django.contrib.sites.models import Site +from django.contrib.syndication.views import Feed +from django.urls import reverse +from django.utils.feedgenerator import Atom1Feed +from urllib.parse import urljoin +from .models import Entry + + +class EntriesFeed(Feed): + def item_title(self, entry): + return entry.title + + def item_description(self, entry): + return entry.content + + def item_author_name(self, entry): + return entry.author.name + + def item_author_email(self, entry): + return entry.author.email + + def item_author_link(self, entry): + base = 'https://' + Site.objects.get_current().domain + return urljoin(base, entry.author.url) + + def item_pubdate(self, entry): + return entry.published + + def item_updatedate(self, entry): + return entry.updated + + +class RssByKind(EntriesFeed): + def __init__(self, kind): + self.kind = kind + + def title(self): + return "{0} ~ {1}".format( + self.kind.plural, + Site.objects.get_current().name, + ) + + def link(self): + return reverse('entries:' + self.kind.index) + + def description(self): + return "all {0} at {1}".format( + self.kind.plural, + Site.objects.get_current().name, + ) + + def items(self): + return Entry.objects.filter(kind=self.kind.id) + + +class AtomByKind(RssByKind): + feed_type = Atom1Feed + subtitle = RssByKind.description + + +class RssAllEntries(EntriesFeed): + def title(self): + return Site.objects.get_current().name + + def link(self): + return reverse('home:index') + + def description(self): + return "content from {0}".format( + Site.objects.get_current().name, + ) + + def items(self): + return Entry.objects.all() + + +class AtomAllEntries(RssAllEntries): + feed_type = Atom1Feed + subtitle = RssAllEntries.description diff --git a/entries/kinds.py b/entries/kinds.py index 5703f54..09b0ce1 100644 --- a/entries/kinds.py +++ b/entries/kinds.py @@ -13,6 +13,14 @@ class Entry: def entry(self): return self.plural + '_entry' + @property + def atom(self): + return self.plural + '_atom' + + @property + def rss(self): + return self.plural + '_rss' + Note = Entry( id='note', diff --git a/entries/templates/entries/index.html b/entries/templates/entries/index.html index 1255b2f..4537284 100644 --- a/entries/templates/entries/index.html +++ b/entries/templates/entries/index.html @@ -1,9 +1,11 @@ {% extends 'lemoncurry/layout.html' %} {% load static %} {% block html_class %}h-feed{% endblock %} + {% block styles %} {% endblock %} + {% block main %}