added rule for missing mergedTifs;
This commit is contained in:
parent
eb1def36a1
commit
3fb55ddcce
30
build_mosaic.sh
Executable file
30
build_mosaic.sh
Executable file
|
|
@ -0,0 +1,30 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
filename="report_dummie.docx"
|
||||||
|
weeks_ago="0"
|
||||||
|
report_date="2022-12-12"
|
||||||
|
|
||||||
|
# Parse de command line argumenten
|
||||||
|
while [ "$#" -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
--weeks_ago=*)
|
||||||
|
weeks_ago="${1#*=}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Onbekende optie: $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Controleer of de vereiste argumenten zijn ingesteld
|
||||||
|
if [ -z "$filename" ] || [ -z "$weeks_ago" ] || [ -z $report_date ]; then
|
||||||
|
echo "Missende argumenten. Gebruik: build_reports.sh --filename=hello.txt --weeks_ago=3 --report_date=2020-01-01"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
echo "Weeks ago: $weeks_ago"
|
||||||
|
cd /Users/mfolkerts/smartCane/r_app
|
||||||
|
Rscript 2_CI_data_prep.R $weeks_ago
|
||||||
|
|
@ -1,15 +1,51 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
## Runnen van Rmd bestand
|
|
||||||
# -e betekent "evalueren" en -i specificeert de input file
|
filename="report_dummie.docx"
|
||||||
Rscript --version
|
weeks_ago="0"
|
||||||
echo $PATH
|
report_date="2022-12-12"
|
||||||
|
|
||||||
|
# Parse de command line argumenten
|
||||||
|
while [ "$#" -gt 0 ]; do
|
||||||
|
case "$1" in
|
||||||
|
--filename=*)
|
||||||
|
filename="${1#*=}"
|
||||||
|
;;
|
||||||
|
--weeks_ago=*)
|
||||||
|
weeks_ago="${1#*=}"
|
||||||
|
;;
|
||||||
|
--report_date=*)
|
||||||
|
report_date="${1#*=}"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Onbekende optie: $1"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift
|
||||||
|
done
|
||||||
|
|
||||||
|
# Controleer of de vereiste argumenten zijn ingesteld
|
||||||
|
if [ -z "$filename" ] || [ -z "$weeks_ago" ] || [ -z $report_date ]; then
|
||||||
|
echo "Missende argumenten. Gebruik: build_reports.sh --filename=hello.txt --weeks_ago=3 --report_date=2020-01-01"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Je script logica hier
|
||||||
|
echo "Filename: $filename"
|
||||||
|
echo "Weeks ago: $weeks_ago"
|
||||||
|
echo "Report date: $report_date"
|
||||||
|
|
||||||
#script_dir="$(dirname "$0")"
|
#script_dir="$(dirname "$0")"
|
||||||
#echo $script_dir;
|
#echo $script_dir;
|
||||||
#/bin/ps aux | grep fontd
|
#/bin/ps aux | grep fontd
|
||||||
|
#output_file="/Users/mfolkerts/smartCane/laravel_app/storage/app/chemba/$filename"
|
||||||
|
|
||||||
|
#echo "Output file: $output_file"
|
||||||
echo '\n'
|
echo '\n'
|
||||||
|
|
||||||
echo 'zx28tb' | /usr/bin/sudo -S launchctl load -w /System/Library/LaunchAgents/com.apple.fontd.useragent.plist
|
echo 'zx28tb' | /usr/bin/sudo -S launchctl load -w /System/Library/LaunchAgents/com.apple.fontd.useragent.plist
|
||||||
cd /Users/mfolkerts/smartCane/r_app
|
cd /Users/mfolkerts/smartCane/r_app
|
||||||
Rscript -e "rmarkdown::render('/Users/mfolkerts/smartCane/r_app/CI_Report_dashboard_planet.Rmd', 'all')"
|
#Rscript -e "rmarkdown::render('/Users/mfolkerts/smartCane/r_app/CI_Report_dashboard_planet.Rmd', 'all')"
|
||||||
|
#Rscript 1_harvest_data_EcoFarm_v2.R
|
||||||
|
Rscript 2_CI_data_prep.R $weeks_ago
|
||||||
|
Rscript -e "rmarkdown::render('CI_report_dashboard_planet.Rmd', output_file='$filename', params=list(ref='$ref', report_date='$report_date'))"
|
||||||
69
laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php
Normal file
69
laravel_app/app/Jobs/ProjectMosiacGeneratorJob.php
Normal file
|
|
@ -0,0 +1,69 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use App\Models\Project;
|
||||||
|
use App\Models\ProjectReport;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldBeUnique;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
use Symfony\Component\Process\Process;
|
||||||
|
|
||||||
|
class ProjectMosiacGeneratorJob implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
|
||||||
|
public $year;
|
||||||
|
public $week;
|
||||||
|
public Project $project;
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
*/
|
||||||
|
public function __construct(Project $project, $year, $week)
|
||||||
|
{
|
||||||
|
$this->year = $year;
|
||||||
|
$this->week = $week;
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*/
|
||||||
|
public function handle(): void
|
||||||
|
{
|
||||||
|
$weeksAgo = ProjectReport::weeksAgoForYearAndWeek($this->year, $this->week);
|
||||||
|
|
||||||
|
$projectFolder = base_path('../');
|
||||||
|
|
||||||
|
$command = [
|
||||||
|
sprintf('%sbuild_mosaic.sh', $projectFolder),
|
||||||
|
sprintf('--weeks_ago=%s', $weeksAgo),
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
$process = new Process($command);
|
||||||
|
$process->setTimeout(120);
|
||||||
|
$currentPath = '/usr/gnu/bin:/usr/local/bin:/bin:/usr/bin/Users/mfolkerts/anaconda3/bin:/Library/Apple/usr/bin';
|
||||||
|
|
||||||
|
$process->setEnv(['PATH' => $currentPath.':/usr/local/Cellar/pandoc/3.1.8/bin/pandoc']);
|
||||||
|
// $process->setTimeout(36000); // stel een geschikte timeout in
|
||||||
|
$process->start();
|
||||||
|
try {
|
||||||
|
$myOutput = [];
|
||||||
|
$process->wait(function ($type, $buffer) use (&$myOutput) {
|
||||||
|
// $this->stream(to: 'processOutput', content: $buffer);
|
||||||
|
$myOutput[] = $buffer;
|
||||||
|
logger($buffer);
|
||||||
|
});
|
||||||
|
$this->processOutput = collect($myOutput)->join('\n');
|
||||||
|
|
||||||
|
} catch (ProcessFailedException $exception) {
|
||||||
|
echo $exception->getMessage();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
58
laravel_app/app/Livewire/Projects/MosaicManager.php
Normal file
58
laravel_app/app/Livewire/Projects/MosaicManager.php
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Livewire\Projects;
|
||||||
|
|
||||||
|
use App\Jobs\ProjectMosiacGeneratorJob;
|
||||||
|
use App\Models\Project;
|
||||||
|
use Livewire\Component;
|
||||||
|
|
||||||
|
class MosaicManager extends Component
|
||||||
|
{
|
||||||
|
public $project;
|
||||||
|
|
||||||
|
public $formData = [
|
||||||
|
'week' => '',
|
||||||
|
'year' => '',
|
||||||
|
];
|
||||||
|
public $showCreateModal = false;
|
||||||
|
|
||||||
|
public function mount(Project $project) {
|
||||||
|
$this->path = $project->download_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render()
|
||||||
|
{
|
||||||
|
return view('livewire.projects.mosaic-manager', [
|
||||||
|
'downloads' => $this->project
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function saveMosiac(){
|
||||||
|
$this->validate([
|
||||||
|
'formData.year' => 'required',
|
||||||
|
'formData.week' => 'required',
|
||||||
|
]);
|
||||||
|
|
||||||
|
ProjectMosiacGeneratorJob::dispatch($this->project, $this->formData['year'], $this->formData['week']);
|
||||||
|
|
||||||
|
$this->showCreateModal = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function openCreateMosiacsModal(){
|
||||||
|
$this->showCreateModal = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDateRangeProperty()
|
||||||
|
{
|
||||||
|
if (empty($this->formData['week']) || strlen($this->formData['year']) !== 4) {
|
||||||
|
return '<span class="text-red-500">Invalid week or year</span>';
|
||||||
|
}
|
||||||
|
$begin = now()
|
||||||
|
->setISODate($this->formData['year'], $this->formData['week'])
|
||||||
|
->startOfWeek();
|
||||||
|
$end = now()
|
||||||
|
->setISODate($this->formData['year'], $this->formData['week'])
|
||||||
|
->endOfWeek();
|
||||||
|
return $begin->format('Y-m-d').' - '.$end->format('Y-m-d');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
use Illuminate\Support\Carbon;
|
use Illuminate\Support\Carbon;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Illuminate\Support\Str;
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
|
|
@ -143,7 +144,7 @@ public function allMosaicsPresent(Carbon $endDate)
|
||||||
$mosaicsNotPresentInFilesystem = $this->getMosiacFilenameListByEndDate($endDate)
|
$mosaicsNotPresentInFilesystem = $this->getMosiacFilenameListByEndDate($endDate)
|
||||||
->filter(function ($filename) {
|
->filter(function ($filename) {
|
||||||
return !$this->getMosaicList()->contains(function ($mosaicFilename) use ($filename) {
|
return !$this->getMosaicList()->contains(function ($mosaicFilename) use ($filename) {
|
||||||
return Str::endsWith( $mosaicFilename, substr($filename, -16));
|
return Str::endsWith($mosaicFilename, substr($filename, -16));
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
if ($mosaicsNotPresentInFilesystem->count() === 0) {
|
if ($mosaicsNotPresentInFilesystem->count() === 0) {
|
||||||
|
|
@ -173,5 +174,52 @@ public function getMosiacFilenameListByEndDate(Carbon $endDate): \Illuminate\Sup
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getMosiacList()
|
||||||
|
{
|
||||||
|
return collect(Storage::files($this->getMosaicPath()))
|
||||||
|
->filter(fn($file) => Str::endsWith($file, '.tif'))
|
||||||
|
->sortByDesc(function ($file) {
|
||||||
|
$parts = explode('_', str_replace('.tif', '', $file));
|
||||||
|
$week = $parts[1];
|
||||||
|
$year = $parts[2];
|
||||||
|
return $year.sprintf('%02d', $week);
|
||||||
|
})
|
||||||
|
->values();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getAllDatesOfWeeksInYear($year, $weekNumber): Collection
|
||||||
|
{
|
||||||
|
$startOfWeek = Carbon::now()->setISODate($year, $weekNumber)->startOfWeek();
|
||||||
|
$dates = collect([]);
|
||||||
|
|
||||||
|
for ($day = 0; $day < 7; $day++) {
|
||||||
|
$dates->push((clone $startOfWeek)->addDays($day)->toDateString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return $dates;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function allMergedTiffsPresent(Collection $haystack, Collection $needles)
|
||||||
|
{
|
||||||
|
$needlesNotInHaystack = $needles->filter(function ($needle) use ($haystack) {
|
||||||
|
return !$haystack->contains(function ($item) use ($needle) {
|
||||||
|
return str_contains($item, $needle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if ($needlesNotInHaystack->count() > 0) {
|
||||||
|
$message = sprintf(
|
||||||
|
'Missing merged tiffs: %s',
|
||||||
|
$needlesNotInHaystack->implode(', ')
|
||||||
|
);
|
||||||
|
|
||||||
|
throw new \Exception($message);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getMergedTiffList()
|
||||||
|
{
|
||||||
|
return collect([]);;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,12 @@ public function project()
|
||||||
|
|
||||||
public function weeksAgo()
|
public function weeksAgo()
|
||||||
{
|
{
|
||||||
return now()->diffInWeeks(now()->setISODate($this->year, $this->week));
|
return $this->weeksAgoForYearAndWeek($this->year, $this->week);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function weeksAgoForYearAndWeek($year, $week)
|
||||||
|
{
|
||||||
|
return now()->diffInWeeks(now()->setISODate($year, $week));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getFileName()
|
public function getFileName()
|
||||||
|
|
|
||||||
36
laravel_app/app/Rules/AllMergedTiffsPresentRule.php
Normal file
36
laravel_app/app/Rules/AllMergedTiffsPresentRule.php
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Rules;
|
||||||
|
|
||||||
|
use Illuminate\Contracts\Validation\Rule;
|
||||||
|
use App\Models\Project;
|
||||||
|
use App\Models\ProjectReport;
|
||||||
|
|
||||||
|
class AllMergedTiffsPresentRule implements Rule
|
||||||
|
{
|
||||||
|
protected $project;
|
||||||
|
protected $errorMessage = '';
|
||||||
|
|
||||||
|
public function __construct(Project $project)
|
||||||
|
{
|
||||||
|
$this->project = $project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function passes($attribute, $value)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
return $this->project->allMergedTiffsPresent(
|
||||||
|
$this->project->getMergedTiffList(),
|
||||||
|
Project::getAllDatesOfWeeksInYear($value['year'], $value['week'])
|
||||||
|
);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->errorMessage = $e->getMessage();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function message()
|
||||||
|
{
|
||||||
|
return $this->errorMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
@props([
|
||||||
|
'formData',
|
||||||
|
/** @var \App\Livewire\Projects\MosaicManager */
|
||||||
|
'manager'
|
||||||
|
])
|
||||||
|
|
||||||
|
<x-modal wire:model.live="showCreateModal" {{ $attributes }} >
|
||||||
|
<x-form-modal submit="saveMosiac" wire:loading.class="opacity-50">
|
||||||
|
<x-slot name="title">
|
||||||
|
{{ __('Project') }}
|
||||||
|
</x-slot>
|
||||||
|
|
||||||
|
<x-slot name="description">
|
||||||
|
{{ __('Report generator for generating reports') }}
|
||||||
|
</x-slot>
|
||||||
|
|
||||||
|
|
||||||
|
<x-slot name="form">
|
||||||
|
<div class="col-span-6 sm:col-span-4">
|
||||||
|
<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-error for="formData.year" class="mt-2"/>
|
||||||
|
</div><div class="col-span-6 sm:col-span-4">
|
||||||
|
<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-error for="formData.week" class="mt-2"/>
|
||||||
|
<x-input-error for="formData" class="mt-2"/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<span class="whitespace-nowrap">{!! $manager->dateRange !!}</span>
|
||||||
|
</div>
|
||||||
|
</x-slot>
|
||||||
|
|
||||||
|
<x-slot name="actions">
|
||||||
|
<x-action-message class="mr-3" on="saved">
|
||||||
|
{{ __('Saved.') }}
|
||||||
|
</x-action-message>
|
||||||
|
|
||||||
|
<x-secondary-button class="mr-3"
|
||||||
|
type="button"
|
||||||
|
x-on:click="$wire.showCreateModal = false"
|
||||||
|
>
|
||||||
|
{{ __('Cancel') }}
|
||||||
|
</x-secondary-button>
|
||||||
|
<x-button wire:loading.disabled>
|
||||||
|
{{ __('Save') }}
|
||||||
|
</x-button>
|
||||||
|
|
||||||
|
</x-slot>
|
||||||
|
</x-form-modal>
|
||||||
|
</x-modal>
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
<div>
|
||||||
|
<div class="px-4 sm:px-6 lg:px-8">
|
||||||
|
<div class="sm:flex sm:items-center">
|
||||||
|
<div class="sm:flex-auto">
|
||||||
|
<h1 class="text-base font-semibold leading-6 text-gray-900">Reports</h1>
|
||||||
|
<p class="mt-2 text-sm text-gray-700"></p>
|
||||||
|
</div>
|
||||||
|
<div class="mt-4 sm:ml-16 sm:mt-0 sm:flex-none">
|
||||||
|
<x-button wire:click="openCreateMosiacsModal"
|
||||||
|
class="block rounded-md bg-indigo-600 px-3 py-2 text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600">
|
||||||
|
Create Mosaic
|
||||||
|
</x-button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mt-8 flow-root">
|
||||||
|
<div class="-mx-4 -my-2 overflow-x-auto sm:-mx-6 lg:-mx-8">
|
||||||
|
<div class="inline-block min-w-full py-2 align-middle">
|
||||||
|
<table class="min-w-full divide-y divide-gray-300">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col"
|
||||||
|
class="py-3.5 pl-4 pr-3 text-left text-sm font-semibold text-gray-900 sm:pl-6 lg:pl-8">
|
||||||
|
Name
|
||||||
|
</th>
|
||||||
|
<th scope="col" class="px-3 py-3.5 text-left text-sm font-semibold text-gray-900">
|
||||||
|
Status
|
||||||
|
</th>
|
||||||
|
<th scope="col" class="relative py-3.5 pl-3 pr-4 sm:pr-6 lg:pr-8">
|
||||||
|
<span class="sr-only">Edit</span>
|
||||||
|
</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody class="divide-y divide-gray-200 bg-white">
|
||||||
|
@foreach($project->getMosaicList() as $mosaic)
|
||||||
|
<tr>
|
||||||
|
<td class="whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-6 lg:pl-8">{{ $project->name }}</td>
|
||||||
|
<td class="whitespace-nowrap px-3 py-4 text-sm text-gray-500">
|
||||||
|
{{ $mosaic }}
|
||||||
|
</td>
|
||||||
|
<td class="relative whitespace-nowrap py-4 pl-3 pr-4 text-right text-sm font-medium sm:pr-6 lg:pr-8">
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<x-mosaic-create-modal :manager="$this"/>
|
||||||
|
</div>
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
<div>
|
<div>
|
||||||
|
|
||||||
|
|
||||||
<div class="px-4 sm:px-6 lg:px-8">
|
<div class="px-4 sm:px-6 lg:px-8">
|
||||||
<div class="sm:flex sm:items-center">
|
<div class="sm:flex sm:items-center">
|
||||||
<div class="sm:flex-auto">
|
<div class="sm:flex-auto">
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,11 @@
|
||||||
:class="$tab.isSelected ? 'border-gray-200 bg-white' : 'border-transparent'"
|
:class="$tab.isSelected ? 'border-gray-200 bg-white' : 'border-transparent'"
|
||||||
class="inline-flex rounded-l-md border-t border-l border-b px-5 py-2.5"
|
class="inline-flex rounded-l-md border-t border-l border-b px-5 py-2.5"
|
||||||
>{{ __('Downloads') }}</button>
|
>{{ __('Downloads') }}</button>
|
||||||
|
<button x-tabs:tab type="button"
|
||||||
|
data-tab-name="mosaics"
|
||||||
|
:class="$tab.isSelected ? 'border-gray-200 bg-white' : 'border-transparent'"
|
||||||
|
class="inline-flex rounded-l-md border-t border-l border-b px-5 py-2.5"
|
||||||
|
>{{ __('Mosaic') }}</button>
|
||||||
<button x-tabs:tab type="button"
|
<button x-tabs:tab type="button"
|
||||||
data-tab-name="mailing"
|
data-tab-name="mailing"
|
||||||
:class="$tab.isSelected ? 'border-gray-200 bg-white' : 'border-transparent'"
|
:class="$tab.isSelected ? 'border-gray-200 bg-white' : 'border-transparent'"
|
||||||
|
|
@ -28,7 +33,9 @@ class="inline-flex rounded-l-md border-t border-l border-b px-5 py-2.5"
|
||||||
<section x-tabs:panel class="p-8">
|
<section x-tabs:panel class="p-8">
|
||||||
<livewire:projects.download-manager :project="$project" />
|
<livewire:projects.download-manager :project="$project" />
|
||||||
</section>
|
</section>
|
||||||
|
<section x-tabs:panel class="p-8">
|
||||||
|
<livewire:projects.mosaic-manager :project="$project" />
|
||||||
|
</section>
|
||||||
<section x-tabs:panel class="p-8">
|
<section x-tabs:panel class="p-8">
|
||||||
<livewire:projects.mailing-manager :project="$project" />
|
<livewire:projects.mailing-manager :project="$project" />
|
||||||
</section>
|
</section>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,94 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Tests\Unit\Rules;
|
||||||
|
|
||||||
|
use App\Models\Project;
|
||||||
|
|
||||||
|
use App\Rules\AllMergedTiffsPresentRule;
|
||||||
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
use Mockery;
|
||||||
|
use Tests\TestCase;
|
||||||
|
|
||||||
|
class AllMergedTiffsPresentRuleTest extends TestCase
|
||||||
|
{
|
||||||
|
use RefreshDatabase;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
parent::setUp(); // TODO: Change the autogenerated stub
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test
|
||||||
|
*/
|
||||||
|
public function validatesCorrectValue()
|
||||||
|
{
|
||||||
|
$project = Project::create([
|
||||||
|
'name' => 'Test project',
|
||||||
|
'mail_template' => 'Test mail template',
|
||||||
|
'mail_subject' => 'Test mail subject',
|
||||||
|
'mail_frequency' => 'Test mail frequency',
|
||||||
|
'mail_day' => 'Friday',
|
||||||
|
'download_path' => 'test_project',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$projectMock = Mockery::mock($project)->makePartial();
|
||||||
|
|
||||||
|
$projectMock->shouldReceive('getMergedTiffList')->andReturn(
|
||||||
|
collect([
|
||||||
|
"chemba/merged_tiff/2021-01-04.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-05.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-06.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-07.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-08.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-09.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-10.tif",
|
||||||
|
]));
|
||||||
|
|
||||||
|
$rule = new AllMergedTiffsPresentRule($projectMock);
|
||||||
|
|
||||||
|
$this->assertTrue($rule->passes(
|
||||||
|
'attribute',
|
||||||
|
['year' => '2021', 'week' => '1']
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInvalidatesIncorrectValue()
|
||||||
|
{
|
||||||
|
$project = Project::create([
|
||||||
|
'name' => 'Test project',
|
||||||
|
'mail_template' => 'Test mail template',
|
||||||
|
'mail_subject' => 'Test mail subject',
|
||||||
|
'mail_frequency' => 'Test mail frequency',
|
||||||
|
'mail_day' => 'Friday',
|
||||||
|
'download_path' => 'test_project',
|
||||||
|
]);
|
||||||
|
|
||||||
|
$projectMock = Mockery::mock($project)->makePartial();
|
||||||
|
|
||||||
|
$projectMock->shouldReceive('getMergedTiffList')->andReturn(
|
||||||
|
collect([
|
||||||
|
// "chemba/merged_tiff/2021-01-04.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-05.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-06.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-07.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-08.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-09.tif",
|
||||||
|
"chemba/merged_tiff/2021-01-10.tif",
|
||||||
|
]));
|
||||||
|
|
||||||
|
|
||||||
|
$rule = new AllMergedTiffsPresentRule($projectMock);
|
||||||
|
|
||||||
|
$this->assertFalse($rule->passes(
|
||||||
|
'attribute',
|
||||||
|
['year' => '2021', 'week' => '1']
|
||||||
|
));
|
||||||
|
$this->assertEquals(
|
||||||
|
'Missing merged tiffs: 2021-01-04',
|
||||||
|
$rule->message()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -335,6 +335,8 @@
|
||||||
" # Adjust the number of days needed\n",
|
" # Adjust the number of days needed\n",
|
||||||
"\n",
|
"\n",
|
||||||
"end = datetime.date.today()\n",
|
"end = datetime.date.today()\n",
|
||||||
|
"#end = datetime.datetime(2023, 11, 10)\n",
|
||||||
|
"#start = datetime.datetime(2023, 10, 19)\n",
|
||||||
"start = end - datetime.timedelta(days=days_needed - 1)\n",
|
"start = end - datetime.timedelta(days=days_needed - 1)\n",
|
||||||
"\n",
|
"\n",
|
||||||
"slots = [(start + datetime.timedelta(days=i)).strftime('%Y-%m-%d') for i in range(days_needed)]\n",
|
"slots = [(start + datetime.timedelta(days=i)).strftime('%Y-%m-%d') for i in range(days_needed)]\n",
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,21 @@ library(exactextractr)
|
||||||
|
|
||||||
library(CIprep)
|
library(CIprep)
|
||||||
|
|
||||||
|
# Vang alle command line argumenten op
|
||||||
|
args <- commandArgs(trailingOnly = TRUE)
|
||||||
|
|
||||||
|
# Controleer of er ten minste één argument is doorgegeven
|
||||||
|
if (length(args) == 0) {
|
||||||
|
stop("Geen argumenten doorgegeven aan het script")
|
||||||
|
}
|
||||||
|
|
||||||
|
# Converteer het eerste argument naar een numerieke waarde
|
||||||
|
weeks_ago <- as.numeric(args[1])
|
||||||
|
|
||||||
|
# Controleer of weeks_ago een geldig getal is
|
||||||
|
if (is.na(weeks_ago)) {
|
||||||
|
stop("Het argument is geen geldig getal")
|
||||||
|
}
|
||||||
|
|
||||||
laravel_storage_dir <- here("../laravel_app/storage/app")
|
laravel_storage_dir <- here("../laravel_app/storage/app")
|
||||||
#preparing directories
|
#preparing directories
|
||||||
|
|
@ -38,13 +52,13 @@ dir.create(merged_final)
|
||||||
|
|
||||||
|
|
||||||
# Creating weekly mosaic
|
# Creating weekly mosaic
|
||||||
dates <- date_list(0)
|
dates <- date_list(weeks_ago)
|
||||||
|
head(dates)
|
||||||
|
print(planet_tif_folder)
|
||||||
|
|
||||||
#load pivot geojson
|
#load pivot geojson
|
||||||
pivot_sf_q <- st_read(here( "pivot_20210625.geojson")) %>% dplyr::select(pivot, pivot_quadrant) %>% vect()
|
pivot_sf_q <- st_read(here( "pivot_20210625.geojson")) %>% dplyr::select(pivot, pivot_quadrant) %>% vect()
|
||||||
|
|
||||||
#load and filter raster files
|
|
||||||
raster_files <- list.files(planet_tif_folder,full.names = T, pattern = ".tif") #use pattern = '.tif$' or something else if you have multiple files in this folder
|
|
||||||
filtered_files <- map(dates$days_filter, ~ raster_files[grepl(pattern = .x, x = raster_files)]) %>%
|
filtered_files <- map(dates$days_filter, ~ raster_files[grepl(pattern = .x, x = raster_files)]) %>%
|
||||||
compact() %>%
|
compact() %>%
|
||||||
flatten_chr()
|
flatten_chr()
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
# title: paste0("CI report week ", week, " - all pivots from ", last_tuesday, " to ", today)
|
# title: paste0("CI report week ", week, " - all pivots from ", last_tuesday, " to ", today)
|
||||||
params:
|
params:
|
||||||
ref: word-styles-reference-03.docx
|
ref: word-styles-reference-03.docx
|
||||||
|
output_file: "CI_report.docx"
|
||||||
|
report_date: "2023-12-12"
|
||||||
output:
|
output:
|
||||||
word_document:
|
word_document:
|
||||||
reference_docx: !expr file.path("word-styles-reference-03.docx")
|
reference_docx: !expr file.path("word-styles-reference-03.docx")
|
||||||
|
|
@ -11,6 +13,12 @@ editor_options:
|
||||||
---
|
---
|
||||||
|
|
||||||
```{r setup, include=FALSE}
|
```{r setup, include=FALSE}
|
||||||
|
#set de filename van de output
|
||||||
|
knitr::opts_chunk$set(echo = TRUE)
|
||||||
|
output_file <- params$output_file
|
||||||
|
report_date <- params$report_date
|
||||||
|
|
||||||
|
|
||||||
# Activeer de renv omgeving
|
# Activeer de renv omgeving
|
||||||
renv::activate()
|
renv::activate()
|
||||||
|
|
||||||
|
|
@ -50,12 +58,13 @@ s2_dir <- "C:/Users/timon/Resilience BV/4002 CMD App - General/4002 CMD Team/400
|
||||||
|
|
||||||
```{r week, message=FALSE, warning=FALSE, include=FALSE}
|
```{r week, message=FALSE, warning=FALSE, include=FALSE}
|
||||||
# week <- 5
|
# week <- 5
|
||||||
# today = "2023-10-08"
|
#today = "2023-12-12"
|
||||||
# week <- week(today)
|
today <- as.character(report_date)
|
||||||
|
week <- week(today)
|
||||||
#today = "2022-08-18"
|
#today = "2022-08-18"
|
||||||
|
|
||||||
today = as.character(Sys.Date())
|
#today = as.character(Sys.Date())
|
||||||
week = lubridate::week(Sys.time())
|
#week = lubridate::week(Sys.time())
|
||||||
## week = 26
|
## week = 26
|
||||||
title_var <- paste0("CI dashboard week ", week, " - all pivots dashboard using 3x3 meter resolution")
|
title_var <- paste0("CI dashboard week ", week, " - all pivots dashboard using 3x3 meter resolution")
|
||||||
```
|
```
|
||||||
|
|
@ -97,7 +106,6 @@ last_week_dif_raster <- ((CI - CI_m1) / CI_m1) * 100
|
||||||
last_week_dif_raster_abs <- (CI - CI_m1)
|
last_week_dif_raster_abs <- (CI - CI_m1)
|
||||||
two_week_dif_raster_abs <- (CI - CI_m2)
|
two_week_dif_raster_abs <- (CI - CI_m2)
|
||||||
|
|
||||||
|
|
||||||
AllPivots0 <-st_read(here(data_dir, "pivot_20210625.geojson"))
|
AllPivots0 <-st_read(here(data_dir, "pivot_20210625.geojson"))
|
||||||
joined_spans <-st_read(here(data_dir, "spans2.geojson")) %>% st_transform(crs(AllPivots0))
|
joined_spans <-st_read(here(data_dir, "spans2.geojson")) %>% st_transform(crs(AllPivots0))
|
||||||
|
|
||||||
|
|
|
||||||
BIN
r_app/Rplots.pdf
BIN
r_app/Rplots.pdf
Binary file not shown.
7
renv/.gitignore
vendored
Normal file
7
renv/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
library/
|
||||||
|
local/
|
||||||
|
cellar/
|
||||||
|
lock/
|
||||||
|
python/
|
||||||
|
sandbox/
|
||||||
|
staging/
|
||||||
1180
renv/activate.R
Normal file
1180
renv/activate.R
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
output_file=${1:-"standaard_naam.html"}
|
||||||
|
ref=${2:-"word-styles-reference-03.docx"}
|
||||||
# Directory waar de virtuele omgeving zal worden aangemaakt
|
# Directory waar de virtuele omgeving zal worden aangemaakt
|
||||||
#VENV_DIR="./python_app/myenv"
|
#VENV_DIR="./python_app/myenv"
|
||||||
|
|
||||||
|
|
@ -18,5 +21,6 @@ Rscript 2_CI_data_prep.R
|
||||||
#
|
#
|
||||||
## Runnen van Rmd bestand
|
## Runnen van Rmd bestand
|
||||||
# -e betekent "evalueren" en -i specificeert de input file
|
# -e betekent "evalueren" en -i specificeert de input file
|
||||||
Rscript -e "rmarkdown::render('CI_report_dashboard_planet.Rmd', 'all')"
|
#Rscript -e "rmarkdown::render('CI_report_dashboard_planet.Rmd', 'all')"
|
||||||
|
Rscript -e "rmarkdown::render('CI_report_dashboard_planet.Rmd', output_file='$output_file', params=list(ref='$ref'))"
|
||||||
cd ..
|
cd ..
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# Standaardwaarde voor days
|
# Standaardwaarde voor days
|
||||||
days=28
|
days=7
|
||||||
|
|
||||||
# Loop door alle argumenten
|
# Loop door alle argumenten
|
||||||
for arg in "$@"
|
for arg in "$@"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue