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 @@
-
-
-
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