Commit efc480e12d8626f13b02413c7aeb2b77e53acf0d

Authored by Jailson Dias
1 parent 3894ffb6

Criado as páginas de atualizar e deletar curso

courses/forms.py
  1 +
1 from django import forms 2 from django import forms
2 from django.utils.translation import ugettext_lazy as _ 3 from django.utils.translation import ugettext_lazy as _
3 from .models import Category, Course, Subject, Topic 4 from .models import Category, Course, Subject, Topic
4 -import datetime  
5 5
6 class CategoryForm(forms.ModelForm): 6 class CategoryForm(forms.ModelForm):
7 7
@@ -26,9 +26,6 @@ class CourseForm(forms.ModelForm): @@ -26,9 +26,6 @@ class CourseForm(forms.ModelForm):
26 return end_register_date 26 return end_register_date
27 27
28 def clean_init_date(self): 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'] 29 end_register_date = self.data['end_register_date']
33 init_date = self.data['init_date'] 30 init_date = self.data['init_date']
34 31
@@ -78,6 +75,47 @@ class CourseForm(forms.ModelForm): @@ -78,6 +75,47 @@ class CourseForm(forms.ModelForm):
78 'content': forms.Textarea(attrs={'cols': 80, 'rows': 5}), 75 'content': forms.Textarea(attrs={'cols': 80, 'rows': 5}),
79 } 76 }
80 77
  78 +class UpdateCourseForm(CourseForm):
  79 + def __init__(self, *args, **kwargs):
  80 + super(UpdateCourseForm, self).__init__(*args, **kwargs)
  81 + self.fields["students"].required = False
  82 +
  83 + class Meta:
  84 + model = Course
  85 + fields = ('name', 'objectivies', 'content', 'max_students', 'init_register_date', 'end_register_date',
  86 + 'init_date', 'end_date', 'image', 'category','students',)
  87 + labels = {
  88 + 'name': _('Name'),
  89 + 'objectivies': _('Objectives'),
  90 + 'content': _('Content'),
  91 + 'max_students': _('Number of studets maximum'),
  92 + 'init_register_date': _('Course registration start date'),
  93 + 'end_register_date': _('Course registration end date'),
  94 + 'init_date': _('Course start date'),
  95 + 'end_date': _('Course end date'),
  96 + 'image': _('Image'),
  97 + 'category': _('Category'),
  98 + 'students': _('Student'),
  99 + }
  100 + help_texts = {
  101 + 'name': _('Course name'),
  102 + 'objectivies': _('Course objective'),
  103 + 'content': _('Course modules'),
  104 + 'max_students': _('Max number of students that a class can have'),
  105 + 'init_register_date': _('Date that starts the registration period of the course (dd/mm/yyyy)'),
  106 + 'end_register_date': _('Date that ends the registration period of the course (dd/mm/yyyy)'),
  107 + 'init_date': _('Date that the course starts (dd/mm/yyyy)'),
  108 + 'end_date': _('Date that the course ends (dd/mm/yyyy)'),
  109 + 'image': _('Representative image of the course'),
  110 + 'category': _('Category which the course belongs'),
  111 + 'students': _("Course's Students"),
  112 + }
  113 + widgets = {
  114 + 'categoy': forms.Select(),
  115 + 'objectivies': forms.Textarea(attrs={'cols': 80, 'rows': 5}),
  116 + 'content': forms.Textarea(attrs={'cols': 80, 'rows': 5}),
  117 + }
  118 +
81 class SubjectForm(forms.ModelForm): 119 class SubjectForm(forms.ModelForm):
82 120
83 class Meta: 121 class Meta:
courses/permissions.py
@@ -30,3 +30,23 @@ def delete_subject(role, user, subject): @@ -30,3 +30,23 @@ def delete_subject(role, user, subject):
30 return True 30 return True
31 31
32 return False 32 return False
  33 +
  34 +@register_object_checker()
  35 +def update_course(role, user, course):
  36 + if (role == SystemAdmin):
  37 + return True
  38 +
  39 + if (user in course.professors.all()):
  40 + return True
  41 +
  42 + return False
  43 +
  44 +@register_object_checker()
  45 +def delete_course(role, user, course):
  46 + if (role == SystemAdmin):
  47 + return True
  48 +
  49 + if (user in course.professors.all()):
  50 + return True
  51 +
  52 + return False
