mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-07 18:44:08 +00:00
Merge branch 'issue707_docgen_filter_activity_by_user' into 'master'
Feature: allow filtering activities in docgen for acc course by logged user See merge request Chill-Projet/chill-bundles!507
This commit is contained in:
commit
1ecb285687
@ -147,6 +147,32 @@ class ActivityContext implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
||||||
|
{
|
||||||
|
$denormalized = [];
|
||||||
|
|
||||||
|
foreach (['mainPerson', 'person1', 'person2'] as $k) {
|
||||||
|
if (null !== ($id = ($data[$k] ?? null))) {
|
||||||
|
$denormalized[$k] = $this->personRepository->find($id);
|
||||||
|
} else {
|
||||||
|
$denormalized[$k] = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $denormalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
||||||
|
{
|
||||||
|
$normalized = [];
|
||||||
|
|
||||||
|
foreach (['mainPerson', 'person1', 'person2'] as $k) {
|
||||||
|
$normalized[$k] = null === $data[$k] ? null : $data[$k]->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
return $normalized;
|
||||||
|
}
|
||||||
|
|
||||||
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
|
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
|
||||||
{
|
{
|
||||||
if (!$entity instanceof Activity) {
|
if (!$entity instanceof Activity) {
|
||||||
@ -214,32 +240,6 @@ class ActivityContext implements
|
|||||||
return $options['mainPerson'] || $options['person1'] || $options['person2'];
|
return $options['mainPerson'] || $options['person1'] || $options['person2'];
|
||||||
}
|
}
|
||||||
|
|
||||||
public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
|
||||||
{
|
|
||||||
$normalized = [];
|
|
||||||
|
|
||||||
foreach (['mainPerson', 'person1', 'person2'] as $k) {
|
|
||||||
$normalized[$k] = null === $data[$k] ? null : $data[$k]->getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $normalized;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
|
||||||
{
|
|
||||||
$denormalized = [];
|
|
||||||
|
|
||||||
foreach (['mainPerson', 'person1', 'person2'] as $k) {
|
|
||||||
if (null !== ($id = ($data[$k] ?? null))) {
|
|
||||||
$denormalized[$k] = $this->personRepository->find($id);
|
|
||||||
} else {
|
|
||||||
$denormalized[$k] = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $denormalized;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
||||||
{
|
{
|
||||||
$storedObject->setTitle($this->translatableStringHelper->localize($template->getName()));
|
$storedObject->setTitle($this->translatableStringHelper->localize($template->getName()));
|
||||||
|
@ -34,10 +34,16 @@ use Chill\ThirdPartyBundle\Entity\ThirdParty;
|
|||||||
use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository;
|
use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository;
|
||||||
use DateTime;
|
use DateTime;
|
||||||
use libphonenumber\PhoneNumber;
|
use libphonenumber\PhoneNumber;
|
||||||
|
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
|
||||||
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 function in_array;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @implements DocGeneratorContextWithPublicFormInterface<AccompanyingPeriod>
|
||||||
|
* @implements DocGeneratorContextWithAdminFormInterface<AccompanyingPeriod>
|
||||||
|
*/
|
||||||
class ListActivitiesByAccompanyingPeriodContext implements
|
class ListActivitiesByAccompanyingPeriodContext implements
|
||||||
DocGeneratorContextWithAdminFormInterface,
|
DocGeneratorContextWithAdminFormInterface,
|
||||||
DocGeneratorContextWithPublicFormInterface
|
DocGeneratorContextWithPublicFormInterface
|
||||||
@ -69,7 +75,7 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
SocialIssueRepository $socialIssueRepository,
|
SocialIssueRepository $socialIssueRepository,
|
||||||
ThirdPartyRepository $thirdPartyRepository,
|
ThirdPartyRepository $thirdPartyRepository,
|
||||||
TranslatableStringHelperInterface $translatableStringHelper,
|
TranslatableStringHelperInterface $translatableStringHelper,
|
||||||
UserRepository $userRepository
|
UserRepository $userRepository,
|
||||||
) {
|
) {
|
||||||
$this->accompanyingPeriodContext = $accompanyingPeriodContext;
|
$this->accompanyingPeriodContext = $accompanyingPeriodContext;
|
||||||
$this->activityACLAwareRepository = $activityACLAwareRepository;
|
$this->activityACLAwareRepository = $activityACLAwareRepository;
|
||||||
@ -100,14 +106,86 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void
|
public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void
|
||||||
{
|
{
|
||||||
$this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity);
|
$this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity);
|
||||||
|
|
||||||
|
$builder
|
||||||
|
->add('myActivitiesOnly', CheckboxType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'docgen.myActivitiesOnly',
|
||||||
|
])
|
||||||
|
->add('myWorksOnly', CheckboxType::class, [
|
||||||
|
'required' => false,
|
||||||
|
'label' => 'docgen.myWorksOnly',
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
|
public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
||||||
|
{
|
||||||
|
|
||||||
|
$denormalized = $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data);
|
||||||
|
|
||||||
|
foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) {
|
||||||
|
$denormalized[$k] = $data[$k];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $denormalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
||||||
|
{
|
||||||
|
$normalized = $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data);
|
||||||
|
|
||||||
|
foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) {
|
||||||
|
$normalized[$k] = $data[$k] ?? false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function filterActivitiesByUser(array $activities, User $user): array
|
||||||
|
{
|
||||||
|
return array_filter(
|
||||||
|
$activities,
|
||||||
|
function ($activity) use ($user) {
|
||||||
|
$activityUsernames = array_map(static function ($user) {
|
||||||
|
return $user['username'];
|
||||||
|
}, $activity['users'] ?? []);
|
||||||
|
return in_array($user->getUsername(), $activityUsernames, true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function filterWorksByUser(array $works, User $user): array
|
||||||
|
{
|
||||||
|
return array_filter(
|
||||||
|
$works,
|
||||||
|
function ($work) use ($user) {
|
||||||
|
$workUsernames = array_map(static function ($user) {
|
||||||
|
return $user['username'];
|
||||||
|
}, $work['referrers'] ?? []);
|
||||||
|
|
||||||
|
return in_array($user->getUsername(), $workUsernames, true);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getData(DocGeneratorTemplate $template, object $entity, array $contextGenerationData = []): array
|
||||||
{
|
{
|
||||||
$data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData);
|
$data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData);
|
||||||
|
|
||||||
$data['activities'] = $this->getActivitiesSimplified($entity);
|
$activities = $this->getActivitiesSimplified($entity);
|
||||||
|
$myActivitiesOnly = $contextGenerationData['myActivitiesOnly'];
|
||||||
|
|
||||||
|
if ($myActivitiesOnly && isset($contextGenerationData['creator'])) {
|
||||||
|
$activities = $this->filterActivitiesByUser($activities, $contextGenerationData['creator']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data['activities'] = $activities;
|
||||||
|
|
||||||
|
$myWorksOnly = $contextGenerationData['myWorksOnly'];
|
||||||
|
|
||||||
|
if ($myWorksOnly && isset($contextGenerationData['creator'])) {
|
||||||
|
$data['course']['works'] = $this->filterWorksByUser($data['course']['works'], $contextGenerationData['creator']);
|
||||||
|
}
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,17 +221,7 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
|
|
||||||
public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool
|
public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool
|
||||||
{
|
{
|
||||||
return $this->accompanyingPeriodContext->hasPublicForm($template, $entity);
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
|
||||||
{
|
|
||||||
return $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array
|
|
||||||
{
|
|
||||||
return $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
||||||
|
@ -326,9 +326,11 @@ This is the minimal activity data: Activité n°
|
|||||||
|
|
||||||
docgen:
|
docgen:
|
||||||
Activity basic: Echange
|
Activity basic: Echange
|
||||||
A basic context for activity: Contexte pour les activités
|
A basic context for activity: Contexte pour les échanges
|
||||||
Accompanying period with a list of activities: Parcours d'accompagnement avec liste des activités
|
Accompanying period with a list of activities: Parcours d'accompagnement avec liste des échanges
|
||||||
Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les activités pour un parcours. Les activités ne sont pas filtrés.
|
Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les échanges pour un parcours. Les échanges ne sont pas filtrés.
|
||||||
|
myActivitiesOnly: Prendre en compte uniquement les échanges dans lesquels je suis intervenu
|
||||||
|
myWorksOnly: Prendre en compte uniquement les actions d'accompagnement dont je suis référent
|
||||||
|
|
||||||
export:
|
export:
|
||||||
list:
|
list:
|
||||||
|
@ -31,8 +31,6 @@ use Symfony\Component\Form\FormBuilderInterface;
|
|||||||
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
|
||||||
use function count;
|
use function count;
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
final class CalendarContext implements CalendarContextInterface
|
final class CalendarContext implements CalendarContextInterface
|
||||||
{
|
{
|
||||||
private BaseContextData $baseContextData;
|
private BaseContextData $baseContextData;
|
||||||
@ -150,10 +148,8 @@ final class CalendarContext implements CalendarContextInterface
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* param array{mainPerson?: Person, thirdParty?: ThirdParty, title: string} $contextGenerationData
|
|
||||||
* @param mixed $entity
|
|
||||||
*/
|
*/
|
||||||
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array
|
public function getData(DocGeneratorTemplate $template, mixed $entity, array $contextGenerationData = []): array
|
||||||
{
|
{
|
||||||
$options = $this->getOptions($template);
|
$options = $this->getOptions($template);
|
||||||
|
|
||||||
@ -274,9 +270,6 @@ final class CalendarContext implements CalendarContextInterface
|
|||||||
return $denormalized;
|
return $denormalized;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* param array{mainPerson?: Person, thirdParty?: ThirdParty, title: string} $contextGenerationData
|
|
||||||
*/
|
|
||||||
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void
|
||||||
{
|
{
|
||||||
$options = $this->getOptions($template);
|
$options = $this->getOptions($template);
|
||||||
@ -287,9 +280,6 @@ final class CalendarContext implements CalendarContextInterface
|
|||||||
$this->entityManager->persist($doc);
|
$this->entityManager->persist($doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* return array{askMainPerson: bool, mainPersonLabel: ?string, askThirdParty: bool, thirdPartyLabel: ?string, trackDateTime: bool} $options
|
|
||||||
*/
|
|
||||||
private function getOptions(DocGeneratorTemplate $template): array
|
private function getOptions(DocGeneratorTemplate $template): array
|
||||||
{
|
{
|
||||||
return $template->getOptions();
|
return $template->getOptions();
|
||||||
|
@ -12,6 +12,7 @@ declare(strict_types=1);
|
|||||||
namespace Chill\CalendarBundle\Service\DocGenerator;
|
namespace Chill\CalendarBundle\Service\DocGenerator;
|
||||||
|
|
||||||
use Chill\CalendarBundle\Entity\Calendar;
|
use Chill\CalendarBundle\Entity\Calendar;
|
||||||
|
use Chill\DocGeneratorBundle\Context\DocGeneratorContextInterface;
|
||||||
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithAdminFormInterface;
|
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithAdminFormInterface;
|
||||||
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface;
|
use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface;
|
||||||
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
|
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
|
||||||
@ -19,37 +20,9 @@ use Chill\DocStoreBundle\Entity\StoredObject;
|
|||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @template-extends DocGeneratorContextWithPublicFormInterface<Calendar>
|
* @extends DocGeneratorContextWithPublicFormInterface<Calendar>
|
||||||
|
* @extends DocGeneratorContextWithAdminFormInterface<Calendar>
|
||||||
*/
|
*/
|
||||||
interface CalendarContextInterface extends DocGeneratorContextWithPublicFormInterface, DocGeneratorContextWithAdminFormInterface
|
interface CalendarContextInterface extends DocGeneratorContextWithPublicFormInterface, DocGeneratorContextWithAdminFormInterface
|
||||||
{
|
{
|
||||||
public function adminFormReverseTransform(array $data): array;
|
|
||||||
|
|
||||||
public function adminFormTransform(array $data): array;
|
|
||||||
|
|
||||||
public function buildAdminForm(FormBuilderInterface $builder): void;
|
|
||||||
|
|
||||||
public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void;
|
|
||||||
|
|
||||||
public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array;
|
|
||||||
|
|
||||||
public function getDescription(): string;
|
|
||||||
|
|
||||||
public function getEntityClass(): string;
|
|
||||||
|
|
||||||
public function getFormData(DocGeneratorTemplate $template, $entity): array;
|
|
||||||
|
|
||||||
public static function getKey(): string;
|
|
||||||
|
|
||||||
public function getName(): string;
|
|
||||||
|
|
||||||
public function hasAdminForm(): bool;
|
|
||||||
|
|
||||||
public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool;
|
|
||||||
|
|
||||||
public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array;
|
|
||||||
|
|
||||||
public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array;
|
|
||||||
|
|
||||||
public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void;
|
|
||||||
}
|
}
|
||||||
|
@ -13,6 +13,10 @@ namespace Chill\DocGeneratorBundle\Context;
|
|||||||
|
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @template T of object
|
||||||
|
* @extends DocGeneratorContextInterface<T>
|
||||||
|
*/
|
||||||
interface DocGeneratorContextWithAdminFormInterface extends DocGeneratorContextInterface
|
interface DocGeneratorContextWithAdminFormInterface extends DocGeneratorContextInterface
|
||||||
{
|
{
|
||||||
public function adminFormReverseTransform(array $data): array;
|
public function adminFormReverseTransform(array $data): array;
|
||||||
|
@ -15,7 +15,8 @@ use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
|
|||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @template T
|
* @template T of object
|
||||||
|
* @extends DocGeneratorContextInterface<T>
|
||||||
*/
|
*/
|
||||||
interface DocGeneratorContextWithPublicFormInterface extends DocGeneratorContextInterface
|
interface DocGeneratorContextWithPublicFormInterface extends DocGeneratorContextInterface
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user