Commit 33bc83ff57988277dd90985363d2ae4bd8ea0b39
1 parent
e4d5cc5f
Exists in
master
and in
3 other branches
Adding webpage creation
Showing
7 changed files
with
472 additions
and
33 deletions
Show diff stats
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 | 17 | $('[data-toggle="tooltip"]').tooltip(); |
18 | 18 | |
19 | 19 | //Dropdown menu collapse | ... | ... |
pendencies/forms.py
1 | 1 | # coding=utf-8 |
2 | +import datetime | |
3 | + | |
2 | 4 | from django import forms |
3 | 5 | from django.utils.translation import ugettext_lazy as _ |
4 | 6 | |
7 | +from subjects.models import Subject | |
8 | + | |
5 | 9 | from .models import Pendencies |
6 | 10 | |
7 | 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 | 26 | class Meta: |
9 | 27 | model = Pendencies |
10 | - fields = ['action', 'begin_date', 'end_date'] | |
11 | 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 | 2 | from django import forms |
3 | 3 | from django.forms.models import inlineformset_factory |
4 | 4 | from django.utils.translation import ugettext_lazy as _ |
5 | +from django.utils.html import strip_tags | |
5 | 6 | |
6 | 7 | from pendencies.forms import PendenciesForm |
7 | 8 | from pendencies.models import Pendencies |
8 | 9 | |
10 | +from subjects.models import Tag | |
11 | + | |
9 | 12 | from .models import Webpage |
10 | 13 | |
11 | 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 | 32 | tags = forms.CharField(label = _('Tags'), required = False) |
13 | 33 | |
14 | 34 | class Meta: |
... | ... | @@ -25,4 +45,62 @@ class WebpageForm(forms.ModelForm): |
25 | 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 | 106 | InlinePendenciesFormset = inlineformset_factory(Webpage, Pendencies, form = PendenciesForm, extra = 1, can_delete = True) |
29 | 107 | \ No newline at end of file | ... | ... |
... | ... | @@ -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 | 5 | from topics.models import Resource |
6 | 6 | |
7 | 7 | class Webpage(Resource): |
8 | - content = models.TextField(_('HTML Page Content')) | |
8 | + content = models.TextField(_('Webpage Content'), blank = True) | |
9 | 9 | |
10 | 10 | class Meta: |
11 | 11 | verbose_name = _('WebPage') | ... | ... |
webpage/templates/webpages/_form.html
... | ... | @@ -4,14 +4,46 @@ |
4 | 4 | <form method="post" action="" enctype="multipart/form-data"> |
5 | 5 | {% csrf_token %} |
6 | 6 | |
7 | + {% render_field form.control_subject %} | |
8 | + | |
7 | 9 | <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> |
8 | 10 | <label for="{{ form.name.auto_id }}">{{ form.name.label }} <span>*</span></label> |
9 | 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">×</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 | 27 | </div> |
11 | 28 | |
12 | 29 | <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> |
13 | 30 | <label for="{{ form.content.auto_id }}">{{ form.content.label }} <span>*</span></label> |
14 | 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">×</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 | 47 | </div> |
16 | 48 | |
17 | 49 | <legend>{% trans 'Common resources settings' %}</legend> |
... | ... | @@ -19,11 +51,41 @@ |
19 | 51 | <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> |
20 | 52 | <label for="{{ form.brief_description.auto_id }}">{{ form.brief_description.label }}</label> |
21 | 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">×</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 | 69 | </div> |
23 | 70 | |
24 | 71 | <div class="form-group{% if form.has_error %} has-error {% endif %} is-fileinput"> |
25 | 72 | <label for="{{ form.tags.auto_id }}">{{ form.tags.label }}</label> |
26 | 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">×</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 | 89 | </div> |
28 | 90 | |
29 | 91 | <div class="panel-group" id="professors_accordion" role="tablist" aria-multiselectable="true"> |
... | ... | @@ -47,13 +109,29 @@ |
47 | 109 | <div class="notifies"> |
48 | 110 | <div style="text-align:left"> |
49 | 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 | 114 | <label for="{{ notify.action.auto_id }}" class="pull-left action_label contol-label"> |
52 | 115 | {% trans 'Action not performed by the user' %}: |
53 | 116 | </label> |
54 | 117 | <div class="col-md-3"> |
55 | 118 | {% render_field notify.action class='form-control' %} |
56 | 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">×</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 | 135 | </div> |
58 | 136 | <br clear="all" /> |
59 | 137 | <div class="row"> |
... | ... | @@ -61,26 +139,58 @@ |
61 | 139 | <p>{% trans 'Wished period' %}: </p> |
62 | 140 | </div> |
63 | 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 | 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 | 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 | 146 | </label> |
69 | 147 | </div> |
70 | 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 | 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">×</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 | 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 | 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 | 172 | </label> |
79 | 173 | </div> |
80 | 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 | 176 | </div> |
83 | 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">×</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 | 194 | </div> |
85 | 195 | </div> |
86 | 196 | {% endfor %} |
... | ... | @@ -106,15 +216,60 @@ |
106 | 216 | {% render_field form.all_students %} {{ form.all_students.label }} |
107 | 217 | </label> |
108 | 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">×</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 | 234 | </div> |
110 | 235 | |
111 | 236 | <p><em>{% trans 'Attribute students to webpage' %}:</em></p> |
112 | 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">×</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 | 254 | <br clear="all" /> |
115 | 255 | |
116 | 256 | <p><em>{% trans 'Attribute groups to webpage' %}:</em></p> |
117 | 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">×</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 | 273 | </div> |
119 | 274 | </div> |
120 | 275 | </div> |
... | ... | @@ -125,6 +280,21 @@ |
125 | 280 | {% render_field form.show_window %} {{ form.show_window.label }} |
126 | 281 | </label> |
127 | 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">×</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 | 298 | </div> |
129 | 299 | |
130 | 300 | <div class="form-group{% if form.has_error %} has-error {% endif %}"> |
... | ... | @@ -133,6 +303,21 @@ |
133 | 303 | {% render_field form.visible %} {{ form.visible.label }} |
134 | 304 | </label> |
135 | 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">×</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 | 321 | </div> |
137 | 322 | |
138 | 323 | <div class="col-md-12 col-lg-12 col-sm-12 col-xs-12"> |
... | ... | @@ -145,10 +330,41 @@ |
145 | 330 | $(function() { |
146 | 331 | $('.notifies').formset({ |
147 | 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 | 370 | $('#id_groups').multiSelect({ |
... | ... | @@ -224,11 +440,11 @@ |
224 | 440 | });// Used to create multi-select css style |
225 | 441 | |
226 | 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 | 450 | $('.collapse').on('hide.bs.collapse', function (e) { |
... | ... | @@ -238,4 +454,16 @@ |
238 | 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 | 469 | </script> |
242 | 470 | \ No newline at end of file | ... | ... |
webpage/views.py
... | ... | @@ -33,9 +33,58 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): |
33 | 33 | |
34 | 34 | form_class = self.get_form_class() |
35 | 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 | 89 | def get_context_data(self, **kwargs): |
41 | 90 | context = super(CreateView, self).get_context_data(**kwargs) |
... | ... | @@ -51,6 +100,6 @@ class CreateView(LoginRequiredMixin, generic.edit.CreateView): |
51 | 100 | return context |
52 | 101 | |
53 | 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 | 105 | return reverse_lazy('subjects:view', kwargs = {'slug': self.object.topic.subject.slug}) |
57 | 106 | \ No newline at end of file | ... | ... |