diff --git a/anatomy/filters.py b/anatomy/filters.py index 16c1a910..92abd14f 100644 --- a/anatomy/filters.py +++ b/anatomy/filters.py @@ -6,5 +6,5 @@ from .models import AnatomyQuestion class AnatomyQuestionFilter(django_filters.FilterSet): class Meta: model = AnatomyQuestion - fields = ("question_type", "examination", "modality", "region", + fields = ("question_type", "exams", "examination", "modality", "region", "body_part", "created_date", "open_access", "author") diff --git a/anatomy/migrations/0012_exam_publish_results.py b/anatomy/migrations/0012_exam_publish_results.py new file mode 100644 index 00000000..d59828ed --- /dev/null +++ b/anatomy/migrations/0012_exam_publish_results.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.3 on 2020-12-10 23:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('anatomy', '0011_anatomyquestion_author'), + ] + + operations = [ + migrations.AddField( + model_name='exam', + name='publish_results', + field=models.BooleanField(default=True, help_text='If an exams results should be available'), + ), + ] diff --git a/anatomy/models.py b/anatomy/models.py index 2a196336..9dd82222 100644 --- a/anatomy/models.py +++ b/anatomy/models.py @@ -258,6 +258,10 @@ class Exam(models.Model): help_text="If an exam should be available", default=True ) + publish_results = models.BooleanField( + help_text="If an exams results should be available", default=True + ) + recreate_json = models.BooleanField( help_text="If the json cache needs updating", default=False ) diff --git a/anatomy/static/css/anatomy.css b/anatomy/static/css/anatomy.css index f1f04b18..65b6f988 100644 --- a/anatomy/static/css/anatomy.css +++ b/anatomy/static/css/anatomy.css @@ -300,4 +300,12 @@ img.uploading:hover { .user-answer-li { padding-top: 10px; +} + +.parent-help:hover .help-text { + opacity: 50%; +} + +.parent-help .help-text { + opacity: 0%; } \ No newline at end of file diff --git a/anatomy/tables.py b/anatomy/tables.py index b041a542..2a262ab4 100644 --- a/anatomy/tables.py +++ b/anatomy/tables.py @@ -21,6 +21,6 @@ class AnatomyQuestionTable(tables.Table): class Meta: model = AnatomyQuestion template_name = "django_tables2/bootstrap4.html" - fields = ("question_type", "description", "examination", "modality", "region", + fields = ("question_type", "exams", "description", "examination", "modality", "region", "body_part", "created_date", "open_access", "author") sequence = ("view", ) \ No newline at end of file diff --git a/anatomy/templates/anatomy/exam_overview.html b/anatomy/templates/anatomy/exam_overview.html index 7870d1cc..b51a1285 100644 --- a/anatomy/templates/anatomy/exam_overview.html +++ b/anatomy/templates/anatomy/exam_overview.html @@ -7,8 +7,11 @@

Exam: {{ exam.name }}

This exam has {{question_number}} questions. -
- Exam active: +
+ Exam active: [When checked the exam will be available to take in the test system] +
+
+ Publish results: [When checked the exam results will be available on this site]

@@ -57,6 +60,30 @@ console.log('[Done]'); }) }) + $("#exam-publish-results-switch").on("change", function () { + $.ajax({ + url: "{% url 'anatomy:exam_toggle_results_published' pk=exam.pk %}", + data: { + csrfmiddlewaretoken: "{{ csrf_token }}", + publish_results: this.checked // true if checked else false + }, + type: "POST", + dataType: "json", + }) + // $.ajax().done(), $.ajax().fail(), $ajax().always() are upto you. Add/change accordingly + .done(function (data) { + console.log(data); + + if (data.status == "success") { + toastr.info('Publish results state changed.') + } + // show some message according to the response. + // For eg. A message box showing that the status has been changed + }) + .always(function () { + console.log('[Done]'); + }) + }) }); {% endblock %} \ No newline at end of file diff --git a/anatomy/urls.py b/anatomy/urls.py index 0c174fd2..9d590a47 100644 --- a/anatomy/urls.py +++ b/anatomy/urls.py @@ -23,6 +23,7 @@ urlpatterns = [ path("exam//scores//", views.exam_scores_cid_user, name="exam_scores_cid_user"), path("exam//toggle_active", views.exam_toggle_active, name="exam_toggle_active"), + path("exam//toggle_results_published", views.exam_toggle_results_published, name="exam_toggle_results_published"), path("exam/submit", views.postExamAnswers, name="exam_answers_submit"), path("exam/", views.exam_list, name="exam_list"), path("exam/json/", views.active_exams, name="active_exams"), diff --git a/anatomy/views.py b/anatomy/views.py index fbd853c6..7f4dfd77 100644 --- a/anatomy/views.py +++ b/anatomy/views.py @@ -457,6 +457,19 @@ def mark(request, pk, sk): }, ) +def exam_toggle_results_published(request, pk): + if request.is_ajax() and request.method=='POST': + + exam = get_object_or_404(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(request, pk): if request.is_ajax() and request.method=='POST': @@ -664,6 +677,10 @@ def exam_scores_cid_user(request, pk, sk): answer_score = user_answer.get_answer_score() correct_answer = q.GetPrimaryAnswer() + + if not exam.publish_results: + correct_answer = "*****" + answer_score = 0 answers.append(ans) answers_marks.append(answer_score) answers_and_marks.append((ans, answer_score, correct_answer))