Compare commits

...

4 Commits

22 changed files with 69 additions and 60 deletions

View File

@@ -0,0 +1,5 @@
kind: Fixed
body: Fix "problem during download" on some filters, which used a wrong data type
time: 2023-11-05T23:04:26.346839079+01:00
custom:
Issue: "183"

View File

@@ -0,0 +1,5 @@
kind: Fixed
body: Fix filter "activity by date"
time: 2023-11-05T23:26:08.685518729+01:00
custom:
Issue: "184"

View File

@@ -673,8 +673,8 @@ final class ActivityController extends AbstractController
throw $this->createNotFoundException('Accompanying Period not found');
}
// TODO Add permission
// $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
// TODO Add permission
// $this->denyAccessUnlessGranted('CHILL_PERSON_SEE', $person);
} else {
throw $this->createNotFoundException('Person or Accompanying Period not found');
}

View File

@@ -13,16 +13,12 @@ namespace Chill\ActivityBundle\Export\Filter;
use Chill\ActivityBundle\Export\Declarations;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\Export\FilterType;
use Chill\MainBundle\Form\Type\PickRollingDateType;
use Chill\MainBundle\Service\RollingDate\RollingDate;
use Chill\MainBundle\Service\RollingDate\RollingDateConverterInterface;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Contracts\Translation\TranslatorInterface;
class ActivityDateFilter implements FilterInterface
@@ -74,46 +70,6 @@ class ActivityDateFilter implements FilterInterface
->add('date_to', PickRollingDateType::class, [
'label' => 'Activities before this date',
]);
$builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
/** @var \Symfony\Component\Form\FormInterface $filterForm */
$filterForm = $event->getForm()->getParent();
$enabled = $filterForm->get(FilterType::ENABLED_FIELD)->getData();
if (true === $enabled) {
// if the filter is enabled, add some validation
$form = $event->getForm();
$date_from = $form->get('date_from')->getData();
$date_to = $form->get('date_to')->getData();
// check that fields are not empty
if (null === $date_from) {
$form->get('date_from')->addError(new FormError(
$this->translator->trans('This field '
.'should not be empty')
));
}
if (null === $date_to) {
$form->get('date_to')->addError(new FormError(
$this->translator->trans('This field '
.'should not be empty')
));
}
// check that date_from is before date_to
if (
(null !== $date_from && null !== $date_to)
&& $date_from >= $date_to
) {
$form->get('date_to')->addError(new FormError(
$this->translator->trans('This date should be after '
.'the date given in "Implied in an activity after '
.'this date" field')
));
}
}
});
}
public function getFormDefaultData(): array

View File

@@ -80,7 +80,7 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
// collect all the reasons'name used in this filter in one array
$reasonsNames = array_map(
fn (ActivityType $t): string => $this->translatableStringHelper->localize($t->getName()),
$this->activityTypeRepository->findBy(['id' => $data['types']->toArray()])
$this->activityTypeRepository->findBy(['id' => $data['types'] instanceof \Doctrine\Common\Collections\Collection ? $data['types']->toArray() : $data['types']])
);
return ['Filtered by activity type: only %list%', [

View File

@@ -17,6 +17,7 @@ use Chill\ActivityBundle\Repository\ActivityReasonRepository;
use Chill\MainBundle\Export\ExportElementValidatedInterface;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Query\Expr;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@@ -79,7 +80,7 @@ class ActivityReasonFilter implements ExportElementValidatedInterface, FilterInt
// collect all the reasons'name used in this filter in one array
$reasonsNames = array_map(
fn (ActivityReason $r): string => '"'.$this->translatableStringHelper->localize($r->getName()).'"',
$this->activityReasonRepository->findBy(['id' => $data['reasons']->toArray()])
$this->activityReasonRepository->findBy(['id' => $data['reasons'] instanceof Collection ? $data['reasons']->toArray() : $data['reasons']])
);
return [

View File

@@ -17,6 +17,7 @@ use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
@@ -80,7 +81,7 @@ class UsersJobFilter implements FilterInterface
', ',
array_map(
fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()),
$data['jobs']->toArray()
$data['jobs'] instanceof Collection ? $data['jobs']->toArray() : $data['jobs']
)
),
]];

View File

@@ -18,6 +18,7 @@ use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\ScopeRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
@@ -83,7 +84,7 @@ class UsersScopeFilter implements FilterInterface
', ',
array_map(
fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()),
$data['scopes']->toArray()
$data['scopes'] instanceof Collection ? $data['scopes']->toArray() : $data['scopes']
)
),
]];

View File

@@ -52,6 +52,7 @@ final class ActivityReasonFilterTest extends AbstractFilterTest
public function getFormData()
{
self::bootKernel();
$data = [];
$em = self::$container
->get(EntityManagerInterface::class);
@@ -62,10 +63,13 @@ final class ActivityReasonFilterTest extends AbstractFilterTest
// generate an array of 5 different combination of results
for ($i = 0; 5 > $i; ++$i) {
yield ['reasons' => new ArrayCollection(array_splice($reasons, ($i + 1) * -1))];
$data[] = ['reasons' => new ArrayCollection(array_splice($reasons, ($i + 1) * -1))];
$data[] = ['reasons' => array_splice($reasons, ($i + 1) * -1)];
}
self::ensureKernelShutdown();
return $data;
}
public function getQueryBuilders(): iterable

View File

@@ -57,6 +57,9 @@ final class ActivityTypeFilterTest extends AbstractFilterTest
$data[] = [
'types' => new ArrayCollection([$a]),
];
/*$data[] = [
'types' => [$a],
];*/
}
return $data;

View File

