From 289e1517a04dd3fadd95f4d23fd7327405f3f91c Mon Sep 17 00:00:00 2001 From: ifac0 Date: Tue, 18 Oct 2016 17:58:37 -0300 Subject: [PATCH] atualização do admin, form, model, url, views e permissions #171 --- exam/admin.py | 7 ++++++- exam/forms.py | 44 +++++++++++++++++++++++++++++--------------- exam/models.py | 16 +++++++++++++++- exam/permissions.py | 10 ++++++++++ exam/urls.py | 10 ++++++---- exam/views.py | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------------- manage.py | 0 7 files changed, 127 insertions(+), 61 deletions(-) mode change 100644 => 100755 manage.py diff --git a/exam/admin.py b/exam/admin.py index 671fff8..af11ccd 100644 --- a/exam/admin.py +++ b/exam/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import Exam, Answer +from .models import Exam, Answer, AnswersStudent class ExamAdmin(admin.ModelAdmin): list_display = ['name', 'slug','begin_date','limit_date'] @@ -10,5 +10,10 @@ class AnswerAdmin(admin.ModelAdmin): list_display = ['answer','order'] search_fields = ['answer'] +class AnswersStudentAdmin(admin.ModelAdmin): + list_display = ['student','exam','answered_in'] + search_fields = ['student','exam'] + admin.site.register(Exam, ExamAdmin) admin.site.register(Answer, AnswerAdmin) +admin.site.register(AnswersStudent, AnswersStudentAdmin) diff --git a/exam/forms.py b/exam/forms.py index 2308816..7d3e5df 100644 --- a/exam/forms.py +++ b/exam/forms.py @@ -1,23 +1,37 @@ -from django.utils.translation import ugettext_lazy as _ from django import forms +from django.utils.translation import ugettext_lazy as _ +from users.models import User from .models import Exam class ExamForm(forms.ModelForm): - def clean_end_date(self): - begin_date = self.data['begin_date'] - limit_date = self.data['limit_date'] - 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 __init__(self, *args, **kwargs): + super(ExamForm, self).__init__(*args, **kwargs) + self.fields["all_students"].required = False + self.fields["all_students"].initial = False + self.fields["students"].required = False + + def clean_all_students(self): + if('all_students' not in self.data): + if('students' in self.data): + return False + raise forms.ValidationError(_('It is required one these fields.')) + else: + all_students = self.data['all_students'] + if(not all_students): + raise forms.ValidationError(_('It is required one these fields.')) + return True - class Meta: - model = Exam - fields = ['name','begin_date','limit_date'] + class Meta: + model = Exam + fields = ['name','begin_date','limit_date','students','all_students'] - widgets = { - 'name': forms.TextInput(attrs={'placeholder': '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')}), - } + widgets = { + 'name': forms.TextInput(attrs={'placeholder': 'Exam?'}), + 'begin_date': forms.DateTimeInput( + attrs={'placeholder': _('Start date to resolve the exam')}), + 'limit_date': forms.DateTimeInput( + attrs={'placeholder': _('Maximum date permited to resolve the exam')}), + 'student': forms.Select(), + } diff --git a/exam/models.py b/exam/models.py index 01ccd67..e6b8d03 100644 --- a/exam/models.py +++ b/exam/models.py @@ -27,4 +27,18 @@ class Answer(models.Model): verbose_name_plural = _('Answers') def __str__(self): - return str(self.answer) + str("/") + str(self.poll) + return str(self.answer) + str("/") + str(self.exam) + +class AnswersStudent(models.Model): + status = models.BooleanField(_("Answered"), default=False) + exam = models.ForeignKey(Exam, verbose_name = _('Exam'), related_name='answers_stundet') + answer = models.ManyToManyField(Answer,verbose_name = _('Answers Students'), related_name='answers_stundet') + student = models.ForeignKey(User, verbose_name = _('Student'), related_name='answers_stundent') + answered_in = models.DateTimeField(_("Answered Date"),auto_now=True) + + class Meta: + verbose_name = _('Answer Stundent') + verbose_name_plural = _('Answers Student') + + def __str__(self): + return str(self.student) + str("/") + str(self.exam) diff --git a/exam/permissions.py b/exam/permissions.py index d3c976f..5da1d28 100644 --- a/exam/permissions.py +++ b/exam/permissions.py @@ -10,3 +10,13 @@ def edit_exam(role, user, exam): return True return False + +@register_object_checker() +def delete_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/urls.py b/exam/urls.py index 3280d88..45d70c7 100644 --- a/exam/urls.py +++ b/exam/urls.py @@ -3,8 +3,10 @@ from django.conf.urls import url from . import views urlpatterns = [ - 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'), + url(r'^create/(?P[\w\-_]+)/$', views.CreateExam.as_view(), name='create_exam'), # exam slug + url(r'^update/(?P[\w\-_]+)/$', views.UpdateExam.as_view(), name='update_exam'), # topic slug + url(r'^view/(?P[\w\-_]+)/$', views.ViewExam.as_view(), name='view_exam'), # exam slug + url(r'^delete/(?P[\w\-_]+)/$', views.DeleteExam.as_view(), name='delete_exam'), # exam + url(r'^answer/$', views.AnswerExam.as_view(), name='answer_exam'), # exam + url(r'^answer-exam/(?P[\w\-_]+)/$', views.AnswerStudentExam.as_view(), name='answer_student_exam'), # exam slug ] diff --git a/exam/views.py b/exam/views.py index 7ab1fd7..27cdcf1 100644 --- a/exam/views.py +++ b/exam/views.py @@ -12,7 +12,7 @@ from django.db.models import Q # from django.views.generic.edit import FormMixin from .forms import ExamForm -from .models import Exam, Answer +from .models import Exam, Answer, AnswersStudent from core.mixins import NotificationMixin from users.models import User from courses.models import Course, Topic @@ -26,51 +26,23 @@ class ViewExam(LoginRequiredMixin,generic.DetailView): 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): - 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 != '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(ViewExam, self).form_valid(form) - def get_context_data(self, **kwargs): context = super(ViewExam, self).get_context_data(**kwargs) exam = self.object + context["topic"] = exam.topic 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) + answered = AnswersStudent.objects.filter(exam = exam, student=self.request.user) + print (answered) + if answered.count()<1: + context['status'] = False + else: + context['status'] = answered[0].status return context + class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): allowed_roles = ['professor', 'system_admin'] @@ -80,7 +52,6 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): 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) @@ -92,6 +63,8 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): keys = sorted(answers) context.context_data['answers'] = answers context.context_data['keys'] = keys + context.context_data['form'] = form + context.status_code = 400 return context def form_valid(self, form): @@ -105,7 +78,7 @@ class CreateExam(LoginRequiredMixin,HasRoleMixin,generic.CreateView): answer = Answer(answer=self.request.POST[key],order=key,exam=self.object) answer.save() - return super(CreatePoll, self).form_valid(form) + return self.render_to_response(self.get_context_data(form = form), status = 200) def get_context_data(self, **kwargs): context = super(CreateExam, self).get_context_data(**kwargs) @@ -130,7 +103,7 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): 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(UpdatePoll, self).dispatch(*args, **kwargs) + return super(UpdateExam, self).dispatch(*args, **kwargs) def get_object(self, queryset=None): return get_object_or_404(Exam, slug = self.kwargs.get('slug')) @@ -145,6 +118,8 @@ class UpdateExam(LoginRequiredMixin,HasRoleMixin,generic.UpdateView): keys = sorted(answers) context.context_data['answers'] = answers context.context_data['keys'] = keys + context.context_data['form'] = form + context.status_code = 400 return context def form_valid(self, form): @@ -206,3 +181,49 @@ class DeleteExam(LoginRequiredMixin, HasRoleMixin, generic.DeleteView): def get_success_url(self): return reverse_lazy('course:view_topic', kwargs={'slug' : self.object.topic.slug}) + +class AnswerExam(generic.TemplateView): + template_name = 'exam/answer.html' + +class AnswerStudentExam(LoginRequiredMixin,generic.CreateView): + + model = AnswersStudent + fields = ['status'] + context_object_name = 'answer' + template_name = 'exam/answer_student.html' + + def form_valid(self, form): + exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) + answers = AnswersStudent( + status = True, + exam = exam, + student = self.request.user, + ) + answers.save() + + for key in self.request.POST: + if(key != 'csrfmiddlewaretoken'): + answers.answer.add(exam.answers.all().filter(order=key)[0]) + + return self.render_to_response(self.get_context_data(form = form), status = 200) + + def get_context_data(self, **kwargs): + context = super(AnswerStudentExam, self).get_context_data(**kwargs) + print (self.kwargs.get('slug')) + exam = get_object_or_404(Exam, slug = self.kwargs.get('slug')) + context['exam'] = exam + context['topic'] = exam.topic + context['course'] = exam.topic.subject.course + context['subject'] = exam.topic.subject + context['subjects'] = exam.topic.subject.course.subjects.all() + + print (self.request.method) + answers = {} + for answer in exam.answers.all(): + answers[answer.order] = answer.answer + + keys = sorted(answers) + context['answers'] = answers + context['keys'] = keys + + return context diff --git a/manage.py b/manage.py old mode 100644 new mode 100755 index 1027e9d..1027e9d --- a/manage.py +++ b/manage.py -- libgit2 0.21.2