Commit c53a1c371747cd7a218d4ce2a085e95d45046aa6
1 parent
85a887fd
Exists in
master
and in
5 other branches
Procedimento de criar curso #49
Showing
4 changed files
with
86 additions
and
54 deletions
Show diff stats
courses/forms.py
1 | 1 | from django import forms |
2 | 2 | from django.utils.translation import ugettext_lazy as _ |
3 | 3 | from .models import Category, Course, Subject, Topic |
4 | +import datetime | |
4 | 5 | |
5 | 6 | class CategoryForm(forms.ModelForm): |
6 | 7 | |
... | ... | @@ -16,6 +17,32 @@ class CategoryForm(forms.ModelForm): |
16 | 17 | |
17 | 18 | |
18 | 19 | class CourseForm(forms.ModelForm): |
20 | + def clean_end_register_date(self): | |
21 | + init_register_date = self.data['init_register_date'] | |
22 | + end_register_date = self.data['end_register_date'] | |
23 | + | |
24 | + if init_register_date and end_register_date and end_register_date < init_register_date: | |
25 | + raise forms.ValidationError(_('The end date may not be before the start date.')) | |
26 | + return end_register_date | |
27 | + | |
28 | + def clean_init_date(self): | |
29 | + # print(dir(self)) | |
30 | + print (self.data) | |
31 | + print (self.cleaned_data) | |
32 | + end_register_date = self.data['end_register_date'] | |
33 | + init_date = self.data['init_date'] | |
34 | + | |
35 | + if end_register_date and init_date and init_date <= end_register_date: | |
36 | + raise forms.ValidationError(_('The course start date must be after the end of registration.')) | |
37 | + return init_date | |
38 | + | |
39 | + def clean_end_date(self): | |
40 | + init_date = self.data['init_date'] | |
41 | + end_date = self.data['end_date'] | |
42 | + | |
43 | + if init_date and end_date and end_date < init_date: | |
44 | + raise forms.ValidationError(_('The end date may not be before the start date.')) | |
45 | + return end_date | |
19 | 46 | |
20 | 47 | class Meta: |
21 | 48 | model = Course |
... | ... | @@ -47,6 +74,8 @@ class CourseForm(forms.ModelForm): |
47 | 74 | } |
48 | 75 | widgets = { |
49 | 76 | 'categoy': forms.Select(), |
77 | + 'objectivies': forms.Textarea(attrs={'cols': 80, 'rows': 5}), | |
78 | + 'content': forms.Textarea(attrs={'cols': 80, 'rows': 5}), | |
50 | 79 | } |
51 | 80 | |
52 | 81 | class SubjectForm(forms.ModelForm): | ... | ... |
courses/templates/course/create.html
1 | -{% extends 'app/base.html' %} | |
1 | +{% extends 'course/view.html' %} | |
2 | 2 | |
3 | 3 | {% load static i18n %} |
4 | 4 | {% load widget_tweaks %} |
... | ... | @@ -10,45 +10,56 @@ |
10 | 10 | </ol> |
11 | 11 | {% endblock %} |
12 | 12 | |
13 | -{% block sidebar %} | |
14 | - <div class="list-group"> | |
15 | - <a href="{% url 'course:manage' %}" class="list-group-item"> | |
16 | - {% trans 'Courses' %} | |
17 | - </a> | |
18 | - </div> | |
19 | -{% endblock %} | |
20 | - | |
21 | 13 | {% block content %} |
22 | - <div class="alert alert-info alert-dismissible" role="alert"> | |
23 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
24 | - <span aria-hidden="true">×</span> | |
25 | - </button> | |
26 | - <p>{% trans 'All fields are required' %}</p> | |
27 | - </div> | |
28 | 14 | |
29 | - <form method="post" action="" enctype="multipart/form-data"> | |
30 | - {% csrf_token %} | |
31 | - {% for field in form %} | |
32 | - <div class="form-group{% if form.has_error %} has-error {% endif %}"> | |
33 | - <label for="{{ field.auto_id }}">{{ field.label }}</label> | |
34 | - {% render_field field class='form-control input-sm' %} | |
35 | - <span id="helpBlock" class="help-block">{{ field.help_text }}</span> | |
36 | - {% if field.errors.length > 0 %} | |
37 | - <div class="alert alert-danger alert-dismissible" role="alert"> | |
38 | - <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
39 | - <span aria-hidden="true">×</span> | |
40 | - </button> | |
41 | - <ul> | |
42 | - {% for error in field.errors %} | |
43 | - <li>{{ error }}</li> | |
44 | - {% endfor %} | |
45 | - </ul> | |
46 | - </div> | |
47 | - </div> | |
48 | - {% endif %} | |
49 | - </div> | |
50 | - {% endfor %} | |
51 | - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" /> | |
52 | - </form> | |
53 | - <br clear="all" /> | |
15 | +</br> | |
16 | +<div class="card card-content"> | |
17 | + <div class="card-body"> | |
18 | + <form method="post" action="" enctype="multipart/form-data"> | |
19 | + {% csrf_token %} | |
20 | + {% for field in form %} | |
21 | + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> | |
22 | + <label for="{{ field.auto_id }}">{{ field.label }}</label> | |
23 | + {% if field.auto_id == 'id_init_register_date' or field.auto_id == 'id_end_register_date' or field.auto_id == 'id_init_date' or field.auto_id == 'id_end_date'%} | |
24 | + {% render_field field class='form-control' type='date' %} | |
25 | + {% elif field.auto_id == 'id_image' %} | |
26 | + {% render_field field class='form-control' %} | |
27 | + <div class="input-group"> | |
28 | + <input type="text" readonly="" class="form-control" placeholder="Choose your photo..."/> | |
29 | + <span class="input-group-btn input-group-sm"> | |
30 | + <button type="button" class="btn btn-fab btn-fab-mini"> | |
31 | + <i class="material-icons">attach_file</i> | |
32 | + </button> | |
33 | + </span> | |
34 | + </div> | |
35 | + {% else %} | |
36 | + {% render_field field class='form-control' %} | |
37 | + {% endif %} | |
38 | + <span class="help-block">{{ field.help_text }}</span> | |
39 | + {% if field.errors %} | |
40 | + <div class="row"> | |
41 | + </br> | |
42 | + <div class="alert alert-danger alert-dismissible" role="alert"> | |
43 | + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> | |
44 | + <span aria-hidden="true">×</span> | |
45 | + </button> | |
46 | + <ul> | |
47 | + {% for error in field.errors %} | |
48 | + <li>{{ error }}</li> | |
49 | + {% endfor %} | |
50 | + </ul> | |
51 | + </div> | |
52 | + </div> | |
53 | + {% endif %} | |
54 | + </div> | |
55 | + {% endfor %} | |
56 | + <div class="row text-center"> | |
57 | + <input type="submit" value="{% trans 'Create' %}" class="btn btn-primary" /> | |
58 | + </div> | |
59 | + </form> | |
60 | + </div> | |
61 | +</div> | |
62 | +</br> | |
63 | +</br> | |
64 | +</br> | |
54 | 65 | {% endblock %} | ... | ... |
courses/urls.py
... | ... | @@ -4,7 +4,7 @@ from . import views |
4 | 4 | |
5 | 5 | urlpatterns = [ |
6 | 6 | url(r'^$', views.IndexView.as_view(), name='manage'), |
7 | - url(r'^create/$', views.CreateView.as_view(), name='create'), | |
7 | + url(r'^create/$', views.CreateCourseView.as_view(), name='create'), | |
8 | 8 | url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name='update'), |
9 | 9 | url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'), |
10 | 10 | url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name='delete'), | ... | ... |
courses/views.py
... | ... | @@ -32,7 +32,7 @@ class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): |
32 | 32 | |
33 | 33 | return context |
34 | 34 | |
35 | -class CreateView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView): | |
35 | +class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edit.CreateView): | |
36 | 36 | |
37 | 37 | allowed_roles = ['professor', 'system_admin'] |
38 | 38 | login_url = reverse_lazy("core:home") |
... | ... | @@ -41,17 +41,9 @@ class CreateView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,generic.edi |
41 | 41 | form_class = CourseForm |
42 | 42 | success_url = reverse_lazy('course:manage') |
43 | 43 | def form_valid(self, form): |
44 | - self.object = form.save(commit = False) | |
45 | - self.object.slug = slugify(self.object.name) | |
46 | - print('Fooooiiii!!') | |
47 | - self.object.save() | |
48 | - | |
49 | - return super(CreateView, self).form_valid(form) | |
50 | - | |
51 | - def render_to_response(self, context, **response_kwargs): | |
52 | - messages.success(self.request, _('Course created successfully!')) | |
53 | - | |
54 | - return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine) | |
44 | + self.object = form.save() | |
45 | + self.object.professors.add(self.request.user) | |
46 | + return super(CreateCourseView, self).form_valid(form) | |
55 | 47 | |
56 | 48 | class UpdateView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): |
57 | 49 | |
... | ... | @@ -87,7 +79,7 @@ class CourseView(LoginRequiredMixin, NotificationMixin, generic.DetailView): |
87 | 79 | context = super(CourseView, self).get_context_data(**kwargs) |
88 | 80 | course = get_object_or_404(Course, slug = self.kwargs.get('slug')) |
89 | 81 | if has_role(self.request.user,'system_admin'): |
90 | - subjects = Subject.objects.all() | |
82 | + subjects = course.subjects.all() | |
91 | 83 | elif has_role(self.request.user,'professor'): |
92 | 84 | subjects = course.subjects.filter(professors__in=[self.request.user]) |
93 | 85 | elif has_role(self.request.user, 'student'): | ... | ... |