X-Git-Url: https://git.0d.be/?p=chloro.git;a=blobdiff_plain;f=chloro%2Fphyll%2Fviews.py;h=6c8fdabf26d5febc7f7e49fde7221bdbb621355e;hp=d366b833f360b85ee25d0ba01170ab58c4aa3794;hb=db4bc587490d671a32be94c0c970e97ee71cad1a;hpb=ca1becbb5854b50fda10d839a5e0db37ccb2b832 diff --git a/chloro/phyll/views.py b/chloro/phyll/views.py index d366b83..6c8fdab 100644 --- a/chloro/phyll/views.py +++ b/chloro/phyll/views.py @@ -14,7 +14,14 @@ # 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 CreateView, DeleteView, DetailView, UpdateView, TemplateView +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 @@ -22,15 +29,30 @@ 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'] + fields = ['title', 'slug', 'text', 'tags', 'published'] class NoteAddView(CreateView): model = Note - fields = ['title', 'slug', 'text', 'tags'] + fields = ['title', 'slug', 'text', 'tags', 'published'] class NoteDeleteView(DeleteView): @@ -42,3 +64,72 @@ 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['latest'] = Note.objects.filter(published=True).latest('creation_timestamp') + 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