diff --git a/dispatcher.php b/dispatcher.php index 38cafc9..4cc396f 100644 --- a/dispatcher.php +++ b/dispatcher.php @@ -33,6 +33,7 @@ $ROUTES["^ajouter_equipe$"] = ["server_files/controllers/ajouter_equipe.php"]; $ROUTES["^ajouter_admin$"] = ["server_files/controllers/ajouter_admin.php"]; $ROUTES["^calendrier/(modifier)$"] = ["server_files/controllers/calendrier.php", "edit"]; $ROUTES["^calendrier/?$"] = ["server_files/controllers/calendrier.php"]; +$ROUTES["^commenter-echange-4$"] = ["server_files/controllers/commenter_echange.php"]; $ROUTES["^confirmer-mail/([a-z0-9]*)/?$"] = ["server_files/controllers/confirmer_mail.php", "token"]; $ROUTES["^connexion/(confirmation-mail)/?$"] = ["server_files/controllers/connexion.php", "confirmation-mail"]; $ROUTES["^connexion/(mdp-oublie)/?$"] = ["server_files/controllers/connexion.php", "mdp_oublie"]; diff --git a/server_files/classes/Phase.php b/server_files/classes/Phase.php index eb81e41..da18e96 100644 --- a/server_files/classes/Phase.php +++ b/server_files/classes/Phase.php @@ -4,11 +4,13 @@ class Phase { const INSCRIPTION = 0; const PHASE1 = 1; - const PHASE2 = 2; - const PHASE3 = 3; - const PHASE4 = 4; - const END = 5; - const BETWEEN_PHASES = 6; + const PHASE12 = 2; + const PHASE2 = 3; + const PHASE23 = 4; + const PHASE3 = 5; + const PHASE34 = 6; + const PHASE4 = 7; + const END = 8; public static function getCurrentPhase() { @@ -23,19 +25,19 @@ class Phase return self::PHASE1; if ($date < $CONFIG->getStartPhase2Date()) - return self::BETWEEN_PHASES; + return self::PHASE12; if ($date < $CONFIG->getEndPhase2Date()) return self::PHASE2; if ($date < $CONFIG->getStartPhase3Date()) - return self::BETWEEN_PHASES; + return self::PHASE23; if ($date < $CONFIG->getEndPhase3Date()) return self::PHASE3; if ($date < $CONFIG->getStartPhase4Date()) - return self::BETWEEN_PHASES; + return self::PHASE34; if ($date < $CONFIG->getEndPhase4Date()) return self::PHASE4; @@ -57,10 +59,10 @@ class Phase return "Phase 3 (réponses)"; case self::PHASE4: return "Phase 4 (vidéo de réponse)"; - case self::BETWEEN_PHASES: - return "Entre deux phases"; - default: + case self::END: return "Le tournoi est terminé"; + default: + return "Entre deux phases"; } } } \ No newline at end of file diff --git a/server_files/classes/Question.php b/server_files/classes/Question.php index cac707c..40279ad 100644 --- a/server_files/classes/Question.php +++ b/server_files/classes/Question.php @@ -61,7 +61,7 @@ class Question ensure($from->getProblem() == $to->getProblem(), "Les deux équipes doivent travailler sur le même problème."); - $req = $DB->prepare("SELECT * FROM `questions` WHERE `from` = ? AND `to` = ?;"); + $req = $DB->prepare("SELECT * FROM `questions` WHERE `from` = ? AND `to` = ? ORDER BY `from`;"); $req->execute([$from->getId(), $to->getId()]); $questions = []; diff --git a/server_files/classes/Reason.php b/server_files/classes/Reason.php index d14ae09..dece59f 100644 --- a/server_files/classes/Reason.php +++ b/server_files/classes/Reason.php @@ -4,11 +4,13 @@ class Reason { const SOLUTION = 0; - const ANSWER = 1; + const ANSWER1 = 1; + const ANSWER2 = 2; public static function getTranslatedName($class) { switch ($class) { - case self::ANSWER: + case self::ANSWER1: + case self::ANSWER2: return "Réponse"; default: return "Solution"; @@ -17,8 +19,10 @@ class Reason public static function getName($class) { switch ($class) { - case self::ANSWER: - return "ANSWER"; + case self::ANSWER1: + return "ANSWER1"; + case self::ANSWER2: + return "ANSWER2"; default: return "SOLUTION"; } @@ -26,8 +30,10 @@ class Reason public static function fromName($name) { switch ($name) { - case "ANSWER": - return self::ANSWER; + case "ANSWER1": + return self::ANSWER1; + case "ANSWER2": + return self::ANSWER2; default: return self::SOLUTION; } diff --git a/server_files/controllers/commenter_echange.php b/server_files/controllers/commenter_echange.php new file mode 100644 index 0000000..66d1301 --- /dev/null +++ b/server_files/controllers/commenter_echange.php @@ -0,0 +1,67 @@ +makeVerifications(); + $new_video->uploadVideo(); + } catch (AssertionError $e) { + $has_error = true; + $error_message = $e->getMessage(); + } +} + +class NewAnswer +{ + public $link; + public $team; + private $valid_link; + private $no_change; + + public function __construct($data) + { + foreach ($data as $key => $value) + $this->$key = $value; + } + + public function makeVerifications() + { + ensure(preg_match("#(https?\:\/\/|)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?#", $this->link), "Ce n'est pas une URL valide."); + $this->link = preg_replace('/^(?!https?:\/\/)/', 'https://', $this->link); + ensure(preg_match("#[1|2]#", $this->team), "L'équipe n'a pas été trouvée."); + ensure($this->valid_link != null, "Vous devez confirmer que le lien est valide."); + ensure($this->no_change != null, "Vous devez vous engager à ne pas changer le contenu du lien et de la vidéo."); + } + + public function uploadVideo() + { + global $DB, $YEAR, $team; + + $req = $DB->prepare("INSERT INTO `videos`(`team`, `problem`, `link`, `reason`, `year`) VALUES (?, ?, ?, ?, ?)"); + $req->execute([$team->getId(), $team->getProblem(), $this->link, "ANSWER" . $this->team, $YEAR]); + + Mailer::sendNewAnswer($this, $team); + } +} + +$team1 = Team::fromId($team->getVideoTeamIds()[0]); +$sol1 = Video::getVideo(Reason::SOLUTION, $team1); +$answer1 = Video::getVideo(Reason::ANSWER1, $team); +$answer1_validated = Video::getVideo(Reason::ANSWER1, $team, Video::ACCEPTED); +$team2 = Team::fromId($team->getVideoTeamIds()[1]); +$sol2 = Video::getVideo(Reason::SOLUTION, $team2); +$answer2 = Video::getVideo(Reason::ANSWER2, $team); +$answer2_validated = Video::getVideo(Reason::ANSWER2, $team, Video::ACCEPTED); + +$teams = [$team1, $team2]; +$sols = [$sol1, $sol2]; +$answers = [$answer1, $answer2]; +$answers_validated = [$answer1_validated, $answer2_validated]; + +require_once "server_files/views/commenter_echange.php"; \ No newline at end of file diff --git a/server_files/controllers/envoyer_video.php b/server_files/controllers/envoyer_video.php index 4025ae1..72a119f 100644 --- a/server_files/controllers/envoyer_video.php +++ b/server_files/controllers/envoyer_video.php @@ -45,7 +45,7 @@ class NewVideo global $DB, $YEAR, $team; $req = $DB->prepare("INSERT INTO `videos`(`team`, `problem`, `link`, `reason`, `year`) VALUES (?, ?, ?, ?, ?)"); - $req->execute([$team->getId(), $team->getProblem(), $this->link, "SOLUTION", $YEAR]); + $req->execute([$team->getId(), $team->getProblem(), $this->link, Reason::getName(Reason::SOLUTION), $YEAR]); Mailer::sendNewVideo($this, $team); } diff --git a/server_files/services/mail.php b/server_files/services/mail.php index 252ecd6..b244f68 100644 --- a/server_files/services/mail.php +++ b/server_files/services/mail.php @@ -162,13 +162,31 @@ class Mailer self::broadcastToAdmins("Nouvelle vidéo Correspondances des Jeunes Mathématicien·ne·s $YEAR", $content); } + public static function sendNewAnswer(NewAnswer $video, Team $team) + { + global $YEAR; + + $content = self::getTemplate("new_answer"); + $content = preg_replace("#{TEAM_NAME}#", $team->getName(), $content); + $content = preg_replace("#{TRIGRAM}#", $team->getTrigram(), $content); + $dest = Team::fromId($team->getVideoTeamIds()[$video->team - 1]); + $content = preg_replace("#{DEST_TEAM_NAME}#", $dest->getName(), $content); + $content = preg_replace("#{DEST_TRIGRAM}#", $dest->getTrigram(), $content); + $content = preg_replace("#{PROBLEM}#", $team->getProblem(), $content); + $content = preg_replace("#{VIDEO_LINK}#", $video->link, $content); + self::broadcastToAdmins("Nouvelle vidéo de réponse Correspondances des Jeunes Mathématicien·ne·s $YEAR", $content); + } + public static function validateVideo(Video $video) { global $YEAR; $team = Team::fromId($video->getTeam()); - $content = self::getTemplate($video->getValidation() == Video::ACCEPTED ? "video_accepted" : "video_rejected"); + $template = "video_"; + $template .= $video->getValidation() == Video::ACCEPTED ? "accepted" : "rejected"; + $template .= $video->getReason() == Reason::SOLUTION ? "_solution" : "_answer"; + $content = self::getTemplate($template); $content = preg_replace("#{TRIGRAM}#", $team->getTrigram(), $content); $content = preg_replace("#{PROBLEM}#", $team->getProblem(), $content); $content = preg_replace("#{VIDEO_LINK}#", $video->getLink(), $content); diff --git a/server_files/services/mail_templates/new_answer.html b/server_files/services/mail_templates/new_answer.html new file mode 100644 index 0000000..8832d29 --- /dev/null +++ b/server_files/services/mail_templates/new_answer.html @@ -0,0 +1,19 @@ + + + + + Nouvelle vidéo – Correspondances des Jeunes Mathématicien·ne·s {YEAR} + + +Bonjour {FIRST_NAME} {SURNAME},
+
+L'équipe « {TEAM_NAME} » ({TRIGRAM}) vient d'ajouter une vidéo de réponse destinée à l'équipe « {DEST_TEAM_NAME} » ({DEST_TRIGRAM}) +pour le problème {PROBLEM} des Correspondances des Jeunes Mathématicien·ne·s : {VIDEO_LINK}. +Vous êtes désormais invité avant que quelqu'un d'autre ne le fasse à accepter ou refuser cette vidéo via la plateforme d'inscription (accessible après connexion) : +{URL_BASE}/videos-solutions
+
+Cordialement,
+
+Le comité d'organisation des Correspondances des Jeunes Mathématicien·ne·s + + \ No newline at end of file diff --git a/server_files/services/mail_templates/video_accepted_answer.html b/server_files/services/mail_templates/video_accepted_answer.html new file mode 100644 index 0000000..4ea80f9 --- /dev/null +++ b/server_files/services/mail_templates/video_accepted_answer.html @@ -0,0 +1,18 @@ + + + + + Vidéo acceptée – Correspondances des Jeunes Mathématicien·ne·s {YEAR} + + +Bonjour {FIRST_NAME} {SURNAME},
+
+Félicitations, votre vidéo de réponse pour le problème {PROBLEM} a été validée ! Pour rappel, vous aviez soumis ce lien : {VIDEO_LINK}.
+Vous avez à présent terminé l'aventure des Correspondances. Bravo à vous ! Nous vous recontacterons dans les prochains jours pour vous tenir au courant des résultats.
+Si toutefois vous le souhaitez, vous pouvez à nouveau soumettre une vidéo avant la fin de la phase. Cette nouvelle vidéo ne remplacera l'actuelle qu'au moment de la validation de celle-ci.
+
+Cordialement,
+
+Le comité d'organisation des Correspondances des Jeunes Mathématicien·ne·s + + \ No newline at end of file diff --git a/server_files/services/mail_templates/video_accepted.html b/server_files/services/mail_templates/video_accepted_solution.html similarity index 100% rename from server_files/services/mail_templates/video_accepted.html rename to server_files/services/mail_templates/video_accepted_solution.html diff --git a/server_files/services/mail_templates/video_rejected_answer.html b/server_files/services/mail_templates/video_rejected_answer.html new file mode 100644 index 0000000..f0f83fd --- /dev/null +++ b/server_files/services/mail_templates/video_rejected_answer.html @@ -0,0 +1,19 @@ + + + + + Vidéo refusée – Correspondances des Jeunes Mathématicien·ne·s {YEAR} + + +Bonjour {FIRST_NAME} {SURNAME},
+
+Malheureusement, votre vidéo de réponse pour le problème {PROBLEM} n'a pas été validée. Pour rappel, vous aviez soumis ce lien : {VIDEO_LINK}.
+Si vous aviez soumis une précédente vidéo qui a été validée, elle reste conservée. +Vous êtes désormais invités à retravailler vos réponses ou votre présentation orale afin que votre prestation soit validée par les organisateurs. +N'hésitez pas à nous contacter à contact@correspondances-maths.fr si vous souhaitez avoir plus d'informations ou contester ce refus. +
+Cordialement,
+
+Le comité d'organisation des Correspondances des Jeunes Mathématicien·ne·s + + \ No newline at end of file diff --git a/server_files/services/mail_templates/video_rejected.html b/server_files/services/mail_templates/video_rejected_solution.html similarity index 100% rename from server_files/services/mail_templates/video_rejected.html rename to server_files/services/mail_templates/video_rejected_solution.html diff --git a/server_files/views/commenter_echange.php b/server_files/views/commenter_echange.php new file mode 100644 index 0000000..9657c39 --- /dev/null +++ b/server_files/views/commenter_echange.php @@ -0,0 +1,132 @@ + +

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 :
+ + + getQuestion() === null) + continue; + ?> + + + + + getAttachedFile() !== null) { ?> + + + + + + + + + + getAttachedFileAnswer() !== null) { ?> + + + + + + + +
+ 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 :
+ + 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); + } + ?> + +
+ + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ +
+ +
+
+
+
  • Répondre aux questions (phase 3)
  • +
  • Commenter l'échange (phase 4)
  • + diff --git a/server_files/views/videos_solutions.php b/server_files/views/videos_solutions.php index bac9c0d..8f303fd 100644 --- a/server_files/views/videos_solutions.php +++ b/server_files/views/videos_solutions.php @@ -26,16 +26,18 @@ for ($problem = 1; $problem <= 4; ++$problem) { if ($video->getValidation() != Video::ACCEPTED) { $last_validated_video = Video::getVideo(Reason::SOLUTION, $team, Video::ACCEPTED); - $link = $last_validated_video->getLink(); - echo "\nLien de la dernière vidéo validée de cette équipe : $link
    \n"; - displayVideo($link); + if ($last_validated_video !== null) { + $link = $last_validated_video->getLink(); + echo "\n
    \nLien de la dernière vidéo validée de cette équipe : $link
    \n"; + displayVideo($link); + } } if (Phase::getCurrentPhase() > Phase::PHASE1) { /** @var Question[] $from_questions */ foreach (Question::getQuestionsTo($team) as $from_questions) { $from = Team::fromId($from_questions[0]->getFrom()); - echo "
    \n
    Questions posées par l'équipe " . $from->getName() . " (" . $from->getTrigram() . ") :
    \n"; + echo "
    Questions posées par l'équipe " . $from->getName() . " (" . $from->getTrigram() . ") :
    \n"; for ($i = 0; $i < sizeof($from_questions); ++$i) { $question = $from_questions[$i]; if ($question->getQuestion() == null) @@ -49,6 +51,35 @@ for ($problem = 1; $problem <= 4; ++$problem) { if ($question->getAttachedFileAnswer() != null) echo "Pièce jointe attachée pour la réponse : getAttachedFileAnswer() . "\">Télécharger
    \n"; } + echo "
    \n"; + if (Phase::getCurrentPhase() >= Phase::PHASE4) { + $answer = Video::getVideo($from->getVideoTeamIds()[0] == $team->getId() ? Reason::ANSWER1 : Reason::ANSWER2, $from); + $link = $answer->getLink(); + $version = $answer->getVersion(); + echo "
    Vidéo de réponse :
    \n"; + echo "Lien de la vidéo (version $version) : $link"; + displayVideo($link); + + if ($answer->getValidation() == 0) { ?> +
    + + + + +
    + La vidéo a été " . ($answer->getValidation() == 1 ? "acceptée" : "refusée") . ".
    \n"; + + if ($answer->getValidation() != Video::ACCEPTED) { + $last_validated_answer = Video::getVideo($from->getVideoTeamIds()[0] == $team->getId() ? Reason::ANSWER1 : Reason::ANSWER2, $team, Video::ACCEPTED); + if ($last_validated_answer !== null) { + $link = $last_validated_answer->getLink(); + echo "\n
    \nLien de la dernière vidéo validée de cette équipe : $link
    \n"; + displayVideo($link); + } + } + } } } }