Commit a1b3ab819d271fe5912545543c9e8343de9ae556

Authored by Felipe Henrique de Almeida Bormann
2 parents f221a7c1 33bc83ff

Merge branch 'refactoring' of https://github.com/amadeusproject/amadeuslms into refactoring

amadeus/static/js/main.js
1 -var locale = navigator.language || navigator.userLanguage;  
2 -  
3 -$('.datetime-picker').datetimepicker({  
4 - locale: locale  
5 -}); 1 +$(function () {
  2 + var locale = navigator.language || navigator.userLanguage;
6 3
7 -$('.date-picker').datetimepicker({  
8 - locale: locale,  
9 - format: 'L'  
10 -}); 4 + $('.datetime-picker').datetimepicker({
  5 + locale: locale
  6 + });
11 7
12 -$('.text_wysiwyg').summernote({  
13 - height: 200  
14 -}); 8 + $('.date-picker').datetimepicker({
  9 + locale: locale,
  10 + format: 'L'
  11 + });
15 12
16 -$(function () { 13 + $('.text_wysiwyg').summernote({
  14 + height: 200
  15 + });
  16 +
17 $('[data-toggle="tooltip"]').tooltip(); 17 $('[data-toggle="tooltip"]').tooltip();
18 18
19 //Dropdown menu collapse 19 //Dropdown menu collapse
pendencies/forms.py
1 # coding=utf-8 1 # coding=utf-8
  2 +import datetime
  3 +
2 from django import forms 4 from django import forms
3 from django.utils.translation import ugettext_lazy as _ 5 from django.utils.translation import ugettext_lazy as _
4 6
  7 +from subjects.models import Subject
  8 +
5 from .models import Pendencies 9 from .models import Pendencies
6 10
7 class PendenciesForm(forms.ModelForm): 11 class PendenciesForm(forms.ModelForm):
  12 + subject = forms.CharField(widget = forms.HiddenInput())
  13 +
  14 + def __init__(self, *args, **kwargs):
  15 + super(PendenciesForm, self).__init__(*args, **kwargs)
  16 +
  17 + if kwargs.get('initial'):
  18 + subject = kwargs['initial'].get('subject', None)
  19 +
  20 + if subject:
  21 + self.initial['subject'] = subject.id
  22 +
  23 + begin_date_check = forms.BooleanField(required = False)
  24 + end_date_check = forms.BooleanField(required = False)
  25 +
8 class Meta: 26 class Meta:
9 model = Pendencies 27 model = Pendencies
10 - fields = ['action', 'begin_date', 'end_date']  
11 \ No newline at end of file 28 \ No newline at end of file
  29 + fields = ['action', 'begin_date', 'end_date']
  30 +
  31 + def clean(self):
  32 + cleaned_data = super(PendenciesForm, self).clean()
  33 +
  34 + begin_date = cleaned_data.get('begin_date', None)
  35 + end_date = cleaned_data.get('end_date', None)
  36 + begin_check = cleaned_data.get('begin_date_check', False)
  37 + end_check = cleaned_data.get('end_date_check', False)
  38 + subject_id = cleaned_data.get('subject', None)
  39 +
  40 + if not begin_date and begin_check:
  41 + self.add_error('begin_date', _('This field is required.'))
  42 +
  43 + if not end_date and end_check:
  44 + self.add_error('end_date', _('This field is required.'))
  45 +
  46 + if begin_date and end_date:
  47 + if not begin_date == ValueError and not end_date == ValueError:
  48 + if begin_date > end_date:
  49 + self.add_error('begin_date', _('This input should be filled with a date equal or before the End Date.'))
  50 + self.add_error('end_date', _('This input should be filled with a date equal or after the Begin Date.'))
  51 +
  52 + if subject_id:
  53 + subject = Subject.objects.get(id = subject_id)
  54 +
  55 + if not begin_date == ValueError and begin_date:
  56 + if begin_date.date() < datetime.datetime.today().date():
  57 + self.add_error('begin_date', _("This input should be filled with a date equal or after today's date."))
  58 +
  59 + if begin_date.date() < subject.init_date:
  60 + self.add_error('begin_date', _('This input should be filled with a date equal or after the subject begin date.'))
  61 +
  62 + if begin_date.date() > subject.end_date:
  63 + self.add_error('begin_date', _('This input should be filled with a date equal or after the subject end date.'))
  64 +
  65 + if not end_date == ValueError and end_date:
  66 + if end_date.date() < datetime.datetime.today().date():
  67 + self.add_error('end_date', _("This input should be filled with a date equal or after today's date."))
  68 +
  69 + if end_date.date() < subject.init_date:
  70 + self.add_error('end_date', _('This input should be filled with a date equal or after the subject begin date.'))
  71 +
  72 + if end_date.date() > subject.end_date:
  73 + self.add_error('end_date', _('This input should be filled with a date equal or before the subject end date.'))
  74 +
  75 + return cleaned_data
webpage/forms.py
@@ -2,13 +2,33 @@ @@ -2,13 +2,33 @@
2 from django import forms 2 from django import forms
3 from django.forms.models import inlineformset_factory 3 from django.forms.models import inlineformset_factory
4 from django.utils.translation import ugettext_lazy as _ 4 from django.utils.translation import ugettext_lazy as _
  5 +from django.utils.html import strip_tags
5 6
6 from pendencies.forms import PendenciesForm 7 from pendencies.forms import PendenciesForm
7 from pendencies.models import Pendencies 8 from pendencies.models import Pendencies
8 9
  10 +from subjects.models import Tag
  11 +
9 from .models import Webpage 12 from .models import Webpage
10 13
11 class WebpageForm(forms.ModelForm): 14 class WebpageForm(forms.ModelForm):
  15 + subject = None
  16 + control_subject = forms.CharField(widget = forms.HiddenInput())
  17 +
  18 + def __init__(self, *args, **kwargs):
  19 + super(WebpageForm, self).__init__(*args, **kwargs)
  20 +
  21 + self.subject = kwargs['initial'].get('subject', None)
  22 +
  23 + if self.instance.id:
  24 + self.subject = self.instance.subject
  25 + self.initial['tags'] = ", ".join(self.instance.tags.all().values_list("name", flat = True))
  26 +
  27 + self.initial['control_subject'] = self.subject.id
  28 +
  29 + self.fields['students'].queryset = self.subject.students.all()
  30 + self.fields['groups'].queryset = self.subject.group_subject.all()
  31 +
12 tags = forms.CharField(label = _('Tags'), required = False) 32 tags = forms.CharField(label = _('Tags'), required = False)
13 33
14 class Meta: 34 class Meta:
@@ -25,4 +45,62 @@ class WebpageForm(forms.ModelForm): @@ -25,4 +45,62 @@ class WebpageForm(forms.ModelForm):
25 'groups': forms.SelectMultiple, 45 'groups': forms.SelectMultiple,
26 } 46 }
27 47
  48 + def clean_name(self):
  49 + name = self.cleaned_data.get('name', '')
  50 +
  51 + topics = self.subject.topic_subject.all()
  52 +
  53 + for topic in topics:
  54 + if self.instance.id:
  55 + same_name = topic.resource_topic.filter(name__unaccent__iexact = name).exclude(id = self.instance.id).count()
  56 + else:
  57 + same_name = topic.resource_topic.filter(name__unaccent__iexact = name).count()
  58 +
  59 + if same_name > 0:
  60 + self._errors['name'] = [_('This subject already has a webpage with this name')]
  61 +
  62 + return ValueError
  63 +
  64 + return name
  65 +
  66 + def clean_content(self):
  67 + content = self.cleaned_data.get('content', '')
  68 + content = strip_tags(content)
  69 +
  70 + if content == '':
  71 + self._errors['content'] = [_('This field is required.')]
  72 +
  73 + return ValueError
  74 +
  75 + return content
  76 +
  77 + def save(self, commit = True):
  78 + super(WebpageForm, self).save(commit = True)
  79 +
  80 + self.instance.save()
  81 +
  82 + previous_tags = self.instance.tags.all()
  83 +
  84 + tags = self.cleaned_data['tags'].split(",")
  85 +
  86 + #Excluding unwanted tags
  87 + for prev in previous_tags:
  88 + if not prev.name in tags:
  89 + self.instance.tags.remove(prev)
  90 +
  91 + for tag in tags:
  92 + tag = tag.strip()
  93 +
  94 + exist = Tag.objects.filter(name = tag).exists()
  95 +
  96 + if exist:
  97 + new_tag = Tag.objects.get(name = tag)
  98 + else:
  99 + new_tag = Tag.objects.create(name = tag)
  100 +
  101 + if not new_tag in self.instance.tags.all():
  102 + self.instance.tags.add(new_tag)
  103 +
  104 + return self.instance
  105 +
28 InlinePendenciesFormset = inlineformset_factory(Webpage, Pendencies, form = PendenciesForm, extra = 1, can_delete = True) 106 InlinePendenciesFormset = inlineformset_factory(Webpage, Pendencies, form = PendenciesForm, extra = 1, can_delete = True)
29 \ No newline at end of file 107 \ No newline at end of file
webpage/migrations/0002_auto_20170120_1944.py 0 → 100644
@@ -0,0 +1,20 @@ @@ -0,0 +1,20 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10 on 2017-01-20 22:44
  3 +from __future__ import unicode_literals
  4 +
  5 +from django.db import migrations, models
  6 +
  7 +
  8 +class Migration(migrations.Migration):
  9 +
  10 + dependencies = [
  11 + ('webpage', '0001_initial'),
  12 + ]
  13 +
  14 + operations = [
  15 + migrations.AlterField(
  16 + model_name='webpage',
  17 + name='content',
  18 + field=models.TextField(blank=True, verbose_name='Webpage Content'),
  19 + ),
  20 + ]
webpage/models.py
@@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _ @@ -5,7 +5,7 @@ from django.utils.translation import ugettext_lazy as _
5 from topics.models import Resource 5 from topics.models import Resource
6 6
7 class Webpage(Resource): 7 class Webpage(Resource):
8 - content = models.TextField(_('HTML Page Content')) 8 + content = models.TextField(_('Webpage Content'), blank = True)
9 9
10 class Meta: 10 class Meta:
11 verbose_name = _('WebPage') 11 verbose_name = _('WebPage')
webpage/templates/webpages/_form.html
@@ -4,14 +4,46 @@ @@ -4,14 +4,46 @@
4 <form method="post" action="" enctype="multipart/form-data"> 4 <form method="post" action="" enctype="multipart/form-data">
5 {% csrf_token %} 5 {% csrf_token %}
6 6
  7 + {% render_field form.control_subject %}
  8 +
7 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> 9 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
8 <label for="{{ form.name.auto_id }}">{{ form.name.label }} <span>*</span></label> 10 <label for="{{ form.name.auto_id }}">{{ form.name.label }} <span>*</span></label>
9 {% render_field form.name class='form-control' %} 11 {% render_field form.name class='form-control' %}
  12 +
  13 + <span id="helpBlock" class="help-block">{{ form.name.help_text }}</span>
  14 +
  15 + {% if form.name.errors %}
  16 + <div class="alert alert-danger alert-dismissible" role="alert">
  17 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  18 + <span aria-hidden="true">&times;</span>
  19 + </button>
  20 + <ul>
  21 + {% for error in form.name.errors %}
  22 + <li>{{ error }}</li>
  23 + {% endfor %}
  24 + </ul>
  25 + </div>
  26 + {% endif %}
10 </div> 27 </div>
11 28
12 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> 29 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
13 <label for="{{ form.content.auto_id }}">{{ form.content.label }} <span>*</span></label> 30 <label for="{{ form.content.auto_id }}">{{ form.content.label }} <span>*</span></label>
14 {% render_field form.content class='form-control text_wysiwyg' %} 31 {% render_field form.content class='form-control text_wysiwyg' %}
  32 +
  33 + <span id="helpBlock" class="help-block">{{ form.content.help_text }}</span>
  34 +
  35 + {% if form.content.errors %}
  36 + <div class="alert alert-danger alert-dismissible" role="alert">
  37 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  38 + <span aria-hidden="true">&times;</span>
  39 + </button>
  40 + <ul>
  41 + {% for error in form.content.errors %}
  42 + <li>{{ error }}</li>
  43 + {% endfor %}
  44 + </ul>
  45 + </div>
  46 + {% endif %}
15 </div> 47 </div>
16 48
17 <legend>{% trans 'Common resources settings' %}</legend> 49 <legend>{% trans 'Common resources settings' %}</legend>
@@ -19,11 +51,41 @@ @@ -19,11 +51,41 @@
19 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> 51 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
20 <label for="{{ form.brief_description.auto_id }}">{{ form.brief_description.label }}</label> 52 <label for="{{ form.brief_description.auto_id }}">{{ form.brief_description.label }}</label>
21 {% render_field form.brief_description class='form-control text_wysiwyg' %} 53 {% render_field form.brief_description class='form-control text_wysiwyg' %}
  54 +
  55 + <span id="helpBlock" class="help-block">{{ form.brief_description.help_text }}</span>
  56 +
  57 + {% if form.brief_description.errors %}
  58 + <div class="alert alert-danger alert-dismissible" role="alert">
  59 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  60 + <span aria-hidden="true">&times;</span>
  61 + </button>
  62 + <ul>
  63 + {% for error in form.brief_description.errors %}
  64 + <li>{{ error }}</li>
  65 + {% endfor %}
  66 + </ul>
  67 + </div>
  68 + {% endif %}
22 </div> 69 </div>
23 70
24 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> 71 <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput">
25 <label for="{{ form.tags.auto_id }}">{{ form.tags.label }}</label> 72 <label for="{{ form.tags.auto_id }}">{{ form.tags.label }}</label>
26 {% render_field form.tags class='form-control' data-role="tagsinput" %} 73 {% render_field form.tags class='form-control' data-role="tagsinput" %}
  74 +
  75 + <span id="helpBlock" class="help-block">{{ form.tags.help_text }}</span>
  76 +
  77 + {% if form.tags.errors %}
  78 + <div class="alert alert-danger alert-dismissible" role="alert">
  79 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  80 + <span aria-hidden="true">&times;</span>
  81 + </button>
  82 + <ul>
  83 + {% for error in form.tags.errors %}
  84 + <li>{{ error }}</li>
  85 + {% endfor %}
  86 + </ul>
  87 + </div>
  88 + {% endif %}
27 </div> 89 </div>
28 90
29 <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true"> 91 <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true">
@@ -47,13 +109,29 @@ @@ -47,13 +109,29 @@
47 <div class="notifies"> 109 <div class="notifies">
48 <div style="text-align:left"> 110 <div style="text-align:left">
49 {% if notify.instance.pk %}{{ notify.DELETE }}{% endif %} 111 {% if notify.instance.pk %}{{ notify.DELETE }}{% endif %}
50 - <div class="form-group{% if form.has_error %} has-error {% endif %} row"> 112 + {% render_field notify.subject %}
  113 + <div class="form-group{% if notify.has_error %} has-error {% endif %} row">
51 <label for="{{ notify.action.auto_id }}" class="pull-left action_label contol-label"> 114 <label for="{{ notify.action.auto_id }}" class="pull-left action_label contol-label">
52 {% trans 'Action not performed by the user' %}: 115 {% trans 'Action not performed by the user' %}:
53 </label> 116 </label>
54 <div class="col-md-3"> 117 <div class="col-md-3">
55 {% render_field notify.action class='form-control' %} 118 {% render_field notify.action class='form-control' %}
56 </div> 119 </div>
  120 +
  121 + <span id="helpBlock" class="help-block">{{ notify.action.help_text }}</span>
  122 +
  123 + {% if notify.action.errors %}
  124 + <div class="alert alert-danger alert-dismissible" role="alert">
  125 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  126 + <span aria-hidden="true">&times;</span>
  127 + </button>
  128 + <ul>
  129 + {% for error in notify.action.errors %}
  130 + <li>{{ error }}</li>
  131 + {% endfor %}
  132 + </ul>
  133 + </div>
  134 + {% endif %}
57 </div> 135 </div>
58 <br clear="all" /> 136 <br clear="all" />
59 <div class="row"> 137 <div class="row">
@@ -61,26 +139,58 @@ @@ -61,26 +139,58 @@
61 <p>{% trans 'Wished period' %}: </p> 139 <p>{% trans 'Wished period' %}: </p>
62 </div> 140 </div>
63 </div> 141 </div>
64 - <div class="form-group{% if form.has_error %} has-error {% endif %} row"> 142 + <div class="form-group{% if notify.has_error %} has-error {% endif %} row">
65 <div class="col-lg-offset-3 col-md-offset-3 col-sm-offset-3 col-lg-2 col-md-2 col-sm-2 col-xs-3 checkbox"> 143 <div class="col-lg-offset-3 col-md-offset-3 col-sm-offset-3 col-lg-2 col-md-2 col-sm-2 col-xs-3 checkbox">
66 <label> 144 <label>
67 - <input type="checkbox" class="begin_date" /> {{ notify.begin_date.label }} 145 + {% render_field notify.begin_date_check class="begin_date" %} {{ notify.begin_date.label }}
68 </label> 146 </label>
69 </div> 147 </div>
70 <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4"> 148 <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
71 - {% render_field notify.begin_date class='form-control datetime-picker' %}  
72 - </div> 149 + {% render_field notify.begin_date class='form-control datetime-picker begin_date_input' %}
  150 + </div>
73 </div> 151 </div>
74 - <div class="form-group{% if form.has_error %} has-error {% endif %} row"> 152 + <div class="row">
  153 + <span id="helpBlock" class="help-block">{{ notify.begin_date.help_text }}</span>
  154 +
  155 + {% if notify.begin_date.errors %}
  156 + <div class="alert alert-danger alert-dismissible" role="alert">
  157 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  158 + <span aria-hidden="true">&times;</span>
  159 + </button>
  160 + <ul>
  161 + {% for error in notify.begin_date.errors %}
  162 + <li>{{ error }}</li>
  163 + {% endfor %}
  164 + </ul>
  165 + </div>
  166 + {% endif %}
  167 + </div>
  168 + <div class="form-group{% if notify.has_error %} has-error {% endif %} row">
75 <div class="col-lg-offset-3 col-md-offset-3 col-sm-offset-3 col-lg-2 col-md-2 col-sm-2 col-xs-3 checkbox"> 169 <div class="col-lg-offset-3 col-md-offset-3 col-sm-offset-3 col-lg-2 col-md-2 col-sm-2 col-xs-3 checkbox">
76 <label> 170 <label>
77 - <input type="checkbox" class="end_date" /> {{ notify.end_date.label }} 171 + {% render_field notify.end_date_check class="end_date" %} {{ notify.end_date.label }}
78 </label> 172 </label>
79 </div> 173 </div>
80 <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4"> 174 <div class="col-lg-4 col-md-4 col-sm-4 col-xs-4">
81 - {% render_field notify.end_date class='form-control date-picker' %} 175 + {% render_field notify.end_date class='form-control datetime-picker end_date_input' %}
82 </div> 176 </div>
83 </div> 177 </div>
  178 + <div class="row">
  179 + <span id="helpBlock" class="help-block">{{ notify.end_date.help_text }}</span>
  180 +
  181 + {% if notify.end_date.errors %}
  182 + <div class="alert alert-danger alert-dismissible" role="alert">
  183 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  184 + <span aria-hidden="true">&times;</span>
  185 + </button>
  186 + <ul>
  187 + {% for error in notify.end_date.errors %}
  188 + <li>{{ error }}</li>
  189 + {% endfor %}
  190 + </ul>
  191 + </div>
  192 + {% endif %}
  193 + </div>
84 </div> 194 </div>
85 </div> 195 </div>
86 {% endfor %} 196 {% endfor %}
@@ -106,15 +216,60 @@ @@ -106,15 +216,60 @@
106 {% render_field form.all_students %} {{ form.all_students.label }} 216 {% render_field form.all_students %} {{ form.all_students.label }}
107 </label> 217 </label>
108 </div> 218 </div>
  219 +
  220 + <span id="helpBlock" class="help-block">{{ form.all_students.help_text }}</span>
  221 +
  222 + {% if form.all_students.errors %}
  223 + <div class="alert alert-danger alert-dismissible" role="alert">
  224 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  225 + <span aria-hidden="true">&times;</span>
  226 + </button>
  227 + <ul>
  228 + {% for error in form.all_students.errors %}
  229 + <li>{{ error }}</li>
  230 + {% endfor %}
  231 + </ul>
  232 + </div>
  233 + {% endif %}
109 </div> 234 </div>
110 235
111 <p><em>{% trans 'Attribute students to webpage' %}:</em></p> 236 <p><em>{% trans 'Attribute students to webpage' %}:</em></p>
112 {% render_field form.students class='form-control' %} 237 {% render_field form.students class='form-control' %}
113 238
  239 + <span id="helpBlock" class="help-block">{{ form.students.help_text }}</span>
  240 +
  241 + {% if form.students.errors %}
  242 + <div class="alert alert-danger alert-dismissible" role="alert">
  243 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  244 + <span aria-hidden="true">&times;</span>
  245 + </button>
  246 + <ul>
  247 + {% for error in form.students.errors %}
  248 + <li>{{ error }}</li>
  249 + {% endfor %}
  250 + </ul>
  251 + </div>
  252 + {% endif %}
  253 +
114 <br clear="all" /> 254 <br clear="all" />
115 255
116 <p><em>{% trans 'Attribute groups to webpage' %}:</em></p> 256 <p><em>{% trans 'Attribute groups to webpage' %}:</em></p>
117 {% render_field form.groups class='form-control' %} 257 {% render_field form.groups class='form-control' %}
  258 +
  259 + <span id="helpBlock" class="help-block">{{ form.groups.help_text }}</span>
  260 +
  261 + {% if form.groups.errors %}
  262 + <div class="alert alert-danger alert-dismissible" role="alert">
  263 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  264 + <span aria-hidden="true">&times;</span>
  265 + </button>
  266 + <ul>
  267 + {% for error in form.groups.errors %}
  268 + <li>{{ error }}</li>
  269 + {% endfor %}
  270 + </ul>
  271 + </div>
  272 + {% endif %}
118 </div> 273 </div>
119 </div> 274 </div>
120 </div> 275 </div>
@@ -125,6 +280,21 @@ @@ -125,6 +280,21 @@
125 {% render_field form.show_window %} {{ form.show_window.label }} 280 {% render_field form.show_window %} {{ form.show_window.label }}
126 </label> 281 </label>
127 </div> 282 </div>
  283 +
  284 + <span id="helpBlock" class="help-block">{{ form.show_window.help_text }}</span>
  285 +
  286 + {% if form.show_window.errors %}
  287 + <div class="alert alert-danger alert-dismissible" role="alert">
  288 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  289 + <span aria-hidden="true">&times;</span>
  290 + </button>
  291 + <ul>
  292 + {% for error in form.show_window.errors %}
  293 + <li>{{ error }}</li>
  294 + {% endfor %}
  295 + </ul>
  296 + </div>
  297 + {% endif %}
128 </div> 298 </div>
129 299
130 <div class="form-group{% if form.has_error %} has-error {% endif %}"> 300 <div class="form-group{% if form.has_error %} has-error {% endif %}">
@@ -133,6 +303,21 @@ @@ -133,6 +303,21 @@
133 {% render_field form.visible %} {{ form.visible.label }} 303 {% render_field form.visible %} {{ form.visible.label }}
134 </label> 304 </label>
135 </div> 305 </div>
  306 +
  307 + <span id="helpBlock" class="help-block">{{ form.visible.help_text }}</span>
  308 +
  309 + {% if form.visible.errors %}
  310 + <div class="alert alert-danger alert-dismissible" role="alert">
  311 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  312 + <span aria-hidden="true">&times;</span>
  313 + </button>
  314 + <ul>
  315 + {% for error in form.visible.errors %}
  316 + <li>{{ error }}</li>
  317 + {% endfor %}
  318 + </ul>
  319 + </div>
  320 + {% endif %}
136 </div> 321 </div>
137 322
138 <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12"> 323 <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12">
@@ -145,10 +330,41 @@ @@ -145,10 +330,41 @@
145 $(function() { 330 $(function() {
146 $('.notifies').formset({ 331 $('.notifies').formset({
147 addText: '{% trans "Add new notification" %}', 332 addText: '{% trans "Add new notification" %}',
148 - deleteText: '{% trans "Remove this notification" %}'  
149 - }); 333 + deleteText: '{% trans "Remove this notification" %}',
  334 + prefix: '{{ pendencies_form.prefix }}',
  335 + added: function (row) {
  336 + var locale = navigator.language || navigator.userLanguage;
  337 +
  338 + $(row).find('.datetime-picker').each(function () {
  339 + $(this).datetimepicker({
  340 + locale: locale
  341 + });
  342 + });
  343 +
  344 + $('.begin_date_input').on('click', function () {
  345 + var checkbox = $(this).parent().parent().find('.begin_date');
  346 +
  347 + $(checkbox).prop('checked', true);
  348 + });
  349 +
  350 + $('.end_date_input').on('click', function () {
  351 + var checkbox = $(this).parent().parent().find('.end_date');
  352 +
  353 + $(checkbox).prop('checked', true);
  354 + });
  355 +
  356 + subject = $("#id_control_subject").val();
  357 +
  358 + console.log(subject);
  359 + console.log($(row).find('input[type=hidden]'));
150 360
151 - 361 + $(row).find('input[type=hidden]').val(subject);
  362 + }
  363 + });
  364 +
  365 + {% if not pendencies_form.is_valid and pendencies_form.is_bound %}
  366 + $("#notifications").collapse('toggle');
  367 + {% endif %}
152 }); 368 });
153 369
154 $('#id_groups').multiSelect({ 370 $('#id_groups').multiSelect({
@@ -224,11 +440,11 @@ @@ -224,11 +440,11 @@
224 });// Used to create multi-select css style 440 });// Used to create multi-select css style
225 441
226 $('.collapse').on('show.bs.collapse', function (e) { 442 $('.collapse').on('show.bs.collapse', function (e) {
227 - if($(this).is(e.target)){  
228 - var btn = $(this).parent().find('.fa-angle-right'); 443 + if($(this).is(e.target)){
  444 + var btn = $(this).parent().find('.fa-angle-right');
229 445
230 - btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad");  
231 - } 446 + btn.switchClass("fa-angle-right", "fa-angle-down", 250, "easeInOutQuad");
  447 + }
232 }); 448 });
233 449
234 $('.collapse').on('hide.bs.collapse', function (e) { 450 $('.collapse').on('hide.bs.collapse', function (e) {
@@ -238,4 +454,16 @@ @@ -238,4 +454,16 @@
238 btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad"); 454 btn.switchClass("fa-angle-down", "fa-angle-right", 250, "easeInOutQuad");
239 } 455 }
240 }); 456 });
  457 +
  458 + $('.begin_date_input').on('click', function () {
  459 + var checkbox = $(this).parent().parent().find('.begin_date');
  460 +
  461 + $(checkbox).prop('checked', true);
  462 + });
  463 +
  464 + $('.end_date_input').on('click', function () {
  465 + var checkbox = $(this).parent().parent().find('.end_date');
  466 +
  467 + $(checkbox).prop('checked', true);
  468 + });
241 </script> 469 </script>
242 \ No newline at end of file 470 \ No newline at end of file
webpage/views.py
@@ -33,9 +33,58 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): @@ -33,9 +33,58 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
33 33
34 form_class = self.get_form_class() 34 form_class = self.get_form_class()
35 form = self.get_form(form_class) 35 form = self.get_form(form_class)
36 - pendencies_form = InlinePendenciesFormset()  
37 36
38 - return self.render_to_response(self.get_context_data(form = form,pendencies_form = pendencies_form)) 37 + slug = self.kwargs.get('slug', '')
  38 + topic = get_object_or_404(Topic, slug = slug)
  39 +
  40 + pendencies_form = InlinePendenciesFormset(initial = [{'subject': topic.subject}])
  41 +
  42 + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
  43 +
  44 + def post(self, request, *args, **kwargs):
  45 + self.object = None
  46 +
  47 + form_class = self.get_form_class()
  48 + form = self.get_form(form_class)
  49 +
  50 + slug = self.kwargs.get('slug', '')
  51 + topic = get_object_or_404(Topic, slug = slug)
  52 +
  53 + pendencies_form = InlinePendenciesFormset(self.request.POST, initial = [{'subject': topic.subject}])
  54 +
  55 + if (form.is_valid() and pendencies_form.is_valid()):
  56 + return self.form_valid(form, pendencies_form)
  57 + else:
  58 + return self.form_invalid(form, pendencies_form)
  59 +
  60 + def get_initial(self):
  61 + initial = super(CreateView, self).get_initial()
  62 +
  63 + slug = self.kwargs.get('slug', '')
  64 +
  65 + topic = get_object_or_404(Topic, slug = slug)
  66 + initial['subject'] = topic.subject
  67 +
  68 + return initial
  69 +
  70 + def form_invalid(self, form, pendencies_form):
  71 + return self.render_to_response(self.get_context_data(form = form, pendencies_form = pendencies_form))
  72 +
  73 + def form_valid(self, form, pendencies_form):
  74 + self.object = form.save(commit = False)
  75 +
  76 + slug = self.kwargs.get('slug', '')
  77 + topic = get_object_or_404(Topic, slug = slug)
  78 +
  79 + self.object.topic = topic
  80 + self.object.order = topic.resource_topic.count() + 1
  81 +
  82 + self.object.save()
  83 +
  84 + pendencies_form.instance = self.object
  85 + pendencies_form.save()
  86 +
  87 + return redirect(self.get_success_url())
39 88
40 def get_context_data(self, **kwargs): 89 def get_context_data(self, **kwargs):
41 context = super(CreateView, self).get_context_data(**kwargs) 90 context = super(CreateView, self).get_context_data(**kwargs)
@@ -51,6 +100,6 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): @@ -51,6 +100,6 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView):
51 return context 100 return context
52 101
53 def get_success_url(self): 102 def get_success_url(self):
54 - messages.success(self.request, _('Topic "%s" was created successfully!')%(self.object.name)) 103 + 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))
55 104
56 return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) 105 return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug})
57 \ No newline at end of file 106 \ No newline at end of file