@@ -17,6 +17,7 @@ use Chill\AsideActivityBundle\Repository\AsideActivityCategoryRepository;
use Chill\AsideActivityBundle\Templating\Entity\CategoryRender;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
@@ -76,7 +77,7 @@ class ByActivityTypeFilter implements FilterInterface
{
$types = array_map(
fn (AsideActivityCategory $t): string => $this->translatableStringHelper->localize($t->getTitle()),
$data['types']->toArray()
$data['types'] instanceof Collection ? $data['types']->toArray() : $data['types']
);
return ['export.filter.Filtered by aside activity type: only %type%', [

View File

@@ -16,6 +16,7 @@ use Chill\MainBundle\Entity\Location;
use Chill\MainBundle\Entity\User;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Form\Type\PickUserLocationType;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Security\Core\Security;
@@ -54,7 +55,12 @@ final readonly class ByLocationFilter implements FilterInterface
public function describeAction($data, $format = 'string'): array
{
$locations = $data['locations']->map(fn (Location $l): string => $l->getName());
$extractFunction = fn (Location $l): string => $l->getName();
if ($data['locations'] instanceof Collection) {
$locations = $data['locations']->map($extractFunction);
} else {
$locations = array_map($extractFunction, $data['locations']);
}
return ['export.filter.Filtered by aside activity location: only %location%', [
'%location%' => implode(', ', $locations),

View File

@@ -17,6 +17,7 @@ use Chill\MainBundle\Entity\User\UserJobHistory;
use Chill\MainBundle\Entity\UserJob;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
@@ -80,7 +81,7 @@ class ByUserJobFilter implements FilterInterface
', ',
array_map(
fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()),
$data['jobs']->toArray()
$data['jobs'] instanceof Collection ? $data['jobs']->toArray() : $data['jobs']
)
),
]];

View File

@@ -18,6 +18,7 @@ use Chill\MainBundle\Entity\User\UserScopeHistory;
use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\ScopeRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelperInterface;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\FormBuilderInterface;
@@ -83,7 +84,7 @@ class ByUserScopeFilter implements FilterInterface
', ',
array_map(
fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()),
$data['scopes']->toArray()
$data['scopes'] instanceof Collection ? $data['scopes']->toArray() : $data['scopes']
)
),
]];

View File

@@ -16,6 +16,7 @@ use Chill\PersonBundle\Entity\SocialWork\SocialIssue;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Form\Type\PickSocialIssueType;
use Chill\PersonBundle\Templating\Entity\SocialIssueRender;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
@@ -50,7 +51,9 @@ class SocialIssueFilter implements FilterInterface
$qb->andWhere($clause)
->setParameter(
'socialissues',
SocialIssue::getDescendantsWithThisForIssues($data['accepted_socialissues']->toArray())
SocialIssue::getDescendantsWithThisForIssues(
$data['accepted_socialissues'] instanceof Collection ? $data['accepted_socialissues']->toArray() : $data['accepted_socialissues']
)
);
}

View File

@@ -17,6 +17,7 @@ use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\UserJobRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Export\Declarations;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@@ -105,7 +106,7 @@ class UserJobFilter implements FilterInterface
', ',
array_map(
fn (UserJob $job) => $this->translatableStringHelper->localize($job->getLabel()),
$data['jobs']->toArray()
$data['jobs'] instanceof Collection ? $data['jobs']->toArray() : $data['jobs']
)
),
],

View File

@@ -17,6 +17,7 @@ use Chill\MainBundle\Export\FilterInterface;
use Chill\MainBundle\Repository\ScopeRepositoryInterface;
use Chill\MainBundle\Templating\TranslatableStringHelper;
use Chill\PersonBundle\Export\Declarations;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
@@ -104,7 +105,7 @@ class UserScopeFilter implements FilterInterface
', ',
array_map(
fn (Scope $s) => $this->translatableStringHelper->localize($s->getName()),
$data['scopes']->toArray()
$data['scopes'] instanceof Collection ? $data['scopes']->toArray() : $data['scopes']
)
),
],

View File

@@ -52,6 +52,7 @@ final class SocialIssueFilterTest extends AbstractFilterTest
->getResult();
yield ['accepted_socialissues' => new ArrayCollection($array)];
yield ['accepted_socialissues' => $array];
}
public function getQueryBuilders(): array

View File

@@ -52,6 +52,11 @@ final class UserJobFilterTest extends AbstractFilterTest
'jobs' => new ArrayCollection($jobs),
'date_calc' => new RollingDate(RollingDate::T_TODAY),
];
yield [
'jobs' => $jobs,
'date_calc' => new RollingDate(RollingDate::T_TODAY),
];
}
public function getQueryBuilders(): array

View File

@@ -53,6 +53,10 @@ final class UserScopeFilterTest extends AbstractFilterTest
'date_calc' => new RollingDate(RollingDate::T_TODAY),
'scopes' => new ArrayCollection($scopes),
],
[
'date_calc' => new RollingDate(RollingDate::T_TODAY),
'scopes' => $scopes,
],
];
}

View File

@@ -100,7 +100,7 @@ class ThirdPartyType extends AbstractType
'label' => 'thirdparty.Contact data are confidential',
]);
// Institutional ThirdParty (parent)
// Institutional ThirdParty (parent)
} else {
$builder
->add('nameCompany', TextType::class, [

View File

@@ -52,7 +52,16 @@ class ChillDocumentLockManager implements DocumentLockManagerInterface
public function hasLock(Document $document, RequestInterface $request): bool
{
return $this->redis->exists($this->getCacheId($document)) > 0;
$r = $this->redis->exists($this->getCacheId($document));
if (is_bool($r)) {
return $r;
}
if (is_int($r)) {
return $r > 0;
}
throw new \RuntimeException('data type not supported');
}
public function setLock(Document $document, string $lockId, RequestInterface $request): bool