mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 10:22:11 +01:00 
			
		
		
		
	Display notes
This commit is contained in:
		@@ -383,39 +383,39 @@ class Passage(models.Model):
 | 
				
			|||||||
        return sum(items) / len(items) if items else 0
 | 
					        return sum(items) / len(items) if items else 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_defender_writing(self):
 | 
					    def average_defender_writing(self) -> int:
 | 
				
			||||||
        return self.avg(note.defender_writing for note in self.notes.all())
 | 
					        return self.avg(note.defender_writing for note in self.notes.all())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_defender_oral(self):
 | 
					    def average_defender_oral(self) -> int:
 | 
				
			||||||
        return self.avg(note.defender_oral for note in self.notes.all())
 | 
					        return self.avg(note.defender_oral for note in self.notes.all())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_defender(self):
 | 
					    def average_defender(self) -> int:
 | 
				
			||||||
        return 2 * self.average_defender_writing + self.average_defender_oral
 | 
					        return self.average_defender_writing + 2 * self.average_defender_oral
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_opponent_writing(self):
 | 
					    def average_opponent_writing(self) -> int:
 | 
				
			||||||
        return self.avg(note.opponent_writing for note in self.notes.all())
 | 
					        return self.avg(note.opponent_writing for note in self.notes.all())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_opponent_oral(self):
 | 
					    def average_opponent_oral(self) -> int:
 | 
				
			||||||
        return self.avg(note.opponent_oral for note in self.notes.all())
 | 
					        return self.avg(note.opponent_oral for note in self.notes.all())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_opponent(self):
 | 
					    def average_opponent(self) -> int:
 | 
				
			||||||
        return 2 * self.average_opponent_writing + self.average_opponent_oral
 | 
					        return self.average_opponent_writing + 2 * self.average_opponent_oral
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_reporter_writing(self):
 | 
					    def average_reporter_writing(self) -> int:
 | 
				
			||||||
        return self.avg(note.reporter_writing for note in self.notes.all())
 | 
					        return self.avg(note.reporter_writing for note in self.notes.all())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_reporter_oral(self):
 | 
					    def average_reporter_oral(self) -> int:
 | 
				
			||||||
        return self.avg(note.reporter_oral for note in self.notes.all())
 | 
					        return self.avg(note.reporter_oral for note in self.notes.all())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def average_reporter(self):
 | 
					    def average_reporter(self) -> int:
 | 
				
			||||||
        return self.average_reporter_writing + self.average_reporter_oral
 | 
					        return self.average_reporter_writing + self.average_reporter_oral
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def average(self, participation):
 | 
					    def average(self, participation):
 | 
				
			||||||
