X-Git-Url: https://git.0d.be/?p=chloro.git;a=blobdiff_plain;f=chloro%2Fphyll%2Fviews.py;h=2e77fc926842270e743d37c323eb62ef2d470b12;hp=5387b705e5805550f47bdbd82fc2ecb28cbc1583;hb=8e97df809b3d4f610a598ff1e1f458c8693c5af5;hpb=8ad496d5f7bfbcf67473532bb26c804cf478910c diff --git a/chloro/phyll/views.py b/chloro/phyll/views.py index 5387b70..2e77fc9 100644 --- a/chloro/phyll/views.py +++ b/chloro/phyll/views.py @@ -14,8 +14,20 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -from django.http import Http404 -from django.views.generic import CreateView, DeleteView, DetailView, UpdateView, TemplateView +import os +import urllib.parse + +from django.conf import settings +from django.contrib.syndication.views import Feed +from django.core.exceptions import PermissionDenied +from django.core.files.storage import default_storage +from django.http import HttpResponse, Http404, JsonResponse +from django.utils.feedgenerator import Atom1Feed +from django.views import View +from django.views.decorators.csrf import csrf_exempt +from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView, TemplateView + +from sorl.thumbnail.shortcuts import get_thumbnail from .models import Note @@ -24,9 +36,9 @@ class NoteView(DetailView): model = Note def get(self, request, *args, **kwargs): + note = self.get_object() if kwargs.get('year'): # check date does match - note = self.get_object() creation = self.get_object().creation_timestamp if (creation.year, creation.month, creation.day) != ( int(kwargs['year']), @@ -34,17 +46,29 @@ class NoteView(DetailView): 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 NoteApiSaveView(View): + http_method_names = ['post'] + + def post(self, request, *args, **kwargs): + note = Note.objects.get(slug=kwargs['slug']) + note.text = request.POST['text'] + note.save() + return HttpResponse('ok') class NoteAddView(CreateView): model = Note - fields = ['title', 'slug', 'text', 'tags'] + fields = ['title', 'slug', 'text', 'tags', 'published'] class NoteDeleteView(DeleteView): @@ -56,3 +80,91 @@ 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 + + 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 + + +@csrf_exempt +def ajax_upload(request, *args, **kwargs): + upload = request.FILES['upload'] + upload_path = 'uploads' + if os.path.splitext(upload.name.lower())[-1] in ('.jpg', '.jpeg', '.png', '.gif', '.svg'): + upload_path = 'images' + saved_path = default_storage.save('%s/%s' % (upload_path, upload.name), upload) + url = '/media/' + saved_path + response = {'url': url, 'filename': upload.name} + if upload_path == 'images': + if default_storage.size(saved_path) > 500_000 and not upload.name.endswith('.svg'): + response['orig_url'] = url + try: + response['url'] = get_thumbnail(saved_path, '1000', upscale=False).url + except OSError: + pass + return JsonResponse(response)