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"; -
- Question = $question->getNumber() ?> : - | -- = $question->getQuestion() ?> - | -
- Pièce jointe attachée : - | -- Télécharger - | -
- Réponse : - | -- = $question->getAnswer() ?> - | -
- Pièce jointe attachée : - | -- Télécharger - | -