From c14b63eccb5f3d6d586eeb2ffdae4c8f62ea65a5 Mon Sep 17 00:00:00 2001 From: Ross Date: Thu, 8 Jul 2021 15:26:42 +0100 Subject: [PATCH] . --- rapids/views.py | 129 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 92 insertions(+), 37 deletions(-) diff --git a/rapids/views.py b/rapids/views.py index 7ef6df5a..5faa5816 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -29,7 +29,7 @@ from .forms import ( ExaminationForm, AnswerFormSet, AnswerUpdateFormSet, - ExamForm + ExamForm, ) from .models import ( Rapid, @@ -70,10 +70,16 @@ from rapids.forms import RapidCreationDefaultForm from rapids.models import RapidCreationDefault -from rest_framework import viewsets, permissions +from rest_framework import viewsets, permissions, mixins from rest_framework.pagination import PageNumberPagination -from .serializers import ExamSerializer, QuestionAnswerSerializer, RapidLateralitySerializer, RapidSerializer, UserAnswerSerializer +from .serializers import ( + ExamSerializer, + QuestionAnswerSerializer, + RapidLateralitySerializer, + RapidSerializer, + UserAnswerSerializer, +) from generic.mixins import SuperuserRequiredMixin @@ -90,32 +96,44 @@ class AuthorOrCheckerRequiredMixin(object): 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(): + 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(): + 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.rapid_notes.first()) # logging.debug(rapid.subspecialty.first().name.all()) - return render(request, "rapids/question_detail.html", {"question": rapid, "view_feedback" : view_feedback}) + return render( + request, + "rapids/question_detail.html", + {"question": rapid, "view_feedback": view_feedback}, + ) @login_required def rapid_split(request, pk): rapid = get_object_or_404(Rapid, pk=pk) - if not request.user.groups.filter(name="rapid_checker").exists() and request.user not in question.author.all(): + if ( + not request.user.groups.filter(name="rapid_checker").exists() + and request.user not in question.author.all() + ): raise PermissionDenied() images = rapid.images.all() @@ -282,7 +300,7 @@ class RapidCreateBase(RevisionMixin, LoginRequiredMixin, CreateView): # Sending user object to the form, to verify which fields to display/remove (depending on group) def get_form_kwargs(self): kwargs = super(RapidCreateBase, self).get_form_kwargs() - kwargs.update({'user': self.request.user}) + kwargs.update({"user": self.request.user}) return kwargs def get_context_data(self, **kwargs): @@ -329,24 +347,24 @@ class RapidCreateBase(RevisionMixin, LoginRequiredMixin, CreateView): # @login_required class RapidCreate(RapidCreateBase): - #initial = {"laterality": Rapid.NONE} + # initial = {"laterality": Rapid.NONE} def get_initial(self): if "pk" in self.kwargs: initial = super().get_initial() exam = get_object_or_404(Exam, pk=self.kwargs["pk"]) - initial['exams'] = [exam.id] + initial["exams"] = [exam.id] return initial ## There has to be a better way... - #try: + # try: # s = (i.pk for i in self.request.user.rapid_default.site.all()) # self.initial.update({"site": s}) - #except AttributeError: + # except AttributeError: # pass - #return self.initial + # return self.initial # fields = '__all__' # #fields = [ 'condition' ] @@ -360,7 +378,9 @@ class RapidCreate(RapidCreateBase): # return super().form_valid(form) -class RapidUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView): +class RapidUpdate( + RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView +): model = Rapid form_class = RapidForm @@ -370,7 +390,7 @@ class RapidUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixi # exclude = [ 'created_date', 'published_date' ] def get_form_kwargs(self): kwargs = super(RapidUpdate, self).get_form_kwargs() - kwargs.update({'user': self.request.user}) + kwargs.update({"user": self.request.user}) return kwargs def get_context_data(self, **kwargs): @@ -446,7 +466,10 @@ def rapid_scrap(request, pk): except Rapid.DoesNotExist: raise Http404("Rapid does not exist") - if not request.user.groups.filter(name="rapid_checker").exists() and request.user not in question.author.all(): + if ( + not request.user.groups.filter(name="rapid_checker").exists() + and request.user not in question.author.all() + ): raise PermissionDenied() rapid.scrapped = not rapid.scrapped @@ -580,7 +603,7 @@ def loadJsonAnswer(answer): posted_answer = answer["ans"] ## qidn 1 does not hold answer data (but should always arrive prior to 2) - #if answer["qidn"] == "1": + # if answer["qidn"] == "1": # posted_answer = "" # Normal answers are just posted with the answer "Normal" @@ -603,7 +626,7 @@ def loadJsonAnswer(answer): if answer["qidn"] == "1": ans.normal = normal ans.answer = "" - elif answer["qidn"] == "2" and not ans.normal: + elif answer["qidn"] == "2" and not ans.normal: ans.answer = posted_answer ans.full_clean() ans.save() @@ -880,11 +903,10 @@ def exam_scores_cid_user(request, pk, sk): # Get user answer user_answer = q.cid_user_answers.filter(cid=cid).first() - if not user_answer or user_answer is None: # skip if no answer answers_marks.append(0) - #answers.append("") + # answers.append("") answer_score = 0 ans = "Not answered" else: @@ -933,6 +955,7 @@ class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView): model = Rapid success_url = reverse_lazy("rapids:rapid_view") + RapidExamViews = ExamViews(Exam, Rapid, "rapids", "rapid", loadJsonAnswer) @@ -947,7 +970,10 @@ class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView): form.instance.author.add(self.request.user.id) return super().form_valid(form) -class ExamUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView): + +class ExamUpdate( + RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView +): model = Exam form_class = ExamForm @@ -958,30 +984,38 @@ class ExamUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin form.instance.author.add(self.request.user.id) return super().form_valid(form) + class RapidUserAnswerView(LoginRequiredMixin, DetailView): model = CidUserAnswer + class RapidUserAnswerTableView(LoginRequiredMixin, SingleTableMixin, FilterView): model = CidUserAnswer table_class = RapidUserAnswerTable template_name = "rapids/rapid_question_view.html" filterset_class = RapidUserAnswerFilter + + class UserAnswerDelete(SuperuserRequiredMixin, DeleteView): model = CidUserAnswer success_url = reverse_lazy("rapids:rapid_user_answer_table_view") + class LargeResultsSetPagination(PageNumberPagination): page_size = 1000 - page_size_query_param = 'page_size' + page_size_query_param = "page_size" max_page_size = 10000 + class StandardResultsSetPagination(PageNumberPagination): page_size = 100 - page_size_query_param = 'page_size' + page_size_query_param = "page_size" max_page_size = 1000 + + class ExamViewSet(RevisionMixin, viewsets.ModelViewSet): - #queryset = Exam.objects.all().order_by('name') + # queryset = Exam.objects.all().order_by('name') serializer_class = ExamSerializer def get_queryset(self): @@ -991,41 +1025,62 @@ class ExamViewSet(RevisionMixin, viewsets.ModelViewSet): user = self.request.user if user.groups.filter(name="rapid_checker").exists(): return Exam.objects.all() - + return Exam.objects.filter(author__id=user.id) + class QuestionAnswerViewSet(viewsets.ModelViewSet): - queryset = Answer.objects.all()#.order_by('name') + queryset = Answer.objects.all() # .order_by('name') serializer_class = QuestionAnswerSerializer permission_classes = [permissions.IsAuthenticated] + class UserAnswerViewSet(viewsets.ModelViewSet): - queryset = CidUserAnswer.objects.all()#.order_by('name') + queryset = CidUserAnswer.objects.all() # .order_by('name') serializer_class = UserAnswerSerializer permission_classes = [permissions.IsAuthenticated] -class RapidViewSet(RevisionMixin, viewsets.ModelViewSet): - queryset = Rapid.objects.all()#.order_by('name') +class RapidViewSet( + RevisionMixin, + mixins.CreateModelMixin, + mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.ListModelMixin, + mixins.DestroyModelMixin, + viewsets.GenericViewSet, +): + queryset = Rapid.objects.all() # .order_by('name') serializer_class = RapidSerializer permission_classes = [permissions.IsAuthenticated] pagination_class = StandardResultsSetPagination -class RapidLateralityViewSet(RevisionMixin, viewsets.ModelViewSet): - queryset = Rapid.objects.all()#.order_by('name') + +class RapidLateralityViewSet( + RevisionMixin, + mixins.CreateModelMixin, + mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.ListModelMixin, + viewsets.GenericViewSet, +): + queryset = Rapid.objects.all() # .order_by('name') serializer_class = RapidLateralitySerializer permission_classes = [permissions.IsAuthenticated] pagination_class = StandardResultsSetPagination + class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView): model = Exam success_url = reverse_lazy("rapids:index") -#class AddSuggestedAnswer(LoginRequiredMixin, CreateView): + + +# class AddSuggestedAnswer(LoginRequiredMixin, CreateView): # model = QuestionNote # form_class = QuestionNoteForm # # #fields = ("author", "note_type", "note") -# +# # # def get_form_kwargs(self): # kwargs = super(AddQuestionNote, self).get_form_kwargs() @@ -1047,7 +1102,7 @@ class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView): # content_type = ContentType.objects.get(model="long") # else: # raise PermissionError() -# +# # get_object_or_404(question, pk=pk) # return { "content_type" : content_type, -# "object_id" : pk } \ No newline at end of file +# "object_id" : pk }