diff --git a/assets/style.css b/assets/style.css index ba05efd..9900012 100644 --- a/assets/style.css +++ b/assets/style.css @@ -6,3 +6,20 @@ height: var(--navbar-height); display: block; } + +ul .deroule { + display: none; + position: absolute; + background: #f8f9fa !important; + list-style-type: none; + padding: 20px; + z-index: 42; +} + +li:hover ul.deroule { + display:block; +} + +a.nav-link:hover { + background-color: #d8d9da; +} diff --git a/dispatcher.php b/dispatcher.php index 95267f0..0e12d25 100644 --- a/dispatcher.php +++ b/dispatcher.php @@ -48,8 +48,10 @@ $ROUTES["^mon-compte/?$"] = ["server_files/controllers/mon_compte.php"]; $ROUTES["^mon-equipe/(diffusion-videos)/?$"] = ["server_files/controllers/mon_equipe.php", "publish_videos"]; $ROUTES["^mon-equipe/(modifier)/?$"] = ["server_files/controllers/mon_equipe.php", "modifier"]; $ROUTES["^mon-equipe/?$"] = ["server_files/controllers/mon_equipe.php"]; +$ROUTES["^mon-tournoi/?$"] = ["server_files/controllers/mon_tournoi.php"]; $ROUTES["^poser-questions-2$"] = ["server_files/controllers/poser_questions.php"]; $ROUTES["^probleme/([1-4])/?$"] = ["server_files/controllers/probleme.php", "probleme"]; +$ROUTES["^profils-orphelins/?$"] = ["server_files/controllers/profils_orphelins.php"]; $ROUTES["^rejoindre-equipe/?$"] = ["server_files/controllers/rejoindre_equipe.php"]; $ROUTES["^repondre-questions-3$"] = ["server_files/controllers/repondre_questions.php"]; $ROUTES["^videos-solutions/?$"] = ["server_files/controllers/videos_solutions.php"]; diff --git a/server_files/classes/Question.php b/server_files/classes/Question.php index 40279ad..a45fb6e 100644 --- a/server_files/classes/Question.php +++ b/server_files/classes/Question.php @@ -79,9 +79,9 @@ class Question null, null, null]; - for ($_ = 0; $_ < 6; ++$_) { - $req = $DB->prepare("INSERT INTO `questions`(`from`, `to`, `problem`, `question`) VALUES (?, ?, ?, ?);"); - $req->execute([$from->getId(), $to->getId(), $from->getProblem(), $default_questions[$_]]); + for ($i = 0; $i < 6; ++$i) { + $req = $DB->prepare("INSERT INTO `questions`(`from`, `to`, `problem`, `number`, `question`) VALUES (?, ?, ?, ?, ?);"); + $req->execute([$from->getId(), $to->getId(), $from->getProblem(), $i, $default_questions[$i]]); } return self::getQuestions($from, $to); } diff --git a/server_files/classes/Team.php b/server_files/classes/Team.php index d8ccf03..aecf1d4 100644 --- a/server_files/classes/Team.php +++ b/server_files/classes/Team.php @@ -73,7 +73,7 @@ class Team public static function getAllTeams($problem) { global $DB, $YEAR; - $req = $DB->prepare("SELECT * FROM `teams` WHERE `problem` = ? AND `year` = $YEAR;"); + $req = $DB->prepare("SELECT * FROM `teams` WHERE " . ($problem <= 0 ? "" : "`problem` = ? AND ") . "`year` = $YEAR;"); $req->execute([htmlspecialchars($problem)]); $teams = []; @@ -96,7 +96,7 @@ class Team $this->encadrant = $data["encadrant"]; $this->participants = [$data["participant_1"], $data["participant_2"], $data["participant_3"], $data["participant_4"], $data["participant_5"]]; $this->inscription_date = $data["inscription_date"]; - $this->allow_publish = $data["allow_publish"]; + $this->allow_publish = $data["allow_publish"] ? 1 : 0; $this->validation_status = ValidationStatus::fromName($data["validation_status"]); $this->video_team_ids = [$data["video_team1"], $data["video_team2"]]; $this->access_code = $data["access_code"]; diff --git a/server_files/classes/User.php b/server_files/classes/User.php index 91fac07..1cc6986 100644 --- a/server_files/classes/User.php +++ b/server_files/classes/User.php @@ -54,7 +54,7 @@ class User { global $DB, $YEAR; $admins = []; - $req = $DB->query("SELECT * FROM `users` WHERE `year` = $YEAR;"); + $req = $DB->query("SELECT * FROM `users` WHERE `role` = 'ADMIN' AND `year` = $YEAR;"); while (($data = $req->fetch()) !== false) { $admin = new User(); @@ -64,6 +64,21 @@ class User return $admins; } + + public static function getOrphanUsers() + { + global $DB, $YEAR; + $orphans = []; + $req = $DB->query("SELECT * FROM `users` WHERE `role` != 'ADMIN' AND `team_id` IS NULL AND `year` = $YEAR ORDER BY `role`, `inscription_date`;"); + + while (($data = $req->fetch()) !== false) { + $orphan = new User(); + $orphan->fill($data); + $orphans[] = $orphan; + } + + return $orphans; + } private function fill($data) { diff --git a/server_files/controllers/ajouter_equipe.php b/server_files/controllers/ajouter_equipe.php index 3977ad7..788ef4d 100644 --- a/server_files/controllers/ajouter_equipe.php +++ b/server_files/controllers/ajouter_equipe.php @@ -32,7 +32,7 @@ class NewTeam { $this->trigram = strtoupper($this->trigram); - $this->allow_publish = $this->allow_publish == "on"; + $this->allow_publish = $this->allow_publish == "on" ? 1 : 0; } public function makeVerifications() { diff --git a/server_files/controllers/commenter_echange.php b/server_files/controllers/commenter_echange.php index 66d1301..5e5a32d 100644 --- a/server_files/controllers/commenter_echange.php +++ b/server_files/controllers/commenter_echange.php @@ -7,10 +7,10 @@ if (!isset($_SESSION["user_id"]) || $_SESSION["role"] != Role::PARTICIPANT && $_ require_once "server_files/403.php"; if (isset($_POST["upload_answer"])) { - $new_video = new NewAnswer($_POST); + $new_answer = new NewAnswer($_POST); try { - $new_video->makeVerifications(); - $new_video->uploadVideo(); + $new_answer->makeVerifications(); + $new_answer->uploadVideo(); } catch (AssertionError $e) { $has_error = true; $error_message = $e->getMessage(); diff --git a/server_files/controllers/equipe.php b/server_files/controllers/equipe.php index 0653f9b..51f7c68 100644 --- a/server_files/controllers/equipe.php +++ b/server_files/controllers/equipe.php @@ -54,6 +54,7 @@ class UpdateVideoTeams public function makeVerifications() { + ensure(Phase::getCurrentPhase() < Phase::PHASE2, "Il est trop tard pour réaffecter les vidéos aux équipes."); ensure(sizeof($this->other_teams) == 2, "L'équipe doit recevoir exactement deux vidéos."); ensure(Team::fromId($this->other_teams[0]) != null, "La première équipe n'existe pas."); ensure(Team::fromId($this->other_teams[1]) != null, "La seconde équipe n'existe pas."); diff --git a/server_files/controllers/informations.php b/server_files/controllers/informations.php index 2325109..2b6a471 100644 --- a/server_files/controllers/informations.php +++ b/server_files/controllers/informations.php @@ -16,6 +16,77 @@ if ($user === null) $team = Team::fromId($user->getTeamId()); +$has_error = false; +$error_message = null; + +if (isset($_POST["kick"])) { + if ($team == null) { + $has_error = true; + $error_message = "La personne à expulser n'est dans aucune équipe."; + } + else { + quitTeam($id); + $team = null; + } +} + +if (isset($_POST["attribute_team"])) { + $attribute_team = new AttributeTeam($_POST); + try { + $attribute_team->makeVerifications(); + $attribute_team->attribute(); + } catch (AssertionError $e) { + $has_error = true; + $error_message = $e->getMessage(); + } +} + +class AttributeTeam +{ + private $team; + private $min_null_index; + + public function __construct($data) + { + $this->team = Team::fromId($data["team"]); + } + + public function makeVerifications() + { + global $user; + + ensure($this->team != null, "Cette équipe n'existe pas."); + ensure($this->team->getValidationStatus() == ValidationStatus::NOT_READY, "Cette équipe est déjà validée ou en cours de validation."); + + $role = $user->getRole(); + for ($i = 1; $i <= $role == Role::ENCADRANT ? 1 : 5; ++$i) { + if (($role == Role::PARTICIPANT ? $this->team->getParticipants()[$i - 1] : $this->team->getEncadrantId()) == NULL) + break; + } + + $this->min_null_index = $i; + + ensure($role == Role::PARTICIPANT && $this->min_null_index <= 5 || $role == Role::ENCADRANT && $this->min_null_index <= 2, + "Il n'y a plus de place pour vous dans l'équipe."); + } + + public function attribute() + { + global $user, $team; + + $user->setTeamId($this->team->getId()); + + if ($user->getRole() == Role::ENCADRANT) + $this->team->setEncadrant($user->getId()); + else + $this->team->setParticipant($this->min_null_index, $user->getId()); + + Mailer::sendJoinTeamMail($user, $this->team); + + $team = $this->team; + } +} + if ($team != null) $documents = $user->getAllDocuments($team->getProblem()); diff --git a/server_files/controllers/mon_equipe.php b/server_files/controllers/mon_equipe.php index a4cc332..c4613b4 100644 --- a/server_files/controllers/mon_equipe.php +++ b/server_files/controllers/mon_equipe.php @@ -58,8 +58,6 @@ if (isset($_SESSION["user_id"]) && isset($_SESSION["team"]) && $_SESSION["team"] $team = $_SESSION["team"]; $documents = $user->getAllDocuments($team->getProblem()); - $video = Video::getVideo(Reason::SOLUTION, $team); - $questions_received = Question::getQuestionsTo($team); } else require_once "server_files/403.php"; diff --git a/server_files/controllers/mon_tournoi.php b/server_files/controllers/mon_tournoi.php new file mode 100644 index 0000000..82d1f3e --- /dev/null +++ b/server_files/controllers/mon_tournoi.php @@ -0,0 +1,17 @@ += 0 ? $user_id : $_SESSION["user_id"]; /** @var User $user */ - $user = $_SESSION["user"]; - $user_id = $user->getId(); + $user = User::fromId($user_id); $role = $user->getRole(); if ($role == Role::ADMIN) @@ -47,7 +48,7 @@ function quitTeam() $DB->exec("UPDATE `teams` SET `participant_$i` = `participant_" . strval($i + 1) . "`, `participant_" . strval($i + 1) . "` = NULL WHERE `participant_$i` IS NULL;"); } - $DB->exec("DELETE FROM `teams` WHERE `encadrant` IS NULL OR `participant_1` IS NULL;"); + $DB->exec("DELETE FROM `teams` WHERE `encadrant` IS NULL AND `participant_1` IS NULL;"); $req = $DB->query("SELECT `file_id` FROM `documents` WHERE `user` = $user_id;"); while (($data = $req->fetch()) !== false) unlink("$URL_BASE/files/" . $data["file_id"]); diff --git a/server_files/views/ajouter_equipe.php b/server_files/views/ajouter_equipe.php index d832c6c..0a4fbe7 100644 --- a/server_files/views/ajouter_equipe.php +++ b/server_files/views/ajouter_equipe.php @@ -45,11 +45,9 @@ require_once "header.php"; -
- - J'accepte qu'Animath diffuse mes vidéos à la fin du tournoi (facultatif) : + allow_publish ? "checked" : "" ?> /> -
diff --git a/server_files/views/calendrier.php b/server_files/views/calendrier.php index fbcc659..7fa6352 100644 --- a/server_files/views/calendrier.php +++ b/server_files/views/calendrier.php @@ -96,8 +96,8 @@
"> : - Du getStartPhase2Date(), true) ?> au - getEndPhase2Date(), true) ?> + Du getStartPhase1Date(), true) ?> au + getEndPhase1Date(), true) ?>
"> diff --git a/server_files/views/commenter_echange.php b/server_files/views/commenter_echange.php index 89a7eb8..0559850 100644 --- a/server_files/views/commenter_echange.php +++ b/server_files/views/commenter_echange.php @@ -1,6 +1,18 @@ +
+

Répondre aux questions

+
+ + +
+ Votre vidéo a bien été envoyée ! +
+ + + -

Vidéo de l'équipe getName() ?> (getTrigram() ?>) :

-
Lien de la vidéo de présentation de la solution au problème : getLink() ?>
- getLink()) ?> +
+