courses/templates/course/create.html
@@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
21 <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput"> 21 <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
22 <label for="{{ field.auto_id }}">{{ field.label }}</label> 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'%} 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' %} 24 + <input type="date" class="form-control"name="{{field.name}}" value="{% if field.value.year %}{{field.value|date:'Y-m-d'}}{% else %}{{field.value}}{% endif %}" min="{{now|date:'Y-m-d'}}">
25 {% elif field.auto_id == 'id_image' %} 25 {% elif field.auto_id == 'id_image' %}
26 {% render_field field class='form-control' %} 26 {% render_field field class='form-control' %}
27 <div class="input-group"> 27 <div class="input-group">
courses/templates/course/delete.html
1 -{% extends 'app/base.html' %} 1 +{% extends 'course/view.html' %}
2 2
3 {% load static i18n %} 3 {% load static i18n %}
4 4
@@ -9,23 +9,15 @@ @@ -9,23 +9,15 @@
9 </ol> 9 </ol>
10 {% endblock %} 10 {% endblock %}
11 11
12 -{% block sidebar %}  
13 - <div class="list-group">  
14 - <a href="{% url 'course:manage' %}" class="list-group-item">  
15 - {% trans 'Courses' %}  
16 - </a>  
17 - <a href="{% url 'course:create' %}" class="list-group-item">  
18 - {% trans 'Create Course' %}  
19 - </a>  
20 - </div>  
21 -  
22 -{% endblock %}  
23 -  
24 {% block content %} 12 {% block content %}
25 - <form action="" method="post">  
26 - {% csrf_token %}  
27 - <p>{% trans 'Are you sure you want to delete the couse' %} "{{ object }}"?</p>  
28 - <input type="submit" class="btn btn-success btn-sm" value="{% trans 'Yes' %}" />  
29 - <a href="{% url 'course:manage' %}" class="btn btn-danger btn-sm">{% trans 'No' %}</a>  
30 - </form> 13 +<div class="panel panel-default">
  14 + <div class="panel-body">
  15 + <form action="" method="post">
  16 + {% csrf_token %}
  17 + <h2>{% trans 'Are you sure you want to delete the course' %} "{{course}}"?</h2>
  18 + <input type="submit" class="btn btn-raised btn-success btn-lg" value="{% trans 'Yes' %}" />
  19 + <a href="{% url 'course:view' course.slug%}" class="btn btn-raised btn-danger btn-lg">{% trans 'No' %}</a>
  20 + </form>
  21 + </div>
  22 +</div>
31 {% endblock %} 23 {% endblock %}
courses/templates/course/index.html
@@ -54,7 +54,11 @@ @@ -54,7 +54,11 @@
54 {% for course in courses %} 54 {% for course in courses %}
55 <div class="row well well-inverse"> 55 <div class="row well well-inverse">
56 <div class="col-md-2"> 56 <div class="col-md-2">
  57 + {% if course.image %}
57 <img src="{{ course.image.url }}" class="img-responsive" /> 58 <img src="{{ course.image.url }}" class="img-responsive" />
  59 + {% else %}
  60 + <img src="" class="img-responsive" />
  61 + {% endif %}
58 </div> 62 </div>
59 <div class="col-md-10"> 63 <div class="col-md-10">
60 <div class="row"> 64 <div class="row">
courses/templates/course/update.html
1 -{% extends 'app/base.html' %} 1 +{% extends 'course/view.html' %}
2 2
3 {% load static i18n %} 3 {% load static i18n %}
4 {% load widget_tweaks %} 4 {% load widget_tweaks %}
5 5
6 {% block breadcrumbs %} 6 {% block breadcrumbs %}
7 <ol class="breadcrumb"> 7 <ol class="breadcrumb">
8 - <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>  
9 - <li class="active">{% trans 'Edit Course' %}</li> 8 + <li><a href="{% url 'app:index' %}">{% trans 'Home' %}</a></li>
  9 + <li class="active">{% trans 'Edit Course' %}</li>
