Merge pull request 'develop/soita-2.0' (#36) from develop/soita-2.0 into master

Reviewed-on: #36
This commit is contained in:
s470631 2022-05-24 21:02:16 +02:00
commit 095ce37585
45 changed files with 1357 additions and 110 deletions

View File

@ -55,13 +55,16 @@ INSTALLED_APPS = [
"rest_framework_simplejwt",
"django_extensions",
"django_social_share",
'fontawesomefree',
"jquery",
"users",
"trials",
"answers",
"questions",
"categories",
"tools"
"tools",
"questionnaire"
]
# AUTHENTICATION_BACKENDS = ['config.authh.SettingsBackend']
MIDDLEWARE = [

View File

@ -16,18 +16,21 @@ Including another URLconf
from django.contrib import admin
from django.urls import include
from django.urls import path
from .views import home, welcome, help
from .views import home, welcome, help, hard, popular
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns = [
path('', welcome, name='welcome'),
path('home', home, name='home'),
path('popular', popular, name='popular'),
path('hard', hard, name='hard'),
path('help', help, name='help'),
path('users/', include("users.urls")),
path('questions/', include("questions.urls")),
path('answers/', include("answers.urls")),
path('tests/', include("trials.urls")),
path('category/', include("categories.urls")),
path('questionnaire/', include("questionnaire.urls")),
]
urlpatterns += staticfiles_urlpatterns()

View File

@ -2,6 +2,7 @@ from django.shortcuts import render, redirect
from django.template import loader
from django.contrib.auth.decorators import login_required
from trials.models import Test
import operator
@login_required
@ -18,6 +19,19 @@ def home(request):
def help(request):
return render(request, 'help.html', )
@login_required
def popular(request):
context = {}
context['tests'] = Test.objects.filter(avg_rating__gt=0)
context['tests'] = sorted(context['tests'], key=operator.attrgetter('avg_rating'), reverse=True)
return render(request, 'popular.html', context)
@login_required
def hard(request):
context = {}
context['tests'] = Test.objects.filter(difficulty_label__gt=0)
context['tests'] = sorted(context['tests'], key=operator.attrgetter('difficulty_label'), reverse=True)
return render(request, 'hard.html', context)
def welcome(request):
return render(request, 'welcome.html')

View File

@ -1,8 +1,13 @@
Color palette:
#00916E - Illuminating Emerald
#FEEFE5 - Linen
#FFCF00 - Cyber Yellow
#EE6123 - Orange Panteon
#FA003F - Red Munsell
#FF0B7E - Winter Sky
Buttons and links
#00916E - Illuminating Emerald
Main color:
#FF0B7E - Winter Sky
#19647E - Blue Sapphire

View File

0
questionnaire/apps.py Normal file
View File

22
questionnaire/managers.py Normal file
View File

@ -0,0 +1,22 @@
from django.db.models import Manager
from django.apps import apps
from django.conf import settings
class QuestionnaireManager(Manager):
def create(
self,
**kwargs
):
instance = super().create(
overall=kwargs.get("overall"),
functionality=kwargs.get("functionality"),
look=kwargs.get("look"),
intuitive=kwargs.get("intuitive"),
bugs=kwargs.get("bugs"),
tech=kwargs.get("tech"),
potential=kwargs.get("potential"),
worst=kwargs.get("worst"),
desc=kwargs.get("desc"),
)
return instance

View File

@ -0,0 +1,33 @@
# Generated by Django 3.2.9 on 2022-05-15 21:29
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Questionnaire',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('overall', models.IntegerField(default=0)),
('functionality', models.IntegerField(default=0)),
('look', models.IntegerField(default=0)),
('intuitive', models.IntegerField(default=0)),
('bugs', models.IntegerField(default=0)),
('tech', models.IntegerField(default=0)),
('potential', models.IntegerField(default=0)),
('worst', models.IntegerField(default=0)),
('desc', models.CharField(default='', max_length=255)),
('fill_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='questionnaire', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

22
questionnaire/models.py Normal file
View File

@ -0,0 +1,22 @@
from django.db import models
from .managers import QuestionnaireManager
class Questionnaire(models.Model):
overall = models.IntegerField(default=0)
functionality = models.IntegerField(default=0)
look = models.IntegerField(default=0)
intuitive = models.IntegerField(default=0)
bugs = models.IntegerField(default=0)
tech = models.IntegerField(default=0)
potential = models.IntegerField(default=0)
worst = models.IntegerField(default=0)
desc = models.CharField(max_length=255, default="")
fill_by = models.ForeignKey(
"users.User",
null=True,
related_name="questionnaire",
on_delete=models.CASCADE
)
objects = QuestionnaireManager()

View File

@ -0,0 +1,28 @@
from rest_framework import serializers
from questionnaire.models import Questionnaire
class QuestionnaireSerializer(serializers.ModelSerializer):
class Meta:
model = Questionnaire
fields = (
"id",
"overall",
"functionality",
"look",
"intuitive",
"bugs",
"tech",
"potential",
"worst",
"desc",
"fill_by"
)
def create(self, validated_data):
instance = Questionnaire.objects.create(
**validated_data
)
return instance

12
questionnaire/urls.py Normal file
View File

@ -0,0 +1,12 @@
from django.urls import path
from rest_framework.routers import DefaultRouter
from .views import questionnaire
router = DefaultRouter(trailing_slash=False)
urlpatterns = [
path('questionnaire', questionnaire, name='questionnaire')
]
urlpatterns += router.urls

22
questionnaire/views.py Normal file
View File

@ -0,0 +1,22 @@
from django.shortcuts import render, redirect
from django.template import loader
from django.contrib.auth.decorators import login_required
from questionnaire.models import Questionnaire
@login_required
def questionnaire(request):
if request.POST:
overall = request.GET.get("overall")
functionality = request.GET.get("functionality")
look = request.GET.get("look")
intuitive = request.GET.get("intuitive")
bugs = request.GET.get("bugs")
tech = request.GET.get("tech")
potential = request.GET.get("potential")
worst = request.GET.get("worst")
desc = request.GET.get("desc")
Questionnaire.objects.create(overall=overall, functionality=functionality, look=look, intuitive=intuitive,
bugs=bugs, tech=tech, potential=potential, worst=worst, desc=desc)
return redirect('home')
return render(request, 'questionnaire.html')

View File

@ -19,4 +19,9 @@ class Question(models.Model):
for answer in self.answers.all()
]
tournament = models.ManyToManyField(
"trials.Tournament",
null=True
)
objects = QuestionManager()

View File

@ -109,3 +109,4 @@ wcwidth==0.2.5
webencodings==0.5.1
widgetsnbextension==3.5.2
zipp==3.6.0
fontawesomefree==6.1.1

21
static/script.js Normal file
View File

@ -0,0 +1,21 @@
//$(function() {
// $(".newQuestionSection" ).draggable().resizable();
//} );
var questionId = 1;
$('.addQuestionButton').click(function(){
console.log("REEEEEEEE")
// Clone extra box, and remove duplicate ids
let clone = $("#question-copy").clone().removeAttr("hidden");
clone.id = "question"- + ++questionId;
//clone.find("*").removeAttr("id");
clone.find("*").each(function() {
$(this).attr("id", "q" + questionId + "-" + $(this).attr("id"));
});
clone.find("input:radio").each(function() {
$(this).attr("name", questionId);
});
// append it to div
$('#canvas').append(clone);
});

View File

@ -1,6 +1,6 @@
.sidenav {
height: 100%;
width: 195px;
width: 215px;
position: fixed;
z-index: 1;
top: 0;
@ -44,7 +44,7 @@
}
.main {
margin-left: 190px;
margin-left: 215px;
padding: 0px 40px;
}
@ -83,8 +83,8 @@
border-radius: 25px;
border: 2px solid #FF0B7E;
padding: 20px;
width: 800px;
height: 150px;
width: 750px;
height: 200px;
}
.mainTestName {
@ -97,7 +97,15 @@
border-radius: 25px;
border: 2px solid #FF0B7E;
padding: 20px;
width: 300px;
width: 320px;
height: 250px;
}
.solvedTestContainerMini {
border-radius: 25px;
border: 2px solid #FF0B7E;
padding: 20px;
width: 320px;
height: 200px;
}
@ -107,12 +115,38 @@
}
.mainTestMeta {
font-size: 13px;
padding-bottom: 40px;
color: #808080;
padding-bottom: 30px;
/*transform: translate(150%,0%);*/
width:100%;
text-align:center;
}
.mainTestMetaLine {
padding-bottom: 10px;
display: flex;
justify-content: space-between;
}
.mainTestMetaInfoText {
width: 250px;
color: #808080;
font-size: 13px;
text-align: center;
}
.mainTestMetaLineLabels {
padding-bottom: 10px;
padding-top: 10px;
margin-left: 15%;
margin-right: 15%;
display: flex;
justify-content: space-between;
}
.mainTestMetaLabels {
font-weight: bold;
font-size: 16px;
color: #000000;
text-align: center;
}
.left {
@ -332,6 +366,15 @@ background-color:#FF0B7E
padding-bottom: 15px;
}
.resultContainer label {
font-weight: bold;
font-size: 20px;
}
.resultContainerSpace {
padding-bottom: 15px;
}
.resultImage{
}
@ -453,6 +496,7 @@ background-color:#FF0B7E
.linkDefault a {
color: #00916E;
text-decoration: none;
font-weight: bold;
}
.newContainer input[type=submit]{
@ -471,6 +515,23 @@ background-color:#FF0B7E
width: 500px;
}
.newQuestionSection {
border-radius: 25px;
border: 2px solid #FF0B7E;
padding: 20px;
width: 750px;
height: 350px;
}
.questionSectionLabelText {
font-weight: bold;
font-size: 16px;
padding-bottom: 20px;
}
.addQuestionButton {
}
.editContainer {
overflow: scroll;
}
@ -489,4 +550,16 @@ background-color:#FF0B7E
span {
margin-right: 10px;
}
.starChecked {
color: gold;
}
.fireChecked {
color: red;
}
.locked {
color: #19647E;
}

