Commit 83e20f1d53026ddbc985e3b6ad5a94b10310f3f7

Authored by felipebormann
1 parent 4232560b

create file is working, removing and updateing as well but still not downloading pdf file

pdf_file/models.py
1 from django.db import models 1 from django.db import models
2 from django.utils.translation import ugettext_lazy as _ 2 from django.utils.translation import ugettext_lazy as _
  3 +import os
  4 +from django.core.exceptions import ValidationError
3 5
4 from topics.models import Resource 6 from topics.models import Resource
5 # Create your models here. 7 # Create your models here.
@@ -13,7 +15,7 @@ def validate_file_extension(value): @@ -13,7 +15,7 @@ def validate_file_extension(value):
13 raise ValidationError(_('File not supported, use PDF format instead.')) 15 raise ValidationError(_('File not supported, use PDF format instead.'))
14 16
15 class PDFFile(Resource): 17 class PDFFile(Resource):
16 - file = models.FileField(_('File'), upload_to='/files', validators = [validate_file_extension]) 18 + file = models.FileField(_('File'), upload_to='files/', validators = [validate_file_extension])
17 class Meta: 19 class Meta:
18 verbose_name = "PDFFile" 20 verbose_name = "PDFFile"
19 verbose_name_plural = "PDFFiles" 21 verbose_name_plural = "PDFFiles"
pdf_file/templates/pdf_file/create.html
@@ -17,8 +17,8 @@ @@ -17,8 +17,8 @@
17 17
18 {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %} 18 {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %}
19 19
20 - {% trans 'Create File Link' as bread %}  
21 - {% breadcrumb bread 'file_links:create' topic.slug %} 20 + {% trans 'Create PDF file' as bread %}
  21 + {% breadcrumb bread 'pdf_file:create' topic.slug %}
22 {% endblock %} 22 {% endblock %}
23 23
24 {% block content %} 24 {% block content %}
pdf_file/templates/pdf_file/update.html 0 → 100644
@@ -0,0 +1,36 @@ @@ -0,0 +1,36 @@
  1 +{% extends 'subjects/view.html' %}
  2 +
  3 +{% load static i18n django_bootstrap_breadcrumbs %}
  4 +
  5 +{% block style %}
  6 + {{block.super}}
  7 + <link rel="stylesheet" type="text/css" href="{% static "css/bootstrap-tagsinput.css" %}">
  8 +{% endblock %}
  9 +
  10 +{% block javascript %}
  11 + {{block.super}}
  12 + <script type="text/javascript" src="{% static "js/bootstrap-tagsinput.js" %} "></script>
  13 +{% endblock %}
  14 +
  15 +{% block breadcrumbs %}
  16 + {{ block.super }}
  17 +
  18 + {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %}
  19 +
  20 + {% trans 'Edit: ' as bread %}
  21 + {% with bread|add:pdf_file.name as bread_slug %}
  22 + {% breadcrumb bread_slug 'pdf_file:update' topic.slug pdf_file.slug %}
  23 + {% endwith %}
  24 +{% endblock %}
  25 +
  26 +{% block content %}
  27 + <div class="card">
  28 + <div class="card-content">
  29 + <div class="card-body">
  30 + {% include 'pdf_file/_form.html' %}
  31 + </div>
  32 + </div>
  33 + </div>
  34 + <br clear="all" />
  35 + <br clear="all" />
  36 +{% endblock %}
0 \ No newline at end of file 37 \ No newline at end of file
pdf_file/urls.py
@@ -5,4 +5,7 @@ from . import views @@ -5,4 +5,7 @@ from . import views
5 5
6 urlpatterns = [ 6 urlpatterns = [
7 url(r'^create/(?P<slug>[\w_-]+)/$', views.PDFFileCreateView.as_view(), name='create'), 7 url(r'^create/(?P<slug>[\w_-]+)/$', views.PDFFileCreateView.as_view(), name='create'),
  8 + url(r'^download/(?P<slug>[\w_-]+)/$', views.DownloadPDFFile.as_view(), name = 'download'),
  9 + url(r'^update/(?P<topic_slug>[\w_-]+)/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'),
  10 + url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'),
8 ] 11 ]
9 \ No newline at end of file 12 \ No newline at end of file
pdf_file/views.py
@@ -5,15 +5,69 @@ from django.contrib.auth.mixins import LoginRequiredMixin @@ -5,15 +5,69 @@ from django.contrib.auth.mixins import LoginRequiredMixin
5 from django.utils.translation import ugettext_lazy as _ 5 from django.utils.translation import ugettext_lazy as _
6 from django.core.urlresolvers import reverse, reverse_lazy 6 from django.core.urlresolvers import reverse, reverse_lazy
7 from django.shortcuts import get_object_or_404, redirect, render 7 from django.shortcuts import get_object_or_404, redirect, render
  8 +from django.contrib import messages