Vidéo de l'équipe getName() ?> (getTrigram() ?>) :

+
+ Lien de la vidéo de présentation de la solution au problème : + getLink() ?> +
+ getLink()) ?> -
Questions échangées :
- - +
Questions échangées :
getQuestion() === null) continue; ?> - - - - - getAttachedFile() !== null) { ?> - - - - - - - - - - getAttachedFileAnswer() !== null) { ?> - - - - - +
+ Question getNumber() + 1 ?> : getQuestion() ?>
+ getAttachedFile() !== null) { ?> + Pièce jointe attachée : + Télécharger
+ + Réponse : getAnswer() ?>
+ getAttachedFile() !== null) { ?> + Pièce jointe attachée : + Télécharger
+ +
- -
- Question getNumber() ?> : - - getQuestion() ?> -
- Pièce jointe attachée : - - Télécharger -
- Réponse : - - getAnswer() ?> -
- Pièce jointe attachée : - - Télécharger -
-
-
Vidéo de réponse :
+
+
Vidéo de réponse :
- getLink(); - echo "Lien de la vidéo déjà envoyée : $link (version " . $answer->getVersion() . ")
\n"; - displayVideo($link); - switch ($answer->getValidation()) { - case 0: - echo "La vidéo n'a pas encore été contrôlée.
"; - break; - case 1: - echo "La vidéo a été acceptée.
"; - break; - case -1: - echo "La vidéo a été rejetée.
"; - break; + getLink(); + echo "
Lien de la vidéo déjà envoyée : $link (version " . $answer->getVersion() . ")
\n"; + displayVideo($link); + switch ($answer->getValidation()) { + case 0: + echo "
La vidéo n'a pas encore été contrôlée.
"; + break; + case 1: + echo "
La vidéo a été acceptée.
"; + break; + case -1: + echo "
La vidéo a été rejetée.
"; + break; + } } - } - if ($answer_validated != null && $answer_validated->getId() != $answer->getId()) { - $link = $answer_validated->getLink(); - echo "
\nLien de la dernière vidéo validée : $link
"; - displayVideo($link); - } - ?> + if ($answer_validated != null && $answer_validated->getId() != $answer->getId()) { + $link = $answer_validated->getLink(); + echo "
\n
Lien de la dernière vidéo validée : $link
\n"; + displayVideo($link); + } + ?> -
- - - - - - - - - - - - - - - - - -
- - - -
- -
- -
- -
-
-
+
+ +
+
+ + +
+
+ +
+ + + + +
+
Votre vidéo a bien été envoyée !"; ?> +
+

Envoyer la vidéo de solution

+
+ + +
+ Votre vidéo a bien été envoyée ! +
+ + getLink(); - echo "Lien de la vidéo déjà envoyée : $link (version " . $video->getVersion() . ")
\n"; - displayVideo($link); - switch ($video->getValidation()) { + $link = $video->getLink(); + echo "
Lien de la vidéo déjà envoyée : $link (version " . $video->getVersion() . ")
\n"; + displayVideo($link); + switch ($video->getValidation()) { case 0: - echo "La vidéo n'a pas encore été contrôlée.
"; + echo "
La vidéo n'a pas encore été contrôlée.
"; break; case 1: - echo "La vidéo a été acceptée.
"; + echo "
La vidéo a été acceptée.
"; break; case -1: - echo "La vidéo a été rejetée.
"; + echo "
La vidéo a été rejetée.
"; break; - } + } } if ($video_validated != null && $video_validated->getId() != $video->getId()) { - $link = $video_validated->getLink(); - echo "
\nLien de la dernière vidéo validée : $link
"; - displayVideo($link); + $link = $video_validated->getLink(); + echo "
\n
Lien de la dernière vidéo validée : $link
\n"; + displayVideo($link); } ?> -
- - - - - - - - - - - - - - - - -
- - - -
- -
- -
- -
-
+
+ +
+
+
+ + +
+
+ +
+ + + + +
getValidationStatus()) ?>
- getEncadrantId() !== null) { - $encadrant = User::fromId($team->getEncadrantId()); - $id = $encadrant->getId(); - echo "Encadrant : getFirstName() . " " . $encadrant->getSurname() . "\">" . $encadrant->getFirstName() . " " . $encadrant->getSurname() . "
"; - } - for ($i = 1; $i <= 5; ++$i) { - if ($team->getParticipants()[$i - 1] == NULL) - continue; - $participant = User::fromId($team->getParticipants()[$i - 1]); - $id = $participant->getId(); - echo "Participant $i : getFirstName() . " " . $participant->getSurname() . "\">" . $participant->getFirstName() . " " . $participant->getSurname() . "
"; - } - ?> + getEncadrantId() !== null) { + $encadrant = User::fromId($team->getEncadrantId()); + $id = $encadrant->getId(); + echo "Encadrant : getFirstName() . " " . $encadrant->getSurname() . "\">" . $encadrant->getFirstName() . " " . $encadrant->getSurname() . "
"; + } + for ($i = 1; $i <= 5; ++$i) { + if ($team->getParticipants()[$i - 1] == NULL) + continue; + $participant = User::fromId($team->getParticipants()[$i - 1]); + $id = $participant->getId(); + echo "Participant $i : getFirstName() . " " . $participant->getSurname() . "\">" . $participant->getFirstName() . " " . $participant->getSurname() . "
"; + } + ?>
Autorise Animath à diffuser les vidéos : allowPublish() ? "oui" : "non" ?> @@ -40,32 +40,38 @@
-
-
-
- - = Phase::PHASE2 ? "disabled" : "" ?>> + getId() == $team->getId()) + continue; - $team_name = $other_team->getName() . " (" . $other_team->getTrigram() . ")"; - $team_id = $other_team->getId(); - echo "\n"; - } - ?> - + $team_name = $other_team->getName() . " (" . $other_team->getTrigram() . ")"; + $team_id = $other_team->getId(); + echo "\n"; + } + ?> + +
-
-
- -
- +
+ + + +
+ +
@@ -84,12 +90,13 @@ if ($_SESSION["role"] == Role::ADMIN) { ?>
- +
- \ No newline at end of file diff --git a/server_files/views/footer.php b/server_files/views/footer.php index 5181ba3..ef61493 100644 --- a/server_files/views/footer.php +++ b/server_files/views/footer.php @@ -1,3 +1,5 @@ +
+
diff --git a/server_files/views/header.php b/server_files/views/header.php index 34646e3..182493e 100644 --- a/server_files/views/header.php +++ b/server_files/views/header.php @@ -10,14 +10,6 @@ - - @@ -51,7 +43,9 @@ - getValidationStatus() == ValidationStatus::VALIDATED) { + getValidationStatus() == ValidationStatus::VALIDATED) { ?> + +
  • - Liste des problèmes +
  • -