1
0
mirror of https://gitlab.com/animath/si/plateforme.git synced 2025-02-25 15:06:31 +00:00

Compare commits

..

4 Commits

Author SHA1 Message Date
Emmy D'Anello
21ff044044
Install documentation
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
2024-01-20 22:42:36 +01:00
Emmy D'Anello
2a85d4ff38
Remove æ
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
2024-01-20 20:14:00 +01:00
Emmy D'Anello
037b22fcaa
Mention des contraintes de logement dans la documentation
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
2024-01-20 20:14:00 +01:00
Emmy D'Anello
0474615746
Documentation de la gestion du tirage au sort
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
2024-01-20 20:14:00 +01:00
26 changed files with 1013 additions and 39 deletions

BIN
docs/_static/img/draw_choose_problem.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

BIN
docs/_static/img/draw_end_round_1.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

BIN
docs/_static/img/draw_example.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
docs/_static/img/draw_general.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

BIN
docs/_static/img/draw_last_rolls.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
docs/_static/img/draw_passage_tables.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
docs/_static/img/draw_recap.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
docs/_static/img/draw_start.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

View File

@ -18,7 +18,7 @@
# -- Project information -----------------------------------------------------
project = 'Plateforme du TFJM²'
copyright = "2020-2023"
copyright = "2020-2024"
author = "Animath"

View File

@ -2,3 +2,22 @@ Développer la plateforme
========================
Cette page est dédiée aux responsables informatiques qui cherchent à contribuer à la plateforme.
Présentation
------------
La plateforme d'inscription du TFJM² actuelle est née lors de l'édition 2020. Elle n'est
pas la première à exister, elle succède à une précédente, moins fonctionnelle, dont les
sources ont été perdues. Elle a été développée par Emmy D'Anello, bénévole pour Animath,
qui la maintient au moins jusqu'en 2024.
La plateforme est développée en Python, utilisant le framework web
`Django <https://www.djangoproject.com/>`_. Elle est diponible librement sous licence GPLv3
à l'adresse `<https://gitlab.com/animath/si/plateforme-tfjm>`_.
L'instance de production est accessible à l'adresse `<https://inscription.tfjm.org/>`_.
Une instance de développement est accessible à l'adresse `<https://inscription-dev.tfjm.org/>`_.
Les deux instances sont hébergées sur le serveur d'Animath. La documentation spécifique
à l'installation des services d'Animath peut être trouvée à l'adresse
`<https://doc.animath.live/>`_.

309
docs/dev/install.rst Normal file
View File

