Librarian in regular requirements.
[redakcja.git] / apps / cover / views.py
index 0f341ad..3f2c46f 100644 (file)
@@ -1,12 +1,19 @@
-# Create your views here.
+# -*- coding: utf-8 -*-
+#
+# This file is part of FNP-Redakcja, licensed under GNU Affero GPLv3 or later.
+# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information.
+#
 import os.path
 from django.conf import settings
 import os.path
 from django.conf import settings
+from django.contrib.auth.decorators import permission_required
 from django.http import HttpResponse, HttpResponseRedirect, Http404
 from django.http import HttpResponse, HttpResponseRedirect, Http404
-from catalogue.models import Chunk
-from django.views.decorators.http import require_POST
+from django.shortcuts import get_object_or_404, render
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
-from django.shortcuts import render
-
+from django.views.decorators.http import require_POST
+from catalogue.helpers import active_tab
+from catalogue.models import Chunk
+from cover.models import Image
+from cover import forms
 
 PREVIEW_SIZE = (216, 300)
 
 
 PREVIEW_SIZE = (216, 300)
 
@@ -17,8 +24,8 @@ def preview(request, book, chunk=None, rev=None):
     If chunk and rev number are given, use version from given revision.
     If rev is not given, use publishable version.
     """
     If chunk and rev number are given, use version from given revision.
     If rev is not given, use publishable version.
     """
-    import Image
-    from librarian.cover import WLCover
+    from PIL import Image
+    from librarian.cover import make_cover
     from librarian.dcparser import BookInfo
 
     chunk = Chunk.get(book, chunk)
     from librarian.dcparser import BookInfo
 
     chunk = Chunk.get(book, chunk)
@@ -34,13 +41,13 @@ def preview(request, book, chunk=None, rev=None):
     xml = revision.materialize().encode('utf-8')
 
     try:
     xml = revision.materialize().encode('utf-8')
 
     try:
-        info = BookInfo.from_string(xml)
+        info = BookInfo.from_bytes(xml)
     except:
         return HttpResponseRedirect(os.path.join(settings.STATIC_URL, "img/sample_cover.png"))
     except:
         return HttpResponseRedirect(os.path.join(settings.STATIC_URL, "img/sample_cover.png"))
-    cover = WLCover(info)
-    response = HttpResponse(mimetype=cover.mime_type())
-    image = cover.image().resize(PREVIEW_SIZE, Image.ANTIALIAS)
-    image.save(response, cover.format)
+    cover = make_cover(info)
+    response = HttpResponse(content_type=cover.mime_type())
+    img = cover.image().resize(PREVIEW_SIZE, Image.ANTIALIAS)
+    img.save(response, cover.format)
     return response
 
 
     return response
 
 
@@ -48,19 +55,19 @@ def preview(request, book, chunk=None, rev=None):
 @require_POST
 def preview_from_xml(request):
     from hashlib import sha1
 @require_POST
 def preview_from_xml(request):
     from hashlib import sha1
-    import Image
+    from PIL import Image
     from os import makedirs
     from lxml import etree
     from os import makedirs
     from lxml import etree
-    from librarian.cover import WLCover
+    from librarian.cover import make_cover
     from librarian.dcparser import BookInfo
 
     xml = request.POST['xml']
     try:
     from librarian.dcparser import BookInfo
 
     xml = request.POST['xml']
     try:
-        info = BookInfo.from_string(xml.encode('utf-8'))
+        info = BookInfo.from_bytes(xml.encode('utf-8'))
     except:
         return HttpResponse(os.path.join(settings.STATIC_URL, "img/sample_cover.png"))
     coverid = sha1(etree.tostring(info.to_etree())).hexdigest()
     except:
         return HttpResponse(os.path.join(settings.STATIC_URL, "img/sample_cover.png"))
     coverid = sha1(etree.tostring(info.to_etree())).hexdigest()
-    cover = WLCover(info)
+    cover = make_cover(info)
 
     cover_dir = 'cover/preview'
     try:
 
     cover_dir = 'cover/preview'
     try:
@@ -68,41 +75,67 @@ def preview_from_xml(request):
     except OSError:
         pass
     fname = os.path.join(cover_dir, "%s.%s" % (coverid, cover.ext()))
     except OSError:
         pass
     fname = os.path.join(cover_dir, "%s.%s" % (coverid, cover.ext()))
-    image = cover.image().resize(PREVIEW_SIZE, Image.ANTIALIAS)
-    image.save(os.path.join(settings.MEDIA_ROOT, fname))
+    img = cover.image().resize(PREVIEW_SIZE, Image.ANTIALIAS)
+    img.save(os.path.join(settings.MEDIA_ROOT, fname))
     return HttpResponse(os.path.join(settings.MEDIA_URL, fname))
 
 
     return HttpResponse(os.path.join(settings.MEDIA_URL, fname))
 
 
-def flickr(request):
-    url = request.POST.get('flickr_url')
-    if url:
-        import re
-        from urllib2 import urlopen
+@active_tab('cover')
+def image(request, pk):
+    img = get_object_or_404(Image, pk=pk)
 
 
-        html = urlopen(url).read()
-        match = re.search(r'<a href="([^"]*)" rel="license cc:license">Some rights reserved</a>', html)
-        try:
-            assert match
-            license_url = match.group(1)
-            re_license = re.compile(r'http://creativecommons.org/licenses/([^/]*)/([^/]*)/.*')
-            m = re_license.match(license_url)
-            assert m
-            license_name = 'CC %s %s' % (m.group(1).upper(), m.group(2))
-        except AssertionError:
-            license_name = 'NIEZNANA LICENCJA'
-
-        m = re.search(r'<strong class="username">By <a href="[^"]*">([^<]*)</a></strong>', html)
-        if m:
-            author = m.group(1)
+    if request.user.has_perm('cover.change_image'):
+        if request.method == "POST":
+            form = forms.ImageEditForm(request.POST, request.FILES, instance=img)
+            if form.is_valid():
+                form.save()
+                return HttpResponseRedirect(img.get_absolute_url())
         else:
         else:
-            author = "NIEZNANY AUTOR"
-
-        url_size = url.rstrip('/') + '/sizes/o/'
-        html = urlopen(url_size).read()
-        m = re.search(r'<div id="allsizes-photo">\s*<img src="([^"]*)"', html)
-        if m:
-            image_url = m.group(1)
+            form = forms.ImageEditForm(instance=img)
+        editable = True
     else:
     else:
-        url = ""
-
-    return render(request, 'cover/flickr.html', locals())
+        form = forms.ReadonlyImageEditForm(instance=img)
+        editable = False
+
+    return render(request, "cover/image_detail.html", {
+        "object": Image.objects.get(id=img.id),
+        "form": form,
+        "editable": editable,
+    })
+
+
+def image_file(request, pk):
+    img = get_object_or_404(Image, pk=pk)
+    return HttpResponseRedirect(img.file.url)
+
+
+@active_tab('cover')
+def image_list(request):
+    return render(request, "cover/image_list.html", {
+        'object_list': Image.objects.all(),
+        'can_add': request.user.has_perm('cover.add_image'),
+    })
+
+
+@permission_required('cover.add_image')
+@active_tab('cover')
+def add_image(request):
+    form = ff = None
+    if request.method == 'POST':
+        if request.POST.get('form_id') == 'flickr':
+            ff = forms.FlickrForm(request.POST)
+            if ff.is_valid():
+                form = forms.ImageAddForm(ff.cleaned_data)
+        else:
+            form = forms.ImageAddForm(request.POST, request.FILES)
+            if form.is_valid():
+                obj = form.save()
+                return HttpResponseRedirect(obj.get_absolute_url())
+    if form is None:
+        form = forms.ImageAddForm()
+    if ff is None:
+        ff = forms.FlickrForm()
+    return render(request, 'cover/add_image.html', {
+            'form': form,
+            'ff': ff,
+        })