Add QuestionForm and related views: implement form for creating questions with user context and exam association
This commit is contained in:
+57
-1
@@ -56,7 +56,14 @@ from generic.views import (
|
||||
|
||||
from django.core.exceptions import PermissionDenied
|
||||
|
||||
from .forms import ExamGroupsForm, ExamMarkerForm, UserAnswerForm, ExamAuthorForm, ExamForm
|
||||
from .forms import (
|
||||
ExamGroupsForm,
|
||||
ExamMarkerForm,
|
||||
UserAnswerForm,
|
||||
ExamAuthorForm,
|
||||
ExamForm,
|
||||
QuestionForm,
|
||||
)
|
||||
from .decorators import (
|
||||
user_is_author_or_physics_checker,
|
||||
user_is_exam_author_or_physics_checker,
|
||||
@@ -534,6 +541,55 @@ class QuestionView(
|
||||
return context
|
||||
|
||||
|
||||
class QuestionCreateBase(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||
model = Question
|
||||
form_class = QuestionForm
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super(QuestionCreateBase, self).get_form_kwargs()
|
||||
kwargs.update({"user": self.request.user})
|
||||
return kwargs
|
||||
|
||||
def form_valid(self, form):
|
||||
self.object = form.save(commit=False)
|
||||
self.object.save()
|
||||
|
||||
# add the current user as an author
|
||||
form.instance.author.add(self.request.user.id)
|
||||
|
||||
response = super().form_valid(form)
|
||||
return response
|
||||
|
||||
|
||||
class QuestionCreate(QuestionCreateBase):
|
||||
def get_initial(self):
|
||||
if "pk" in self.kwargs:
|
||||
initial = super().get_initial()
|
||||
exam = get_object_or_404(Exam, pk=self.kwargs["pk"])
|
||||
# When creating a question from an exam context we don't have an
|
||||
# 'exams' field on the ModelForm (exams is a reverse relation).
|
||||
# Store nothing in the initial data here; attachment is handled
|
||||
# in form_valid below.
|
||||
return initial
|
||||
|
||||
def form_valid(self, form):
|
||||
# Let the base class save the object and set the author
|
||||
response = super().form_valid(form)
|
||||
|
||||
# If the create URL included an exam pk, add the new question to that exam
|
||||
if "pk" in self.kwargs:
|
||||
try:
|
||||
exam = get_object_or_404(Exam, pk=self.kwargs["pk"])
|
||||
# exam.exam_questions is a ManyToMany through relation; add is fine
|
||||
exam.exam_questions.add(self.object)
|
||||
except Exception:
|
||||
# Don't fail the whole request if attaching to the exam fails;
|
||||
# the question has already been created and author set.
|
||||
pass
|
||||
|
||||
return response
|
||||
|
||||
|
||||
class UserAnswerView(AuthorOrCheckerRequiredMixin, LoginRequiredMixin, DetailView):
|
||||
model = UserAnswer
|
||||
|
||||
|
||||
Reference in New Issue
Block a user