Commit 29a31a64d583118f2c94ee834dd7089b8f401e44
1 parent
5c581c0b
Exists in
master
and in
3 other branches
Adding file link download
Showing
3 changed files
with
34 additions
and
1 deletions
Show diff stats
file_link/models.py
@@ -31,7 +31,7 @@ class FileLink(Resource): | @@ -31,7 +31,7 @@ class FileLink(Resource): | ||
31 | return self.name | 31 | return self.name |
32 | 32 | ||
33 | def access_link(self): | 33 | def access_link(self): |
34 | - return 'webpages:view' | 34 | + return 'file_links:download' |
35 | 35 | ||
36 | def update_link(self): | 36 | def update_link(self): |
37 | return 'webpages:update' | 37 | return 'webpages:update' |
file_link/urls.py
@@ -5,4 +5,5 @@ from . import views | @@ -5,4 +5,5 @@ from . import views | ||
5 | 5 | ||
6 | urlpatterns = [ | 6 | urlpatterns = [ |
7 | url(r'^create/(?P<slug>[\w_-]+)/$', views.CreateView.as_view(), name = 'create'), | 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 | from django.shortcuts import get_object_or_404, redirect, render | 1 | from django.shortcuts import get_object_or_404, redirect, render |
2 | +from django.http import HttpResponse | ||
3 | +from os import path | ||
2 | from django.views import generic | 4 | from django.views import generic |
3 | from django.contrib import messages | 5 | from django.contrib import messages |
4 | from django.core.urlresolvers import reverse, reverse_lazy | 6 | from django.core.urlresolvers import reverse, reverse_lazy |
@@ -14,6 +16,36 @@ from pendencies.forms import PendenciesForm | @@ -14,6 +16,36 @@ from pendencies.forms import PendenciesForm | ||
14 | from .forms import FileLinkForm | 16 | from .forms import FileLinkForm |
15 | from .models import FileLink | 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 | class CreateView(LoginRequiredMixin, generic.edit.CreateView): | 49 | class CreateView(LoginRequiredMixin, generic.edit.CreateView): |
18 | login_url = reverse_lazy("users:login") | 50 | login_url = reverse_lazy("users:login") |
19 | redirect_field_name = 'next' | 51 | redirect_field_name = 'next' |