]> git.0d.be Git - chloro.git/blobdiff - chloro/phyll/views.py
include direct links to latest posts on homepage
[chloro.git] / chloro / phyll / views.py
index cb12807330d270ca4968ff6a7b8630cd27423b8a..84b40e7fd0071ba633ceb553ffd05dfc20cafc3f 100644 (file)
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-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