@ -0,0 +1,309 @@
Installation de la plateforme du TFJM²
======================================
Cette page documente la procédure d'installation de la plateforme du TFJM²,
aussi bien dans un environnement de développement que de production.
Installation en production
--------------------------
Installation de Docker
""""""""""""""""""""""
Les outils du TFJM² sont déployés en utilisant `Docker <https://www.docker.com/>`_.
Pour plus de détails sur la configuration pour le TFJM², voir
`la page dédiée à Docker<docker.html>`_.
Commencez par installer Docker et Docker-Compose (qui sont a priori déjà installés
sur la plateforme du TFJM²), en commençant par installer le dépôt APT de Docker :
.. code-block:: bash
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl gnupg
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
sudo chmod a+r /usr/share/keyrings/docker-archive-keyring.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-compose-plugin
Installation de la plateforme
"""""""""""""""""""""""""""""
Dans le fichier ``docker-compose.yml``, configurer :
.. code-block:: yaml
version: "3.8"
services:
# […]
inscription:
build: https://gitlab.com/animath/si/plateforme.git
links:
- postgres
- redis
- elasticsearch
env_file:
- ./secrets/inscription.env
restart: always
volumes:
- "./data/inscription/media:/code/media"
- "/etc/localtime:/etc/localtime:ro"
networks:
- tfjm
labels:
- "traefik.http.routers.inscription-tfjm2.rule=Host(`inscription.tfjm.org`, `plateforme.tfjm.org`)"
- "traefik.http.routers.inscription-tfjm2.entrypoints=websecure"
- "traefik.http.routers.inscription-tfjm2.tls.certresolver=mytlschallenge"
postgres:
image: postgres:16
volumes:
- "./data/postgresql_16:/var/lib/postgresql/data"
restart: always
env_file:
- ./secrets/postgres.env
networks:
- tfjm
redis:
image: redis:alpine
restart: always
networks:
- tfjm
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.9
restart: always
env_file:
- ./secrets/elasticsearch.env
networks:
- tfjm
# […]
En cas d'instance de pré-production, il est possible de changer de branche en
rajoutant par exemple ``#dev`` à la fin de l'URL.
Les différents paramètres peuvent être modifiés si nécessaire, à commencer par les
versions des autres services (PostgreSQL, Redis, Elasticsearch). Penser à mettre à jour
cette documentation en cas de mise à jour future. Il est attendu d'avoir un réseau
``tfjm`` configuré :
.. code-block:: yaml
networks:
tfjm:
driver: bridge
L'URL utilisée peut être modifiée en changeant les options de Traefik, section ``labels``.
Configuration
"""""""""""""
La configuration se fait essentiellement dans les fichiers d'environnement.
Pour la base de données, une seule variable d'environnement est requise :
``POSTGRES_PASSWORD``, qui correspond au mot de passe maître de PostgreSQL.
Les variables d'environnement de ElasticSearch se résume à du paramétrage de mémoire :
.. code-block:: bash
discovery.type=single-node
ES_JAVA_OPTS=-Xms512m -Xmx512m
Redis n'a pas besoin de configuration particulière.
Enfin, pour la plateforme elle-même, il faut configurer les variables suivantes :
.. code-block:: bash
TFJM_STAGE=prod
DJANGO_SECRET_KEY=
DJANGO_DB_TYPE=PostgreSQL
DJANGO_DB_HOST=postgres
DJANGO_DB_PORT=
DJANGO_DB_NAME=
DJANGO_DB_USER=
DJANGO_DB_PASSWORD=
REDIS_SERVER_HOST=redis
REDIS_SERVER_PORT=6379
SMTP_HOST=ssl0.ovh.net
SMTP_PORT=465
SMTP_HOST_USER=contact@tfjm.org
SMTP_HOST_PASSWORD=
FROM_EMAIL=Contact TFJM²
SERVER_EMAIL=contact@tfjm.org
HAYSTACK_INDEX_NAME=inscription-tfjm
SYMPA_HOST=lists.tfjm.org
SYMPA_URL=lists.tfjm.org/sympa
SYMPA_EMAIL=contact@tfjm.org
SYMPA_PASSWORD=
HELLOASSO_CLIENT_ID=
HELLOASSO_CLIENT_SECRET=
* ``TFJM_STAGE`` : ``prod`` ou ``dev``. ``prod`` est utilisé pour la production,
``dev`` pour le développement ou pré-production. Permet de désactiver certaines
fonctionnalités de production, notamment l'envoi de mails, le cache Redis, les listes
de diffusion, et d'activer le débogage. Les erreurs seront ainsi directement affichées
en développement tandis qu'elles seront envoyées par mail en production.
* ``DJANGO_SECRET_KEY`` : correspond à
`la clé secrète Django <https://docs.djangoproject.com/fr/5.0/ref/settings/#secret-key>`_,
permettant de signer les sessions et les cookies. Il est important de la garder secrète.
Pour la générer, il est possible d'utiliser la commande
``python3 manage.py generate_secret_key``.
* ``DJANGO_DB_TYPE`` : Le type de base de données à utiliser, parmi
``PostgreSQL``, ``MySQL`` et ``SQLite``. ``SQLite`` n'est à utiliser qu'en développement
local.
* ``DJANGO_DB_HOST`` : L'hôte de la base de données pour les bases de données
``PostgreSQL`` et ``MySQL``. Pour ``SQLite``, il faut mettre le chemin vers le fichier
de base de données. Dans l'exemple ci-dessus, ``postgres`` est l'hôte Docker.
* ``DJANGO_DB_PORT`` : Le port de la base de données. (PostgreSQL ou MySQL uniquement)
Si laissé vide, utilisera le port par défaut du service, ``5432`` pour PostgreSQL et
``3306`` pour MySQL.
* ``DJANGO_DB_NAME`` : Le nom de la base de données. (PostgreSQL ou MySQL uniquement)
* ``DJANGO_DB_USER`` : Le nom d'utilisateur de la base de données.
(PostgreSQL ou MySQL uniquement)
* ``DJANGO_DB_PASSWORD`` : Le mot de passe de la base de données.
(PostgreSQL ou MySQL uniquement)
* ``REDIS_SERVER_HOST`` : L'hôte de Redis (en production uniquement). Dans l'exemple
ci-dessus, ``redis`` est l'hôte Docker.
* ``REDIS_SERVER_PORT`` : Le port de Redis (en production uniquement). Si laissé vide,
utilisera le port par défaut du service, ``6379``.
* ``SMTP_HOST`` : L'hôte du serveur SMTP à utiliser pour envoyer les mails. Utilise par
défaut le serveur d'OVH.
* ``SMTP_PORT`` : Le port du serveur SMTP à utiliser pour envoyer les mails.
* ``SMTP_HOST_USER`` : Le nom d'utilisateur du serveur SMTP à utiliser pour envoyer les
mails. Correspond à l'identifiant OVH.
* ``SMTP_HOST_PASSWORD`` : Le mot de passe du serveur SMTP à utiliser pour envoyer les
mails. Correspond au mot de passe OVH.
* ``FROM_EMAIL`` : Le nom lisible à utiliser comme expéditeur des mails
(défaut : Contact TFJM²).
* ``SERVER_EMAIL`` : L'adresse mail à utiliser comme expéditeur des mails
(défaut : contact@tfjm.org).
* ``HAYSTACK_INDEX_NAME`` : Le nom de l'index ElasticSearch à utiliser pour les recherches
dans ElasticSearch (défaut : inscription-tfjm).
* ``SYMPA_HOST`` : Le domaine des listes de diffusion Sympa utilisé.
* ``SYMPA_URL`` : L'URL du serveur Sympa à utiliser pour gérer les listes de diffusion.
* ``SYMPA_EMAIL`` : L'adresse mail à utiliser pour se connecter à Sympa.
* ``SYMPA_PASSWORD`` : Le mot de passe à utiliser pour se connecter à Sympa.
* ``HELLOASSO_CLIENT_ID`` : L'identifiant client HelloAsso à utiliser pour gérer les
paiements HelloAsso.
* ``HELLOASSO_CLIENT_SECRET`` : Le secret client HelloAsso à utiliser pour gérer les
paiements HelloAsso. Doit être maintenu secret.
Installation de la base de données
""""""""""""""""""""""""""""""""""
Pour gérer la base de données PostgreSQL, on peut utiliser les commandes suivantes :
.. code-block:: bash
sudo docker compose up -d postgres
sudo docker compose exec -u postgres postgres createuser -P inscription_tfjm # Création du compte `inscription_tfjm` en demander un mot de passe. À ne faire qu'une seule fois
sudo docker compose exec -u postgres postgres createdb -O inscription_tfjm inscription_tfjm # Création de la base de données `inscription_tfjm` en utilisant le compte `inscription_tfjm`
sudo docker compose exec -u postgres pg_dump inscription_tfjm > inscription_tfjm.sql # Pour sauvegarder la base de données `inscription_tfjm`
sudo docker compose exec -u postgres dropdb inscription_tfjm # Pour supprimer la base de données `inscription_tfjm`
La suppression et la recréation sont utiles en cas de réinitialisation annuelle de la base
de données.
Lancement
"""""""""
Pour lancer la plateforme, il suffit de lancer la commande suivante :
.. code-block:: bash
sudo docker compose up -d inscription
Pour arrêter la plateforme, il suffit de lancer la commande suivante :
.. code-block:: bash
sudo docker compose stop inscription
En cas de mise à jour de la plateforme, il suffit de lancer la commande suivante :
.. code-block:: bash
sudo docker compose up -d --build inscription
Selon le principe de Docker, les données sont conservées dans un volume Docker, ici
dans le dossier ``data/inscription``. Le reste est volatile, puisqu'il peut être recréé
à partir du code source. Attention donc de ne pas coder en production (ce qui est de toute
façon à proscrire !).
Les migrations de base de données sont automatiquement appliquées au lancement de la
plateforme, de même que la collecte de fichiers statiques ou encore la génération de la
documentation. Il n'y a rien à faire de spécial post-lancement, si ce n'est vérifier que
tout fonctionne correctement.
Installation en développement
-----------------------------
L'installation sur une machine locale est plus légère et est utile pour pouvoir tester
rapidement.
Commencez par récupérer le code source de la plateforme :
.. code-block:: bash
git clone https://gitlab.com/animath/si/plateforme-tfjm.git
cd plateforme-tfjm
Afin de pouvoir isoler l'environnement de développement, il est conseillé d'utiliser
un environnement virtuel Python. Commencez alors par installer Python (si ce n'est pas
déjà fait, au moins en version 3.10) ainsi que ``virtualenv``, puis vous pouvez créer
l'environnement virtuel, et entrer dedans :
.. code-block:: bash
python3 -m venv venv
source venv/bin/activate
Il vous faut ensuite installer les dépendances de la plateforme :
.. code-block:: bash
pip install -r requirements.txt
Pour exécuter des tests, il est nécessaire d'installer ``tox`` en supplément.
Ensuite, vous devez initialiser la base de données locale (qui sera stockée dans un
fichier SQLite ``db.sqlite3``) :
.. code-block:: bash
python3 manage.py migrate
Enfin, vous pouvez lancer la plateforme :
.. code-block:: bash
python3 manage.py runserver
Vous pouvez alors accéder à la plateforme à l'adresse `<http://localhost:8000/>`_.
Elle se recharge automatiquement à chaque modification du code source, inutile de la
relancer.
Pour arrêter la plateforme, il suffit d'appuyer sur ``Ctrl+C`` dans le terminal.
Pour vous créer un compte administrateur⋅rice, il suffit de lancer la commande suivante :
.. code-block:: bash
python3 manage.py createsuperuser
En cas de problème, vous pouvez librement supprimer la base de données locale et la
recréer en réexécutant la commande ``python3 manage.py migrate``.

