From 2c4f1d6541301e5fdf257702a530f492e2a2727a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Kr=C5=A1ka?= Date: Sun, 7 Jan 2024 00:15:18 +0100 Subject: [PATCH] download series --- app/Models/Problems/ProblemRequest.php | 2 +- app/Models/Problems/SeriesModel.php | 22 +++++++++ app/Models/Problems/SeriesRequest.php | 36 +++++++++++++++ app/Models/Problems/SeriesService.php | 46 +++++++++++++++++++ .../Fykos/Core/templates/@layout.latte | 12 +++++ .../Fykos/DefaultModule/ProblemsPresenter.php | 31 +++++++------ .../templates/Problems/default.latte | 42 ++++++++--------- app/config/config.fykos.neon | 2 + 8 files changed, 158 insertions(+), 35 deletions(-) create mode 100644 app/Models/Problems/SeriesModel.php create mode 100644 app/Models/Problems/SeriesRequest.php create mode 100644 app/Models/Problems/SeriesService.php diff --git a/app/Models/Problems/ProblemRequest.php b/app/Models/Problems/ProblemRequest.php index 74fc95af..19b4d345 100644 --- a/app/Models/Problems/ProblemRequest.php +++ b/app/Models/Problems/ProblemRequest.php @@ -33,6 +33,6 @@ public function getParams(): array final public function getMethod(): string { - return sprintf('problem%d-%d.json', $this->series, $this->number); + return sprintf('%d/problem%d-%d.json', $this->year, $this->series, $this->number); } } diff --git a/app/Models/Problems/SeriesModel.php b/app/Models/Problems/SeriesModel.php new file mode 100644 index 00000000..e2286728 --- /dev/null +++ b/app/Models/Problems/SeriesModel.php @@ -0,0 +1,22 @@ +deadline); + } +} diff --git a/app/Models/Problems/SeriesRequest.php b/app/Models/Problems/SeriesRequest.php new file mode 100644 index 00000000..e436d110 --- /dev/null +++ b/app/Models/Problems/SeriesRequest.php @@ -0,0 +1,36 @@ +contest = $contest; + $this->year = $year; + $this->series = $series; + } + + public function getCacheKey(): string + { + return sprintf('series.%s.%d.%d', $this->contest, $this->year, $this->series); + } + + public function getParams(): array + { + return []; + } + + final public function getMethod(): string + { + return sprintf('series.json'); + } +} diff --git a/app/Models/Problems/SeriesService.php b/app/Models/Problems/SeriesService.php new file mode 100644 index 00000000..dc6518fd --- /dev/null +++ b/app/Models/Problems/SeriesService.php @@ -0,0 +1,46 @@ +getItem( + new SeriesRequest($contest, $year, $series), + [(string)$year, (string)$series], + SeriesModel::class, + false, + $explicitExpiration + ); + } + + public function getLatestSeries(string $contest): SeriesModel { + return $this->cache->load( + sprintf("lastSeries_%s", $contest), + function (&$dependencies) use ($contest) { + $dependencies[Cache::EXPIRE] = $this->expiration; + $jsonText = $this->downloader->download(new SeriesRequest($contest, 0, 0)); // 0, 0 are dummy data + $json = json_decode($jsonText); + + $yearArray = get_object_vars($json); + $year = end($yearArray); + + $seriesArray = get_object_vars($year); + $series = end($seriesArray); + + $mapper = new \JsonMapper(); + return $mapper->map($series, new SeriesModel()); + } + ); + } +} diff --git a/app/Modules/Fykos/Core/templates/@layout.latte b/app/Modules/Fykos/Core/templates/@layout.latte index 16c02bac..39bbcee2 100644 --- a/app/Modules/Fykos/Core/templates/@layout.latte +++ b/app/Modules/Fykos/Core/templates/@layout.latte @@ -30,6 +30,18 @@ + + + {block scripts}{/block} diff --git a/app/Modules/Fykos/DefaultModule/ProblemsPresenter.php b/app/Modules/Fykos/DefaultModule/ProblemsPresenter.php index acdfadf7..b50ee018 100644 --- a/app/Modules/Fykos/DefaultModule/ProblemsPresenter.php +++ b/app/Modules/Fykos/DefaultModule/ProblemsPresenter.php @@ -4,24 +4,31 @@ namespace App\Modules\Fykos\DefaultModule; +use App\Models\Problems\ProblemService; +use App\Models\Problems\SeriesService; use Nette\Utils\DateTime; class ProblemsPresenter extends BasePresenter { + private ProblemService $problemService; + private SeriesService $seriesService; + + public function injectServiceProblem(ProblemService $problemService, SeriesService $seriesService): void + { + $this->problemService = $problemService; + $this->seriesService = $seriesService; + } + public function renderDefault(): void { + $series = $this->seriesService->getLatestSeries('fykos'); + $this->template->series = $series; - // Nahradit toto za načítání dat z databáze - $fileContents1 = file_get_contents(__DIR__ . '/temp-solution.json'); - $data1 = json_decode($fileContents1, true); - $fileContents2 = file_get_contents(__DIR__ . '/temp-solution2.json'); - $data2 = json_decode($fileContents2, true); - $data = [$data1, $data2]; - $series = [ - 'number' => 1, - 'year' => 37, - 'deadline' => new DateTime('2023-11-25 23:59:59'), - ]; + $problems = []; + foreach ($series->problems as $probNum) { + $problems[] = $this->problemService->getProblem('fykos', $series->year, $series->series, $probNum); + } + $this->template->problems = $problems; $this->template->problemIcons = [ 1 => 'fas fa-smile', @@ -33,7 +40,5 @@ public function renderDefault(): void 7 => 'fas fa-flask', 8 => 'fas fa-book' ]; - $this->template->series = $series; - $this->template->problems = $data; } } diff --git a/app/Modules/Fykos/DefaultModule/templates/Problems/default.latte b/app/Modules/Fykos/DefaultModule/templates/Problems/default.latte index 626d03d5..44b7bf24 100644 --- a/app/Modules/Fykos/DefaultModule/templates/Problems/default.latte +++ b/app/Modules/Fykos/DefaultModule/templates/Problems/default.latte @@ -8,11 +8,11 @@
{switch $lang} - {case 'cs'}Deadline pro odeslání: {$series["deadline"]|date:"d. m. Y, H:i"}. - {default}Deadline for submission: {$series["deadline"]|date:"d. m. Y, H:i"}, CET. + {case 'cs'}Deadline pro odeslání: {$series->getDeadline()|date:"d. m. Y, H:i"}. + {default}Deadline for submission: {$series->getDeadline()|date:"d. m. Y, H:i"}, CET. {/switch}
-

Zadání {$series["number"]}. série {$series["year"]}. ročníku

+

Zadání {$series->series}. série {$series->year}. ročníku

{switch $lang} @@ -45,7 +45,7 @@
- Text seriálu {$series["number"]}. + Text seriálu {$series->series}. série {if true} {* TODO if je po deadlinu *} @@ -59,26 +59,26 @@ {foreach $problems as $problem}
-
+
-

- {$problem["number"]}... - {$problem["name"][$lang]}

+

number]}> + {$problem->getLabel()}... + {$problem->name[$lang]}

{switch $lang} {case 'cs'} -

{$problem["points"]} bod{if $problem["points"] == 1}{elseif - $problem["points"] > 1 - && $problem["points"] < 5}y{else}ů{/if}

+

{$problem->points} bod{if $problem->points == 1}{elseif + $problem->points > 1 + && $problem->points < 5}y{else}ů{/if}

{default} -

{$problem["points"]} point{if $problem["points"] == 1}{else}s{/if}

+

{$problem->points} point{if $problem->points == 1}{else}s{/if}

{/switch}
- {$problem["task"]["cs"]} + {$problem->task[$lang]}
{if true} {* TODO if je po deadlinu *}
@@ -89,24 +89,24 @@ {else} Řešení této úlohy zveřejníme brzy. {/if} - {if $problem["number"] == 7} - Návod pro řešení experimentálních úloh + {if $problem->number == 7} + {*Návod pro řešení experimentálních úloh*} {/if} - {if $problem["number"] == 8} + {if $problem->number == 8} - Text seriálu {$series["number"]}. + Text seriálu {$series->series}. série {/if}
-
~ {$problem["origin"][$lang]}
+
~ {$problem->origin[$lang]}
{/if}
@@ -118,4 +118,4 @@
-{/block} \ No newline at end of file +{/block} diff --git a/app/config/config.fykos.neon b/app/config/config.fykos.neon index cc675a81..0316e4d9 100644 --- a/app/config/config.fykos.neon +++ b/app/config/config.fykos.neon @@ -4,6 +4,8 @@ application: services: - App\RouterFactory::createFykosRouter(%domains%, %router-mapping%) + - App\Models\Problems\ProblemService('10 minutes') + - App\Models\Problems\SeriesService('10 minutes') includes: