From fed1c8fc2262df5a31c38caf1ca7dd29e752e9e2 Mon Sep 17 00:00:00 2001 From: Felipe Henrique de Almeida Bormann Date: Mon, 30 Jan 2017 17:12:09 -0300 Subject: [PATCH] started building links app, createview and form --- amadeus/settings.py | 3 ++- amadeus/urls.py | 1 + links/forms.py | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ links/models.py | 26 ++++++++++++-------------- links/templates/links/_form.html | 370 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ links/templates/links/create.html | 34 ++++++++++++++++++++++++++++++++++ links/urls.py | 7 +++++++ links/views.py | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- subjects/forms.py | 4 ++-- subjects/models.py | 2 +- topics/templates/topics/list.html | 2 +- 11 files changed, 653 insertions(+), 20 deletions(-) create mode 100644 links/forms.py create mode 100644 links/templates/links/_form.html create mode 100644 links/templates/links/create.html create mode 100644 links/urls.py diff --git a/amadeus/settings.py b/amadeus/settings.py index 62302a1..faad125 100644 --- a/amadeus/settings.py +++ b/amadeus/settings.py @@ -67,7 +67,8 @@ INSTALLED_APPS = [ 'webpage', 'mailsender', 'security', - 'themes' + 'themes', + 'links' ] MIDDLEWARE_CLASSES = [ diff --git a/amadeus/urls.py b/amadeus/urls.py index 0e91d7d..d614248 100644 --- a/amadeus/urls.py +++ b/amadeus/urls.py @@ -35,6 +35,7 @@ urlpatterns = [ url(r'^security/', include('security.urls', namespace = 'security')), url(r'^themes/', include('themes.urls', namespace = 'themes')), url(r'^notifications/', include('notifications.urls', namespace = 'notifications')), + url(r'^links/', include('links.urls', namespace='links')), #API url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')), #S3Direct diff --git a/links/forms.py b/links/forms.py new file mode 100644 index 0000000..6721de1 --- /dev/null +++ b/links/forms.py @@ -0,0 +1,88 @@ +# coding=utf-8 +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 pendencies.forms import PendenciesForm +from .models import Link + +class LinkForm(forms.ModelForm): + subject = None + MAX_UPLOAD_SIZE = 10*1024*1024 + + def __init__(self, *args, **kwargs): + super(LinkForm, self).__init__(*args, **kwargs) + + self.subject = kwargs['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) + link_url = forms.URLField(label = _('Website URL'),required=True) + class Meta: + model = Link + fields = ['name','link_url', 'initial_view','initial_view_date', 'end_view','end_view_date', 'brief_description', 'all_students', 'students', 'groups', 'visible'] + labels = { + 'name': _('Link 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 link with this name')] + + return ValueError + + return name + + + + def save(self, commit = True): + super(LinkForm, 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/links/models.py b/links/models.py index 9210420..890472e 100644 --- a/links/models.py +++ b/links/models.py @@ -1,25 +1,23 @@ from django.db import models -from subject.models import Tag +from django.utils.translation import ugettext_lazy as _ +from autoslug.fields import AutoSlugField -from topics.models import Topic +import datetime +from topics.models import Topic, Resource from users.models import User +from django.utils import timezone # Create your models here. -class Link(models.Model): - name = models.CharField( _("Name"), unique = True,max_length= 200) - slug = AutoSlugField(_("Slug"),populate_from='name',unique=True) +class Link(Resource): + - description_brief = models.TextField(_("simpler_description"), blank=True) - description = models.TextField(_("description"), blank= True) + description = models.TextField(_("simpler_description"), blank=True) link_url = models.URLField(verbose_name = _("Link_URL")) - - tags = models.ManyToManyField(Tag, verbose_name='tags', blank=True, null=True) - visible = models.BooleanField(_('Visible'), default = True) - all_students = models.BooleanField(_('all_students'), default= False) - students = models.ManyToManyField(User,verbose_name=_('Students'), related_name='students', blank = True) - topic = models.ForeignKey(Topic, verbose_name='topic') + initial_view = models.BooleanField(_('Initial View'), default = False) - initia_view_date = models.DateField(_('Initial View Date'), required= False) + initial_view_date = models.DateField(_('Initial View Date'), default=timezone.now) + end_view = models.BooleanField(_('Initial View'), default = False) + end_view_date = models.DateField(_('Initial View Date'), default=timezone.now) class Meta: verbose_name = "Link" verbose_name_plural = "Links" diff --git a/links/templates/links/_form.html b/links/templates/links/_form.html new file mode 100644 index 0000000..f7c72b4 --- /dev/null +++ b/links/templates/links/_form.html @@ -0,0 +1,370 @@ +{% 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.link_url class='form-control' %} + + {{ form.link_url.help_text }} + + {% if form.link_url.errors %} + + {% endif %} +
+ + +
+ + {% 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 form.initial_view_date class='form-control datetime-picker' %} + + {{ form.initial_view.help_text }} + + {% if form.initial_view_date.errors %} + + {% endif %} +
+ +
+
+ +
+ + {{ form.initial_view.help_text }} + + {% if form.initial_view.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/links/templates/links/create.html b/links/templates/links/create.html new file mode 100644 index 0000000..41b1001 --- /dev/null +++ b/links/templates/links/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 'links:create' topic.slug %} +{% endblock %} + +{% block content %} +
+
+
+ {% include 'links/_form.html' %} +
+
+
+
+
+{% endblock %} diff --git a/links/urls.py b/links/urls.py new file mode 100644 index 0000000..bd42049 --- /dev/null +++ b/links/urls.py @@ -0,0 +1,7 @@ +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.CreateLinkView.as_view(), name='create'),] \ No newline at end of file diff --git a/links/views.py b/links/views.py index 91ea44a..5f46845 100644 --- a/links/views.py +++ b/links/views.py @@ -1,3 +1,137 @@ -from django.shortcuts import render +from django.shortcuts import render, get_object_or_404, redirect +from django.views import generic +from .models import Link +from django.utils.translation import ugettext_lazy as _ +from django.core.urlresolvers import reverse_lazy +from django.contrib.auth.mixins import LoginRequiredMixin +from .forms import LinkForm +from rolepermissions.mixins import HasRoleMixin + +from log.mixins import LogMixin +from log.decorators import log_decorator_ajax +from log.models import Log + +from pendencies.forms import PendenciesForm + +from amadeus.permissions import has_subject_permissions, has_resource_permissions + +from topics.models import Topic # Create your views here. +class CreateLinkView(LoginRequiredMixin, LogMixin, generic.edit.CreateView): + log_component = 'resources' + log_action = 'create' + log_resource = 'file_link' + log_context = {} + + login_url = reverse_lazy("users:login") + redirect_field_name = 'next' + + template_name = 'links/create.html' + form_class = LinkForm + + 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(CreateLinkView, 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(CreateLinkView, 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['link_id'] = self.object.id + self.log_context['link_name'] = self.object.name + self.log_context['link_slug'] = self.object.slug + + super(CreateLinkView, 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(CreateLinkView, self).get_context_data(**kwargs) + + context['title'] = _('Create Webiste Link') + + 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 Link "%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/subjects/forms.py b/subjects/forms.py index 99fb746..e345dad 100644 --- a/subjects/forms.py +++ b/subjects/forms.py @@ -131,8 +131,8 @@ class UpdateSubjectForm(forms.ModelForm): class Meta: model = Subject - fields = ('name', 'description_brief', 'description', - 'visible', 'professor', 'students', ) + fields = ('name', 'description_brief', 'description', 'init_date', 'end_date','subscribe_begin', 'subscribe_end', + 'visible', 'professor', 'students', ) widgets = { diff --git a/subjects/models.py b/subjects/models.py index 3dcdcaf..a2fce0c 100644 --- a/subjects/models.py +++ b/subjects/models.py @@ -27,7 +27,7 @@ class Subject(models.Model): init_date = models.DateField(_('Begin of Subject Date')) end_date = models.DateField(_('End of Subject Date')) - tags = models.ManyToManyField(Tag, verbose_name='tags', blank=True, null=True) + tags = models.ManyToManyField(Tag, verbose_name='tags', blank=True) create_date = models.DateTimeField(_('Creation Date'), auto_now_add = True) update_date = models.DateTimeField(_('Date of last update'), auto_now=True) diff --git a/topics/templates/topics/list.html b/topics/templates/topics/list.html index ca2659a..04181e3 100644 --- a/topics/templates/topics/list.html +++ b/topics/templates/topics/list.html @@ -55,7 +55,7 @@
  • {% trans 'Video Embed' %}
  • {% trans 'Forum' %}
  • {% trans 'File Link' %}
  • -
  • {% trans "Link to Website" %} +
  • {% trans "Link to Website" %}
  • {% trans 'Webpage' %}
  • {% trans 'Questionary' %}
  • -- libgit2 0.21.2