From 1ecd71d7995af82904e9bf9e7f917030e2c26821 Mon Sep 17 00:00:00 2001 From: Ross Date: Sun, 12 Dec 2021 12:40:15 +0000 Subject: [PATCH] . --- .../templates/anatomy/exam_scores_user.html | 102 +++++----- anatomy/urls.py | 2 +- anatomy/views.py | 184 +++++++++--------- longs/templates/longs/exam_scores_user.html | 143 +++++++------- longs/urls.py | 20 +- longs/views.py | 3 +- .../templates/physics/exam_scores_user.html | 3 +- physics/views.py | 7 +- rapids/templates/rapids/exam_scores_user.html | 100 +++++----- rapids/urls.py | 2 +- rapids/views.py | 3 +- sbas/templates/sbas/exam_scores_user.html | 8 +- sbas/urls.py | 6 +- sbas/views.py | 26 ++- 14 files changed, 320 insertions(+), 289 deletions(-) diff --git a/anatomy/templates/anatomy/exam_scores_user.html b/anatomy/templates/anatomy/exam_scores_user.html index a2021ff8..bf95af5d 100644 --- a/anatomy/templates/anatomy/exam_scores_user.html +++ b/anatomy/templates/anatomy/exam_scores_user.html @@ -1,62 +1,62 @@ {% extends 'anatomy/base.html' %} {% block content %} -
-
HIDE/SHOW
-
- Question No question loaded
-
- -
-
-
Answers:
+
+
HIDE/SHOW
+
+ Question No question loaded
+
+ +
+
Answers:
-
-

Exam: {{ exam.name }}

-

Candidate: {{ cid }}

- Answers: -
    {% for ans, score, correct_answer in answers_and_marks %} -
  • Question {{forloop.counter}} - Correct answer: {{ correct_answer }}
  • - -
    {{ans}}
    ({{score}}) -
    - View +
+
+

Exam: {{ exam.name }}

+

Candidate: {{ cid }}

+ Answers: +
    {% for ans, score, correct_answer in answers_and_marks %} +
  • Question {{forloop.counter}} - Correct answer: {{ + correct_answer }}
  • + +
    {{ans}}
    ({{score}}) +
    + View {% endfor %} -
