1 # chloro - personal space
2 # Copyright (C) 2019 Frederic Peters
4 # This program is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published
6 # by the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 from django.conf import settings
20 from django.contrib.syndication.views import Feed
21 from django.core.exceptions import PermissionDenied
22 from django.http import Http404
23 from django.utils.feedgenerator import Atom1Feed
24 from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView, TemplateView
26 from .models import Note
29 class NoteView(DetailView):
32 def get(self, request, *args, **kwargs):
33 note = self.get_object()
34 if kwargs.get('year'):
35 # check date does match
36 creation = self.get_object().creation_timestamp
37 if (creation.year, creation.month, creation.day) != (
43 if not note.published and not request.user.is_staff:
44 raise PermissionDenied()
45 return super(NoteView, self).get(request, *args, **kwargs)
48 class NoteEditView(UpdateView):
50 fields = ['title', 'slug', 'text', 'tags', 'published']
53 class NoteAddView(CreateView):
55 fields = ['title', 'slug', 'text', 'tags', 'published']
58 class NoteDeleteView(DeleteView):
61 def get_success_url(self):
65 class HomeView(TemplateView):
66 template_name = 'phyll/home.html'
69 class ArchivesView(ListView):
72 def get_queryset(self):
73 qs = super(ArchivesView, self).get_queryset()
74 if not self.request.user.is_staff:
75 qs = qs.filter(published=True)
79 class ListOnTagView(ListView):
82 def get_queryset(self):
83 qs = Note.objects.filter(tags__name__in=[self.kwargs['tag']])
84 if not self.request.user.is_staff:
85 qs = qs.filter(published=True)
89 class Atom1FeedWithBaseXml(Atom1Feed):
90 def root_attributes(self):
91 root_attributes = super(Atom1FeedWithBaseXml, self).root_attributes()
92 scheme, netloc, path, params, query, fragment = urllib.parse.urlparse(self.feed['feed_url'])
93 root_attributes['xml:base'] = urllib.parse.urlunparse((scheme, netloc, '/', params, query, fragment))
94 return root_attributes
98 title = settings.SITE_TITLE
100 feed_type = Atom1FeedWithBaseXml
101 author_name = settings.SITE_AUTHOR
103 def get_object(self, request, *args, **kwargs):
104 self.sub = kwargs.get('sub', 'default')
105 return super(AtomFeed, self).get_object(request, *args, **kwargs)
108 qs = Note.objects.filter(published=True)
109 if self.sub == 'default':
111 elif self.sub == 'gnome-en':
112 qs = qs.filter(tags__name__in=['gnome']).filter(tags__name__in=['lang-en'])
114 qs = qs.filter(tags__name__in=[self.sub])
115 return qs.select_related()[:20]
117 def item_description(self, item):
120 def item_guid(self, item):
122 for tag in item.tags.all():
123 if tag.name.startswith('old-post-id-'):
124 return 'http://www.0d.be/posts/%s' % tag.name.split('-')[-1]
125 return 'https://www.0d.be' + item.get_absolute_url()
127 def item_title(self, item):
130 def item_pubdate(self, item):
131 return item.creation_timestamp