Merge pull request 'develop/soita-2.0' (#36) from develop/soita-2.0 into master
Reviewed-on: #36
This commit is contained in:
commit
095ce37585
@ -55,13 +55,16 @@ INSTALLED_APPS = [
|
|||||||
"rest_framework_simplejwt",
|
"rest_framework_simplejwt",
|
||||||
"django_extensions",
|
"django_extensions",
|
||||||
"django_social_share",
|
"django_social_share",
|
||||||
|
'fontawesomefree',
|
||||||
|
"jquery",
|
||||||
|
|
||||||
"users",
|
"users",
|
||||||
"trials",
|
"trials",
|
||||||
"answers",
|
"answers",
|
||||||
"questions",
|
"questions",
|
||||||
"categories",
|
"categories",
|
||||||
"tools"
|
"tools",
|
||||||
|
"questionnaire"
|
||||||
]
|
]
|
||||||
# AUTHENTICATION_BACKENDS = ['config.authh.SettingsBackend']
|
# AUTHENTICATION_BACKENDS = ['config.authh.SettingsBackend']
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
@ -16,18 +16,21 @@ Including another URLconf
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import include
|
from django.urls import include
|
||||||
from django.urls import path
|
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
|
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', welcome, name='welcome'),
|
path('', welcome, name='welcome'),
|
||||||
path('home', home, name='home'),
|
path('home', home, name='home'),
|
||||||
|
path('popular', popular, name='popular'),
|
||||||
|
path('hard', hard, name='hard'),
|
||||||
path('help', help, name='help'),
|
path('help', help, name='help'),
|
||||||
path('users/', include("users.urls")),
|
path('users/', include("users.urls")),
|
||||||
path('questions/', include("questions.urls")),
|
path('questions/', include("questions.urls")),
|
||||||
path('answers/', include("answers.urls")),
|
path('answers/', include("answers.urls")),
|
||||||
path('tests/', include("trials.urls")),
|
path('tests/', include("trials.urls")),
|
||||||
path('category/', include("categories.urls")),
|
path('category/', include("categories.urls")),
|
||||||
|
path('questionnaire/', include("questionnaire.urls")),
|
||||||
]
|
]
|
||||||
|
|
||||||
urlpatterns += staticfiles_urlpatterns()
|
urlpatterns += staticfiles_urlpatterns()
|
||||||
|
@ -2,6 +2,7 @@ from django.shortcuts import render, redirect
|
|||||||
from django.template import loader
|
from django.template import loader
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from trials.models import Test
|
from trials.models import Test
|
||||||
|
import operator
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@ -18,6 +19,19 @@ def home(request):
|
|||||||
def help(request):
|
def help(request):
|
||||||
return render(request, 'help.html', )
|
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):
|
def welcome(request):
|
||||||
return render(request, 'welcome.html')
|
return render(request, 'welcome.html')
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
Color palette:
|
Color palette:
|
||||||
#00916E - Illuminating Emerald
|
|
||||||
#FEEFE5 - Linen
|
#FEEFE5 - Linen
|
||||||
#FFCF00 - Cyber Yellow
|
#FFCF00 - Cyber Yellow
|
||||||
#EE6123 - Orange Panteon
|
#EE6123 - Orange Panteon
|
||||||
#FA003F - Red Munsell
|
#FA003F - Red Munsell
|
||||||
|
|
||||||
|
Buttons and links
|
||||||
|
#00916E - Illuminating Emerald
|
||||||
|
|
||||||
|
Main color:
|
||||||
#FF0B7E - Winter Sky
|
#FF0B7E - Winter Sky
|
||||||
|
|
||||||
|
#19647E - Blue Sapphire
|
0
questionnaire/__init__.py
Normal file
0
questionnaire/__init__.py
Normal file
0
questionnaire/apps.py
Normal file
0
questionnaire/apps.py
Normal file
22
questionnaire/managers.py
Normal file
22
questionnaire/managers.py
Normal 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
|
33
questionnaire/migrations/0001_initial.py
Normal file
33
questionnaire/migrations/0001_initial.py
Normal 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)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
0
questionnaire/migrations/__init__.py
Normal file
0
questionnaire/migrations/__init__.py
Normal file
22
questionnaire/models.py
Normal file
22
questionnaire/models.py
Normal 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()
|
28
questionnaire/serializers.py
Normal file
28
questionnaire/serializers.py
Normal 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
12
questionnaire/urls.py
Normal 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
22
questionnaire/views.py
Normal 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')
|
@ -19,4 +19,9 @@ class Question(models.Model):
|
|||||||
for answer in self.answers.all()
|
for answer in self.answers.all()
|
||||||
]
|
]
|
||||||
|
|
||||||
|
tournament = models.ManyToManyField(
|
||||||
|
"trials.Tournament",
|
||||||
|
null=True
|
||||||
|
)
|
||||||
|
|
||||||
objects = QuestionManager()
|
objects = QuestionManager()
|
@ -109,3 +109,4 @@ wcwidth==0.2.5
|
|||||||
webencodings==0.5.1
|
webencodings==0.5.1
|
||||||
widgetsnbextension==3.5.2
|
widgetsnbextension==3.5.2
|
||||||
zipp==3.6.0
|
zipp==3.6.0
|
||||||
|
fontawesomefree==6.1.1
|
21
static/script.js
Normal file
21
static/script.js
Normal 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);
|
||||||
|
});
|
@ -1,6 +1,6 @@
|
|||||||
.sidenav {
|
.sidenav {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
width: 195px;
|
width: 215px;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
top: 0;
|
top: 0;
|
||||||
@ -44,7 +44,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.main {
|
.main {
|
||||||
margin-left: 190px;
|
margin-left: 215px;
|
||||||
padding: 0px 40px;
|
padding: 0px 40px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,8 +83,8 @@
|
|||||||
border-radius: 25px;
|
border-radius: 25px;
|
||||||
border: 2px solid #FF0B7E;
|
border: 2px solid #FF0B7E;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
width: 800px;
|
width: 750px;
|
||||||
height: 150px;
|
height: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mainTestName {
|
.mainTestName {
|
||||||
@ -97,7 +97,15 @@
|
|||||||
border-radius: 25px;
|
border-radius: 25px;
|
||||||
border: 2px solid #FF0B7E;
|
border: 2px solid #FF0B7E;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
width: 300px;
|
width: 320px;
|
||||||
|
height: 250px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.solvedTestContainerMini {
|
||||||
|
border-radius: 25px;
|
||||||
|
border: 2px solid #FF0B7E;
|
||||||
|
padding: 20px;
|
||||||
|
width: 320px;
|
||||||
height: 200px;
|
height: 200px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -107,12 +115,38 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.mainTestMeta {
|
.mainTestMeta {
|
||||||
font-size: 13px;
|
padding-bottom: 30px;
|
||||||
padding-bottom: 40px;
|
|
||||||
color: #808080;
|
|
||||||
/*transform: translate(150%,0%);*/
|
/*transform: translate(150%,0%);*/
|
||||||
width:100%;
|
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 {
|
.left {
|
||||||
@ -332,6 +366,15 @@ background-color:#FF0B7E
|
|||||||
padding-bottom: 15px;
|
padding-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.resultContainer label {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.resultContainerSpace {
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
.resultImage{
|
.resultImage{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -453,6 +496,7 @@ background-color:#FF0B7E
|
|||||||
.linkDefault a {
|
.linkDefault a {
|
||||||
color: #00916E;
|
color: #00916E;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
.newContainer input[type=submit]{
|
.newContainer input[type=submit]{
|
||||||
@ -471,6 +515,23 @@ background-color:#FF0B7E
|
|||||||
width: 500px;
|
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 {
|
.editContainer {
|
||||||
overflow: scroll;
|
overflow: scroll;
|
||||||
}
|
}
|
||||||
@ -490,3 +551,15 @@ background-color:#FF0B7E
|
|||||||
span {
|
span {
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.starChecked {
|
||||||
|
color: gold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fireChecked {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.locked {
|
||||||
|
color: #19647E;
|
||||||
|
}
|
@ -6,17 +6,27 @@
|
|||||||
<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}">
|
<link rel="stylesheet" type="text/css" href="{% static 'style.css' %}">
|
||||||
<title>SOITA | {% block title %}{% endblock %}</title>
|
<title>SOITA | {% block title %}{% endblock %}</title>
|
||||||
<meta name="description" content="{% block description %}{% endblock %}">
|
<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 %}
|
{% block additional_head %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<div class="sidenav">
|
<div class="sidenav">
|
||||||
<a href="{% url 'home' %}">Strona główna</a>
|
<a href="{% url 'home' %}"><i class="fa-solid fa-house"></i> Strona główna</a>
|
||||||
<a href="{% url 'newTest' %}">Stwórz test</a>
|
<a href="{% url 'popular' %}"><i class="fa-solid fa-star"></i> Popularne </a>
|
||||||
<a href="{% url 'myTests' %}">Twoje testy</a>
|
<a href="{% url 'hard' %}"><i class="fa-solid fa-fire-flame-curved"></i> Trudne </a>
|
||||||
<a href="{% url 'solvedTests' %}">Wyniki testów</a>
|
{% if user.type == "admin" %}
|
||||||
<a href="{% url 'help' %}">Pomoc</a>
|
<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>
|
<p>Kategorie</p>
|
||||||
<a href="/category/JezykPolski">Język polski</a>
|
<a href="/category/JezykPolski">Język polski</a>
|
||||||
<a href="/category/JezykAngielski">Język angielski</a>
|
<a href="/category/JezykAngielski">Język angielski</a>
|
||||||
@ -30,14 +40,18 @@
|
|||||||
<a href="/category/Historia">Historia</a>
|
<a href="/category/Historia">Historia</a>
|
||||||
<a href="/category/Inne">Inne</a>
|
<a href="/category/Inne">Inne</a>
|
||||||
<p>Konto</p>
|
<p>Konto</p>
|
||||||
<a href="/users/account">Ustawienia</a>
|
<a href="/users/account"><i class="fa-solid fa-gear"></i> Ustawienia</a>
|
||||||
<a href="/users/logout">Wyloguj</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>
|
||||||
|
|
||||||
<div id="content", name="content", class="main">
|
<div id="content", name="content", class="main">
|
||||||
|
<div class="mainContainer">
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
@ -14,11 +14,104 @@
|
|||||||
<div class="mainTestContainer">
|
<div class="mainTestContainer">
|
||||||
<div class="mainTestName">
|
<div class="mainTestName">
|
||||||
{{test.name}}
|
{{test.name}}
|
||||||
|
{% if test.password != "" %}
|
||||||
|
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="mainTestMeta">
|
<div class="mainTestMeta">
|
||||||
<div class="left">Kategoria: {{test.category}}</div>
|
<div class="mainTestMetaLine">
|
||||||
<div class="center">Próg zaliczenia: {{test.passing_score}}</div>
|
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
|
||||||
<div class="right">Liczba pytań: {{test.question_count}}</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>
|
||||||
<!-- <div class="mainTestDesc">-->
|
<!-- <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.-->
|
<!-- 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.-->
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
<input type="submit" value="Zaktualizuj email"><br><br>
|
<input type="submit" value="Zaktualizuj email"><br><br>
|
||||||
</form>
|
</form>
|
||||||
<div class="linkDefault">
|
<div class="linkDefault">
|
||||||
<a href="{% url 'account' %}">Wróc</a>
|
<a href="{% url 'account' %}">Wróć</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
10
templates/createTestNew.html
Normal file
10
templates/createTestNew.html
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>$Title$</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
$END$
|
||||||
|
</body>
|
||||||
|
</html>
|
28
templates/createTournament.html
Normal file
28
templates/createTournament.html
Normal 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
118
templates/hard.html
Normal 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 %}
|
||||||
|
|
@ -3,22 +3,113 @@
|
|||||||
{% block title %}Główna{% endblock %}
|
{% block title %}Główna{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>Rozwiąż jakiś test!</h1>
|
<h1>Najnowsze testy:</h1>
|
||||||
{% for test in tests %}
|
{% for test in tests %}
|
||||||
<div class="mainTestContainer">
|
<div class="mainTestContainer">
|
||||||
<div class="mainTestName">
|
<div class="mainTestName">
|
||||||
{{test.name}}
|
{{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>
|
||||||
<div class="mainTestMeta">
|
<div class="mainTestMeta">
|
||||||
<div class="left">Kategoria: {{test.category}}</div>
|
<div class="mainTestMetaLine">
|
||||||
<div class="center">Próg zaliczenia: {{test.passing_score}}</div>
|
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
|
||||||
<div class="right">Liczba pytań: {{test.question_count}}</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>
|
||||||
<!-- <div class="mainTestDesc">-->
|
<!-- <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.-->
|
<!-- 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>-->
|
<!-- </div>-->
|
||||||
{# <button><a href="/tests/{{test.id}}/show">Rozwiąż</a></button>#}
|
|
||||||
<button><a href="/tests/{{test.id}}/password">Rozwiąż</a></button>
|
<button><a href="/tests/{{test.id}}/password">Rozwiąż</a></button>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
@ -8,11 +8,104 @@
|
|||||||
<div class="mainTestContainer">
|
<div class="mainTestContainer">
|
||||||
<div class="mainTestName">
|
<div class="mainTestName">
|
||||||
{{test.name}}
|
{{test.name}}
|
||||||
|
{% if test.password != "" %}
|
||||||
|
<i class="fa-solid fa-lock locked" title="Test chroniony hasłem"></i>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
<div class="mainTestMeta">
|
<div class="mainTestMeta">
|
||||||
<div class="left">Kategoria: {{test.category}}</div>
|
<div class="mainTestMetaLine">
|
||||||
<div class="center">Próg zaliczenia: {{test.passing_score}}</div>
|
<div class="mainTestMetaInfoText">Kategoria: {{test.category}}</div>
|
||||||
<div class="right">Liczba pytań: {{test.question_count}}</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>
|
||||||
<!-- <div class="mainTestDesc">-->
|
<!-- <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.-->
|
<!-- 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
118
templates/popular.html
Normal 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 %}
|
||||||
|
|
96
templates/questionnaire.html
Normal file
96
templates/questionnaire.html
Normal 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 %}
|
@ -9,30 +9,46 @@
|
|||||||
<div class="resultBody">
|
<div class="resultBody">
|
||||||
<h5 class="resultMsg">
|
<h5 class="resultMsg">
|
||||||
<!-- Quite good! All the best for next quiz!-->
|
<!-- 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!
|
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 ;)
|
Bardzo dobrze, ale są jeszcze pewne braki ;)
|
||||||
{% elif percentage >= 50 %}
|
{% elif request.session.percentage >= 50 %}
|
||||||
Nie jest źle, wiedziałeś więcej niż mniej
|
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ć
|
Masz spore braki, powinieneś trochę więcej się pouczyć
|
||||||
{% else %}
|
{% else %}
|
||||||
Słabiutko, ale następnym razem będzie lepiej
|
Słabiutko, ale następnym razem będzie lepiej
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</h5>
|
</h5>
|
||||||
<h5 class="resultScore">Rezultat: {{ status }}</h5>
|
<h5 class="resultScore">Rezultat: {{ request.session.status }}</h5>
|
||||||
<h5 class="resultText">Twój wynik: {{ points }}</h5>
|
<h5 class="resultText">Twój wynik: {{ request.session.points }}</h5>
|
||||||
<h5 class="resultText">Próg zaliczenia: {{ passing }}</h5>
|
<h5 class="resultText">Próg zaliczenia: {{ request.session.passing }}</h5>
|
||||||
<h5 class="resultText">Maksymalny wynik: {{ max }}</h5>
|
<h5 class="resultText">Maksymalny wynik: {{ request.session.max }}</h5>
|
||||||
<h5 class="resultText">Wynik procentowy: {{ percentage }}%</h5>
|
<h5 class="resultText">Wynik procentowy: {{ request.session.percentage }}%</h5>
|
||||||
<button class="defaultButton"><a href="{% url 'home' %}">Strona główna</a></button>
|
|
||||||
{% if password == "" %}
|
<div class="resultContainerSapce"><br></div>
|
||||||
<br>
|
<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>
|
<h5>Udostępnij:</h5>
|
||||||
{% post_to_facebook object_or_url %}
|
{% post_to_facebook object_or_url %}
|
||||||
{% post_to_linkedin object_or_url %}
|
{% post_to_linkedin object_or_url %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="resultContainerSapce"><br></div>
|
||||||
|
<button class="defaultButton"><a href="{% url 'home' %}">Strona główna</a></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -4,15 +4,20 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>Historia rozwiązanych testów</h1>
|
<h1>Historia rozwiązanych testów</h1>
|
||||||
{% for test in tests %}
|
{% for test, results in tests_lists.items %}
|
||||||
<div class="solvedTestContainer">
|
<div class="solvedTestContainer">
|
||||||
<div class="mainTestName">
|
<div class="mainTestName">
|
||||||
{{test.name}}
|
{{results.0.name}}
|
||||||
</div>
|
</div>
|
||||||
<div class="solvedTestText">Twój wynik: {{test.score}}</div>
|
<div class="solvedTestText">Twój wynik: {{results.0.score}}</div>
|
||||||
<div class="solvedTestText">Próg zaliczenia: {{test.passing_score}}</div>
|
<div class="solvedTestText">Próg zaliczenia: {{results.0.passing_score}}</div>
|
||||||
<div class="solvedTestText">Maksymalny wynik: {{test.max}}</div>
|
<div class="solvedTestText">Maksymalny wynik: {{results.0.max}}</div>
|
||||||
<div class="solvedTestText">Wynik procentowy: {{test.percentage}}%</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>
|
||||||
<br>
|
<br>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
16
templates/solvedTestsDetailed.html
Normal file
16
templates/solvedTestsDetailed.html
Normal 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 %}
|
23
templates/tournaments.html
Normal file
23
templates/tournaments.html
Normal 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 %}
|
||||||
|
|
18
trials/migrations/0016_test_completions.py
Normal file
18
trials/migrations/0016_test_completions.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
33
trials/migrations/0017_auto_20220416_1431.py
Normal file
33
trials/migrations/0017_auto_20220416_1431.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
18
trials/migrations/0018_test_rates_amount.py
Normal file
18
trials/migrations/0018_test_rates_amount.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
@ -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',
|
||||||
|
),
|
||||||
|
]
|
23
trials/migrations/0020_auto_20220416_1634.py
Normal file
23
trials/migrations/0020_auto_20220416_1634.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
17
trials/migrations/0021_remove_test_difficulty_label.py
Normal file
17
trials/migrations/0021_remove_test_difficulty_label.py
Normal 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',
|
||||||
|
),
|
||||||
|
]
|
18
trials/migrations/0022_test_difficulty_label.py
Normal file
18
trials/migrations/0022_test_difficulty_label.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
@ -1,6 +1,7 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
from questions.models import Question
|
from questions.models import Question
|
||||||
|
from users.models import User
|
||||||
from .managers import TestManager
|
from .managers import TestManager
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +23,13 @@ class Test(models.Model):
|
|||||||
on_delete=models.CASCADE
|
on_delete=models.CASCADE
|
||||||
)
|
)
|
||||||
password = models.CharField(max_length=100, default="")
|
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()
|
objects = TestManager()
|
||||||
|
|
||||||
def get_score(self, answers):
|
def get_score(self, answers):
|
||||||
@ -45,7 +52,7 @@ class Test(models.Model):
|
|||||||
points += question.points
|
points += question.points
|
||||||
return points
|
return points
|
||||||
|
|
||||||
def get_maxscore(self, answers):
|
def get_maxscore(self):
|
||||||
"""
|
"""
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@ -59,9 +66,6 @@ class Test(models.Model):
|
|||||||
]
|
]
|
||||||
"""
|
"""
|
||||||
points = 0
|
points = 0
|
||||||
# for answer in answers:
|
|
||||||
# question = self.questions.get(id=answer["question"])
|
|
||||||
# points += question.points
|
|
||||||
for question in self.questions.all():
|
for question in self.questions.all():
|
||||||
points += question.points
|
points += question.points
|
||||||
return points
|
return points
|
||||||
@ -69,6 +73,14 @@ class Test(models.Model):
|
|||||||
def question_count(self):
|
def question_count(self):
|
||||||
return Question.objects.filter(test_id=self.id).count()
|
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):
|
def name_and_passing_score(self):
|
||||||
return {
|
return {
|
||||||
"name": self.name,
|
"name": self.name,
|
||||||
@ -92,3 +104,14 @@ class SolvedTest(models.Model):
|
|||||||
related_name="answers",
|
related_name="answers",
|
||||||
on_delete=models.CASCADE
|
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)
|
||||||
|
@ -19,6 +19,14 @@ class TestSerializer(serializers.ModelSerializer):
|
|||||||
"questions",
|
"questions",
|
||||||
"visible",
|
"visible",
|
||||||
"category",
|
"category",
|
||||||
|
"created_by",
|
||||||
|
"completions",
|
||||||
|
"total_percentage_scored_by_users",
|
||||||
|
"total_rating",
|
||||||
|
"avg_rating",
|
||||||
|
"rates_amount",
|
||||||
|
"difficulty_label",
|
||||||
|
"avg_difficulty"
|
||||||
)
|
)
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
|
@ -1,10 +1,7 @@
|
|||||||
from django.urls import path
|
from django.urls import path
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
from trials.views import TestModelViewSet
|
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
|
||||||
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
|
|
||||||
|
|
||||||
router = DefaultRouter(trailing_slash=False)
|
router = DefaultRouter(trailing_slash=False)
|
||||||
router.register("items", TestModelViewSet)
|
router.register("items", TestModelViewSet)
|
||||||
@ -14,6 +11,7 @@ urlpatterns = [
|
|||||||
path('<int:test_id>/password', TestPasswordTemplateView),
|
path('<int:test_id>/password', TestPasswordTemplateView),
|
||||||
path('<int:test_id>/mark', TestValidateAPIView.as_view()),
|
path('<int:test_id>/mark', TestValidateAPIView.as_view()),
|
||||||
path('<int:test_id>/result', TestResultView.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>/edit', EditTestTemplateView.as_view()),
|
||||||
path('<int:test_id>/add-question', AddQuestionToExistingTest.as_view()),
|
path('<int:test_id>/add-question', AddQuestionToExistingTest.as_view()),
|
||||||
path('<int:test_id>/remove-question', RemoveQuestionFromExistingTest.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>/editVisible', editVisible, name="editVisible"),
|
||||||
path('<int:test_id>/editPassword', editPassword, name="editPassword"),
|
path('<int:test_id>/editPassword', editPassword, name="editPassword"),
|
||||||
path('<int:test_id>/remove', deleteTest, name="deleteTest"),
|
path('<int:test_id>/remove', deleteTest, name="deleteTest"),
|
||||||
# path('delete', deleteTest, name="deleteTest"),
|
|
||||||
path('add/test', addTest, name="newTest"),
|
path('add/test', addTest, name="newTest"),
|
||||||
path('add/questions', addQuestions, name="addQuestions"),
|
path('add/questions', addQuestions, name="addQuestions"),
|
||||||
path('my', myTests, name="myTests"),
|
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
|
urlpatterns += router.urls
|
||||||
|
135
trials/views.py
135
trials/views.py
@ -8,7 +8,7 @@ from rest_framework.response import Response
|
|||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
from questions.models import Question
|
from questions.models import Question
|
||||||
from trials.models import Test, SolvedTest
|
from trials.models import Test, SolvedTest, Tournament
|
||||||
from trials.serializers import TestSerializer
|
from trials.serializers import TestSerializer
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.shortcuts import render, redirect
|
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.template.loader import render_to_string, get_template
|
||||||
from django.http import HttpRequest
|
from django.http import HttpRequest
|
||||||
import requests
|
import requests
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
|
||||||
|
@login_required
|
||||||
def addTest(request):
|
def addTest(request):
|
||||||
return render(request, 'createTest.html')
|
return render(request, 'createTest.html')
|
||||||
|
|
||||||
|
|
||||||
def is_visible(visible):
|
def is_visible(visible):
|
||||||
if visible =="public":
|
if visible =="public":
|
||||||
return True
|
return True
|
||||||
@ -83,6 +83,15 @@ def addQuestions(request, **kwargs):
|
|||||||
return redirect('home')
|
return redirect('home')
|
||||||
return render(request, 'addQuestions.html')
|
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):
|
class AddQuestionToExistingTest(TemplateView):
|
||||||
template_name = settings.BASE_DIR + f"/templates/addQuestionToExistingTest.html"
|
template_name = settings.BASE_DIR + f"/templates/addQuestionToExistingTest.html"
|
||||||
@ -144,43 +153,58 @@ class RemoveQuestionFromExistingTest(TemplateView):
|
|||||||
Question.objects.get(id=request.POST["id"]).delete()
|
Question.objects.get(id=request.POST["id"]).delete()
|
||||||
return redirect(f'/tests/{kwargs["test_id"]}/edit')
|
return redirect(f'/tests/{kwargs["test_id"]}/edit')
|
||||||
|
|
||||||
|
@login_required
|
||||||
def myTests(request):
|
def myTests(request):
|
||||||
context = {}
|
context = {}
|
||||||
user = request.user.id
|
user = request.user.id
|
||||||
context['tests'] = Test.objects.filter(created_by=user)
|
context['tests'] = Test.objects.filter(created_by=user)
|
||||||
return render(request, 'myTests.html', context)
|
return render(request, 'myTests.html', context)
|
||||||
|
|
||||||
|
@login_required
|
||||||
def solvedTests(request):
|
def solvedTests(request):
|
||||||
context = {}
|
context = {}
|
||||||
user_id = request.user.id
|
user_id = request.user.id
|
||||||
solved_tests = SolvedTest.objects.filter(user__id=user_id)
|
solved_tests = SolvedTest.objects.filter(user__id=user_id)
|
||||||
formatted_tests = list()
|
dict_with_lists_of_test_results = {}
|
||||||
for solved_test in solved_tests:
|
for solved_test in solved_tests:
|
||||||
formatted_tests.append({
|
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"],
|
"name": solved_test.test.name_and_passing_score()["name"],
|
||||||
"passing_score": solved_test.test.name_and_passing_score()["passing_score"],
|
"passing_score": solved_test.test.name_and_passing_score()["passing_score"],
|
||||||
"score": solved_test.score,
|
"score": solved_test.score,
|
||||||
"max": solved_test.max,
|
"max": solved_test.max,
|
||||||
"percentage": solved_test.percentage
|
"percentage": solved_test.percentage,
|
||||||
|
"id": solved_test.test.id
|
||||||
})
|
})
|
||||||
context['tests'] = formatted_tests
|
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)
|
return render(request, 'solvedTests.html', context)
|
||||||
|
|
||||||
|
@login_required
|
||||||
def editTest(request):
|
def solvedTestsDetailed(request, test_id):
|
||||||
if request.POST:
|
context = {}
|
||||||
# TODO here
|
solved_tests = SolvedTest.objects.filter(test__id=test_id)
|
||||||
# firstName = request.POST.get("firstName")
|
formatted_tests = list()
|
||||||
# lastName = request.POST.get("lastName")
|
for solved_test in solved_tests:
|
||||||
#
|
formatted_tests.append({
|
||||||
# u = request.user
|
"passing_score": solved_test.test.name_and_passing_score()["passing_score"],
|
||||||
# u.first_name = firstName
|
"score": solved_test.score,
|
||||||
# u.last_name = lastName
|
"max": solved_test.max,
|
||||||
# u.save()
|
"percentage": solved_test.percentage,
|
||||||
return redirect('myTests')
|
"id": solved_test.test.id
|
||||||
return render(request, 'editTest.html')
|
})
|
||||||
|
context['name'] = solved_tests[0].test.name_and_passing_score()["name"]
|
||||||
|
context['tests'] = formatted_tests
|
||||||
|
return render(request, 'solvedTestsDetailed.html', context)
|
||||||
|
|
||||||
|
|
||||||
class EditTestTemplateView(TemplateView):
|
class EditTestTemplateView(TemplateView):
|
||||||
@ -253,12 +277,12 @@ class EditQuestionTemplateView(TemplateView):
|
|||||||
Question.objects.EditQuestion(question_id=question_id, name=description, answers=answers)
|
Question.objects.EditQuestion(question_id=question_id, name=description, answers=answers)
|
||||||
return redirect(f'/tests/{test}/edit')
|
return redirect(f'/tests/{test}/edit')
|
||||||
|
|
||||||
|
@login_required
|
||||||
def deleteTest(request, test_id):
|
def deleteTest(request, test_id):
|
||||||
Test.objects.filter(id=test_id).delete()
|
Test.objects.filter(id=test_id).delete()
|
||||||
return redirect('myTests')
|
return redirect('myTests')
|
||||||
|
|
||||||
|
@login_required
|
||||||
def editVisible(request, test_id):
|
def editVisible(request, test_id):
|
||||||
new_visible = request.GET["visible"]
|
new_visible = request.GET["visible"]
|
||||||
if new_visible == "public":
|
if new_visible == "public":
|
||||||
@ -270,6 +294,7 @@ def editVisible(request, test_id):
|
|||||||
test.save()
|
test.save()
|
||||||
return redirect(f'/tests/{test_id}/edit')
|
return redirect(f'/tests/{test_id}/edit')
|
||||||
|
|
||||||
|
@login_required
|
||||||
def editName(request, test_id):
|
def editName(request, test_id):
|
||||||
new_name = request.GET["name"]
|
new_name = request.GET["name"]
|
||||||
test = Test.objects.get(id=test_id)
|
test = Test.objects.get(id=test_id)
|
||||||
@ -277,7 +302,7 @@ def editName(request, test_id):
|
|||||||
test.save()
|
test.save()
|
||||||
return redirect(f'/tests/{test_id}/edit')
|
return redirect(f'/tests/{test_id}/edit')
|
||||||
|
|
||||||
|
@login_required
|
||||||
def editPassword(request, test_id):
|
def editPassword(request, test_id):
|
||||||
new_password = request.GET["password"]
|
new_password = request.GET["password"]
|
||||||
test = Test.objects.get(id=test_id)
|
test = Test.objects.get(id=test_id)
|
||||||
@ -285,6 +310,17 @@ def editPassword(request, test_id):
|
|||||||
test.save()
|
test.save()
|
||||||
return redirect(f'/tests/{test_id}/edit')
|
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):
|
class TestModelViewSet(viewsets.ModelViewSet):
|
||||||
queryset = Test.objects.all()
|
queryset = Test.objects.all()
|
||||||
@ -317,8 +353,8 @@ class TestTemplateView(TemplateView):
|
|||||||
def get_score(self, test: Test, answers):
|
def get_score(self, test: Test, answers):
|
||||||
return test.get_score(answers)
|
return test.get_score(answers)
|
||||||
|
|
||||||
def get_maxscore(self, test: Test, answers):
|
def get_maxscore(self, test: Test):
|
||||||
return test.get_maxscore(answers)
|
return test.get_maxscore()
|
||||||
|
|
||||||
def formatted_responses(self, unformatted_json):
|
def formatted_responses(self, unformatted_json):
|
||||||
formatted_response = list()
|
formatted_response = list()
|
||||||
@ -334,16 +370,22 @@ class TestTemplateView(TemplateView):
|
|||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
test = Test.objects.get(id=kwargs.get("test_id"))
|
test = Test.objects.get(id=kwargs.get("test_id"))
|
||||||
score = self.get_score(test, self.formatted_responses(request.POST))
|
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
|
status = score >= test.passing_score
|
||||||
context = {
|
# context = {
|
||||||
"status": self.PASSED.get(status, self.UNKNOWN),
|
# "status": self.PASSED.get(status, self.UNKNOWN),
|
||||||
"points": score,
|
# "points": score,
|
||||||
"max": max,
|
# "max": max,
|
||||||
"passing": test.passing_score,
|
# "passing": test.passing_score,
|
||||||
"percentage": int(score / max * 100),
|
# "percentage": int(score / max * 100),
|
||||||
"password": test.password
|
# "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(
|
SolvedTest.objects.create(
|
||||||
score=score,
|
score=score,
|
||||||
max=max,
|
max=max,
|
||||||
@ -351,11 +393,25 @@ class TestTemplateView(TemplateView):
|
|||||||
user=request.user,
|
user=request.user,
|
||||||
test=test
|
test=test
|
||||||
)
|
)
|
||||||
template_name = "result.html"
|
test.completions += 1
|
||||||
template = get_template(template_name)
|
test.total_percentage_scored_by_users += int(score / max * 100)
|
||||||
return HttpResponse(template.render(context, request))
|
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):
|
def TestPasswordTemplateView(request, test_id):
|
||||||
test = Test.objects.get(id=test_id)
|
test = Test.objects.get(id=test_id)
|
||||||
if test.password == "":
|
if test.password == "":
|
||||||
@ -366,6 +422,7 @@ def TestPasswordTemplateView(request, test_id):
|
|||||||
return render(request, 'testPassword.html')
|
return render(request, 'testPassword.html')
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
def testView(request):
|
def testView(request):
|
||||||
permission_classes = []
|
permission_classes = []
|
||||||
template_name = settings.BASE_DIR + f"/templates/generic_test.html"
|
template_name = settings.BASE_DIR + f"/templates/generic_test.html"
|
||||||
|
18
users/migrations/0005_user_type.py
Normal file
18
users/migrations/0005_user_type.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
@ -5,6 +5,15 @@ from .managers import UserManager
|
|||||||
|
|
||||||
|
|
||||||
class User(AbstractBaseUser):
|
class User(AbstractBaseUser):
|
||||||
|
|
||||||
|
ADMIN = "admin"
|
||||||
|
STANDARD = "standard"
|
||||||
|
|
||||||
|
USER_TYPES = (
|
||||||
|
("admin", ADMIN),
|
||||||
|
("standard", STANDARD),
|
||||||
|
)
|
||||||
|
|
||||||
first_name = models.CharField(max_length=100)
|
first_name = models.CharField(max_length=100)
|
||||||
last_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)
|
confirmation_number = models.CharField(max_length=100)
|
||||||
reset_code = models.IntegerField(null=True)
|
reset_code = models.IntegerField(null=True)
|
||||||
avatar = models.ImageField(upload_to="avatars/", null=True)
|
avatar = models.ImageField(upload_to="avatars/", null=True)
|
||||||
|
type = models.CharField(choices=USER_TYPES, default=STANDARD, max_length=100)
|
||||||
|
|
||||||
USERNAME_FIELD = "email"
|
USERNAME_FIELD = "email"
|
||||||
|
|
||||||
|
@ -90,7 +90,8 @@ def register(request):
|
|||||||
email=form.cleaned_data["email"],
|
email=form.cleaned_data["email"],
|
||||||
first_name=form.cleaned_data["first_name"],
|
first_name=form.cleaned_data["first_name"],
|
||||||
last_name=form.cleaned_data["last_name"],
|
last_name=form.cleaned_data["last_name"],
|
||||||
password=form.cleaned_data["password1"]
|
password=form.cleaned_data["password1"],
|
||||||
|
type="standard"
|
||||||
)
|
)
|
||||||
return redirect('register_success')
|
return redirect('register_success')
|
||||||
else:
|
else:
|
||||||
|
Loading…
Reference in New Issue
Block a user