diff --git a/rapids/templates/rapids/question_viewer.html b/rapids/templates/rapids/question_viewer.html new file mode 100755 index 00000000..80ca650a --- /dev/null +++ b/rapids/templates/rapids/question_viewer.html @@ -0,0 +1,19 @@ +
+
+ + + + +{% for id in ids %} + {{id}} +{% endfor %} + + + \ No newline at end of file diff --git a/rapids/urls.py b/rapids/urls.py index 258def87..5b5bb196 100755 --- a/rapids/urls.py +++ b/rapids/urls.py @@ -17,7 +17,13 @@ urlpatterns = [ # path("verified//", views.verified_detail, name="verified_detail"), path( "question//", views.GenericViews.question_detail, name="question_detail" - ), # path("question//json", views.question_json, name="question_json"), + ), + path("question//json", views.question_json, name="question_json"), + path( + "question//json/unbased", + views.question_json_unbased, + name="question_json_unbased", + ), path( "question//save_annotation", views.question_save_annotation, diff --git a/rapids/views.py b/rapids/views.py index e4342ec7..ad250261 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -102,9 +102,10 @@ def normaliseScore(score): return 7.5 elif score in [60]: return 8 - + return 4 + class AuthorOrCheckerRequiredMixin(object): def get_object(self, *args, **kwargs): obj = super().get_object(*args, **kwargs) @@ -114,6 +115,7 @@ class AuthorOrCheckerRequiredMixin(object): raise PermissionDenied() # or Http404 return obj + @login_required def rapid_split(request, pk): rapid = get_object_or_404(Rapid, pk=pk) @@ -129,7 +131,7 @@ def rapid_split(request, pk): old_abnormality = rapid.abnormality.all() old_region = rapid.region.all() old_examination = rapid.examination.all() - #old_site = rapid.site.all() + # old_site = rapid.site.all() old_author = rapid.author.all() if not images: @@ -143,7 +145,7 @@ def rapid_split(request, pk): rapid.abnormality.set(old_abnormality) rapid.region.set(old_region) rapid.examination.set(old_examination) - #rapid.site.set(old_site) + # rapid.site.set(old_site) rapid.author.set(old_author) images[n].rapid = rapid images[n].save() @@ -157,8 +159,6 @@ def rapid_split(request, pk): return render(request, "rapids/question_detail.html", {"question": rapid}) - - class RapidCreationDefaultView(LoginRequiredMixin, UpdateView): model = RapidCreationDefault form_class = RapidCreationDefaultForm @@ -195,7 +195,6 @@ class RapidCreationDefaultView(LoginRequiredMixin, UpdateView): # form.instance.author.add(self.request.user.id) - @login_required def rapid_clone(request, pk): new_item = get_object_or_404(Rapid, pk=pk) @@ -526,7 +525,7 @@ def loadJsonAnswer(answer): exam = get_object_or_404(Exam, pk=eid) - #if not exam.active: + # if not exam.active: # return False, JsonResponse( # {"success": False, "error": "No active exam: {}".format(eid)} # ) @@ -573,10 +572,12 @@ def loadJsonAnswer(answer): def mark_all(request, exam_pk, sk): return mark(request, exam_pk, sk, unmarked_exam_answers_only=False) + @login_required def mark_review(request, exam_pk, sk): return mark(request, exam_pk, sk, unmarked_exam_answers_only=False, review=True) + # @user_passes_test(user_is_admin, login_url="/accounts/login") @login_required def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): @@ -605,7 +606,6 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): except IndexError: raise Http404("Exam question does not exist") - if request.method == "POST": form = MarkRapidQuestionForm(request.POST) @@ -627,7 +627,7 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): ("correct", Answer.MarkOptions.CORRECT), ("half-correct", Answer.MarkOptions.HALF_MARK), ("incorrect", Answer.MarkOptions.INCORRECT), - ) + ) for status_string, status in to_run: for ans in marked_answers[status_string]: @@ -657,12 +657,11 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): else: form = MarkRapidQuestionForm() - #answers_dict = {} + # answers_dict = {} - #for ans in question.answers.all(): + # for ans in question.answers.all(): # answers_dict[ans.answer_compare] = ans - correct_answers = [] half_mark_answers = [] incorrect_answers = [] @@ -678,17 +677,22 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): incorrect_answers.remove("normal") else: 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) - incorrect_answers = question.answers.filter(status=Answer.MarkOptions.INCORRECT) + half_mark_answers = question.answers.filter( + status=Answer.MarkOptions.HALF_MARK + ) + incorrect_answers = question.answers.filter( + status=Answer.MarkOptions.INCORRECT + ) if review: for ans in unmarked_user_answers: @@ -706,7 +710,6 @@ def mark(request, exam_pk, sk, unmarked_exam_answers_only=True, review=False): unmarked_answers_bool = True review_user_answers.append((ans, mark)) - return render( request, "rapids/mark.html", @@ -780,17 +783,15 @@ def exam_scores_cid(request, pk): by_question[q].append((ans, answer_score)) - - user_scores = {} user_scores_normalised = {} for user in user_answers_marks: user_scores[user] = sum( [i for i in user_answers_marks[user] if i != "unmarked"] ) - user_scores_normalised[user] = normaliseScore(sum( - [i for i in user_answers_marks[user] if i != "unmarked"] - )) + user_scores_normalised[user] = normaliseScore( + sum([i for i in user_answers_marks[user] if i != "unmarked"]) + ) user_scores_list = list(user_scores.values()) @@ -859,7 +860,6 @@ def exam_scores_cid_user(request, pk, cid): answers_marks = [] answers = [] - view_all_results = False if request.user.groups.filter(name="view_all_results").exists(): view_all_results = True @@ -1103,6 +1103,7 @@ def question_save_annotation(request, pk): data = {"status": "error"} return JsonResponse(data, status=400) + class ExamClone(ExamCloneMixin, ExamCreate): """Clone exam view""" @@ -1115,8 +1116,47 @@ def get_question_by_hash(request): try: question = RapidImage.objects.get(image_md5_hash=hash) - data = {"status": "success", "id": question.pk, "url": question.rapid.get_absolute_url()} + data = { + "status": "success", + "id": question.pk, + "url": question.rapid.get_absolute_url(), + } return JsonResponse(data, status=200) except RapidImage.DoesNotExist: data = {"status": "success", "id": False} - return JsonResponse(data, status=200) \ No newline at end of file + return JsonResponse(data, status=200) + + + +# TODO: better permissions +@login_required +def question_json_unbased(request, pk): + """ + No (file based) caching is enabled for unbased quesitons + """ + question = get_object_or_404(Rapid, pk=pk) + + question_json = question.get_question_json(based=False) + return JsonResponse(question_json) + + +@login_required +def question_json(request, pk): + question = get_object_or_404(Rapid, pk=pk) + + question_json = question.get_question_json(based=True) + return JsonResponse(question_json) + +@login_required +def question_viewer(request, pk): + #question = get_object_or_404(Rapid, pk=pk) + + ids = request.GET.get("ids").split(",") + + return render( + request, + "rapids/question_viewer.html", + { + "ids": ids, + }, + ) \ No newline at end of file