View File

@ -6,17 +6,27 @@
<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}">
<title>SOITA | {% block title %}{% endblock %}</title>
<meta name="description" content="{% block description %}{% endblock %}">
<!-- reference your installed Font Awesome Free package's files here -->
<script src="{% static 'fontawesomefree/js/all.min.js' %}"></script>
<link href="{% static 'fontawesomefree/css/all.min.css' %}" rel="stylesheet" type="text/css">
{% block additional_head %}
{% endblock %}
</head>
<body>
<div class="sidenav">
<a href="{% url 'home' %}">Strona główna</a>
<a href="{% url 'newTest' %}">Stwórz test</a>
<a href="{% url 'myTests' %}">Twoje testy</a>
<a href="{% url 'solvedTests' %}">Wyniki testów</a>
<a href="{% url 'help' %}">Pomoc</a>
<a href="{% url 'home' %}"><i class="fa-solid fa-house"></i> Strona główna</a>
<a href="{% url 'popular' %}"><i class="fa-solid fa-star"></i> Popularne </a>
<a href="{% url 'hard' %}"><i class="fa-solid fa-fire-flame-curved"></i> Trudne </a>
{% if user.type == "admin" %}
<a href="{% url 'CreateTournament' %}"><i class="fa-solid fa-trophy"></i> Stwórz turniej </a>
{% endif %}
<a href="{% url 'tournaments' %}"><i class="fa-solid fa-trophy"></i> Turnieje </a>
<br>
<a href="{% url 'newTest' %}"><i class="fa-solid fa-circle-plus"></i> Stwórz test</a>
<a href="{% url 'myTests' %}"><i class="fa-solid fa-note-sticky"></i> Twoje testy</a>
<a href="{% url 'solvedTests' %}"><i class="fa-solid fa-square-poll-horizontal"></i> Wyniki testów</a>
<p>Kategorie</p>
<a href="/category/JezykPolski">Język polski</a>
<a href="/category/JezykAngielski">Język angielski</a>
@ -30,13 +40,17 @@
<a href="/category/Historia">Historia</a>
<a href="/category/Inne">Inne</a>
<p>Konto</p>
<a href="/users/account">Ustawienia</a>
<a href="/users/logout">Wyloguj</a>
<a href="/users/account"><i class="fa-solid fa-gear"></i> Ustawienia</a>
<a href="/questionnaire/questionnaire"><i class="fa-solid fa-file-pen"></i> Ankieta</a>
<a href="{% url 'help' %}"><i class="fa-solid fa-circle-question"></i> Pomoc</a>
<a href="/users/logout"><i class="fa-solid fa-right-from-bracket"></i> Wyloguj</a>
</div>
<div id="content", name="content", class="main">
{% block content %}
{% endblock %}
<div class="mainContainer">
{% block content %}
{% endblock %}
</div>
</div>
</body>

View File

@ -14,11 +14,104 @@
<div class="mainTestContainer">
<div class="mainTestName">
{{test.name}}
{% if test.password != "" %}
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
{% endif %}
</div>
<div class="mainTestMeta">
<div class="left">Kategoria: {{test.category}}</div>
<div class="center">Próg zaliczenia: {{test.passing_score}}</div>
<div class="right">Liczba pytań: {{test.question_count}}</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
<div class="mainTestMetaInfoText">Autor: {{test.get_author_name}}</div>
<div class="mainTestMetaInfoText">Rozwiązania: {{test.completions}}</div>
</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="mainTestMetaInfoText">Maksymalna ilość punktów: {{test.get_maxscore}}</div>
<div class="mainTestMetaInfoText">Ilość pytań: {{test.question_count}}</div>
</div>
<div class="mainTestMetaLineLabels">
<div class="mainTestMetaLabels">
Trudność:
{% if test.difficulty_label == 0 %}
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
{% elif test.difficulty_label == 1 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
{% elif test.difficulty_label == 2 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
{% elif test.difficulty_label == 3 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
{% elif test.difficulty_label == 4 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
{% else %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
{% endif %}
</div>
<div class="mainTestMetaLabels">
Ocena:
{% if test.avg_rating == 0 %}
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
{% elif test.avg_rating == 1 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
{% elif test.avg_rating == 2 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
{% elif test.avg_rating == 3 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
{% elif test.avg_rating == 4 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star"></span>
{% else %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
{% endif %}
(Głosy: {{test.rates_amount}})
</div>
</div>
</div>
<!-- <div class="mainTestDesc">-->
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus volutpat scelerisque tortor, id sodales leo finibus id. Vivamus id viverra nunc, ac faucibus metus. Nulla a mauris imperdiet sapien lobortis dapibus. Quisque ornare posuere pulvinar.-->

View File

@ -9,7 +9,7 @@
<input type="submit" value="Zaktualizuj email"><br><br>
</form>
<div class="linkDefault">
<a href="{% url 'account' %}">Wróc</a>
<a href="{% url 'account' %}">Wróć</a>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>$Title$</title>
</head>
<body>
$END$
</body>
</html>

View File

@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block title %}Stwórz turniej{% endblock %}
{% block content %}
<h1>Stwórz turniej</h1>
<form method="post" novalidate>
{% for question in questions %}
<div class="mainTestName">
<div class="question_title" style="padding-top:15px; padding-bottom:10px; padding-left:5px;">
<input class="form-check-input me-1" type="radio" value={{ question.id }}>
{{ question.description }}
</div>
<div class="list-group">
{% for answer in question.answers.all %}
<label class="list-group-item">
- {{ answer.description }}<br>
</label>
{% endfor %}
</div>
{% endfor %}
</div>
</form>
<div class="testContent">
<input type="submit" value="Wyślij odpowiedzi">
</div>
{% endblock %}

118
templates/hard.html Normal file
View File

@ -0,0 +1,118 @@
{% extends "base.html" %}
{% block title %}Najtrudniejsze{% endblock %}
{% block content %}
<h1>Najtrudniejsze testy:</h1>
{% for test in tests %}
<div class="mainTestContainer">
<div class="mainTestName">
{{test.name}}
{% if test.password != "" %}
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
{% endif %}
</div>
<div class="mainTestMeta">
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
<div class="mainTestMetaInfoText">Autor: {{test.get_author_name}}</div>
<div class="mainTestMetaInfoText">Rozwiązania: {{test.completions}}</div>
</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="mainTestMetaInfoText">Maksymalna ilość punktów: {{test.get_maxscore}}</div>
<div class="mainTestMetaInfoText">Ilość pytań: {{test.question_count}}</div>
</div>
<div class="mainTestMetaLineLabels">
<div class="mainTestMetaLabels">
Trudność:
{% if test.difficulty_label == 0 %}
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
{% elif test.difficulty_label == 1 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
{% elif test.difficulty_label == 2 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
{% elif test.difficulty_label == 3 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
{% elif test.difficulty_label == 4 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
{% else %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
{% endif %}
</div>
<div class="mainTestMetaLabels">
Ocena:
{% if test.avg_rating == 0 %}
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
{% elif test.avg_rating == 1 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
{% elif test.avg_rating == 2 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
{% elif test.avg_rating == 3 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
{% elif test.avg_rating == 4 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star"></span>
{% else %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
{% endif %}
(Głosy: {{test.rates_amount}})
</div>
</div>
</div>
<!-- <div class="mainTestDesc">-->
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus volutpat scelerisque tortor, id sodales leo finibus id. Vivamus id viverra nunc, ac faucibus metus. Nulla a mauris imperdiet sapien lobortis dapibus. Quisque ornare posuere pulvinar.-->
<!-- </div>-->
<button><a href="/tests/{{test.id}}/password">Rozwiąż</a></button>
</div>
<br>
{% endfor %}
{% endblock %}

View File

@ -3,22 +3,113 @@
{% block title %}Główna{% endblock %}
{% block content %}
<h1>Rozwiąż jakiś test!</h1>
<h1>Najnowsze testy:</h1>
{% for test in tests %}
<div class="mainTestContainer">
<div class="mainTestName">
{{test.name}}
<i class="fa-solid fa-lock"></i>
{% if test.password != "" %}
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
{% endif %}
</div>
<div class="mainTestMeta">
<div class="left">Kategoria: {{test.category}}</div>
<div class="center">Próg zaliczenia: {{test.passing_score}}</div>
<div class="right">Liczba pytań: {{test.question_count}}</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
<div class="mainTestMetaInfoText">Autor: {{test.get_author_name}}</div>
<div class="mainTestMetaInfoText">Rozwiązania: {{test.completions}}</div>
</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="mainTestMetaInfoText">Maksymalna ilość punktów: {{test.get_maxscore}}</div>
<div class="mainTestMetaInfoText">Ilość pytań: {{test.question_count}}</div>
</div>
<div class="mainTestMetaLineLabels">
<div class="mainTestMetaLabels">
Trudność:
{% if test.difficulty_label == 0 %}
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
{% elif test.difficulty_label == 1 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
{% elif test.difficulty_label == 2 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
{% elif test.difficulty_label == 3 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
{% elif test.difficulty_label == 4 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
{% else %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
{% endif %}
</div>
<div class="mainTestMetaLabels">
Ocena:
{% if test.avg_rating == 0 %}
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
{% elif test.avg_rating == 1 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
{% elif test.avg_rating == 2 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
{% elif test.avg_rating == 3 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
{% elif test.avg_rating == 4 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star"></span>
{% else %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
{% endif %}
(Głosy: {{test.rates_amount}})
</div>
</div>
</div>
<!-- <div class="mainTestDesc">-->
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus volutpat scelerisque tortor, id sodales leo finibus id. Vivamus id viverra nunc, ac faucibus metus. Nulla a mauris imperdiet sapien lobortis dapibus. Quisque ornare posuere pulvinar.-->
<!-- </div>-->
{# <button><a href="/tests/{{test.id}}/show">Rozwiąż</a></button>#}
<button><a href="/tests/{{test.id}}/password">Rozwiąż</a></button>
</div>
<br>

View File

@ -8,11 +8,104 @@
<div class="mainTestContainer">
<div class="mainTestName">
{{test.name}}
{% if test.password != "" %}
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
{% endif %}
</div>
<div class="mainTestMeta">
<div class="left">Kategoria: {{test.category}}</div>
<div class="center">Próg zaliczenia: {{test.passing_score}}</div>
<div class="right">Liczba pytań: {{test.question_count}}</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
<div class="mainTestMetaInfoText">Autor: {{test.get_author_name}}</div>
<div class="mainTestMetaInfoText">Rozwiązania: {{test.completions}}</div>
</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="mainTestMetaInfoText">Maksymalna ilość punktów: {{test.get_maxscore}}</div>
<div class="mainTestMetaInfoText">Ilość pytań: {{test.question_count}}</div>
</div>
<div class="mainTestMetaLineLabels">
<div class="mainTestMetaLabels">
Trudność:
{% if test.avg_difficulty == 0.0 %}
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
{% elif test.avg_difficulty < 20.0 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
{% elif test.avg_difficulty < 40.0 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
{% elif test.avg_difficulty < 60.0 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
{% elif test.avg_difficulty < 80.0 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
{% else %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
{% endif %}
</div>
<div class="mainTestMetaLabels">
Ocena:
{% if test.avg_rating == 0 %}
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
{% elif test.avg_rating == 1 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
{% elif test.avg_rating == 2 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
{% elif test.avg_rating == 3 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
{% elif test.avg_rating == 4 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star"></span>
{% else %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
{% endif %}
(Głosy: {{test.rates_amount}})
</div>
</div>
</div>
<!-- <div class="mainTestDesc">-->
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus volutpat scelerisque tortor, id sodales leo finibus id. Vivamus id viverra nunc, ac faucibus metus. Nulla a mauris imperdiet sapien lobortis dapibus. Quisque ornare posuere pulvinar.-->

118
templates/popular.html Normal file
View File

@ -0,0 +1,118 @@
{% extends "base.html" %}
{% block title %}Najpopularniejsze{% endblock %}
{% block content %}
<h1>Najpopularniejsze testy:</h1>
{% for test in tests %}
<div class="mainTestContainer">
<div class="mainTestName">
{{test.name}}
{% if test.password != "" %}
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
{% endif %}
</div>
<div class="mainTestMeta">
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
<div class="mainTestMetaInfoText">Autor: {{test.get_author_name}}</div>
<div class="mainTestMetaInfoText">Rozwiązania: {{test.completions}}</div>
</div>
<div class="mainTestMetaLine">
<div class="mainTestMetaInfoText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="mainTestMetaInfoText">Maksymalna ilość punktów: {{test.get_maxscore}}</div>
<div class="mainTestMetaInfoText">Ilość pytań: {{test.question_count}}</div>
</div>
<div class="mainTestMetaLineLabels">
<div class="mainTestMetaLabels">
Trudność:
{% if test.difficulty_label == 0 %}
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
<span class="fa-solid fa-fire-flame-curved" title="Brak - za mało osób rozwiązało ten test"></span>
{% elif test.difficulty_label == 1 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
<span class="fa-solid fa-fire-flame-curved" title="Bardzo trudny test, średni wynik użytkowników poniżej 20%">></span>
{% elif test.difficulty_label == 2 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Trudny test, średni wynik użytkowników nie przekracza 40%"></span>
{% elif test.difficulty_label == 3 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Przeciętny test, średni wynik użytkowników nie przekracza 60%"></span>
{% elif test.difficulty_label == 4 %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
<span class="fa-solid fa-fire-flame-curved" title="Łatwy test, średni wynik użytkowników nie przekracza 80%"></span>
{% else %}
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
<span class="fa-solid fa-fire-flame-curved fireChecked" title="Banalny test, średni wynik użytkowników powyżej 80%"></span>
{% endif %}
</div>
<div class="mainTestMetaLabels">
Ocena:
{% if test.avg_rating == 0 %}
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
<span class="fa fa-star" title="Użytkownicy jeszcze nie ocenili tego testu, bądź pierwszy"></span>
{% elif test.avg_rating == 1 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako tragiczny"></span>
{% elif test.avg_rating == 2 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako słaby"></span>
{% elif test.avg_rating == 3 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
<span class="fa fa-star" title="Użytkownicy ocenili ten test jako przeciętny"></span>
{% elif test.avg_rating == 4 %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako dobry"></span>
<span class="fa fa-star"></span>
{% else %}
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
<span class="fa fa-star starChecked" title="Użytkownicy ocenili ten test jako genialny"></span>
{% endif %}
(Głosy: {{test.rates_amount}})
</div>
</div>
</div>
<!-- <div class="mainTestDesc">-->
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus volutpat scelerisque tortor, id sodales leo finibus id. Vivamus id viverra nunc, ac faucibus metus. Nulla a mauris imperdiet sapien lobortis dapibus. Quisque ornare posuere pulvinar.-->
<!-- </div>-->
<button><a href="/tests/{{test.id}}/password">Rozwiąż</a></button>
</div>
<br>
{% endfor %}
{% endblock %}

View File

@ -0,0 +1,96 @@
{% extends "base.html" %}
{% block title %}Ankieta{% endblock %}
{% block content %}
<div class="accountInfoContainer ">
<h2>Ankieta oceniająca działanie aplikacji:</h2>
<form method="post">
<label for="overall">1. Jak ogólnie oceniasz aplikację?</label>
<select name="overall" id="overall">
<option value="1">Bardzo dobrze</option>
<option value="2">Dobrze</option>
<option value="3">Przeciętnie</option>
<option value="4">Słabo</option>
<option value="5">Bardzo słabo</option>
</select>
<br>
<br>
<label for="functionality">2. Jak oceniasz ilość dostępnych funkcjonalności?</label>
<select name="functionality" id="functionality">
<option value="1">Bardzo dużo</option>
<option value="2">Sporo</option>
<option value="3">Wystarczająco</option>
<option value="4">Za mało</option>
<option value="5">O wiele za mało</option>
</select>
<br>
<br>
<label for="look">3. Jak oceniasz wygląd aplikacji?</label>
<select name="look" id="look">
<option value="1">Bardzo ładny</option>
<option value="2">Ładny</option>
<option value="3">Przeciętny</option>
<option value="4">Brzydki</option>
<option value="5">Bardzo brzydki</option>
</select>
<br>
<br>
<label for="intuitive">4. Jak często było coś dla ciebie nieintuicyjne?</label>
<select name="intuitive" id="intuitive">
<option value="1">Nigdy</option>
<option value="2">Bardzo rzadko</option>
<option value="3">Rzadko</option>
<option value="4">Często</option>
<option value="5">Bardzo często</option>
</select>
<br>
<br>
<label for="bugs">5. Jak często napotkałeś jakiekolwiek błędy?</label>
<select name="bugs" id="bugs">
<option value="1">Nigdy</option>
<option value="2">Bardzo rzadko</option>
<option value="3">Rzadko</option>
<option value="4">Często</option>
<option value="5">Bardzo często</option>
</select>
<br>
<br>
<label for="tech">6. Jak cogólnie oceniasz stonę techniczną aplikacji?</label>
<select name="tech" id="tech">
<option value="1">Bardzo dobrze</option>
<option value="2">Dobrze</option>
<option value="3">Przeciętnie</option>
<option value="4">Słsbo</option>
<option value="5">Bardzo słabo</option>
</select>
<br>
<br>
<label for="potential">7. Jak duży potencjał widzisz?</label>
<select name="potential" id="potential">
<option value="1">Bardzo duży</option>
<option value="2">Duży</option>
<option value="3">Mały</option>
<option value="4">Bardzo mały</option>
<option value="5">Nie widzę żadnego</option>
</select>
<br>
<br>
<label for="worst">8. Który element według ciebie wypada najgorzej?</label>
<select name="worst" id="worst">
<option value="1">Wygląd</option>
<option value="2">Przydatność</option>
<option value="3">Intuicyjność</option>
<option value="4">Strona techniczna</option>
<option value="5">Żaden</option>
</select>
<br>
<br>
<label for="desc">9. Dodatkowe uwagi: </label>
<input id="desc" type="text" name="desc">
<br>
<br>
<input type="submit" value="Wyślij ankietę"><br><br>
</form>
</div>
{% endblock %}

View File

@ -9,30 +9,46 @@
<div class="resultBody">
<h5 class="resultMsg">
<!-- Quite good! All the best for next quiz!-->
{% if percentage == 100 %}
{% if request.session.percentage == 100 %}
Idealnie, widzę że ten temat nie ma dla ciebie tajemnic!
{% elif percentage >= 75 %}
{% elif request.session.percentage >= 75 %}
Bardzo dobrze, ale są jeszcze pewne braki ;)
{% elif percentage >= 50 %}
{% elif request.session.percentage >= 50 %}
Nie jest źle, wiedziałeś więcej niż mniej
{% elif percentage >= 25 %}
{% elif request.session.percentage >= 25 %}
Masz spore braki, powinieneś trochę więcej się pouczyć
{% else %}
Słabiutko, ale następnym razem będzie lepiej
{% endif %}
</h5>
<h5 class="resultScore">Rezultat: {{ status }}</h5>
<h5 class="resultText">Twój wynik: {{ points }}</h5>
<h5 class="resultText">Próg zaliczenia: {{ passing }}</h5>
<h5 class="resultText">Maksymalny wynik: {{ max }}</h5>
<h5 class="resultText">Wynik procentowy: {{ percentage }}%</h5>
<button class="defaultButton"><a href="{% url 'home' %}">Strona główna</a></button>
{% if password == "" %}
<br>
<h5 class="resultScore">Rezultat: {{ request.session.status }}</h5>
<h5 class="resultText">Twój wynik: {{ request.session.points }}</h5>
<h5 class="resultText">Próg zaliczenia: {{ request.session.passing }}</h5>
<h5 class="resultText">Maksymalny wynik: {{ request.session.max }}</h5>
<h5 class="resultText">Wynik procentowy: {{ request.session.percentage }}%</h5>
<div class="resultContainerSapce"><br></div>
<span><label for="rate"><h5>Jak oceniasz test:</h5></label></span>
<select name="rate" id="rate">
<option value="1">Tragiczny</option>
<option value="2">Słaby</option>
<option value="3">Przeciętny</option>
<option value="4">Dobry</option>
<option value="5">Genialny</option>
</select>
<span><button class="defaultButton">
<a href='' onclick="this.href='rateTest?rate='+document.getElementById('rate').value">Oceń</a>
</button></span>
<div class="resultContainerSapce"><br></div>
{% if request.session.password == "" %}
<h5>Udostępnij:</h5>
{% post_to_facebook object_or_url %}
{% post_to_linkedin object_or_url %}
{% endif %}
<div class="resultContainerSapce"><br></div>
<button class="defaultButton"><a href="{% url 'home' %}">Strona główna</a></button>
</div>
</div>

View File

@ -4,16 +4,21 @@
{% block content %}
<h1>Historia rozwiązanych testów</h1>
{% for test in tests %}
<div class="solvedTestContainer">
<div class="mainTestName">
{{test.name}}
{% for test, results in tests_lists.items %}
<div class="solvedTestContainer">
<div class="mainTestName">
{{results.0.name}}
</div>
<div class="solvedTestText">Twój wynik: {{results.0.score}}</div>
<div class="solvedTestText">Próg zaliczenia: {{results.0.passing_score}}</div>
<div class="solvedTestText">Maksymalny wynik: {{results.0.max}}</div>
<div class="solvedTestText">Wynik procentowy: {{results.0.percentage}}%</div>
{% if results|length > 1 %}
<div class="linkDefault">
<a href="solved/{{results.0.id}}">Sprawdź poprzednie wyniki ({{results|length}})</a>
</div>
{% endif %}
</div>
<div class="solvedTestText">Twój wynik: {{test.score}}</div>
<div class="solvedTestText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="solvedTestText">Maksymalny wynik: {{test.max}}</div>
<div class="solvedTestText">Wynik procentowy: {{test.percentage}}%</div>
</div>
<br>
{% endfor %}
<br>
{% endfor %}
{% endblock %}

View File

@ -0,0 +1,16 @@
{% extends "base.html" %}
{% block title %}Historia testu{% endblock %}
{% block content %}
<h1>Historia testu: {{name}}</h1>
{% for test in tests %}
<div class="solvedTestContainerMini">
<div class="solvedTestText">Twój wynik: {{test.score}}</div>
<div class="solvedTestText">Próg zaliczenia: {{test.passing_score}}</div>
<div class="solvedTestText">Maksymalny wynik: {{test.max}}</div>
<div class="solvedTestText">Wynik procentowy: {{test.percentage}}%</div>
</div>
<br>
{% endfor %}
{% endblock %}

View File

@ -0,0 +1,23 @@
{% extends "base.html" %}
{% block title %}Turnieje{% endblock %}
{% block content %}
<h1>Twoje testy</h1>
{% for test in tests %}
<div class="mainTestContainer">
<div class="mainTestName">
{{tournament.name}}
<!-- {% if test.password != "" %}-->
<!-- <i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>-->
<!-- {% endif %}-->
</div>
<!-- <div class="mainTestDesc">-->
<!-- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus volutpat scelerisque tortor, id sodales leo finibus id. Vivamus id viverra nunc, ac faucibus metus. Nulla a mauris imperdiet sapien lobortis dapibus. Quisque ornare posuere pulvinar.-->
<!-- </div>-->
<button><a href="/tests/{{tournament.id}}/show">Rozwiąż</a></button>
</div>
<br>
{% endfor %}
{% endblock %}

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2022-04-16 12:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trials', '0015_test_password'),
]
operations = [
migrations.AddField(
model_name='test',
name='completions',
field=models.IntegerField(default=0),
),
]

View File

@ -0,0 +1,33 @@
# Generated by Django 3.2.9 on 2022-04-16 12:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trials', '0016_test_completions'),
]
operations = [
migrations.AddField(
model_name='test',
name='difficulty_label',
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name='test',
name='rating_label',
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name='test',
name='total_percentage_scored_by_users',
field=models.IntegerField(default=0),
),
migrations.AddField(
model_name='test',
name='total_rating',
field=models.IntegerField(default=0),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2022-04-16 13:22
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trials', '0017_auto_20220416_1431'),
]
operations = [
migrations.AddField(
model_name='test',
name='rates_Amount',
field=models.IntegerField(default=0),
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2022-04-16 13:23
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('trials', '0018_test_rates_amount'),
]
operations = [
migrations.RenameField(
model_name='test',
old_name='rates_Amount',
new_name='rates_amount',
),
]

View File

@ -0,0 +1,23 @@
# Generated by Django 3.2.9 on 2022-04-16 14:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trials', '0019_rename_rates_amount_test_rates_amount'),
]
operations = [
migrations.RenameField(
model_name='test',
old_name='rating_label',
new_name='avg_rating',
),
migrations.AddField(
model_name='test',
name='avg_difficulty',
field=models.FloatField(default=0.0),
),
]

View File

@ -0,0 +1,17 @@
# Generated by Django 3.2.9 on 2022-04-16 14:36
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('trials', '0020_auto_20220416_1634'),
]
operations = [
migrations.RemoveField(
model_name='test',
name='difficulty_label',
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2022-05-15 21:29
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trials', '0021_remove_test_difficulty_label'),
]
operations = [
migrations.AddField(
model_name='test',
name='difficulty_label',
field=models.IntegerField(default=0),
),
]

View File

@ -1,6 +1,7 @@
from django.db import models
from questions.models import Question
from users.models import User
from .managers import TestManager
@ -22,7 +23,13 @@ class Test(models.Model):
on_delete=models.CASCADE
)
password = models.CharField(max_length=100, default="")
completions = models.IntegerField(default=0)
total_percentage_scored_by_users = models.IntegerField(default=0)
total_rating = models.IntegerField(default=0)
avg_rating = models.IntegerField(default=0)
rates_amount = models.IntegerField(default=0)
difficulty_label = models.IntegerField(default=0)
avg_difficulty = models.FloatField(default=0.0)
objects = TestManager()
def get_score(self, answers):
@ -45,7 +52,7 @@ class Test(models.Model):
points += question.points
return points
def get_maxscore(self, answers):
def get_maxscore(self):
"""
[
{
@ -59,9 +66,6 @@ class Test(models.Model):
]
"""
points = 0
# for answer in answers:
# question = self.questions.get(id=answer["question"])
# points += question.points
for question in self.questions.all():
points += question.points
return points
@ -69,6 +73,14 @@ class Test(models.Model):
def question_count(self):
return Question.objects.filter(test_id=self.id).count()
def get_author_name(self):
if self.created_by:
user = User.objects.get(email=self.created_by)
user_fullname = user.first_name + " " + user.last_name
else:
user_fullname = "SOITA"
return user_fullname
def name_and_passing_score(self):
return {
"name": self.name,
@ -91,4 +103,15 @@ class SolvedTest(models.Model):
null=True,
related_name="answers",
on_delete=models.CASCADE
)
)
class Tournament(models.Model):
name = models.CharField(max_length=100)
created_by = models.ForeignKey(
"users.User",
null=True,
related_name="tournaments",
on_delete=models.CASCADE
)
password = models.CharField(max_length=100)

View File

@ -19,6 +19,14 @@ class TestSerializer(serializers.ModelSerializer):
"questions",
"visible",
"category",
"created_by",
"completions",
"total_percentage_scored_by_users",
"total_rating",
"avg_rating",
"rates_amount",
"difficulty_label",
"avg_difficulty"
)
def create(self, validated_data):

View File

@ -1,10 +1,7 @@
from django.urls import path
from rest_framework.routers import DefaultRouter
from trials.views import TestModelViewSet
from trials.views import TestTemplateView
from trials.views import TestValidateAPIView
from trials.views import TestResultView, addTest, addQuestions, myTests, editTest, solvedTests, EditTestTemplateView, deleteTest, AddQuestionToExistingTest, RemoveQuestionFromExistingTest, EditQuestionTemplateView, editName, editVisible, editPassword, TestPasswordTemplateView
from trials.views import TestModelViewSet, TestTemplateView, TestValidateAPIView, TestResultView, rateTest, addTest, addQuestions, myTests, solvedTests, solvedTestsDetailed, EditTestTemplateView, deleteTest, AddQuestionToExistingTest, RemoveQuestionFromExistingTest, EditQuestionTemplateView, editName, editVisible, editPassword, TestPasswordTemplateView, TournamentView, CreateTournamentView
router = DefaultRouter(trailing_slash=False)
router.register("items", TestModelViewSet)
@ -14,6 +11,7 @@ urlpatterns = [
path('<int:test_id>/password', TestPasswordTemplateView),
path('<int:test_id>/mark', TestValidateAPIView.as_view()),
path('<int:test_id>/result', TestResultView.as_view()),
path('<int:test_id>/rateTest', rateTest, name="rateTest"),
path('<int:test_id>/edit', EditTestTemplateView.as_view()),
path('<int:test_id>/add-question', AddQuestionToExistingTest.as_view()),
path('<int:test_id>/remove-question', RemoveQuestionFromExistingTest.as_view()),
@ -22,11 +20,13 @@ urlpatterns = [
path('<int:test_id>/editVisible', editVisible, name="editVisible"),
path('<int:test_id>/editPassword', editPassword, name="editPassword"),
path('<int:test_id>/remove', deleteTest, name="deleteTest"),
# path('delete', deleteTest, name="deleteTest"),
path('add/test', addTest, name="newTest"),
path('add/questions', addQuestions, name="addQuestions"),
path('my', myTests, name="myTests"),
path('solved', solvedTests, name="solvedTests")
path('solved', solvedTests, name="solvedTests"),
path('solved/<int:test_id>', solvedTestsDetailed, name="solvedTests"),
path('tournamets', TournamentView, name="tournaments"),
path('add/tournament', CreateTournamentView, name="CreateTournament")
]
urlpatterns += router.urls

View File

@ -8,7 +8,7 @@ from rest_framework.response import Response
from rest_framework.views import APIView
from questions.models import Question
from trials.models import Test, SolvedTest
from trials.models import Test, SolvedTest, Tournament
from trials.serializers import TestSerializer
from django.conf import settings
from django.shortcuts import render, redirect
@ -18,12 +18,12 @@ from django.template import loader
from django.template.loader import render_to_string, get_template
from django.http import HttpRequest
import requests
from django.contrib.auth.decorators import login_required
@login_required
def addTest(request):
return render(request, 'createTest.html')
def is_visible(visible):
if visible =="public":
return True
@ -83,6 +83,15 @@ def addQuestions(request, **kwargs):
return redirect('home')
return render(request, 'addQuestions.html')
def TournamentView(request):
context = {}
context['tournament'] = Tournament.objects.all()
return render(request, 'tournaments.html', context)
def CreateTournamentView(request):
context = {}
context['questions'] = Question.objects.all()
return render(request, 'createTournament.html', context)
class AddQuestionToExistingTest(TemplateView):
template_name = settings.BASE_DIR + f"/templates/addQuestionToExistingTest.html"
@ -144,43 +153,58 @@ class RemoveQuestionFromExistingTest(TemplateView):
Question.objects.get(id=request.POST["id"]).delete()
return redirect(f'/tests/{kwargs["test_id"]}/edit')
@login_required
def myTests(request):
context = {}
user = request.user.id
context['tests'] = Test.objects.filter(created_by=user)
return render(request, 'myTests.html', context)
@login_required
def solvedTests(request):
context = {}
user_id = request.user.id
solved_tests = SolvedTest.objects.filter(user__id=user_id)
dict_with_lists_of_test_results = {}
for solved_test in solved_tests:
if solved_test.test.name_and_passing_score()["name"] in dict_with_lists_of_test_results.keys():
dict_with_lists_of_test_results[solved_test.test.name_and_passing_score()["name"]].insert(0, {
"name": solved_test.test.name_and_passing_score()["name"],
"passing_score": solved_test.test.name_and_passing_score()["passing_score"],
"score": solved_test.score,
"max": solved_test.max,
"percentage": solved_test.percentage,
"id": solved_test.test.id
})
else:
dict_with_lists_of_test_results[solved_test.test.name_and_passing_score()["name"]] = []
dict_with_lists_of_test_results[solved_test.test.name_and_passing_score()["name"]].append({
"name": solved_test.test.name_and_passing_score()["name"],
"passing_score": solved_test.test.name_and_passing_score()["passing_score"],
"score": solved_test.score,
"max": solved_test.max,
"percentage": solved_test.percentage,
"id": solved_test.test.id
})
context['tests_lists'] = dict_with_lists_of_test_results
return render(request, 'solvedTests.html', context)
@login_required
def solvedTestsDetailed(request, test_id):
context = {}
solved_tests = SolvedTest.objects.filter(test__id=test_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"],
"score": solved_test.score,
"max": solved_test.max,
"percentage": solved_test.percentage
"percentage": solved_test.percentage,
"id": solved_test.test.id
})
context['name'] = solved_tests[0].test.name_and_passing_score()["name"]
context['tests'] = formatted_tests
return render(request, 'solvedTests.html', context)
def editTest(request):
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')
return render(request, 'solvedTestsDetailed.html', context)
class EditTestTemplateView(TemplateView):
@ -253,12 +277,12 @@ class EditQuestionTemplateView(TemplateView):
Question.objects.EditQuestion(question_id=question_id, name=description, answers=answers)
return redirect(f'/tests/{test}/edit')
@login_required
def deleteTest(request, test_id):
Test.objects.filter(id=test_id).delete()
return redirect('myTests')
@login_required
def editVisible(request, test_id):
new_visible = request.GET["visible"]
if new_visible == "public":
@ -270,6 +294,7 @@ def editVisible(request, test_id):
test.save()
return redirect(f'/tests/{test_id}/edit')
@login_required
def editName(request, test_id):
new_name = request.GET["name"]
test = Test.objects.get(id=test_id)
@ -277,7 +302,7 @@ def editName(request, test_id):
test.save()
return redirect(f'/tests/{test_id}/edit')
@login_required
def editPassword(request, test_id):
new_password = request.GET["password"]
test = Test.objects.get(id=test_id)
@ -285,6 +310,17 @@ def editPassword(request, test_id):
test.save()
return redirect(f'/tests/{test_id}/edit')
@login_required
def rateTest(request, test_id):
test = Test.objects.get(id=test_id)
rate = request.GET["rate"]
test.rates_amount += 1
test.total_rating += int(rate)
avg_rating = test.total_rating / test.rates_amount
test.avg_rating = int(avg_rating)
test.save()
return redirect(f'/tests/{test_id}/result')
class TestModelViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
@ -317,8 +353,8 @@ class TestTemplateView(TemplateView):
def get_score(self, test: Test, answers):
return test.get_score(answers)
def get_maxscore(self, test: Test, answers):
return test.get_maxscore(answers)
def get_maxscore(self, test: Test):
return test.get_maxscore()
def formatted_responses(self, unformatted_json):
formatted_response = list()
@ -334,16 +370,22 @@ class TestTemplateView(TemplateView):
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))
max = self.get_maxscore(test, self.formatted_responses(request.POST))
max = self.get_maxscore(test)
status = score >= test.passing_score
context = {
"status": self.PASSED.get(status, self.UNKNOWN),
"points": score,
"max": max,
"passing": test.passing_score,
"percentage": int(score / max * 100),
"password": test.password
}
# context = {
# "status": self.PASSED.get(status, self.UNKNOWN),
# "points": score,
# "max": max,
# "passing": test.passing_score,
# "percentage": int(score / max * 100),
# "password": test.password
# }
request.session["status"] = self.PASSED.get(status, self.UNKNOWN)
request.session["points"] = score
request.session["max"] = max
request.session["passing"] = test.passing_score
request.session["percentage"] = int(score / max * 100)
request.session["password"] = test.password
SolvedTest.objects.create(
score=score,
max=max,
@ -351,11 +393,25 @@ class TestTemplateView(TemplateView):
user=request.user,
test=test
)
template_name = "result.html"
template = get_template(template_name)
return HttpResponse(template.render(context, request))
test.completions += 1
test.total_percentage_scored_by_users += int(score / max * 100)
if test.completions >= 5:
test.avg_difficulty = float(test.total_percentage_scored_by_users) / float(test.completions)
if test.avg_difficulty > 90.0:
test.difficulty_label = 1
elif test.avg_difficulty > 75.0:
test.difficulty_label = 2
elif test.avg_difficulty > 50.0:
test.difficulty_label = 3
elif test.avg_difficulty > 25.0:
test.difficulty_label = 4
else:
test.difficulty_label = 5
test.save()
return HttpResponseRedirect(f'result')
@login_required
def TestPasswordTemplateView(request, test_id):
test = Test.objects.get(id=test_id)
if test.password == "":
@ -366,6 +422,7 @@ def TestPasswordTemplateView(request, test_id):
return render(request, 'testPassword.html')
@login_required
def testView(request):
permission_classes = []
template_name = settings.BASE_DIR + f"/templates/generic_test.html"

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2022-05-15 21:48
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0004_alter_user_is_active'),
]
operations = [
migrations.AddField(
model_name='user',
name='type',
field=models.CharField(choices=[('admin', 'admin'), ('standard', 'standard')], default='standard', max_length=100),
),
]

View File

@ -5,6 +5,15 @@ from .managers import UserManager
class User(AbstractBaseUser):
ADMIN = "admin"
STANDARD = "standard"
USER_TYPES = (
("admin", ADMIN),
("standard", STANDARD),
)
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
@ -14,6 +23,7 @@ class User(AbstractBaseUser):
confirmation_number = models.CharField(max_length=100)
reset_code = models.IntegerField(null=True)
avatar = models.ImageField(upload_to="avatars/", null=True)
type = models.CharField(choices=USER_TYPES, default=STANDARD, max_length=100)
USERNAME_FIELD = "email"

View File

@ -90,7 +90,8 @@ def register(request):
email=form.cleaned_data["email"],
first_name=form.cleaned_data["first_name"],
last_name=form.cleaned_data["last_name"],
password=form.cleaned_data["password1"]
password=form.cleaned_data["password1"],
type="standard"
)
return redirect('register_success')
else: