This commit is contained in:
guillaume91 2024-05-30 17:03:32 +02:00
parent e1a248f678
commit 026e2601c4
7 changed files with 33 additions and 29 deletions

View file

@ -48,7 +48,7 @@ public function handle(): void
$process->run(); $process->run();
if (!$process->isSuccessful()) { if (!$process->isSuccessful()) {
logger('error', $process->getErrorOutput()); logger('error', [$process->getErrorOutput()]);
} }
logger($process->getOutput()); logger($process->getOutput());

View file

@ -12,6 +12,7 @@
use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Process\Exceptions\ProcessFailedException;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Symfony\Component\Process\Process; use Symfony\Component\Process\Process;
@ -76,6 +77,7 @@ public static function handleFor(Project $project, $year, $startWeekNumber)
{ {
logger("ProjectMosiacGeneratorJob::handleFor(week $startWeekNumber, year $year)"); logger("ProjectMosiacGeneratorJob::handleFor(week $startWeekNumber, year $year)");
if ($project->hasInvalidMosaicFor($year, $startWeekNumber)) { if ($project->hasInvalidMosaicFor($year, $startWeekNumber)) {
logger("ProjecMosaicGeneratorJob::handleFor(week $startWeekNumber, year $year): InvalidMosaic.");
return new NullJob(); return new NullJob();
} }

View file

@ -41,7 +41,7 @@ public function saveMosaic()
], [ ], [
'path' => $this->project->getMosaicPath(), 'path' => $this->project->getMosaicPath(),
]); ]);
logger(sprintf('in SaveMosaic: %s, week: %d, year: %d', $mosaic->name, $mosaic->week, $mosaic->year));
ProjectMosiacGeneratorJob::dispatch($mosaic); ProjectMosiacGeneratorJob::dispatch($mosaic);
$this->showCreateModal = false; $this->showCreateModal = false;

View file

@ -135,7 +135,7 @@ public function allMosaicsPresent(Carbon $endDate): bool
{ {
// end date is in the future // end date is in the future
if ($endDate->isFuture()) { if ($endDate->isFuture()) {
throw new \Exception('End date is in the future'); throw new \Exception('Mosaic can be generated for the future. Change the end date.');
} }
$mosaicsNotPresentInFilesystem = $this->getMosaicFilenameListByEndDate($endDate) $mosaicsNotPresentInFilesystem = $this->getMosaicFilenameListByEndDate($endDate)
@ -155,7 +155,7 @@ public function allMosaicsPresent(Carbon $endDate): bool
throw new \Exception($message); throw new \Exception($message);
} }
public function getMosaicFilenameListByEndDate(Carbon $endDate): Collection public static function getMosaicFilenameListByEndDate(Carbon $endDate): Collection
{ {
$result = collect([]); $result = collect([]);
for ($i = 0; $i < 4; $i++) { for ($i = 0; $i < 4; $i++) {
@ -304,7 +304,7 @@ public function scheduleReport($year = null, $week = null)
Bus::chain([ Bus::chain([
Bus::batch($this->getFileDownloadsFor($year, $week)), Bus::batch($this->getFileDownloadsFor($year, $week)),
Bus::batch($this->getMosaicsFor($year, $week)), Bus::batch($this->getMosaicsFor($year, $week)),
Bus::batch($this->getReportFor($year, $week, true)), Bus::batch([$this->getReportFor($year, $week, true)]),
]) ])
->dispatch(); ->dispatch();
return "done"; return "done";
@ -319,30 +319,28 @@ public function getReportFor($year, $week, $sendMail = false)
'path' => 'reports/week_'.$week.'_'.$year.'.docx', 'path' => 'reports/week_'.$week.'_'.$year.'.docx',
]); ]);
return [new ProjectReportGeneratorJob($report, $sendMail)]; return (new ProjectReportGeneratorJob($report, $sendMail));
} }
public function getFileDownloadsFor($year, $startWeekNumber) public function getFileDownloadsFor($year, $startWeekNumber):array
{ {
$endOfRange = now()->setISODate($year, $startWeekNumber)->endOfWeek(); $endOfRange = now()->setISODate($year, $startWeekNumber)->endOfWeek();
$startOfRange = (clone $endOfRange)->subWeeks(3)->startOfWeek(); $startOfRange = (clone $endOfRange)->subWeeks(3)->startOfWeek();
$dateRange = CarbonPeriod::create($startOfRange, $endOfRange); $dateRange = CarbonPeriod::create($startOfRange, $endOfRange);
$return = collect($dateRange) return collect($dateRange)
->map(fn($date) => ProjectDownloadTiffJob::handleForDate($this, $date)) ->map(fn($date) => ProjectDownloadTiffJob::handleForDate($this, $date))
->filter() ->filter()
->toArray(); ->toArray();
return $return;
} }
public function getMosaicsFor($year, $startWeekNumber) public function getMosaicsFor($year, $startWeekNumber)
{ {
$return = collect(range(0, 3)) logger(sprintf('in Get Mosaics for year %s week %d', $year, $startWeekNumber));
return collect(range(0, 3))
->map(fn($weekDiff) => ProjectMosiacGeneratorJob::handleFor($this, $year, $startWeekNumber - $weekDiff)) ->map(fn($weekDiff) => ProjectMosiacGeneratorJob::handleFor($this, $year, $startWeekNumber - $weekDiff))
->filter() ->filter()
->toArray(); ->toArray();
return $return;
} }
} }

View file

@ -18,11 +18,11 @@
<x-slot name="form"> <x-slot name="form">
<div class="col-span-6 sm:col-span-4"> <div class="col-span-6 sm:col-span-4">
<x-label for="year" value="{{ __('Year') }}"/> <x-label for="year" value="{{ __('Year') }}"/>
<x-input id="year" type="text" class="mt-1 block w-full" wire:model.live="formData.year" autofocus/> <x-input id="year" type="number" min="1900" max="{{\Carbon\Carbon::now()->year}}" class="mt-1 block w-full" wire:model.live="formData.year" autofocus/>
<x-input-error for="formData.year" class="mt-2"/> <x-input-error for="formData.year" class="mt-2"/>
</div><div class="col-span-6 sm:col-span-4"> </div><div class="col-span-6 sm:col-span-4">
<x-label for="week" value="{{ __('Week') }}"/> <x-label for="week" value="{{ __('Week') }}"/>
<x-input id="week" type="text" class="mt-1 block w-full" wire:model.live="formData.week" autofocus/> <x-input id="week" type="number" min="1" max="53" class="mt-1 block w-full" wire:model.live="formData.week" autofocus/>
<x-input-error for="formData.week" class="mt-2"/> <x-input-error for="formData.week" class="mt-2"/>
<x-input-error for="formData" class="mt-2"/> <x-input-error for="formData" class="mt-2"/>
</div> </div>

View file

@ -69,7 +69,7 @@ class="flex flex-col md:flex-row">
<div id="mail" <div id="mail"
class="flex flex-col md:w-2/3" class="flex flex-col md:w-2/3"
x-data="{showMail: null}" x-data="{showMail: null}"
x-init="showMail = !($wire.formData['mail_subject'] === null || $wire.formData['mail_subject'] === undefined || $wire.formData['mail_subject'] === '')" x-init="showMail = $wire.formData['mail_scheduled']"
> {{-- flex col--}} > {{-- flex col--}}
<div class="flex justify-between my-4"> <div class="flex justify-between my-4">
<div class="inline-flex items-center gap-2"> <div class="inline-flex items-center gap-2">
@ -79,8 +79,7 @@ class="flex flex-col md:w-2/3"
</div> </div>
</div> </div>
<label class="inline-flex items-center cursor-pointer gap-4"> <label class="inline-flex items-center cursor-pointer gap-4">
<input x-ref="subject" type="checkbox" class="sr-only peer" wire:model="formData.mail_scheduled" @click="showMail = $el.checked" x-init="$el.checked = showMail"> <input type="checkbox" class="sr-only peer" wire:model.live="formData.mail_scheduled" @click="showMail = $el.checked">
{{-- TODO doesn't save mail_scheduled in DB--}}
<div class="relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-indigo-300 dark:peer-focus:ring-indigo-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-indigo-600"></div> <div class="relative w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-indigo-300 dark:peer-focus:ring-indigo-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-indigo-600"></div>
</label> </label>
</div> </div>

View file

@ -90,14 +90,15 @@ public function when_not_all_mosaics_are_present_it_should_return_an_exception()
/** @test */ /** @test */
public function when_all_mosaics_are_present_it_should_return_true() public function when_all_mosaics_are_present_it_should_return_true()
{ {
// TODO CHeck with Martin the Leading Zero test
$project = Mockery::mock(Project::class)->makePartial(); $project = Mockery::mock(Project::class)->makePartial();
$lastDate = Carbon::parse('2021-01-01'); $lastDate = Carbon::parse('2021-01-22');
$project->shouldReceive('getMosaicList')->andReturn( $project->shouldReceive('getMosaicList')->andReturn(
collect([ collect([
"chemba/weekly_mosaic/week_53_2020.tif", "chemba/weekly_mosaic/week_53_2020.tif",
"chemba/weekly_mosaic/week_52_2020.tif", "chemba/weekly_mosaic/week_03_2021.tif",
"chemba/weekly_mosaic/week_51_2020.tif", "chemba/weekly_mosaic/week_02_2021.tif",
"chemba/weekly_mosaic/week_50_2020.tif", "chemba/weekly_mosaic/week_01_2021.tif",
])); ]));
$this->assertTrue($project->allMosaicsPresent($lastDate)); $this->assertTrue($project->allMosaicsPresent($lastDate));
@ -126,7 +127,7 @@ public function when_not_mosaics_are_present_it_should_throw_an_exception_listin
public function when_all_mosaics_are_present_is_called_with_future_date_it_should_throw_an_expection() public function when_all_mosaics_are_present_is_called_with_future_date_it_should_throw_an_expection()
{ {
$this->expectException(\Exception::class); $this->expectException(\Exception::class);
$this->expectExceptionMessage('End date is in the future'); $this->expectExceptionMessage('Mosaic can be generated for the future. Change the end date.');
$this->seed(); $this->seed();
$project = Project::find(1); $project = Project::find(1);
Carbon::setTestNow(Carbon::parse('2020-01-01')); Carbon::setTestNow(Carbon::parse('2020-01-01'));
@ -139,9 +140,10 @@ public function when_all_mosaics_are_present_is_called_with_future_date_it_shoul
public function getMosiacFileListByEndDate_should_return_four_filenames() public function getMosiacFileListByEndDate_should_return_four_filenames()
{ {
$this->seed(); $this->seed();
/* @var Project $project */
$project = Project::find(1); $project = Project::find(1);
$lastDate = Carbon::parse('2021-01-01'); $lastDate = Carbon::parse('2021-01-01');
$list = $project->getMosiacFilenameListByEndDate($lastDate); $list = $project::getMosaicFilenameListByEndDate($lastDate);
$this->assertCount(4, $list); $this->assertCount(4, $list);
$this->assertEquals([ $this->assertEquals([
"week_53_2020.tif", "week_53_2020.tif",
@ -154,32 +156,35 @@ public function getMosiacFileListByEndDate_should_return_four_filenames()
/** @test */ /** @test */
public function when_getFileDownloadsFor_is_called_it_returns_a_collection_of_seven_downloads_jobs() public function when_getFileDownloadsFor_is_called_it_returns_a_collection_of_seven_downloads_jobs()
{ {
/* @var Project $project */
$project = Project::create([ $project = Project::create([
'name' => 'project_name', 'name' => 'project_name',
'download_path' => 'project_download_path', 'download_path' => 'project_download_path',
]); ]);
$downloads = $project->getFileDownloadsFor(2023, 2); $downloads = $project->getFileDownloadsFor(2023, 22);
$this->assertCount(3 * 7, $downloads); $this->assertCount(4 * 7, $downloads);
$downloads->each(fn($job) => $this->assertInstanceOf(ProjectDownloadTiffJob::class, $job)); collect($downloads)->each(fn($job) => $this->assertInstanceOf(ProjectDownloadTiffJob::class, $job));
} }
/** @test */ /** @test */
public function when_getMosaicsFor_is_called_it_returns_a_collection_of_seven_downloads_jobs() public function when_getMosaicsFor_is_called_it_returns_a_collection_of_seven_downloads_jobs()
{ {
/* @var Project $project */
$project = Project::create([ $project = Project::create([
'name' => 'project_name', 'name' => 'project_name',
'download_path' => 'project_download_path', 'download_path' => 'project_download_path',
]); ]);
$mosaics = $project->getMosaicsFor(2023, 2); $mosaics = $project->getMosaicsFor(2023, 2);
$this->assertCount(3, $mosaics); $this->assertCount(4, $mosaics);
$mosaics->each(fn($job) => $this->assertInstanceOf(ProjectMosiacGeneratorJob::class, $job)); collect($mosaics)->each(fn($job) => $this->assertInstanceOf(ProjectMosiacGeneratorJob::class, $job));
} }
/** @test */ /** @test */
public function when_getReport_is_called_it_returns_a_jobs() public function when_getReport_is_called_it_returns_a_jobs()
{ {
/* @var Project $project*/
$project = Project::create([ $project = Project::create([
'name' => 'project_name', 'name' => 'project_name',
'download_path' => 'project_download_path', 'download_path' => 'project_download_path',
@ -230,7 +235,7 @@ public function when_friday_and_first_week_it_should_schedule($date, $day, $resu
$this->assertEquals($result, $project->shouldSchedule()); $this->assertEquals($result, $project->shouldSchedule());
} }
public function scheduleDayProvider(){ public static function scheduleDayProvider(){
return [ return [
['date' => '2024-03-01', 'day' => 'Friday', 'result' => true], ['date' => '2024-03-01', 'day' => 'Friday', 'result' => true],
['date' => '2024-03-02', 'day' => 'Saturday', 'result' => false], ['date' => '2024-03-02', 'day' => 'Saturday', 'result' => false],