From 57d2bb9becb595b728f479e65c6b5091de37dea1 Mon Sep 17 00:00:00 2001 From: Yohann Date: Mon, 9 Sep 2019 12:15:48 +0200 Subject: [PATCH] =?UTF-8?q?Optimisation=20des=20t=C3=A9l=C3=A9chargements?= =?UTF-8?q?=20ZIP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server_files/controllers/equipe.php | 28 +++++++--- server_files/controllers/solutions_orga.php | 27 ++-------- server_files/controllers/syntheses_orga.php | 27 ++-------- server_files/model.php | 60 +++++++++++++++++++++ server_files/views/ajouter_tournoi.php | 2 +- server_files/views/equipe.php | 3 +- server_files/views/tournoi.php | 2 +- 7 files changed, 90 insertions(+), 59 deletions(-) diff --git a/server_files/controllers/equipe.php b/server_files/controllers/equipe.php index 6bc8409..c989b0b 100644 --- a/server_files/controllers/equipe.php +++ b/server_files/controllers/equipe.php @@ -18,12 +18,11 @@ if (isset($_POST["validate"])) { if (isset($_POST["select"])) { $team->selectForFinal(true); $team->setValidationStatus(ValidationStatus::NOT_READY); - - /** @noinspection SqlAggregates */ - $sols_req = $DB->prepare("SELECT `file_id`, `problem`, COUNT(`problem`) AS `version` FROM `solutions` WHERE `team` = ? AND `tournament` = ? GROUP BY `problem` ORDER BY `problem`, `uploaded_at` DESC;"); - $sols_req->execute([$team->getId(), $team->getTournamentId()]); - while (($sol_data = $sols_req->fetch()) !== false) { - $old_id = $sol_data["file_id"]; + $tournament = Tournament::fromId($team->getTournamentId()); + $sols = $tournament->getAllSolutions($team->getId()); + /** @var Solution $sol */ + foreach ($sols as $sol) { + $old_id = $sol->getFileId(); do $id = genRandomPhrase(64); while (file_exists("$LOCAL_PATH/files/$id")); @@ -31,11 +30,24 @@ if (isset($_POST["select"])) { copy("$LOCAL_PATH/files/$old_id", "$LOCAL_PATH/files/$id"); $req = $DB->prepare("INSERT INTO `solutions`(`file_id`, `team`, `tournament`, `problem`) VALUES (?, ?, ?, ?);"); - $req->execute([$id, $team->getId(), $_SESSION["final_id"], $sol_data["problem"]]); + $req->execute([$id, $team->getId(), $FINAL->getId(), $sol->getFileId()]); } } -// TODO Télécharger en zip les documents personnels +if (isset($_POST["download_zip"])) { + $final = isset($_POST["final"]); + $tournament = $final ? $FINAL : Tournament::fromId($team->getTournamentId()); + + $file_name = getZipFile(DocumentType::PARENTAL_CONSENT, $tournament->getId(), $team->getId()); + + header("Content-Type: application/zip"); + header("Content-Disposition: attachment; filename=\"Documents de l'équipe " . $team->getTrigram() . ".zip\""); + header("Content-Length: " . strval(filesize($file_name))); + + readfile($file_name); + + exit(); +} $documents = $tournament->getAllDocuments($team->getId()); $documents_final = null; diff --git a/server_files/controllers/solutions_orga.php b/server_files/controllers/solutions_orga.php index 69c9445..80e0bdf 100644 --- a/server_files/controllers/solutions_orga.php +++ b/server_files/controllers/solutions_orga.php @@ -5,36 +5,15 @@ if (!isset($_SESSION["role"]) || $_SESSION["role"] != Role::ADMIN && $_SESSION[" if (isset($_POST["download_zip"])) { $id = $_POST["tournament"]; - $tournament = Tournament::fromId($id); $sols = $tournament->getAllSolutions(); - $zip = new ZipArchive(); - - $temp = tempnam("tmp", "tfjm-"); - - if ($zip->open($temp, ZipArchive::CREATE) !== true) { - die("Impossible de créer le fichier zip."); - } - - /** @var Solution $sol */ - foreach ($sols as $sol) { - $file_id = $sol->getFileId(); - $problem = $sol->getProblem(); - $version = $sol->getVersion(); - $team = Team::fromId($sol->getTeamId()); - $team_name = $team->getName(); - $team_trigram = $team->getTrigram(); - - $zip->addFile("$LOCAL_PATH/files/$file_id", "Problème $problem $team_trigram.pdf"); - } - - $zip->close(); + $file_name = getZipFile(DocumentType::SOLUTION, $id); header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=\"Solutions du tournoi de " . $tournament->getName() . ".zip\""); - header("Content-Length: " . strval(filesize($temp))); + header("Content-Length: " . strval(filesize($file_name))); - readfile($temp); + readfile($file_name); exit(); } diff --git a/server_files/controllers/syntheses_orga.php b/server_files/controllers/syntheses_orga.php index 6973c30..c4415e2 100644 --- a/server_files/controllers/syntheses_orga.php +++ b/server_files/controllers/syntheses_orga.php @@ -4,35 +4,14 @@ if (isset($_POST["download_zip"])) { $id = $_POST["tournament"]; $tournament = Tournament::fromId($id); - $syntheses = $tournament->getAllSyntheses(); - $zip = new ZipArchive(); - - $temp = tempnam("tmp", "tfjm-"); - - if ($zip->open($temp, ZipArchive::CREATE) !== true) { - die("Impossible de créer le fichier zip."); - } - - /** @var Synthesis $synthesis */ - foreach ($syntheses as $synthesis) { - $file_id = $synthesis->getFileId(); - $dest = $synthesis->getDest(); - $version = $synthesis->getVersion(); - $team = Team::fromId($synthesis->getTeamId()); - $team_name = $team->getName(); - $team_trigram = $team->getTrigram(); - - $zip->addFile("$LOCAL_PATH/files/$file_id", "Note de synthèse $team_trigram pour " . ($dest == DestType::OPPOSANT ? "l'opposant" : "le rapporteur") . ".pdf"); - } - - $zip->close(); + $file_name = getZipFile(DocumentType::SYNTHESIS, $id); header("Content-Type: application/zip"); header("Content-Disposition: attachment; filename=\"Notes de syntèses du tournoi de " . $tournament->getName() . ".zip\""); - header("Content-Length: " . filesize($temp)); + header("Content-Length: " . filesize($file_name)); - readfile($temp); + readfile($file_name); exit(); } diff --git a/server_files/model.php b/server_files/model.php index b0004c4..ece61da 100644 --- a/server_files/model.php +++ b/server_files/model.php @@ -133,4 +133,64 @@ function printDocuments($documents) { $version = $document->getVersion(); echo "$name de $first_name $surname (version $version) : Télécharger
"; } +} + +function getZipFile($document_type, $tournament_id, $team_id = -1) { + global $LOCAL_PATH; + + $tournament = Tournament::fromId($tournament_id); + + $zip = new ZipArchive(); + + $file_name = tempnam("tmp", "tfjm-"); + + if ($zip->open($file_name, ZipArchive::CREATE) !== true) { + die("Impossible de créer le fichier zip."); + } + + switch ($document_type) { + case DocumentType::SOLUTION: + $data = $tournament->getAllSolutions($team_id); + break; + case DocumentType::SYNTHESIS: + $data = $tournament->getAllSyntheses($team_id); + break; + default: + $data = $tournament->getAllDocuments($team_id); + break; + } + + /** @var Document | Solution | Synthesis $file */ + foreach ($data as $file) { + $file_id = $file->getFileId(); + $team = Team::fromId($file->getTeamId()); + switch ($document_type) { + case DocumentType::SOLUTION: + $name = "Problème " . $file->getProblem() . " " . $team->getTrigram() . ".pdf"; + break; + case DocumentType::SYNTHESIS: + $name = "Note de synthèse " . $team->getTrigram() . " pour " . ($file->getDest() == DestType::OPPOSANT ? "l'opposant" : "le rapporteur") . ".pdf"; + break; + default: + $user = User::fromId($file->getUserId()); + switch ($file->getType()) { + case DocumentType::PARENTAL_CONSENT: + $name = "Autorisation parentale de " . $user->getFirstName() . " " . $user->getSurname() . ".pdf"; + break; + case DocumentType::PHOTO_CONSENT: + $name = "Autorisation de droit à l'image de " . $user->getFirstName() . " " . $user->getSurname() . ".pdf"; + break; + default: + $name = "Fiche sanitaire de " . $user->getFirstName() . " " . $user->getSurname() . ".pdf"; + break; + } + break; + } + + $zip->addFile("$LOCAL_PATH/files/$file_id", $name); + } + + $zip->close(); + + return $file_name; } \ No newline at end of file diff --git a/server_files/views/ajouter_tournoi.php b/server_files/views/ajouter_tournoi.php index 309752e..9caa95b 100644 --- a/server_files/views/ajouter_tournoi.php +++ b/server_files/views/ajouter_tournoi.php @@ -57,7 +57,7 @@ if (isset($tournament)) { - + diff --git a/server_files/views/equipe.php b/server_files/views/equipe.php index a1ddb8f..4f0d332 100644 --- a/server_files/views/equipe.php +++ b/server_files/views/equipe.php @@ -41,7 +41,8 @@ if ($team->isSelectedForFinal()) {

Autorisations pour la finale

- + +
diff --git a/server_files/views/tournoi.php b/server_files/views/tournoi.php index 6bcd1d5..73257cd 100644 --- a/server_files/views/tournoi.php +++ b/server_files/views/tournoi.php @@ -152,7 +152,7 @@ else { - +