10 </ol> 10 </ol>
11 {% endblock %} 11 {% endblock %}
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 - <a href="{% url 'course:manage_mods' course.slug %}" class="list-group-item">  
19 - {% trans 'Manage Modules' %}  
20 - </a>  
21 - <a href="#" class="list-group-item">  
22 - {% trans 'Participants' %}  
23 - </a>  
24 - </div>  
25 -{% endblock %}  
26 -  
27 {% block content %} 12 {% block content %}
28 - <div class="alert alert-info alert-dismissible" role="alert">  
29 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
30 - <span aria-hidden="true">&times;</span>  
31 - </button>  
32 - <p>{% trans 'All fields are required' %}</p>  
33 - </div>  
34 13
35 - <form method="post" action="" enctype="multipart/form-data">  
36 - {% csrf_token %}  
37 - {% for field in form %}  
38 - <div class="form-group{% if form.has_error %} has-error {% endif %}">  
39 - <label for="{{ field.auto_id }}">{{ field.label }}</label>  
40 - {% render_field field class='form-control input-sm' %}  
41 - <span id="helpBlock" class="help-block">{{ field.help_text }}</span>  
42 - {% if field.errors.length > 0 %}  
43 - <div class="alert alert-danger alert-dismissible" role="alert">  
44 - <button type="button" class="close" data-dismiss="alert" aria-label="Close">  
45 - <span aria-hidden="true">&times;</span>  
46 - </button>  
47 - <ul>  
48 - {% for error in field.errors %}  
49 - <li>{{ error }}</li>  
50 - {% endfor %}  
51 - </ul> 14 +</br>
  15 +<div class="card card-content">
  16 + <div class="card-body">
  17 + <form method="post" action="" enctype="multipart/form-data">
  18 + {% csrf_token %}
  19 + {% for field in form %}
  20 + <div class="form-group {% if form.has_error %} has-error {% endif %} is-fileinput">
  21 + <label for="{{ field.auto_id }}">{{ field.label }}</label>
  22 + {% 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'%}
  23 + <input type="date" class="form-control"name="{{field.name}}" value="{% if field.value.year %}{{field.value|date:'Y-m-d'}}{% else %}{{field.value}}{% endif %}" min="{{now|date:'Y-m-d'}}">
  24 + {% elif field.auto_id == 'id_image' %}
  25 + {% render_field field class='form-control' %}
  26 + <div class="input-group">
  27 + <input type="text" readonly="" class="form-control" placeholder="Choose your photo..."/>
  28 + <span class="input-group-btn input-group-sm">
  29 + <button type="button" class="btn btn-fab btn-fab-mini">
  30 + <i class="material-icons">attach_file</i>
  31 + </button>
  32 + </span>
  33 + </div>
  34 + {% else %}
  35 + {% render_field field class='form-control' %}
  36 + {% endif %}
  37 + <span class="help-block">{{ field.help_text }}</span>
  38 + {% if field.errors %}
  39 + <div class="row">
  40 + </br>
  41 + <div class="alert alert-danger alert-dismissible" role="alert">
  42 + <button type="button" class="close" data-dismiss="alert" aria-label="Close">
  43 + <span aria-hidden="true">&times;</span>
  44 + </button>
  45 + <ul>
  46 + {% for error in field.errors %}
  47 + <li>{{ error }}</li>
  48 + {% endfor %}
  49 + </ul>
  50 + </div>
52 </div> 51 </div>
  52 + {% endif %}
53 </div> 53 </div>
54 - {% endif %} 54 + {% endfor %}
  55 + <div class="row text-center">
  56 + <input type="submit" value="{% trans 'Update' %}" class="btn btn-primary" />
55 </div> 57 </div>
56 - {% endfor %}  
57 - <input type="submit" value="{% trans 'Save' %}" class="btn btn-sm btn-success" />  
58 - </form>  
59 - <br clear="all" /> 58 + </form>
  59 + </div>
  60 +</div>
  61 +</br>
  62 +</br>
  63 +</br>
60 {% endblock %} 64 {% endblock %}
courses/templates/subject/delete.html
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
8 <div class="panel-body"> 8 <div class="panel-body">
9 <form action="" method="post"> 9 <form action="" method="post">
10 {% csrf_token %} 10 {% csrf_token %}
11 - <h2>{% trans 'Are you sure you want to delete the category' %} "{{subject}}"?</h2> 11 + <h2>{% trans 'Are you sure you want to delete the subject' %} "{{subject}}"?</h2>
12 <input type="submit" class="btn btn-raised btn-success btn-lg" value="{% trans 'Yes' %}" /> 12 <input type="submit" class="btn btn-raised btn-success btn-lg" value="{% trans 'Yes' %}" />
13 <a href="{% url 'course:view_subject' subject.slug%}" class="btn btn-raised btn-danger btn-lg">{% trans 'No' %}</a> 13 <a href="{% url 'course:view_subject' subject.slug%}" class="btn btn-raised btn-danger btn-lg">{% trans 'No' %}</a>
14 </form> 14 </form>
courses/urls.py
@@ -5,9 +5,9 @@ from . import views @@ -5,9 +5,9 @@ from . import views
5 urlpatterns = [ 5 urlpatterns = [
6 url(r'^$', views.IndexView.as_view(), name='manage'), 6 url(r'^$', views.IndexView.as_view(), name='manage'),
7 url(r'^create/$', views.CreateCourseView.as_view(), name='create'), 7 url(r'^create/$', views.CreateCourseView.as_view(), name='create'),
8 - url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateView.as_view(), name='update'), 8 + url(r'^edit/(?P<slug>[\w_-]+)/$', views.UpdateCourseView.as_view(), name='update'),
9 url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'), 9 url(r'^(?P<slug>[\w_-]+)/$', views.CourseView.as_view(), name='view'),
10 - url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteView.as_view(), name='delete'), 10 + url(r'^delete/(?P<slug>[\w_-]+)/$', views.DeleteCourseView.as_view(), name='delete'),
11 url(r'^category/(?P<slug>[\w_-]+)/$', views.FilteredView.as_view(), name='filter'), 11 url(r'^category/(?P<slug>[\w_-]+)/$', views.FilteredView.as_view(), name='filter'),
12 url(r'^categories/$', views.IndexCatView.as_view(), name='manage_cat'), 12 url(r'^categories/$', views.IndexCatView.as_view(), name='manage_cat'),
13 url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"), 13 url(r'^categories/create/$', views.CreateCatView.as_view(), name="create_cat"),
courses/views.py
@@ -12,10 +12,11 @@ from rolepermissions.verifications import has_role @@ -12,10 +12,11 @@ from rolepermissions.verifications import has_role
12 from django.db.models import Q 12 from django.db.models import Q
13 from rolepermissions.verifications import has_object_permission 13 from rolepermissions.verifications import has_object_permission
14 14
15 -from .forms import CourseForm, CategoryForm, SubjectForm,TopicForm 15 +from .forms import CourseForm, UpdateCourseForm, CategoryForm, SubjectForm,TopicForm
16 from .models import Course, Subject, Category,Topic 16 from .models import Course, Subject, Category,Topic
17 from core.mixins import NotificationMixin 17 from core.mixins import NotificationMixin
18 18
  19 +from datetime import date
19 20
20 class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView): 21 class IndexView(LoginRequiredMixin, NotificationMixin, generic.ListView):
21 22
@@ -40,32 +41,86 @@ class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,gener @@ -40,32 +41,86 @@ class CreateCourseView(LoginRequiredMixin, HasRoleMixin, NotificationMixin,gener
40 template_name = 'course/create.html' 41 template_name = 'course/create.html'
41 form_class = CourseForm 42 form_class = CourseForm
42 success_url = reverse_lazy('course:manage') 43 success_url = reverse_lazy('course:manage')
  44 +
43 def form_valid(self, form): 45 def form_valid(self, form):
44 self.object = form.save() 46 self.object = form.save()
45 self.object.professors.add(self.request.user) 47 self.object.professors.add(self.request.user)
46 return super(CreateCourseView, self).form_valid(form) 48 return super(CreateCourseView, self).form_valid(form)
47 49
48 -class UpdateView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView): 50 + def get_context_data(self, **kwargs):
  51 + context = super(CreateCourseView, self).get_context_data(**kwargs)
  52 +
  53 + if has_role(self.request.user,'system_admin'):
  54 + courses = Course.objects.all()
  55 + elif has_role(self.request.user,'professor'):
  56 + courses = self.request.user.courses.all()
  57 + context['courses'] = courses
  58 + context['title'] = _("Create Course")
  59 + context['now'] = date.today()
  60 + return context
  61 +
  62 +class UpdateCourseView(LoginRequiredMixin, HasRoleMixin, generic.UpdateView):
