From 33bc83ff57988277dd90985363d2ae4bd8ea0b39 Mon Sep 17 00:00:00 2001 From: Zambom Date: Fri, 20 Jan 2017 20:45:10 -0200 Subject: [PATCH] Adding webpage creation --- amadeus/static/js/main.js | 26 +++++++++++++------------- pendencies/forms.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- webpage/forms.py | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ webpage/migrations/0002_auto_20170120_1944.py | 20 ++++++++++++++++++++ webpage/models.py | 2 +- webpage/templates/webpages/_form.html | 258 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------- webpage/views.py | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 7 files changed, 472 insertions(+), 33 deletions(-) create mode 100644 webpage/migrations/0002_auto_20170120_1944.py diff --git a/amadeus/static/js/main.js b/amadeus/static/js/main.js index 0a2d002..263d617 100755 --- a/amadeus/static/js/main.js +++ b/amadeus/static/js/main.js @@ -1,19 +1,19 @@ -var locale = navigator.language || navigator.userLanguage; - -$('.datetime-picker').datetimepicker({ - locale: locale -}); +$(function () { + var locale = navigator.language || navigator.userLanguage; -$('.date-picker').datetimepicker({ - locale: locale, - format: 'L' -}); + $('.datetime-picker').datetimepicker({ + locale: locale + }); -$('.text_wysiwyg').summernote({ - height: 200 -}); + $('.date-picker').datetimepicker({ + locale: locale, + format: 'L' + }); -$(function () { + $('.text_wysiwyg').summernote({ + height: 200 + }); + $('[data-toggle="tooltip"]').tooltip(); //Dropdown menu collapse diff --git a/pendencies/forms.py b/pendencies/forms.py index a29c78c..4791cba 100644 --- a/pendencies/forms.py +++ b/pendencies/forms.py @@ -1,10 +1,74 @@ # coding=utf-8 +import datetime + from django import forms from django.utils.translation import ugettext_lazy as _ +from subjects.models import Subject + from .models import Pendencies class PendenciesForm(forms.ModelForm): + subject = forms.CharField(widget = forms.HiddenInput()) + + def __init__(self, *args, **kwargs): + super(PendenciesForm, self).__init__(*args, **kwargs) + + if kwargs.get('initial'): + subject = kwargs['initial'].get('subject', None) + + if subject: + self.initial['subject'] = subject.id + + begin_date_check = forms.BooleanField(required = False) + end_date_check = forms.BooleanField(required = False) + class Meta: model = Pendencies - fields = ['action', 'begin_date', 'end_date'] \ No newline at end of file + fields = ['action', 'begin_date', 'end_date'] + + def clean(self): + cleaned_data = super(PendenciesForm, self).clean() + + begin_date = cleaned_data.get('begin_date', None) + end_date = cleaned_data.get('end_date', None) + begin_check = cleaned_data.get('begin_date_check', False) + end_check = cleaned_data.get('end_date_check', False) + subject_id = cleaned_data.get('subject', None) + + if not begin_date and begin_check: + self.add_error('begin_date', _('This field is required.')) + + if not end_date and end_check: + self.add_error('end_date', _('This field is required.')) + + if begin_date and end_date: + if not begin_date == ValueError and not end_date == ValueError: + if begin_date > end_date: + self.add_error('begin_date', _('This input should be filled with a date equal or before the End Date.')) + self.add_error('end_date', _('This input should be filled with a date equal or after the Begin Date.')) + + if subject_id: + subject = Subject.objects.get(id = subject_id) + + if not begin_date == ValueError and begin_date: + if begin_date.date() < datetime.datetime.today().date(): + self.add_error('begin_date', _("This input should be filled with a date equal or after today's date.")) + + if begin_date.date() < subject.init_date: + self.add_error('begin_date', _('This input should be filled with a date equal or after the subject begin date.')) + + if begin_date.date() > subject.end_date: + self.add_error('begin_date', _('This input should be filled with a date equal or after the subject end date.')) + + if not end_date == ValueError and end_date: + if end_date.date() < datetime.datetime.today().date(): + self.add_error('end_date', _("This input should be filled with a date equal or after today's date.")) + + if end_date.date() < subject.init_date: + self.add_error('end_date', _('This input should be filled with a date equal or after the subject begin date.')) + + if end_date.date() > subject.end_date: + self.add_error('end_date', _('This input should be filled with a date equal or before the subject end date.')) + + return cleaned_data diff --git a/webpage/forms.py b/webpage/forms.py index 26a39e6..be3a34d 100644 --- a/webpage/forms.py +++ b/webpage/forms.py @@ -2,13 +2,33 @@ from django import forms from django.forms.models import inlineformset_factory from django.utils.translation import ugettext_lazy as _ +from django.utils.html import strip_tags from pendencies.forms import PendenciesForm from pendencies.models import Pendencies +from subjects.models import Tag + from .models import Webpage class WebpageForm(forms.ModelForm): + subject = None + control_subject = forms.CharField(widget = forms.HiddenInput()) + + def __init__(self, *args, **kwargs): + super(WebpageForm, self).__init__(*args, **kwargs) + + self.subject = kwargs['initial'].get('subject', None) + + if self.instance.id: + self.subject = self.instance.subject + self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True)) + + self.initial['control_subject'] = self.subject.id + + 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: @@ -25,4 +45,62 @@ class WebpageForm(forms.ModelForm): '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 webpage with this name')] + + return ValueError + + return name + + def clean_content(self): + content = self.cleaned_data.get('content', '') + content = strip_tags(content) + + if content == '': + self._errors['content'] = [_('This field is required.')] + + return ValueError + + return content + + def save(self, commit = True): + super(WebpageForm, 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 + InlinePendenciesFormset = inlineformset_factory(Webpage, Pendencies, form = PendenciesForm, extra = 1, can_delete = True) \ No newline at end of file diff --git a/webpage/migrations/0002_auto_20170120_1944.py b/webpage/migrations/0002_auto_20170120_1944.py new file mode 100644 index 0000000..f481480 --- /dev/null +++ b/webpage/migrations/0002_auto_20170120_1944.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-01-20 22:44 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('webpage', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='webpage', + name='content', + field=models.TextField(blank=True, verbose_name='Webpage Content'), + ), + ] diff --git a/webpage/models.py b/webpage/models.py index 3adaae2..b3bdf3d 100644 --- a/webpage/models.py +++ b/webpage/models.py @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ from topics.models import Resource class Webpage(Resource): - content = models.TextField(_('HTML Page Content')) + content = models.TextField(_('Webpage Content'), blank = True) class Meta: verbose_name = _('WebPage') diff --git a/webpage/templates/webpages/_form.html b/webpage/templates/webpages/_form.html index 77253fb..24a91b4 100644 --- a/webpage/templates/webpages/_form.html +++ b/webpage/templates/webpages/_form.html @@ -4,14 +4,46 @@
{% 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.content class='form-control text_wysiwyg' %} + + {{ form.content.help_text }} + + {% if form.content.errors %} + + {% endif %}
{% trans 'Common resources settings' %} @@ -19,11 +51,41 @@
{% 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 %}
@@ -47,13 +109,29 @@
{% if notify.instance.pk %}{{ notify.DELETE }}{% endif %} -
+ {% render_field notify.subject %} +
{% render_field notify.action class='form-control' %}
+ + {{ notify.action.help_text }} + + {% if notify.action.errors %} + + {% endif %}

@@ -61,26 +139,58 @@

{% trans 'Wished period' %}:

-
+
- {% render_field notify.begin_date class='form-control datetime-picker' %} -
+ {% render_field notify.begin_date class='form-control datetime-picker begin_date_input' %} +
-
+
+ {{ notify.begin_date.help_text }} + + {% if notify.begin_date.errors %} + + {% endif %} +
+
- {% render_field notify.end_date class='form-control date-picker' %} + {% render_field notify.end_date class='form-control datetime-picker end_date_input' %}
+
+ {{ notify.end_date.help_text }} + + {% if notify.end_date.errors %} + + {% endif %} +
{% endfor %} @@ -106,15 +216,60 @@ {% render_field form.all_students %} {{ form.all_students.label }}
+ + {{ form.all_students.help_text }} + + {% if form.all_students.errors %} + + {% endif %}

{% trans 'Attribute students to webpage' %}:

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

{% trans 'Attribute groups to webpage' %}:

{% render_field form.groups class='form-control' %} + + {{ form.groups.help_text }} + + {% if form.groups.errors %} + + {% endif %} @@ -125,6 +280,21 @@ {% render_field form.show_window %} {{ form.show_window.label }} + + {{ form.show_window.help_text }} + + {% if form.show_window.errors %} + + {% endif %}
@@ -133,6 +303,21 @@ {% render_field form.visible %} {{ form.visible.label }}
+ + {{ form.visible.help_text }} + + {% if form.visible.errors %} + + {% endif %}
@@ -145,10 +330,41 @@ $(function() { $('.notifies').formset({ addText: '{% trans "Add new notification" %}', - deleteText: '{% trans "Remove this notification" %}' - }); + deleteText: '{% trans "Remove this notification" %}', + prefix: '{{ pendencies_form.prefix }}', + added: function (row) { + var locale = navigator.language || navigator.userLanguage; + + $(row).find('.datetime-picker').each(function () { + $(this).datetimepicker({ + locale: locale + }); + }); + + $('.begin_date_input').on('click', function () { + var checkbox = $(this).parent().parent().find('.begin_date'); + + $(checkbox).prop('checked', true); + }); + + $('.end_date_input').on('click', function () { + var checkbox = $(this).parent().parent().find('.end_date'); + + $(checkbox).prop('checked', true); + }); + + subject = $("#id_control_subject").val(); + + console.log(subject); + console.log($(row).find('input[type=hidden]')); - + $(row).find('input[type=hidden]').val(subject); + } + }); + + {% if not pendencies_form.is_valid and pendencies_form.is_bound %} + $("#notifications").collapse('toggle'); + {% endif %} }); $('#id_groups').multiSelect({ @@ -224,11 +440,11 @@ });// Used to create multi-select css style $('.collapse').on('show.bs.collapse', function (e) { - if($(this).is(e.target)){ - var btn = $(this).parent().find('.fa-angle-right'); + if($(this).is(e.target)){ + var btn = $(this).parent().find('.fa-angle-right'); - btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); - } + btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad"); + } }); $('.collapse').on('hide.bs.collapse', function (e) { @@ -238,4 +454,16 @@ btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); } }); + + $('.begin_date_input').on('click', function () { + var checkbox = $(this).parent().parent().find('.begin_date'); + + $(checkbox).prop('checked', true); + }); + + $('.end_date_input').on('click', function () { + var checkbox = $(this).parent().parent().find('.end_date'); + + $(checkbox).prop('checked', true); + }); \ No newline at end of file diff --git a/webpage/views.py b/webpage/views.py index 9411b5d..29360a4 100644 --- a/webpage/views.py +++ b/webpage/views.py @@ -33,9 +33,58 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): form_class = self.get_form_class() form = self.get_form(form_class) - pendencies_form = InlinePendenciesFormset() - return self.render_to_response(self.get_context_data(form = form,pendencies_form = pendencies_form)) + slug = self.kwargs.get('slug', '') + topic = get_object_or_404(Topic, slug = slug) + + pendencies_form = InlinePendenciesFormset(initial = [{'subject': topic.subject}]) + + 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 = InlinePendenciesFormset(self.request.POST, initial = [{'subject': topic.subject}]) + + 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(CreateView, 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 + + self.object.save() + + pendencies_form.instance = self.object + pendencies_form.save() + + return redirect(self.get_success_url()) def get_context_data(self, **kwargs): context = super(CreateView, self).get_context_data(**kwargs) @@ -51,6 +100,6 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): return context def get_success_url(self): - messages.success(self.request, _('Topic "%s" was created successfully!')%(self.object.name)) + messages.success(self.request, _('The Webpage "%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 -- libgit2 0.21.2