Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

fixes 13.x #1523

Merged
merged 2 commits into from
Jan 4, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/main/core/Controller/APINew/Workspace/EvaluationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
use Claroline\CoreBundle\Entity\Role;
use Claroline\CoreBundle\Entity\User;
use Claroline\CoreBundle\Entity\Workspace\Evaluation;
use Claroline\CoreBundle\Entity\Workspace\Requirements;
use Claroline\CoreBundle\Entity\Workspace\Workspace;
use Claroline\CoreBundle\Manager\Workspace\EvaluationManager;
use Sensio\Bundle\FrameworkExtraBundle\Configuration as EXT;
Expand Down Expand Up @@ -93,6 +94,17 @@ public function initializeAction(Workspace $workspace, Role $role): JsonResponse
$this->manager->getEvaluation($workspace, $user, true);
}

// updates resource evaluation with workspace requirements
// this is only required because in some cases ResourceUserEvaluation were not marked as required
// when defined in the workspace requirements
// TODO : to remove in 14.x
$requirements = $this->om->getRepository(Requirements::class)->findOneBy(['workspace' => $workspace, 'role' => $role]);
if ($requirements) {
foreach ($requirements->getResources() as $resource) {
$this->manager->addRequirementToResourceEvaluationByRole($resource, $role);
}
}

$this->om->endFlushSuite();

return new JsonResponse(null, 204);
Expand Down
148 changes: 21 additions & 127 deletions src/main/core/Controller/APINew/Workspace/RequirementsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
use Claroline\AppBundle\API\FinderProvider;
use Claroline\AppBundle\API\Options;
use Claroline\AppBundle\API\SerializerProvider;
use Claroline\AppBundle\Controller\RequestDecoderTrait;
use Claroline\AppBundle\Persistence\ObjectManager;
use Claroline\CoreBundle\Entity\Resource\ResourceNode;
use Claroline\CoreBundle\Entity\Role;
Expand All @@ -33,6 +34,8 @@
*/
class RequirementsController
{
use RequestDecoderTrait;

/** @var AuthorizationCheckerInterface */
private $authorization;
/** @var EvaluationManager */
Expand All @@ -44,15 +47,6 @@ class RequirementsController
/** @var SerializerProvider */
private $serializer;

/**
* RequirementsController constructor.
*
* @param AuthorizationCheckerInterface $authorization
* @param EvaluationManager $evaluationManager
* @param FinderProvider $finder
* @param ObjectManager $om
* @param SerializerProvider $serializer
*/
public function __construct(
AuthorizationCheckerInterface $authorization,
EvaluationManager $evaluationManager,
Expand All @@ -68,20 +62,10 @@ public function __construct(
}

/**
* @Route(
* "/{workspace}/requirements/{type}/list",
* name="apiv2_workspace_requirements_list",
* methods={"GET"}
* )
* @Route("/{workspace}/requirements/{type}/list", name="apiv2_workspace_requirements_list", methods={"GET"})
* @ParamConverter("workspace", options={"mapping": {"workspace": "uuid"}})
*
* @param Workspace $workspace
* @param string $type
* @param Request $request
*
* @return JsonResponse
*/
public function requirementsListAction(Workspace $workspace, $type, Request $request)
public function requirementsListAction(Workspace $workspace, string $type, Request $request): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $workspace)) {
throw new AccessDeniedException();
Expand All @@ -103,20 +87,10 @@ public function requirementsListAction(Workspace $workspace, $type, Request $req
}

/**
* @Route(
* "/{workspace}/requirements/{type}/create",
* name="apiv2_workspace_requirements_create",
* methods={"PUT"}
* )
* @Route("/{workspace}/requirements/{type}/create", name="apiv2_workspace_requirements_create", methods={"PUT"})
* @ParamConverter("workspace", options={"mapping": {"workspace": "uuid"}})
*
* @param Workspace $workspace
* @param string $type
* @param Request $request
*
* @return JsonResponse
*/
public function requirementsCreateAction(Workspace $workspace, $type, Request $request)
public function requirementsCreateAction(Workspace $workspace, string $type, Request $request): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $workspace)) {
throw new AccessDeniedException();
Expand All @@ -133,19 +107,10 @@ public function requirementsCreateAction(Workspace $workspace, $type, Request $r
}

/**
* @Route(
* "/{workspace}/requirements/delete",
* name="apiv2_workspace_requirements_delete",
* methods={"DELETE"}
* )
* @Route("/{workspace}/requirements/delete", name="apiv2_workspace_requirements_delete", methods={"DELETE"})
* @ParamConverter("workspace", options={"mapping": {"workspace": "uuid"}})
*
* @param Workspace $workspace
* @param Request $request
*
* @return JsonResponse
*/
public function deleteBulkAction(Workspace $workspace, Request $request)
public function deleteBulkAction(Workspace $workspace, Request $request): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $workspace)) {
throw new AccessDeniedException();
Expand All @@ -157,18 +122,10 @@ public function deleteBulkAction(Workspace $workspace, Request $request)
}

/**
* @Route(
* "/requirements/{requirements}/fetch",
* name="apiv2_workspace_requirements_fetch",
* methods="{GET}"
* )
* @Route("/requirements/{requirements}/fetch", name="apiv2_workspace_requirements_fetch", methods={"GET"})
* @ParamConverter("requirements", options={"mapping": {"requirements": "uuid"}})
*
* @param Requirements $requirements
*
* @return JsonResponse
*/
public function requirementsFetchAction(Requirements $requirements)
public function requirementsFetchAction(Requirements $requirements): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $requirements->getWorkspace())) {
throw new AccessDeniedException();
Expand All @@ -178,20 +135,10 @@ public function requirementsFetchAction(Requirements $requirements)
}

/**
* @Route(
* "/requirements/resource/{resourceNode}/{type}/list",
* name="apiv2_workspace_requirements_resource_list",
* methods={"GET"}
* )
* @Route("/requirements/resource/{resourceNode}/{type}/list", name="apiv2_workspace_requirements_resource_list", methods={"GET"})
* @ParamConverter("resourceNode", options={"mapping": {"resourceNode": "uuid"}})
*
* @param ResourceNode $resourceNode
* @param string $type
* @param Request $request
*
* @return JsonResponse
*/
public function resourceListAction(ResourceNode $resourceNode, $type, Request $request)
public function resourceListAction(ResourceNode $resourceNode, string $type, Request $request): JsonResponse
{
$workspace = $resourceNode->getWorkspace();

Expand All @@ -216,19 +163,10 @@ public function resourceListAction(ResourceNode $resourceNode, $type, Request $r
}

/**
* @Route(
* "/requirements/{requirements}/resources/add",
* name="apiv2_workspace_requirements_resources_add",
* methods={"PUT"}
* )
* @Route("/requirements/{requirements}/resources/add", name="apiv2_workspace_requirements_resources_add", methods={"PUT"})
* @ParamConverter("requirements", options={"mapping": {"requirements": "uuid"}})
*
* @param Requirements $requirements
* @param Request $request
*
* @return JsonResponse
*/
public function resourcesRequirementsAddAction(Requirements $requirements, Request $request)
public function resourcesRequirementsAddAction(Requirements $requirements, Request $request): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $requirements->getWorkspace())) {
throw new AccessDeniedException();
Expand All @@ -240,19 +178,10 @@ public function resourcesRequirementsAddAction(Requirements $requirements, Reque
}

/**
* @Route(
* "/requirements/{requirements}/resources/remove",
* name="apiv2_workspace_requirements_resources_remove",
* methods={"DELETE"}
* )
* @Route("/requirements/{requirements}/resources/remove", name="apiv2_workspace_requirements_resources_remove", methods={"DELETE"})
* @ParamConverter("requirements", options={"mapping": {"requirements": "uuid"}})
*
* @param Requirements $requirements
* @param Request $request
*
* @return JsonResponse
*/
public function resourcesRequirementsRemoveAction(Requirements $requirements, Request $request)
public function resourcesRequirementsRemoveAction(Requirements $requirements, Request $request): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $requirements->getWorkspace())) {
throw new AccessDeniedException();
Expand All @@ -264,19 +193,10 @@ public function resourcesRequirementsRemoveAction(Requirements $requirements, Re
}

/**
* @Route(
* "/requirements/resource/{resourceNode}/remove",
* name="apiv2_workspace_requirements_resource_remove",
* methods={"DELETE"}
* )
* @Route("/requirements/resource/{resourceNode}/remove", name="apiv2_workspace_requirements_resource_remove", methods={"DELETE"})
* @ParamConverter("resourceNode", options={"mapping": {"resourceNode": "uuid"}})
*
* @param ResourceNode $resourceNode
* @param Request $request
*
* @return JsonResponse
*/
public function resourceRequirementsRemoveAction(ResourceNode $resourceNode, Request $request)
public function resourceRequirementsRemoveAction(ResourceNode $resourceNode, Request $request): JsonResponse
{
if (!$this->authorization->isGranted(['dashboard', 'OPEN'], $resourceNode->getWorkspace())) {
throw new AccessDeniedException();
Expand All @@ -291,20 +211,10 @@ public function resourceRequirementsRemoveAction(ResourceNode $resourceNode, Req
}

/**
* @Route(
* "/requirements/resource/{resourceNode}/{type}/update",
* name="apiv2_workspace_requirements_resource_update",
* methods={"PUT"}
* )
* @Route("/requirements/resource/{resourceNode}/{type}/update", name="apiv2_workspace_requirements_resource_update", methods={"PUT"})
* @ParamConverter("resourceNode", options={"mapping": {"resourceNode": "uuid"}})
*
* @param ResourceNode $resourceNode
* @param string $type
* @param Request $request
*
* @return JsonResponse
*/
public function resourceRequirementsUpdateAction(ResourceNode $resourceNode, $type, Request $request)
public function resourceRequirementsUpdateAction(ResourceNode $resourceNode, string $type, Request $request): JsonResponse
{
$workspace = $resourceNode->getWorkspace();

Expand All @@ -323,20 +233,4 @@ public function resourceRequirementsUpdateAction(ResourceNode $resourceNode, $ty

return new JsonResponse();
}

/**
* @param Request $request
* @param string $class
* @param string $property
*
* @return array
*/
private function decodeIdsString(Request $request, $class, $property = 'ids')
{
$ids = $request->query->get($property);

$property = is_numeric($ids[0]) ? 'id' : 'uuid';

return $this->om->findList($class, $property, $ids);
}
}
32 changes: 13 additions & 19 deletions src/main/core/Listener/Workspace/EvaluationListener.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,11 @@ class EvaluationListener
/** @var EvaluationManager */
private $evaluationManager;

/**
* EvaluationListener constructor.
*
* @param EvaluationManager $evaluationManager
*/
public function __construct(EvaluationManager $evaluationManager)
{
$this->evaluationManager = $evaluationManager;
}

/**
* @param UserEvaluationEvent $event
*/
public function onResourceEvaluation(UserEvaluationEvent $event)
{
/** @var ResourceUserEvaluation $resourceUserEvaluation */
Expand All @@ -48,9 +40,6 @@ public function onResourceEvaluation(UserEvaluationEvent $event)
$this->evaluationManager->computeEvaluation($workspace, $user, $resourceUserEvaluation, new \DateTime());
}

/**
* @param LogGenericEvent $event
*/
public function onLog(LogGenericEvent $event)
{
if ($event instanceof LogRoleSubscribeEvent || $event instanceof LogRoleUnsubscribeEvent) {
Expand All @@ -77,17 +66,22 @@ public function onLog(LogGenericEvent $event)
}

/**
* @param PatchEvent $event
* Updates users resource evaluation with role requirements.
* It will mark the evaluation as required/non required based on the defined requirements.
*
* @todo move this in Queue when available.
*/
public function onRoleChange(PatchEvent $event)
{
if ('user' === $event->getProperty() && in_array($event->getAction(), ['add', 'remove'])) {
$this->evaluationManager->manageRoleSubscription($event->getObject(), $event->getValue(), $event->getAction());
}
}

public function groupUsersPostCollectionPatch(PatchEvent $event)
{
if ('user' === $event->getProperty()) {
switch ($event->getAction()) {
case 'add':
case 'remove':
$this->evaluationManager->manageGroupSubscription($event->getObject(), $event->getValue(), $event->getAction());
break;
}
if ('user' === $event->getProperty() && in_array($event->getAction(), ['add', 'remove'])) {
$this->evaluationManager->manageGroupSubscription($event->getObject(), $event->getValue(), $event->getAction());
}
}
}
2 changes: 1 addition & 1 deletion src/main/core/Manager/Workspace/EvaluationManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,7 @@ public function manageGroupSubscription(Group $group, array $users, $type = 'add
/**
* Set required flag to true for each resource evaluations linked to the users having the given role.
*/
private function addRequirementToResourceEvaluationByRole(ResourceNode $resourceNode, Role $role)
public function addRequirementToResourceEvaluationByRole(ResourceNode $resourceNode, Role $role)
{
$users = [];

Expand Down
1 change: 1 addition & 0 deletions src/main/core/Resources/config/services/listener.yml
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ services:
tags:
- { name: kernel.event_listener, event: resource_evaluation, method: onResourceEvaluation }
- { name: kernel.event_listener, event: log, method: onLog }
- { name: kernel.event_listener, event: crud_post_collection_patch_object_claroline_corebundle_entity_role, method: onRoleChange }
- { name: kernel.event_listener, event: crud_post_collection_patch_object_claroline_corebundle_entity_group, method: groupUsersPostCollectionPatch }

Claroline\CoreBundle\Listener\ViewAsListener:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% include "ClarolineVideoPlayerBundle::player.html.twig" with {
{% include "@ClarolineVideoPlayer/player.html.twig" with {
video: resource,
source: url('claro_file_stream', {id: resource.resourceNode.uuid})
} %}