.
This commit is contained in:
+75
-20
@@ -29,7 +29,7 @@ from .forms import (
|
|||||||
ExaminationForm,
|
ExaminationForm,
|
||||||
AnswerFormSet,
|
AnswerFormSet,
|
||||||
AnswerUpdateFormSet,
|
AnswerUpdateFormSet,
|
||||||
ExamForm
|
ExamForm,
|
||||||
)
|
)
|
||||||
from .models import (
|
from .models import (
|
||||||
Rapid,
|
Rapid,
|
||||||
@@ -70,10 +70,16 @@ from rapids.forms import RapidCreationDefaultForm
|
|||||||
from rapids.models import RapidCreationDefault
|
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 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
|
from generic.mixins import SuperuserRequiredMixin
|
||||||
|
|
||||||
@@ -90,32 +96,44 @@ class AuthorOrCheckerRequiredMixin(object):
|
|||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def question_detail(request, pk):
|
def question_detail(request, pk):
|
||||||
rapid = get_object_or_404(Rapid, pk=pk)
|
rapid = get_object_or_404(Rapid, pk=pk)
|
||||||
|
|
||||||
if not rapid.open_access:
|
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()
|
raise PermissionDenied()
|
||||||
# if request.user not in rapid.author.all():
|
# if request.user not in rapid.author.all():
|
||||||
# raise PermissionDenied
|
# raise PermissionDenied
|
||||||
|
|
||||||
view_feedback = False
|
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
|
view_feedback = True
|
||||||
|
|
||||||
# logging.debug(rapid.rapid_notes.first())
|
# logging.debug(rapid.rapid_notes.first())
|
||||||
# logging.debug(rapid.subspecialty.first().name.all())
|
# 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
|
@login_required
|
||||||
def rapid_split(request, pk):
|
def rapid_split(request, pk):
|
||||||
rapid = get_object_or_404(Rapid, pk=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()
|
raise PermissionDenied()
|
||||||
|
|
||||||
images = rapid.images.all()
|
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)
|
# Sending user object to the form, to verify which fields to display/remove (depending on group)
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
kwargs = super(RapidCreateBase, self).get_form_kwargs()
|
kwargs = super(RapidCreateBase, self).get_form_kwargs()
|
||||||
kwargs.update({'user': self.request.user})
|
kwargs.update({"user": self.request.user})
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
@@ -336,7 +354,7 @@ class RapidCreate(RapidCreateBase):
|
|||||||
initial = super().get_initial()
|
initial = super().get_initial()
|
||||||
exam = get_object_or_404(Exam, pk=self.kwargs["pk"])
|
exam = get_object_or_404(Exam, pk=self.kwargs["pk"])
|
||||||
|
|
||||||
initial['exams'] = [exam.id]
|
initial["exams"] = [exam.id]
|
||||||
|
|
||||||
return initial
|
return initial
|
||||||
|
|
||||||
@@ -360,7 +378,9 @@ class RapidCreate(RapidCreateBase):
|
|||||||
# return super().form_valid(form)
|
# return super().form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
class RapidUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
class RapidUpdate(
|
||||||
|
RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView
|
||||||
|
):
|
||||||
model = Rapid
|
model = Rapid
|
||||||
form_class = RapidForm
|
form_class = RapidForm
|
||||||
|
|
||||||
@@ -370,7 +390,7 @@ class RapidUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixi
|
|||||||
# exclude = [ 'created_date', 'published_date' ]
|
# exclude = [ 'created_date', 'published_date' ]
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
kwargs = super(RapidUpdate, self).get_form_kwargs()
|
kwargs = super(RapidUpdate, self).get_form_kwargs()
|
||||||
kwargs.update({'user': self.request.user})
|
kwargs.update({"user": self.request.user})
|
||||||
return kwargs
|
return kwargs
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
@@ -446,7 +466,10 @@ def rapid_scrap(request, pk):
|
|||||||
except Rapid.DoesNotExist:
|
except Rapid.DoesNotExist:
|
||||||
raise Http404("Rapid does not exist")
|
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()
|
raise PermissionDenied()
|
||||||
|
|
||||||
rapid.scrapped = not rapid.scrapped
|
rapid.scrapped = not rapid.scrapped
|
||||||
@@ -880,7 +903,6 @@ def exam_scores_cid_user(request, pk, sk):
|
|||||||
# Get user answer
|
# Get user answer
|
||||||
user_answer = q.cid_user_answers.filter(cid=cid).first()
|
user_answer = q.cid_user_answers.filter(cid=cid).first()
|
||||||
|
|
||||||
|
|
||||||
if not user_answer or user_answer is None:
|
if not user_answer or user_answer is None:
|
||||||
# skip if no answer
|
# skip if no answer
|
||||||
answers_marks.append(0)
|
answers_marks.append(0)
|
||||||
@@ -933,6 +955,7 @@ class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
|||||||
model = Rapid
|
model = Rapid
|
||||||
success_url = reverse_lazy("rapids:rapid_view")
|
success_url = reverse_lazy("rapids:rapid_view")
|
||||||
|
|
||||||
|
|
||||||
RapidExamViews = ExamViews(Exam, Rapid, "rapids", "rapid", loadJsonAnswer)
|
RapidExamViews = ExamViews(Exam, Rapid, "rapids", "rapid", loadJsonAnswer)
|
||||||
|
|
||||||
|
|
||||||
@@ -947,7 +970,10 @@ class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView):
|
|||||||
form.instance.author.add(self.request.user.id)
|
form.instance.author.add(self.request.user.id)
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
class ExamUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
|
||||||
|
class ExamUpdate(
|
||||||
|
RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView
|
||||||
|
):
|
||||||
model = Exam
|
model = Exam
|
||||||
form_class = ExamForm
|
form_class = ExamForm
|
||||||
|
|
||||||
@@ -958,28 +984,36 @@ class ExamUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin
|
|||||||
form.instance.author.add(self.request.user.id)
|
form.instance.author.add(self.request.user.id)
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
class RapidUserAnswerView(LoginRequiredMixin, DetailView):
|
class RapidUserAnswerView(LoginRequiredMixin, DetailView):
|
||||||
model = CidUserAnswer
|
model = CidUserAnswer
|
||||||
|
|
||||||
|
|
||||||
class RapidUserAnswerTableView(LoginRequiredMixin, SingleTableMixin, FilterView):
|
class RapidUserAnswerTableView(LoginRequiredMixin, SingleTableMixin, FilterView):
|
||||||
model = CidUserAnswer
|
model = CidUserAnswer
|
||||||
table_class = RapidUserAnswerTable
|
table_class = RapidUserAnswerTable
|
||||||
template_name = "rapids/rapid_question_view.html"
|
template_name = "rapids/rapid_question_view.html"
|
||||||
|
|
||||||
filterset_class = RapidUserAnswerFilter
|
filterset_class = RapidUserAnswerFilter
|
||||||
|
|
||||||
|
|
||||||
class UserAnswerDelete(SuperuserRequiredMixin, DeleteView):
|
class UserAnswerDelete(SuperuserRequiredMixin, DeleteView):
|
||||||
model = CidUserAnswer
|
model = CidUserAnswer
|
||||||
success_url = reverse_lazy("rapids:rapid_user_answer_table_view")
|
success_url = reverse_lazy("rapids:rapid_user_answer_table_view")
|
||||||
|
|
||||||
|
|
||||||
class LargeResultsSetPagination(PageNumberPagination):
|
class LargeResultsSetPagination(PageNumberPagination):
|
||||||
page_size = 1000
|
page_size = 1000
|
||||||
page_size_query_param = 'page_size'
|
page_size_query_param = "page_size"
|
||||||
max_page_size = 10000
|
max_page_size = 10000
|
||||||
|
|
||||||
|
|
||||||
class StandardResultsSetPagination(PageNumberPagination):
|
class StandardResultsSetPagination(PageNumberPagination):
|
||||||
page_size = 100
|
page_size = 100
|
||||||
page_size_query_param = 'page_size'
|
page_size_query_param = "page_size"
|
||||||
max_page_size = 1000
|
max_page_size = 1000
|
||||||
|
|
||||||
|
|
||||||
class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||||
# queryset = Exam.objects.all().order_by('name')
|
# queryset = Exam.objects.all().order_by('name')
|
||||||
serializer_class = ExamSerializer
|
serializer_class = ExamSerializer
|
||||||
@@ -994,32 +1028,53 @@ class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
|||||||
|
|
||||||
return Exam.objects.filter(author__id=user.id)
|
return Exam.objects.filter(author__id=user.id)
|
||||||
|
|
||||||
|
|
||||||
class QuestionAnswerViewSet(viewsets.ModelViewSet):
|
class QuestionAnswerViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Answer.objects.all() # .order_by('name')
|
queryset = Answer.objects.all() # .order_by('name')
|
||||||
serializer_class = QuestionAnswerSerializer
|
serializer_class = QuestionAnswerSerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
class UserAnswerViewSet(viewsets.ModelViewSet):
|
class UserAnswerViewSet(viewsets.ModelViewSet):
|
||||||
queryset = CidUserAnswer.objects.all() # .order_by('name')
|
queryset = CidUserAnswer.objects.all() # .order_by('name')
|
||||||
serializer_class = UserAnswerSerializer
|
serializer_class = UserAnswerSerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
class RapidViewSet(RevisionMixin, viewsets.ModelViewSet):
|
class RapidViewSet(
|
||||||
|
RevisionMixin,
|
||||||
|
mixins.CreateModelMixin,
|
||||||
|
mixins.RetrieveModelMixin,
|
||||||
|
mixins.UpdateModelMixin,
|
||||||
|
mixins.ListModelMixin,
|
||||||
|
mixins.DestroyModelMixin,
|
||||||
|
viewsets.GenericViewSet,
|
||||||
|
):
|
||||||
queryset = Rapid.objects.all() # .order_by('name')
|
queryset = Rapid.objects.all() # .order_by('name')
|
||||||
serializer_class = RapidSerializer
|
serializer_class = RapidSerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
pagination_class = StandardResultsSetPagination
|
pagination_class = StandardResultsSetPagination
|
||||||
|
|
||||||
class RapidLateralityViewSet(RevisionMixin, viewsets.ModelViewSet):
|
|
||||||
|
class RapidLateralityViewSet(
|
||||||
|
RevisionMixin,
|
||||||
|
mixins.CreateModelMixin,
|
||||||
|
mixins.RetrieveModelMixin,
|
||||||
|
mixins.UpdateModelMixin,
|
||||||
|
mixins.ListModelMixin,
|
||||||
|
viewsets.GenericViewSet,
|
||||||
|
):
|
||||||
queryset = Rapid.objects.all() # .order_by('name')
|
queryset = Rapid.objects.all() # .order_by('name')
|
||||||
serializer_class = RapidLateralitySerializer
|
serializer_class = RapidLateralitySerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
pagination_class = StandardResultsSetPagination
|
pagination_class = StandardResultsSetPagination
|
||||||
|
|
||||||
|
|
||||||
class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
||||||
model = Exam
|
model = Exam
|
||||||
success_url = reverse_lazy("rapids:index")
|
success_url = reverse_lazy("rapids:index")
|
||||||
|
|
||||||
|
|
||||||
# class AddSuggestedAnswer(LoginRequiredMixin, CreateView):
|
# class AddSuggestedAnswer(LoginRequiredMixin, CreateView):
|
||||||
# model = QuestionNote
|
# model = QuestionNote
|
||||||
# form_class = QuestionNoteForm
|
# form_class = QuestionNoteForm
|
||||||
|
|||||||
Reference in New Issue
Block a user