Commit 33bc83ff57988277dd90985363d2ae4bd8ea0b39

Authored by Zambom
1 parent e4d5cc5f

Adding webpage creation

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
... ...
webpage/migrations/0002_auto_20170120_1944.py 0 → 100644
... ... @@ -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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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">&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 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
... ...