Browse Source

Adding CRUD for jury

Julio Montoya 11 years ago
parent
commit
e5b525453a

+ 26 - 0
main/inc/Entity/JuryMembers.php

@@ -60,6 +60,32 @@ class JuryMembers
      */
     private $role;
 
+    public function getRole()
+    {
+        return $this->role;
+    }
+
+    public function setRole(Role $role)
+    {
+        $this->role = $role;
+    }
+
+    public function setJury(Jury $jury)
+    {
+        $this->jury = $jury;
+    }
+
+    public function getUser()
+    {
+        return $this->user;
+    }
+
+    public function setUser(User $user)
+    {
+        $this->user = $user;
+    }
+
+
 
     /**
      * Get id

+ 26 - 0
main/inc/Entity/Repository/UserRepository.php

@@ -9,6 +9,7 @@ use Doctrine\ORM\NoResultException;
 use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
 use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
 
+
 /**
  * Class UserRepository
  * @package Entity\Repository
@@ -16,6 +17,31 @@ use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
 class UserRepository extends EntityRepository implements UserProviderInterface
 {
 
+    /**
+     * @param string $keyword
+     * @return mixed
+     */
+    public function searchUserByKeyword($keyword)
+    {
+        $qb = $this->createQueryBuilder('a');
+
+        //Selecting user info
+        $qb->select('DISTINCT b');
+
+        $qb->from('Entity\User', 'b');
+
+        //Selecting courses for users
+        //$qb->innerJoin('u.courses', 'c');
+
+        //@todo check app settings
+        $qb->add('orderBy', 'b.firstname ASC');
+        $qb->where('b.firstname LIKE :keyword OR b.lastname LIKE :keyword ');
+        $qb->setParameter('keyword', "%$keyword%");
+        $q = $qb->getQuery();
+
+        return $q->execute();
+    }
+
     /**
      * @param string $username
      * @return mixed

+ 4 - 1
main/template/default/admin/administrator/index.tpl

@@ -12,7 +12,10 @@
         <a href="{{ url('role.controller:indexAction') }}">{{ 'Roles' |trans }}</a>
     </li>
     <li>
-        <a href="{{ url('branch.controller:indexAction') }}">Branches</a>
+        <a href="{{ url('branch.controller:indexAction') }}">{{ 'Branches' |trans }}</a>
+    </li>
+    <li>
+        <a href="{{ url('jury.controller:indexAction') }}">{{ 'Juries' |trans }}</a>
     </li>
 </ul>
 

+ 26 - 0
main/template/default/admin/administrator/juries/add_members.tpl

@@ -0,0 +1,26 @@
+{% extends app.template_style ~ "/layout/layout_1_col.tpl" %}
+{% block content %}
+    <script>
+    function check() {
+
+    }
+    $(function() {
+        $("#jury_user_user_id").fcbkcomplete({
+            json_url: "{{ url('jury.controller:searchUserAction')}}",
+            maxitems: 1,
+            addontab: false,
+            input_min_size: 1,
+            cache: false,
+            complete_text: "{{ 'StartToType' | trans}}",
+            firstselected: false,
+            onselect: check,
+            filter_selected: true,
+            newel: true
+        });
+    });
+    </script>
+
+    <form action="{{ url('jury.controller:addMembersAction', { "id" : jury_id }) }}" method="post" {{ form_enctype(form) }}>
+      {{ form_widget(form) }}
+    </form>
+{% endblock %}

+ 19 - 2
main/template/default/admin/administrator/juries/list.tpl

@@ -1,5 +1,22 @@
 {% extends app.template_style ~ "/layout/layout_1_col.tpl" %}
 {% block content %}
-    {% import app.template_style ~ "/default_actions/settings.tpl" as actions %}
-    {{ actions.list(items, links) }}
+    <a href="{{ url(links.create_link) }}">
+        {{ 'Add' |trans }}
+    </a>
+    <table class="table">
+    {% for item in items %}
+        <tr>
+            <td>
+                <a href="{{ url(links.read_link, { id: item.id }) }}">
+                {{ item.name }}
+                </a>
+            </td>
+            <td>
+                <a class="btn" href="{{ url(links.add_members_link, { id: item.id }) }}"> {{ 'AddMembers' |trans }}</a>
+                <a class="btn" href="{{ url(links.update_link, { id: item.id }) }}"> {{ 'Edit' |trans }}</a>
+                <a class="btn" href="{{ url(links.delete_link, { id: item.id }) }}"> {{ 'Delete' |trans }}</a>
+            </td>
+        </tr>
+    {% endfor %}
+    </table>
 {% endblock %}

+ 17 - 2
main/template/default/admin/administrator/juries/read.tpl

@@ -1,5 +1,20 @@
 {% extends app.template_style ~ "/layout/layout_1_col.tpl" %}
 {% block content %}
-    {% import app.template_style ~ "/default_actions/settings.tpl" as actions %}
-    {{ actions.read(item, links) }}
+    <a href="{{ url(links.list_link) }}">
+        {{ 'List' |trans }}
+    </a>
+    <a href="{{ url(links.update_link, {id : item.id}) }}">
+        {{ 'Edit' |trans }}
+    </a>
+    <h3>Comité #{{ item.id  }} {{ item.name }}</h3>
+
+    <ul>
+        {% for member in item.members %}
+            <li>
+                <a href="">{{ member.user.getCompleteName }}</a>
+                <a class="btn" href="{{ url('jury.controller:removeMemberAction', {id : member.id}) }} ">Delete</a>
+            </li>
+        {% endfor %}
+    </ul>
+
 {% endblock %}

+ 116 - 2
src/ChamiloLMS/Controller/Admin/Administrator/JuryController.php

@@ -9,6 +9,10 @@ use Symfony\Component\Form\Extension\Validator\Constraints\FormValidator;
 use Symfony\Component\HttpFoundation\Response;
 use Entity;
 use ChamiloLMS\Form\JuryType;
+use ChamiloLMS\Form\JuryUserType;
+use ChamiloLMS\Form\JuryMembersType;
+use Symfony\Component\HttpFoundation\JsonResponse;
+
 use Symfony\Component\Routing\Annotation\Route;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
 
@@ -37,7 +41,14 @@ class JuryController extends CommonController
     */
     public function readAction($id)
     {
-        return parent::readAction($id);
+        $entity = $this->getEntity($id);
+
+        $template = $this->get('template');
+        $template->assign('item', $entity);
+        $template->assign('links', $this->generateDefaultCrudRoutes());
+
+        $response = $template->render_template($this->getTemplatePath().'read.tpl');
+        return new Response($response, 200, array());
     }
 
     /**
@@ -60,7 +71,6 @@ class JuryController extends CommonController
     }
 
     /**
-    *
     * @Route("/{id}/delete", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
     * @Method({"GET"})
     */
