diff --git a/file_link/models.py b/file_link/models.py index 3a40f4c..57e6e7b 100644 --- a/file_link/models.py +++ b/file_link/models.py @@ -31,7 +31,7 @@ class FileLink(Resource): return self.name def access_link(self): - return 'webpages:view' + return 'file_links:download' def update_link(self): return 'webpages:update' diff --git a/file_link/urls.py b/file_link/urls.py index 67e6698..9147791 100644 --- a/file_link/urls.py +++ b/file_link/urls.py @@ -5,4 +5,5 @@ from . import views urlpatterns = [ url(r'^create/(?P[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), + url(r'^download/(?P[\w_-]+)/$', views.DownloadFile.as_view(), name = 'download'), ] diff --git a/file_link/views.py b/file_link/views.py index 9ab5d51..aab43a7 100644 --- a/file_link/views.py +++ b/file_link/views.py @@ -1,4 +1,6 @@ from django.shortcuts import get_object_or_404, redirect, render +from django.http import HttpResponse +from os import path from django.views import generic from django.contrib import messages from django.core.urlresolvers import reverse, reverse_lazy @@ -14,6 +16,36 @@ from pendencies.forms import PendenciesForm from .forms import FileLinkForm from .models import FileLink +class DownloadFile(LoginRequiredMixin, generic.DetailView): + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + model = FileLink + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + file_link = get_object_or_404(FileLink, slug = slug) + + if not has_resource_permissions(request.user, file_link): + return redirect(reverse_lazy('subjects:home')) + + return super(DownloadFile, self).dispatch(request, *args, **kwargs) + + def render_to_response(self, context, **response_kwargs): + slug = self.kwargs.get('slug', '') + file_link = get_object_or_404(FileLink, slug = slug) + + response = HttpResponse(open(file_link.file_content.path, 'rb').read()) + response['Content-Type'] = 'application/force-download' + response['Pragma'] = 'public' + response['Expires'] = '0' + response['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0' + response['Content-Disposition'] = 'attachment; filename=%s' % file_link.name + response['Content-Transfer-Encoding'] = 'binary' + response['Content-Length'] = str(path.getsize(file_link.file_content.path)) + + return response + class CreateView(LoginRequiredMixin, generic.edit.CreateView): login_url = reverse_lazy("users:login") redirect_field_name = 'next' -- libgit2 0.21.2