This commit is contained in:
Ross
2021-02-06 22:45:38 +00:00
parent 761354525d
commit 3712cf15fc
6 changed files with 160 additions and 96 deletions
+6 -6
View File
@@ -19,19 +19,19 @@ urlpatterns = [
path("exam/<int:pk>/mark", views.mark_overview, name="mark_overview"), path("exam/<int:pk>/mark", views.mark_overview, name="mark_overview"),
path("exam/<int:pk>/<int:sk>/", views.exam_take, name="exam_take"), path("exam/<int:pk>/<int:sk>/", views.exam_take, name="exam_take"),
path("exam/<int:pk>/question/<int:sk>/", views.exam_question_detail, name="exam_question_detail"), path("exam/<int:pk>/question/<int:sk>/", views.exam_question_detail, name="exam_question_detail"),
path("exam/<int:pk>/", views.exam_overview, name="exam_overview"), path("exam/<int:pk>/", views.AnatomyExamViews.exam_overview, name="exam_overview"),
path("exam/<int:pk>/json_edit", views.exam_json_edit, name="exam_json_edit"), path("exam/<int:pk>/json_edit", views.exam_json_edit, name="exam_json_edit"),
path("exam/<int:pk>/scores", views.exam_scores_cid, path("exam/<int:pk>/scores", views.exam_scores_cid,
name="exam_scores_cid"), name="exam_scores_cid"),
path("exam/<int:pk>/scores/<int:sk>/", views.exam_scores_cid_user, path("exam/<int:pk>/scores/<int:sk>/", views.exam_scores_cid_user,
name="exam_scores_cid_user"), name="exam_scores_cid_user"),
path("exam/<int:pk>/toggle_active", views.exam_toggle_active, name="exam_toggle_active"), path("exam/<int:pk>/toggle_active", views.AnatomyExamViews.exam_toggle_active, name="exam_toggle_active"),
path("exam/<int:pk>/toggle_results_published", views.exam_toggle_results_published, name="exam_toggle_results_published"), path("exam/<int:pk>/toggle_results_published", views.AnatomyExamViews.exam_toggle_results_published, name="exam_toggle_results_published"),
path("exam/submit", views.postExamAnswers, name="exam_answers_submit"), path("exam/submit", views.postExamAnswers, name="exam_answers_submit"),
path("exam/", views.exam_list, name="exam_list"), path("exam/", views.AnatomyExamViews.exam_list, name="exam_list"),
path("exam/json/", views.active_exams, name="active_exams"), path("exam/json/", views.AnatomyExamViews.active_exams, name="active_exams"),
path("exam/json/<int:pk>", views.exam_json, name="exam_json"), 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"), path("exam/json/<int:pk>/recreate", views.AnatomyExamViews.exam_json_recreate, name="exam_json_recreate"),
#path("cid/<int:pk>", views.cid_scores, name="cid_scores"), #path("cid/<int:pk>", views.cid_scores, name="cid_scores"),
#path("cid/", views.cid_selector, name="cid_selector"), #path("cid/", views.cid_selector, name="cid_selector"),
path("ajax/exam/flag/", views.flag_question, name="flag_question"), path("ajax/exam/flag/", views.flag_question, name="flag_question"),
+60 -85
View File
@@ -44,6 +44,7 @@ from .models import (
# IncorrectAnswers, # IncorrectAnswers,
) )
from generic.models import Examination from generic.models import Examination
from generic.views import ExamViews
from .tables import AnatomyQuestionTable from .tables import AnatomyQuestionTable
from .filters import AnatomyQuestionFilter from .filters import AnatomyQuestionFilter
@@ -150,31 +151,6 @@ def answer_question(request, pk):
) )
@login_required
def exam_list(request):
exams = Exam.objects.all()
return render(request, "anatomy/exam_list.html", {"exams": exams})
@login_required
def exam_overview(request, pk):
print(type(pk))
#print(Exam.objects.all())
#exams = Exam.objects.all()
#print("test", Exam.objects.all().get(id=pk))
exam = get_object_or_404(Exam, pk=pk)
print("exam", exam)
questions = exam.exam_questions.all()
question_number = len(questions)
return render(
request,
"anatomy/exam_overview.html",
{"exam": exam, "questions": questions, "question_number": question_number},
)
@login_required @login_required
def exam_take(request, pk, sk): def exam_take(request, pk, sk):
@@ -511,57 +487,66 @@ def mark(request, pk, sk):
}, },
) )
AnatomyExamViews = ExamViews(Exam, "anatomy", "anatomy")
def exam_toggle_results_published(request, pk): # def exam_toggle_results_published(request, pk):
if request.is_ajax() and request.method == "POST": # if request.is_ajax() and request.method == "POST":
#
exam = get_object_or_404(Exam, pk=pk) # exam = get_object_or_404(Exam, pk=pk)
#
exam.publish_results = ( # exam.publish_results = (
True if request.POST.get("publish_results") == "true" else False # True if request.POST.get("publish_results") == "true" else False
) # )
exam.save() # exam.save()
data = {"status": "success", "publish_results": exam.publish_results} # data = {"status": "success", "publish_results": exam.publish_results}
return JsonResponse(data, status=200) # return JsonResponse(data, status=200)
else: # else:
data = {"status": "error"} # data = {"status": "error"}
return JsonResponse(data, status=400) # return JsonResponse(data, status=400)
#
#
def exam_toggle_active(request, pk): # def exam_toggle_active(request, pk):
if request.is_ajax() and request.method == "POST": # if request.is_ajax() and request.method == "POST":
#
exam = get_object_or_404(Exam, pk=pk) # exam = get_object_or_404(Exam, pk=pk)
#
exam.active = True if request.POST.get("active") == "true" else False # exam.active = True if request.POST.get("active") == "true" else False
exam.save() # exam.save()
data = {"status": "success", "active": exam.active} # data = {"status": "success", "active": exam.active}
return JsonResponse(data, status=200) # return JsonResponse(data, status=200)
else: # else:
data = {"status": "error"} # data = {"status": "error"}
return JsonResponse(data, status=400) # return JsonResponse(data, status=400)
#
#
def active_exams(request, json=True): # def active_exams(request, json=True):
exams = Exam.objects.all() # exams = Exam.objects.all()
#
active_exams = {"exams": []} # active_exams = {"exams": []}
#
for exam in exams: # for exam in exams:
if exam.active: # if exam.active:
active_exams["exams"].append( # active_exams["exams"].append(
{ # {
"name": exam.get_exam_name(), # "name": exam.get_exam_name(),
"url": request.build_absolute_uri(exam.get_json_url()), # "url": request.build_absolute_uri(exam.get_json_url()),
"type": "anatomy", # "type": "anatomy",
} # }
) # )
#
if json == False: # if json == False:
return active_exams["exams"] # return active_exams["exams"]
#
return JsonResponse(active_exams) # return JsonResponse(active_exams)
#
# @login_required
# def exam_json_recreate(request, pk):
# exam = get_object_or_404(Exam, pk=pk)
#
# exam.recreate_json = True
# exam.save()
#
# return redirect("anatomy:exam_overview", pk=pk)
def exam_json(request, pk): def exam_json(request, pk):
@@ -614,16 +599,6 @@ def exam_json(request, pk):
return JsonResponse(exam_json) return JsonResponse(exam_json)
@login_required
def exam_json_recreate(request, pk):
exam = get_object_or_404(Exam, pk=pk)
exam.recreate_json = True
exam.save()
return redirect("anatomy:exam_overview", pk=pk)
@login_required @login_required
def exam_scores_cid(request, pk): def exam_scores_cid(request, pk):
exam = get_object_or_404(Exam, pk=pk) exam = get_object_or_404(Exam, pk=pk)
+90 -1
View File
@@ -1,4 +1,4 @@
from django.shortcuts import render from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib.auth.decorators import login_required, user_passes_test
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
@@ -39,3 +39,92 @@ def get_examination_id(request):
return HttpResponse(json.dumps(data), content_type="application/json") return HttpResponse(json.dumps(data), content_type="application/json")
return HttpResponse("/") return HttpResponse("/")
class ExamViews:
def __init__(self, exam, app, question_type):
self.Exam = exam
self.app_name = app
self.question_type = question_type
def exam_toggle_results_published(self, request, pk):
if request.is_ajax() and request.method == "POST":
exam = get_object_or_404(self.Exam, pk=pk)
exam.publish_results = (
True if request.POST.get("publish_results") == "true" else False
)
exam.save()
data = {"status": "success", "publish_results": exam.publish_results}
return JsonResponse(data, status=200)
else:
data = {"status": "error"}
return JsonResponse(data, status=400)
def exam_toggle_active(self, request, pk):
if request.is_ajax() and request.method == "POST":
exam = get_object_or_404(self.Exam, pk=pk)
exam.active = True if request.POST.get("active") == "true" else False
exam.save()
data = {"status": "success", "active": exam.active}
return JsonResponse(data, status=200)
else:
data = {"status": "error"}
return JsonResponse(data, status=400)
def active_exams(self, request, json=True):
exams = self.Exam.objects.all()
active_exams = {"exams": []}
for exam in exams:
if exam.active:
active_exams["exams"].append(
{
"name": exam.get_exam_name(),
"url": request.build_absolute_uri(exam.get_json_url()),
"type": self.question_type,
}
)
if json == False:
return active_exams["exams"]
return JsonResponse(active_exams)
@login_required
def exam_json_recreate(self, request, pk):
exam = get_object_or_404(self.Exam, pk=pk)
exam.recreate_json = True
exam.save()
return redirect("{}:exam_overview".format(self.app_name), pk=pk)
@login_required
def exam_list(self, request):
exams = self.Exam.objects.all()
return render(request, "{}/exam_list.html".format(self.app_name), {"exams": exams})
@login_required
def exam_overview(self, request, pk):
#print(Exam.objects.all())
#exams = Exam.objects.all()
#print("test", Exam.objects.all().get(id=pk))
exam = get_object_or_404(self.Exam, pk=pk)
questions = exam.exam_questions.all()
question_number = len(questions)
return render(
request,
"{}/exam_overview.html".format(self.app_name),
{"exam": exam, "questions": questions, "question_number": question_number},
)
+1 -1
View File
@@ -4,7 +4,7 @@ from .models import Long
def user_is_author_or_long_checker(function): def user_is_author_or_long_checker(function):
def wrap(request, *args, **kwargs): def wrap(request, *args, **kwargs):
long = Long.objects.get(pk=kwargs['pk']) long = Long.objects.get(pk=kwargs['pk'])
if request.user in long.author.all() or request.user.groups.filter(name='long_checker').exists(): if request.user in long.author.all() or request.user.groups.filter(name='long_checker').exists() or request.user.is_superuser:
return function(request, *args, **kwargs) return function(request, *args, **kwargs)
else: else:
raise PermissionDenied raise PermissionDenied
+1 -1
View File
@@ -19,7 +19,7 @@
<ol id="full-question-list"> <ol id="full-question-list">
{% for question in questions.all %} {% for question in questions.all %}
<li> <li data-question-id={{question.pk}}>
History: {{ question.history}} History: {{ question.history}}
<br /> <br />
{% for series in question.series.all %} {% for series in question.series.all %}
+2 -2
View File
@@ -30,7 +30,7 @@ from anatomy.models import Exam as AnatomyExam
from rapids.models import CidUserAnswer as RapidsCidUserAnswer from rapids.models import CidUserAnswer as RapidsCidUserAnswer
from rapids.models import Exam as RapidsExam from rapids.models import Exam as RapidsExam
from anatomy.views import active_exams as active_anatomy_exams, postExamAnswers as postAnatomyExamAnswers from anatomy.views import AnatomyExamViews as AnatomyExamViews, postExamAnswers as postAnatomyExamAnswers
from rapids.views import active_exams as active_rapid_exams, postExamAnswers as postRapidExamAnswers from rapids.views import active_exams as active_rapid_exams, postExamAnswers as postRapidExamAnswers
@@ -88,7 +88,7 @@ def cid_scores(request, pk):
) )
def active_exams(request): def active_exams(request):
anatomy_exams = active_anatomy_exams(request, False) anatomy_exams = AnatomyExamViews.active_exams(request, False)
rapid_exams = active_rapid_exams(request, False) rapid_exams = active_rapid_exams(request, False)
exams = [] exams = []