mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 01:32:05 +01:00 
			
		
		
		
	Add script to export solutions
Signed-off-by: Yohann D'ANELLO <ynerant@crans.org>
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -35,6 +35,7 @@ coverage
 | 
				
			|||||||
secrets.py
 | 
					secrets.py
 | 
				
			||||||
*.log
 | 
					*.log
 | 
				
			||||||
media/
 | 
					media/
 | 
				
			||||||
 | 
					output/
 | 
				
			||||||
# Virtualenv
 | 
					# Virtualenv
 | 
				
			||||||
env/
 | 
					env/
 | 
				
			||||||
venv/
 | 
					venv/
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										83
									
								
								apps/participation/management/commands/export_solutions.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								apps/participation/management/commands/export_solutions.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,83 @@
 | 
				
			|||||||
 | 
					# Copyright (C) 2021 by Animath
 | 
				
			||||||
 | 
					# SPDX-License-Identifier: GPL-3.0-or-later
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from pathlib import Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from django.contrib.auth.models import User
 | 
				
			||||||
 | 
					from django.core.management import BaseCommand
 | 
				
			||||||
 | 
					from django.utils.formats import date_format
 | 
				
			||||||
 | 
					from django.utils.translation import activate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from participation.models import Solution, Tournament
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Command(BaseCommand):
 | 
				
			||||||
 | 
					    def handle(self, *args, **kwargs):
 | 
				
			||||||
 | 
					        activate('fr')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        base_dir = Path(__file__).parent.parent.parent.parent.parent
 | 
				
			||||||
 | 
					        base_dir /= "output"
 | 
				
			||||||
 | 
					        if not base_dir.is_dir():
 | 
				
			||||||
 | 
					            base_dir.mkdir()
 | 
				
			||||||
 | 
					        base_dir /= "Par équipe"
 | 
				
			||||||
 | 
					        if not base_dir.is_dir():
 | 
				
			||||||
 | 
					            base_dir.mkdir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        tournaments = Tournament.objects.all()
 | 
				
			||||||
 | 
					        for tournament in tournaments:
 | 
				
			||||||
 | 
					            self.handle_tournament(tournament, base_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        base_dir = base_dir.parent / "Par problème"
 | 
				
			||||||
 | 
					        if not base_dir.is_dir():
 | 
				
			||||||
 | 
					            base_dir.mkdir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        PROBLEMS = [
 | 
				
			||||||
 | 
					                "Agent 1234",
 | 
				
			||||||
 | 
					                "Bataille rangée",
 | 
				
			||||||
 | 
					                "C'est pas trop tôt !",
 | 
				
			||||||
 | 
					                "Chocolaterie de haut vol",
 | 
				
			||||||
 | 
					                "Stratégies féodales",
 | 
				
			||||||
 | 
					                "Le facteur n'est pas passé",
 | 
				
			||||||
 | 
					                "Vive les grenouilles libres !",
 | 
				
			||||||
 | 
					                "Télé truquée",
 | 
				
			||||||
 | 
					        ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for problem_id, problem_name in enumerate(PROBLEMS):
 | 
				
			||||||
 | 
					            dir_name = f"Problème n°{problem_id} : {problem_name}"
 | 
				
			||||||
 | 
					            problem_dir = base_dir / dir_name
 | 
				
			||||||
 | 
					            if not problem_dir.is_dir():
 | 
				
			||||||
 | 
					                problem_dir.mkdir()
 | 
				
			||||||
 | 
					            self.handle_problem(problem_id, problem_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def handle_tournament(self, tournament, base_dir):
 | 
				
			||||||
 | 
					        name = tournament.name
 | 
				
			||||||
 | 
					        tournament_dir = base_dir / name
 | 
				
			||||||
 | 
					        if not tournament_dir.is_dir():
 | 
				
			||||||
 | 
					            tournament_dir.mkdir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for participation in tournament.participations.filter(valid=True).all():
 | 
				
			||||||
 | 
					            self.handle_participation(participation, tournament_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def handle_participation(self, participation, tournament_dir):
 | 
				
			||||||
 | 
					        name = participation.team.name
 | 
				
			||||||
 | 
					        trigram = participation.team.trigram
 | 
				
			||||||
 | 
					        team_dir = tournament_dir / f"{name} ({trigram})"
 | 
				
			||||||
 | 
					        if not team_dir.is_dir():
 | 
				
			||||||
 | 
					            team_dir.mkdir()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for solution in participation.solutions.all():
 | 
				
			||||||
 | 
					            filename = f"{solution}.pdf"
 | 
				
			||||||
 | 
					            with solution.file as file_input:
 | 
				
			||||||
 | 
					                with open(team_dir / filename, 'wb') as file_output:
 | 
				
			||||||
 | 
					                    file_output.write(file_input.read())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def handle_problem(self, problem_id, directory):
 | 
				
			||||||
 | 
					        solutions = Solution.objects.filter(problem=problem_id).all()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for solution in solutions:
 | 
				
			||||||
 | 
					            team = solution.participation.team
 | 
				
			||||||
 | 
					            tournament_name = team.participation.tournament.name
 | 
				
			||||||
 | 
					            output_file = directory / f'{solution}.pdf'
 | 
				
			||||||
 | 
					            if output_file.is_file():
 | 
				
			||||||
 | 
					                output_file.unlink()
 | 
				
			||||||
 | 
					            output_file.symlink_to(f'../../Par équipe/{tournament_name}/{team.name} ({team.trigram})/{solution}.pdf')
 | 
				
			||||||
		Reference in New Issue
	
	Block a user