From 46755252253d42ffc581a7493cff71318f35c79e Mon Sep 17 00:00:00 2001 From: nobohan Date: Thu, 28 Apr 2022 17:34:53 +0200 Subject: [PATCH 1/3] [person] add maritalStatusComment to PersonDocGenNormalizer --- CHANGELOG.md | 4 +++- .../Serializer/Normalizer/PersonDocGenNormalizer.php | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 312c86971..ed24da1c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to ## Unreleased +* [person] add maritalStatusComment to PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/582s) + * [main] avoid address reference search on undefined post code (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/561) * [person] prevent duplicate relationship in filiation/household graph (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/560) * [Documents] Validate storedObject and allow for null data (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/565) @@ -35,7 +37,7 @@ and this project adheres to * [Accompanying period work evaluations] list documents associated to a work by creation date, and then by id, from the most recent to older * [Course comment] add validationConstraint NotNull and NotBlank on comment content, to avoid sql error * [Notifications] delay the sending of notificaiton to kernel.terminate -* [Notifications / Period user change] fix the sending of notification when user changes +* [Notifications / Period user change] fix the sending of notification when user changes * [Activity form] invert 'incoming' and 'receiving' in Activity form * [Activity form] keep the same order for 'attendee' field in new and edit form * [list with period] use "sameas" test operator to introduce requestor in list diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php index 89f01bf94..4fbfa8162 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php @@ -114,6 +114,7 @@ class PersonDocGenNormalizer implements 'gender' => $this->translator->trans($person->getGender()), 'maritalStatus' => null !== ($ms = $person->getMaritalStatus()) ? $this->translatableStringHelper->localize($ms->getName()) : '', 'maritalStatusDate' => $this->normalizer->normalize($person->getMaritalStatusDate(), $format, $dateContext), + 'maritalStatusComment' => $this->normalizer->normalize($person->getMaritalStatusComment(), $format, $dateContext), 'email' => $person->getEmail(), 'firstPhoneNumber' => $this->normalizer->normalize($person->getPhonenumber() ?? $person->getMobilenumber(), $format, $phonenumberContext), 'fixPhoneNumber' => $this->normalizer->normalize($person->getPhonenumber(), $format, $phonenumberContext), @@ -123,7 +124,7 @@ class PersonDocGenNormalizer implements 'memo' => $person->getMemo(), 'numberOfChildren' => (string) $person->getNumberOfChildren(), 'address' => $this->normalizer->normalize($person->getCurrentPersonAddress(), $format, $addressContext), - //'resources' => $this->normalizer->normalize($person->getResources(), $format, $personResourceContext), + 'resources' => $this->normalizer->normalize($person->getResources(), $format, $personResourceContext), ]; if ($context['docgen:person:with-household'] ?? false) { From 671950708ca83a90995336c55337a5ba8dcfb9fe Mon Sep 17 00:00:00 2001 From: nobohan Date: Fri, 29 Apr 2022 10:54:56 +0200 Subject: [PATCH 2/3] [person] prevent circular references in PersonDocGenNormalizer --- CHANGELOG.md | 3 +- .../Normalizer/PersonDocGenNormalizer.php | 44 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed24da1c1..a9e95a0d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,8 @@ and this project adheres to ## Unreleased -* [person] add maritalStatusComment to PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/582s) +* [person] prevent circular references in PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/527) +* [person] add maritalStatusComment to PersonDocGenNormalizer (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/582) * [main] avoid address reference search on undefined post code (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/561) * [person] prevent duplicate relationship in filiation/household graph (https://gitlab.com/champs-libres/departement-de-la-vendee/chill/-/issues/560) diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php index 4fbfa8162..d1d6f0a95 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php @@ -23,6 +23,7 @@ use Chill\PersonBundle\Repository\Relationships\RelationshipRepository; use Chill\PersonBundle\Templating\Entity\PersonRenderInterface; use DateTimeInterface; use Doctrine\Common\Collections\ArrayCollection; +use Doctrine\Common\DataFixtures\Exception\CircularReferenceException; use libphonenumber\PhoneNumber; use Symfony\Component\Serializer\Exception\UnexpectedValueException; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; @@ -52,6 +53,8 @@ class PersonDocGenNormalizer implements private TranslatorInterface $translator; + private const CIRCULAR_KEY = 'person:circular'; + public function __construct( PersonRenderInterface $personRender, RelationshipRepository $relationshipRepository, @@ -68,6 +71,17 @@ class PersonDocGenNormalizer implements public function normalize($person, $format = null, array $context = []) { + + try { + $context = $this->addCircularToContext($person, $context); + } catch (CircularReferenceException $circularReferenceException) { + return [ + 'isNull' => true, + 'isCircular' => true, + 'text' => '' + ]; + } + /** @var Person $person */ $dateContext = $context; $dateContext['docgen:expects'] = DateTimeInterface::class; @@ -178,6 +192,36 @@ class PersonDocGenNormalizer implements ); } + private function addCircularToContext($person, $context) { + if (null === $person) { + $key = 'n'; + } else { + $key = spl_object_hash($person); + } + + if (!\array_key_exists(self::CIRCULAR_KEY, $context)) { + $context[self::CIRCULAR_KEY] = [$key]; + + return $context; + } + + $occurences = array_reduce($context[self::CIRCULAR_KEY], function ($carry, $item) use ($key) { + if ($key === $item) { + $carry++; + } + return $carry; + }, 0); + + if (2 <= $occurences) { + throw new CircularReferenceException(); + } + + $context[self::CIRCULAR_KEY][] = $key; + + return $context; + } + + private function hasGroup($context, string $group): bool { $groups = $context[AbstractNormalizer::GROUPS] ?? []; From 99413cf32846aaf37c81130a302b9b18f9167c02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Fri, 29 Apr 2022 17:04:55 +0200 Subject: [PATCH 3/3] fix cs --- .../Normalizer/PersonDocGenNormalizer.php | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php index d1d6f0a95..22ce96ab7 100644 --- a/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php +++ b/src/Bundle/ChillPersonBundle/Serializer/Normalizer/PersonDocGenNormalizer.php @@ -32,6 +32,7 @@ use Symfony\Component\Serializer\Normalizer\NormalizerAwareInterface; use Symfony\Component\Serializer\Normalizer\NormalizerAwareTrait; use Symfony\Contracts\Translation\TranslatorInterface; +use function array_key_exists; use function array_map; use function implode; use function in_array; @@ -43,6 +44,8 @@ class PersonDocGenNormalizer implements { use NormalizerAwareTrait; + private const CIRCULAR_KEY = 'person:circular'; + private PersonRenderInterface $personRender; private RelationshipRepository $relationshipRepository; @@ -53,8 +56,6 @@ class PersonDocGenNormalizer implements private TranslatorInterface $translator; - private const CIRCULAR_KEY = 'person:circular'; - public function __construct( PersonRenderInterface $personRender, RelationshipRepository $relationshipRepository, @@ -71,14 +72,13 @@ class PersonDocGenNormalizer implements public function normalize($person, $format = null, array $context = []) { - try { $context = $this->addCircularToContext($person, $context); } catch (CircularReferenceException $circularReferenceException) { return [ 'isNull' => true, 'isCircular' => true, - 'text' => '' + 'text' => '', ]; } @@ -192,23 +192,25 @@ class PersonDocGenNormalizer implements ); } - private function addCircularToContext($person, $context) { + private function addCircularToContext($person, $context) + { if (null === $person) { $key = 'n'; } else { $key = spl_object_hash($person); } - if (!\array_key_exists(self::CIRCULAR_KEY, $context)) { + if (!array_key_exists(self::CIRCULAR_KEY, $context)) { $context[self::CIRCULAR_KEY] = [$key]; return $context; } - $occurences = array_reduce($context[self::CIRCULAR_KEY], function ($carry, $item) use ($key) { + $occurences = array_reduce($context[self::CIRCULAR_KEY], static function ($carry, $item) use ($key) { if ($key === $item) { - $carry++; + ++$carry; } + return $carry; }, 0); @@ -221,7 +223,6 @@ class PersonDocGenNormalizer implements return $context; } - private function hasGroup($context, string $group): bool { $groups = $context[AbstractNormalizer::GROUPS] ?? [];