start taking more advantage of class based views
This commit is contained in:
@@ -224,6 +224,9 @@ class Rapid(QuestionBase):
|
||||
default=False, help_text="Question has been scrapped and will not be shown"
|
||||
)
|
||||
|
||||
def get_app_name(self):
|
||||
return "rapids"
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse("rapids:question_detail", kwargs={"pk": self.pk})
|
||||
|
||||
@@ -652,6 +655,10 @@ class Exam(ExamBase):
|
||||
|
||||
examcollection = models.ForeignKey(ExamCollection, blank=True, null=True, on_delete=models.SET_NULL, related_name="rapids_exams")
|
||||
|
||||
|
||||
def get_app_name(self):
|
||||
return "rapids"
|
||||
|
||||
def get_normal_abnormal_breakdown(self):
|
||||
# Inefficient but more extendible
|
||||
questions = self.exam_questions.all()
|
||||
|
||||
@@ -1,10 +1,13 @@
|
||||
{% extends 'rapids/exams.html' %}
|
||||
{% block navigation %}
|
||||
{{ block.super }}
|
||||
{% include 'generic/exam_overview_headers.html' %}
|
||||
{% endblock navigation %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{% load thumbnail %}
|
||||
<div class="rapids">
|
||||
{% include 'generic/exam_overview_headers.html' %}
|
||||
|
||||
<a href="{% url 'rapids:mark_review' exam_pk=exam.pk sk=0 %}"><button>Review exam</button></a></p>
|
||||
|
||||
|
||||
+28
-21
@@ -90,7 +90,7 @@ from .serializers import (
|
||||
UserAnswerSerializer,
|
||||
)
|
||||
|
||||
from generic.mixins import SuperuserRequiredMixin
|
||||
from generic.mixins import CheckCanEditMixin, SuperuserRequiredMixin
|
||||
|
||||
from dal import autocomplete
|
||||
|
||||
@@ -213,12 +213,14 @@ def rapid_clone(request, pk):
|
||||
new_item.pk = None # autogen a new pk (item_id)
|
||||
# new_item.name = "Copy of " + new_item.name #need to change uniques
|
||||
|
||||
if request.user not in new_item.get_author_objects() and not request.user.is_superuser:
|
||||
if (
|
||||
request.user not in new_item.get_author_objects()
|
||||
and not request.user.is_superuser
|
||||
):
|
||||
raise PermissionDenied() # or Http404
|
||||
|
||||
form = RapidForm(request.POST or None, instance=new_item)
|
||||
|
||||
|
||||
image_formset = ImageFormSet()
|
||||
answer_formset = AnswerFormSet()
|
||||
|
||||
@@ -240,7 +242,7 @@ def rapid_clone(request, pk):
|
||||
context = {
|
||||
"form": form,
|
||||
"image_formset": image_formset,
|
||||
"answer_formset": answer_formset
|
||||
"answer_formset": answer_formset,
|
||||
# other context
|
||||
}
|
||||
|
||||
@@ -331,6 +333,7 @@ class RapidCreate(RapidCreateBase):
|
||||
# form.instance.author.add(self.request.user.id)
|
||||
# return super().form_valid(form)
|
||||
|
||||
|
||||
class RapidAnswerUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||
model = Rapid
|
||||
form_class = RapidQuestionAnswerForm
|
||||
@@ -353,7 +356,7 @@ class RapidAnswerUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView)
|
||||
self.object = form.save(commit=False)
|
||||
self.object.save()
|
||||
|
||||
#form.instance.author.add(self.request.user.id)
|
||||
# form.instance.author.add(self.request.user.id)
|
||||
|
||||
context = self.get_context_data(form=form)
|
||||
formset = context["answer_formset"]
|
||||
@@ -367,9 +370,8 @@ class RapidAnswerUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView)
|
||||
else:
|
||||
return super().form_invalid(form)
|
||||
|
||||
class RapidUpdate(
|
||||
RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView
|
||||
):
|
||||
|
||||
class RapidUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||
model = Rapid
|
||||
form_class = RapidForm
|
||||
|
||||
@@ -728,13 +730,14 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False):
|
||||
)
|
||||
|
||||
|
||||
|
||||
class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
||||
model = Rapid
|
||||
success_url = reverse_lazy("rapids:rapid_view")
|
||||
|
||||
|
||||
GenericExamViews = ExamViews(Exam, Rapid, Answer, UserAnswer, "rapids", "rapid", normalise_score=normaliseScore)
|
||||
GenericExamViews = ExamViews(
|
||||
Exam, Rapid, Answer, UserAnswer, "rapids", "rapid", normalise_score=normaliseScore
|
||||
)
|
||||
|
||||
|
||||
class ExamCreate(ExamCreateBase):
|
||||
@@ -742,7 +745,7 @@ class ExamCreate(ExamCreateBase):
|
||||
form_class = ExamForm
|
||||
|
||||
|
||||
class ExamUpdate(ExamUpdateBase, AuthorOrCheckerRequiredMixin):
|
||||
class ExamUpdate(CheckCanEditMixin, ExamUpdateBase, AuthorOrCheckerRequiredMixin):
|
||||
model = Exam
|
||||
form_class = ExamForm
|
||||
|
||||
@@ -750,12 +753,17 @@ class ExamUpdate(ExamUpdateBase, AuthorOrCheckerRequiredMixin):
|
||||
class ExamDelete(AuthorOrCheckerRequiredMixin, ExamDeleteBase):
|
||||
model = Exam
|
||||
|
||||
|
||||
class ExamAuthorUpdate(
|
||||
RevisionMixin, LoginRequiredMixin, AuthorRequiredMixin, UpdateView
|
||||
RevisionMixin,
|
||||
CheckCanEditMixin,
|
||||
LoginRequiredMixin,
|
||||
AuthorRequiredMixin,
|
||||
UpdateView,
|
||||
):
|
||||
model = Exam
|
||||
form_class = ExamAuthorForm
|
||||
|
||||
template_name = "author_form.html"
|
||||
|
||||
|
||||
class UserAnswerView(LoginRequiredMixin, DetailView):
|
||||
@@ -798,24 +806,24 @@ class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||
"""
|
||||
user = self.request.user
|
||||
if user.groups.filter(name="rapid_checker").exists():
|
||||
return Exam.objects.filter(archive=False).order_by('name')
|
||||
return Exam.objects.filter(archive=False).order_by("name")
|
||||
|
||||
return Exam.objects.filter(author__id=user.id, archive=False).order_by('name')
|
||||
return Exam.objects.filter(author__id=user.id, archive=False).order_by("name")
|
||||
|
||||
|
||||
#class QuestionAnswerViewSet(viewsets.ModelViewSet):
|
||||
# class QuestionAnswerViewSet(viewsets.ModelViewSet):
|
||||
# queryset = Answer.objects.all() # .order_by('name')
|
||||
# serializer_class = QuestionAnswerSerializer
|
||||
# permission_classes = [permissions.IsAuthenticated]
|
||||
#
|
||||
#
|
||||
#class UserAnswerViewSet(viewsets.ModelViewSet):
|
||||
# class UserAnswerViewSet(viewsets.ModelViewSet):
|
||||
# queryset = UserAnswer.objects.all() # .order_by('name')
|
||||
# serializer_class = UserAnswerSerializer
|
||||
# permission_classes = [permissions.IsAuthenticated]
|
||||
|
||||
|
||||
#class RapidViewSet(
|
||||
# class RapidViewSet(
|
||||
# RevisionMixin,
|
||||
# mixins.CreateModelMixin,
|
||||
# mixins.RetrieveModelMixin,
|
||||
@@ -823,14 +831,13 @@ class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||
# mixins.ListModelMixin,
|
||||
# mixins.DestroyModelMixin,
|
||||
# viewsets.GenericViewSet,
|
||||
#):
|
||||
# ):
|
||||
# queryset = Rapid.objects.all() # .order_by('name')
|
||||
# serializer_class = RapidSerializer
|
||||
# permission_classes = [permissions.IsAuthenticated]
|
||||
# pagination_class = StandardResultsSetPagination
|
||||
|
||||
|
||||
|
||||
# class AddSuggestedAnswer(LoginRequiredMixin, CreateView):
|
||||
# model = QuestionNote
|
||||
# form_class = QuestionNoteForm
|
||||
@@ -968,4 +975,4 @@ class AnswerAutocomplete(autocomplete.Select2QuerySetView):
|
||||
if self.q:
|
||||
qs = qs.filter(answer__istartswith=self.q)
|
||||
|
||||
return qs
|
||||
return qs
|
||||
|
||||
Reference in New Issue
Block a user