X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/babe7f68fcbb8f7e73f9b62d611715ca28b4c4e6..ef0b9d1c310064d5bb6216a7460f2a49a52a8848:/apps/fileupload/views.py diff --git a/apps/fileupload/views.py b/apps/fileupload/views.py index 9425515b..de2532f4 100644 --- a/apps/fileupload/views.py +++ b/apps/fileupload/views.py @@ -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(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')) @@ -99,7 +100,7 @@ class UploadView(FormView): files = [] path = self.get_safe_path() if os.path.isdir(path): - for f in os.listdir(path): + for f in sorted(os.listdir(path)): file_info = { "name": f, } @@ -137,7 +138,7 @@ class UploadView(FormView): 'url': self.get_url(f.name), 'thumbnail_url': thumbnail(self.get_directory() + f.name), 'delete_url': "%s?file=%s" % ( - request.get_full_path(), + self.request.get_full_path(), quote(f.name.encode('utf-8'))), 'delete_type': "DELETE" }) @@ -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)