SOITA/trials/views.py

378 lines
12 KiB
Python
Raw Normal View History

2022-01-24 22:17:08 +01:00
import pdb
2022-01-17 18:50:08 +01:00
import requests
2021-12-05 13:50:34 +01:00
from django.views.generic import TemplateView
2022-01-24 22:17:08 +01:00
from rest_framework import views, generics
2021-12-05 13:50:34 +01:00
from rest_framework import viewsets
from rest_framework.response import Response
2022-01-24 22:17:08 +01:00
from rest_framework.views import APIView
2021-12-05 13:50:34 +01:00
2022-01-30 20:04:27 +01:00
from questions.models import Question
from trials.models import Test, SolvedTest
2021-12-05 13:50:34 +01:00
from trials.serializers import TestSerializer
2022-01-09 22:43:49 +01:00
from django.conf import settings
2022-01-17 16:31:09 +01:00
from django.shortcuts import render, redirect
from django import template
2022-01-17 16:05:26 +01:00
from django.http import HttpResponseRedirect, HttpResponse
from django.template import loader
from django.template.loader import render_to_string, get_template
2022-01-17 18:50:08 +01:00
from django.http import HttpRequest
import requests
2022-01-17 16:31:09 +01:00
def addTest(request):
return render(request, 'createTest.html')
def addQuestions(request, **kwargs):
2022-01-17 16:31:09 +01:00
if request.POST:
name = request.GET.get("name")
2022-03-30 23:01:39 +02:00
invisible = request.GET.get("invisible")
passing = request.GET.get("passing")
category = request.GET.get("category")
number_of_questions = request.GET.get("number_of_questions")
2022-01-24 22:17:08 +01:00
user = request.user
# k = dict(request.POST)["desc"]
questions = []
for i in range(0, int(number_of_questions)):
description = dict(request.POST)["desc"][i]
answer1 = {
"description": dict(request.POST)["ans1"][i],
"is_correct": False
}
answer2 = {
"description": dict(request.POST)["ans2"][i],
"is_correct": False
}
answer3 = {
"description": dict(request.POST)["ans3"][i],
"is_correct": False
}
answer4 = {
"description": dict(request.POST)["ans4"][i],
"is_correct": False
}
is_correct = dict(request.POST)["is_correct"][i]
if is_correct == "1":
answer1["is_correct"] = True
if is_correct == "2":
answer2["is_correct"] = True
if is_correct == "3":
answer3["is_correct"] = True
if is_correct == "4":
answer4["is_correct"] = True
questions.append({
"name": description,
"answers": [
answer1,
answer2,
answer3,
answer4
]
})
2022-03-30 23:01:39 +02:00
if invisible == "True":
Test.objects.create(name=name, passing_score=passing, category=category, questions=questions, user=user,
invisible=True)
else:
Test.objects.create(name=name, passing_score=passing, category=category, questions=questions, user=user,
invisible=False)
2022-01-25 18:45:02 +01:00
return redirect('home')
return render(request, 'addQuestions.html')
2022-01-17 18:50:08 +01:00
2022-01-30 20:04:27 +01:00
class AddQuestionToExistingTest(TemplateView):
template_name = settings.BASE_DIR + f"/templates/addQuestionToExistingTest.html"
def post(self, request, *args, **kwargs):
answers = []
answer1 = {
"description": dict(request.POST)["ans1"][0],
"is_correct": False
}
answer2 = {
"description": dict(request.POST)["ans2"][0],
"is_correct": False
}
answer3 = {
"description": dict(request.POST)["ans3"][0],
"is_correct": False
}
answer4 = {
"description": dict(request.POST)["ans4"][0],
"is_correct": False
}
is_correct = dict(request.POST)["is_correct"][0]
if is_correct == "1":
answer1["is_correct"] = True
if is_correct == "2":
answer2["is_correct"] = True
if is_correct == "3":
answer3["is_correct"] = True
if is_correct == "4":
answer4["is_correct"] = True
answers.append({
"answers": [
answer1,
answer2,
answer3,
answer4
]
})
description = dict(request.POST)["desc"][0]
Question.objects.addQuestionToExistingTest(name=description, answers=answers, test=Test.objects.get(id=kwargs["test_id"]))
return redirect(f'/tests/{kwargs["test_id"]}/edit')
class RemoveQuestionFromExistingTest(TemplateView):
template_name = settings.BASE_DIR + f"/templates/removeQuestionFromExistingTest.html"
def get_queryset(self):
return Test.objects.all()
def get_context_data(self, test_id, **kwargs):
self.test_id = test_id
context = super().get_context_data(**kwargs)
context["test"] = self.get_queryset().filter(id=test_id).prefetch_related("questions__answers").first()
return context
def post(self, request, *args, **kwargs):
Question.objects.get(id=request.POST["id"]).delete()
return redirect(f'/tests/{kwargs["test_id"]}/edit')
def myTests(request):
context = {}
2022-01-24 22:17:08 +01:00
user = request.user.id
context['tests'] = Test.objects.filter(created_by=user)
return render(request, 'myTests.html', context)
2022-01-19 20:56:00 +01:00
def solvedTests(request):
context = {}
user_id = request.user.id
solved_tests = SolvedTest.objects.filter(user__id=user_id)
formatted_tests = list()
for solved_test in solved_tests:
formatted_tests.append({
"name": solved_test.test.name_and_passing_score()["name"],
"passing_score": solved_test.test.name_and_passing_score()["passing_score"],
2022-01-23 17:10:05 +01:00
"score": solved_test.score,
2022-01-25 16:53:48 +01:00
"max": solved_test.max,
2022-01-23 17:10:05 +01:00
"percentage": solved_test.percentage
})
context['tests'] = formatted_tests
2022-01-23 17:10:05 +01:00
return render(request, 'solvedTests.html', context)
2022-01-19 20:56:00 +01:00
def editTest(request):
2022-01-23 17:10:05 +01:00
if request.POST:
# TODO here
# firstName = request.POST.get("firstName")
# lastName = request.POST.get("lastName")
#
# u = request.user
# u.first_name = firstName
# u.last_name = lastName
# u.save()
return redirect('myTests')
return render(request, 'editTest.html')
2022-01-21 18:34:46 +01:00
class EditTestTemplateView(TemplateView):
template_name = settings.BASE_DIR + f"/templates/editTest.html"
def get_queryset(self):
return Test.objects.all()
def get_context_data(self, test_id, **kwargs):
self.test_id = test_id
context = super().get_context_data(**kwargs)
context["test"] = self.get_queryset().filter(id=test_id).prefetch_related("questions__answers").first()
return context
2022-01-30 20:04:27 +01:00
def post(self, request, *args, **kwargs):
return redirect(f'/tests/question/{request.POST["id"]}/edit?test_id={kwargs["test_id"]}')
2022-01-21 18:34:46 +01:00
2022-01-30 20:04:27 +01:00
class EditQuestionTemplateView(TemplateView):
template_name = settings.BASE_DIR + f"/templates/editQuestion.html"
def get_queryset(self):
return Question.objects.all()
def get_context_data(self, question_id, **kwargs):
context = super().get_context_data(**kwargs)
context["question"] = self.get_queryset().filter(id=question_id).prefetch_related("answers").first()
return context
2022-01-21 18:34:46 +01:00
def post(self, request, *args, **kwargs):
2022-01-30 20:04:27 +01:00
question_id = kwargs["question_id"]
test = request.GET.get("test_id")
answers = []
answer1 = {
"description": dict(request.POST)["ans1"][0],
"is_correct": False
}
answer2 = {
"description": dict(request.POST)["ans2"][0],
"is_correct": False
2022-01-21 18:34:46 +01:00
}
2022-01-30 20:04:27 +01:00
answer3 = {
"description": dict(request.POST)["ans3"][0],
"is_correct": False
}
answer4 = {
"description": dict(request.POST)["ans4"][0],
"is_correct": False
}
is_correct = dict(request.POST)["is_correct"][0]
if is_correct == "1":
answer1["is_correct"] = True
if is_correct == "2":
answer2["is_correct"] = True
if is_correct == "3":
answer3["is_correct"] = True
if is_correct == "4":
answer4["is_correct"] = True
answers.append({
"answers": [
answer1,
answer2,
answer3,
answer4
]
})
description = dict(request.POST)["desc"][0]
Question.objects.EditQuestion(question_id=question_id, name=description, answers=answers)
return redirect(f'/tests/{test}/edit')
2022-01-21 18:34:46 +01:00
2022-01-25 18:01:26 +01:00
def deleteTest(request, test_id):
Test.objects.filter(id=test_id).delete()
2022-01-25 18:45:02 +01:00
return redirect('myTests')
2022-01-24 22:17:08 +01:00
2022-01-30 20:04:27 +01:00
def editName(request, test_id):
new_name = request.GET["name"]
test = Test.objects.get(id=test_id)
test.name = new_name
test.save()
return redirect(f'/tests/{test_id}/edit')
2021-12-05 13:50:34 +01:00
class TestModelViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
2022-01-17 18:50:08 +01:00
2021-12-05 13:50:34 +01:00
class TestTemplateView(TemplateView):
2022-01-30 14:26:15 +01:00
PASSED = "Zaliczony"
2022-01-31 21:00:29 +01:00
FAILED = "Niezaliczony"
2022-01-30 14:26:15 +01:00
UNKNOWN = "nieznany"
2022-01-17 16:05:26 +01:00
PASSED = {
True: PASSED,
False: FAILED
}
2021-12-05 13:50:34 +01:00
2022-01-09 22:43:49 +01:00
permission_classes = []
template_name = settings.BASE_DIR + f"/templates/generic_test.html"
2022-01-16 17:51:36 +01:00
test_id = None
2022-01-09 22:43:49 +01:00
2021-12-05 13:50:34 +01:00
def get_queryset(self):
return Test.objects.all()
def get_context_data(self, test_id, **kwargs):
2022-01-16 17:51:36 +01:00
self.test_id = test_id
2021-12-05 13:50:34 +01:00
context = super().get_context_data(**kwargs)
context["test"] = self.get_queryset().filter(id=test_id).prefetch_related("questions__answers").first()
return context
2022-01-17 16:05:26 +01:00
def get_score(self, test: Test, answers):
return test.get_score(answers)
2022-01-16 17:51:36 +01:00
2022-01-23 17:10:05 +01:00
def get_maxscore(self, test: Test, answers):
return test.get_maxscore(answers)
2022-01-17 16:05:26 +01:00
def formatted_responses(self, unformatted_json):
formatted_response = list()
for question, answer in unformatted_json.items():
formatted_response.append(
{
"question": question,
"answer": answer
}
)
return formatted_response
2022-01-16 17:51:36 +01:00
2022-01-17 16:05:26 +01:00
def post(self, request, *args, **kwargs):
test = Test.objects.get(id=kwargs.get("test_id"))
score = self.get_score(test, self.formatted_responses(request.POST))
2022-01-23 17:10:05 +01:00
max = self.get_maxscore(test, self.formatted_responses(request.POST))
2022-01-17 16:05:26 +01:00
status = score >= test.passing_score
context = {
"status": self.PASSED.get(status, self.UNKNOWN),
2022-01-23 17:10:05 +01:00
"points": score,
"max": max,
"passing": test.passing_score,
"percentage": int(score/max * 100)
2022-01-17 16:05:26 +01:00
}
SolvedTest.objects.create(
score=score,
2022-01-23 17:10:05 +01:00
max=max,
percentage=int(score/max * 100),
user=request.user,
test=test
)
2022-01-17 16:05:26 +01:00
template_name = "result.html"
template = get_template(template_name)
return HttpResponse(template.render(context))
2021-12-05 13:50:34 +01:00
2022-01-12 10:50:34 +01:00
def testView(request):
permission_classes = []
template_name = settings.BASE_DIR + f"/templates/generic_test.html"
context = {}
if request.POST:
form = RegistrationForm(request.POST)
if form.is_valid():
User.objects.create(
email=form.cleaned_data["email"],
first_name=form.cleaned_data["first_name"],
last_name=form.cleaned_data["last_name"],
password=form.cleaned_data["password1"]
)
return redirect('register_success')
else:
context['registration_form'] = form
else:
context["test"] = Test.objects.all().filter(id=test_id).prefetch_related("questions__answers").first()
return render(request, 'generic_test.html', context)
2021-12-05 13:50:34 +01:00
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
})
2022-01-12 10:50:34 +01:00
class TestResultView(TemplateView):
permission_classes = []
template_name = settings.BASE_DIR + f"/templates/result.html"