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',
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"),
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
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')),
(_('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))
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"
"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ę"
<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">
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
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
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'))
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)
text-decoration: none;
}
+a.btn {
+ color: #fff;
+}
+
a:hover {
text-decoration: underline;
}