Browse Source

Update course bundle from experimental branch

jmontoyaa 8 years ago
parent
commit
ce01441f84

+ 233 - 0
src/Chamilo/CourseBundle/Controller/ToolBaseController.php

@@ -0,0 +1,233 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\CourseBundle\Controller;
+
+use Chamilo\CoreBundle\Controller\BaseController;
+use Knp\Menu\FactoryInterface as MenuFactoryInterface;
+use Knp\Menu\ItemInterface as MenuItemInterface;
+use Knp\Menu\Renderer\ListRenderer;
+use Symfony\Component\HttpFoundation\Request;
+use Chamilo\CoreBundle\Entity\Course;
+use Chamilo\CoreBundle\Entity\Session;
+use Chamilo\CourseBundle\Controller\ToolInterface;
+
+/**
+ * Each entity controller must extends this class.
+ *
+ * @abstract
+ */
+abstract class ToolBaseController extends BaseController implements ToolInterface
+{
+    protected $course;
+    protected $session;
+
+    /**
+     * @inheritdoc
+     */
+    public function setCourse(Course $course)
+    {
+        $this->course = $course;
+    }
+
+    /**
+     * @return Course
+     */
+    public function getCourse()
+    {
+        return $this->course;
+    }
+
+    /**
+     *
+     * @inheritdoc
+     */
+    public function setSession(Session $session)
+    {
+        $this->session = $session;
+    }
+
+    /**
+     * @return Session
+     */
+    public function getSession()
+    {
+        return $this->session;
+    }
+
+    /**
+     * @param $action
+     * @param MenuItemInterface $menu
+     * @return MenuItemInterface
+     */
+    public function buildBreadcrumbs($action, MenuItemInterface $menu = null)
+    {
+        if (!$menu) {
+            $menu = $this->getHomeBreadCrumb();
+        }
+
+        // Tool home
+        $menu->addChild(
+            $this->trans($this->getClassnameLabel()),
+            array(
+                'uri' => $this->generateControllerUrl(
+                    'indexAction',
+                    array(
+                        'courseCode' => $this->getCourse()->getCode()
+                    )
+                )
+            )
+        );
+
+        $action = str_replace(
+            array($this->getControllerAlias().':', 'Action'),
+            '',
+            $action
+        );
+
+        switch ($action) {
+            case 'add':
+            case 'edit':
+                $menu->addChild(
+                    $this->trans($this->getClassnameLabel().ucfirst($action))
+                    //array('uri' => $this->generateControllerUrl($action.'Action'))
+                );
+                break;
+        }
+
+        return $menu;
+    }
+
+    /**
+     * Converts string 'Chamilo\CourseBundle\Controller\CourseHome\CourseHomeController' into
+     * 'tool/course_home'
+     */
+    public function getTemplatePath()
+    {
+        $parts = $this->getClassParts();
+
+        $newPath = array();
+        foreach ($parts as $part) {
+            if (in_array($part, array('chamilo', 'controller')) ||
+                strpos($part, '_controller') > 0
+            ) {
+                continue;
+            }
+            $newPath[] = $part;
+        }
+
+        $template = implode('/', $newPath);
+        return str_replace('_controller', '', $template);
+    }
+
+    /**
+     * Before middleware for the ToolBaseController
+     *
+     * @param Request $request
+     */
+    public function before(Request $request)
+    {
+        $cidReset = $this->get('cidReset');
+        $cidReq = $request->get('cidReq');
+        $sessionHandler = $request->getSession();
+
+        if (empty($cidReq)) {
+            $cidReq = $request->get('courseCode');
+        }
+
+        $sessionId = $request->get('id_session');
+        $groupId   = $request->get('gidReq');
+
+        $tempCourseId  = api_get_course_id();
+        $tempGroupId   = api_get_group_id();
+        $tempSessionId = api_get_session_id();
+
+        $courseReset = false;
+        if ((!empty($cidReq) && $tempCourseId != $cidReq) || empty($tempCourseId) || empty($tempCourseId) == -1) {
+            $courseReset = true;
+        }
+
+        if (isset($cidReset) && $cidReset == 1) {
+            $courseReset = true;
+        }
+
+        $sessionHandler->set('courseReset', $courseReset);
+
+        $groupReset = false;
+        if ($tempGroupId != $groupId || empty($tempGroupId)) {
+            $groupReset = true;
+        }
+
+        $sessionReset = false;
+        if ($tempSessionId != $sessionId || empty($tempSessionId)) {
+            $sessionReset = true;
+        }
+
+        if ($courseReset) {
+
+            if (!empty($cidReq) && $cidReq != -1) {
+                $courseInfo = api_get_course_info($cidReq, true, true);
+
+                if (!empty($courseInfo)) {
+                    $courseCode = $courseInfo['code'];
+                    $courseId   = $courseInfo['real_id'];
+
+                    $sessionHandler->set('_real_cid', $courseId);
+                    $sessionHandler->set('_cid', $courseCode);
+                    $sessionHandler->set('_course', $courseInfo);
+
+                } else {
+                    $this->abort(404, $this->trans('Course not available'));
+                }
+            } else {
+                $sessionHandler->remove('_real_cid');
+                $sessionHandler->remove('_cid');
+                $sessionHandler->remove('_course');
+            }
+        }
+
+        $courseCode = api_get_course_id();
+
+        if (!empty($courseCode) && $courseCode != -1) {
+            //$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
+            $time = api_get_utc_datetime();
+            $sql = "UPDATE course SET last_visit= '$time' WHERE code='$courseCode'";
+            $this->getDatabase()->query($sql);
+        }
+
+        if ($sessionReset) {
+            $sessionHandler->remove('session_name');
+            $sessionHandler->remove('id_session');
+
+            if (!empty($sessionId)) {
+                $sessionInfo = api_get_session_info($sessionId);
+                if (empty($sessionInfo)) {
+                    $this->abort(404, $this->trans('Session not available'));
+                } else {
+                    $sessionHandler->set('id_session', $sessionId);
+                }
+            }
+        }
+
+        if ($groupReset) {
+            $sessionHandler->remove('_gid');
+            if (!empty($groupId)) {
+                $sessionHandler->set('_gid', $groupId);
+            }
+        }
+    }
+
+    /**
+     * @return \Symfony\Component\HttpFoundation\RedirectResponse
+     */
+    public function redirectCourseHome()
+    {
+        $url = $this->generateUrl(
+            'course_home',
+            ['course' => $this->getCourse()->getCode()]
+        );
+
+        return $this->redirect($url);
+    }
+
+}

