switch to generic exam urls

This commit is contained in:
Ross
2022-07-04 19:00:38 +01:00
parent eb602616b8
commit 41991f1ebd
8 changed files with 315 additions and 451 deletions
+8 -101
View File
@@ -4,23 +4,21 @@ from rapids.models import Answer
from . import views
from django.views.decorators.cache import cache_page, cache_control
from generic.urls import generic_exam_urls, generic_view_urls
app_name = "rapids"
urlpatterns = [
# path('', views.question_list, name='question_list'),
path("", views.GenericExamViews.index, name="index"),
path("author/<int:pk>/", views.GenericViews.author_detail, name="author_detail"),
path("author/", views.GenericViews.author_list, name="author_list"),
#path("", views.GenericExamViews.index, name="index"),
#path("exam", generic_exam_urls(views.GenericExamViews), name="index"),
path("question_viewer", views.question_viewer, name="question_viewer"),
path("question/", views.RapidView.as_view(), name="rapid_view"),
path("question/hash", views.get_question_by_hash, name="rapid_question_by_hash"),
# path("unchecked/", views.unchecked_list, name="unchecked_list"),
# path("verified/<int:pk>/", views.verified_detail, name="verified_detail"),
path(
"question/<int:pk>/", views.GenericViews.question_detail, name="question_detail"
),
path("question/<int:pk>/json", views.question_json, name="question_json"),
path(
"question/<int:pk>/json/unbased",
@@ -42,110 +40,21 @@ urlpatterns = [
views.QuestionDelete.as_view(),
name="question_delete",
),
path(
"question/<int:pk>/user_answers",
views.GenericViews.question_user_answers,
name="question_user_answers",
),
path(
"question/<int:pk>/anon",
views.question_anonymise_dicom,
name="question_anonymise_dicom",
),
path(
"exam/<int:pk>/review",
views.GenericViews.question_review,
name="question_review",
),
path("exam/<int:exam_pk>/<int:sk>/mark", views.mark, name="mark"),
path("exam/<int:exam_pk>/<int:sk>/mark/all", views.mark_all, name="mark_all"),
path(
"exam/<int:exam_pk>/<int:sk>/mark/review", views.mark_review, name="mark_review"
),
path(
"exam/<int:pk>/mark", views.GenericExamViews.mark_overview, name="mark_overview"
),
# path("exam/<int:pk>/<int:sk>/", views.exam_take, name="exam_take"),
path(
"exam/<int:pk>/question/<int:sk>/",
views.GenericExamViews.exam_question_detail,
name="exam_question_detail",
),
path("exam/<int:pk>/", views.GenericExamViews.exam_overview, name="exam_overview"),
path("exam/<int:exam_id>/user/<int:user_id>", views.GenericExamViews.exam_user, name="exam_user"),
path("exam/<int:exam_id>/report/email", views.GenericExamViews.exam_report_email, name="exam_report_email"),
path("exam/<int:exam_id>/report/email_unsent", views.GenericExamViews.exam_report_email_unsent, name="exam_report_email_unsent"),
path("exam/<int:exam_id>/report/email/status", views.GenericExamViews.exam_report_email_status, name="exam_report_email_status"),
path("exam/<int:exam_id>/report/<int:user_id>", views.GenericExamViews.exam_user_report, name="exam_user_report"),
path("exam/<int:exam_id>/report/<int:user_id>/email", views.GenericExamViews.exam_user_report_email, name="exam_user_report_email"),
path("exam/<int:pk>/authors", views.ExamAuthorUpdate.as_view(), name="exam_authors"),
path(
"exam/<int:pk>/json_edit",
views.GenericExamViews.exam_json_edit,
name="exam_json_edit",
),
path(
"exam/<int:pk>/scores",
views.GenericExamViews.exam_scores_cid,
name="exam_scores_cid",
),
path(
"exam/<int:pk>/scores/refresh",
views.GenericExamViews.exam_scores_refresh,
# cache_page(60 * 1)(views.exam_scores_cid),
name="exam_scores_refresh",
),
path(
"exam/<int:pk>/scores/<int:cid>/<str:passcode>/",
views.exam_scores_cid_user,
name="exam_scores_cid_user",
),
path(
"exam/<int:pk>/scores/",
views.exam_scores_user,
name="exam_scores_user",
),
path(
"exam/<int:pk>/toggle_active",
views.GenericExamViews.exam_toggle_active,
name="exam_toggle_active",
),
path(
"exam/<int:pk>/toggle_results_published",
views.GenericExamViews.exam_toggle_results_published,
name="exam_toggle_results_published",
),
path(
"exam/submit",
views.GenericExamViews.postExamAnswers,
name="exam_answers_submit",
),
path("exam/", views.GenericExamViews.exam_list, name="exam_list"),
path("exam/all", views.GenericExamViews.exam_list_all, name="exam_list_all"),
path("exam/create", views.ExamCreate.as_view(), name="exam_create"),
path("exam/<int:exam_id>/clone", views.ExamClone.as_view(), name="exam_clone"),
path("exam/<int:exam_id>/cids", views.GenericExamViews.exam_cids, name="exam_cids"),
path("exam/<int:exam_id>/cids/edit", views.GenericExamViews.exam_cids_edit, name="exam_cids_edit"),
path("exam/<int:exam_id>/users/edit", views.GenericExamViews.exam_users_edit, name="exam_users_edit"),
path("exam/<int:pk>/update", views.ExamUpdate.as_view(), name="exam_update"),
path("exam/<int:pk>/delete", views.ExamDelete.as_view(), name="exam_delete"),
path("exam/json/", views.GenericExamViews.active_exams, name="active_exams"),
path("exam/json/<int:pk>", views.GenericExamViews.exam_json, name="exam_json"),
path(
"exam/json/<int:pk>/unbased",
views.GenericExamViews.exam_json_unbased,
name="exam_json_unbased",
),
path(
"exam/json/<int:pk>/<int:sk>/unbased",
views.GenericExamViews.exam_question_json_unbased,
name="exam_question_json_unbased",
),
path(
"exam/json/<int:pk>/recreate",
views.GenericExamViews.exam_json_recreate,
name="exam_json_recreate",
),
path("create/", views.RapidCreate.as_view(), name="rapid_create"),
path("create/exam/<int:pk>", views.RapidCreate.as_view(), name="rapid_create_exam"),
path(
@@ -185,11 +94,6 @@ urlpatterns = [
views.UserAnswerDelete.as_view(),
name="user_answer_delete",
),
path(
"user_answers/delete",
views.GenericViews.user_answer_delete_multiple,
name="user_answer_delete_multiple",
),
path(
"answer-autocomplete",
views.AnswerAutocomplete.as_view(
@@ -198,3 +102,6 @@ urlpatterns = [
name="answer-autocomplete",
),
]
urlpatterns.extend(generic_view_urls(views.GenericViews))
urlpatterns.extend(generic_exam_urls(views.GenericExamViews))
+1 -88
View File
@@ -686,93 +686,6 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False):
},
)
@login_required
def exam_scores_user(request, pk):
return exam_scores_cid_user(request, pk)
def exam_scores_cid_user(request, pk, cid=None, 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
questions = (
exam.exam_questions.all()
) # .prefetch_related("cid_user_answers", "answers")
# cid_user_answers = list(CidUserAnswer.objects.filter(cid=cid, exam__id=pk).prefetch_related("question"))
# cid_user_answers_q_map = {}
# for ans in cid_user_answers:
# cid_user_answers_q_map[ans.question] = ans
answers_and_marks = []
answers_marks = []
answers = []
view_all_results = False
if request.user.groups.filter(name="view_all_results").exists():
view_all_results = True
for q in questions:
# Get user answer
user_answer = q.cid_user_answers.filter(cid=cid, exam__id=pk).first()
# user_answer = cid_user_answers_q_map[q]
if not user_answer or user_answer is None:
# skip if no answer
answers_marks.append(0)
# answers.append("")
answer_score = 0
ans = "Not answered"
else:
if user_answer.normal:
ans = "Normal"
else:
ans = user_answer.answer
answer_score = user_answer.get_answer_score()
correct_answer = q.get_primary_answer()
if not exam.publish_results and not view_all_results:
correct_answer = "*****"
answer_score = 0
answers.append(ans)
answers_marks.append(answer_score)
answers_and_marks.append((ans, answer_score, correct_answer))
if "unmarked" in answers_marks:
answered = [i for i in answers_marks if type(i) == int]
total_score = sum(answered)
unmarked_number = len(answers_marks) - len(answered)
total_score = "{} ({} unmarked)".format(total_score, unmarked_number)
else:
total_score = sum(answers_marks)
normalised_score = normaliseScore(total_score)
max_score = len(questions) * 2
return render(
request,
"rapids/exam_scores_user.html",
{
"exam": exam,
"cid": cid,
"passcode": passcode,
"questions": questions,
"answers": answers,
"answers_marks": answers_marks,
"total_score": total_score,
"normalised_score": normalised_score,
"max_score": max_score,
"answers_and_marks": answers_and_marks,
"view_all_results": view_all_results,
},
)
class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
@@ -780,7 +693,7 @@ class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
success_url = reverse_lazy("rapids:rapid_view")
GenericExamViews = ExamViews(Exam, Rapid, Answer, CidUserAnswer, "rapids", "rapid")
GenericExamViews = ExamViews(Exam, Rapid, Answer, CidUserAnswer, "rapids", "rapid", normalise_score=normaliseScore)
class ExamCreate(ExamCreateBase):