diff --git a/generic/models.py b/generic/models.py index d77547ed..137e5732 100644 --- a/generic/models.py +++ b/generic/models.py @@ -203,6 +203,7 @@ class ExamBase(models.Model): return authors def check_cid_user(self, cid: int|None, passcode: str|None, request: HttpRequest|None=None, user_id: int|None=None, allow_authors: bool=True): + print(f"Check cid user: {cid=}, {passcode=}, exam_id={self.pk}") if request is not None and request.user.is_superuser: return True diff --git a/generic/views.py b/generic/views.py index 80c76551..6c540fbe 100644 --- a/generic/views.py +++ b/generic/views.py @@ -1704,13 +1704,22 @@ class ExamViews(View, LoginRequiredMixin): def exam_question_json_unbased_cid(self, request, pk, sk, cid, passcode): return self.exam_question_json_unbased(request, pk, sk, cid, passcode) - def exam_question_json_unbased(self, request, pk, sk): + def exam_question_json_unbased(self, request, pk, sk, cid=None, passcode=None): question = get_object_or_404(self.Question, pk=sk) exam = get_object_or_404(self.Exam, pk=pk) if not exam.active and not self.check_user_access(request.user, pk): raise Http404("No available exam") + # Check access for users + if request.user.is_anonymous: + user_id = None + else: + user_id = request.user.pk + if not exam.check_cid_user(cid, passcode, request, user_id): + raise Http404("No available exam") + + return redirect("{}:question_json_unbased".format(self.app_name), pk=sk) redirect() diff --git a/longs/models.py b/longs/models.py index fbf4eff9..a5c347da 100644 --- a/longs/models.py +++ b/longs/models.py @@ -213,9 +213,26 @@ class Long(models.Model): return marker_unmarked - def get_question_json(self, based=True, feedback=False): - # self == q? - # q = get_object_or_404(Long, pk=question_id) + def get_question_model_answers(self): + """Returns a dict of the question model answers""" + return { + "observations": self.model_observations, + "interpretation": self.model_interpretation, + "principle diagnosis": self.model_principle_diagnosis, + "differential_diagnosis": self.model_differential_diagnosis, + "management": self.model_management, + } + + + def get_question_json(self, based: bool=True, answers: bool=True, feedback: bool=False): + """Returns a json representation of the question + + if based = False return is a dict + otherwise a url to the json file + + answers arg is only parsed if based = False + """ + question_id = self.pk if not based: @@ -249,6 +266,10 @@ class Long(models.Model): "type": "long", "cached": False, } + + if answers: + question_json["answers"] = self.get_question_model_answers() + return question_json # exam_order.append(q.id)