cover previews
[redakcja.git] / apps / cover / views.py
1 # Create your views here.
2 import os.path
3 from django.conf import settings
4 from django.http import HttpResponse, Http404
5 from catalogue.models import Chunk
6 from django.views.decorators.http import require_POST
7 from django.views.decorators.csrf import csrf_exempt
8 from django.shortcuts import render
9
10
11 PREVIEW_SIZE = (216, 300)
12
13 def preview(request, book, chunk=None, rev=None):
14     """Creates a cover image.
15
16     If chunk and rev number are given, use version from given revision.
17     If rev is not given, use publishable version.
18     """
19     import Image
20     from librarian.cover import WLCover
21     from librarian.dcparser import BookInfo
22
23     chunk = Chunk.get(book, chunk)
24     if rev is not None:
25         try:
26             revision = chunk.at_revision(rev)
27         except Chunk.change_model.DoesNotExist:
28             raise Http404
29     else:
30         revision = chunk.publishable()
31         if revision is None:
32             raise Http404
33     xml = revision.materialize().encode('utf-8')
34     
35     info = BookInfo.from_string(xml)
36     cover = WLCover(info)
37     response = HttpResponse(mimetype=cover.mime_type())
38     image = cover.image().resize(PREVIEW_SIZE, Image.ANTIALIAS)
39     image.save(response, cover.format)
40     return response
41
42
43 @csrf_exempt
44 @require_POST
45 def preview_from_xml(request):
46     from hashlib import sha1
47     import Image
48     from os import makedirs
49     from lxml import etree
50     from librarian.cover import WLCover
51     from librarian.dcparser import BookInfo
52
53     xml = request.POST['xml']
54     info = BookInfo.from_string(xml.encode('utf-8'))
55     coverid = sha1(etree.tostring(info.to_etree())).hexdigest()
56     cover = WLCover(info)
57
58     cover_dir = 'cover/preview'
59     try:
60         makedirs(os.path.join(settings.MEDIA_ROOT, cover_dir))
61     except OSError:
62         pass
63     fname = os.path.join(cover_dir, "%s.%s" % (coverid, cover.ext()))
64     image = cover.image().resize(PREVIEW_SIZE, Image.ANTIALIAS)
65     image.save(os.path.join(settings.MEDIA_ROOT, fname))
66     return HttpResponse(os.path.join(settings.MEDIA_URL, fname))