X-Git-Url: https://git.0d.be/?p=chloro.git;a=blobdiff_plain;f=chloro%2Fphyll%2Fviews.py;h=84b40e7fd0071ba633ceb553ffd05dfc20cafc3f;hp=b8598dc1180f2ead84dc9f40901924fd46ea6602;hb=f11d4b4f365634feebcb04bc414cc1615c60ceef;hpb=34d500560508bd019e0fb28c5e45cd731dbb7569 diff --git a/chloro/phyll/views.py b/chloro/phyll/views.py index b8598dc..84b40e7 100644 --- a/chloro/phyll/views.py +++ b/chloro/phyll/views.py @@ -14,8 +14,13 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +import urllib.parse + +from django.conf import settings +from django.contrib.syndication.views import Feed from django.core.exceptions import PermissionDenied from django.http import Http404 +from django.utils.feedgenerator import Atom1Feed from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView, TemplateView from .models import Note @@ -60,6 +65,21 @@ class NoteDeleteView(DeleteView): class HomeView(TemplateView): template_name = 'phyll/home.html' + def get_context_data(self, **kwargs): + context = super(HomeView, self).get_context_data(**kwargs) + context['posts'] = Note.objects.filter(published=True).order_by('-creation_timestamp')[:5] + return context + + +class ArchivesView(ListView): + model = Note + + def get_queryset(self): + qs = super(ArchivesView, self).get_queryset() + if not self.request.user.is_staff: + qs = qs.filter(published=True) + return qs + class ListOnTagView(ListView): model = Note @@ -69,3 +89,47 @@ class ListOnTagView(ListView): if not self.request.user.is_staff: qs = qs.filter(published=True) return qs + + +class Atom1FeedWithBaseXml(Atom1Feed): + def root_attributes(self): + root_attributes = super(Atom1FeedWithBaseXml, self).root_attributes() + scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(self.feed['feed_url']) + root_attributes['xml:base'] = urllib.parse.urlunparse((scheme, netloc, '/', params, query, fragment)) + return root_attributes + + +class AtomFeed(Feed): + title = settings.SITE_TITLE + link = '/' + feed_type = Atom1FeedWithBaseXml + author_name = settings.SITE_AUTHOR + + def get_object(self, request, *args, **kwargs): + self.sub = kwargs.get('sub', 'default') + return super(AtomFeed, self).get_object(request, *args, **kwargs) + + def items(self): + qs = Note.objects.filter(published=True) + if self.sub == 'default': + pass + elif self.sub == 'gnome-en': + qs = qs.filter(tags__name__in=['gnome']).filter(tags__name__in=['lang-en']) + else: + qs = qs.filter(tags__name__in=[self.sub]) + return qs.select_related()[:20] + + def item_description(self, item): + return item.text + + def item_guid(self, item): + for tag in item.tags.all(): + if tag.name.startswith('old-post-id-'): + return 'http://www.0d.be/posts/%s' % tag.name.split('-')[-1] + return 'https://www.0d.be' + item.get_absolute_url() + + def item_title(self, item): + return item.title + + def item_pubdate(self, item): + return item.creation_timestamp