-
Total mark: {{ total_score }} / {{max_score}} - + +
Total mark: {{ total_score }} / {{max_score}} + +
{% endblock %} {% block js %} - -{% endblock %} + }); + +{% endblock %} \ No newline at end of file diff --git a/anatomy/urls.py b/anatomy/urls.py index 74ea6c8e..6e84a2d7 100644 --- a/anatomy/urls.py +++ b/anatomy/urls.py @@ -76,7 +76,7 @@ urlpatterns = [ name="exam_scores_cid", ), path( - "exam//scores//", + "exam//scores///", views.exam_scores_cid_user, name="exam_scores_cid_user", ), diff --git a/anatomy/views.py b/anatomy/views.py index 3168d23c..36ef35e4 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -134,89 +134,89 @@ def answer_question(request, pk): ) -@login_required -def exam_take(request, pk, sk): - """ - Allows taking of the exam on the django server (when logged in) - - No longer used (deprecated in favour of using RTS) - """ - exam = get_object_or_404(Exam, pk=pk) - - questions = exam.exam_questions.all() - - try: - question = questions[sk] - except IndexError: - raise Http404("Exam question does not exist") - - n = sk - - question_details = { - "total": len(questions), - "current": n + 1, - } - - # Get data for flagged - # answered_questions = UserAnswer.objects.filter(user=request.user).values_list("question__pk", flat=True) - user_answer_data = UserAnswer.objects.filter(user=request.user).values_list( - "question__pk", "answer", "flagged" - ) - # flagged_questions = UserAnswer.objects.filter(user=request.user, flagged=True).values_list("question__pk", flat=True) - # flagged_questions I= UserAnswer.filter(user=request.user, ).values_list("question__pk", flat=True) - - answered_questions = set() - flagged_questions = set() - for ans_pk, answer, flagged in user_answer_data: - if len(answer.strip()) > 0: - answered_questions.add(ans_pk) - if flagged: - flagged_questions.add(ans_pk) - - # u = question.user_answers - answer = question.user_answers.filter( - user=request.user - ).first() # .filter(user=User) - if request.method == "POST": - if answer: - form = AnatomyAnswerForm(request.POST, instance=answer) - else: - form = AnatomyAnswerForm(request.POST) - if form.is_valid(): - answer = form.save(commit=False) - answer.user = request.user - answer.question = question - # answer.published_date = timezone.now() - answer.save() - if "next" in request.POST: - return redirect("anatomy:exam_take", pk=pk, sk=n + 1) - elif "previous" in request.POST: - return redirect("anatomy:exam_take", pk=pk, sk=n - 1) - else: - form = AnatomyAnswerForm(instance=answer) - return render( - request, - "anatomy/exam.html", - { - "exam": exam, - "form": form, - "question": question, - "question_details": question_details, - "questions": questions, - "flagged_questions": flagged_questions, - "answered_questions": answered_questions, - "answer": answer, - }, - ) +#@login_required +#def exam_take(request, pk, sk): +# """ +# Allows taking of the exam on the django server (when logged in) +# +# No longer used (deprecated in favour of using RTS) +# """ +# exam = get_object_or_404(Exam, pk=pk) +# +# questions = exam.exam_questions.all() +# +# try: +# question = questions[sk] +# except IndexError: +# raise Http404("Exam question does not exist") +# +# n = sk +# +# question_details = { +# "total": len(questions), +# "current": n + 1, +# } +# +# # Get data for flagged +# # answered_questions = UserAnswer.objects.filter(user=request.user).values_list("question__pk", flat=True) +# user_answer_data = UserAnswer.objects.filter(user=request.user).values_list( +# "question__pk", "answer", "flagged" +# ) +# # flagged_questions = UserAnswer.objects.filter(user=request.user, flagged=True).values_list("question__pk", flat=True) +# # flagged_questions I= UserAnswer.filter(user=request.user, ).values_list("question__pk", flat=True) +# +# answered_questions = set() +# flagged_questions = set() +# for ans_pk, answer, flagged in user_answer_data: +# if len(answer.strip()) > 0: +# answered_questions.add(ans_pk) +# if flagged: +# flagged_questions.add(ans_pk) +# +# # u = question.user_answers +# answer = question.user_answers.filter( +# user=request.user +# ).first() # .filter(user=User) +# if request.method == "POST": +# if answer: +# form = AnatomyAnswerForm(request.POST, instance=answer) +# else: +# form = AnatomyAnswerForm(request.POST) +# if form.is_valid(): +# answer = form.save(commit=False) +# answer.user = request.user +# answer.question = question +# # answer.published_date = timezone.now() +# answer.save() +# if "next" in request.POST: +# return redirect("anatomy:exam_take", pk=pk, sk=n + 1) +# elif "previous" in request.POST: +# return redirect("anatomy:exam_take", pk=pk, sk=n - 1) +# else: +# form = AnatomyAnswerForm(instance=answer) +# return render( +# request, +# "anatomy/exam.html", +# { +# "exam": exam, +# "form": form, +# "question": question, +# "question_details": question_details, +# "questions": questions, +# "flagged_questions": flagged_questions, +# "answered_questions": answered_questions, +# "answer": answer, +# }, +# ) -def flag_question(request): - pk = request.GET.get("pk", None) - ans = UserAnswer.objects.filter(user=request.user, question__pk=pk).first() - ans.flagged = not ans.flagged - ans.save() - data = {"flagged": ans.flagged} - return JsonResponse(data) +#def flag_question(request): +# pk = request.GET.get("pk", None) +# ans = UserAnswer.objects.filter(user=request.user, question__pk=pk).first() +# ans.flagged = not ans.flagged +# ans.save() +# data = {"flagged": ans.flagged} +# return JsonResponse(data) def loadJsonAnswer(answer): @@ -329,8 +329,7 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): except IndexError: raise Http404("Exam question does not exist") - - #unmarked_user_answers = question.get_unmarked_user_answers() + # unmarked_user_answers = question.get_unmarked_user_answers() if request.method == "POST": @@ -383,9 +382,9 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): else: form = MarkAnatomyQuestionForm() - #correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) - #half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) - #incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) + # correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) + # half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) + # incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) correct_answers = [] half_mark_answers = [] @@ -395,13 +394,14 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): unmarked_user_answers = [] if review: - unmarked_user_answers = question.get_user_answers(exam_pk=exam_pk, include_normal=False) + unmarked_user_answers = question.get_user_answers( + exam_pk=exam_pk, include_normal=False + ) elif unmarked_exam_answers_only: unmarked_user_answers = question.get_unmarked_user_answers(exam_pk=exam_pk) else: unmarked_user_answers = question.get_unmarked_user_answers() - if not unmarked_exam_answers_only: correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT) half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK) @@ -532,6 +532,7 @@ def exam_scores_cid(request, pk): "anatomy/exam_scores.html", { "cids": cids, + "passcode": passcode, "exam": exam, "unmarked": unmarked, "questions": questions, @@ -551,14 +552,15 @@ def exam_scores_cid(request, pk): ) -def exam_scores_cid_user(request, pk, sk): +def exam_scores_cid_user(request, pk, sk, passcode): exam = get_object_or_404(Exam, pk=pk) if not exam.exam_mode: raise Http404("Packet not in exam mode") - # TODO:Need some kind of test for cid cid = sk + if not exam.check_cid_user(cid, passcode): + raise Http404("Error accessing exam") questions = exam.exam_questions.all() @@ -609,6 +611,7 @@ def exam_scores_cid_user(request, pk, sk): { "exam": exam, "cid": cid, + "passcode": passcode, "questions": questions, "answers": answers, "answers_marks": answers_marks, @@ -1051,5 +1054,4 @@ class StructureAutocomplete(autocomplete.Select2QuerySetView): except FieldError: return Structure.objects.none() - return qs diff --git a/longs/templates/longs/exam_scores_user.html b/longs/templates/longs/exam_scores_user.html index 2c1999ab..abd2290c 100644 --- a/longs/templates/longs/exam_scores_user.html +++ b/longs/templates/longs/exam_scores_user.html @@ -1,82 +1,83 @@ {% extends 'longs/base.html' %} {% block content %} -
-
HIDE/SHOW
-
- Question 1
- History:
- Images: -
-
+
+
HIDE/SHOW
+
+ Question 1
+ History:
+ Images: +
-
-

