.
This commit is contained in:
+92
-37
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user