X-Git-Url: https://git.0d.be/?p=chloro.git;a=blobdiff_plain;f=chloro%2Fphyll%2Fviews.py;h=84b40e7fd0071ba633ceb553ffd05dfc20cafc3f;hp=cb12807330d270ca4968ff6a7b8630cd27423b8a;hb=f11d4b4f365634feebcb04bc414cc1615c60ceef;hpb=4cbde1d675d45b7fab19bc1ed6001829e03a6c2c diff --git a/chloro/phyll/views.py b/chloro/phyll/views.py index cb12807..84b40e7 100644 --- a/chloro/phyll/views.py +++ b/chloro/phyll/views.py @@ -14,10 +14,122 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from django.views.generic import DetailView +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 class NoteView(DetailView): model = Note + + def get(self, request, *args, **kwargs): + note = self.get_object() + if kwargs.get('year'): + # check date does match + creation = self.get_object().creation_timestamp + if (creation.year, creation.month, creation.day) != ( + int(kwargs['year']), + int(kwargs['month']), + int(kwargs['day']), + ): + raise Http404() + if not note.published and not request.user.is_staff: + raise PermissionDenied() + return super(NoteView, self).get(request, *args, **kwargs) + + +class NoteEditView(UpdateView): + model = Note + fields = ['title', 'slug', 'text', 'tags', 'published'] + + +class NoteAddView(CreateView): + model = Note + fields = ['title', 'slug', 'text', 'tags', 'published'] + + +class NoteDeleteView(DeleteView): + model = Note + + def get_success_url(self): + return '/' + + +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 + + def get_queryset(self): + qs = Note.objects.filter(tags__name__in=[self.kwargs['tag']]) + 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