Allow for creating package.zip containing files in a gallery
authorAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Thu, 19 Dec 2013 11:41:21 +0000 (12:41 +0100)
committerAleksander Łukasz <aleksander.lukasz@nowoczesnapolska.org.pl>
Tue, 12 Aug 2014 09:47:11 +0000 (11:47 +0200)
apps/catalogue/urls.py
apps/catalogue/views.py
apps/fileupload/locale/pl/LC_MESSAGES/django.mo
apps/fileupload/locale/pl/LC_MESSAGES/django.po
apps/fileupload/templates/fileupload/picture_form.html
apps/fileupload/views.py
redakcja/static/css/filelist.css

index e72b88d..283e681 100644 (file)
@@ -3,7 +3,7 @@ from django.conf.urls import patterns, url
 from django.contrib.auth.decorators import permission_required
 from django.views.generic import RedirectView
 from catalogue.feeds import PublishTrackFeed
-from catalogue.views import GalleryView
+from catalogue.views import GalleryView, GalleryPackageView
 
 
 urlpatterns = patterns('catalogue.views',
@@ -32,6 +32,9 @@ urlpatterns = patterns('catalogue.views',
     url(r'^book/(?P<slug>[^/]+)/gallery/$',
             permission_required('catalogue.change_book')(GalleryView.as_view()),
             name="catalogue_book_gallery"),
+    url(r'^book/(?P<slug>[^/]+)/gallery/package$',
+            permission_required('catalogue.change_book')(GalleryPackageView.as_view()),
+            name="catalogue_book_gallery_package"),
     url(r'^book/(?P<slug>[^/]+)/xml$', 'book_xml', name="catalogue_book_xml"),
     url(r'^book/(?P<slug>[^/]+)/txt$', 'book_txt', name="catalogue_book_txt"),
     url(r'^book/(?P<slug>[^/]+)/html$', 'book_html', name="catalogue_book_html"),
index ebc3575..9bd69f8 100644 (file)
@@ -26,7 +26,7 @@ from catalogue import forms
 from catalogue import helpers
 from catalogue.helpers import active_tab
 from catalogue.models import Book, Chunk, BookPublishRecord, ChunkPublishRecord, Project
-from fileupload.views import UploadView
+from fileupload.views import UploadView, PackageView
 
 #
 # Quick hack around caching problems, TODO: use ETags
@@ -488,13 +488,17 @@ def publish(request, slug):
         return http.HttpResponseRedirect(book.get_absolute_url())
 
 
-class GalleryView(UploadView):
+class GalleryMixin(object):
+    def get_directory(self):
+        return "%s%s/" % (settings.IMAGE_DIR, self.object.gallery)
     def get_object(self, request, slug):
         book = get_object_or_404(Book, slug=slug)
         if not book.gallery:
             raise Http404
         return book
 
+class GalleryView(GalleryMixin, UploadView):
+
     def breadcrumbs(self):
         return [
             (_('books'), reverse('catalogue_document_list')),
@@ -502,5 +506,8 @@ class GalleryView(UploadView):
             (_('scan gallery'),),
         ]
 
-    def get_directory(self):
-        return "%s%s/" % (settings.IMAGE_DIR, self.object.gallery)
+
+class GalleryPackageView(GalleryMixin, PackageView):
+
+    def get_redirect_url(self, slug):
+        return reverse('catalogue_book_gallery', kwargs = dict(slug=slug))
index 8fdb9c4..bf6885e 100644 (file)
Binary files a/apps/fileupload/locale/pl/LC_MESSAGES/django.mo and b/apps/fileupload/locale/pl/LC_MESSAGES/django.mo differ
index a4b6099..bc592e9 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-03-07 16:27+0100\n"
+"POT-Creation-Date: 2013-12-19 12:38+0100\n"
 "PO-Revision-Date: 2013-03-07 16:27+0100\n"
 "Last-Translator: Radek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,25 +15,29 @@ msgstr ""
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
+"|| n%100>=20) ? 1 : 2);\n"
 
 #: templates/fileupload/picture_form.html:18
 msgid "Browse:"
 msgstr "Przeglądanie:"
 
-#: templates/fileupload/picture_form.html:35
+#: templates/fileupload/picture_form.html:34
 msgid "Add files..."
 msgstr "Dodaj pliki..."
 
-#: templates/fileupload/picture_form.html:40
+#: templates/fileupload/picture_form.html:39
 msgid "Start upload"
 msgstr "Zacznij wysyłać"
 
-#: templates/fileupload/picture_form.html:44
+#: templates/fileupload/picture_form.html:43
 msgid "Cancel upload"
 msgstr "Anuluj wysyłanie"
 
-#: templates/fileupload/picture_form.html:48
+#: templates/fileupload/picture_form.html:47
 msgid "Delete"
 msgstr "Usuń"
 
+#: templates/fileupload/picture_form.html:51
+msgid "Create package"
+msgstr "Stwórz paczkę"
index 44c37db..81cb1a6 100644 (file)
@@ -29,7 +29,7 @@
 
     <form id="fileupload" method="post" action="." enctype="multipart/form-data">{% csrf_token %}
         <div class="row fileupload-buttonbar">
-            <div class="span7">
+            <div class="span9">
                 <span class="btn btn-success fileinput-button">
                     <i class="icon-plus icon-white"></i>
                     <span>{% trans "Add files..." %}</span>
                     <i class="icon-trash icon-white"></i>
                     <span>{% trans "Delete" %}</span>
                 </button>
+                <a class="btn btn-info" href="package">
+                    <i class="icon-gift icon-white"></i>
+                    <span>{% trans "Create package" %}</span>
+                </a>
                 <input type="checkbox" class="toggle">
             </div>
             <div class="span5 fileupload-progress fade">
index ab719a1..de2532f 100644 (file)
@@ -1,11 +1,12 @@
 import json
 import os
+from zipfile import ZipFile
 from urllib import quote
 from django.conf import settings
 from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404
 from django.utils.decorators import method_decorator
 from django.views.decorators.vary import vary_on_headers
-from django.views.generic import FormView, View
+from django.views.generic import FormView, View, RedirectView
 from .forms import UploadForm
 
 
@@ -30,8 +31,25 @@ class JSONResponse(HttpResponse):
         content = json.dumps(obj)
         super(JSONResponse, self).__init__(content, mimetype, *args, **kwargs)
 
+class UploadViewMixin(object):
+    def get_safe_path(self, filename=""):
+        """Finds absolute filesystem path of the browsed dir of file.
+        
+        Makes sure it's inside MEDIA_ROOT.
+        
+        """
+        path = os.path.abspath(os.path.join(
+                settings.MEDIA_ROOT,
+                self.get_directory(),
+                filename))
+        if not path.startswith(os.path.abspath(settings.MEDIA_ROOT)):
+            raise Http404
+        if filename:
+            if not path.startswith(self.get_safe_path()):
+                raise Http404
+        return path
 
-class UploadView(FormView):
+class UploadView(UploadViewMixin, FormView):
     template_name = "fileupload/picture_form.html"
     form_class = UploadForm
 
@@ -68,23 +86,6 @@ class UploadView(FormView):
             crumbs = [('media',)]
         return crumbs
 
-    def get_safe_path(self, filename=""):
-        """Finds absolute filesystem path of the browsed dir of file.
-        
-        Makes sure it's inside MEDIA_ROOT.
-        
-        """
-        path = os.path.abspath(os.path.join(
-                settings.MEDIA_ROOT,
-                self.get_directory(),
-                filename))
-        if not path.startswith(os.path.abspath(settings.MEDIA_ROOT)):
-            raise Http404
-        if filename:
-            if not path.startswith(self.get_safe_path()):
-                raise Http404
-        return path
-
     def get_url(self, filename):
         """Finds URL of a file in browsed dir."""
         return settings.MEDIA_URL + self.get_directory() + quote(filename.encode('utf-8'))
@@ -150,3 +151,15 @@ class UploadView(FormView):
         response = JSONResponse(True)
         response['Content-Disposition'] = 'inline; filename=files.json'
         return response
+
+
+class PackageView(UploadViewMixin, RedirectView):
+    def dispatch(self, request, *args, **kwargs):
+        self.object = self.get_object(request, *args, **kwargs)
+        path = self.get_safe_path()
+        with ZipFile(os.path.join(path, 'package.zip'), 'w') as zip_file:
+            for f in os.listdir(path):
+                if f == 'package.zip':
+                    continue
+                zip_file.write(os.path.join(path, f), arcname = f)
+        return super(PackageView, self).dispatch(request, *args, **kwargs)
index f25db1e..e9b58ca 100644 (file)
@@ -119,6 +119,10 @@ a, a:visited, a:active {
        text-decoration: none;
 }
 
+a.btn {
+    color: #fff;
+}
+
 a:hover {
        text-decoration: underline;
 }