8 9
9 from amadeus.permissions import has_subject_permissions, has_resource_permissions 10 from amadeus.permissions import has_subject_permissions, has_resource_permissions
10 from .forms import PDFFileForm 11 from .forms import PDFFileForm
11 12
12 from log.mixins import LogMixin 13 from log.mixins import LogMixin
13 from topics.models import Topic 14 from topics.models import Topic
14 - 15 +from .models import PDFFile
15 from pendencies.forms import PendenciesForm 16 from pendencies.forms import PendenciesForm
16 17
  18 +class DownloadPDFFile(LoginRequiredMixin, LogMixin, generic.DetailView):
  19 + log_component = 'resources'
  20 + log_action = 'view'
  21 + log_resource = 'pdf_file'
  22 + log_context = {}
  23 +
  24 + login_url = reverse_lazy("users:login")
  25 + redirect_field_name = 'next'
  26 +
  27 + model = PDFFile
  28 +
  29 + def dispatch(self, request, *args, **kwargs):
  30 + slug = self.kwargs.get('slug', '')
  31 + pdf_file = get_object_or_404(PDFFile, slug = slug)
  32 +
  33 + if not has_resource_permissions(request.user, pdf_file):
  34 + return redirect(reverse_lazy('subjects:home'))
  35 +
  36 + return super(DownloadPDFFile, self).dispatch(request, *args, **kwargs)
  37 +
  38 + def render_to_response(self, context, **response_kwargs):
  39 + slug = self.kwargs.get('slug', '')
  40 + pdf_file = get_object_or_404(PDFFile, slug = slug)
  41 +
  42 + if not path.exists(pdf_file.file_content.path):
  43 + raise Http404()
  44 +
  45 + response = HttpResponse(open(pdf_file.file_content.path, 'rb').read())
  46 + response['Content-Type'] = 'application/force-download'
  47 + response['Pragma'] = 'public'
  48 + response['Expires'] = '0'
  49 + response['Cache-Control'] = 'must-revalidate, post-check=0, pre-check=0'
  50 + response['Content-Disposition'] = 'attachment; filename=%s' % pdf_file.filename
  51 + response['Content-Transfer-Encoding'] = 'binary'
  52 + response['Content-Length'] = str(path.getsize(pdf_file.file_content.path))
  53 +
  54 + self.log_context['category_id'] = pdf_file.topic.subject.category.id
  55 + self.log_context['category_name'] = pdf_file.topic.subject.category.name
  56 + self.log_context['category_slug'] = pdf_file.topic.subject.category.slug
  57 + self.log_context['subject_id'] = pdf_file.topic.subject.id
  58 + self.log_context['subject_name'] = pdf_file.topic.subject.name
  59 + self.log_context['subject_slug'] = pdf_file.topic.subject.slug
  60 + self.log_context['topic_id'] = pdf_file.topic.id
  61 + self.log_context['topic_name'] = pdf_file.topic.name
  62 + self.log_context['topic_slug'] = pdf_file.topic.slug
  63 + self.log_context['pdf_file_id'] = pdf_file.id
  64 + self.log_context['pdf_filek_name'] = pdf_file.name
  65 + self.log_context['pdf_file_slug'] = pdf_file.slug
  66 +
  67 + super(DownloadPDFFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  68 +
  69 + return response
  70 +
17 71
18 class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView): 72 class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView):
19 form_class = PDFFileForm 73 form_class = PDFFileForm
@@ -130,4 +184,161 @@ class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView): @@ -130,4 +184,161 @@ class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView):
130 return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) 184 return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
131 185
132 186
  187 +class UpdateView(LoginRequiredMixin, LogMixin, generic.UpdateView):
  188 + log_component = 'resources'
  189 + log_action = 'update'
  190 + log_resource = 'pdf_file'
  191 + log_context = {}
  192 +
  193 + login_url = reverse_lazy("users:login")
  194 + redirect_field_name = 'next'
  195 +
  196 + template_name = 'pdf_file/update.html'
  197 + model = PDFFile
  198 + form_class = PDFFileForm
  199 + context_object_name = 'pdf_file'
  200 +
  201 + def dispatch(self, request, *args, **kwargs):
  202 + slug = self.kwargs.get('topic_slug', '')
  203 + topic = get_object_or_404(Topic, slug = slug)
  204 +
  205 + if not has_subject_permissions(request.user, topic.subject):
  206 + return redirect(reverse_lazy('subjects:home'))
  207 +
  208 + return super(UpdateView, self).dispatch(request, *args, **kwargs)
  209 +
  210 + def get(self, request, *args, **kwargs):
  211 + self.object = self.get_object()
  212 +
  213 + form_class = self.get_form_class()
  214 + form = self.get_form(form_class)
  215 +
  216 + slug = self.kwargs.get('topic_slug', '')
  217 + topic = get_object_or_404(Topic, slug = slug)
  218 +
  219 + pend_form = self.object.pendencies_resource.all()
  220 +
  221 + if len(pend_form) > 0:
  222 + pendencies_form = PendenciesForm(instance = pend_form[0], initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]})
  223 + else:
  224 + pendencies_form = PendenciesForm(initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]})
  225 +
  226 + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
  227 +
  228 + def post(self, request, *args, **kwargs):
  229 + self.object = self.get_object()
  230 +
  231 + form_class = self.get_form_class()
  232 + form = self.get_form(form_class)
  233 +
  234 + slug = self.kwargs.get('topic_slug', '')
  235 + topic = get_object_or_404(Topic, slug = slug)
  236 +
  237 + pend_form = self.object.pendencies_resource.all()
  238 +
  239 + if len(pend_form) > 0:
  240 + pendencies_form = PendenciesForm(self.request.POST, instance = pend_form[0], initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]})
  241 + else:
  242 + pendencies_form = PendenciesForm(self.request.POST, initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]})
  243 +
  244 + if (form.is_valid() and pendencies_form.is_valid()):
  245 + return self.form_valid(form, pendencies_form)
  246 + else:
  247 + return self.form_invalid(form, pendencies_form)
  248 +
  249 + def form_invalid(self, form, pendencies_form):
  250 + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
  251 +
  252 + def form_valid(self, form, pendencies_form):
  253 + self.object = form.save(commit = False)
  254 +
  255 + if not self.object.topic.visible and not self.object.topic.repository:
  256 + self.object.visible = False
  257 +
  258 + self.object.save()
  259 +
  260 + pend_form = pendencies_form.save(commit = False)
  261 + pend_form.resource = self.object
  262 +
  263 + if not pend_form.action == "":
  264 + pend_form.save()
  265 +
  266 + self.log_context['category_id'] = self.object.topic.subject.category.id
  267 + self.log_context['category_name'] = self.object.topic.subject.category.name
  268 + self.log_context['category_slug'] = self.object.topic.subject.category.slug
  269 + self.log_context['subject_id'] = self.object.topic.subject.id
  270 + self.log_context['subject_name'] = self.object.topic.subject.name
  271 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  272 + self.log_context['topic_id'] = self.object.topic.id
  273 + self.log_context['topic_name'] = self.object.topic.name
  274 + self.log_context['topic_slug'] = self.object.topic.slug
  275 + self.log_context['pdf_file_id'] = self.object.id
  276 + self.log_context['pdf_file_name'] = self.object.name
  277 + self.log_context['pdf_file_slug'] = self.object.slug
  278 +
  279 + super(UpdateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  280 +
  281 + return redirect(self.get_success_url())
  282 +
  283 + def get_context_data(self, **kwargs):
  284 + context = super(UpdateView, self).get_context_data(**kwargs)
  285 +
  286 + context['title'] = _('Update PDF File')
  287 +
  288 + slug = self.kwargs.get('topic_slug', '')
  289 + topic = get_object_or_404(Topic, slug = slug)
  290 +
  291 + context['topic'] = topic
  292 + context['subject'] = topic.subject
  293 +
  294 + return context
  295 +
  296 + def get_success_url(self):
  297 + messages.success(self.request, _('The PDF File "%s" was updated successfully!')%(self.object.name))
  298 +
  299 + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
  300 +
  301 +class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView):
  302 + log_component = 'resources'
  303 + log_action = 'delete'
  304 + log_resource = 'pdf_file'
  305 + log_context = {}
  306 +
  307 + login_url = reverse_lazy("users:login")
  308 + redirect_field_name = 'next'
  309 +
  310 + template_name = 'resources/delete.html'
  311 + model = PDFFile
  312 + context_object_name = 'resource'
  313 +
  314 + def dispatch(self, request, *args, **kwargs):
  315 + slug = self.kwargs.get('slug', '')
  316 + pdf_file = get_object_or_404(PDFFile, slug = slug)
  317 +
  318 + if not has_subject_permissions(request.user, pdf_file.topic.subject):
  319 + return redirect(reverse_lazy('subjects:home'))
  320 +
  321 + return super(DeleteView, self).dispatch(request, *args, **kwargs)
  322 +
  323 + def get_success_url(self):
  324 + messages.success(self.request, _('The PDF File "%s" was removed successfully from virtual environment "%s"!')%(self.object.name, self.object.topic.subject.name))
  325 +
  326 + self.log_context['category_id'] = self.object.topic.subject.category.id
  327 + self.log_context['category_name'] = self.object.topic.subject.category.name
  328 + self.log_context['category_slug'] = self.object.topic.subject.category.slug
  329 + self.log_context['subject_id'] = self.object.topic.subject.id
  330 + self.log_context['subject_name'] = self.object.topic.subject.name
  331 + self.log_context['subject_slug'] = self.object.topic.subject.slug
  332 + self.log_context['topic_id'] = self.object.topic.id
  333 + self.log_context['topic_name'] = self.object.topic.name
  334 + self.log_context['topic_slug'] = self.object.topic.slug
  335 + self.log_context['pdf_file_id'] = self.object.id
  336 + self.log_context['pdf_file_name'] = self.object.name
  337 + self.log_context['pdf_file_slug'] = self.object.slug
  338 +
  339 + super(DeleteView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context)
  340 +
  341 + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
  342 +
  343 +
133 344