Compare commits
No commits in common. "ecc59a6c8cf2333c5cf98916efe05e01254715b6" and "ab2e49e8fb72759095a542fb74edce0df505079f" have entirely different histories.
ecc59a6c8c
...
ab2e49e8fb
|
@ -1,194 +0,0 @@
|
||||||
Transition d'années
|
|
||||||
===================
|
|
||||||
|
|
||||||
Entre deux sessions du TFJM², certaines opérations doivent être effectuées chaque année,
|
|
||||||
afin de réinitialiser les données et de passer à l'année suivante.
|
|
||||||
|
|
||||||
Réinitialisation de la base de données
|
|
||||||
--------------------------------------
|
|
||||||
|
|
||||||
Conservation des autorisations de droit à l'image
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
La base de données du TFJM² est supprimée chaque année, avant chaque tournoi. Il n'y a
|
|
||||||
pas de conservation de données personnelles à l'exception des autorisations de droit
|
|
||||||
à l'image qui doivent être conservées pour des raisons légales pendant 5 ans.
|
|
||||||
|
|
||||||
Elles doivent alors être stockées sur Owncloud. Pour cela, il faut commencer par créer
|
|
||||||
un dossier dans Owncloud, qui stockera lesdites autorisations.
|
|
||||||
|
|
||||||
Rendez-vous ensuite dans le conteneur Docker et exécuter le script :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
./manage.py export_photo_authorizations
|
|
||||||
|
|
||||||
Cela a pour effet de générer un dossier dans ``output/photo_authorizations``, qui contient
|
|
||||||
un dossier par équipe avec les différentes autorisations de droit à l'image.
|
|
||||||
|
|
||||||
Il faut maintenant récupérer ce dossier. Sortir du conteneur, et exécuter dans ``/srv/TFJM`` :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
sudo docker cp tfjm_plateforme_1:/code/output/photo_authorizations .
|
|
||||||
sudo mv photo_authorizations/* "data/owncloud/files/Emmy/Autorisations de droit à l'image/Autorisations de droit à l'image 2024/"
|
|
||||||
sudo chown -R www-data:root "data/owncloud/files/Emmy/Autorisations de droit à l'image/Autorisations de droit à l'image 2024"
|
|
||||||
sudo rmdir photo_authorizations
|
|
||||||
|
|
||||||
Il faut enfin réactualiser Owncloud. Exécuter en tant que www-data :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
sudo docker compose exec -u www-data cloud php occ files:scan Emmy
|
|
||||||
|
|
||||||
Vérifiez enfin que les fichiers sont bien accessibles dans l'interface Web.
|
|
||||||
Ne pas oublier enfin de partager le dossier.
|
|
||||||
|
|
||||||
|
|
||||||
Sauvegarde de secours
|
|
||||||
"""""""""""""""""""""
|
|
||||||
|
|
||||||
Si les données doivent être supprimées, il peut être utile de réaliser une sauvegarde à conserver
|
|
||||||
quelques mois.
|
|
||||||
|
|
||||||
.. danger::
|
|
||||||
|
|
||||||
Cette sauvegarde ne doit être faite qu'à des fins utiles et supprimée dès que plus nécessaire.
|
|
||||||
|
|
||||||
Sauvegardez alors le dossier ``/srv/TFJM/data/inscription/media`` et exportez la base de données :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
sudo cp -r data/inscription/media data/inscription/media-2024
|
|
||||||
sudo docker compose exec -u postgres postgres pg_dump inscription | sudo tee inscription_bkp_2024.sql
|
|
||||||
|
|
||||||
|
|
||||||
Réinitialisation effective
|
|
||||||
""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
Il est désormais possible de réinitialiser la base de données. Rendez-vous dans le conteneur de
|
|
||||||
la plateforme, et exécutez :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
rm -r media/*
|
|
||||||
./manage.py reset_db
|
|
||||||
|
|
||||||
Créez enfin un nouveau compte administrateur⋅rice :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
./manage.py createsuperuser
|
|
||||||
|
|
||||||
|
|
||||||
Nouveaux paramètres pour la nouvelle année
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
Certains paramètres doivent être modifiés pour prendre en compte la nouvelle année.
|
|
||||||
|
|
||||||
Dates d'inscription
|
|
||||||
"""""""""""""""""""
|
|
||||||
|
|
||||||
Les inscriptions sont permises uniquement entre l'ouverture et la fermeture, afin d'éviter
|
|
||||||
d'avoir des personnes s'inscrivant en dehors du TFJM².
|
|
||||||
|
|
||||||
Pour cela, dans votre projet local, rendez-vous dans ``tfjm/settings.py`` et cherchez
|
|
||||||
le paramètre ``REGISTRATION_DATES`` (pour le TFJM²). Modifiez alors les sous-paramètres
|
|
||||||
``open`` et ``close`` pour définir les dates pendant lesquelles les inscriptions des
|
|
||||||
participant⋅es sont permises pour cette nouvelle année. Elles doivent être au format ISO.
|
|
||||||
|
|
||||||
Exemple pour l'année 2025 où les inscriptions ouvrent au 8 janvier midi pour fermer
|
|
||||||
le 2 mars à 22h :
|
|
||||||
|
|
||||||
.. code:: python
|
|
||||||
|
|
||||||
REGISTRATION_DATES = dict(
|
|
||||||
open=datetime.fromisoformat("2025-01-08T12:00:00+0100"),
|
|
||||||
close=datetime.fromisoformat("2025-03-02T22:00:00+0100"),
|
|
||||||
)
|
|
||||||
|
|
||||||
Il faudra ensuite commiter la modification et redémarrer le serveur pour que la modification
|
|
||||||
prenne effet.
|
|
||||||
|
|
||||||
|
|
||||||
Noms des problèmes
|
|
||||||
""""""""""""""""""
|
|
||||||
|
|
||||||
Toujours dans la configuration dans ``tfjm/settings.py``, la liste des problèmes doit être
|
|
||||||
modifiée pour que leurs noms s'affichent correctement lors du tirage au sort.
|
|
||||||
|
|
||||||
Cherchez le paramètre ``PROBLEMS`` et mettez alors à jour la liste, dans l'ordre, des noms
|
|
||||||
des problèmes.
|
|
||||||
|
|
||||||
À nouveau, il est nécessaire de commiter la modification et redémarrer le serveur.
|
|
||||||
|
|
||||||
|
|
||||||
Paramètres des tournois
|
|
||||||
"""""""""""""""""""""""
|
|
||||||
|
|
||||||
Il faut enfin paramétrer les différentes dates des tournois.
|
|
||||||
|
|
||||||
Pour cela, connectez-vous sur la plateforme (avec un compte administrateur⋅rice), et dans l'onglet
|
|
||||||
« Tournois », vous pouvez créer les différents tournois avec les différentes dates pour chaque tournoi.
|
|
||||||
Plus d'information sur les différents paramètres dans la `section concernée
|
|
||||||
<../orga.html#creer-un-tournoi>`_
|
|
||||||
|
|
||||||
|
|
||||||
À la fin du tournoi
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Lorsque le tournoi est terminé, il faut récupérer les informations à stocker de façon pérenne,
|
|
||||||
notamment les solutions des équipes, les résultats ainsi que les autorisation de droit à l'image
|
|
||||||
comme indiqué précédemment.
|
|
||||||
|
|
||||||
Conservation des autorisations de droit à l'image
|
|
||||||
"""""""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
Se référer à la section plus haut.
|
|
||||||
|
|
||||||
|
|
||||||
Conservation des solutions des équipes
|
|
||||||
""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
Le processus est très similaire à la conservation des autorisations de droit à l'image.
|
|
||||||
Il faut d'abord, dans le conteneur, lancer le script dédié pour récupérer les solutions
|
|
||||||
dans ``/code/output/solutions`` :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
./manage.py export_solutions
|
|
||||||
|
|
||||||
On sort du conteneur et on récupère les solutions pour les déplacer dans Owncloud :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
sudo docker cp tfjm_plateforme_1:/code/output/solutions .
|
|
||||||
sudo mv solutions/* "data/owncloud/files/Emmy/Solutions écrites 2024/"
|
|
||||||
sudo chown -R www-data:root "data/owncloud/files/Emmy/Solutions écrites 2024"
|
|
||||||
sudo rmdir solutions
|
|
||||||
|
|
||||||
Il faut enfin réactualiser Owncloud. Exécuter en tant que www-data :
|
|
||||||
|
|
||||||
.. code:: bash
|
|
||||||
|
|
||||||
sudo docker compose exec -u www-data cloud php occ files:scan Emmy
|
|
||||||
|
|
||||||
Vérifiez enfin que les fichiers sont bien accessibles dans l'interface Web.
|
|
||||||
Ne pas oublier enfin de partager le dossier.
|
|
||||||
|
|
||||||
|
|
||||||
Génération de la page de résultats Wordpress
|
|
||||||
""""""""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
Pour finir, il est possible de récupérer les notes pour chaque tournoi afin de générer
|
|
||||||
la page Wordpress dans la section *Éditions précédentes*.
|
|
||||||
|
|
||||||
Il suffit de lancer le script ``./manage.py export_results``, qui donne le texte brut pour
|
|
||||||
Wordpress à ajouter sur la page de l'édition qui vient de se terminer dans l'onglet
|
|
||||||
*Éditions précédentes*.
|
|
||||||
|
|
||||||
Pensez à bien inclure sur cette page le lien vers les problèmes de l'année, ainsi que le
|
|
||||||
lien vers le dossier partagé dans le Owncloud concernant les solutions des équipes.
|
|
||||||
|
|
||||||
Assurez-vous de mettre à jour la page *Éditions précédentes* afin d'inclure le lien vers
|
|
||||||
la page nouvellement créée.
|
|
|
@ -21,4 +21,3 @@ administrateur⋅rice.
|
||||||
|
|
||||||
dev/index
|
dev/index
|
||||||
dev/install
|
dev/install
|
||||||
dev/transition
|
|
||||||
|
|
|
@ -5,14 +5,16 @@ from pathlib import Path
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.management import BaseCommand
|
from django.core.management import BaseCommand
|
||||||
|
from django.utils.translation import activate
|
||||||
from participation.models import Solution, Tournament
|
from participation.models import Solution, Tournament
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
def handle(self, *args, **kwargs):
|
def handle(self, *args, **kwargs):
|
||||||
|
activate(settings.PROBLEMS)
|
||||||
|
|
||||||
base_dir = Path(__file__).parent.parent.parent.parent
|
base_dir = Path(__file__).parent.parent.parent.parent
|
||||||
base_dir /= "output"
|
base_dir /= "output"
|
||||||
base_dir /= "solutions"
|
|
||||||
if not base_dir.is_dir():
|
if not base_dir.is_dir():
|
||||||
base_dir.mkdir()
|
base_dir.mkdir()
|
||||||
base_dir /= "Par équipe"
|
base_dir /= "Par équipe"
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
# Copyright (C) 2024 by Animath
|
|
||||||
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
from django.core.management import BaseCommand
|
|
||||||
from participation.models import Team
|
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
|
||||||
help = """Cette commande permet d'exporter dans le dossier output/photo_authorizations l'ensemble des
|
|
||||||
autorisations de droit à l'image des participant⋅es, triées par équipe, incluant aussi celles de la finale."""
|
|
||||||
|
|
||||||
def handle(self, *args, **kwargs):
|
|
||||||
base_dir = Path(__file__).parent.parent.parent.parent
|
|
||||||
base_dir /= "output"
|
|
||||||
base_dir / "photo_authorizations"
|
|
||||||
if not base_dir.is_dir():
|
|
||||||
base_dir.mkdir()
|
|
||||||
|
|
||||||
for team in Team.objects.filter(participation__valid=True).all():
|
|
||||||
team_dir = base_dir / f"{team.trigram} - {team.name}"
|
|
||||||
if not team_dir.is_dir():
|
|
||||||
team_dir.mkdir()
|
|
||||||
|
|
||||||
for participant in team.participants.all():
|
|
||||||
if participant.photo_authorization:
|
|
||||||
with participant.photo_authorization.file as file_input:
|
|
||||||
with open(team_dir / f"{participant}.pdf", 'wb') as file_output:
|
|
||||||
file_output.write(file_input.read())
|
|
||||||
|
|
||||||
if participant.photo_authorization_final:
|
|
||||||
with participant.photo_authorization.file as file_input:
|
|
||||||
with open(team_dir / f"{participant} (finale).pdf", 'wb') as file_output:
|
|
||||||
file_output.write(file_input.read())
|
|
Loading…
Reference in New Issue