Commit 29a31a64d583118f2c94ee834dd7089b8f401e44

Authored by Zambom
1 parent 5c581c0b

Adding file link download

file_link/models.py
... ... @@ -31,7 +31,7 @@ class FileLink(Resource):
31 31 return self.name
32 32  
33 33 def access_link(self):
34   - return 'webpages:view'
  34 + return 'file_links:download'
35 35  
36 36 def update_link(self):
37 37 return 'webpages:update'
... ...
file_link/urls.py
... ... @@ -5,4 +5,5 @@ from . import views
5 5  
6 6 urlpatterns = [
7 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'),
  8 + url(r'^download/(?P<slug>[\w_-]+)/$', views.DownloadFile.as_view(), name = 'download'),
8 9 ]
... ...
file_link/views.py
1 1 from django.shortcuts import get_object_or_404, redirect, render
  2 +from django.http import HttpResponse
  3 +from os import path
2 4 from django.views import generic
3 5 from django.contrib import messages
4 6 from django.core.urlresolvers import reverse, reverse_lazy
... ... @@ -14,6 +16,36 @@ from pendencies.forms import PendenciesForm
14 16 from .forms import FileLinkForm
15 17 from .models import FileLink
16 18  
  19 +class DownloadFile(LoginRequiredMixin, generic.DetailView):
  20 + login_url = reverse_lazy("users:login")
  21 + redirect_field_name = 'next'
  22 +
  23 + model = FileLink
  24 +
  25 + def dispatch(self, request, *args, **kwargs):
  26 + slug = self.kwargs.get('slug', '')
  27 + file_link = get_object_or_404(FileLink, slug = slug)
  28 +
  29 + if not has_resource_permissions(request.user, file_link):
  30 + return redirect(reverse_lazy('subjects:home'))
  31 +
  32 + return super(DownloadFile, self).dispatch(request, *args, **kwargs)
  33 +
  34 + def render_to_response(self, context, **response_kwargs):
  35 + slug = self.kwargs.get('slug', '')
  36 + file_link = get_object_or_404(FileLink, slug = slug)
  37 +
  38 + response = HttpResponse(open(file_link.file_content.path, 'rb').read())
  39 + response['Content-Type'] = 'application/force-download'
  40 + response['Pragma'] = 'public'
  41 + response['Expires'] = '0'
  42 + response['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0'
  43 + response['Content-Disposition'] = 'attachment; filename=%s' % file_link.name
  44 + response['Content-Transfer-Encoding'] = 'binary'
  45 + response['Content-Length'] = str(path.getsize(file_link.file_content.path))
  46 +
  47 + return response
  48 +
17 49 class CreateView(LoginRequiredMixin, generic.edit.CreateView):
18 50 login_url = reverse_lazy("users:login")
19 51 redirect_field_name = 'next'
... ...