From e7fcebc99ebd68c0a88f346bf27fff5f1ec798e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 9 Nov 2021 17:04:49 +0100 Subject: [PATCH] add some method for resolving scope in twig --- .../DataFixtures/ORM/LoadActivity.php | 2 ++ .../Authorization/PersonDocumentVoter.php | 25 ------------- .../Resolver/ResolverTwigExtension.php | 30 +++++++++++++--- .../Helper/RandomPersonHelperTrait.php | 35 +++++++++++++++++++ .../Resources/views/Entity/person.html.twig | 10 +++++- .../Controller/SingleTaskController.php | 12 ------- 6 files changed, 71 insertions(+), 43 deletions(-) create mode 100644 src/Bundle/ChillPersonBundle/DataFixtures/Helper/RandomPersonHelperTrait.php diff --git a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php index a23b2d73f..15db14b75 100644 --- a/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php +++ b/src/Bundle/ChillActivityBundle/DataFixtures/ORM/LoadActivity.php @@ -22,6 +22,7 @@ namespace Chill\ActivityBundle\DataFixtures\ORM; +use Chill\PersonBundle\DataFixtures\Helper\RandomPersonHelperTrait; use Doctrine\Common\DataFixtures\AbstractFixture; use Doctrine\Common\DataFixtures\OrderedFixtureInterface; use Doctrine\Persistence\ObjectManager; @@ -41,6 +42,7 @@ use Symfony\Component\DependencyInjection\ContainerAwareInterface; class LoadActivity extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface { use \Symfony\Component\DependencyInjection\ContainerAwareTrait; + use RandomPersonHelperTrait; /** * @var \Faker\Generator diff --git a/src/Bundle/ChillDocStoreBundle/Security/Authorization/PersonDocumentVoter.php b/src/Bundle/ChillDocStoreBundle/Security/Authorization/PersonDocumentVoter.php index 3eb21ed19..73254278b 100644 --- a/src/Bundle/ChillDocStoreBundle/Security/Authorization/PersonDocumentVoter.php +++ b/src/Bundle/ChillDocStoreBundle/Security/Authorization/PersonDocumentVoter.php @@ -1,44 +1,19 @@ . - */ - namespace Chill\DocStoreBundle\Security\Authorization; -use App\Security\Authorization\VoterHelperFactory; use Chill\MainBundle\Security\Authorization\AbstractChillVoter; -use Chill\MainBundle\Security\Authorization\AuthorizationHelper; use Chill\MainBundle\Security\Authorization\VoterHelperFactoryInterface; use Chill\MainBundle\Security\Authorization\VoterHelperInterface; use Chill\MainBundle\Security\ProvideRoleHierarchyInterface; use Chill\DocStoreBundle\Entity\PersonDocument; -use Chill\MainBundle\Security\Resolver\CenterResolverDispatcher; use Chill\PersonBundle\Entity\Person; use Chill\MainBundle\Entity\User; use Chill\PersonBundle\Security\Authorization\PersonVoter; -use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; -use Symfony\Component\Security\Core\Role\Role; use Psr\Log\LoggerInterface; use Symfony\Component\Security\Core\Security; -/** - * - */ class PersonDocumentVoter extends AbstractChillVoter implements ProvideRoleHierarchyInterface { const CREATE = 'CHILL_PERSON_DOCUMENT_CREATE'; diff --git a/src/Bundle/ChillMainBundle/Security/Resolver/ResolverTwigExtension.php b/src/Bundle/ChillMainBundle/Security/Resolver/ResolverTwigExtension.php index 21ece21a3..c8fdea5ff 100644 --- a/src/Bundle/ChillMainBundle/Security/Resolver/ResolverTwigExtension.php +++ b/src/Bundle/ChillMainBundle/Security/Resolver/ResolverTwigExtension.php @@ -7,19 +7,20 @@ use Twig\TwigFilter; final class ResolverTwigExtension extends \Twig\Extension\AbstractExtension { private CenterResolverDispatcher $centerResolverDispatcher; + private ScopeResolverInterface $scopeResolverDispatcher; - /** - * @param CenterResolverDispatcher $centerResolverDispatcher - */ - public function __construct(CenterResolverDispatcher $centerResolverDispatcher) + public function __construct(CenterResolverDispatcher $centerResolverDispatcher, ScopeResolverInterface $scopeResolverDispatcher) { $this->centerResolverDispatcher = $centerResolverDispatcher; + $this->scopeResolverDispatcher = $scopeResolverDispatcher; } public function getFilters() { return [ - new TwigFilter('chill_resolve_center', [$this, 'resolveCenter']) + new TwigFilter('chill_resolve_center', [$this, 'resolveCenter']), + new TwigFilter('chill_resolve_scope', [$this, 'resolveScope']), + new TwigFilter('chill_is_scope_concerned', [$this, 'isScopeConcerned']), ]; } @@ -33,4 +34,23 @@ final class ResolverTwigExtension extends \Twig\Extension\AbstractExtension return $this->centerResolverDispatcher->resolveCenter($entity, $options); } + /** + * @param $entity + * @param array|null $options + * @return bool + */ + public function isScopeConcerned($entity, ?array $options = []) + { + return $this->scopeResolverDispatcher->isConcerned($entity, $options); + } + + /** + * @param $entity + * @param array|null $options + * @return array|\Chill\MainBundle\Entity\Scope|\Chill\MainBundle\Entity\Scope[] + */ + public function resolveScope($entity, ?array $options = []) + { + return $this->scopeResolverDispatcher->resolveScope(); + } } diff --git a/src/Bundle/ChillPersonBundle/DataFixtures/Helper/RandomPersonHelperTrait.php b/src/Bundle/ChillPersonBundle/DataFixtures/Helper/RandomPersonHelperTrait.php new file mode 100644 index 000000000..c6cef7aa0 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/DataFixtures/Helper/RandomPersonHelperTrait.php @@ -0,0 +1,35 @@ +createQueryBuilder(); + $qb + ->from(Person::class, 'p') + ; + + if (null === $this->nbOfPersons) { + $this->nbOfPersons = $qb + ->select('COUNT(p)') + ->getQuery() + ->getSingleScalarResult() + ; + } + + return $qb + ->select('p') + ->setMaxResults(1) + ->setFirstResult(\random_int(0, $this->nbOfPersons)) + ->getQuery() + ->getSingleResult() + ; + } +} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig index d2ed09135..1bf08602a 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/Entity/person.html.twig @@ -149,9 +149,17 @@ {% endif %} {% if options['addCenter'] and person|chill_resolve_center is not null %} + {% if person|chill_resolve_center is iterable %} + {% set centers = person|chill_resolve_center %} + {% else %} + {% set centers = [ person|chill_resolve_center ] %} + {% endif %}
  • - {{ person|chill_resolve_center.name }} + {% for c in centers %} + {{ c.name|upper }} + {% if not loop.last %}, {% endif %} + {% endfor %}
  • {% endif %} diff --git a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php index d8944ae93..d10f18c4c 100644 --- a/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php +++ b/src/Bundle/ChillTaskBundle/Controller/SingleTaskController.php @@ -2,9 +2,7 @@ namespace Chill\TaskBundle\Controller; -use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Security\Resolver\CenterResolverDispatcher; -use Chill\MainBundle\Security\Resolver\CenterResolverInterface; use Chill\MainBundle\Templating\Listing\FilterOrderHelper; use Chill\MainBundle\Templating\Listing\FilterOrderHelperFactoryInterface; use Chill\PersonBundle\Privacy\PrivacyEvent; @@ -18,26 +16,16 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Chill\TaskBundle\Entity\SingleTask; use Chill\TaskBundle\Form\SingleTaskType; -use Chill\TaskBundle\Form\SingleTaskListType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\FormFactoryInterface; use Chill\TaskBundle\Security\Authorization\TaskVoter; use Symfony\Component\Security\Core\Role\Role; use Chill\MainBundle\Pagination\PaginatorFactory; -use Chill\TaskBundle\Repository\SingleTaskRepository; -use Chill\MainBundle\Entity\User; -use Chill\PersonBundle\Security\Authorization\PersonVoter; -use Chill\PersonBundle\Repository\PersonRepository; use Chill\TaskBundle\Event\TaskEvent; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Chill\TaskBundle\Event\UI\UIEvent; -use Chill\MainBundle\Repository\CenterRepository; use Chill\MainBundle\Timeline\TimelineBuilder; use Chill\PersonBundle\Entity\AccompanyingPeriod; -use Chill\PersonBundle\Repository\AccompanyingPeriodRepository; -use Chill\PersonBundle\Security\Authorization\AccompanyingPeriodVoter; -use Doctrine\ORM\EntityManagerInterface; -use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Contracts\Translation\TranslatorInterface; use Symfony\Contracts\Translation\TranslatorInterface as TranslationTranslatorInterface;