unify generic exam views naming

This commit is contained in:
Ross
2021-12-19 10:08:07 +00:00
parent b823e0a897
commit 889db68a08
12 changed files with 194 additions and 133 deletions
+16 -8
View File
@@ -7,17 +7,25 @@ app_name = "sbas"
urlpatterns = [
# path('', views.question_list, name='question_list'),
path("", views.SbasExamViews.index, name="index"),
path("", views.GenericExamViews.index, name="index"),
path("question/", views.QuestionView.as_view(), name="question_view"),
path("question/<int:pk>/", views.question_detail, name="question_detail"),
# path("question/create/", views.QuestionCreate.as_view(), name="anatomy_question_create"),
# path("question/<int:pk>/update", views.QuestionUpdate.as_view(), name="anatomy_question_update"),
# path("exam/<int:pk>/<int:sk>/mark", views.mark, name="mark"),
# path("exam/<int:pk>/mark", views.mark_overview, name="mark_overview"),
path("exam/<int:pk>/<int:sk>/<str:cid>/<str:passcode>/take", views.exam_take, name="exam_take"),
path(
"exam/<int:pk>/<int:sk>/<str:cid>/<str:passcode>/take",
views.exam_take,
name="exam_take",
),
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"),
path("exam/<int:pk>/", views.SbasExamViews.exam_overview, name="exam_overview"),
path(
"exam/<int:pk>/<str:cid>/<str:passcode>/finish",
views.exam_finish,
name="exam_finish",
),
path("exam/<int:pk>/", views.GenericExamViews.exam_overview, name="exam_overview"),
path(
"exam/<int:pk>/scores",
cache_page(60 * 1)(views.exam_scores_cid),
@@ -30,16 +38,16 @@ urlpatterns = [
),
path(
"exam/<int:pk>/toggle_active",
views.SbasExamViews.exam_toggle_active,
views.GenericExamViews.exam_toggle_active,
name="exam_toggle_active",
),
path(
"exam/<int:pk>/toggle_results_published",
views.SbasExamViews.exam_toggle_results_published,
views.GenericExamViews.exam_toggle_results_published,
name="exam_toggle_results_published",
),
# path("exam/submit", views.PhysicsExamViews.postExamAnswers, name="exam_answers_submit"),
path("exam/", views.SbasExamViews.exam_list, name="exam_list"),
# path("exam/submit", views.GenericExamViews.postExamAnswers, name="exam_answers_submit"),
path("exam/", views.GenericExamViews.exam_list, name="exam_list"),
path("exam/available", views.active_exams, name="active_exams"),
# path("exam/json/<int:pk>", views.exam_json, name="exam_json"),
# path("exam/json/<int:pk>/recreate", views.exam_json_recreate, name="exam_json_recreate"),
+29 -15
View File
@@ -47,6 +47,7 @@ from django.core.exceptions import PermissionDenied
from .tables import QuestionTable, UserAnswerTable
from .filters import QuestionFilter, UserAnswerFilter
class AuthorOrCheckerRequiredMixin(object):
def get_object(self, *args, **kwargs):
obj = super().get_object(*args, **kwargs)
@@ -56,6 +57,7 @@ class AuthorOrCheckerRequiredMixin(object):
raise PermissionDenied() # or Http404
return obj
def question_list(request):
questions = Question.objects.all()
return render(request, "sbas/question_list.html", {"questions": questions})
@@ -109,9 +111,17 @@ def exam_scores_cid(request, pk):
s = q.cid_user_answers.filter(cid=cid, exam__id=pk).first()
if not s:
# skip if no answer
user_answers_marks[cid].append((0,0,0,0,0))
user_answers_marks[cid].append((0, 0, 0, 0, 0))
user_answers[cid].append(("", "", "", "", ""))
by_question[q].append((("", 0),("", 0),("", 0),("", 0),("", 0),))
by_question[q].append(
(
("", 0),
("", 0),
("", 0),
("", 0),
("", 0),
)
)
continue
ans = s.get_answer()
@@ -191,7 +201,6 @@ def exam_scores_cid_user(request, pk, sk, passcode):
answers_marks = []
answers = []
view_all_results = False
if request.user.groups.filter(name="view_all_results").exists():
view_all_results = True
@@ -200,7 +209,6 @@ def exam_scores_cid_user(request, pk, sk, passcode):
# Get user answer
user_answer = q.cid_user_answers.filter(cid=cid).first()
if user_answer is None:
answer_score = 0
ans = ""
@@ -229,7 +237,7 @@ def exam_scores_cid_user(request, pk, sk, passcode):
{
"exam": exam,
"cid": cid,
"passcode" : passcode,
"passcode": passcode,
"questions": questions,
"answers": answers,
"answers_marks": answers_marks,
@@ -254,6 +262,7 @@ def exam_start(request, pk):
},
)
def exam_finish(request, pk, cid, passcode):
exam = get_object_or_404(Exam, pk=pk)
@@ -262,8 +271,7 @@ def exam_finish(request, pk, cid, passcode):
questions = exam.exam_questions.all()
answers = CidUserAnswer.objects.filter(
cid=cid, exam=exam)
answers = CidUserAnswer.objects.filter(cid=cid, exam=exam)
answer_question_map = {}
for ans in answers:
@@ -311,8 +319,7 @@ def exam_take(request, pk, sk, cid, passcode):
pos = exam.get_question_index(question)
answer = question.cid_user_answers.filter(
cid=cid, exam=exam).first()
answer = question.cid_user_answers.filter(cid=cid, exam=exam).first()
if request.method == "POST":
if answer:
@@ -336,7 +343,9 @@ def exam_take(request, pk, sk, cid, passcode):
elif "finish" in request.POST:
return redirect("sbas:exam_finish", **kwargs)
elif "goto" in request.POST:
return redirect("sbas:exam_take", sk=int(request.POST.get("goto")), **kwargs)
return redirect(
"sbas:exam_take", sk=int(request.POST.get("goto")), **kwargs
)
else:
form = CidUserAnswerForm(instance=answer)
@@ -351,7 +360,6 @@ def exam_take(request, pk, sk, cid, passcode):
if answer is not None:
saved_answer = answer.answer
return render(
request,
"sbas/exam_take.html",
@@ -373,7 +381,11 @@ def exam_take(request, pk, sk, cid, passcode):
def loadJsonAnswer(answer):
pass
SbasExamViews = ExamViews(Exam, Question, CidUserAnswer, "sbas", "sbas", loadJsonAnswer)
GenericExamViews = ExamViews(
Exam, Question, CidUserAnswer, "sbas", "sbas", loadJsonAnswer
)
class QuestionView(LoginRequiredMixin, SingleTableMixin, FilterView):
model = Question
@@ -382,6 +394,7 @@ class QuestionView(LoginRequiredMixin, SingleTableMixin, FilterView):
filterset_class = QuestionFilter
class UserAnswerView(LoginRequiredMixin, DetailView):
model = CidUserAnswer
@@ -399,8 +412,9 @@ class UserAnswerDelete(SuperuserRequiredMixin, DeleteView):
template_name = "user_answer_delete.html"
success_url = reverse_lazy("sbas:user_answer_table_view")
#@user_passes_test(lambda u: u.is_superuser)
#def user_answer_delete_multiple(request):
# @user_passes_test(lambda u: u.is_superuser)
# def user_answer_delete_multiple(request):
# if request.is_ajax():
# print(request.POST["answer_ids"])
# answer_ids = json.loads(request.POST["answer_ids"])
@@ -412,4 +426,4 @@ class UserAnswerDelete(SuperuserRequiredMixin, DeleteView):
# return JsonResponse({"status": "error"})
GenericViews = GenericViewBase("sbas", Question, CidUserAnswer, Exam)
GenericViews = GenericViewBase("sbas", Question, CidUserAnswer, Exam)