@@ -588,6 +588,10 @@ class Note(models.Model):
 | 
				
			|||||||
    def __str__(self):
 | 
					    def __str__(self):
 | 
				
			||||||
        return _("Notes of {jury} for {passage}").format(jury=self.jury, passage=self.passage)
 | 
					        return _("Notes of {jury} for {passage}").format(jury=self.jury, passage=self.passage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __bool__(self):
 | 
				
			||||||
 | 
					        return any((self.defender_writing, self.defender_oral, self.opponent_writing, self.opponent_oral,
 | 
				
			||||||
 | 
					                   self.reporter_writing, self.reporter_oral))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        verbose_name = _("note")
 | 
					        verbose_name = _("note")
 | 
				
			||||||
        verbose_name_plural = _("notes")
 | 
					        verbose_name_plural = _("notes")
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ from django.utils.text import format_lazy
 | 
				
			|||||||
from django.utils.translation import gettext_lazy as _
 | 
					from django.utils.translation import gettext_lazy as _
 | 
				
			||||||
import django_tables2 as tables
 | 
					import django_tables2 as tables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .models import Pool, Team, Tournament
 | 
					from .models import Note, Pool, Team, Tournament
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# noinspection PyTypeChecker
 | 
					# noinspection PyTypeChecker
 | 
				
			||||||
@@ -19,7 +19,7 @@ class TeamTable(tables.Table):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        attrs = {
 | 
					        attrs = {
 | 
				
			||||||
            'class': 'table table condensed table-striped',
 | 
					            'class': 'table table-condensed table-striped',
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        model = Team
 | 
					        model = Team
 | 
				
			||||||
        fields = ('name', 'trigram',)
 | 
					        fields = ('name', 'trigram',)
 | 
				
			||||||
@@ -51,7 +51,7 @@ class ParticipationTable(tables.Table):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        attrs = {
 | 
					        attrs = {
 | 
				
			||||||
            'class': 'table table condensed table-striped',
 | 
					            'class': 'table table-condensed table-striped',
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        model = Team
 | 
					        model = Team
 | 
				
			||||||
        fields = ('name', 'trigram', 'valid',)
 | 
					        fields = ('name', 'trigram', 'valid',)
 | 
				
			||||||
@@ -70,7 +70,7 @@ class TournamentTable(tables.Table):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        attrs = {
 | 
					        attrs = {
 | 
				
			||||||
            'class': 'table table condensed table-striped',
 | 
					            'class': 'table table-condensed table-striped',
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        model = Tournament
 | 
					        model = Tournament
 | 
				
			||||||
        fields = ('name', 'date',)
 | 
					        fields = ('name', 'date',)
 | 
				
			||||||
@@ -91,8 +91,27 @@ class PoolTable(tables.Table):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        attrs = {
 | 
					        attrs = {
 | 
				
			||||||
            'class': 'table table condensed table-striped',
 | 
					            'class': 'table table-condensed table-striped',
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        model = Pool
 | 
					        model = Pool
 | 
				
			||||||
        fields = ('teams', 'round', 'tournament',)
 | 
					        fields = ('teams', 'round', 'tournament',)
 | 
				
			||||||
        template_name = 'django_tables2/bootstrap4.html'
 | 
					        template_name = 'django_tables2/bootstrap4.html'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoteTable(tables.Table):
 | 
				
			||||||
 | 
					    jury = tables.Column(
 | 
				
			||||||
 | 
					        attrs={
 | 
				
			||||||
 | 
					            "td": {
 | 
				
			||||||
 | 
					                "class": "text-nowrap",
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        attrs = {
 | 
				
			||||||
 | 
					            'class': 'table table-condensed table-striped text-center',
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        model = Note
 | 
				
			||||||
 | 
					        fields = ('jury', 'defender_writing', 'defender_oral', 'opponent_writing', 'opponent_oral',
 | 
				
			||||||
 | 
					                  'reporter_writing', 'reporter_oral',)
 | 
				
			||||||
 | 
					        template_name = 'django_tables2/bootstrap4.html'
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
{% extends "base.html" %}
 | 
					{% extends "base.html" %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% load i18n %}
 | 
					{% load django_tables2 i18n %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{% block content %}
 | 
					{% block content %}
 | 
				
			||||||
{% trans "any" as any %}
 | 
					{% trans "any" as any %}
 | 
				
			||||||
@@ -50,6 +50,51 @@
 | 
				
			|||||||
        {% endif %}
 | 
					        {% endif %}
 | 
				
			||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {% if notes %}
 | 
				
			||||||
 | 
					        <hr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <h2>{% trans "Notes detail" %}</h2>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        {% render_table notes %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <div class="card bg-light shadow">
 | 
				
			||||||
 | 
					            <div class="card-body">
 | 
				
			||||||
 | 
					                <dl class="row">
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Average points for the defender writing:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_defender_writing }}/20</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Average points for the defender oral:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_defender_oral }}/16</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Average points for the opponent writing:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_opponent_writing }}/9</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Average points for the opponent oral:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_opponent_oral }}/10</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Average points for the reporter writing:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_reporter_writing }}/9</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Average points for the reporter oral:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_reporter_oral }}/10</dd>
 | 
				
			||||||
 | 
					                </dl>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <hr>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                <dl class="row">
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Defender points:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_defender }}/52</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Opponent points:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_opponent }}/29</dd>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    <dt class="col-sm-8">{% trans "Reporter points:" %}</dt>
 | 
				
			||||||
 | 
					                    <dd class="col-sm-4">{{ passage.average_reporter }}/19</dd>
 | 
				
			||||||
 | 
					                </dl>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    {% endif %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    {% if user.registration.is_admin %}
 | 
					    {% if user.registration.is_admin %}
 | 
				
			||||||
        {% trans "Update passage" as modal_title %}
 | 
					        {% trans "Update passage" as modal_title %}
 | 
				
			||||||
        {% trans "Update" as modal_button %}
 | 
					        {% trans "Update" as modal_button %}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,7 +26,7 @@ from tfjm.views import AdminMixin
 | 
				
			|||||||
from .forms import JoinTeamForm, NoteForm, ParticipationForm, PassageForm, PoolForm, PoolTeamsForm, \
 | 
					from .forms import JoinTeamForm, NoteForm, ParticipationForm, PassageForm, PoolForm, PoolTeamsForm, \
 | 
				
			||||||
    RequestValidationForm, TeamForm, TournamentForm, ValidateParticipationForm, SolutionForm, SynthesisForm
 | 
					    RequestValidationForm, TeamForm, TournamentForm, ValidateParticipationForm, SolutionForm, SynthesisForm
 | 
				
			||||||
from .models import Note, Participation, Passage, Pool, Team, Tournament, Solution, Synthesis
 | 
					from .models import Note, Participation, Passage, Pool, Team, Tournament, Solution, Synthesis
 | 
				
			||||||
from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable
 | 
					from .tables import TeamTable, TournamentTable, ParticipationTable, PoolTable, NoteTable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CreateTeamView(LoginRequiredMixin, CreateView):
 | 
					class CreateTeamView(LoginRequiredMixin, CreateView):
 | 
				
			||||||
@@ -517,6 +517,7 @@ class PassageDetailView(LoginRequiredMixin, DetailView):
 | 
				
			|||||||
        context = super().get_context_data(**kwargs)
 | 
					        context = super().get_context_data(**kwargs)
 | 
				
			||||||
        if self.request.user.registration in self.object.pool.juries.all():
 | 
					        if self.request.user.registration in self.object.pool.juries.all():
 | 
				
			||||||
            context["my_note"] = Note.objects.get(passage=self.object, jury=self.request.user.registration)
 | 
					            context["my_note"] = Note.objects.get(passage=self.object, jury=self.request.user.registration)
 | 
				
			||||||
 | 
					            context["notes"] = NoteTable([note for note in self.object.notes.all() if note])
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -20,7 +20,7 @@ class RegistrationTable(tables.Table):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        attrs = {
 | 
					        attrs = {
 | 
				
			||||||
            'class': 'table table condensed table-striped',
 | 
					            'class': 'table table-condensed table-striped',
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        model = Registration
 | 
					        model = Registration
 | 
				
			||||||
        fields = ('last_name', 'user__first_name', 'user__email', 'type',)
 | 
					        fields = ('last_name', 'user__first_name', 'user__email', 'type',)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user