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

This commit is contained in:
nobohan 2023-03-16 10:43:01 +01:00
parent 331443ae12
commit bf79e0afdb

View File

@ -11,6 +11,7 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Service\DocGenerator; namespace Chill\ActivityBundle\Service\DocGenerator;
use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Entity\ActivityPresence; use Chill\ActivityBundle\Entity\ActivityPresence;
use Chill\ActivityBundle\Entity\ActivityType; use Chill\ActivityBundle\Entity\ActivityType;
use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface; use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface;
@ -37,6 +38,8 @@ use libphonenumber\PhoneNumber;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Security\Core\Security;
class ListActivitiesByAccompanyingPeriodContext implements class ListActivitiesByAccompanyingPeriodContext implements
DocGeneratorContextWithAdminFormInterface, DocGeneratorContextWithAdminFormInterface,
@ -60,6 +63,8 @@ class ListActivitiesByAccompanyingPeriodContext implements
private UserRepository $userRepository; private UserRepository $userRepository;
private Security $security;
public function __construct( public function __construct(
AccompanyingPeriodContext $accompanyingPeriodContext, AccompanyingPeriodContext $accompanyingPeriodContext,
ActivityACLAwareRepositoryInterface $activityACLAwareRepository, ActivityACLAwareRepositoryInterface $activityACLAwareRepository,
@ -69,7 +74,8 @@ class ListActivitiesByAccompanyingPeriodContext implements
SocialIssueRepository $socialIssueRepository, SocialIssueRepository $socialIssueRepository,
ThirdPartyRepository $thirdPartyRepository, ThirdPartyRepository $thirdPartyRepository,
TranslatableStringHelperInterface $translatableStringHelper, TranslatableStringHelperInterface $translatableStringHelper,
UserRepository $userRepository UserRepository $userRepository,
Security $security
) { ) {
$this->accompanyingPeriodContext = $accompanyingPeriodContext; $this->accompanyingPeriodContext = $accompanyingPeriodContext;
$this->activityACLAwareRepository = $activityACLAwareRepository; $this->activityACLAwareRepository = $activityACLAwareRepository;
@ -80,6 +86,7 @@ class ListActivitiesByAccompanyingPeriodContext implements
$this->thirdPartyRepository = $thirdPartyRepository; $this->thirdPartyRepository = $thirdPartyRepository;
$this->translatableStringHelper = $translatableStringHelper; $this->translatableStringHelper = $translatableStringHelper;
$this->userRepository = $userRepository; $this->userRepository = $userRepository;
$this->security = $security;
} }
public function adminFormReverseTransform(array $data): array public function adminFormReverseTransform(array $data): array
@ -95,6 +102,12 @@ class ListActivitiesByAccompanyingPeriodContext implements
public function buildAdminForm(FormBuilderInterface $builder): void public function buildAdminForm(FormBuilderInterface $builder): void
{ {
$this->accompanyingPeriodContext->buildAdminForm($builder); $this->accompanyingPeriodContext->buildAdminForm($builder);
$builder
->add('myActivityOnly', CheckboxType::class, [
'required' => false,
'label' => 'docgen.myActivityOnly',
]);
} }
public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void
@ -104,9 +117,9 @@ 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);
$data['activities'] = $this->getActivitiesSimplified($entity);
return $data; return $data;
} }
@ -161,12 +174,25 @@ class ListActivitiesByAccompanyingPeriodContext implements
$this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData); $this->accompanyingPeriodContext->storeGenerated($template, $storedObject, $entity, $contextGenerationData);
} }
private function getActivitiesSimplified(AccompanyingPeriod $period) private function getActivitiesSimplified(AccompanyingPeriod $period, bool $myActivityOnly)
{ {
$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];