]> git.0d.be Git - chloro.git/blobdiff - chloro/phyll/views.py
misc: add image/file upload for live edit (sync with panikdb)
[chloro.git] / chloro / phyll / views.py
index 5264298ba77e3e263727d440f23c61ecd18ee034..2e77fc926842270e743d37c323eb62ef2d470b12 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/>.
 
+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.http import Http404
+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
 
 
@@ -50,6 +56,16 @@ class NoteEditView(UpdateView):
     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', 'published']
@@ -65,6 +81,21 @@ 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
@@ -108,7 +139,6 @@ class AtomFeed(Feed):
         return item.text
 
     def item_guid(self, item):
-        legacy_id = None
         for tag in item.tags.all():
             if tag.name.startswith('old-post-id-'):
                 return 'http://www.0d.be/posts/%s' % tag.name.split('-')[-1]
@@ -119,3 +149,22 @@ class AtomFeed(Feed):
 
     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)