Exam: {{ exam.name }}

-

Candidate: {{ cid }}

- Scores: -
    {% for score in answers_marks %} -
  • Question {{forloop.counter}}
  • - -
    {{ans}}
    ({{score}})
    +
+
+

Exam: {{ exam.name }}

+

Candidate: {{ cid }}

+ Scores: +
    {% for score in answers_marks %} +
  • Question {{forloop.counter}}
  • + +
    {{ans}}
    ({{score}}) +
    {% endfor %} -
-
Total mark: {{ total_score }} / {{max_score}} -
Normalised score: {{normalised_score}} -
-

Answers

-
    {% for a,b,c,d,e in answer_text %} -
  • Question {{forloop.counter}} +
    Total mark: {{ total_score }} / {{max_score}} +
    Normalised score: {{normalised_score}} +
    +

    Answers

    +
      {% for a,b,c,d,e in answer_text %} +
    • Question {{forloop.counter}} View
    • -
        -
      • Observation
        -
        {{a}}
        -
      • -
      • Interpretation
        -
        {{b}}
        -
      • -
      • Principle Diagnosis
        -
        {{c}}
        -
      • -
      • Differential Diagnosis
        -
        {{d}}
        -
      • -
      • Management
        -
        {{e}}
        -
      • -
      - {% endfor %} +
        +
      • Observation
        +
        {{a}}
        +
      • +
      • Interpretation
        +
        {{b}}
        +
      • +
      • Principle Diagnosis
        +
        {{c}}
        +
      • +
      • Differential Diagnosis
        +
        {{d}}
        +
      • +
      • Management
        +
        {{e}}
        +
      + {% endfor %} +
    -
    -
