From 9313f27f1e6b9418c8781d446f0bf6e644c6dee6 Mon Sep 17 00:00:00 2001 From: ifac0 Date: Thu, 13 Oct 2016 15:35:24 -0300 Subject: [PATCH] modificações no app exam #171 --- courses/urls.py | 3 +++ exam/admin.py | 13 ++++++++++++- exam/forms.py | 30 +++++++----------------------- exam/models.py | 12 ++++-------- exam/permisissions.py | 12 ------------ exam/permissions.py | 12 ++++++++++++ exam/templates/exam/create.html | 0 exam/templates/exam/form_exam.html | 60 ------------------------------------------------------------ exam/templates/exam/remove.html | 0 exam/templates/exam/update.html | 0 exam/templates/exam/view.html | 0 exam/urls.py | 7 ++++--- exam/views.py | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------- 13 files changed, 185 insertions(+), 139 deletions(-) delete mode 100644 exam/permisissions.py create mode 100644 exam/permissions.py create mode 100644 exam/templates/exam/create.html delete mode 100644 exam/templates/exam/form_exam.html create mode 100644 exam/templates/exam/remove.html create mode 100644 exam/templates/exam/update.html create mode 100644 exam/templates/exam/view.html diff --git a/courses/urls.py b/courses/urls.py index cb3c483..9a2e135 100644 --- a/courses/urls.py +++ b/courses/urls.py @@ -26,5 +26,8 @@ urlpatterns = [ url(r'^forum/', include('forum.urls', namespace = 'forum')), url(r'^poll/', include('poll.urls', namespace = 'poll')), + url(r'^exam/', include('exam.urls', namespace = 'exam')), + + ] diff --git a/exam/admin.py b/exam/admin.py index 8c38f3f..671fff8 100644 --- a/exam/admin.py +++ b/exam/admin.py @@ -1,3 +1,14 @@ from django.contrib import admin -# Register your models here. +from .models import Exam, Answer + +class ExamAdmin(admin.ModelAdmin): + list_display = ['name', 'slug','begin_date','limit_date'] + search_fields = ['name','slug'] + +class AnswerAdmin(admin.ModelAdmin): + list_display = ['answer','order'] + search_fields = ['answer'] + +admin.site.register(Exam, ExamAdmin) +admin.site.register(Answer, AnswerAdmin) diff --git a/exam/forms.py b/exam/forms.py index 5d58a47..2308816 100644 --- a/exam/forms.py +++ b/exam/forms.py @@ -1,39 +1,23 @@ +from django.utils.translation import ugettext_lazy as _ from django import forms from .models import Exam class ExamForm(forms.ModelForm): def clean_end_date(self): - beginDate = self.data['beginDate'] - endDate = self.data['endDate'] + begin_date = self.data['begin_date'] + limit_date = self.data['limit_date'] - if beginDate and endDate and endDate < beginDate: + if begin_date and limit_date and limit_date < begin_date: raise forms.ValidationError(_('The end date may not be before the start date.')) return endDate - def clean_begin_date(self): - endDate = self.data['endDate'] - beginDate = self.data['beginDate'] - - if enDate and benginDate and beginDate <= endDate: - raise forms.ValidationError(_('The exam start date must be after the end of registration.')) - return beginDate - - def clean_end_date(self): - beginDate = self.data['beginDate'] - endDate = self.data['endDate'] - - if beginDate and endDate and endDate < beginDate: - raise forms.ValidationError(_('The finish date may not be before the start date.')) - return end_date - - class Meta: model = Exam - fields = ['name','beginDate','endDate'] + fields = ['name','begin_date','limit_date'] widgets = { 'name': forms.TextInput(attrs={'placeholder': 'Exam?'}), - 'beginDate': forms.DateTimeInput(attrs={'placeholder': 'Start date to resolve the exam'}), - 'endDate': forms.DateTimeInput(attrs={'placeholder': 'Finish date permited to resolve the exam'}), + 'begin_date': forms.DateTimeInput(attrs={'placeholder': _('Start date to resolve the exam')}), + 'limit_date': forms.DateTimeInput(attrs={'placeholder': _('Finish date permited to resolve the exam')}), } diff --git a/exam/models.py b/exam/models.py index a3c2a2f..01ccd67 100644 --- a/exam/models.py +++ b/exam/models.py @@ -5,23 +5,19 @@ from users.models import User from core.models import Resource from courses.models import Activity - - -class Exam(models.Model): - name = models.CharField(_('Name'), max_length = 100) - beginDate = models.DateTimeField(_('Start Date'), auto_now_add = True) - endDate = models.DateTimeField(_('Date of last update'), auto_now=True) +class Exam(Activity): + begin_date = models.DateField(_('Begin of Course Date')) class Meta: - #ordering = ('create_date','name') verbose_name = _('Exam') verbose_name_plural = _('Exams') def __str__(self): return str(self.name) + str("/") + str(self.topic) + class Answer(models.Model): - answer = models.CharField(_("Answer"), max_length = 200) + answer = models.CharField(_("Answer"), max_length = 300) order = models.PositiveSmallIntegerField(_("Order")) exam = models.ForeignKey(Exam, verbose_name = _('Answers'), related_name='answers') diff --git a/exam/permisissions.py b/exam/permisissions.py deleted file mode 100644 index d3c976f..0000000 --- a/exam/permisissions.py +++ /dev/null @@ -1,12 +0,0 @@ -from rolepermissions.permissions import register_object_checker -from amadeus.roles import SystemAdmin - -@register_object_checker() -def edit_exam(role, user, exam): - if (role == SystemAdmin): - return True - - if (user in exam.topic.subject.professors.all()): - return True - - return False diff --git a/exam/permissions.py b/exam/permissions.py new file mode 100644 index 0000000..d3c976f --- /dev/null +++ b/exam/permissions.py @@ -0,0 +1,12 @@ +from rolepermissions.permissions import register_object_checker +from amadeus.roles import SystemAdmin + +@register_object_checker() +def edit_exam(role, user, exam): + if (role == SystemAdmin): + return True + + if (user in exam.topic.subject.professors.all()): + return True + + return False diff --git a/exam/templates/exam/create.html b/exam/templates/exam/create.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/exam/templates/exam/create.html diff --git a/exam/templates/exam/form_exam.html b/exam/templates/exam/form_exam.html deleted file mode 100644 index 55ccb58..0000000 --- a/exam/templates/exam/form_exam.html +++ /dev/null @@ -1,60 +0,0 @@ -
-
-

