From 2d71d99f88a5282cb6813521570907dd7148ba77 Mon Sep 17 00:00:00 2001 From: felipebormann Date: Tue, 7 Feb 2017 12:23:12 -0300 Subject: [PATCH] updating migrations of pdf_file and create view of pdf file --- amadeus/static/js/resources.js | 2 +- amadeus/urls.py | 1 + pdf_file/forms.py | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pdf_file/migrations/0001_initial.py | 31 +++++++++++++++++++++++++++++++ pdf_file/models.py | 35 +++++++++++++++++++++++++++++++++++ pdf_file/templates/pdf_file/_form.html | 343 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pdf_file/templates/pdf_file/create.html | 34 ++++++++++++++++++++++++++++++++++ pdf_file/urls.py | 8 ++++++++ pdf_file/views.py | 129 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- topics/templates/topics/list.html | 1 + 10 files changed, 681 insertions(+), 2 deletions(-) create mode 100644 pdf_file/forms.py create mode 100644 pdf_file/migrations/0001_initial.py create mode 100644 pdf_file/templates/pdf_file/_form.html create mode 100644 pdf_file/templates/pdf_file/create.html create mode 100644 pdf_file/urls.py diff --git a/amadeus/static/js/resources.js b/amadeus/static/js/resources.js index 575d58b..37e7508 100644 --- a/amadeus/static/js/resources.js +++ b/amadeus/static/js/resources.js @@ -106,7 +106,7 @@ if (window.File && window.FileList && window.FileReader) { // initialize function Init() { - var small = $("#id_file_content"), + var small = $(".file-selector"), filedrag = $(".filedrag"), common = $(".common-file-input"); diff --git a/amadeus/urls.py b/amadeus/urls.py index 2b52fd2..81c1c7a 100644 --- a/amadeus/urls.py +++ b/amadeus/urls.py @@ -38,6 +38,7 @@ urlpatterns = [ url(r'^themes/', include('themes.urls', namespace = 'themes')), url(r'^pendencies/', include('notifications.urls', namespace = 'notifications')), url(r'^links/', include('links.urls', namespace='links')), + url(r'^pdf_files/', include('pdf_file.urls', namespace='pdf_files')), #API url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')), #S3Direct diff --git a/pdf_file/forms.py b/pdf_file/forms.py new file mode 100644 index 0000000..5c5f071 --- /dev/null +++ b/pdf_file/forms.py @@ -0,0 +1,99 @@ +from django import forms +from django.utils.translation import ugettext_lazy as _ +from django.utils.html import strip_tags + +from subjects.models import Tag + +from .models import PDFFile + +class PDFFileForm(forms.ModelForm): + subject = None + MAX_UPLOAD_SIZE = 10*1024*1024 + + def __init__(self, *args, **kwargs): + super(PDFFileForm, self).__init__(*args, **kwargs) + self.subject = kwargs.get('initial').get('subject', None) + + if self.instance.id: + self.subject = self.instance.topic.subject + self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) + + self.fields['students'].queryset = self.subject.students.all() + self.fields['groups'].queryset = self.subject.group_subject.all() + + tags = forms.CharField(label = _('Tags'), required = False) + class Meta: + model = PDFFile + fields = ['name', 'file', 'brief_description', 'all_students', 'students', 'groups', 'visible'] + labels = { + 'name': _('File name'), + } + widgets = { + 'brief_description': forms.Textarea, + 'students': forms.SelectMultiple, + 'groups': forms.SelectMultiple, + } + + def clean_name(self): + name = self.cleaned_data.get('name', '') + + topics = self.subject.topic_subject.all() + + for topic in topics: + if self.instance.id: + same_name = topic.resource_topic.filter(name__unaccent__iexact = name).exclude(id = self.instance.id).count() + else: + same_name = topic.resource_topic.filter(name__unaccent__iexact = name).count() + + if same_name > 0: + self._errors['name'] = [_('This subject already has a file link with this name')] + + return ValueError + + return name + + def clean_file(self): + file = self.cleaned_data.get('file', False) + + if file: + if hasattr(file, '_size'): + if file._size > self.MAX_UPLOAD_SIZE: + self._errors['file'] = [_("The file is too large. It should have less than 10MB.")] + + return ValueError + + elif not self.instance.pk: + self._errors['file'] = [_('This field is required.')] + + return ValueError + + return file + + def save(self, commit = True): + super(PDFFileForm, self).save(commit = True) + + self.instance.save() + + previous_tags = self.instance.tags.all() + + tags = self.cleaned_data['tags'].split(",") + + #Excluding unwanted tags + for prev in previous_tags: + if not prev.name in tags: + self.instance.tags.remove(prev) + + for tag in tags: + tag = tag.strip() + + exist = Tag.objects.filter(name = tag).exists() + + if exist: + new_tag = Tag.objects.get(name = tag) + else: + new_tag = Tag.objects.create(name = tag) + + if not new_tag in self.instance.tags.all(): + self.instance.tags.add(new_tag) + + return self.instance \ No newline at end of file diff --git a/pdf_file/migrations/0001_initial.py b/pdf_file/migrations/0001_initial.py new file mode 100644 index 0000000..5c4f14c --- /dev/null +++ b/pdf_file/migrations/0001_initial.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.4 on 2017-02-07 14:48 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import pdf_file.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('topics', '0007_auto_20170123_1911'), + ] + + operations = [ + migrations.CreateModel( + name='PDFFile', + fields=[ + ('resource_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='topics.Resource')), + ('file', models.FileField(upload_to='/files', validators=[pdf_file.models.validate_file_extension], verbose_name='File')), + ], + options={ + 'verbose_name': 'PDFFile', + 'verbose_name_plural': 'PDFFiles', + }, + bases=('topics.resource',), + ), + ] diff --git a/pdf_file/models.py b/pdf_file/models.py index 71a8362..67ada69 100644 --- a/pdf_file/models.py +++ b/pdf_file/models.py @@ -1,3 +1,38 @@ from django.db import models +from django.utils.translation import ugettext_lazy as _ +from topics.models import Resource # Create your models here. +def validate_file_extension(value): + valid_formats = [ + 'application/pdf' + ] + + if hasattr(value.file, 'content_type'): + if not value.file.content_type in valid_formats: + raise ValidationError(_('File not supported, use PDF format instead.')) + +class PDFFile(Resource): + file = models.FileField(_('File'), upload_to='/files', validators = [validate_file_extension]) + class Meta: + verbose_name = "PDFFile" + verbose_name_plural = "PDFFiles" + + @property + def filename(self): + return os.path.basename(self.file.name) + + def __str__(self): + return self.name + + def access_link(self): + return 'pdf_files:download' + + def update_link(self): + return 'pdf_files:update' + + def delete_link(self): + return 'pdf_files:delete' + + def delete_message(self): + return _('Are you sure you want delete the PDF File') diff --git a/pdf_file/templates/pdf_file/_form.html b/pdf_file/templates/pdf_file/_form.html new file mode 100644 index 0000000..8e0b58c --- /dev/null +++ b/pdf_file/templates/pdf_file/_form.html @@ -0,0 +1,343 @@ +{% load static i18n %} +{% load widget_tweaks %} + +
+ {% csrf_token %} + + {% render_field form.control_subject %} + +
+ + {% render_field form.name class='form-control' %} + + {{ form.name.help_text }} + + {% if form.name.errors %} + + {% endif %} +
+
+ {% render_field form.file class='file-selector' %} + +
+ + + + +
+ +
+ {% if pdf_file %} +
+ + {{ pdf_file.filename }} + {% else %} + {% trans 'Click or drop the file here' %}
+ + {% trans 'The file could not exceed 10MB.' %} + {% endif %} +
+ + {{ form.file.help_text }} + + {% if form.file.errors %} + + {% endif %} +
+ + {% trans 'Common resources settings' %} + +
+ + {% render_field form.brief_description class='form-control text_wysiwyg' %} + + {{ form.brief_description.help_text }} + + {% if form.brief_description.errors %} + + {% endif %} +
+ +
+ + {% render_field form.tags class='form-control' data-role="tagsinput" %} + + {{ form.tags.help_text }} + + {% if form.tags.errors %} + + {% endif %} +
+ +
+
+ +
+ +
+
+ {% render_field pendencies_form.id %} + {% render_field pendencies_form.resource %} + {% render_field pendencies_form.subject class='pend_subj' %} + +
+ +
+ {% render_field pendencies_form.action class='form-control' %} +
+ +
+ + {{ pendencies_form.action.help_text }} + + {% if pendencies_form.action.errors %} + + {% endif %} +
+
+
+
+

{% trans 'Wished period' %}:

+
+
+
+
+ +
+
+ {% render_field pendencies_form.begin_date class='form-control datetime-picker begin_date_input' %} +
+
+
+ {{ pendencies_form.begin_date.help_text }} + + {% if pendencies_form.begin_date.errors %} + + {% endif %} +
+
+
+ +
+
+ {% render_field pendencies_form.end_date class='form-control datetime-picker end_date_input' %} +
+
+
+ {{ pendencies_form.end_date.help_text }} + + {% if pendencies_form.end_date.errors %} + + {% endif %} +
+
+
+
+
+ +
+ +
+
+
+ +
+ + {{ form.all_students.help_text }} + + {% if form.all_students.errors %} + + {% endif %} +
+ +

{% trans 'Attribute students to file link' %}:

+ {% render_field form.students class='form-control' %} + + {{ form.students.help_text }} + + {% if form.students.errors %} + + {% endif %} + +
+ +

{% trans 'Attribute groups to file link' %}:

+ {% render_field form.groups class='form-control' %} + + {{ form.groups.help_text }} + + {% if form.groups.errors %} + + {% endif %} +
+
+
+ +
+
+ +
+ + {{ form.visible.help_text }} + + {% if form.visible.errors %} + + {% endif %} +
+ +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/pdf_file/templates/pdf_file/create.html b/pdf_file/templates/pdf_file/create.html new file mode 100644 index 0000000..03fd602 --- /dev/null +++ b/pdf_file/templates/pdf_file/create.html @@ -0,0 +1,34 @@ +{% 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 'Create File Link' as bread %} + {% breadcrumb bread 'file_links:create' topic.slug %} +{% endblock %} + +{% block content %} +
+
+
+ {% include 'file_links/_form.html' %} +
+
+
+
+
+{% endblock %} diff --git a/pdf_file/urls.py b/pdf_file/urls.py new file mode 100644 index 0000000..f77e6ef --- /dev/null +++ b/pdf_file/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url +from django.contrib.auth import views as auth_views + +from . import views + +urlpatterns = [ + url(r'^create/(?P[\w_-]+)/$', views.PDFFileCreateView.as_view(), name='create'), +] \ No newline at end of file diff --git a/pdf_file/views.py b/pdf_file/views.py index 91ea44a..5e8751a 100644 --- a/pdf_file/views.py +++ b/pdf_file/views.py @@ -1,3 +1,130 @@ -from django.shortcuts import render # Create your views here. +from django.views import generic +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 amadeus.permissions import has_subject_permissions, has_resource_permissions +from .forms import PDFFileForm + +from log.mixins import LogMixin +from topics.models import Topic + +from pendencies.forms import PendenciesForm + + +class PDFFileCreateView(LoginRequiredMixin, LogMixin , generic.CreateView): + form_class = PDFFileForm + template_name = 'pdf_file/create.html' + + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + + def dispatch(self, request, *args, **kwargs): + slug = self.kwargs.get('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(PDFFileCreateView, self).dispatch(request, *args, **kwargs) + + def get(self, request, *args, **kwargs): + self.object = None + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + 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 = None + + form_class = self.get_form_class() + form = self.get_form(form_class) + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + 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 get_initial(self): + initial = super(PDFFileCreateView, self).get_initial() + + slug = self.kwargs.get('slug', '') + + topic = get_object_or_404(Topic, slug = slug) + initial['subject'] = topic.subject + + return initial + + 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) + + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + self.object.topic = topic + self.object.order = topic.resource_topic.count() + 1 + + 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(PDFFileCreateView, 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(PDFFileCreateView, self).get_context_data(**kwargs) + + context['title'] = _('Create PDF File') + + slug = self.kwargs.get('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 added to the Topic "%s" of the virtual environment "%s" successfully!')%(self.object.name, self.object.topic.name, self.object.topic.subject.name)) + + return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) \ No newline at end of file diff --git a/topics/templates/topics/list.html b/topics/templates/topics/list.html index 54b091d..f4c9147 100644 --- a/topics/templates/topics/list.html +++ b/topics/templates/topics/list.html @@ -58,6 +58,7 @@
  • {% trans "Link to Website" %}
  • {% trans 'Webpage' %}
  • {% trans 'Questionary' %}
  • +
  • {% trans "PDF File" %}
  • -- libgit2 0.21.2