add (correct) support for logged in users to sba and physics exams

This commit is contained in:
Ross
2023-06-26 11:52:23 +01:00
parent 09951286e2
commit 656f1658f8
10 changed files with 288 additions and 187 deletions
+12 -13
View File
@@ -99,13 +99,15 @@ def active_exams(request):
active_exams.append(exam)
return render(request, "physics/available_exam_list.html", {"exams": active_exams})
def exam_scores_cid_user(request, pk, cid=None, passcode=None):
exam = get_object_or_404(Exam, pk=pk)
if not exam.exam_mode:
raise Http404("Packet not in exam mode")
if cid is not None and not exam.check_cid_user(cid, passcode, request):
print(cid, passcode, request.user)
if not exam.check_cid_user(cid, passcode, request):
raise Http404("Error accessing exam")
questions = exam.exam_questions.all()
@@ -168,7 +170,6 @@ def exam_scores_cid_user(request, pk, cid=None, passcode=None):
def exam_take_old(request, pk):
exam = get_object_or_404(Exam, pk=pk)
if not exam.active:
@@ -197,6 +198,9 @@ def exam_start(request, pk):
"physics/exam_start.html",
{
"exam": exam,
# This may be overly comlicated but if the logged in user
# does not have access we give the option to take it as a cid user
"valid_user": exam.check_logged_in_user(request),
},
)
@@ -204,12 +208,11 @@ def exam_start(request, pk):
def exam_take_overview(request, pk, cid=None, passcode=None):
exam = get_object_or_404(Exam, pk=pk)
if cid is not None and not exam.check_cid_user(cid, passcode):
raise Http404("Error accessing exam")
if not exam.active:
return exam_inactive(request, context={"exam": exam})
if not exam.check_cid_user(cid, passcode, request):
raise Http404("Error accessing exam")
questions = exam.exam_questions.all()
@@ -253,14 +256,13 @@ def exam_take_overview(request, pk, cid=None, passcode=None):
)
def exam_take(request, pk, sk, cid=None, passcode=None):
def exam_take(request, pk: int, sk: int, cid: str = None, passcode: str = None):
exam = get_object_or_404(Exam, pk=pk)
if not exam.active:
return exam_inactive(request, context={"exam": exam})
if cid is not None and not exam.check_cid_user(cid, passcode):
if not exam.check_cid_user(cid, passcode, request):
raise Http404("Error accessing exam")
if cid is not None:
@@ -329,7 +331,6 @@ def exam_take(request, pk, sk, cid=None, passcode=None):
else:
form = UserAnswerForm(instance=answer)
saved_answer = False
if answer is not None:
saved_answer = [answer.a, answer.b, answer.c, answer.d, answer.e]
@@ -346,6 +347,7 @@ def exam_take(request, pk, sk, cid=None, passcode=None):
"previous": previous,
"exam_length": exam_length,
"pos": pos,
"saved_answer": saved_answer,
"passcode": passcode,
"cid_user_exam": cid_user_exam,
},
@@ -413,6 +415,7 @@ GenericExamViews = ExamViews(Exam, Question, None, UserAnswer, "physics", "physi
GenericViews = GenericViewBase("physics", Question, UserAnswer, Exam)
class ExamCreate(ExamCreateBase):
model = Exam
form_class = ExamForm
@@ -427,7 +430,6 @@ class ExamDelete(AuthorOrCheckerRequiredMixin, ExamDeleteBase):
model = Exam
class ExamClone(AuthorOrCheckerRequiredMixin, ExamCloneMixin, ExamCreate):
"""Clone exam view"""
@@ -439,8 +441,6 @@ class ExamAuthorUpdate(
form_class = ExamAuthorForm
class QuestionView(
LoginRequiredMixin, SingleTableMixin, FilterView, AuthorOrCheckerRequiredMixin
):
@@ -456,7 +456,6 @@ class QuestionView(
return context
class UserAnswerView(AuthorOrCheckerRequiredMixin, LoginRequiredMixin, DetailView):
model = UserAnswer