This commit is contained in:
Ross
2021-07-08 15:26:42 +01:00
parent b23a35f464
commit c14b63eccb
+92 -37
View File
@@ -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 }
# "object_id" : pk }