diff --git a/pdf_file/models.py b/pdf_file/models.py index 67ada69..0216785 100644 --- a/pdf_file/models.py +++ b/pdf_file/models.py @@ -1,5 +1,7 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +import os +from django.core.exceptions import ValidationError from topics.models import Resource # Create your models here. @@ -13,7 +15,7 @@ def validate_file_extension(value): raise ValidationError(_('File not supported, use PDF format instead.')) class PDFFile(Resource): - file = models.FileField(_('File'), upload_to='/files', validators = [validate_file_extension]) + file = models.FileField(_('File'), upload_to='files/', validators = [validate_file_extension]) class Meta: verbose_name = "PDFFile" verbose_name_plural = "PDFFiles" diff --git a/pdf_file/templates/pdf_file/create.html b/pdf_file/templates/pdf_file/create.html index 1ea1b7d..c5446da 100644 --- a/pdf_file/templates/pdf_file/create.html +++ b/pdf_file/templates/pdf_file/create.html @@ -17,8 +17,8 @@ {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %} - {% trans 'Create File Link' as bread %} - {% breadcrumb bread 'file_links:create' topic.slug %} + {% trans 'Create PDF file' as bread %} + {% breadcrumb bread 'pdf_file:create' topic.slug %} {% endblock %} {% block content %} diff --git a/pdf_file/templates/pdf_file/update.html b/pdf_file/templates/pdf_file/update.html new file mode 100644 index 0000000..59f6ab9 --- /dev/null +++ b/pdf_file/templates/pdf_file/update.html @@ -0,0 +1,36 @@ +{% extends 'subjects/view.html' %} + +{% load static i18n django_bootstrap_breadcrumbs %} + +{% block style %} + {{block.super}} + +{% endblock %} + +{% block javascript %} + {{block.super}} + +{% endblock %} + +{% block breadcrumbs %} + {{ block.super }} + + {% breadcrumb topic 'subjects:topic_view' topic.subject.slug topic.slug %} + + {% trans 'Edit: ' as bread %} + {% with bread|add:pdf_file.name as bread_slug %} + {% breadcrumb bread_slug 'pdf_file:update' topic.slug pdf_file.slug %} + {% endwith %} +{% endblock %} + +{% block content %} +
+
+
+ {% include 'pdf_file/_form.html' %} +
+
+
+
+
+{% endblock %} \ No newline at end of file diff --git a/pdf_file/urls.py b/pdf_file/urls.py index f77e6ef..90937e7 100644 --- a/pdf_file/urls.py +++ b/pdf_file/urls.py @@ -5,4 +5,7 @@ from . import views urlpatterns = [ url(r'^create/(?P[\w_-]+)/$', views.PDFFileCreateView.as_view(), name='create'), + url(r'^download/(?P[\w_-]+)/$', views.DownloadPDFFile.as_view(), name = 'download'), + url(r'^update/(?P[\w_-]+)/(?P[\w_-]+)/$', views.UpdateView.as_view(), name = 'update'), + url(r'^delete/(?P[\w_-]+)/$', views.DeleteView.as_view(), name = 'delete'), ] \ No newline at end of file diff --git a/pdf_file/views.py b/pdf_file/views.py index 6483c91..5c4a360 100644 --- a/pdf_file/views.py +++ b/pdf_file/views.py @@ -5,15 +5,69 @@ from django.contrib.auth.mixins import LoginRequiredMixin from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse, reverse_lazy from django.shortcuts import get_object_or_404, redirect, render +from django.contrib import messages from amadeus.permissions import has_subject_permissions, has_resource_permissions from .forms import PDFFileForm from log.mixins import LogMixin from topics.models import Topic - +from .models import PDFFile from pendencies.forms import PendenciesForm +class DownloadPDFFile(LoginRequiredMixin, LogMixin, generic.DetailView): + log_component = 'resources' + log_action = 'view' + log_resource = 'pdf_file' + log_context = {} + + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + model = PDFFile + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + pdf_file = get_object_or_404(PDFFile, slug = slug) + + if not has_resource_permissions(request.user, pdf_file): + return redirect(reverse_lazy('subjects:home')) + + return super(DownloadPDFFile, self).dispatch(request, *args, **kwargs) + + def render_to_response(self, context, **response_kwargs): + slug = self.kwargs.get('slug', '') + pdf_file = get_object_or_404(PDFFile, slug = slug) + + if not path.exists(pdf_file.file_content.path): + raise Http404() + + response = HttpResponse(open(pdf_file.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' % pdf_file.filename + response['Content-Transfer-Encoding'] = 'binary' + response['Content-Length'] = str(path.getsize(pdf_file.file_content.path)) + + self.log_context['category_id'] = pdf_file.topic.subject.category.id + self.log_context['category_name'] = pdf_file.topic.subject.category.name + self.log_context['category_slug'] = pdf_file.topic.subject.category.slug + self.log_context['subject_id'] = pdf_file.topic.subject.id + self.log_context['subject_name'] = pdf_file.topic.subject.name + self.log_context['subject_slug'] = pdf_file.topic.subject.slug + self.log_context['topic_id'] = pdf_file.topic.id + self.log_context['topic_name'] = pdf_file.topic.name + self.log_context['topic_slug'] = pdf_file.topic.slug + self.log_context['pdf_file_id'] = pdf_file.id + self.log_context['pdf_filek_name'] = pdf_file.name + self.log_context['pdf_file_slug'] = pdf_file.slug + + super(DownloadPDFFile, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + return response + class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView): form_class = PDFFileForm @@ -130,4 +184,161 @@ class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView): return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) +class UpdateView(LoginRequiredMixin, LogMixin, generic.UpdateView): + log_component = 'resources' + log_action = 'update' + log_resource = 'pdf_file' + log_context = {} + + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'pdf_file/update.html' + model = PDFFile + form_class = PDFFileForm + context_object_name = 'pdf_file' + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + if not has_subject_permissions(request.user, topic.subject): + return redirect(reverse_lazy('subjects:home')) + + return super(UpdateView, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = self.get_object() + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pend_form = self.object.pendencies_resource.all() + + if len(pend_form) > 0: + pendencies_form = PendenciesForm(instance = pend_form[0], initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]}) + else: + pendencies_form = PendenciesForm(initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]}) + + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form)) + + def post(self, request, *args, **kwargs): + self.object = self.get_object() + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pend_form = self.object.pendencies_resource.all() + + if len(pend_form) > 0: + pendencies_form = PendenciesForm(self.request.POST, instance = pend_form[0], initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]}) + else: + pendencies_form = PendenciesForm(self.request.POST, initial = {'subject': topic.subject.id, 'actions': [("", "-------"),("view", _("Visualize"))]}) + + if (form.is_valid() and pendencies_form.is_valid()): + return self.form_valid(form, pendencies_form) + else: + return self.form_invalid(form, pendencies_form) + + def form_invalid(self, form, pendencies_form): + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form)) + + def form_valid(self, form, pendencies_form): + self.object = form.save(commit = False) + + if not self.object.topic.visible and not self.object.topic.repository: + self.object.visible = False + + self.object.save() + + pend_form = pendencies_form.save(commit = False) + pend_form.resource = self.object + + if not pend_form.action == "": + pend_form.save() + + self.log_context['category_id'] = self.object.topic.subject.category.id + self.log_context['category_name'] = self.object.topic.subject.category.name + self.log_context['category_slug'] = self.object.topic.subject.category.slug + self.log_context['subject_id'] = self.object.topic.subject.id + self.log_context['subject_name'] = self.object.topic.subject.name + self.log_context['subject_slug'] = self.object.topic.subject.slug + self.log_context['topic_id'] = self.object.topic.id + self.log_context['topic_name'] = self.object.topic.name + self.log_context['topic_slug'] = self.object.topic.slug + self.log_context['pdf_file_id'] = self.object.id + self.log_context['pdf_file_name'] = self.object.name + self.log_context['pdf_file_slug'] = self.object.slug + + super(UpdateView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + return redirect(self.get_success_url()) + + def get_context_data(self, **kwargs): + context = super(UpdateView, self).get_context_data(**kwargs) + + context['title'] = _('Update PDF File') + + slug = self.kwargs.get('topic_slug', '') + topic = get_object_or_404(Topic, slug = slug) + + context['topic'] = topic + context['subject'] = topic.subject + + return context + + def get_success_url(self): + messages.success(self.request, _('The PDF File "%s" was updated successfully!')%(self.object.name)) + + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) + +class DeleteView(LoginRequiredMixin, LogMixin, generic.DeleteView): + log_component = 'resources' + log_action = 'delete' + log_resource = 'pdf_file' + log_context = {} + + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'resources/delete.html' + model = PDFFile + context_object_name = 'resource' + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('slug', '') + pdf_file = get_object_or_404(PDFFile, slug = slug) + + if not has_subject_permissions(request.user, pdf_file.topic.subject): + return redirect(reverse_lazy('subjects:home')) + + return super(DeleteView, self).dispatch(request, *args, **kwargs) + + def get_success_url(self): + messages.success(self.request, _('The PDF File "%s" was removed successfully from virtual environment "%s"!')%(self.object.name, self.object.topic.subject.name)) + + self.log_context['category_id'] = self.object.topic.subject.category.id + self.log_context['category_name'] = self.object.topic.subject.category.name + self.log_context['category_slug'] = self.object.topic.subject.category.slug + self.log_context['subject_id'] = self.object.topic.subject.id + self.log_context['subject_name'] = self.object.topic.subject.name + self.log_context['subject_slug'] = self.object.topic.subject.slug + self.log_context['topic_id'] = self.object.topic.id + self.log_context['topic_name'] = self.object.topic.name + self.log_context['topic_slug'] = self.object.topic.slug + self.log_context['pdf_file_id'] = self.object.id + self.log_context['pdf_file_name'] = self.object.name + self.log_context['pdf_file_slug'] = self.object.slug + + super(DeleteView, self).createLog(self.request.user, self.log_component, self.log_action, self.log_resource, self.log_context) + + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) + + -- libgit2 0.21.2