51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
|
from django.views.generic import TemplateView
|
||
|
from rest_framework import views
|
||
|
from rest_framework import viewsets
|
||
|
from rest_framework.response import Response
|
||
|
|
||
|
from config.settings import BASE_DIR
|
||
|
from trials.models import Test
|
||
|
from trials.serializers import TestSerializer
|
||
|
|
||
|
|
||
|
class TestModelViewSet(viewsets.ModelViewSet):
|
||
|
queryset = Test.objects.all()
|
||
|
serializer_class = TestSerializer
|
||
|
|
||
|
|
||
|
class TestTemplateView(TemplateView):
|
||
|
|
||
|
permission_classes = []
|
||
|
template_name = BASE_DIR + f"/templates/generic_test.html"
|
||
|
|
||
|
def get_queryset(self):
|
||
|
return Test.objects.all()
|
||
|
|
||
|
def get_context_data(self, test_id, **kwargs):
|
||
|
context = super().get_context_data(**kwargs)
|
||
|
context["test"] = self.get_queryset().filter(id=test_id).prefetch_related("questions__answers").first()
|
||
|
return context
|
||
|
|
||
|
|
||
|
class TestValidateAPIView(views.APIView):
|
||
|
PASSED = "passed"
|
||
|
FAILED = "failed"
|
||
|
UNKNOWN = "unknown"
|
||
|
|
||
|
PASSED = {
|
||
|
True: PASSED,
|
||
|
False: FAILED
|
||
|
}
|
||
|
|
||
|
def get_score(self, test: Test, answers):
|
||
|
return test.get_score(answers)
|
||
|
|
||
|
def post(self, request, test_id, **kwargs):
|
||
|
test = Test.objects.get(id=test_id)
|
||
|
score = self.get_score(test, request.data["answers"])
|
||
|
status = score >= test.passing_score
|
||
|
return Response({
|
||
|
"status": self.PASSED.get(status, self.UNKNOWN),
|
||
|
"points": score
|
||
|
})
|