plateforme-corres2math/server_files/model.php

326 lines
12 KiB
PHP

<?php
function loadUserValues()
{
$_SESSION["user"] = $_SESSION["team"] = null;
unset($_SESSION["user"]);
unset($_SESSION["role"]);
unset($_SESSION["team"]);
unset($_SESSION["teams"]);
if (isset($_SESSION["user_id"])) {
$user = $_SESSION["user"] = User::fromId($_SESSION["user_id"]);
if ($user == null) {
unset($_SESSION["user_id"]);
return;
}
$_SESSION["role"] = $user->getRole();
$_SESSION["teams"] = $user->getTeams();
if ($user->getRole() == Role::PARTICIPANT)
$_SESSION["team"] = sizeof($_SESSION["teams"]) > 0 ? $_SESSION["teams"][0] : null;
}
if (isset($_GET["view-as-admin"])) {
if (isset($_SESSION["admin"])) {
$_SESSION["user_id"] = $_SESSION["admin"];
unset($_SESSION["admin"]);
}
header("Location: /");
exit();
}
}
function quitTeam($user_id = -1)
{
global $DB, $URL_BASE;
if ($user_id == -1)
header("Location: $URL_BASE");
$user_id = $user_id >= 0 ? $user_id : $_SESSION["user_id"];
/** @var User $user */
$user = User::fromId($user_id);
$role = $user->getRole();
if ($role == Role::ADMIN)
return;
if ($role == Role::PARTICIPANT)
for ($i = 1; $i <= 5; ++$i)
/** @noinspection SqlResolve */
$DB->exec("UPDATE `teams` SET `participant_$i` = NULL WHERE `participant_$i` = $user_id;");
else
$DB->exec("UPDATE `teams` SET `encadrant` = NULL WHERE `encadrant` = $user_id;");
$user->setTeamId(null);
for ($i = 1; $i <= 4; ++$i) {
/** @noinspection SqlResolve */
$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 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"]);
$DB->exec("DELETE FROM `documents` WHERE `user` = $user_id;");
$_SESSION["team"] = null;
unset($_SESSION["team"]);
$_SESSION["teams"] = $user->getTeams();
}
function userExists($email)
{
global $DB, $YEAR;
$req = $DB->prepare("SELECT `id` FROM `users` WHERE `email` = ? AND `year` = '$YEAR';");
$req->execute([$email]);
return $req->fetch();
}
function teamExists($name)
{
global $DB, $YEAR;
$req = $DB->prepare("SELECT `id` FROM `teams` WHERE `name` = ? AND `year` = '$YEAR';");
$req->execute([$name]);
return $req->fetch();
}
function trigramExists($trigram)
{
global $DB, $YEAR;
$req = $DB->prepare("SELECT `id` FROM `teams` WHERE `trigram` = ? AND `year` = '$YEAR';");
$req->execute([$trigram]);
return $req->fetch();
}
function canValidate(Team $team)
{
global $DB, $CONFIG;
$can_validate = date("Y-m-d H:i:s") < $CONFIG->getInscriptionDate();
$can_validate &= $team->getValidationStatus() == ValidationStatus::NOT_READY;
$can_validate &= $team->getEncadrantId() != null;
$can_validate &= $team->getParticipants()[2] != null;
$can_validate &= preg_match("#[1-4]#", $team->getProblem());
for ($i = 0; $i < 5; ++$i) {
if ($team->getParticipants()[$i] === NULL)
continue;
$req = $DB->prepare("SELECT COUNT(*) AS `version` FROM `documents` WHERE `user` = ? AND `problem` = ?;");
$req->execute([$team->getParticipants()[$i], $team->getProblem()]);
$d = $req->fetch();
$can_validate &= $d["version"] > 0;
}
return $can_validate;
}
function printDocuments($documents)
{
if (sizeof($documents) == 0) {
echo "<div class=\"alert alert-warning\">\nPas de document envoyé pour le moment.\n</div>\n";
return;
}
echo "<div class=\"alert alert-info\">\n";
foreach ($documents as $document) {
$file_id = $document->getFileId();
$user = User::fromId($document->getUserId());
$surname = $user->getSurname();
$first_name = $user->getFirstName();
$name = "Autorisation de droit à l'image";
$version = $document->getVersion();
echo "$name de $first_name $surname (version $version) : <a href=\"/file/$file_id\"><strong>Télécharger</strong></a><br />\n";
}
echo "</div>\n";
}
function getZipFile($problem, $team_id = -1)
{
global $LOCAL_PATH;
$zip = new ZipArchive();
$file_name = tempnam("tmp", "corres2math-");
if ($zip->open($file_name, ZipArchive::CREATE) !== true) {
die("Impossible de créer le fichier zip.");
}
$data = Document::getAllDocuments($problem, $team_id);
/** @var Document $file */
foreach ($data as $file) {
$file_id = $file->getFileId();
$user = User::fromId($file->getUserId());
$mime_type = finfo_file(finfo_open(FILEINFO_MIME_TYPE), "$LOCAL_PATH/files/$file_id");
$ext = $mime_type == "application/pdf" ? "pdf" : ($mime_type == "image/png" ? "png" : "jpg");
$name = "Autorisation de droit à l'image de " . $user->getFirstName() . " " . $user->getSurname() . "." . $ext;
$zip->addFile("$LOCAL_PATH/files/$file_id", $name);
}
$zip->close();
return $file_name;
}
function exportUserData() {
global $DB, $YEAR;
$file_name = tempnam("tmp", "corres2math-");
$csv = "Identifiant,Nom,Prénom,E-mail,École,Ville,Pays,Classe,Description,Rôle,Équipe,Autorise l'envoi de mails,Date d'inscription\n";
$req = $DB->query("SELECT `id` FROM `users` WHERE `year` = $YEAR;");
while (($data = $req->fetch()) !== false) {
$user = User::fromId($data["id"]);
$csv .= $user->getId() . ",";
$csv .= $user->getSurname() . ",";
$csv .= $user->getFirstName() . ",";
$csv .= $user->getEmail() . ",";
$csv .= $user->getSchool() . ",";
$csv .= $user->getCity() . ",";
$csv .= $user->getCountry() . ",";
$csv .= SchoolClass::getTranslatedName($user->getClass()) . ",";
$csv .= $user->getDescription() . ",";
$csv .= Role::getTranslatedName($user->getRole()) . ",";
$csv .= ($user->getTeamId() == null ? "" : Team::fromId($user->getTeamId())->getTrigram()) . ",";
$csv .= ($user->doReceiveAnimathMails() ? "oui" : "non") . ",";
$csv .= $user->getInscriptionDate() . "\n";
}
file_put_contents($file_name, $csv, FILE_APPEND);
return $file_name;
}
function exportTeamData() {
global $DB, $YEAR;
$file_name = tempnam("tmp", "corres2math-");
$csv = "Identifiant,Nom,Trigramme,Problème,Encadrant,Participant 1,Participant 2,Participant 3,Participant 4,Participant 5,"
. "Date d'inscription,Autorise la publication,État de validation,Code d'accès\n";
$req = $DB->query("SELECT `id` FROM `teams` WHERE `year` = $YEAR ORDER BY `problem`;");
while (($data = $req->fetch()) !== false) {
$team = Team::fromId($data["id"]);
$csv .= $team->getId() . ",";
$csv .= $team->getName() . ",";
$csv .= $team->getTrigram() . ",";
$csv .= $team->getProblem() . ",";
$csv .= $team->getEncadrantId() . ",";
$csv .= $team->getParticipants()[0] . ",";
$csv .= $team->getParticipants()[1] . ",";
$csv .= $team->getParticipants()[2] . ",";
$csv .= $team->getParticipants()[3] . ",";
$csv .= $team->getParticipants()[4] . ",";
$csv .= $team->getInscriptionDate() . ",";
$csv .= $team->allowPublish() . ",";
$csv .= ValidationStatus::getTranslatedName($team->getValidationStatus()) . ",";
$csv .= $team->getAccessCode() . "\n";
}
file_put_contents($file_name, $csv, FILE_APPEND);
return $file_name;
}
function exportProblemsData() {
global $DB, $URL_BASE, $YEAR;
$file_name = tempnam("tmp", "corres2math-");
$csv = "Équipe,Problème,Lien,Équipe 1 ayant reçu la vidéo,"
. "Question 1,Pièce jointe,Réponse,Pièce jointe,"
. "Question 2,Pièce jointe,Réponse,Pièce jointe,"
. "Question 3,Pièce jointe,Réponse,Pièce jointe,"
. "Question 4,Pièce jointe,Réponse,Pièce jointe,"
. "Question 5,Pièce jointe,Réponse,Pièce jointe,"
. "Question 6,Pièce jointe,Réponse,Pièce jointe,"
. "Vidéo de réponse,"
. "Équipe 2 ayant reçu la vidéo,"
. "Question 1,Pièce jointe,Réponse,Pièce jointe,"
. "Question 2,Pièce jointe,Réponse,Pièce jointe,"
. "Question 3,Pièce jointe,Réponse,Pièce jointe,"
. "Question 4,Pièce jointe,Réponse,Pièce jointe,"
. "Question 5,Pièce jointe,Réponse,Pièce jointe,"
. "Question 6,Pièce jointe,Réponse,Pièce jointe,"
. "Vidéo de réponse\n";
$req = $DB->query("SELECT `id` FROM `teams` WHERE `validation_status` = 'VALIDATED' AND `year` = $YEAR ORDER BY `problem`;");
while (($data = $req->fetch()) !== false) {
$team = Team::fromId($data["id"]);
$video = Video::getVideo(Reason::SOLUTION, $team);
$questions_received = Question::getQuestionsTo($team);
$csv .= $team->getTrigram() . ",";
$csv .= $team->getProblem() . ",";
$csv .= ($video == null ? "" : $video->getLink()) . ",";
for ($i = 0; $i < 2; ++$i) {
/** @var Question[] $questions */
$questions = $questions_received[$i];
$asker = Team::fromId($questions[0]->getFrom());
$csv .= $asker->getTrigram() . ",";
for ($j = 0; $j < 6; ++$j) {
$question = $questions[$j];
if ($question == null) {
$csv .= ",,,,";
continue;
}
$csv .= $question->getQuestion() . ",";
$csv .= ($question->getAttachedFile() == null ? "" : $URL_BASE . "/file/" . $question->getAttachedFile()) . ',';
$csv .= $question->getAnswer() . ",";
$csv .= ($question->getAttachedFileAnswer() == null ? "" : $URL_BASE . "/file/" . $question->getAttachedFileAnswer()) . ',';
}
$answer = Video::getVideo($asker->getVideoTeamIds()[0] == $team->getId() ? Reason::ANSWER1 : Reason::ANSWER2,
$asker, Video::ACCEPTED);
$csv .= $answer == null ? "" : $answer->getLink();
$csv .= ($i == 0 ? "," : "\n");
}
}
file_put_contents($file_name, $csv, FILE_APPEND);
return $file_name;
}
function displayVideo($link)
{
if (preg_match("#(https?://|)(www\.|)(youtube\.com/watch\?v=|youtu.be/)([a-zA-Z0-9,\-,_]*)?.*?#", $link, $matches)) {
$code = $matches[4];
/** @noinspection HtmlDeprecatedAttribute */
/** @noinspection HtmlDeprecatedTag */
echo "<center><iframe width=\"854px\" height=\"480px\" src=\"https://www.youtube.com/embed/$code\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe></center><br />\n";
}
elseif (preg_match("#(https?://|)drive\.google\.com/(file/d/|open\?id=)([a-zA-Z0-9\-_]*)/?.*?#", $link, $matches)) {
$code = $matches[3];
/** @noinspection HtmlDeprecatedAttribute */
/** @noinspection HtmlDeprecatedTag */
echo "<center><iframe width=\"854px\" height=\"480px\" src=\"https://drive.google.com/file/d/$code/preview\" allowfullscreen></iframe></center><br />\n";
}
elseif (preg_match("#(https?://|)(www\.|)vimeo\.com/([0-9]*)#", $link, $matches)) {
$code = $matches[3];
/** @noinspection HtmlDeprecatedAttribute */
/** @noinspection HtmlDeprecatedTag */
echo "<center><iframe src=\"https://player.vimeo.com/video/$code?color=3be6c3\" width=\"853\" height=\"480\" frameborder=\"0\" allow=\"autoplay; fullscreen\" allowfullscreen></iframe></center>";
}
elseif (preg_match("#(https?://|)(www\.|)dailymotion\.com/video/(.*)#", $link, $matches)) {
$code = $matches[3];
/** @noinspection HtmlDeprecatedAttribute */
/** @noinspection HtmlDeprecatedTag */
echo "<center><iframe frameborder=\"0\" width=\"853\" height=\"480\" src=\"https://www.dailymotion.com/embed/video/$code\" allowfullscreen allow=\"autoplay\"></iframe></center>";
}
}