New Exam

-
-
-
- -
- - -
- -
- - -
-
- -
- - -
-
- - -
-
-
- -
- -
-
-
- -
- -
-
-
-
-
- - diff --git a/exam/templates/exam/remove.html b/exam/templates/exam/remove.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/exam/templates/exam/remove.html diff --git a/exam/templates/exam/update.html b/exam/templates/exam/update.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/exam/templates/exam/update.html diff --git a/exam/templates/exam/view.html b/exam/templates/exam/view.html new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/exam/templates/exam/view.html diff --git a/exam/urls.py b/exam/urls.py index a1abf31..3280d88 100644 --- a/exam/urls.py +++ b/exam/urls.py @@ -3,7 +3,8 @@ from django.conf.urls import url from . import views urlpatterns = [ - url(r'^create/(?P[\w\-_]+)/$', views.CreateExam.as_view(), name='create_poll'), - url(r'^update/(?P[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_poll'), - + url(r'^create/(?P[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), + url(r'^update/(?P[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), + url(r'^view/(?P[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), + url(r'^delete/(?P[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), ] diff --git a/exam/views.py b/exam/views.py index 8c41dbd..7ab1fd7 100644 --- a/exam/views.py +++ b/exam/views.py @@ -8,6 +8,7 @@ from django.core.urlresolvers import reverse_lazy from django.utils.translation import ugettext_lazy as _ from rolepermissions.verifications import has_role from rolepermissions.verifications import has_object_permission +from django.db.models import Q # from django.views.generic.edit import FormMixin from .forms import ExamForm @@ -16,34 +17,76 @@ from core.mixins import NotificationMixin from users.models import User from courses.models import Course, Topic -class CreateExam(LoginRequiredMixin,generic.CreateView): +class ViewExam(LoginRequiredMixin,generic.DetailView): - login_url = reverse_lazy("core:home") - redirect_field_name = 'next' model = Exam - form_class = PollForm context_object_name = 'exam' - template_name = 'exam/form_exam.html' - success_url = reverse_lazy('core:home') + template_name = 'exam/view.html' + + def get_object(self, queryset=None): + return get_object_or_404(Exam, slug = self.kwargs.get('slug')) + + def form_invalid(self, form,**kwargs): + context = super(ViewExam, self).form_invalid(form) + answers = {} + for key in self.request.POST: + if(key != 'csrfmiddlewaretoken' and key != 'name' and key!= 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): + answers[key] = self.request.POST[key] + + keys = sorted(answers) + context.context_data['answers'] = answers + context.context_data['keys'] = keys + return context def form_valid(self, form): - self.object = form.save(commit = False) - topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) - self.object.topic = topic - self.object.save() + exam = self.object + exam = form.save(commit = False) + exam.answers.all().delete() + exam.save() + for key in self.request.POST: - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'beginDate' and key != 'endDate'): - answer = Answer(answer=self.request.POST[key],order=key,poll=self.object) + if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): + answer = Answer(answer=self.request.POST[key],order=key,exam=exam) answer.save() - return super(CreateExam, self).form_valid(form) + return super(ViewExam, self).form_valid(form) + + def get_context_data(self, **kwargs): + context = super(ViewExam, self).get_context_data(**kwargs) + exam = self.object + context['course'] = exam.topic.subject.course + context['subject'] = exam.topic.subject + context['subjects'] = exam.topic.subject.course.subjects.all() + + answers = {} + for answer in exam.answers.all(): + answers[answer.order] = answer.answer + + keys = sorted(answers) + context['answers'] = answers + context['keys'] = keys + + print (context) + return context + + +class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): + + allowed_roles = ['professor', 'system_admin'] + login_url = reverse_lazy("core:home") + redirect_field_name = 'next' + model = Exam + form_class = ExamForm + context_object_name = 'exam' + template_name = 'exam/create.html' + success_url = reverse_lazy('core:home') def form_invalid(self, form,**kwargs): context = super(CreateExam, self).form_invalid(form) answers = {} for key in self.request.POST: - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'beginDate' and key != 'endDate'): + if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): answers[key] = self.request.POST[key] keys = sorted(answers) @@ -51,47 +94,115 @@ class CreateExam(LoginRequiredMixin,generic.CreateView): context.context_data['keys'] = keys return context -class UpdateExam(LoginRequiredMixin,generic.UpdateView): + def form_valid(self, form): + self.object = form.save(commit = False) + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) + self.object.topic = topic + self.object.save() + for key in self.request.POST: + if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): + answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) + answer.save() + + return super(CreatePoll, self).form_valid(form) + + def get_context_data(self, **kwargs): + context = super(CreateExam, self).get_context_data(**kwargs) + topic = get_object_or_404(Topic, slug = self.kwargs.get('slug')) + context['course'] = topic.subject.course + context['subject'] = topic.subject + context['subjects'] = topic.subject.course.subjects.all() + return context + +class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): + + allowed_roles = ['professor', 'system_admin'] login_url = reverse_lazy("core:home") redirect_field_name = 'next' model = Exam form_class = ExamForm context_object_name = 'exam' - template_name = 'poll/form_exam.html' + template_name = 'exam/update.html' success_url = reverse_lazy('core:home') def dispatch(self, *args, **kwargs): - poll = get_object_or_404(Poll, slug = self.kwargs.get('slug')) - + exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) if(not has_object_permission('edit_exam', self.request.user, exam)): return self.handle_no_permission() - return super(UpdateExam, self).dispatch(*args, **kwargs) + return super(UpdatePoll, self).dispatch(*args, **kwargs) def get_object(self, queryset=None): - return get_object_or_404(Poll, slug = self.kwargs.get('slug')) + return get_object_or_404(Exam, slug = self.kwargs.get('slug')) + + def form_invalid(self, form,**kwargs): + context = super(UpdateExam, self).form_invalid(form) + answers = {} + for key in self.request.POST: + if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): + answers[key] = self.request.POST[key] + + keys = sorted(answers) + context.context_data['answers'] = answers + context.context_data['keys'] = keys + return context def form_valid(self, form): - poll = self.object - poll = form.save(commit = False) - poll.answers.all().delete() - poll.save() + exam = self.object + exam = form.save(commit = False) + exam.answers.all().delete() + exam.save() + for key in self.request.POST: - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'beginDate' and key != 'endDate'): + if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'begin_date' and key != 'limit_date' and key != 'all_students' and key != 'students'): answer = Answer(answer=self.request.POST[key],order=key,exam=exam) answer.save() return super(UpdateExam, self).form_valid(form) - def form_invalid(self, form,**kwargs): - context = super(UpdateExam, self).form_invalid(form) + def get_context_data(self, **kwargs): + context = super(UpdateExam, self).get_context_data(**kwargs) + exam = self.object + context['course'] = exam.topic.subject.course + context['subject'] = exam.topic.subject + context['subjects'] = exam.topic.subject.course.subjects.all() + answers = {} - for key in self.request.POST: - if(key != 'csrfmiddlewaretoken' and key != 'name' and key != 'beginDate' and key != 'endDate'): - answers[key] = self.request.POST[key] + for answer in exam.answers.all(): + # print (key.answer) + answers[answer.order] = answer.answer keys = sorted(answers) - context.context_data['answers'] = answers - context.context_data['keys'] = keys + context['answers'] = answers + context['keys'] = keys + + return context + +class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): + + allowed_roles = ['professor', 'system_admin'] + login_url = reverse_lazy("core:home") + redirect_field_name = 'next' + model = Exam + template_name = 'exam/remove.html' + + def dispatch(self, *args, **kwargs): + exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) + if(not has_object_permission('delete_exam', self.request.user, exam)): + return self.handle_no_permission() + return super(DeleteExam, self).dispatch(*args, **kwargs) + + + def get_context_data(self, **kwargs): + context = super(DeleteExam, self).get_context_data(**kwargs) + context['course'] = self.object.topic.subject.course + context['subject'] = self.object.topic.subject + context['exam'] = self.object + context['subjects'] = self.object.topic.subject.course.subjects.filter(Q(visible=True) | Q(professors__in=[self.request.user])) + if (has_role(self.request.user,'system_admin')): + context['subjects'] = self.object.topic.subject.course.subjects.all() return context + + def get_success_url(self): + return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) -- libgit2 0.21.2