Merge pull request 'feature/tourunament-classification' (#41) from feature/tourunament-classification into master

Reviewed-on: #41
This commit is contained in:
s470631 2022-06-05 10:29:07 +02:00
commit 55791f521b
8 changed files with 136 additions and 7 deletions

View File

@ -23,6 +23,7 @@
<a href="{% url 'CreateTournament' %}"><i class="fa-solid fa-trophy"></i> Stwórz turniej </a> <a href="{% url 'CreateTournament' %}"><i class="fa-solid fa-trophy"></i> Stwórz turniej </a>
{% endif %} {% endif %}
<a href="{% url 'tournaments' %}"><i class="fa-solid fa-trophy"></i> Turnieje </a> <a href="{% url 'tournaments' %}"><i class="fa-solid fa-trophy"></i> Turnieje </a>
<a href="{% url 'TournamentClassification' %}"><i class="fa-solid fa-trophy"></i> Ranking turniejowy </a>
<br> <br>
<a href="{% url 'newTest' %}"><i class="fa-solid fa-circle-plus"></i> Stwórz test</a> <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 'myTests' %}"><i class="fa-solid fa-note-sticky"></i> Twoje testy</a>

View File

@ -6,8 +6,8 @@
{% block content %} {% block content %}
<h1>Stwórz turniej</h1> <h1>Stwórz turniej</h1>
<form method="post" novalidate> <form method="post" novalidate>
<span>name:<input id="name" type="text" name="name" value="{{ tournament.name }}"></span><br> <span>Nazwa turnieju:<input id="name" type="text" name="name" value="{{ tournament.name }}"></span><br>
<span>passing score:<input id="passing_score" type="text" name="passing_score" value="{{ tournament.passing_score }}"></span> <span>Próg zdawalności:<input id="passing_score" type="text" name="passing_score" value="{{ tournament.passing_score }}"></span>
{% for question in questions %} {% for question in questions %}
<div class="tournamentQuestionContainer"> <div class="tournamentQuestionContainer">
<div class="mainTestName"> <div class="mainTestName">

View File

@ -0,0 +1,34 @@
{% extends "base.html" %}
{% load social_share %}
{% block title %}Tournament classification{% endblock %}
{% block content %}
<form method="post">
<label for="name">Turniej: </label>
<select name="name" id="name">
{% for tournament_name in tournament_names %}
<option value="{{tournament_name}}">{{tournament_name}}</option>
{% endfor %}
</select>
<div class="testContent">
<input type="submit" value="Wyszukaj">
</div>
</form>
{% if final_tournaments%}
{% for tournament in final_tournaments%}
{{forloop.counter}}
tuniej: {{tournament.tournament__name}}
wynik: {{tournament.score}}
gracz: {{tournament.user__email}}
data: {{tournament.date|date:"d M Y"}}
<br>
{% endfor %}
{% endif %}
{% endblock %}

View File