645
docs/draw.rst Normal file
View File

@ -0,0 +1,645 @@
Tirage au sort
==============
La phase de tirage au sort est celle qui va déterminer d'une part
dans quelle poule se trouve chaque équipe et dans quelle ordre elles
défendront leurs problèmes, et d'autre part quel problème défendra
quelle équipe. Cette phase a lieu dans la semaine qui précède le
tournoi, typiquement le mardi entre 19h et 21h.
Exception pour la finale nationale : seul le premier tour est tiré
au sort à ce moment-là, le tirage au sort pour le second tour est
réalisé immédiatement après le premier tour et dépend des résultats.
Sinon, pour les finales régionales, les tirages au sort pour les
tours 1 et 2 sont réalisés successivement, bien que les solutions
à opposer et à rapporter pour le second tour ne sont pas accessibles
avant la fin du premier tour.
**Disclaimer :** si cette documentation est normalement tenue à jour,
seul le règlement et ses annexes font foi. Elle est essentiellement ici
pour décrire le fonctionnement de la plateforme vis-à-vis du tirage
au sort. En cas de litige, merci de se fier au règlement, et de
s'y référer `sur le site du TFJM² <https://tfjm.org/reglement/>`_.
Principe
--------
.. warning:: Cette section arborde en détail le fonctionnement théorique
du tirage au sort. Si vous souhaitez comprendre comment se déroule
le tirage au sort en pratique sur la plateforme, merci de vous référer
directement à la section `Déroulement du tirage`_.
Composition des poules
~~~~~~~~~~~~~~~~~~~~~~
Le principe du tirage au sort est détaillé dans la fiche pratique dédiée.
Chaque équipe commence par désigner un⋅e capitaine d'équipe qui s'occupera
de réaliser les tirages et de prendre les décisions.
Les poules sont triées de la plus grande à la plus petite, en terme de
nombre d'équipes.
Les capitaines d'équipe lancent un dé entre 1 et 100. S'il y a des égalités,
alors les équipes concernées relancent leur dé jusqu'à ne plus avoir d'égalité.
Ce score détermine les compositions des poules pour les deux tours (sauf pour
la finale nationale ou ce n'est que le premier tour).
On trie ensuite les équipes par ordre croissant de score de dé. On remplit
ensuite les poules une à une de façon gloutonne : si par exemple la
première poule est une poule à 3 équipes, alors on prend les 3 premières
équipes de la liste et on les place dans cette poule. On recommence ensuite
avec la deuxième poule, etc.
Au sein d'une poule, l'ordre de passage des équipes est déterminé par
l'ordre des restes modulo 100 des scores de dé multipliés par 27.
Par exemple, si les scores de dé sont 12, 34 et 56, alors si on
multiplie par 27 et qu'on prend le reste modulo 100, on obtient
respectivement 24, 82 et 52. L'ordre de passage sera donc l'équipe 1,
l'équipe 3, puis l'équipe 2. Ce choix est réalisé pour avoir un semblant
déterministe de mélange.
Pour le second tour, on considère à nouveau les scores de dé, où l'équipe
qui a eu le score le plus faible sera dans la première poule, celle qui
a eu le second score le plus faible dans la deuxième poule, etc. L'ordre
de passage est cette fois-ci plus simple, puisqu'il est directement croissant
avec les scores de dé. Exception : pour les poules à 5, l'équipe avec le
score le plus gros sera la dernière de la première poule, et il ne peut
y avoir qu'une seule poule à 5 équipes.
Considérons par exemple un tournoi fictif composé de 11 équipes, avec
une poule de 5 équipes et deux poules de 3 équipes. Les équipes sont
AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH, III, JJJ et KKK. Les scores
de dés sont :
.. table:: Exemple de tirage de dés et de répartition dans les poules
+-----------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Équipe | AAA | BBB | CCC | DDD | EEE | FFF | GGG | HHH | III | JJJ | KKK |
+=============================+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+
| Score de dé | 45 | 17 | 64 | 3 | 98 | 41 | 34 | 63 | 86 | 23 | 70 |
+-----------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Poule au 1\ :sup:`er` tour | B | A | B | A | C | A | A | B | C | A | C |
+-----------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Poule au 2\ :sup:`ème` tour | C | B | B | A | A | B | A | A | A | C | C |
+-----------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
Explication : les équipes **DDD**, **BBB**, **JJJ**, **GGG** et **FFF** sont les
équipes ayant réalisé le plus bas score (respectivement 3, 17, 23, 34 et, 41) et
sont alors placées dans la poule **A**. Les équipes **AAA**, **HHH** et **CCC**
sont les trois suivantes (avec pour scores 45, 63 et 64) et composeront alors
la poule **B** tandis que les équipes **KKK**, **III** et **EEE** (avec pour
scores 70, 86 et 98) seront dans la poule **C** au premier tour.
Ainsi pour le second tour, l'équipe **DDD** ira dans la poule **A**, **BBB**
dans la poule **B**, **JJJ** dans la poule **C**, **GGG** dans la poule **A**,
**FFF** dans la poule **B**, **AAA** dans la poule **C**, **HHH** dans la poule
**A**, **CCC** dans la poule **B**, **KKK** dans la poule **C**, **III** dans
la poule **A** et enfin **EEE** également dans la poule **A** puisqu'elle y est
forcée.
Pour ce qui est de l'ordre de passage :
.. table:: Exemple d'ordre de passage pour le premier tour
+--------------------------------+-----------------------------+-----------------+-----------------+
| Poule | Poule A | Poule B | Poule C |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Équipe | DDD | BBB | JJJ | GGG | FFF | AAA | HHH | CCC | KKK | III | EEE |
+================================+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+
| Score de dé | 3 | 17 | 23 | 34 | 41 | 45 | 63 | 64 | 70 | 86 | 98 |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Score de dé fois 27 modulo 100 | 81 | 59 | 21 | 18 | 7 | 15 | 1 | 28 | 90 | 22 | 46 |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Ordre de passage dans la poule | 5 | 4 | 3 | 2 | 1 | 2 | 1 | 3 | 3 | 1 | 2 |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
.. table:: Exemple d'ordre de passage pour le second tour
+--------------------------------+-----------------------------+-----------------+-----------------+
| Poule | Poule A | Poule B | Poule C |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Équipe | DDD | GGG | HHH | III | EEE | BBB | FFF | CCC | JJJ | AAA | KKK |
+================================+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+=====+
| Score de dé | 3 | 34 | 63 | 86 | 98 | 17 | 41 | 64 | 23 | 45 | 70 |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| Ordre de passage dans la poule | 1 | 2 | 3 | 4 | 5 | 1 | 2 | 3 | 1 | 2 | 3 |
+--------------------------------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
Pour la finale nationale, les ordres de passage et les répartitions dans les poules
du second tour sont décidé⋅es dans l'ordre décroissant des résultats obtenus au
premier tour. Si par exemple l'équipe **AAA** a fini en tête du premier tour, elle
sera alors la première à passer dans la poule **A** du second tour.
Tirage des problèmes
~~~~~~~~~~~~~~~~~~~~
Une fois les équipes réparties dans les poules, on tire au sort les problèmes. Ce
tirage se déroule poule par poule.
Au début du tirage au sort des problèmes d'une poule, les équipes de la poule
commencent par tirer un nouveau dé à 100 faces. S'il y a des égalités, alors
les équipes concernées relancent leur dé jusqu'à ne plus avoir d'égalité.
Les équipes sont triées dans l'ordre décroissant de leur score de dé. L'équipe
ayant tiré le plus gros score est invitée à tirer son problème en première.
Il y a deux contraintes de tirage :
* Il n'est pas possible de choisir le même problème qu'une autre équipe de la poule ;
* Il n'est pas possible de défendre le même problème pour les deux jours.
À noter qu'il n'est pas impossible de tirer et de choisir un problème qui n'a
pas été traité par l'équipe, bien que cela est fortement non recommandé.
Une fois l'ordre de tirage établi, les équipes tirent tour à tour leur problème,
tant qu'elle ne l'ont pas encore choisi. Pour cela, l'équipe active tire au sort
un problème. Il est attendu que le problème tiré garantisse les deux contraintes,
et que donc il n'est pas possible de tirer un problème déjà choisi par une autre
équipe, ou bien le problème défendu lors du tour 1 si on est au tour 2.
L'équipe a désormais deux choix :
* Accepter le problème. Dans ce cas, ce sera ce problème qu'elle défendra, et
son tirage est termé.
* Refuser le problème. Dans ce cas, la main passe à l'équipe suivante, selon le
score des dés. Exception : si le problème tiré est un problème qui a déjà été
refusé auparavant, alors dans ce cas l'équipe peut immédiatement tirer un
nouveau problème (mais elle a tout de même le choix de l'accepter ou de le
refuser).
**Attention :** si une équipe refuse trop de problèmes, alors elle pourra être
pénalisée. Chaque équipe a droit à ``P - 5`` refus sans pénalités, où ``P``
est le nombre de problèmes disponibles cette année. Par exemple, s'il y a
8 problèmes cette année, alors les équipes ont droit à 3 refus sans pénalités.
Seuls les refus distincts comptent : refuser une deuxième fois un problème
déjà refusé ne compte pas. Au-delà de ces refus gratuits, l'équipe se verra
dotée d'une pénalité de 25 % sur le coefficient de l'oral de défense, par
refus. Par exemple, si une équipe refuse 4 problèmes avec un coefficient
sur l'oral de défense normalement à ``1.6``, son coefficient passera à ``1.2``.
Une fois que toutes les équipes de la poule ont tiré leur problème, on passe
à la poule suivante. Une fois que toutes les poules ont vu leurs problèmes
tirés, on recommence pour le second tour, à partir de la première poule (déjà
définie), sauf pour la finale nationale. Le tirage au sort est terminé lorsque
toutes les poules ont vu leurs problèmes tirés pour tous les tours.
Récupération des solutions
~~~~~~~~~~~~~~~~~~~~~~~~~~
Les solutions défendues pour le premier tour dans une poule sont immédiatement
accessibles après le tirage au sort aux équipes qui doivent opposer ou rapporter
ces solutions. Pour le second tour, elles ne seront disponibles qu'après la fin
du premier tour.
Elles seront également envoyées par les organisateurices localaux, dans les mêmes
délais.
Tirage au sort sur la plateforme
--------------------------------
Le tirage est sort est géré directement sur la plateforme, de façon intuitive,
ergonomique et dynamique.
Il est accessible à l'adresse `<https://inscription.tfjm.org/draw/>`_, ou bien
en accédant à l'onglet « Tirage au sort » sur le bandeau de navigation, pourvu
d'être organisateurice ou bien d'être dans une équipe validée.
Présentation de l'interface
~~~~~~~~~~~~~~~~~~~~~~~~~~~
L'interface est divisée en 5 sections :
* Le nom du tournoi dans lequel se passe le tirage au sort ;
* Les derniers résultats de dés par équipe ;
* Le récapitulatif du tirage au sort en cours ;
* L'étape actuelle ;
* Les tableaux de passage par poule.
.. figure:: _static/img/draw_general.png
:alt: Interface générale du tirage au sort
Interface générale du tirage au sort
Sur cette capture d'écran, on voit par exemple que l'on est actuellement dans le
tournoi de Strasbourg. Le tirage du tour 1 est déjà terminé, et on est en train
de tirer la poule B2.
Nom du tournoi
..............
Les différents onglets représentent les différents tournois.
Pour une équipe participante ou un⋅e organisateurice local⋅e, il peut n'y avoir
qu'un seul tournoi, celui qui concerne l'utilisateurice.
Les administrateurices ont accès à tous les onglets, ce qui peut permettre de
passer d'un tirage au sort à un autre facilement, en un clic et sans délai.
.. figure:: _static/img/draw_tournament_tabs.png
:alt: Onglets des différents tirages au sort par tournoi
Le tournoi de Strasbourg est le tournoi sélectionné dans cet exemple.
Derniers résultats de dés
.........................
Les derniers jets de dés sont affichés dans cette section, avec le trigramme de
chaque équipe et son score de dé s'il existe. Le score est vert si l'équipe a
déjà tiré son dé, sinon il est jaune.
Les organisateurices peuvent cliquer sur le score de dé pour jeter un dé à la place
de l'équipe, ce qui est notamment utile à des fins de débuggage ou de souci technique
avec l'équipe en question.
.. figure:: _static/img/draw_last_rolls.png
:alt: Derniers jets de dés
Ici, les équipes BBB, DDD, EEE, GGG et HHH ont déjà tiré leur dé, avec pour scores
respectifs 57, 66, 58, 41 et 68, tandis que les équipes AAA, CCC, FFF et III n'ont
pas encore tiré leur dé.
Récapitulatif du tirage au sort
...............................
La section de gauche affiche le récapitulatif du tirage au sort en cours.
Elle n'est là qu'à des fins d'affichage, il n'est pas possible d'interagir avec.
La colonne de gauche concerne le premier tour, et la colonne de droite le second tour.
Chaque colonne est divisée en plusieurs parties, une pour chaque poule. Enfin, chaque
poule contient la liste des équipes membres, triées par ordre de passage. Elles ne sont
affichées que lorsque l'ordre de passage est déterminé.
Le tour actuel de tirage est mis en surbrillance. La poule actuelle qui réalise son
tirage est sur fond vert, l'équipe qui doit tirer son problème est sur fond bleu.
La cellule d'une équipe affiche son trigramme, son problème sélectionné pour ce tour
(s'il est déjà choisi), l'ensemble des problèmes qu'elle a refusé, et le cas échéant
ses pénalités.
.. figure:: _static/img/draw_recap.png
:alt: Récapitulatif du tirage au sort
Récapitulatif du tirage au sort en cours
La poule A1 est composée des équipes **GGG**, **AAA** et **III**, qui défendront
dans cet ordre. L'équipe **GGG** a tiré le problème 7, et l'a accepté. L'équipe
**AAA** a tiré le problème 3, et l'a accepté, après avoir refusé le problème 2.
L'équipe **III** a tiré le problème 1, et l'a accepté, après avoir refusé les
problèmes 3, 4, 2 et 6, et a donc une pénalité de 25 % sur son coefficient de
l'oral de défense. Notez qu'en poule B1, l'équipe **BBB** a bien pu accepter le
problème 8 après l'avoir refusé une première fois.
Dans la poule B2, actuellement en tirage, l'équipe **EEE** a déjà accepté le
problème 6, tandis que l'équipe **CCC** a refusé les problèmes 5 et 2 et que
l'équipe **AAA** a refusé le problème 2. C'est actuellement au tour de
l'équipe **AAA**, qui doit choisir d'accepter ou de refuser le problème 7
qu'elle vient de tirer.
Notez la présence du bouton « Annuler la dernière étape », visible uniquement
pour les organisateurices. Il permet d'annuler la dernière action qui vient
d'avoir lieu. Il est utile en cas de souci technique ou de mauvaise manipulation.
En cas de besoin majeur, un bouton « Annuler » est disponible en bas de l'interface
afin de réinitialiser le tirage.
Étape actuelle
..............
La partie de droite de l'écran est dédiée à l'explication de l'étape en cours du tirage
au sort. Tout est expliqué dans un encadré bleu.
À noter qu'un bouton « Exporter » peut être disponible pour les organisateurices à la
suite du tirage d'une poule. Il est utile pour valider le tirage et transmettre les
données au reste de la plateforme, débloquant notamment l'accès aux différentes solutions
pour les équipes.
Le tirage au sort est découpé en 4 phases majeures :
Composition des poules
''''''''''''''''''''''
La première phase est la composition des poules. Elle est détaillée dans la section
« Composition des poules ». Le texte affiché :
.. note::
Nous allons commencer le tirage des problèmes.
Vous pouvez à tout moment poser toute question si quelque chose n'est pas clair ou ne va pas.
Nous allons d'abord tirer les poules et l'ordre de passage pour le premier tour avec toutes les équipes puis pour chaque poule, nous tirerons l'ordre de tirage pour le tour et les problèmes.
Les capitaines, vous pouvez désormais toustes lancer un dé 100, en cliquant sur le gros bouton. Les poules et l'ordre de passage lors du premier tour sera l'ordre croissant des dés, c'est-à-dire que le plus petit lancer sera le premier à passer dans la poule A.
Pour plus de détails sur le déroulement du tirage au sort, le règlement est accessible sur https://tfjm.org/reglement.
Un gros émoji « dé » 🎲 est affiché pour les participant⋅es, leur permettant de lancer
leur dé. Le résultat sera affiché dans la section « Derniers jets de dés », et le
bouton disparaîtra.
Les organisateurices peuvent également appuyer sur le bouton, ce qui aura pour effet
de lancer un dé pour une équipe qui n'a pas encore lancé son dé. Cela peut être utile
pour débugger ou pour aider une équipe qui a un souci technique. Rappelons toutefois
qu'il suffit de cliquer sur le score de dé d'une équipe pour lancer son dé à sa place.
.. figure:: _static/img/draw_waiting_passage_order.png
:alt: Étape de composition des poules
Le tirage au sort est en attente de la composition des poules.
Ordre de tirage des problèmes
'''''''''''''''''''''''''''''
Une fois les poules constituées, il faut déterminer dans quel ordre les équipes
tireront leur problème, par le biais d'un nouveau jet de dé. Un texte par exemple
peut être :
.. note::
Nous passons au tirage des problèmes pour la poule Poule A1, entre les équipes GGG, AAA, III. Les capitaines peuvent lancer un dé 100 en cliquant sur le gros bouton pour déterminer l'ordre de tirage. L'équipe réalisant le plus gros score pourra tirer en premier.
Pour plus de détails sur le déroulement du tirage au sort, le règlement est accessible sur https://tfjm.org/reglement.
L'émoji « dé » 🎲 n'est affiché que pour les équipes membre de la poule concernée.
Encore une fois, les organisateurices peuvent lancer le dé à la place d'une équipe
en cliquant sur son score de dé, ou bien en cliquant sur l'émoji.
.. figure:: _static/img/draw_waiting_choose_problem_order.png
:alt: Étape de tirage de l'ordre de tirage des problèmes
Le tirage au sort est en attente du tirage l'ordre de tirage pour la poule A1.
Tirage des problèmes
''''''''''''''''''''
Une fois l'ordre de tirage déterminé, les équipes sont invitées à tirer leurs
problèmes. Le texte affiché est par exemple :
.. note::
C'est au tour de l'équipe GGG de choisir son problème. Cliquez sur l'urne au milieu pour tirer un problème au sort.
Pour plus de détails sur le déroulement du tirage au sort, le règlement est accessible sur https://tfjm.org/reglement.
Un émoji « urne » 🗳️ est visible uniquement pour l'équipe active, qui doit tirer
son problème. Elle est invitée à cliquer dessus. À nouveau, les organisateurices
peuvent cliquer dessus à la place de l'équipe.
.. figure:: _static/img/draw_waiting_problem_draw.png
:alt: Étape de tirage des problèmes
Le tirage au sort est en attente du tirage du problème de l'équipe GGG.
Choix du problème
'''''''''''''''''
Une fois le problème tiré, l'équipe peut alors choisir de l'accepter ou de le
refuser. Le texte affiché est par exemple :
.. note::
L'équipe GGG a tiré le problème 7 : Drôles de cookies. Elle peut décider d'accepter ou de refuser ce problème. Il reste 3 refus sans pénalité.
Pour plus de détails sur le déroulement du tirage au sort, le règlement est accessible sur https://tfjm.org/reglement.
Deux boutons sont affichés sur la page, un bouton « Accepter », en vert,
et un bouton « Refuser », en rouge. L'équipe peut cliquer sur l'un ou l'autre
pour faire son choix. Les organisateurices peuvent également cliquer sur l'un
ou l'autre pour faire le choix à la place de l'équipe. Ces boutons sont
invisibles pour les autres équipes.
.. figure:: _static/img/draw_choose_problem.png
:alt: Étape de choix du problème
L'équipe GGG a tiré le problème 7. Elle peut choisir de l'accepter ou de le refuser.
.. TODO
.. note::
Cette section sera mise à jour plus tard.
Tableaux de passage par poule
.............................
Ces tableaux, actualisés en temps réel, permettent d'afficher quels seront les
différents passages lors d'une poule. En particulier, quelle équipe défendra
quel problème, et quelle équipe opposera et laquelle rapportera.
.. figure:: _static/img/draw_passage_tables.png
:alt: Tableaux de passage par poule
Tableaux de passage par poule
Déroulement du tirage
~~~~~~~~~~~~~~~~~~~~~
Cette section décrit le déroulement du tirage au sort sur la plateforme, sans
rentrer dans les détails théoriques. Si la partie théorique vous intéresse,
rendez-vous à la section `Principe`_.
Démarrage du tirage au sort
...........................
Si le tirage n'a pas encore commencé, un message d'alerte s'affiche.
Les organisateurices peuvent lancer le tirage au sort en cliquant sur le bouton
« Démarrer ! ». Iels doivent d'abord paramétrer le format du tirage, en indiquant
le nombre d'équipe par poule, en séparant les nombres par des plus. Par exemple,
pour un tournoi de 9 équipes avec 3 poules de 3 équipes, on écrira ``3+3+3``.
.. figure:: _static/img/draw_start.png
:alt: Création du tirage au sort
Le formulaire de lancement du tirage au sort. Ici, on souhaite un tirage
au sort avec 3 poules de 3 équipes, pour le tournoi de Strasbourg.
Attention : si toutes les poules n'ont pas la même capacité, il est essentiel de
mettre les poules dans l'ordre décroissant de capacité. Par exemple, pour un tournoi
de 8 équipes avec une poule de 5 équipes et une poules de 3 équipes, il faut
écrire ``5+3``. De plus, il n'est pas possible d'avoir 2 poules de 5 équipes.
Composition des poules
......................
Les capitaines d'équipe sont invités à lancer un dé à 100 faces. Pour cela, ils
peuvent cliquer sur le gros bouton avec l'émoji « dé » 🎲 sur la droite de l'écran.
Le résultat est affiché dans la section « Derniers jets de dés ».
.. figure:: _static/img/draw_waiting_passage_order_full.png
:alt: Étape de composition des poules
Le tirage au sort est en attente de la composition des poules.
Les équipes **AAA**, **CCC** et **EEE** ont déjà lancé leur dé, avec pour
scores 66, 34 et 97.
Une fois le bouton cliqué, il disparaît.
Les organisateurices peuvent également cliquer sur le score de dé d'une équipe
pour lancer le dé à sa place. Cela peut être utile pour débugger ou pour aider
une équipe qui a un souci technique. Il est possible de cliquer sur le dé, ce
qui a pour effet de lancer le dé pour l'équipe qui n'a pas encore tiré son dé.
Les poules sont constituées dès que toutes les équipes ont tiré leur dé, selon
le principe énoncé dans la partie `Principe`_. S'il y a des égalités, alors les
équipes concernées relancent leur dé jusqu'à ne plus avoir d'égalité.
Ordre de tirage des problèmes
.............................
Une fois les poules constituées, il faut déterminer dans quel ordre les équipes
tireront leur problème, par le biais d'un nouveau jet de dé. Les équipes sont
invitées à lancer un dé à 100 faces. Pour cela, elles peuvent cliquer sur le
gros bouton avec l'émoji « dé » 🎲 sur la droite de l'écran. Le résultat est
affiché dans la section « Derniers jets de dés ».
.. figure:: _static/img/draw_waiting_choose_problem_order_full.png
:alt: Étape de tirage de l'ordre de tirage des problèmes
Le tirage au sort est en attente du tirage l'ordre de tirage pour la poule A1.
L'équipe **BBB** a déjà tiré son dé, avec pour score 56. Les équipes **CCC**
et **DDD** sont alors attendues.
Une fois le bouton cliqué, il disparaît.
À nouveau, les organisateurices peuvent cliquer sur le score de dé d'une équipe
pour lancer le dé à sa place. Cela peut être utile pour débugger ou pour aider
une équipe qui a un souci technique. Il est possible de cliquer sur le dé, ce
qui a pour effet de lancer le dé pour l'équipe qui n'a pas encore tiré son dé.
Si deux équipes réalisent le même score, alors les équipes concernées relancent
leur dé jusqu'à ne plus avoir d'égalité.
Tirage des problèmes
....................
Les équipes membre de la poule active sont invitées à tirer leur problème, dans
l'ordre déterminé par les dés précédents.
L'équipe active est invitée à cliquer sur l'urne 🗳️ sur la droite de l'écran pour
tirer un problème au sort.
.. figure:: _static/img/draw_waiting_problem_draw_full.png
:alt: Étape de tirage des problèmes
L'équipe **DDD** est la première à tirer son problème, puisqu'elle a réalisé
le plus gros score. Elle est mise en surbrillance.
Les organisateurices peuvent également cliquer sur l'urne pour lancer le dé à la
place de l'équipe. Cela peut être utile pour débugger ou pour aider une équipe qui
a un souci technique.
Le problème tiré ne peut pas être le même que celui d'une autre équipe de la poule,
ni le même que celui défendu par l'équipe lors du premier tour si on est au second
tour. Il peut en revanche être un problème déjà refusé auparavant.
Choix du problème
.................
Une fois le problème tiré, l'équipe peut alors choisir de l'accepter ou de le
refuser. Elle est invitée à cliquer sur le bouton « Accepter » ou « Refuser »
pour faire son choix.
.. figure:: _static/img/draw_choose_problem_full.png
:alt: Étape de choix du problème
L'équipe **DDD** a tiré le problème 3. Elle peut choisir de l'accepter ou de le refuser.
Si elle accepte le problème, alors elle a terminé, et la main passe à l'équipe
suivante. Ce sera ce problème qu'elle défendra.
Si elle refuse le problème, alors :
* Soit le problème n'avait pas encore été refusé. Dans ce cas, la main passe à
l'équipe suivante, selon l'ordre de tirage des problèmes. Si le nombre de refus
dépasse ``P - 3````P`` est le nombre de problèmes, alors l'équipe se verra
dotée d'une pénalité de 25 % sur son coefficient de l'oral de défense. Ces
pénalités sont cumulables.
* Soit le problème avait déjà été refusé. Dans ce cas, l'équipe peut revenir sur
sa décision et accepter le problème, ou bien le rejeter gratuitement et tirer
immédiatement un nouveau problème. Cela ne compte pas comme un refus
supplémentaire et ne peut ajouter de pénalité.
Les organisateurices peuvent à nouveau cliquer sur les boutons à la place de
l'équipe. Cela peut être utile pour débugger ou pour aider une équipe qui a un
souci technique.
.. figure:: _static/img/draw_example.png
:alt: Exemple de tirage de la poule A1
Dans cet exemple, l'équipe **DDD** a tiré le problème 3, et l'a accepté.
L'équipe **BBB** a d'abord refusé le problème 6, et a accepté plus tard
le problème 5. L'équipe **CCC**, à qui c'est le tour, a refusé les problèmes
8, 4, 2 et 6. Puisqu'il y a 8 problèmes, elle a une pénalité de 25 % sur son
coefficient de l'oral de défense. Elle vient de tirer le problème 2, qu'elle
avait déjà refusé. Elle est donc libre de le refuser à nouveau sans pénalité
supplémentaire, ou bien de l'accepter, comme indiqué dans l'encadré à droite.
Lorsque toutes les équipes de la poule ont accepté leur problème, on passe à la
poule suivante, en revenant à l'étape de tirage au sort de l'ordre des problèmes.
Lorsqu'un tour est terminé, on passe au tour suivant, à la première poule.
Exception : pour la finale, on ne tire au sort que le premier tour.
.. figure:: _static/img/draw_end_round_1.png
:alt: Fin du tirage au sort du premier tour
Toutes les équipes ont tiré leur problème pour le premier tour. On passe
au second tour, à la poule A2.
Fin du tirage au sort
.....................
Le tirage se termine lorsque toutes les équipes se sont vues attribuer un problème
pour chacun des tours.
Les organisateurices peuvent alors cliquer sur le bouton « Exporter » pour valider
le tirage et transmettre les données au reste de la plateforme, débloquant notamment
l'accès aux différentes solutions pour les équipes. Attention : cette opération n'est
pas réversible facilement.
Spécificité de la finale
........................
Pour la finale, le tirage au sort est légèrement différent. Seul le premier tour
est tiré au sort initialement. Pour le second tour, les poules et ordres de passage
sont déterminés selon le classement du premier tour.
Avant de reprendre le tirage au sort du second tour, il est essentiel que les notes
du premier tour soient rentrées correctement. En effet, ce sont ces scores qui
détermineront les poules et l'ordre de passage pour le second tour.
Pour lancer le second tour, un⋅e organisateurice doit cliquer sur le bouton
« Continuer ». Le tirage reprend ensuite normalement, à partir de la poule **A2**.
.. danger::
À terme, il sera possible de réaliser ce second tirage au sort IRL, et de rentrer
facilement les données au fur et à mesure du tirage.
Annulation d'une étape
......................
Il est possible d'annuler la dernière étape du tirage au sort. Cela peut être utile
en cas de souci technique ou de mauvaise manipulation. Cette option est uniquement
réservée aux organisateurices.
Pour cela, il suffit de cliquer sur le bouton « Annuler la dernière étape » dans
la partie « Récapitulatif ». Cela annule immédiatement la dernière action. Il est
possible de continuer à remonter le temps ainsi.
En cas de plus gros problème, il est possible de cliquer sur le bouton « Annuler »
en bas de page. Cela réinitialise le tirage au sort, et permet de recommencer
depuis le début. Cette suppression est irréversible, soyez sûr⋅es de ce que vous
faites avant de cliquer dessus.

View File

@ -12,6 +12,7 @@ administrateur⋅rice.
user
orga
draw
.. toctree::
@ -19,3 +20,4 @@ administrateur⋅rice.
:caption: Développer
dev/index
dev/install

View File

@ -32,16 +32,17 @@ Les informations suivantes sont requises pour tout le monde :
* Genre
* Adresse postale
* Numéro de téléphone de contact
* Problèmes de santé à déclarer
* Problèmes de santé à déclarer (allergies,…)
* Contraintes de logement à déclarer (problèmes médicaux, contraintes horaires, questions de genre,…)
* Donne son consentement pour se faire recontacter par Animath
Informations demandées exclusivement aux élèves :
* Classe (seconde ou avant/première/terminale)
* Établissement scolaire
* Nom du responsable légal
* Numéro de téléphone du responsable légal
* Adresse e-mail du responsable légal
* Nom d'un⋅e responsable légal⋅e
* Numéro de téléphone d'un⋅e responsable légal⋅e
* Adresse e-mail d'un⋅e responsable légal⋅e
Informations exclusivement demandées aux encadrant⋅es :
@ -136,8 +137,8 @@ Pour valider votre inscription, vous devez :
* Transmettre une lettre de motivation.
La lettre de motivation doit être envoyée une seule fois pour toute l'équipe, peut être envoyée
depuis l'interface « Mon équipe », au format PDF, dont le contenu est défini dans l'article 5.3
du guide de læ participant⋅e : https://tfjm.org/reglement/.
depuis l'interface « Mon équipe », au format PDF, dont le contenu est défini dans le
règlement : https://tfjm.org/reglement/.
Concernant les documents personnels, ils peuvent être envoyés depuis le menu « Mon compte », qui
peut être trouvé en haut à droite dans la barre de navigation. Chaque fichier doit être envoyé
@ -201,9 +202,7 @@ Envoyer ses solutions
Participer au tirage au sort
----------------------------
.. TODO
.. note::
Cette section sera mise à jour plus tard.
La documentation des tirages au sort est disponible sur `la page dédiée <draw.html>`_.
Envoyer ses notes de synthèse

View File

@ -899,7 +899,7 @@ class DrawConsumer(AsyncJsonWebsocketConsumer):
if already_refused:
msg += "Cela n'ajoute pas de pénalité."
else:
msg += "Cela ajoute une pénalité de 0.5 sur le coefficient de l'oral de læ défenseur⋅se."
msg += "Cela ajoute une pénalité de 0.5 sur le coefficient de l'oral de la défense."
self.tournament.draw.last_message = msg
await self.tournament.draw.asave()

View File

@ -145,7 +145,7 @@ class Draw(models.Model):
# The problem can be rejected
s += "Elle peut décider d'accepter ou de refuser ce problème. "
if len(td.rejected) >= len(settings.PROBLEMS) - 5:
s += "Refuser ce problème ajoutera une nouvelle pénalité de 0.5 sur le coefficient de l'oral de læ défenseur⋅se."
s += "Refuser ce problème ajoutera une nouvelle pénalité de 0.5 sur le coefficient de l'oral de la défense."
else:
s += f"Il reste {len(settings.PROBLEMS) - 5 - len(td.rejected)} refus sans pénalité."
case 'WAITING_FINAL':

View File

@ -558,7 +558,7 @@ msgstr "L'utilisateur⋅rice suivant n'a pas été trouvé :"
#: participation/forms.py:334
msgid "The defender, the opponent and the reporter must be different."
msgstr ""
"Læ défenseur⋅se, l'opposant⋅e et læ rapporteur⋅e doivent être différent⋅es."
"Les équipes défenseuse, opposante et rapportrice doivent être différent⋅es."
#: participation/forms.py:338
msgid "This defender did not work on this problem."
@ -744,7 +744,7 @@ msgid ""
"Number of penalties for the defender. The defender will loose a 0.5 "
"coefficient per penalty."
msgstr ""
"Nombre de pénalités pour læ défenseur⋅se. Læ défenseur⋅se perd un "
"Nombre de pénalités pour l'équipe défenseuse. Elle perd un "
"coefficient 0.5 sur sa présentation orale par pénalité."
#: participation/models.py:549 participation/models.py:552
@ -829,31 +829,31 @@ msgstr "jury"
#: participation/models.py:704
msgid "defender writing note"
msgstr "note d'écrit de læ défenseur⋅se"
msgstr "note d'écrit de la défense"
#: participation/models.py:710
msgid "defender oral note"
msgstr "note d'oral de læ défenseur⋅se"
msgstr "note d'oral de la défense"
#: participation/models.py:716
msgid "opponent writing note"
msgstr "note d'écrit de l'opposant⋅e"
msgstr "note d'écrit de l'opposition"
#: participation/models.py:722
msgid "opponent oral note"
msgstr "note d'oral de l'opposant⋅e"
msgstr "note d'oral de l'opposition"
#: participation/models.py:728
msgid "reporter writing note"
msgstr "note d'écrit de læ rapporteur⋅e"
msgstr "note d'écrit du rapportage"
#: participation/models.py:734
msgid "reporter oral note"
msgstr "note d'oral de læ rapporteur⋅e"
msgstr "note d'oral du rapportage"
#: participation/models.py:740
msgid "observer note"
msgstr "note de l'observateur⋅rice"
msgstr "note de l'observation"
#: participation/models.py:769
#, python-brace-format
@ -1066,27 +1066,27 @@ msgstr "Détails des notes"
#: participation/templates/participation/passage_detail.html:73
msgid "Average points for the defender writing:"
msgstr "Moyenne de l'écrit de læ défenseur⋅se :"
msgstr "Moyenne de l'écrit de l'équipe défenseuse :"
#: participation/templates/participation/passage_detail.html:76
msgid "Average points for the defender oral:"
msgstr "Moyenne de l'oral de læ défenseur⋅se :"
msgstr "Moyenne de l'oral de l'équipe défenseuse :"
#: participation/templates/participation/passage_detail.html:79
msgid "Average points for the opponent writing:"
msgstr "Moyenne de l'écrit de l'opposante :"
msgstr "Moyenne de l'écrit de l'équipe opposante ':"
#: participation/templates/participation/passage_detail.html:82
msgid "Average points for the opponent oral:"
msgstr "Moyenne de l'oral de l'opposante :"
msgstr "Moyenne de l'oral de l'équipe opposante :"
#: participation/templates/participation/passage_detail.html:85
msgid "Average points for the reporter writing:"
msgstr "Moyenne de l'écrit de læ rapporteur⋅e :"
msgstr "Moyenne de l'écrit de l'équipe rapportrice :"
#: participation/templates/participation/passage_detail.html:88
msgid "Average points for the reporter oral:"
msgstr "Moyenne de l'oral de læ rapporteur⋅e :"
msgstr "Moyenne de l'oral de l'équipe rapportrice :"
#: participation/templates/participation/passage_detail.html:92
msgid "Average points for the observer oral:"
@ -1094,19 +1094,19 @@ msgstr "Moyenne de l'oral de l'observateur⋅rice :"
#: participation/templates/participation/passage_detail.html:100
msgid "Defender points:"
msgstr "Points de læ défenseur⋅se :"
msgstr "Points de l'équipe défenseuse :"
#: participation/templates/participation/passage_detail.html:103
msgid "Opponent points:"
msgstr "Points de l'opposante :"
msgstr "Points de l'équipe opposante :"
#: participation/templates/participation/passage_detail.html:106
msgid "Reporter points:"
msgstr "Points de læ rapporteur⋅e :"
msgstr "Points de l'équipe rapportrice :"
#: participation/templates/participation/passage_detail.html:110
msgid "Observer points:"
msgstr "Points de l'observateur⋅rice :"
msgstr "Points de l'équipe observatrice :"
#: participation/templates/participation/passage_detail.html:119
#: participation/templates/participation/passage_form.html:11
@ -1599,7 +1599,7 @@ msgstr "Nouveau compte de juré⋅e pour le TFJM²"
#: participation/views.py:811
#, python-brace-format
msgid "The jury {name} has been successfully added!"
msgstr "Læ juré⋅e {name} a été ajouté⋅e avec succès !"
msgstr "{name} a été ajouté⋅e avec succès en tant que juré⋅e !"
#: participation/views.py:848
msgid "The following user is not registered as a jury:"
@ -1767,15 +1767,15 @@ msgstr "école"
#: registration/models.py:230
msgid "responsible name"
msgstr "nom de responsable légal⋅e"
msgstr "nom d'un⋅e responsable légal⋅e"
#: registration/models.py:235
msgid "responsible phone number"
msgstr "numéro de téléphone de responsable légal⋅e"
msgstr "numéro de téléphone d'un⋅e responsable légal⋅e"
#: registration/models.py:240
msgid "responsible email address"
msgstr "adresse e-mail de responsable légal⋅e"
msgstr "adresse e-mail d'un⋅e responsable légal⋅e"
#: registration/models.py:245
msgid "parental authorization"
@ -2228,15 +2228,15 @@ msgstr "École :"
#: registration/templates/registration/user_detail.html:116
msgid "Responsible name:"
msgstr "Nom de responsable légal⋅e :"
msgstr "Nom d'un⋅e responsable légal⋅e :"
#: registration/templates/registration/user_detail.html:119
msgid "Responsible phone number:"
msgstr "Numéro de téléphone de responsable légal⋅e :"
msgstr "Numéro de téléphone d'un⋅e responsable légal⋅e :"
#: registration/templates/registration/user_detail.html:122
msgid "Responsible email address:"
msgstr "Adresse e-mail de responsable légal⋅e :"
msgstr "Adresse e-mail d'un⋅e responsable légal⋅e :"
#: registration/templates/registration/user_detail.html:127
msgid "Most recent degree:"

View File

@ -81,7 +81,7 @@ Tour {{ pool.round }} \;-- Poule {{ pool.get_letter_display }}{{ page }} \;-- {%
\vspace{15mm}
\LARGE Nom de læ jur\'e\textperiodcentered{}e :
\LARGE Nom jur\'e\textperiodcentered{}e :
{% if is_jury %}\underline{ {{ user.first_name|safe }} {{ user.last_name|safe }} }{% else %}\underline{\phantom{Phrase suffisamment longue pour le nom}}{% endif %}
$\qquad$ Signature : \underline{\phantom{Phrase moins longue}}