diff --git a/generic/views.py b/generic/views.py index 8a8e5162..12f48ee2 100644 --- a/generic/views.py +++ b/generic/views.py @@ -688,4 +688,45 @@ class GenericViewBase: for id in answer_ids: self.cid_user_answer_object.objects.get(pk=id).delete() return JsonResponse({"status": "success"}) - return JsonResponse({"status": "error"}) \ No newline at end of file + return JsonResponse({"status": "error"}) + + @login_required + def question_detail(self, request, pk): + question = get_object_or_404(self.question_object, pk=pk) + + if not question.open_access: + if ( + not request.user.groups.filter(name="rapid_checker").exists() + and request.user not in question.author.all() + ): + raise PermissionDenied() + # if request.user not in rapid.author.all(): + # raise PermissionDenied + + view_feedback = False + if ( + request.user.groups.filter(name="rapid_checker").exists() + or request.user.groups.filter(name="feedback_checker").exists() + or request.user in question.author.all() + ): + view_feedback = True + + # logging.debug(rapid.subspecialty.first().name.all()) + return render( + request, + f"{self.app_name}/question_detail.html", + {"question": question, "view_feedback": view_feedback}, + ) + + + @login_required + def question_user_answers(self, request, pk): + question = get_object_or_404(self.question_object, pk=pk) + + answers = self.cid_user_answer_object.objects.filter(question__id=rapid.pk) + + return render( + request, + f"{self.app_name}/question_user_answers.html", + {"question": question, "answers": answers}, + ) \ No newline at end of file diff --git a/rapids/urls.py b/rapids/urls.py index 5a14b5fc..c59c3cc0 100755 --- a/rapids/urls.py +++ b/rapids/urls.py @@ -15,7 +15,7 @@ urlpatterns = [ # path("unchecked/", views.unchecked_list, name="unchecked_list"), # path("verified//", views.verified_detail, name="verified_detail"), path( - "question//", views.question_detail, name="question_detail" + "question//", views.GenericViews.question_detail, name="question_detail" ), # path("question//json", views.question_json, name="question_json"), path( "question//save_annotation", @@ -34,12 +34,12 @@ urlpatterns = [ ), path( "question//user_answers", - views.question_user_answers, + views.GenericViews.question_user_answers, name="question_user_answers", ), path( "exam//review", - views.question_review, + views.GenericViews.question_review, name="question_review", ), path("exam///mark", views.mark, name="mark"), @@ -144,7 +144,7 @@ urlpatterns = [ ), path( "user_answers/delete", - views.user_answer_delete_multiple, + views.GenericViews.user_answer_delete_multiple, name="user_answer_delete_multiple", ), ] diff --git a/rapids/views.py b/rapids/views.py index de2b41df..4bc5efd3 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -40,7 +40,7 @@ from .models import ( CidUserAnswer, ) -from generic.views import ExamViews +from generic.views import ExamViews, GenericViewBase from reversion.views import RevisionMixin @@ -113,48 +113,6 @@ class AuthorOrCheckerRequiredMixin(object): raise PermissionDenied() # or Http404 return obj - -@login_required -def question_detail(request, pk): - rapid = get_object_or_404(Rapid, pk=pk) - - if not rapid.open_access: - if ( - not request.user.groups.filter(name="rapid_checker").exists() - and request.user not in rapid.author.all() - ): - raise PermissionDenied() - # if request.user not in rapid.author.all(): - # raise PermissionDenied - - view_feedback = False - if ( - request.user.groups.filter(name="rapid_checker").exists() - or request.user.groups.filter(name="feedback_checker").exists() - or request.user in rapid.author.all() - ): - view_feedback = True - - # logging.debug(rapid.subspecialty.first().name.all()) - return render( - request, - "rapids/question_detail.html", - {"question": rapid, "view_feedback": view_feedback}, - ) - - -@login_required -def question_user_answers(request, pk): - rapid = get_object_or_404(Rapid, pk=pk) - - answers = CidUserAnswer.objects.filter(question__id=rapid.pk) - - return render( - request, - "rapids/question_user_answers.html", - {"question": rapid, "answers": answers}, - ) - @login_required def rapid_split(request, pk): rapid = get_object_or_404(Rapid, pk=pk) @@ -1128,37 +1086,8 @@ class RapidLateralityViewSet( # return { "content_type" : content_type, # "object_id" : pk } -@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"]) +GenericViews = GenericViewBase("rapids", Rapid, CidUserAnswer, Exam) - # We could probably delete them all at once.... - for id in answer_ids: - CidUserAnswer.objects.get(pk=id).delete() - return JsonResponse({"status": "success"}) - return JsonResponse({"status": "error"}) - - -def question_review(request, pk): - """ - Return a json representation of the question when the exam is active - """ - if request.is_ajax(): - exam = get_object_or_404(Exam, pk=pk) - - print(request.POST["question_number"]) - print(type(request.POST["question_number"])) - - if not exam.publish_results: - raise Http404 - - question = exam.exam_questions.all()[int(request.POST["question_number"])] - - question_json = question.get_question_json(based=False) - return JsonResponse(question_json) - return JsonResponse({"status": "error"}) @user_is_author_or_rapid_checker def question_save_annotation(request, pk):