Commit 8238dbcf4e4e5035f131781f08684414b132968a
Exists in
master
and in
5 other branches
Merge branch 'dev' of https://github.com/amadeusproject/amadeuslms into dev
Showing
12 changed files
with
273 additions
and
100 deletions
Show diff stats
amadeus/settings.py
core/templates/registration/passwor_reset_complete.html
| @@ -22,9 +22,7 @@ | @@ -22,9 +22,7 @@ | ||
| 22 | <form class="form-group " method="post" action=""> | 22 | <form class="form-group " method="post" action=""> |
| 23 | {% csrf_token %} | 23 | {% csrf_token %} |
| 24 | <div class="form-group is-empty"> | 24 | <div class="form-group is-empty"> |
| 25 | - <p> | ||
| 26 | - Sua senha foi definida. Você pode ir em frente e entrar agora. | ||
| 27 | - </p> | 25 | + <p>{% trans "Your password has been set. You can go ahead and go now." %}</p> |
| 28 | </div> | 26 | </div> |
| 29 | </form> | 27 | </form> |
| 30 | </div> | 28 | </div> |
core/templates/registration/passwor_reset_done.html
| @@ -22,14 +22,8 @@ | @@ -22,14 +22,8 @@ | ||
| 22 | <form class="form-group " method="post" action=""> | 22 | <form class="form-group " method="post" action=""> |
| 23 | {% csrf_token %} | 23 | {% csrf_token %} |
| 24 | <div class="form-group is-empty"> | 24 | <div class="form-group is-empty"> |
| 25 | - <p> | ||
| 26 | - Temos enviado instruções para configurar sua senha, se uma conta existe com o e-mail inserido. | ||
| 27 | - Você deve recebê-los em breve. | ||
| 28 | - </p> | ||
| 29 | - <p> | ||
| 30 | - Se você não receber um e-mail, por favor, certifique-se de que introduziu o endereço que você registrou, | ||
| 31 | - e verifique a pasta de spam. | ||
| 32 | - </p> | 25 | + <p>{% trans "We have sent instructions to set up your password, if an account exists with the email entered. You should receive them soon." %}</p> |
| 26 | + <p>{% trans "If you do not receive an email, please make sure you entered the address you registered, and check the spam folder." %}</p> | ||
| 33 | </div> | 27 | </div> |
| 34 | </form> | 28 | </form> |
| 35 | </div> | 29 | </div> |
courses/urls.py
| @@ -27,7 +27,7 @@ urlpatterns = [ | @@ -27,7 +27,7 @@ urlpatterns = [ | ||
| 27 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), | 27 | url(r'^subjects/categories$',views.IndexSubjectCategoryView.as_view(), name='subject_category_index'), |
| 28 | url(r'^forum/', include('forum.urls', namespace = 'forum')), | 28 | url(r'^forum/', include('forum.urls', namespace = 'forum')), |
| 29 | url(r'^poll/', include('poll.urls', namespace = 'poll')), | 29 | url(r'^poll/', include('poll.urls', namespace = 'poll')), |
| 30 | - url(r'^exam/', include('exam.urls', namespace = 'exam')), | 30 | + # url(r'^exam/', include('exam.urls', namespace = 'exam')), |
| 31 | url(r'^files/', include('files.urls', namespace = 'file')), | 31 | url(r'^files/', include('files.urls', namespace = 'file')), |
| 32 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), | 32 | url(r'^upload-material/$', views.UploadMaterialView.as_view(), name='upload_material'), |
| 33 | url(r'^links/',include('links.urls',namespace = 'links')), | 33 | url(r'^links/',include('links.urls',namespace = 'links')), |
exam/admin.py
| 1 | from django.contrib import admin | 1 | from django.contrib import admin |
| 2 | 2 | ||
| 3 | -from .models import Exam, Answer | 3 | +from .models import Exam, Answer, AnswersStudent |
| 4 | 4 | ||
| 5 | class ExamAdmin(admin.ModelAdmin): | 5 | class ExamAdmin(admin.ModelAdmin): |
| 6 | list_display = ['name', 'slug','begin_date','limit_date'] | 6 | list_display = ['name', 'slug','begin_date','limit_date'] |
| @@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): | @@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): | ||
| 10 | list_display = ['answer','order'] | 10 | list_display = ['answer','order'] |
| 11 | search_fields = ['answer'] | 11 | search_fields = ['answer'] |
| 12 | 12 | ||
| 13 | +class AnswersStudentAdmin(admin.ModelAdmin): | ||
| 14 | + list_display = ['student','exam','answered_in'] | ||
| 15 | + search_fields = ['student','exam'] | ||
| 16 | + | ||
| 13 | admin.site.register(Exam, ExamAdmin) | 17 | admin.site.register(Exam, ExamAdmin) |
| 14 | admin.site.register(Answer, AnswerAdmin) | 18 | admin.site.register(Answer, AnswerAdmin) |
| 19 | +admin.site.register(AnswersStudent, AnswersStudentAdmin) |
exam/forms.py
| 1 | -from django.utils.translation import ugettext_lazy as _ | ||
| 2 | from django import forms | 1 | from django import forms |
| 2 | +from django.utils.translation import ugettext_lazy as _ | ||
| 3 | +from users.models import User | ||
| 3 | from .models import Exam | 4 | from .models import Exam |
| 4 | 5 | ||
| 5 | class ExamForm(forms.ModelForm): | 6 | class ExamForm(forms.ModelForm): |
| 6 | - def clean_end_date(self): | ||
| 7 | - begin_date = self.data['begin_date'] | ||
| 8 | - limit_date = self.data['limit_date'] | ||
| 9 | 7 | ||
| 10 | - if begin_date and limit_date and limit_date < begin_date: | ||
| 11 | - raise forms.ValidationError(_('The end date may not be before the start date.')) | ||
| 12 | - return endDate | 8 | + def __init__(self, *args, **kwargs): |
| 9 | + super(ExamForm, self).__init__(*args, **kwargs) | ||
| 10 | + self.fields["all_students"].required = False | ||
| 11 | + self.fields["all_students"].initial = False | ||
| 12 | + self.fields["students"].required = False | ||
| 13 | + | ||
| 14 | + def clean_all_students(self): | ||
| 15 | + if('all_students' not in self.data): | ||
| 16 | + if('students' in self.data): | ||
| 17 | + return False | ||
| 18 | + raise forms.ValidationError(_('It is required one these fields.')) | ||
| 19 | + else: | ||
| 20 | + all_students = self.data['all_students'] | ||
| 21 | + if(not all_students): | ||
| 22 | + raise forms.ValidationError(_('It is required one these fields.')) | ||
| 23 | + return True | ||
| 13 | 24 | ||
| 14 | 25 | ||
| 15 | - class Meta: | ||
| 16 | - model = Exam | ||
| 17 | - fields = ['name','begin_date','limit_date'] | 26 | + class Meta: |
| 27 | + model = Exam | ||
| 28 | + fields = ['name','begin_date','limit_date','students','all_students'] | ||
| 18 | 29 | ||
| 19 | - widgets = { | ||
| 20 | - 'name': forms.TextInput(attrs={'placeholder': 'Exam?'}), | ||
| 21 | - 'begin_date': forms.DateTimeInput(attrs={'placeholder': _('Start date to resolve the exam')}), | ||
| 22 | - 'limit_date': forms.DateTimeInput(attrs={'placeholder': _('Finish date permited to resolve the exam')}), | ||
| 23 | - } | 30 | + widgets = { |
| 31 | + 'name': forms.TextInput(attrs={'placeholder': 'Exam?'}), | ||
| 32 | + 'begin_date': forms.DateTimeInput( | ||
| 33 | + attrs={'placeholder': _('Start date to resolve the exam')}), | ||
| 34 | + 'limit_date': forms.DateTimeInput( | ||
| 35 | + attrs={'placeholder': _('Maximum date permited to resolve the exam')}), | ||
| 36 | + 'student': forms.Select(), | ||
| 37 | + } |
exam/models.py
| @@ -27,4 +27,18 @@ class Answer(models.Model): | @@ -27,4 +27,18 @@ class Answer(models.Model): | ||
| 27 | verbose_name_plural = _('Answers') | 27 | verbose_name_plural = _('Answers') |
| 28 | 28 | ||
| 29 | def __str__(self): | 29 | def __str__(self): |
| 30 | - return str(self.answer) + str("/") + str(self.poll) | 30 | + return str(self.answer) + str("/") + str(self.exam) |
| 31 | + | ||
| 32 | +class AnswersStudent(models.Model): | ||
| 33 | + status = models.BooleanField(_("Answered"), default=False) | ||
| 34 | + exam = models.ForeignKey(Exam, verbose_name = _('Exam'), related_name='answers_stundet') | ||
| 35 | + answer = models.ManyToManyField(Answer,verbose_name = _('Answers Students'), related_name='answers_stundet') | ||
| 36 | + student = models.ForeignKey(User, verbose_name = _('Student'), related_name='answers_stundent') | ||
| 37 | + answered_in = models.DateTimeField(_("Answered Date"),auto_now=True) | ||
| 38 | + | ||
| 39 | + class Meta: | ||
| 40 | + verbose_name = _('Answer Stundent') | ||
| 41 | + verbose_name_plural = _('Answers Student') | ||
| 42 | + | ||
| 43 | + def __str__(self): | ||
| 44 | + return str(self.student) + str("/") + str(self.exam) |
exam/permissions.py
| @@ -10,3 +10,13 @@ def edit_exam(role, user, exam): | @@ -10,3 +10,13 @@ def edit_exam(role, user, exam): | ||
| 10 | return True | 10 | return True |
| 11 | 11 | ||
| 12 | return False | 12 | return False |
| 13 | + | ||
| 14 | +@register_object_checker() | ||
| 15 | +def delete_exam(role, user, exam): | ||
| 16 | + if (role == SystemAdmin): | ||
| 17 | + return True | ||
| 18 | + | ||
| 19 | + if (user in exam.topic.subject.professors.all()): | ||
| 20 | + return True | ||
| 21 | + | ||
| 22 | + return False |
exam/urls.py
| 1 | -from django.conf.urls import url | ||
| 2 | - | ||
| 3 | -from . import views | ||
| 4 | - | ||
| 5 | -urlpatterns = [ | ||
| 6 | - url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), | ||
| 7 | - url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), | ||
| 8 | - url(r'^view/(?P<slug>[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), | ||
| 9 | - url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), | ||
| 10 | -] | 1 | +# from django.conf.urls import url |
| 2 | +# | ||
| 3 | +# from . import views | ||
| 4 | +# | ||
| 5 | +# urlpatterns = [ | ||
| 6 | +# url(r'^create/(?P<slug>[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), # exam slug | ||
| 7 | +# url(r'^update/(?P<slug>[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), # topic slug | ||
| 8 | +# url(r'^view/(?P<slug>[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), # exam slug | ||
| 9 | +# url(r'^delete/(?P<slug>[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), # exam | ||
| 10 | +# url(r'^answer/$', views.AnswerExam.as_view(), name='answer_exam'), # exam | ||
| 11 | +# url(r'^answer-exam/(?P<slug>[\w\-_]+)/$', views.AnswerStudentExam.as_view(), name='answer_student_exam'), # exam slug | ||
| 12 | +# ] |
exam/views.py
| @@ -12,7 +12,7 @@ from django.db.models import Q | @@ -12,7 +12,7 @@ from django.db.models import Q | ||
| 12 | # from django.views.generic.edit import FormMixin | 12 | # from django.views.generic.edit import FormMixin |
| 13 | 13 | ||
| 14 | from .forms import ExamForm | 14 | from .forms import ExamForm |
| 15 | -from .models import Exam, Answer | 15 | +from .models import Exam, Answer, AnswersStudent |
| 16 | from core.mixins import NotificationMixin | 16 | from core.mixins import NotificationMixin |
| 17 | from users.models import User | 17 | from users.models import User |
| 18 | from courses.models import Course, Topic | 18 | from courses.models import Course, Topic |
| @@ -26,50 +26,24 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): | @@ -26,50 +26,24 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): | ||
| 26 | def get_object(self, queryset=None): | 26 | def get_object(self, queryset=None): |
| 27 | return get_object_or_404(Exam, slug = self.kwargs.get('slug')) | 27 | return get_object_or_404(Exam, slug = self.kwargs.get('slug')) |
| 28 | 28 | ||
| 29 | - def form_invalid(self, form,**kwargs): | ||
| 30 | - context = super(ViewExam, self).form_invalid(form) | ||
| 31 | - answers = {} | ||
| 32 | - for key in self.request.POST: | ||
| 33 | - if(key != 'csrfmiddlewaretoken' and key != 'name' and key!= 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): | ||
| 34 | - answers[key] = self.request.POST[key] | ||
| 35 | - | ||
| 36 | - keys = sorted(answers) | ||
| 37 | - context.context_data['answers'] = answers | ||
| 38 | - context.context_data['keys'] = keys | ||
| 39 | - return context | ||
| 40 | - | ||
| 41 | - def form_valid(self, form): | ||
| 42 | - exam = self.object | ||
| 43 | - exam = form.save(commit = False) | ||
| 44 | - exam.answers.all().delete() | ||
| 45 | - exam.save() | ||
| 46 | - | ||
| 47 | - | ||
| 48 | - for key in self.request.POST: | ||
| 49 | - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): | ||
| 50 | - answer = Answer(answer=self.request.POST[key],order=key,exam=exam) | ||
| 51 | - answer.save() | ||
| 52 | - | ||
| 53 | - return super(ViewExam, self).form_valid(form) | ||
| 54 | - | ||
| 55 | def get_context_data(self, **kwargs): | 29 | def get_context_data(self, **kwargs): |
| 56 | context = super(ViewExam, self).get_context_data(**kwargs) | 30 | context = super(ViewExam, self).get_context_data(**kwargs) |
| 57 | exam = self.object | 31 | exam = self.object |
| 32 | + context["topic"] = exam.topic | ||
| 58 | context['course'] = exam.topic.subject.course | 33 | context['course'] = exam.topic.subject.course |
| 59 | context['subject'] = exam.topic.subject | 34 | context['subject'] = exam.topic.subject |
| 60 | context['subjects'] = exam.topic.subject.course.subjects.all() | 35 | context['subjects'] = exam.topic.subject.course.subjects.all() |
| 61 | 36 | ||
| 62 | - answers = {} | ||
| 63 | - for answer in exam.answers.all(): | ||
| 64 | - answers[answer.order] = answer.answer | ||
| 65 | - | ||
| 66 | - keys = sorted(answers) | ||
| 67 | - context['answers'] = answers | ||
| 68 | - context['keys'] = keys | ||
| 69 | - | 37 | + answered = AnswersStudent.objects.filter(exam = exam, student=self.request.user) |
| 38 | + print (answered) | ||
| 39 | + if answered.count()<1: | ||
| 40 | + context['status'] = False | ||
| 41 | + else: | ||
| 42 | + context['status'] = answered[0].status | ||
| 70 | return context | 43 | return context |
| 71 | 44 | ||
| 72 | 45 | ||
| 46 | + | ||
| 73 | class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | 47 | class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): |
| 74 | 48 | ||
| 75 | allowed_roles = ['professor', 'system_admin'] | 49 | allowed_roles = ['professor', 'system_admin'] |
| @@ -79,7 +53,6 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -79,7 +53,6 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
| 79 | form_class = ExamForm | 53 | form_class = ExamForm |
| 80 | context_object_name = 'exam' | 54 | context_object_name = 'exam' |
| 81 | template_name = 'exam/create.html' | 55 | template_name = 'exam/create.html' |
| 82 | - success_url = reverse_lazy('core:home') | ||
| 83 | 56 | ||
| 84 | def form_invalid(self, form,**kwargs): | 57 | def form_invalid(self, form,**kwargs): |
| 85 | context = super(CreateExam, self).form_invalid(form) | 58 | context = super(CreateExam, self).form_invalid(form) |
| @@ -91,6 +64,8 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -91,6 +64,8 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
| 91 | keys = sorted(answers) | 64 | keys = sorted(answers) |
| 92 | context.context_data['answers'] = answers | 65 | context.context_data['answers'] = answers |
| 93 | context.context_data['keys'] = keys | 66 | context.context_data['keys'] = keys |
| 67 | + context.context_data['form'] = form | ||
| 68 | + context.status_code = 400 | ||
| 94 | return context | 69 | return context |
| 95 | 70 | ||
| 96 | def form_valid(self, form): | 71 | def form_valid(self, form): |
| @@ -104,7 +79,7 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | @@ -104,7 +79,7 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): | ||
| 104 | answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) | 79 | answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) |
| 105 | answer.save() | 80 | answer.save() |
| 106 | 81 | ||
| 107 | - return super(CreatePoll, self).form_valid(form) | 82 | + return self.render_to_response(self.get_context_data(form = form), status = 200) |
| 108 | 83 | ||
| 109 | def get_context_data(self, **kwargs): | 84 | def get_context_data(self, **kwargs): |
| 110 | context = super(CreateExam, self).get_context_data(**kwargs) | 85 | context = super(CreateExam, self).get_context_data(**kwargs) |
| @@ -129,7 +104,7 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | @@ -129,7 +104,7 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | ||
| 129 | exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) | 104 | exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) |
| 130 | if(not has_object_permission('edit_exam', self.request.user, exam)): | 105 | if(not has_object_permission('edit_exam', self.request.user, exam)): |
| 131 | return self.handle_no_permission() | 106 | return self.handle_no_permission() |
| 132 | - return super(UpdatePoll, self).dispatch(*args, **kwargs) | 107 | + return super(UpdateExam, self).dispatch(*args, **kwargs) |
| 133 | 108 | ||
| 134 | def get_object(self, queryset=None): | 109 | def get_object(self, queryset=None): |
| 135 | return get_object_or_404(Exam, slug = self.kwargs.get('slug')) | 110 | return get_object_or_404(Exam, slug = self.kwargs.get('slug')) |
| @@ -144,6 +119,8 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | @@ -144,6 +119,8 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): | ||
| 144 | keys = sorted(answers) | 119 | keys = sorted(answers) |
| 145 | context.context_data['answers'] = answers | 120 | context.context_data['answers'] = answers |
| 146 | context.context_data['keys'] = keys | 121 | context.context_data['keys'] = keys |
| 122 | + context.context_data['form'] = form | ||
| 123 | + context.status_code = 400 | ||
| 147 | return context | 124 | return context |
| 148 | 125 | ||
| 149 | def form_valid(self, form): | 126 | def form_valid(self, form): |
| @@ -204,3 +181,49 @@ class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | @@ -204,3 +181,49 @@ class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): | ||
| 204 | 181 | ||
| 205 | def get_success_url(self): | 182 | def get_success_url(self): |
| 206 | return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) | 183 | return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) |
| 184 | + | ||
| 185 | +class AnswerExam(generic.TemplateView): | ||
| 186 | + template_name = 'exam/answer.html' | ||
| 187 | + | ||
| 188 | +class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): | ||
| 189 | + | ||
| 190 | + model = AnswersStudent | ||
| 191 | + fields = ['status'] | ||
| 192 | + context_object_name = 'answer' | ||
| 193 | + template_name = 'exam/answer_student.html' | ||
| 194 | + | ||
| 195 | + def form_valid(self, form): | ||
| 196 | + exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) | ||
| 197 | + answers = AnswersStudent( | ||
| 198 | + status = True, | ||
| 199 | + exam = exam, | ||
| 200 | + student = self.request.user, | ||
| 201 | + ) | ||
| 202 | + answers.save() | ||
| 203 | + | ||
| 204 | + for key in self.request.POST: | ||
| 205 | + if(key != 'csrfmiddlewaretoken'): | ||
| 206 | + answers.answer.add(exam.answers.all().filter(order=key)[0]) | ||
| 207 | + | ||
| 208 | + return self.render_to_response(self.get_context_data(form = form), status = 200) | ||
| 209 | + | ||
| 210 | + def get_context_data(self, **kwargs): | ||
| 211 | + context = super(AnswerStudentExam, self).get_context_data(**kwargs) | ||
| 212 | + print (self.kwargs.get('slug')) | ||
| 213 | + exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) | ||
| 214 | + context['exam'] = exam | ||
| 215 | + context['topic'] = exam.topic | ||
| 216 | + context['course'] = exam.topic.subject.course | ||
| 217 | + context['subject'] = exam.topic.subject | ||
| 218 | + context['subjects'] = exam.topic.subject.course.subjects.all() | ||
| 219 | + | ||
| 220 | + print (self.request.method) | ||
| 221 | + answers = {} | ||
| 222 | + for answer in exam.answers.all(): | ||
| 223 | + answers[answer.order] = answer.answer | ||
| 224 | + | ||
| 225 | + keys = sorted(answers) | ||
| 226 | + context['answers'] = answers | ||
| 227 | + context['keys'] = keys | ||
| 228 | + | ||
| 229 | + return context |
forum/tests/test_view_forum.py
| @@ -10,7 +10,6 @@ from forum.models import Forum, Post, PostAnswer | @@ -10,7 +10,6 @@ from forum.models import Forum, Post, PostAnswer | ||
| 10 | class ForumViewTestCase (TestCase): | 10 | class ForumViewTestCase (TestCase): |
| 11 | 11 | ||
| 12 | def setUp(self): | 12 | def setUp(self): |
| 13 | - self.client = Client() | ||
| 14 | 13 | ||
| 15 | self.user = User.objects.create_user( | 14 | self.user = User.objects.create_user( |
| 16 | username = 'test', | 15 | username = 'test', |
| @@ -21,6 +20,26 @@ class ForumViewTestCase (TestCase): | @@ -21,6 +20,26 @@ class ForumViewTestCase (TestCase): | ||
| 21 | ) | 20 | ) |
| 22 | assign_role(self.user, 'system_admin') | 21 | assign_role(self.user, 'system_admin') |
| 23 | 22 | ||
| 23 | + self.user_professor = User.objects.create_user( | ||
| 24 | + username = 'professor', | ||
| 25 | + email = 'professor@amadeus.com', | ||
| 26 | + is_staff = False, | ||
| 27 | + is_active = True, | ||
| 28 | + password = 'testing', | ||
| 29 | + type_profile = 1 | ||
| 30 | + ) | ||
| 31 | + assign_role(self.user_professor, 'professor') | ||
| 32 | + | ||
| 33 | + self.user_student = User.objects.create_user( | ||
| 34 | + username = 'student', | ||
| 35 | + email = 'student@amadeus.com', | ||
| 36 | + is_staff = False, | ||
| 37 | + is_active = True, | ||
| 38 | + password = 'testing', | ||
| 39 | + type_profile = 2 | ||
| 40 | + ) | ||
| 41 | + assign_role(self.user_student, 'student') | ||
| 42 | + | ||
| 24 | self.category = CourseCategory.objects.create( | 43 | self.category = CourseCategory.objects.create( |
| 25 | name = 'Category test', | 44 | name = 'Category test', |
| 26 | slug = 'category_test' | 45 | slug = 'category_test' |
| @@ -87,11 +106,15 @@ class ForumViewTestCase (TestCase): | @@ -87,11 +106,15 @@ class ForumViewTestCase (TestCase): | ||
| 87 | ) | 106 | ) |
| 88 | self.answer.save() | 107 | self.answer.save() |
| 89 | 108 | ||
| 90 | - | 109 | + self.client = Client() |
| 91 | self.client.login(username='test', password='testing') | 110 | self.client.login(username='test', password='testing') |
| 92 | - self.index_url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) | ||
| 93 | - self.create_url = reverse('course:forum:create') | ||
| 94 | - self.update_url = reverse('course:forum:update', kwargs={'pk':self.forum.pk}) | 111 | + |
| 112 | + self.client_professor = Client() | ||
| 113 | + self.client_professor.login (username='professor', password='testing') | ||
| 114 | + | ||
| 115 | + self.client_student = Client() | ||
| 116 | + self.client_student.login (username='student', password='testing') | ||
| 117 | + | ||
| 95 | 118 | ||
| 96 | self.createPost_url = reverse('course:forum:create_post') | 119 | self.createPost_url = reverse('course:forum:create_post') |
| 97 | self.updatePost_url = reverse('course:forum:update_post', kwargs={'pk':self.post.pk}) | 120 | self.updatePost_url = reverse('course:forum:update_post', kwargs={'pk':self.post.pk}) |
| @@ -99,61 +122,137 @@ class ForumViewTestCase (TestCase): | @@ -99,61 +122,137 @@ class ForumViewTestCase (TestCase): | ||
| 99 | ######################### ForumDetailView ######################### | 122 | ######################### ForumDetailView ######################### |
| 100 | 123 | ||
| 101 | def test_ForumDetail_view_ok (self): | 124 | def test_ForumDetail_view_ok (self): |
| 102 | - response = self.client.get(self.index_url) | 125 | + url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) |
| 126 | + | ||
| 127 | + response = self.client.get(url) | ||
| 128 | + self.assertEquals(response.status_code, 200) | ||
| 129 | + | ||
| 130 | + response = self.client_professor.get(url) | ||
| 131 | + self.assertEquals(response.status_code, 200) | ||
| 132 | + | ||
| 133 | + response = self.client_student.get(url) | ||
| 103 | self.assertEquals(response.status_code, 200) | 134 | self.assertEquals(response.status_code, 200) |
| 104 | - self.assertTemplateUsed(response, 'forum/forum_view.html') | ||
| 105 | 135 | ||
| 106 | def test_ForumDetail_context(self): | 136 | def test_ForumDetail_context(self): |
| 107 | - response = self.client.get(self.index_url) | 137 | + url = reverse('course:forum:view', kwargs={'slug':self.forum.slug}) |
| 138 | + | ||
| 139 | + response = self.client.get(url) | ||
| 108 | self.assertTrue('forum' in response.context) | 140 | self.assertTrue('forum' in response.context) |
| 109 | 141 | ||
| 142 | + response = self.client_professor.get(url) | ||
| 143 | + self.assertTrue('forum' in response.context) | ||
| 144 | + | ||
| 145 | + response = self.client_student.get(url) | ||
| 146 | + self.assertTrue('forum' in response.context) | ||
| 147 | + | ||
| 148 | + | ||
| 110 | ######################### CreateForumView ######################### | 149 | ######################### CreateForumView ######################### |
| 111 | 150 | ||
| 112 | def test_CreateForum_view_ok (self): | 151 | def test_CreateForum_view_ok (self): |
| 113 | - response = self.client.get(self.create_url) | 152 | + url = reverse('course:forum:create') |
| 153 | + | ||
| 154 | + response = self.client.get(url) | ||
| 155 | + self.assertEquals(response.status_code, 200) | ||
| 156 | + | ||
| 157 | + response = self.client_professor.get(url) | ||
| 158 | + self.assertEquals(response.status_code, 200) | ||
| 159 | + | ||
| 160 | + response = self.client_student.get(url) | ||
| 114 | self.assertEquals(response.status_code, 200) | 161 | self.assertEquals(response.status_code, 200) |
| 115 | - self.assertTemplateUsed(response, 'forum/forum_form.html') | ||
| 116 | 162 | ||
| 117 | - def test_CreateForum_context(self): | ||
| 118 | - response = self.client.get(self.create_url) | 163 | + def test_CreateForum_context(self): |
| 164 | + url = reverse('course:forum:create') | ||
| 165 | + | ||
| 166 | + response = self.client.get(url) | ||
| 167 | + self.assertTrue('form' in response.context) | ||
| 168 | + | ||
| 169 | + response = self.client_professor.get(url) | ||
| 170 | + self.assertTrue('form' in response.context) | ||
| 171 | + | ||
| 172 | + response = self.client_student.get(url) | ||
| 119 | self.assertTrue('form' in response.context) | 173 | self.assertTrue('form' in response.context) |
| 120 | 174 | ||
| 121 | def test_CreateForum_form_error (self): | 175 | def test_CreateForum_form_error (self): |
| 176 | + url = reverse('course:forum:create') | ||
| 122 | data = {'name':'', 'limit_date': '', 'description':'', 'topic':''} | 177 | data = {'name':'', 'limit_date': '', 'description':'', 'topic':''} |
| 123 | - response = self.client.post(self.create_url, data) | 178 | + list_forum = Forum.objects.all().count() |
| 179 | + | ||
| 180 | + response = self.client.post(url, data) | ||
| 181 | + self.assertEquals (response.status_code, 400) | ||
| 182 | + self.assertEquals(list_forum, Forum.objects.all().count()) | ||
| 183 | + | ||
| 184 | + response = self.client_professor.post(url, data) | ||
| 124 | self.assertEquals (response.status_code, 400) | 185 | self.assertEquals (response.status_code, 400) |
| 186 | + self.assertEquals(list_forum, Forum.objects.all().count()) | ||
| 187 | + | ||
| 188 | + response = self.client_student.post(url, data) | ||
| 189 | + self.assertEquals (response.status_code, 400) | ||
| 190 | + self.assertEquals(list_forum, Forum.objects.all().count()) | ||
| 125 | 191 | ||
| 126 | def test_CreateForum_form_ok (self): | 192 | def test_CreateForum_form_ok (self): |
| 193 | + url = reverse('course:forum:create') | ||
| 127 | data = { | 194 | data = { |
| 128 | 'name':'Forum Test2', | 195 | 'name':'Forum Test2', |
| 129 | 'limit_date': '2017-10-05', | 196 | 'limit_date': '2017-10-05', |
| 130 | 'description':'Test', | 197 | 'description':'Test', |
| 131 | 'topic':str(self.topic.id) | 198 | 'topic':str(self.topic.id) |
| 132 | } | 199 | } |
| 200 | + list_forum = Forum.objects.all().count() | ||
| 201 | + | ||
| 202 | + response = self.client.post(url, data) | ||
| 203 | + self.assertEquals (response.status_code, 302) | ||
| 204 | + self.assertEquals(list_forum+1, Forum.objects.all().count()) | ||
| 133 | 205 | ||
| 134 | - response = self.client.post(self.create_url, data) | 206 | + response = self.client_professor.post(url, data) |
| 135 | self.assertEquals (response.status_code, 302) | 207 | self.assertEquals (response.status_code, 302) |
| 208 | + self.assertEquals(list_forum+2, Forum.objects.all().count()) | ||
| 136 | 209 | ||
| 137 | - forum = Forum.objects.get(name='Forum Test2') | 210 | + response = self.client_student.post(url, data) |
| 211 | + self.assertEquals (response.status_code, 302) | ||
| 212 | + self.assertEquals(list_forum+3, Forum.objects.all().count()) | ||
| 138 | 213 | ||
| 139 | ######################### UpdateForumView ######################### | 214 | ######################### UpdateForumView ######################### |
| 140 | 215 | ||
| 141 | def test_UpdateForum_view_ok (self): | 216 | def test_UpdateForum_view_ok (self): |
| 142 | - response = self.client.get(self.update_url) | 217 | + url = reverse('course:forum:update', kwargs={'pk':self.forum.pk}) |
| 218 | + | ||
| 219 | + response = self.client.get(url) | ||
| 220 | + self.assertEquals(response.status_code, 200) | ||
| 221 | + | ||
| 222 | + response = self.client_professor.get(url) | ||
| 143 | self.assertEquals(response.status_code, 200) | 223 | self.assertEquals(response.status_code, 200) |
| 144 | - self.assertTemplateUsed(response, 'forum/forum_form.html') | ||
| 145 | 224 | ||
| 146 | - def test_UpdateForum_context(self): | ||
| 147 | - response = self.client.get(self.update_url) | 225 | + response = self.client_student.get(url) |
| 226 | + self.assertEquals(response.status_code, 200) | ||
| 227 | + | ||
| 228 | + | ||
| 229 | + def test_UpdateForum_context(self): | ||
| 230 | + url = reverse('course:forum:update', kwargs={'pk':self.forum.pk}) | ||
| 231 | + | ||
| 232 | + response = self.client.get(url) | ||
| 233 | + self.assertTrue('form' in response.context) | ||
| 234 | + | ||
| 235 | + response = self.client_professor.get(url) | ||
| 236 | + self.assertTrue('form' in response.context) | ||
| 237 | + | ||
| 238 | + response = self.client_student.get(url) | ||
| 148 | self.assertTrue('form' in response.context) | 239 | self.assertTrue('form' in response.context) |
| 149 | 240 | ||
| 150 | def test_UpdateForum_form_error (self): | 241 | def test_UpdateForum_form_error (self): |
| 242 | + url = reverse('course:forum:update', kwargs={'pk':self.forum.pk}) | ||
| 151 | data = {'name':'', 'limit_date': '', 'description':''} | 243 | data = {'name':'', 'limit_date': '', 'description':''} |
| 152 | 244 | ||
| 153 | - response = self.client.post(self.update_url, data) | 245 | + response = self.client.post(url, data) |
| 246 | + self.assertEquals (response.status_code, 400) | ||
| 247 | + | ||
| 248 | + response = self.client_professor.post(url, data) | ||
| 249 | + self.assertEquals (response.status_code, 400) | ||
| 250 | + | ||
| 251 | + response = self.client_student.post(url, data) | ||
| 154 | self.assertEquals (response.status_code, 400) | 252 | self.assertEquals (response.status_code, 400) |
| 155 | 253 | ||
| 156 | def test_UpdateForum_form_ok (self): | 254 | def test_UpdateForum_form_ok (self): |
| 255 | + url = reverse('course:forum:update', kwargs={'pk':self.forum.pk}) | ||
| 157 | data = { | 256 | data = { |
| 158 | 'name':'Forum Updated', | 257 | 'name':'Forum Updated', |
| 159 | 'limit_date': '2017-10-05', | 258 | 'limit_date': '2017-10-05', |
| @@ -161,11 +260,26 @@ class ForumViewTestCase (TestCase): | @@ -161,11 +260,26 @@ class ForumViewTestCase (TestCase): | ||
| 161 | 'topic':str(self.topic.id) | 260 | 'topic':str(self.topic.id) |
| 162 | } | 261 | } |
| 163 | 262 | ||
| 164 | - response = self.client.post(self.update_url, data) | 263 | + self.assertEquals(Forum.objects.all()[0].name, 'forum test') |
| 264 | + response = self.client.post(url, data) | ||
| 165 | self.assertEquals (response.status_code, 302) | 265 | self.assertEquals (response.status_code, 302) |
| 166 | - | 266 | + self.assertEquals(Forum.objects.all()[0].name, 'Forum Updated') |
| 167 | forum = Forum.objects.get(name='Forum Updated') | 267 | forum = Forum.objects.get(name='Forum Updated') |
| 168 | 268 | ||
| 269 | + data['name'] = 'Forum Updated as professor' | ||
| 270 | + self.assertEquals(Forum.objects.all()[0].name, 'Forum Updated') | ||
| 271 | + response = self.client_professor.post(url, data) | ||
| 272 | + self.assertEquals (response.status_code, 302) | ||
| 273 | + self.assertEquals(Forum.objects.all()[0].name, 'Forum Updated as professor') | ||
| 274 | + forum = Forum.objects.get(name='Forum Updated as professor') | ||
| 275 | + | ||
| 276 | + data['name'] = 'Forum Updated as student' | ||
| 277 | + self.assertEquals(Forum.objects.all()[0].name, 'Forum Updated as professor') | ||
| 278 | + response = self.client_student.post(url, data) | ||
| 279 | + self.assertEquals (response.status_code, 302) | ||
| 280 | + self.assertEquals(Forum.objects.all()[0].name, 'Forum Updated as student') | ||
| 281 | + forum = Forum.objects.get(name='Forum Updated as student') | ||
| 282 | + | ||
| 169 | ######################### CreatePostView ######################### | 283 | ######################### CreatePostView ######################### |
| 170 | 284 | ||
| 171 | def test_CreatePost_form_error (self): | 285 | def test_CreatePost_form_error (self): |