@@ -69,6 +79,110 @@ class JuryController extends CommonController
         return parent::deleteAction($id);
     }
 
+     /**
+    * @Route("/{id}/remove-member", requirements={"id" = "\d+"}, defaults={"foo" = "bar"})
+    * @Method({"GET"})
+    */
+    public function removeMemberAction($id)
+    {
+        $juryMembers = $this->getManager()->getRepository('Entity\JuryMembers')->find($id);
+        if ($juryMembers) {
+            $em = $this->getManager();
+            $em->remove($juryMembers);
+            $em->flush();
+            $url = $this->createUrl('list_link');
+            $this->get('session')->getFlashBag()->add('success', "Deleted");
+
+            return $this->redirect($url);
+        }
+    }
+
+    /**
+    * @Route("/search-user/" )
+    * @Method({"GET"})
+    */
+    public function searchUserAction()
+    {
+        $request = $this->getRequest();
+        $keyword = $request->get('tag');
+        $repo = $this->get('orm.em')->getRepository('Entity\User');
+
+        $entities = $repo->searchUserByKeyword($keyword);
+        $data = array();
+        if ($entities) {
+            /** @var \Entity\User $entity */
+            foreach ($entities as $entity) {
+                $data[] = array(
+                    'key' => (string) $entity->getUserId(),
+                    'value' => $entity->getCompleteName(),
+                );
+            }
+        }
+        return new JsonResponse($data);
+    }
+
+    /**
+    * @Route("/{id}/add-members", requirements={"id" = "\d+"})
+    * @Method({"GET"})
+    */
+    public function addMembersAction(Application $app, $id)
+    {
+        $extraJS[]      = '<link href="'.api_get_path(WEB_LIBRARY_PATH).'javascript/tag/style.css" rel="stylesheet" type="text/css" />';
+        $extraJS[]      = '<script src="'.api_get_path(WEB_LIBRARY_PATH).'javascript/tag/jquery.fcbkcomplete.js" type="text/javascript" language="javascript"></script>';
+        $app['extraJS'] = $extraJS;
+
+        $juryUserType = new JuryMembersType();
+        $juryMember =  new Entity\JuryMembers();
+        $juryMember->setJuryId($id);
+
+        $form = $this->get('form.factory')->create($juryUserType, $juryMember);
+
+        $request = $this->getRequest();
+        if ($request->getMethod() == 'POST') {
+            $form->bind($request);
+            if ($form->isValid()) {
+                /** @var Entity\JuryMembers $item */
+                $item = $form->getData();
+
+                $userIdList = $item->getUserId();
+                $userId = ($userIdList[0]);
+                $user = $this->getManager()->getRepository('Entity\User')->find($userId);
+                if (!$user) {
+                    throw new \Exception('Unable to found User');
+                }
+
+                $jury = $this->getRepository()->find($id);
+
+                if (!$jury) {
+                    throw new \Exception('Unable to found Jury');
+                }
+
+                $juryMember->setUser($user);
+                $juryMember->setJury($jury);
+
+                $em = $this->getManager();
+                $em->persist($juryMember);
+                $em->flush();
+
+                $this->get('session')->getFlashBag()->add('success', "Saved");
+            }
+        }
+
+
+        $template = $this->get('template');
+        $template->assign('jury_id', $id);
+        $template->assign('form', $form->createView());
+        $response = $template->render_template($this->getTemplatePath().'add_members.tpl');
+        return new Response($response, 200, array());
+    }
+
+    protected function generateDefaultCrudRoutes()
+    {
+        $routes = parent::generateDefaultCrudRoutes();
+        $routes['add_members_link'] = 'jury.controller:addMembersAction';
+        return $routes ;
+    }
+
     protected function getControllerAlias()
     {
         return 'jury.controller';

+ 45 - 3
src/ChamiloLMS/Controller/Admin/JuryPresident/JuryPresidentController.php

@@ -37,8 +37,22 @@ class JuryPresidentController extends CommonController
     * @Route("/open-jury")
     * @Method({"GET, POST"})
     */
-    public function openJuryAction()
+    public function openJuryAction(Application $app)
     {
+        $token = $app['security']->getToken();
+        if (null !== $token) {
+            $user = $token->getUser();
+        }
+
+        // @todo where is get this value?
+        $juryId = null;
+
+        /** @var Entity\Jury $jury */
+        $jury = $this->getEntity($juryId);
+        $jury->setOpeningDate(new \DateTime());
+        $jury->setOpeningUserId($user->getUserId());
+        $this->updateAction($jury);
+
         $this->get('session')->getFlashBag()->add('success', "Comité abierto");
         $url = $this->get('url_generator')->generate('jury_president.controller:indexAction');
         return $this->redirect($url);
@@ -48,8 +62,22 @@ class JuryPresidentController extends CommonController
     * @Route("/close-jury")
     * @Method({"GET, POST"})
     */
-    public function closeJuryAction()
+    public function closeJuryAction(Application $app)
     {
+        $token = $app['security']->getToken();
+        if (null !== $token) {
+            $user = $token->getUser();
+        }
+
+        // @todo where is get this value?
+        $juryId = null;
+
+        /** @var Entity\Jury $jury */
+        $jury = $this->getEntity($juryId);
+        $jury->setClosureDate(new \DateTime());
+        $jury->setClosureUserId($user->getUserId());
+        $this->updateAction($jury);
+
         $this->get('session')->getFlashBag()->add('success', "Comité cerrado");
         $url = $this->get('url_generator')->generate('jury_president.controller:indexAction');
         return $this->redirect($url);
@@ -59,8 +87,22 @@ class JuryPresidentController extends CommonController
     * @Route("/close-score")
     * @Method({"GET, POST"})
     */
-    public function closeScoreAction()
+    public function closeScoreAction(Application $app)
     {
+        $token = $app['security']->getToken();
+        if (null !== $token) {
+            $user = $token->getUser();
+        }
+
+        // @todo where is get this value?
+        $juryId = null;
+
+        /** @var Entity\Jury $jury */
+        $jury = $this->getEntity($juryId);
+
+        // @todo ???
+        $this->updateAction($jury);
+
         $this->get('session')->getFlashBag()->add('success', "Notas cerradas");
         $url = $this->get('url_generator')->generate('jury_president.controller:indexAction');
         return $this->redirect($url);

+ 58 - 0
src/ChamiloLMS/Form/JuryMembersType.php

@@ -0,0 +1,58 @@
+<?php
+
+namespace ChamiloLMS\Form;
+
+use Symfony\Component\Form\AbstractType;
+use Symfony\Component\Form\FormEvents;
+use Symfony\Component\Form\FormBuilderInterface;
+use Symfony\Component\OptionsResolver\OptionsResolverInterface;
+use Entity;
+use Doctrine\ORM\EntityRepository;
+
+class JuryMembersType extends AbstractType
+{
+    public function buildForm(FormBuilderInterface $builder, array $options)
+    {
+        $builder->add('role', 'entity', array('class'=>'Entity\Role', 'property' => 'name', 'query_builder'=>
+            function(EntityRepository $er) {
+                return $er->createQueryBuilder('u')
+                    ->where('u.role LIKE :role')
+                    ->setParameter(':role', 'ROLE_JURY%')
+                    ->orderBy('u.name', 'DESC');
+            },)
+        );
+
+        $builder->add('user_id', 'choice', array('label' => 'User'));
+        $builder->add('jury_id', 'hidden');
+        $builder->add('submit', 'submit');
+
+        $factory = $builder->getFormFactory();
+
+        // Fixes issue with the ajax select, waiting this workaround until symfony add ajax search into the core
+        $builder->addEventListener(FormEvents::PRE_BIND, function($event) use ($factory, $builder) {
+            $form = $event->getForm();
+            $case = $event->getData();
+            $id = $case['user_id'][0];
+
+            if ($case) {
+                $form->remove('user_id');
+
+                $form->add($factory->createNamed('user_id', 'hidden', $id, array('auto_initialize' => false)));
+            }
+        });
+    }
+
+    public function setDefaultOptions(OptionsResolverInterface $resolver)
+    {
+        $resolver->setDefaults(
+            array(
+                'data_class' => 'Entity\JuryMembers'
+            )
+        );
+    }
+
+    public function getName()
+    {
+        return 'jury_user';
+    }
+}

+ 1 - 1
src/ChamiloLMS/Form/JuryUserType.php

@@ -11,7 +11,7 @@ class JuryUserType extends AbstractType
 {
     public function buildForm(FormBuilderInterface $builder, array $options)
     {
-        $builder->add('members');
+        $builder->add('role_id');
 
         $builder->add('submit', 'submit');
     }