.
This commit is contained in:
@@ -13,6 +13,8 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
Start time: {{cid_user_exam.start_time}}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block js %}
|
||||
+2
-2
@@ -22,8 +22,8 @@ urlpatterns = [
|
||||
path("exam/<int:pk>/start", views.exam_start, name="exam_start"),
|
||||
path(
|
||||
"exam/<int:pk>/<str:cid>/<str:passcode>/finish",
|
||||
views.exam_finish,
|
||||
name="exam_finish",
|
||||
views.exam_take_overview,
|
||||
name="exam_take_overview",
|
||||
),
|
||||
path("exam/<int:pk>/", views.GenericExamViews.exam_overview, name="exam_overview"),
|
||||
path(
|
||||
|
||||
+20
-6
@@ -1,6 +1,7 @@
|
||||
from reversion.views import RevisionMixin
|
||||
from generic.mixins import SuperuserRequiredMixin
|
||||
from django.views.generic.detail import DetailView
|
||||
from generic.models import CidUser
|
||||
from sbas.forms import CidUserAnswerForm, ExamForm
|
||||
from django.shortcuts import render, get_object_or_404, redirect
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
@@ -156,9 +157,12 @@ def exam_start(request, pk):
|
||||
)
|
||||
|
||||
|
||||
def exam_finish(request, pk, cid, passcode):
|
||||
def exam_take_overview(request, pk, cid, passcode):
|
||||
exam = get_object_or_404(Exam, pk=pk)
|
||||
|
||||
if not exam.active:
|
||||
raise Http404("Exam not found")
|
||||
|
||||
if not exam.check_cid_user(cid, passcode):
|
||||
raise Http404("Error accessing exam")
|
||||
|
||||
@@ -179,12 +183,12 @@ def exam_finish(request, pk, cid, passcode):
|
||||
else:
|
||||
question_answer_tuples.append((q, None))
|
||||
|
||||
if not exam.active:
|
||||
raise Http404("Exam not found")
|
||||
c = CidUser.objects.filter(cid=cid).first()
|
||||
cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c)
|
||||
|
||||
return render(
|
||||
request,
|
||||
"sbas/exam_finish.html",
|
||||
"sbas/exam_take_overview.html",
|
||||
{
|
||||
"exam": exam,
|
||||
"cid": cid,
|
||||
@@ -192,6 +196,7 @@ def exam_finish(request, pk, cid, passcode):
|
||||
"answer_count": answer_count,
|
||||
"exam_length": len(questions),
|
||||
"passcode": passcode,
|
||||
"cid_user_exam": cid_user_exam,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -206,6 +211,9 @@ def exam_take(request, pk, sk, cid, passcode):
|
||||
if not exam.check_cid_user(cid, passcode):
|
||||
raise Http404("Error accessing exam")
|
||||
|
||||
c = CidUser.objects.filter(cid=cid).first()
|
||||
cid_user_exam = exam.get_or_create_cid_user_exam(cid_user=c)
|
||||
|
||||
question = exam.exam_questions.all()[sk]
|
||||
|
||||
exam_length = len(exam.exam_questions.all())
|
||||
@@ -227,6 +235,9 @@ def exam_take(request, pk, sk, cid, passcode):
|
||||
# answer.published_date = timezone.now()
|
||||
answer.save()
|
||||
|
||||
cid_user_exam.end_time = timezone.now()
|
||||
cid_user_exam.save()
|
||||
|
||||
kwargs = {"pk": pk, "cid": cid, "passcode": passcode}
|
||||
|
||||
if "next" in request.POST:
|
||||
@@ -234,7 +245,7 @@ def exam_take(request, pk, sk, cid, passcode):
|
||||
elif "previous" in request.POST:
|
||||
return redirect("sbas:exam_take", sk=pos - 1, **kwargs)
|
||||
elif "finish" in request.POST:
|
||||
return redirect("sbas:exam_finish", **kwargs)
|
||||
return redirect("sbas:exam_take_overview", **kwargs)
|
||||
elif "goto" in request.POST:
|
||||
return redirect(
|
||||
"sbas:exam_take", sk=int(request.POST.get("goto")), **kwargs
|
||||
@@ -267,6 +278,7 @@ def exam_take(request, pk, sk, cid, passcode):
|
||||
"pos": pos,
|
||||
"saved_answer": saved_answer,
|
||||
"passcode": passcode,
|
||||
"cid_user_exam": cid_user_exam,
|
||||
},
|
||||
)
|
||||
|
||||
@@ -321,6 +333,7 @@ class UserAnswerDelete(SuperuserRequiredMixin, DeleteView):
|
||||
|
||||
GenericViews = GenericViewBase("sbas", Question, CidUserAnswer, Exam)
|
||||
|
||||
|
||||
class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
||||
model = Question
|
||||
success_url = reverse_lazy("sbas:question_list")
|
||||
@@ -352,7 +365,7 @@ class ExamUpdate(
|
||||
return super().form_valid(form)
|
||||
|
||||
|
||||
#class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||
# class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||
# # queryset = Exam.objects.all().order_by('name')
|
||||
# serializer_class = ExamSerializer
|
||||
# permission_classes = [permissions.IsAuthenticated]
|
||||
@@ -373,5 +386,6 @@ class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
||||
template_name = "exam_confirm_delete.html"
|
||||
success_url = reverse_lazy("sbas:index")
|
||||
|
||||
|
||||
class ExamClone(ExamCloneMixin, ExamCreate):
|
||||
"""Clone exam view"""
|
||||
|
||||
Reference in New Issue
Block a user