+ +
{% endblock %} {% block js %} - -{% endblock %} + }); + +{% endblock %} \ No newline at end of file diff --git a/longs/urls.py b/longs/urls.py index 9313e588..bcc0169c 100755 --- a/longs/urls.py +++ b/longs/urls.py @@ -66,9 +66,21 @@ urlpatterns = [ views.question_review, name="question_review", ), - path("exam////mark", views.mark_answer, name="mark_answer"), - path("exam////mark_override", views.mark_answer_override, name="mark_answer_override"), - path("exam///mark", views.mark_question_overview, name="mark_question_overview"), + path( + "exam////mark", + views.mark_answer, + name="mark_answer", + ), + path( + "exam////mark_override", + views.mark_answer_override, + name="mark_answer_override", + ), + path( + "exam///mark", + views.mark_question_overview, + name="mark_question_overview", + ), path("exam//mark", views.LongExamViews.mark_overview, name="mark_overview"), # path("exam///", views.exam_take, name="exam_take"), path( @@ -89,7 +101,7 @@ urlpatterns = [ ), path("exam//scores", views.exam_scores_cid, name="exam_scores_cid"), path( - "exam//scores//", + "exam//scores///", views.exam_scores_cid_user, name="exam_scores_cid_user", ), diff --git a/longs/views.py b/longs/views.py index d2450be1..37f788a0 100755 --- a/longs/views.py +++ b/longs/views.py @@ -1032,7 +1032,7 @@ def exam_scores_cid(request, pk): ) -def exam_scores_cid_user(request, pk, sk): +def exam_scores_cid_user(request, pk, sk, passcode): exam = get_object_or_404(Exam, pk=pk) # TODO:Need some kind of test for cid @@ -1104,6 +1104,7 @@ def exam_scores_cid_user(request, pk, sk): { "exam": exam, "cid": cid, + "passcode" : passcode, "questions": questions, # "answers": answers, "answers_marks": answers_marks, diff --git a/physics/templates/physics/exam_scores_user.html b/physics/templates/physics/exam_scores_user.html index f8d94c06..2900736e 100644 --- a/physics/templates/physics/exam_scores_user.html +++ b/physics/templates/physics/exam_scores_user.html @@ -10,7 +10,8 @@
  • Question {{forloop.counter}} - {{ question.stem }}
    1. {% for q, a, score, correct_answer in ans %} -
    2. {{q}}: Correct answer: {{correct_answer}}
      {{a}} (Score: {{score}})
    3. +
    4. {{q}}: Correct answer: {{correct_answer}}
      {{a}} (Score: + {{score}})
    5. {% endfor %}
    {% endfor %} diff --git a/physics/views.py b/physics/views.py index b589ad9b..2c3357d8 100644 --- a/physics/views.py +++ b/physics/views.py @@ -88,7 +88,7 @@ def active_exams(request): @login_required -def exam_scores_cid(request, pk, passcode): +def exam_scores_cid(request, pk): exam = get_object_or_404(Exam, pk=pk) questions = exam.exam_questions.all() @@ -170,7 +170,6 @@ def exam_scores_cid(request, pk, passcode): "physics/exam_scores.html", { "cids": cids, - "passcode": passcode, "exam": exam, "unmarked": unmarked, "questions": questions, @@ -281,7 +280,7 @@ def exam_start(request, pk): ) -def exam_finish(request, pk, cid, passcode=None): +def exam_finish(request, pk, cid, passcode): exam = get_object_or_404(Exam, pk=pk) if not exam.check_cid_user(cid, passcode): @@ -322,7 +321,7 @@ def exam_finish(request, pk, cid, passcode=None): ) -def exam_take(request, pk, sk, cid, passcode=None): +def exam_take(request, pk, sk, cid, passcode): exam = get_object_or_404(Exam, pk=pk) diff --git a/rapids/templates/rapids/exam_scores_user.html b/rapids/templates/rapids/exam_scores_user.html index 79e84ef1..7fb60853 100644 --- a/rapids/templates/rapids/exam_scores_user.html +++ b/rapids/templates/rapids/exam_scores_user.html @@ -1,62 +1,62 @@ {% extends 'rapids/base.html' %} {% block content %} -
    -
    HIDE/SHOW
    -
    - Question 1 -
    -
    -
    Answers:
    +
    +
    HIDE/SHOW
    +
    + Question 1 +
    +
    Answers:
    -
    -

    Exam: {{ exam.name }}

    -

    Candidate: {{ cid }}

    - Answers: -
      {% for ans, score, correct_answer in answers_and_marks %} -
    • Question {{forloop.counter}} - Correct answer: {{ correct_answer }}
    • - -
      {{ans}}
      ({{score}}) -
      - View +
    +
    +

    Exam: {{ exam.name }}

    +

    Candidate: {{ cid }}

    + Answers: +
      {% for ans, score, correct_answer in answers_and_marks %} +
    • Question {{forloop.counter}} - Correct answer: {{ + correct_answer }}
    • + +
      {{ans}}
      ({{score}}) +
      + View {% endfor %} -
    -
    Total mark: {{ total_score }} / {{max_score}} -
    Normalised score: {{ normalised_score }} - + +
    Total mark: {{ total_score }} / {{max_score}} +
    Normalised score: {{ normalised_score }} + +
    {% endblock %} {% block js %} - -{% endblock %} + }); + +{% endblock %} \ No newline at end of file diff --git a/rapids/urls.py b/rapids/urls.py index e649027e..64beaa88 100755 --- a/rapids/urls.py +++ b/rapids/urls.py @@ -76,7 +76,7 @@ urlpatterns = [ name="exam_scores_cid", ), path( - "exam//scores//", + "exam//scores///", views.exam_scores_cid_user, name="exam_scores_cid_user", ), diff --git a/rapids/views.py b/rapids/views.py index 5e05c27e..a02271f1 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -846,7 +846,7 @@ def exam_scores_cid(request, pk): ) -def exam_scores_cid_user(request, pk, cid): +def exam_scores_cid_user(request, pk, cid, passcode): exam = get_object_or_404(Exam, pk=pk) if not exam.exam_mode: @@ -908,6 +908,7 @@ def exam_scores_cid_user(request, pk, cid): { "exam": exam, "cid": cid, + "passcode" : passcode, "questions": questions, "answers": answers, "answers_marks": answers_marks, diff --git a/sbas/templates/sbas/exam_scores_user.html b/sbas/templates/sbas/exam_scores_user.html index 89dacb80..5fb05f33 100644 --- a/sbas/templates/sbas/exam_scores_user.html +++ b/sbas/templates/sbas/exam_scores_user.html @@ -7,13 +7,15 @@ Answers:
      {% for question, a, score, correct_answer in answers_and_marks %} -
    • Question {{forloop.counter}} - {{ question.stem |safe}}
    • - Correct answer: {{correct_answer|safe}}
      {{a}} (Score: {{score}})
      +
    • Question + {{forloop.counter}} - {{ question.stem |safe}}
    • + Correct answer: {{correct_answer|safe}}
      {{a}} (Score: + {{score}})
      {% endfor %}

    Total mark: {{ total_score }} / {{max_score}}
    {% endblock %} \ No newline at end of file diff --git a/sbas/urls.py b/sbas/urls.py index e5384dae..a1090dae 100644 --- a/sbas/urls.py +++ b/sbas/urls.py @@ -14,9 +14,9 @@ urlpatterns = [ # path("question//update", views.QuestionUpdate.as_view(), name="anatomy_question_update"), # path("exam///mark", views.mark, name="mark"), # path("exam//mark", views.mark_overview, name="mark_overview"), - path("exam////take", views.exam_take, name="exam_take"), + path("exam/////take", views.exam_take, name="exam_take"), path("exam//start", views.exam_start, name="exam_start"), - path("exam///finish", views.exam_finish, name="exam_finish"), + path("exam////finish", views.exam_finish, name="exam_finish"), path("exam//", views.SbasExamViews.exam_overview, name="exam_overview"), path( "exam//scores", @@ -24,7 +24,7 @@ urlpatterns = [ name="exam_scores_cid", ), path( - "exam//scores//", + "exam//scores///", views.exam_scores_cid_user, name="exam_scores_cid_user", ), diff --git a/sbas/views.py b/sbas/views.py index a1c92955..70cdf187 100644 --- a/sbas/views.py +++ b/sbas/views.py @@ -179,7 +179,7 @@ def exam_scores_cid(request, pk): ) -def exam_scores_cid_user(request, pk, sk): +def exam_scores_cid_user(request, pk, sk, passcode): exam = get_object_or_404(Exam, pk=pk) # TODO:Need some kind of test for cid @@ -229,6 +229,7 @@ def exam_scores_cid_user(request, pk, sk): { "exam": exam, "cid": cid, + "passcode" : passcode, "questions": questions, "answers": answers, "answers_marks": answers_marks, @@ -253,9 +254,12 @@ def exam_start(request, pk): }, ) -def exam_finish(request, pk, cid): +def exam_finish(request, pk, cid, passcode): exam = get_object_or_404(Exam, pk=pk) + if not exam.check_cid_user(cid, passcode): + raise Http404("Error accessing exam") + questions = exam.exam_questions.all() answers = CidUserAnswer.objects.filter( @@ -286,17 +290,21 @@ def exam_finish(request, pk, cid): "question_answer_tuples": question_answer_tuples, "answer_count": answer_count, "exam_length": len(questions), + "passcode": passcode, }, ) -def exam_take(request, pk, sk, cid): +def exam_take(request, pk, sk, 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") + question = exam.exam_questions.all()[sk] exam_length = len(exam.exam_questions.all()) @@ -318,14 +326,17 @@ def exam_take(request, pk, sk, cid): answer.exam = exam # answer.published_date = timezone.now() answer.save() + + kwargs = {"pk": pk, "cid": cid, "passcode": passcode} + if "next" in request.POST: - return redirect("sbas:exam_take", pk=pk, sk=pos + 1, cid=cid) + return redirect("sbas:exam_take", sk=pos + 1, **kwargs) elif "previous" in request.POST: - return redirect("sbas:exam_take", pk=pk, sk=pos - 1, cid=cid) + return redirect("sbas:exam_take", sk=pos - 1, **kwargs) elif "finish" in request.POST: - return redirect("sbas:exam_finish", pk=pk, cid=cid) + return redirect("sbas:exam_finish", **kwargs) elif "goto" in request.POST: - return redirect("sbas:exam_take", pk=pk, sk=int(request.POST.get("goto")), cid=cid) + return redirect("sbas:exam_take", sk=int(request.POST.get("goto")), **kwargs) else: form = CidUserAnswerForm(instance=answer) @@ -354,6 +365,7 @@ def exam_take(request, pk, sk, cid): "exam_length": exam_length, "pos": pos, "saved_answer": saved_answer, + "passcode": passcode, }, )