mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-10-31 17:40:00 +01:00 
			
		
		
		
	Amélioration des fichiers d'ajout de tournoi
This commit is contained in:
		| @@ -42,6 +42,7 @@ $ROUTES["^solutions/?$"] = ["server_files/controllers/solutions.php"]; | ||||
| $ROUTES["^solutions_orga/?$"] = ["server_files/controllers/solutions_orga.php"]; | ||||
| $ROUTES["^syntheses/?$"] = ["server_files/controllers/syntheses.php"]; | ||||
| $ROUTES["^syntheses_orga/?$"] = ["server_files/controllers/syntheses_orga.php"]; | ||||
| $ROUTES["^tournoi/(.*)/(modifier)/?$"] = ["server_files/controllers/tournoi.php", "name", "modifier"]; | ||||
| $ROUTES["^tournoi/(.*)/?$"] = ["server_files/controllers/tournoi.php", "name"]; | ||||
| $ROUTES["^tournois/?$"] = ["server_files/controllers/tournois.php"]; | ||||
|  | ||||
|   | ||||
| @@ -5,106 +5,100 @@ if (!isset($_SESSION["role"]) || $_SESSION["role"] != Role::ADMIN) | ||||
|  | ||||
| $orgas_response = $DB->query("SELECT `id`, `surname`, `first_name` FROM `users` WHERE (`role` = 'ORGANIZER' OR `role` = 'ADMIN') AND `year` = '$YEAR';"); | ||||
|  | ||||
| $has_error = false; | ||||
| $error_message = null; | ||||
|  | ||||
| if (isset($_POST["submitted"])) { | ||||
|     $error_message = registerTournament(); | ||||
| } | ||||
|  | ||||
| function registerTournament() { | ||||
|     global $DB, $YEAR, $MAIL_ADDRESS; | ||||
|  | ||||
|     $name = htmlspecialchars($_POST["name"]); | ||||
|  | ||||
|     $result = $DB->query("SELECT `id` FROM `tournaments` WHERE `name` = '" . $name . "' AND `year` = '$YEAR';"); | ||||
|     if ($result->fetch()) | ||||
|         return "Un tournoi existe déjà avec ce nom."; | ||||
|  | ||||
|     if (!isset($_POST["organizer"]) || sizeof($_POST["organizer"]) == 0) | ||||
|         return "Aucun organisateur n'a été choisi."; | ||||
|  | ||||
|     $organizers = $_POST["organizer"]; | ||||
|     $orga_mails = []; | ||||
|  | ||||
|     foreach ($organizers as $orga) { | ||||
| 		$result = $DB->query("SELECT `role`, `email` FROM `users` WHERE `id` = '" . $orga . "' AND `year` = '$YEAR';"); | ||||
| 		$data = $result->fetch(); | ||||
| 		if ($data === FALSE) | ||||
| 			return "L'organisateur spécifié n'existe pas."; | ||||
| 		if ($data["role"] != Role::ORGANIZER && $data["role"] != Role::ADMIN) | ||||
| 			return "L'organisateur indiqué ne peut pas organiser de tournoi."; | ||||
| 		$orga_mails[] = $data["email"]; | ||||
| 	} | ||||
|  | ||||
|     $tournament = new NewTournament($_POST); | ||||
|     try { | ||||
|         $size = intval(htmlspecialchars($_POST["size"])); | ||||
|     	$tournament->makeVerifications(); | ||||
|     	$tournament->register(); | ||||
| 	} | ||||
| 	catch (AssertionError $e) { | ||||
|     	$has_error = true; | ||||
|     	$error_message = $e->getMessage(); | ||||
| 	} | ||||
|     catch (Exception $ex) { | ||||
|         return "Le nombre d'équipes indiqué n'est pas un entier valide."; | ||||
| } | ||||
|  | ||||
|     if ($size < 3 || $size > 12) | ||||
|         return "Un tournoi doit comporter entre 3 et 12 équipes."; | ||||
| class NewTournament { | ||||
| 	public $name; | ||||
| 	public $organizers; | ||||
| 	public $size; | ||||
| 	public $place; | ||||
| 	public $price; | ||||
| 	public $date_start; | ||||
| 	public $date_end; | ||||
| 	public $date_inscription; | ||||
| 	public $time_inscription; | ||||
| 	public $date_solutions; | ||||
| 	public $time_solutions; | ||||
| 	public $date_syntheses; | ||||
| 	public $time_syntheses; | ||||
| 	public $description; | ||||
| 	public $final; | ||||
| 	public $tournament; | ||||
|  | ||||
|     $place = htmlspecialchars($_POST["place"]); | ||||
|  | ||||
|     try { | ||||
|         $price = intval(htmlspecialchars($_POST["price"])); | ||||
|     } | ||||
|     catch (Throwable $t) { | ||||
|         return "Le tarif pour les participants n'est pas un nombre valide."; | ||||
| 	public function __construct($data) | ||||
| 	{ | ||||
| 		foreach ($data as $key => $value) | ||||
| 			$this->$key = ($key == "organizers" ? $value : htmlspecialchars($value)); | ||||
| 	} | ||||
|  | ||||
|     if ($price < 0) | ||||
|         return "Le TFJM² ne va pas payer les élèves pour venir."; | ||||
| 	public function makeVerifications() | ||||
| 	{ | ||||
| 		global $FINAL; | ||||
|  | ||||
|     if ($price > 50) | ||||
|         return "Soyons raisonnable sur le prix."; | ||||
| 		ensure($this->name != null && $this->name != "", "Le nom est invalide."); | ||||
| 		ensure(!tournamentExists($this->name), "Un tournoi existe déjà avec ce nom."); | ||||
| 		ensure(sizeof($this->organizers) > 0, "Aucun organisateur n'a été choisi."); | ||||
|  | ||||
|     $date_start = htmlspecialchars($_POST["date_start"]); | ||||
|     $date_start_parsed = date_parse_from_format("yyyy-mm-dd", $date_start); | ||||
| 		$orgas = []; | ||||
| 		foreach ($this->organizers as $orga_id) { | ||||
| 			$orga = User::fromId($orga_id); | ||||
| 			ensure($orga != null, "Un organisateur spécifié n'existe pas."); | ||||
| 			ensure($orga->getRole() == Role::ORGANIZER || $orga->getRole() == Role::ADMIN, "Une personne indiquée ne peut pas organiser de tournoi."); | ||||
| 			$orgas[] = $orga; | ||||
| 		} | ||||
| 		$this->organizers = $orgas; | ||||
|  | ||||
|     $date_end = htmlspecialchars($_POST["date_end"]); | ||||
|     $date_end_parsed = date_parse_from_format("yyyy-mm-dd", $date_end); | ||||
| 		ensure(preg_match("#[0-9]*#", $this->size), "Le nombre d'équipes indiqué n'est pas un nombre valide."); | ||||
| 		$this->size = intval($this->size); | ||||
| 		ensure($this->size >= 3 && $this->size <= 15, "Un tournoi doit avoir au moins 3 et au plus 15 équipes."); | ||||
|  | ||||
|     $date_inscription = htmlspecialchars($_POST["date_inscription"]); | ||||
|     $time_inscription = htmlspecialchars($_POST["time_inscription"]); | ||||
|     $date_inscription_parsed = date_parse_from_format("yyyy-mm-dd", $date_inscription . ' ' . $time_inscription); | ||||
| 		ensure(preg_match("#[0-9]*#", $this->price), "Le tarif pour les participants n'est pas un entier valide."); | ||||
| 		$this->price = intval($this->price); | ||||
| 		ensure($this->size >= 0, "Le TFJM² ne va pas payer les élèves pour venir."); | ||||
| 		ensure($this->size <= 50, "Soyons raisonnable sur le prix."); | ||||
|  | ||||
|     $date_solutions = htmlspecialchars($_POST["date_solutions"]); | ||||
|     $time_solutions = htmlspecialchars($_POST["time_solutions"]); | ||||
|     $date_solutions_parsed = date_parse_from_format("yyyy-mm-dd", $date_solutions . ' ' . $time_solutions); | ||||
| 		ensure(dateWellFormed($this->date_start), "La date de début n'est pas valide."); | ||||
| 		ensure(dateWellFormed($this->date_end), "La date de fin n'est pas valide."); | ||||
| 		ensure(dateWellFormed($this->date_inscription . " " . $this->time_inscription), "La date de clôture des inscriptions n'est pas valide."); | ||||
| 		ensure(dateWellFormed($this->date_solutions . " " . $this->time_solutions), "La date limite de remise des solutions n'est pas valide."); | ||||
| 		ensure(dateWellFormed($this->date_syntheses . " " . $this->time_syntheses), "La date limite de remise des notes de synthèse n'est pas valide."); | ||||
|  | ||||
|     $date_syntheses = htmlspecialchars($_POST["date_syntheses"]); | ||||
|     $time_syntheses = htmlspecialchars($_POST["time_syntheses"]); | ||||
|     $date_syntheses_parsed = date_parse_from_format("yyyy-mm-dd", $date_syntheses . ' ' . $time_syntheses); | ||||
| 		$this->final = $this->final ? 1 : 0; | ||||
|  | ||||
|     if (!$date_start_parsed || !$date_end_parsed || !$date_inscription_parsed || !$date_solutions_parsed || !$date_syntheses_parsed) | ||||
|         return "Une date est mal formée."; | ||||
| 		ensure(!$this->final || $FINAL == NULL, "Une finale nationale est déjà enregistrée."); | ||||
| 	} | ||||
|  | ||||
|     $description = htmlspecialchars($_POST["description"]); | ||||
|      | ||||
|     $final = isset($_POST["final"]) && $_POST["final"]; | ||||
|      | ||||
|     if ($final && $DB->query("SELECT `id` FROM `tournaments` WHERE `final` = true AND `year` = $YEAR;")->fetch() !== false) | ||||
|         return "Une finale est déjà enregistrée."; | ||||
| 	public function register() | ||||
| 	{ | ||||
| 		global $DB, $YEAR; | ||||
|  | ||||
| 		$req = $DB->prepare("INSERT INTO `tournaments` (`name`, `size`, `place`, `price`, `description`,  | ||||
|                            `date_start`, `date_end`, `date_inscription`, `date_solutions`, `date_syntheses`, `final`, `year`) | ||||
|                            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);"); | ||||
|     $req->execute([$name, $size, $place, $price, $description, $date_start, $date_end, | ||||
|         "$date_inscription $time_inscription", "$date_solutions $time_solutions", "$date_syntheses $time_syntheses", $final, $YEAR]); | ||||
| 		$req->execute([$this->name, $this->size, $this->place, $this->price, $this->description, $this->date_start, $this->date_end, | ||||
| 			"$this->date_inscription $this->time_inscription", "$this->date_solutions $this->time_solutions", "$this->date_syntheses $this->time_syntheses", $this->final ? 1 : 0, $YEAR]); | ||||
|  | ||||
|     $req = $DB->query("SELECT `id` FROM `tournaments` WHERE `name` = '$name' AND `year` = $YEAR;"); | ||||
|     $tournament_id = $req->fetch()["id"]; | ||||
| 		$this->tournament = Tournament::fromName($this->name); | ||||
|  | ||||
|     foreach ($organizers as $orga) { | ||||
| 		foreach ($this->organizers as $organizer) { | ||||
| 			$req = $DB->prepare("INSERT INTO `organizers`(`organizer`, `tournament`) VALUES(?, ?);"); | ||||
|         $req->execute([$orga, $tournament_id]); | ||||
| 			$req->execute([$organizer->getId(), $this->tournament->getId()]); | ||||
| 			sendAddOrganizerForTournamentMail($organizer, $this->tournament); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
|     foreach ($orga_mails as $orga_mail) | ||||
|         mail($orga_mail, "Organisateur TFJM² " . $name, "Vous venez d'être promu organisateur du tournoi " . $name . " pour le TFJM² $YEAR !", "From: $MAIL_ADDRESS"); | ||||
|  | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| require_once "server_files/views/ajouter_tournoi.php"; | ||||
|   | ||||
| @@ -30,7 +30,7 @@ else | ||||
| $orgas_response = $DB->query("SELECT `id`, `surname`, `first_name` FROM `users` WHERE (`role` = 'ORGANIZER' OR `role` = 'ADMIN') AND `year` = '$YEAR';"); | ||||
|  | ||||
| function updateTournament() { | ||||
| 	global $DB, $URL_BASE, $YEAR, $tournament; | ||||
| 	global $DB, $URL_BASE, $YEAR, $tournament, $orgas; | ||||
|  | ||||
|     $name = htmlspecialchars($_POST["name"]); | ||||
|  | ||||
| @@ -43,7 +43,7 @@ function updateTournament() { | ||||
|  | ||||
| 	if ($_SESSION["role"] == Role::ADMIN) { | ||||
| 		$organizers = $_POST["organizer"]; | ||||
| 		$orga_mails = []; | ||||
| 		$orgas = []; | ||||
|  | ||||
| 		foreach ($organizers as $orga_id) { | ||||
| 			$orga = User::fromId($orga_id); | ||||
| @@ -51,7 +51,7 @@ function updateTournament() { | ||||
| 				return "L'organisateur spécifié n'existe pas."; | ||||
| 			if ($orga->getRole() != Role::ORGANIZER && $orga->getRole() != Role::ADMIN) | ||||
| 				return "L'organisateur indiqué ne peut pas organiser de tournoi."; | ||||
| 			$orga_mails[] = $orga->getEmail(); | ||||
| 			$orgas[] = $orga; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -111,7 +111,7 @@ function updateTournament() { | ||||
|  | ||||
| 	if ($_SESSION["role"] == Role::ADMIN) { | ||||
| 		$DB->exec("DELETE FROM `organizers` WHERE `tournament` = " . $tournament->getId() . ";"); | ||||
| 		foreach ($organizers as $orga) { | ||||
| 		foreach ($orgas as $orga) { | ||||
| 			$req = $DB->prepare("INSERT INTO `organizers`(`organizer`, `tournament`) VALUES(?, ?);"); | ||||
| 			$req->execute([$orga->getId(), $tournament->getId()]); | ||||
| 		} | ||||
|   | ||||
| @@ -112,3 +112,11 @@ function trigramExists($trigram) { | ||||
| 	$req->execute([$trigram]); | ||||
| 	return $req->fetch(); | ||||
| } | ||||
|  | ||||
| function tournamentExists($name) { | ||||
| 	global $DB, $YEAR; | ||||
|  | ||||
| 	$req = $DB->prepare("SELECT `id` FROM `tournaments` WHERE `name` = ? AND `year` = '$YEAR';"); | ||||
| 	$req->execute([$name]); | ||||
| 	return $req->fetch(); | ||||
| } | ||||
| @@ -61,5 +61,21 @@ function sendAddOrganizerMail($new_orga) | ||||
| 	$content = preg_replace("#{SURNAME}#", $new_orga->surname, $content); | ||||
| 	$content = preg_replace("#{PASSWORD}#", $new_orga->password, $content); | ||||
|  | ||||
| 	sendMail($new_orga->email, "Inscription au TFJM² $YEAR", $content); | ||||
| 	sendMail($new_orga->email, "Ajout d'un organisateur -- TFJM² $YEAR", $content); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * @param $organizer User | ||||
|  * @param $tournament Tournament | ||||
|  */ | ||||
| function sendAddOrganizerForTournamentMail($organizer, $tournament) | ||||
| { | ||||
| 	global $LOCAL_PATH, $YEAR; | ||||
|  | ||||
| 	$content = file_get_contents("$LOCAL_PATH/server_files/services/mail_templates/add_organizer_for_tournament.html"); | ||||
| 	$content = preg_replace("#{FIRST_NAME}#", $organizer->getFirstName(), $content); | ||||
| 	$content = preg_replace("#{SURNAME}#", $organizer->getSurname(), $content); | ||||
| 	$content = preg_replace("#{TOURNAMENT_NAME}#", $tournament->getName(), $content); | ||||
|  | ||||
| 	sendMail($organizer->getEmail(), "Ajout d'un organisateur pour le tournoi " . $tournament->getName() . "-- TFJM² $YEAR", $content); | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,16 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <title>Organisateur du tournoi de {TOURNAMENT_NAME} -- TFJM²</title> | ||||
| </head> | ||||
| <body> | ||||
| Bonjour {FIRST_NAME} {SURNAME},<br /> | ||||
| <br /> | ||||
| Vous venez d'être promu organisateur du tournoi <a href="{URL_BASE}/tournoi/{TOURNAMENT_NAME}">{TOURNAMENT_NAME}</a> du TFJM<sup>2</sup> {YEAR}.<br /> | ||||
| <br /> | ||||
| Cordialement,<br /> | ||||
| <br /> | ||||
| Le comité national d'organisation du TFJM<sup>2</sup> | ||||
| </body> | ||||
| </html> | ||||
| @@ -12,6 +12,6 @@ function formatDate($date = NULL, $with_time = false) { | ||||
| 	return strftime("%d %B %G" . ($with_time ? " %H:%M" : ""), strtotime($date)); | ||||
| } | ||||
|  | ||||
| function dateWellFormed($date, $format = "yyyy-mm-dd") { | ||||
| 	return date_parse_from_format($format, $date) !== false; | ||||
| function dateWellFormed($date, $with_time = false) { | ||||
| 	return date_parse_from_format($with_time ? "yyyy-mm-dd HH-MM:ss" : "yy-mm-dd", $date) !== false; | ||||
| } | ||||
| @@ -1,10 +1,11 @@ | ||||
| <?php | ||||
| require_once "header.php"; | ||||
|  | ||||
| if (isset($error_message)) { | ||||
| 	if ($error_message !== false) { | ||||
| if (isset($tournament)) { | ||||
| 	if ($has_error) { | ||||
| 		echo "<h2>Erreur : " . $error_message . "</h2>"; | ||||
| 	} else { | ||||
| 	} | ||||
| 	else { | ||||
| 		echo "<h2>Tournoi de " . htmlspecialchars($_POST["name"]) . " ajouté avec succès !</h2>"; | ||||
| 	} | ||||
| }?> | ||||
| @@ -23,10 +24,10 @@ if (isset($error_message)) { | ||||
| 		</tr> | ||||
| 		<tr> | ||||
| 			<td> | ||||
| 				<label for="organizer">Organisateur :</label> | ||||
| 				<label for="organizers">Organisateurs :</label> | ||||
| 			</td> | ||||
| 			<td> | ||||
| 				<select style="width: 100%;" id="organizer" name="organizer[]" multiple size="4" required> | ||||
| 				<select style="width: 100%;" id="organizers" name="organizers[]" multiple size="4" required> | ||||
| 					<?php | ||||
| 					while (($data = $orgas_response->fetch()) !== FALSE) { | ||||
| 						echo "<option value=\"" . $data["id"] . "\">" . $data["first_name"] . " " . $data["surname"] . "</option>\n"; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user