49 63
50 allowed_roles = ['professor', 'system_admin'] 64 allowed_roles = ['professor', 'system_admin']
51 login_url = reverse_lazy("core:home") 65 login_url = reverse_lazy("core:home")
52 redirect_field_name = 'next' 66 redirect_field_name = 'next'
53 template_name = 'course/update.html' 67 template_name = 'course/update.html'
54 model = Course 68 model = Course
55 - form_class = CourseForm 69 + form_class = UpdateCourseForm
  70 +
  71 + def dispatch(self, *args, **kwargs):
  72 + course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
  73 + if(not has_object_permission('update_course', self.request.user, course)):
  74 + return self.handle_no_permission()
  75 + return super(UpdateCourseView, self).dispatch(*args, **kwargs)
  76 +
  77 + def get_context_data(self, **kwargs):
  78 + context = super(UpdateCourseView, self).get_context_data(**kwargs)
  79 + course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
  80 +
  81 + if has_role(self.request.user,'system_admin'):
  82 + courses = Course.objects.all()
  83 + elif has_role(self.request.user,'professor'):
  84 + courses = self.request.user.courses.all()
  85 + context['courses'] = courses
  86 + context['title'] = course.name
  87 + context['now'] = date.today()
  88 + return context
  89 +
  90 + def get_success_url(self):
  91 + return reverse_lazy('course:view', kwargs={'slug' : self.object.slug})
  92 +
  93 +
  94 +
  95 +class DeleteCourseView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
  96 +
  97 + allowed_roles = ['professor', 'system_admin']
  98 + login_url = reverse_lazy("core:home")
  99 + redirect_field_name = 'next'
  100 + model = Course
  101 + template_name = 'course/delete.html'