@ -0,0 +1,26 @@
# Generated by Django 3.2.9 on 2022-06-04 15:02
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('trials', '0028_ratetest_ratetournament'),
]
operations = [
migrations.CreateModel(
name='TournamentClassification',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('score', models.IntegerField()),
('date', models.DateField()),
('tournament', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tournament_classification', to='trials.tournament')),
('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tournament_classification', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.9 on 2022-06-04 15:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('trials', '0029_tournamentclassification'),
]
operations = [
migrations.AlterField(
model_name='tournamentclassification',
name='date',
field=models.DateField(auto_now_add=True),
),
]

View File

@ -211,3 +211,23 @@ class RateTournament(models.Model):
related_name="rate_tournaments", related_name="rate_tournaments",
on_delete=models.CASCADE on_delete=models.CASCADE
) )
class TournamentClassification(models.Model):
user = models.ForeignKey(
"users.User",
null=True,
related_name="tournament_classification",
on_delete=models.CASCADE
)
tournament = models.ForeignKey(
"Tournament",
null=True,
related_name="tournament_classification",
on_delete=models.CASCADE
)
score = models.IntegerField()
date = models.DateField(auto_now_add=True)

View File

@ -1,7 +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, TestTemplateView, TestValidateAPIView, TestResultView, rateTest, addTest, addQuestions, myTests, solvedTests, solvedTestsDetailed, EditTestTemplateView, deleteTest, AddQuestionToExistingTest, RemoveQuestionFromExistingTest, EditQuestionTemplateView, editName, editVisible, editPassword, TestPasswordTemplateView, TournamentView, CreateTournamentView, TournamentTemplateView, TournamentResultView 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, TournamentTemplateView, TournamentResultView, TournamentClassificationView
router = DefaultRouter(trailing_slash=False) router = DefaultRouter(trailing_slash=False)
router.register("items", TestModelViewSet) router.register("items", TestModelViewSet)
@ -28,7 +28,8 @@ urlpatterns = [
path('tournamets', TournamentView, name="tournaments"), path('tournamets', TournamentView, name="tournaments"),
path('add/tournament', CreateTournamentView, name="CreateTournament"), path('add/tournament', CreateTournamentView, name="CreateTournament"),
path('<int:tournament_id>/tournament/show', TournamentTemplateView.as_view()), path('<int:tournament_id>/tournament/show', TournamentTemplateView.as_view()),
path('<int:tournament_id>/tournament/result', TournamentResultView.as_view()) path('<int:tournament_id>/tournament/result', TournamentResultView.as_view()),
path('tournament/classification', TournamentClassificationView.as_view(), name="TournamentClassification")
] ]
urlpatterns += router.urls urlpatterns += router.urls

View File

@ -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, Tournament, RateTournament, RateTest from trials.models import Test, SolvedTest, Tournament, RateTournament, RateTest, TournamentClassification
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
@ -448,7 +448,7 @@ class TestTemplateView(TemplateView):
test.save() test.save()
return HttpResponseRedirect(f'result') return HttpResponseRedirect(f'result')
# here
class TournamentTemplateView(TemplateView): class TournamentTemplateView(TemplateView):
PASSED = "Zaliczony" PASSED = "Zaliczony"
FAILED = "Niezaliczony" FAILED = "Niezaliczony"
@ -516,6 +516,11 @@ class TournamentTemplateView(TemplateView):
# user=request.user, # user=request.user,
# test=test # test=test
# ) # )
TournamentClassification.objects.create(
user=request.user,
tournament=tournament,
score=score,
)
tournament.completions += 1 tournament.completions += 1
tournament.total_percentage_scored_by_users += int(score / max * 100) tournament.total_percentage_scored_by_users += int(score / max * 100)
if tournament.completions >= 5: if tournament.completions >= 5:
@ -595,6 +600,30 @@ class TestResultView(TemplateView):
permission_classes = [] permission_classes = []
template_name = settings.BASE_DIR + f"/templates/result.html" template_name = settings.BASE_DIR + f"/templates/result.html"
class TournamentResultView(TemplateView): class TournamentResultView(TemplateView):
permission_classes = [] permission_classes = []
template_name = settings.BASE_DIR + f"/templates/tournament_result.html" template_name = settings.BASE_DIR + f"/templates/tournament_result.html"
class TournamentClassificationView(TemplateView):
permission_classes = []
template_name = settings.BASE_DIR + f"/templates/tournament_classification.html"
def get_queryset(self):
return TournamentClassification.objects.all()
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["tournament_names"] = self.get_queryset().values_list("tournament__name", flat=True).order_by("tournament__name").distinct()
return context
def post(self, request, *args, **kwargs):
context = super().get_context_data(**kwargs)
name = request.POST["name"]
context["tournament_names"] = self.get_queryset().values_list("tournament__name", flat=True).order_by("tournament__name").distinct()
context["final_tournaments"] = TournamentClassification.objects.filter(tournament__name=name).values("tournament__name","score", "date", "user__email").order_by("-score", "date")
return render(request, 'tournament_classification.html', context)