Feature: allow filtering works in docgen for acc course by logged user

This commit is contained in:
nobohan 2023-03-16 14:29:51 +01:00
parent bf79e0afdb
commit 9ded3eb631

View File

@ -104,9 +104,13 @@ class ListActivitiesByAccompanyingPeriodContext implements
$this->accompanyingPeriodContext->buildAdminForm($builder); $this->accompanyingPeriodContext->buildAdminForm($builder);
$builder $builder
->add('myActivityOnly', CheckboxType::class, [ ->add('myActivitiesOnly', CheckboxType::class, [
'required' => false, 'required' => false,
'label' => 'docgen.myActivityOnly', 'label' => 'docgen.myActivitiesOnly',
])
->add('myWorksOnly', CheckboxType::class, [
'required' => false,
'label' => 'docgen.myWorksOnly',
]); ]);
} }
@ -117,13 +121,53 @@ class ListActivitiesByAccompanyingPeriodContext implements
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
{ {
$myActivityOnly = $template->getOptions()['myActivityOnly'];
$data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData);
$data['activities'] = $this->getActivitiesSimplified($entity, $myActivityOnly);
$activities = $this->getActivitiesSimplified($entity);
$myActivitiesOnly = $template->getOptions()['myActivitiesOnly'];
if ($myActivitiesOnly) {
$activities = $this->filterActivitiesByCurrentUser($activities);
}
$data['activities'] = $activities;
$myWorksOnly = $template->getOptions()['myWorksOnly'];
if ($myWorksOnly) {
$data['course']['works'] = $this->filterWorksByCurrentUser($data['course']['works']);
}
return $data; return $data;
} }
public function filterWorksByCurrentUser(array $works): array
{
return array_filter(
$works,
function ($work) {
$workUsernames = array_map(function ($user) {
return $user['username'];
}, $work['referrers'] ?? []);
return in_array($this->security->getUser()->getUsername(), $workUsernames);
}
);
}
public function filterActivitiesByCurrentUser(array $activities): array
{
return array_filter(
$activities,
function ($activity) {
$activityUsernames = array_map(function ($user) {
return $user['username'];
}, $activity['users'] ?? []);
return in_array($this->security->getUser()->getUsername(), $activityUsernames);
}
);
}
public function getDescription(): string public function getDescription(): string
{ {
return 'docgen.Accompanying period with a list of activities description'; return 'docgen.Accompanying period with a list of activities description';
@ -174,25 +218,12 @@ class ListActivitiesByAccompanyingPeriodContext implements
$this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData); $this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData);
} }
private function getActivitiesSimplified(AccompanyingPeriod $period, bool $myActivityOnly) private function getActivitiesSimplified(AccompanyingPeriod $period)
{ {
$activities = $activities =
$this->activityACLAwareRepository->findByAccompanyingPeriodSimplified($period); $this->activityACLAwareRepository->findByAccompanyingPeriodSimplified($period);
$results = []; $results = [];
if ($myActivityOnly) {
$activities = array_filter(
$activities,
function ($activity) {
$activity_usernames = array_map(function ($userId) {
return $this->userRepository->findOneBy(['id' => $userId])->getUsername();
}, $activity['userIds'] ?? []);
return in_array($this->security->getUser()->getUsername(), $activity_usernames);
}
);
}
foreach ($activities as $row) { foreach ($activities as $row) {
$activity = $row[0]; $activity = $row[0];