+ 36 - 0
src/Chamilo/CourseBundle/Controller/ToolInterface.php

@@ -0,0 +1,36 @@
+<?php
+
+namespace Chamilo\CourseBundle\Controller;
+
+use Chamilo\CoreBundle\Entity\Course;
+use Chamilo\CoreBundle\Entity\Session;
+
+/**
+ * Interface ToolInterface
+ * This functions are loaded in the CourseListener.php
+ * @package Chamilo\CourseBundle\Controller
+ */
+interface ToolInterface
+{
+    /**
+     * @param Course $course
+     * @return mixed
+     */
+    public function setCourse(Course $course);
+
+    /**
+     * @param Session $session
+     * @return mixed
+     */
+    public function setSession(Session $session);
+
+    /**
+     * @return Course
+     */
+    public function getCourse();
+
+    /**
+     * @return Session
+     */
+    public function getSession();
+}

+ 1 - 1
src/Chamilo/CourseBundle/DependencyInjection/ChamiloCourseExtension.php

@@ -35,7 +35,7 @@ class ChamiloCourseExtension extends Extension
     public function load(array $config, ContainerBuilder $container)
     {
         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
-        //$loader->load('services.yml');
+        $loader->load('services.yml');
         $loader->load('admin.yml');
 
 //self::CONFIGURE_VALIDATORS

+ 46 - 0
src/Chamilo/CourseBundle/Entity/Manager/GroupManager.php

@@ -0,0 +1,46 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\CourseBundle\Entity\Manager;
+
+use Chamilo\CoreBundle\Entity\Repository\CourseRepository;
+use Chamilo\CourseBundle\Entity\CGroupInfo;
+use Sonata\CoreBundle\Model\BaseEntityManager;
+use Chamilo\CoreBundle\Entity\Course;
+use Chamilo\UserBundle\Entity\User;
+use Sonata\DatagridBundle\Pager\Doctrine\pager;
+use Sonata\DatagridBundle\ProxyQuery\Doctrine\ProxyQuery;
+use Doctrine\Common\Collections\Criteria;
+
+/**
+ * Class CourseManager
+ * @package Chamilo\CoreBundle\Entity\Manager
+ */
+class GroupManager extends BaseEntityManager
+{
+    /**
+     * @return CGroupInfo
+     */
+    public function createGroup()
+    {
+        return $this->create();
+    }
+
+    /**
+     * @param string $code
+     * @return mixed
+     */
+    public function findOneByCode($code)
+    {
+        return $this->getRepository()->findOneByCode($code);
+    }
+
+    /**
+     * @param string $name
+     * @return mixed
+     */
+    public function findOneByTitle($name)
+    {
+        return $this->getRepository()->findOneByTitle($name);
+    }
+}

+ 65 - 0
src/Chamilo/CourseBundle/EventListener/CourseAccessListener.php

@@ -0,0 +1,65 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\CourseBundle\EventListener;
+
+use Chamilo\CoreBundle\Entity\TrackECourseAccess;
+use Chamilo\CourseBundle\Event\CourseAccess;
+use Doctrine\ORM\EntityManager;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * Class CourseAccessListener
+ * In and outs of a course
+ * This listeners is always called when user enters the course home
+ * @package Chamilo\CourseBundle\EventListener
+ */
+class CourseAccessListener
+{
+    protected $em;
+
+    /**
+     * @var \Symfony\Component\HttpFoundation\Request
+     */
+    protected $request;
+
+    /**
+     * @param EntityManager $em
+     */
+    public function __construct(EntityManager $em)
+    {
+        $this->em = $em;
+    }
+
+    /**
+     * @param RequestStack $requestStack
+     */
+    public function setRequest(RequestStack $requestStack)
+    {
+        $this->request = $requestStack->getCurrentRequest();
+    }
+
+    /**
+     * @param CourseAccess $event
+     */
+    public function onCourseAccessEvent($event)
+    {
+        // CourseAccess
+        $user = $event->getUser();
+        $course = $event->getCourse();
+        $ip = $this->request->getClientIp();
+
+        if ($user && $course) {
+            $access = new TrackECourseAccess();
+            $access
+                ->setCId($course->getId())
+                ->setUserId($user->getId())
+                ->setSessionId(0)
+                ->setUserIp($ip)
+            ;
+
+            $this->em->persist($access);
+            $this->em->flush();
+        }
+    }
+}

+ 335 - 0
src/Chamilo/CourseBundle/EventListener/CourseListener.php

@@ -0,0 +1,335 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\CourseBundle\EventListener;
+
+use Chamilo\CoreBundle\Controller\LegacyController;
+use Chamilo\CoreBundle\Security\Authorization\Voter\CourseVoter;
+use Chamilo\CoreBundle\Security\Authorization\Voter\SessionVoter;
+use Chamilo\CoreBundle\Security\Authorization\Voter\GroupVoter;
+use Chamilo\CoreBundle\Framework\Container;
+use Doctrine\ORM\EntityManager;
+use Chamilo\UserBundle\Entity\User;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Event\GetResponseEvent;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
+use Chamilo\CourseBundle\Controller\ToolInterface;
+use Chamilo\CoreBundle\Entity\Course;
+use Chamilo\CoreBundle\Entity\Session;
+use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\Security\Core\Exception\AccessDeniedException;
+use Chamilo\CourseBundle\Event\CourseAccess;
+use Chamilo\CourseBundle\Event\SessionAccess;
+
+/**
+ * Class CourseListener
+ * @package Chamilo\CourseBundle\EventListener
+ */
+class CourseListener
+{
+    /** @var ContainerInterface */
+    protected $container;
+
+    /**
+     * @param ContainerInterface $container
+     */
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
+
+    /**
+     * @param GetResponseEvent $event
+     */
+    public function onKernelRequest(GetResponseEvent $event)
+    {
+        $request = $event->getRequest();
+        $sessionHandler = $event->getRequest()->getSession();
+        $translator = $this->container->get('translator.default');
+        $container = $this->container;
+
+        $courseCode = $request->get('course');
+
+        // Detect if the course was set with a cidReq:
+        if (empty($courseCode)) {
+            $courseCodeFromRequest = $request->get('cidReq');
+            $courseCode = $courseCodeFromRequest;
+        }
+
+        /** @var EntityManager $em */
+        $em = $container->get('doctrine')->getManager();
+
+        $checker = $container->get('security.authorization_checker');
+        $user = $event->getRequest()->getUser();
+
+        $alreadyVisited = $sessionHandler->get('course_already_visited');
+
+
+        if (!empty($courseCode)) {
+            /** @var Course $course */
+            $course = $em->getRepository(
+                'ChamiloCoreBundle:Course'
+            )->findOneByCode($courseCode);
+            if ($course) {
+                $sessionHandler->set('courseObj', $course);
+
+                // Session
+                $sessionId = intval($request->get('id_session'));
+                $session = null;
+
+                // Group
+                $groupId = intval($request->get('gidReq'));
+                if (empty($sessionId)) {
+                    // Check if user is allowed to this course
+                    // See CourseVoter.php
+                    if (false === $checker->isGranted(
+                            CourseVoter::VIEW,
+                            $course
+                        )
+                    ) {
+                        throw new AccessDeniedException(
+                            $translator->trans(
+                                'Unauthorised access to course!'
+                            )
+                        );
+                    }
+                } else {
+                    $session = $em->getRepository('ChamiloCoreBundle:Session')->find($sessionId);
+                    if ($session) {
+                        $sessionHandler->set('sessionObj', $session);
+                        //$course->setCurrentSession($session);
+                        $session->setCurrentCourse($course);
+                        // Check if user is allowed to this course-session
+                        // See SessionVoter.php
+                        if (false === $checker->isGranted(
+                                SessionVoter::VIEW,
+                                $session
+                            )
+                        ) {
+                            throw new AccessDeniedException(
+                                $translator->trans(
+                                    'Unauthorised access to session!'
+                                )
+                            );
+                        }
+
+                        $sessionHandler->set(
+                            'session_name',
+                            $session->getName()
+                        );
+                        $sessionHandler->set('id_session', $session->getId());
+                        $sessionHandler->set('sessionObj', $session);
+                    } else {
+                        throw new NotFoundHttpException(
+                            $translator->trans('Session not found')
+                        );
+                    }
+                }
+
+                if (!empty($groupId)) {
+                    $group = $em->getRepository(
+                        'ChamiloCourseBundle:CGroupInfo'
+                    )->find($groupId);
+                    if ($course->hasGroup($group)) {
+                        if ($group) {
+                            // Check if user is allowed to this course-group
+                            // See GroupVoter.php
+                            if (false === $checker->isGranted(
+                                    GroupVoter::VIEW,
+                                    $group
+                                )
+                            ) {
+                                throw new AccessDeniedException(
+                                    $translator->trans(
+                                        'Unauthorised access to group'
+                                    )
+                                );
+                            }
+                        } else {
+                            throw new NotFoundHttpException(
+                                $translator->trans('Group not found')
+                            );
+                        }
+                    } else {
+                        throw new AccessDeniedException(
+                            $translator->trans('Group does not exist in course')
+                        );
+                    }
+                }
+
+                if (!$alreadyVisited ||
+                    isset($alreadyVisited) && $alreadyVisited != $courseCode
+                ) {
+                    // Course access events
+                    $dispatcher = $this->container->get('event_dispatcher');
+
+                    if (empty($sessionId)) {
+                        $dispatcher->dispatch(
+                            'chamilo_course.course.access',
+                            new CourseAccess($user, $course)
+                        );
+                    } else {
+                        $dispatcher->dispatch(
+                            'chamilo_course.course.access',
+                            new SessionAccess($user, $course, $session)
+                        );
+                    }
+                    $coursesAlreadyVisited[$course->getCode()] = 1;
+                    $sessionHandler->set('course_already_visited', $courseCode);
+                }
+            } else {
+                throw new NotFoundHttpException(
+                    $translator->trans('CourseDoesNotExist')
+                );
+            }
+        }
+    }
+
+    /**
+     * @param FilterResponseEvent $event
+     */
+    public function onKernelResponse(FilterResponseEvent $event)
+    {
+    }
+
+    /**
+     * @param FilterControllerEvent $event
+     */
+    public function onKernelController(FilterControllerEvent $event)
+    {
+        $translator = $this->container->get('translator.default');
+        $url = $event->getRequest()->getUri();
+        $controllerList = $event->getController();
+
+        if (!is_array($controllerList)) {
+            return;
+        }
+
+        $request = $event->getRequest();
+        $sessionHandler = $request->getSession();
+
+        /** @var ContainerInterface $container */
+        $container = $this->container;
+
+        // Course
+        // The 'course' variable example "123" for this URL: courses/123/
+        $courseCode = $request->get('course');
+
+        // Detect if the course was set with a cidReq:
+        if (empty($courseCode)) {
+            $courseCodeFromRequest = $request->get('cidReq');
+            $courseCode = $courseCodeFromRequest;
+        }
+
+        /** @var Course $course */
+        $course = $sessionHandler->get('courseObj');
+
+        /*if ($course) {
+            $courseLanguage = $course->getCourseLanguage();
+            //error_log('onkernelcontroller request: '.$courseLanguage);
+            if (!empty($courseLanguage)) {
+                $request->setLocale($courseLanguage);
+                $sessionHandler->set('_locale', $courseLanguage);
+                $this->container->get('session')->set('_locale', $courseLanguage);
+            }
+        }*/
+
+        $groupId = intval($request->get('gidReq'));
+        $sessionId = intval($request->get('id_session'));
+
+        // This controller implements ToolInterface? Then set the course/session
+        if (is_array($controllerList) &&
+            (
+                $controllerList[0] instanceof ToolInterface ||
+                $controllerList[0] instanceof LegacyController
+            )
+        ) {
+            $controller = $controllerList[0];
+            $session = $sessionHandler->get('sessionObj');
+            $course = $sessionHandler->get('courseObj');
+
+            // Sets the controller course/session in order to use:
+            // $this->getCourse() $this->getSession() in controllers
+
+            if ($course) {
+                $controller->setCourse($course);
+
+                // Legacy code
+                $courseCode = $course->getCode();
+
+                $courseInfo = api_get_course_info($courseCode);
+                $container->get('twig')->addGlobal('course', $course);
+
+                $sessionHandler->set('_real_cid', $course->getId());
+                $sessionHandler->set('_cid', $course->getCode());
+                $sessionHandler->set('_course', $courseInfo);
+            }
+
+            if ($session) {
+                $controller->setSession($session);
+            }
+
+            // Example 'chamilo_notebook.controller.notebook:indexAction'
+            $controllerAction = $request->get('_controller');
+            $controllerActionParts = explode(':', $controllerAction);
+            $controllerNameParts = explode('.', $controllerActionParts[0]);
+            $controllerName = $controllerActionParts[0];
+
+            $toolName = null;
+            $toolAction = null;
+            if (isset($controllerNameParts[1]) &&
+                $controllerNameParts[1] == 'controller'
+            ) {
+                $toolName = $this->container->get($controllerName)->getToolName(
+                );
+                $action = str_replace('action', '', $controllerActionParts[1]);
+                $toolAction = $toolName.'.'.$action;
+            }
+
+            $container->get('twig')->addGlobal('tool.name', $toolName);
+            $container->get('twig')->addGlobal('tool.action', $toolAction);
+
+            $sessionHandler->set('_gid', $groupId);
+            $sessionHandler->set('is_allowed_in_course', true);
+            $sessionHandler->set('id_session', $sessionId);
+        } else {
+            $ignore = [
+                'fos_js_routing.controller:indexAction',
+                'web_profiler.controller.profiler:toolbarAction',
+            ];
+
+            $controllerAction = $request->get('_controller');
+            if (!in_array($controllerAction, $ignore)) {
+                //error_log('remove');
+                $this->removeCourseFromSession($request);
+            }
+        }
+    }
+
+    /**
+     * @param Request $request
+     */
+    public function removeCourseFromSession(Request $request)
+    {
+        $sessionHandler = $request->getSession();
+        $alreadyVisited = $sessionHandler->get('course_already_visited');
+        if ($alreadyVisited) {
+            // "Logout" course
+            $sessionHandler->remove('course_already_visited');
+        }
+        $sessionHandler->remove('toolgroup');
+        $sessionHandler->remove('_gid');
+        $sessionHandler->remove('is_allowed_in_course');
+        $sessionHandler->remove('_real_cid');
+        $sessionHandler->remove('_cid');
+        $sessionHandler->remove('_course');
+        $sessionHandler->remove('id_session');
+        $sessionHandler->remove('_locale_course');
+        $sessionHandler->remove('courseObj');
+        $sessionHandler->remove('sessionObj');
+        //$request->setLocale($request->getPreferredLanguage());
+    }
+}

+ 60 - 0
src/Chamilo/CourseBundle/EventListener/SessionAccessListener.php

@@ -0,0 +1,60 @@
+<?php
+/* For licensing terms, see /license.txt */
+
+namespace Chamilo\CourseBundle\EventListener;
+
+use Chamilo\CoreBundle\Entity\TrackECourseAccess;
+use Chamilo\CourseBundle\Event\SessionAccess;
+use Doctrine\ORM\EntityManager;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * Class SessionAccessListener
+ * @package Chamilo\CourseBundle\EventListener
+ */
+class SessionAccessListener
+{
+    protected $em;
+
+    /**
+     * @var \Symfony\Component\HttpFoundation\Request
+     */
+    protected $request;
+
+    /**
+     * @param RequestStack $requestStack
+     */
+    public function setRequest(RequestStack $requestStack)
+    {
+        $this->request = $requestStack->getCurrentRequest();
+    }
+
+    /**
+     * @param EntityManager $em
+     */
+    public function __construct(EntityManager $em)
+    {
+        $this->em = $em;
+    }
+
+    /**
+     * @param SessionAccess $event
+     */
+    public function onSessionAccessEvent(SessionAccess $event)
+    {
+        $user = $event->getUser();
+        $course = $event->getCourse();
+        $session = $event->getSession();
+        $ip = $this->request->getClientIp();
+
+        $access = new TrackECourseAccess();
+        $access
+            ->setCId($course->getId())
+            ->setUserId($user->getId())
+            ->setSessionId($session->getId())
+            ->setUserIp($ip);
+
+        $this->em->persist($access);
+        $this->em->flush();
+    }
+}

+ 12 - 12
src/Chamilo/CourseBundle/Resources/config/admin.yml

@@ -1,15 +1,15 @@
 services:
-#    sonata.admin.course:
-#        class: Chamilo\CourseBundle\Admin\CourseAdmin
-#        tags:
-#            - { name: sonata.admin, manager_type: orm, audit: true, group: "LMS", label: "Course" }
-#        arguments:
-#            - ~
-#            - Chamilo\CoreBundle\Entity\Course
-#            - ~
-#        calls:
-#            - [ setTranslationDomain, [ChamiloCoreBundle]]
-#            - [ setToolChain, [@chamilo_course.tool_chain]]
+    sonata.admin.course:
+        class: Chamilo\CourseBundle\Admin\CourseAdmin
+        tags:
+            - { name: sonata.admin, manager_type: orm, audit: true, group: "LMS", label: "Course" }
+        arguments:
+            - ~
+            - Chamilo\CoreBundle\Entity\Course
+            - ~
+        calls:
+            - [ setTranslationDomain, [ChamiloCoreBundle]]
+            - [ setToolChain, [ chamilo_course.tool_chain ]]
 
     sonata.admin.course_rel_user:
         class: Chamilo\CourseBundle\Admin\CourseRelUserAdmin
@@ -53,4 +53,4 @@ services:
             - Chamilo\CourseBundle\Entity\CGroupInfo
             - ~
         calls:
-            - [ setTranslationDomain, [ChamiloCoreBundle]]
+            - [ setTranslationDomain, [ChamiloCoreBundle]]

+ 501 - 0
src/Chamilo/CourseBundle/Resources/config/services.yml

@@ -0,0 +1,501 @@
+parameters:
+    chamilo_course.tool_chain.class: Chamilo\CourseBundle\ToolChain
+    chamilo_course.controller.settings.class: Chamilo\CourseBundle\Controller\SettingsController
+    chamilo_course.settings.form_factory.class: Chamilo\CourseBundle\Form\Factory\SettingsFormFactory
+    chamilo_course.settings.manager.class: Chamilo\CourseBundle\Manager\SettingsManager
+    chamilo_course.settings.schema_registry.class: Sylius\Bundle\SettingsBundle\Schema\SchemaRegistry
+    chamilo_course.entity.manager.group_manager.class: Chamilo\CourseBundle\Entity\Manager\GroupManager
+    chamilo_course.entity.group: Chamilo\CourseBundle\Entity\CGroupInfo
+
+services:
+    # Managers
+    chamilo_course.manager.group:
+        class: %chamilo_course.entity.manager.group_manager.class%
+        arguments: [%chamilo_course.entity.group%, '@doctrine']
+
+    # Event Listeners
+    chamilo_course.listener.course:
+        class: Chamilo\CourseBundle\EventListener\CourseListener
+        arguments: ['@service_container']
+        tags:
+          - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest}
+          - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }
+          - { name: kernel.event_listener, event: kernel.controller, method: onKernelController}
+
+    # Sets the user access in a course listener
+    chamilo_course.listener.course_access:
+        class: Chamilo\CourseBundle\EventListener\CourseAccessListener
+        arguments:
+            - '@doctrine.orm.entity_manager'
+        calls:
+            - [setRequest, ['@request_stack']]
+        tags:
+            - { name: kernel.event_listener, event: chamilo_course.course.access, method: onCourseAccessEvent }
+
+    # Sets the user access in a course session listener
+    chamilo_course.listener.session_access:
+        class: Chamilo\CourseBundle\EventListener\SessionAccessListener
+        arguments:
+          - '@doctrine.orm.entity_manager'
+        calls:
+                - [setRequest, ['@request_stack']]
+        tags:
+            - { name: kernel.event_listener, event: chamilo_course.course.session, method: onSessionAccessEvent }
+
+    # Voters
+
+    # Group voter, checks if a user has permissions to do actions
+    chamilo_course.security.authorization.voter.group_voter:
+        class: Chamilo\CoreBundle\Security\Authorization\Voter\GroupVoter
+        arguments: [ '@doctrine.orm.entity_manager', '@chamilo_core.entity.manager.course_manager', '@chamilo_course.manager.group', '@service_container' ]
+        public: false
+        tags:
+           - { name: security.voter }
+
+    # Course settings
+    chamilo_course.controller.settings:
+        class: "%chamilo_course.controller.settings.class%"
+        calls:
+          - [setContainer, ['@service_container']]
+
+    chamilo_course.settings.schema_registry:
+        class: %chamilo_course.settings.schema_registry.class%
+
+    chamilo_course.settings.form_factory:
+        class: %chamilo_course.settings.form_factory.class%
+        arguments:
+            - '@chamilo_course.settings.schema_registry'
+            - '@form.factory'
+
+    chamilo_course.repository.parameter:
+        class: Chamilo\CourseBundle\Entity\Repository\CCourseSettingRepository
+        factory_service: doctrine.orm.entity_manager
+        factory_method: getRepository
+        arguments: [ Chamilo\CourseBundle\Entity\CCourseSetting ]
+
+    chamilo_settings.repository.parameter:
+        class: Chamilo\CoreBundle\Entity\Repository\SettingsCurrentRepository
+        factory_service: doctrine.orm.entity_manager
+        factory_method: getRepository
+        arguments: [ Chamilo\CoreBundle\Entity\SettingsCurrent ]
+
+#    chamilo_course.settings.manager:
+#        class: '%chamilo_course.settings.manager.class%'
+#        arguments:
+#            - '@sylius.settings.schema_registry'
+#            - '@sylius.manager.parameter'
+#            - '@sylius.repository.parameter'
+#            - '@sylius.settings.cache'
+#            - '@validator'
+#            - '@event_dispatcher'
+
+    # Tool chain loads the list of tool services with the tag "chamilo_course.tool"
+    # Tool chain is filled in file DependencyInjection/Compiler/ToolCompilerClass.php
+    chamilo_course.tool_chain:
+        class: '%chamilo_course.tool_chain.class%'
+
+    # Agenda tool
+    chamilo_course.tool.agenda:
+        class: Chamilo\CourseBundle\Tool\Agenda
+        arguments:
+            - calendar_event
+            - authoring
+            - calendar/agenda.php
+            - agenda.gif
+            - chamilo_course.settings.agenda
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Agenda tool settings
+    chamilo_course.settings.agenda:
+        class: Chamilo\CourseBundle\Settings\AgendaCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: calendar_event }
+
+    # Announcement tool
+    chamilo_course.tool.announcement:
+        class: Chamilo\CourseBundle\Tool\Announcement
+        arguments:
+            - announcement
+            - authoring
+            - announcements/announcements.php
+            - valves.gif
+            - chamilo_course.settings.announcement
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Announcement tool settings
+    chamilo_course.settings.announcement:
+        class: Chamilo\CourseBundle\Settings\AnnouncementCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: announcement }
+
+    chamilo_course.tool.assignment:
+        class: Chamilo\CourseBundle\Tool\Assignment
+        arguments:
+            - assignment
+            - interaction
+            - work/work.php
+            - works.gif
+            - '@chamilo_course.settings.assignment'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.assignment:
+        class: Chamilo\CourseBundle\Settings\AssignmentCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: assignment }
+
+    chamilo_course.tool.attendance:
+        class: Chamilo\CourseBundle\Tool\Attendance
+        arguments:
+            - attendance
+            - authoring
+            - attendance/index.php
+            - attendance.gif
+            - '@chamilo_course.settings.attendance'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.attendance:
+        class: Chamilo\CourseBundle\Settings\AttendanceCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: attendance }
+
+    chamilo_course.tool.blog:
+        class: Chamilo\CourseBundle\Tool\Blog
+        arguments:
+            - blog_management
+            - admin
+            - blog/blog_admin.php
+            - blog_admin.gif
+            - '@chamilo_course.settings.blog'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.blog:
+        class: Chamilo\CourseBundle\Settings\BlogCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: blog_management }
+
+    chamilo_course.tool.course_description:
+        class: Chamilo\CourseBundle\Tool\CourseDescription
+        arguments:
+            - course_description
+            - authoring
+            - course_description/index.php
+            - info.gif
+            - '@chamilo_course.settings.course_description'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.course_description:
+        class: Chamilo\CourseBundle\Settings\CourseDescriptionCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: course_description }
+
+    chamilo_course.tool.chat:
+        class: Chamilo\CourseBundle\Tool\Chat
+        arguments:
+            - chat
+            - interaction
+            - chat/chat.php
+            - chat.gif
+            - '@chamilo_course.settings.chat'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.chat:
+        class: Chamilo\CourseBundle\Settings\ChatCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: chat }
+
+    chamilo_course.tool.course_progress:
+        class: Chamilo\CourseBundle\Tool\CourseProgress
+        arguments:
+            - course_progress
+            - authoring
+            - course_progress/index.php
+            - course_progress.gif
+            - '@chamilo_course.settings.course_progress'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.course_progress:
+        class: Chamilo\CourseBundle\Settings\CourseProgressCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: course_progress }
+
+    chamilo_course.tool.document:
+        class: Chamilo\CourseBundle\Tool\Document
+        arguments:
+            - document
+            - authoring
+            - document/document.php
+            - folder_document.gif
+            - '@chamilo_course.settings.document'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.document:
+        class: Chamilo\CourseBundle\Settings\DocumentCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: document }
+
+    chamilo_course.tool.dropbox:
+        class: Chamilo\CourseBundle\Tool\Dropbox
+        arguments:
+            - dropbox
+            - interaction
+            - dropbox/index.php
+            - dropbox.gif
+            - '@chamilo_course.settings.dropbox'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.dropbox:
+        class: Chamilo\CourseBundle\Settings\DropboxCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: dropbox }
+
+    chamilo_course.tool.exercise:
+        class: Chamilo\CourseBundle\Tool\Exercise
+        arguments:
+            - quiz
+            - authoring
+            - exercice/exercice.php
+            - quiz.gif
+            - '@chamilo_course.settings.exercise'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.exercise:
+        class: Chamilo\CourseBundle\Settings\ExerciseCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: quiz }
+
+    chamilo_course.tool.forum:
+        class: Chamilo\CourseBundle\Tool\Forum
+        arguments:
+            - forum
+            - interaction
+            - forum/index.php
+            - forum.gif
+            - '@chamilo_course.settings.forum'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.forum:
+        class: Chamilo\CourseBundle\Settings\ForumCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: forum }
+
+    chamilo_course.tool.glossary:
+        class: Chamilo\CourseBundle\Tool\Glossary
+        arguments:
+            - glossary
+            - authoring
+            - glossary/index.php
+            - glossary.gif
+            - '@chamilo_course.settings.glossary'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.glossary:
+        class: Chamilo\CourseBundle\Settings\GlossaryCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: glossary }
+
+    chamilo_course.tool.gradebook:
+        class: Chamilo\CourseBundle\Tool\Gradebook
+        arguments:
+            - gradebook
+            - authoring
+            - gradebook/index.php
+            - gradebook.gif
+            - '@chamilo_course.settings.gradebook'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.gradebook:
+        class: Chamilo\CourseBundle\Settings\GradebookCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: gradebook }
+
+    chamilo_course.tool.group:
+        class: Chamilo\CourseBundle\Tool\Group
+        arguments:
+            - group
+            - interaction
+            - group/group.php
+            - group.gif
+            - '@chamilo_course.settings.group'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.group:
+        class: Chamilo\CourseBundle\Settings\GroupCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: group }
+
+    chamilo_course.tool.learning_path:
+        class: Chamilo\CourseBundle\Tool\LearningPath
+        arguments:
+            - learnpath
+            - authoring
+            - newscorm/lp_controller.php
+            - scorms.gif
+            - '@chamilo_course.settings.learning_path'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.learning_path:
+        class: Chamilo\CourseBundle\Settings\LearningPathCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: learnpath }
+
+    chamilo_course.tool.link:
+        class: Chamilo\CourseBundle\Tool\Link
+        arguments:
+            - link
+            - authoring
+            - link/link.php
+            - links.gif
+            - '@chamilo_course.settings.link'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.link:
+        class: Chamilo\CourseBundle\Settings\LinkCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: link }
+
+    chamilo_course.tool.maintenance:
+        class: Chamilo\CourseBundle\Tool\Maintenance
+        arguments:
+            - course_maintenance
+            - admin
+            - course_info/maintenance.php
+            - backup.gif
+            - '@chamilo_course.settings.maintenance'
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.maintenance:
+        class: Chamilo\CourseBundle\Settings\MaintenanceCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: course_maintenance }
+
+    chamilo_course.tool.settings:
+        class: Chamilo\CourseBundle\Tool\Settings
+        arguments:
+            - course_setting
+            - admin
+            - course_info/infocours.php
+            - reference.gif
+            - '@chamilo_course.settings.settings'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.settings:
+        class: Chamilo\CourseBundle\Settings\SettingsCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: course_setting }
+
+    chamilo_course.tool.survey:
+        class: Chamilo\CourseBundle\Tool\Survey
+        arguments:
+            - survey
+            - interaction
+            - survey/survey_list.php
+            - survey.gif
+            - '@chamilo_course.settings.survey'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.survey:
+        class: Chamilo\CourseBundle\Settings\SurveyCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: survey }
+
+    chamilo_course.tool.tracking:
+        class: Chamilo\CourseBundle\Tool\Tracking
+        arguments:
+            - tracking
+            - admin
+            - tracking/courseLog.php
+            - statistics.gif
+            - '@chamilo_course.settings.tracking'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.tracking:
+        class: Chamilo\CourseBundle\Settings\TrackingCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: tracking }
+
+    chamilo_course.tool.user:
+        class: Chamilo\CourseBundle\Tool\User
+        arguments:
+            - user
+            - interaction
+            - user/user.php
+            - members.gif
+            - '@chamilo_course.settings.user'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.user:
+        class: Chamilo\CourseBundle\Settings\UserCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: user }
+
+    chamilo_course.tool.wiki:
+        class: Chamilo\CourseBundle\Tool\Wiki
+        arguments:
+            - wiki
+            - interaction
+            - wiki/index.php
+            - wiki.gif
+            - '@chamilo_course.settings.wiki'
+
+        tags:
+            - { name: chamilo_course.tool }
+
+    # Course settings
+    chamilo_course.settings.wiki:
+        class: Chamilo\CourseBundle\Settings\WikiCourseSettingsSchema
+        tags:
+            - { name: chamilo_course.settings_schema, namespace: wiki }