56 success_url = reverse_lazy('course:manage') 102 success_url = reverse_lazy('course:manage')
57 103
58 - def form_valid(self, form):  
59 - self.object = form.save(commit = False)  
60 - self.object.slug = slugify(self.object.name)  
61 - self.object.save() 104 + def dispatch(self, *args, **kwargs):
  105 + course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
  106 + if(not has_object_permission('delete_course', self.request.user, course)):
  107 + return self.handle_no_permission()
  108 + return super(DeleteCourseView, self).dispatch(*args, **kwargs)
62 109
63 - return super(UpdateView, self).form_valid(form) 110 + def get_context_data(self, **kwargs):
  111 + context = super(DeleteCourseView, self).get_context_data(**kwargs)
  112 + course = get_object_or_404(Course, slug = self.kwargs.get('slug'))
64 113
65 - def render_to_response(self, context, **response_kwargs):  
66 - messages.success(self.request, _('Course edited successfully!')) 114 + if has_role(self.request.user,'system_admin'):
  115 + courses = Course.objects.all()
  116 + elif has_role(self.request.user,'professor'):
  117 + courses = self.request.user.courses.all()
  118 + context['courses'] = courses
  119 + print (courses,"jdhksjbjs")
  120 + context['title'] = course.name
  121 +
  122 + return context
67 123
68 - return self.response_class(request=self.request, template=self.get_template_names(), context=context, using=self.template_engine)  
69 124
70 class CourseView(LoginRequiredMixin, NotificationMixin, generic.DetailView): 125 class CourseView(LoginRequiredMixin, NotificationMixin, generic.DetailView):
71 126
@@ -375,4 +430,4 @@ class DeleteSubjectView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): @@ -375,4 +430,4 @@ class DeleteSubjectView(LoginRequiredMixin, HasRoleMixin, generic.DeleteView):
375 return context 430 return context
376 431
377 def get_success_url(self): 432 def get_success_url(self):
378 - return reverse_lazy('course:view_subject', kwargs={'slug' : self.object.course.subjects.all()[0].slug}) 433 + return reverse_lazy('course:view', kwargs={'slug' : self.object.course.slug})