Beispiel #1
0
 public static function process($action = 'list', $id = null, $filters = array(), $subaction = '')
 {
     // @NODESYS
     $nodes = array();
     // @NODESYS
     $node = \GOTEO_NODE;
     $errors = array();
     switch ($action) {
         case 'add':
             // si llega post: creamos
             if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                 // para crear se usa el mismo método save del modelo, hay que montar el objeto
                 $user = new Model\User();
                 $user->userid = $_POST['userid'];
                 $user->name = $_POST['name'];
                 $user->email = $_POST['email'];
                 $user->password = $_POST['password'];
                 $user->node = !empty($_POST['node']) ? $_POST['node'] : \GOTEO_NODE;
                 if (isset($_SESSION['admin_node']) && $user->node != $_SESSION['admin_node']) {
                     $user->node = $_SESSION['admin_node'];
                 }
                 $user->save($errors);
                 if (empty($errors)) {
                     // mensaje de ok y volvemos a la lista de usuarios
                     Message::Info(Text::get('user-register-success'));
                     throw new Redirection('/admin/users/manage/' . $user->id);
                 } else {
                     // si hay algun error volvemos a poner los datos en el formulario
                     $data = $_POST;
                     Message::Error(implode('<br />', $errors));
                 }
             }
             // vista de crear usuario
             return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'add', 'data' => $data, 'nodes' => $nodes));
             break;
         case 'edit':
             $user = Model\User::get($id);
             // si llega post: actualizamos
             if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                 $tocado = array();
                 // para crear se usa el mismo método save del modelo, hay que montar el objeto
                 if (!empty($_POST['email'])) {
                     $user->email = $_POST['email'];
                     $tocado[] = Text::_('el email');
                 }
                 if (!empty($_POST['password'])) {
                     $user->password = $_POST['password'];
                     $tocado[] = Text::_('la contraseña');
                 }
                 if (!empty($tocado) && $user->update($errors)) {
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($user->id, 'user');
                     $log->populate(Text::_('Operación sobre usuario'), '/admin/users', \vsprintf('El admin %s ha %s del usuario %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Tocado ' . implode(' y ', $tocado)), Feed::item('user', $user->name, $user->id))));
                     $log->doAdmin('user');
                     unset($log);
                     // mensaje de ok y volvemos a la lista de usuarios
                     Message::Info(Text::_('Datos actualizados'));
                     throw new Redirection('/admin/users');
                 } else {
                     // si hay algun error volvemos a poner los datos en el formulario
                     $data = $_POST;
                     Message::Error(Text::_('No se ha guardado correctamente. ') . implode('<br />', $errors));
                 }
             }
             // vista de editar usuario
             return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'edit', 'user' => $user, 'data' => $data, 'nodes' => $nodes));
             break;
         case 'manage':
             // si llega post: ejecutamos + mensaje + seguimos editando
             // operación y acción para el feed
             $mngSa = static::_manageSubAct();
             $sql = $mngSa[$subaction]['sql'];
             $log_action = $mngSa[$subaction]['log'];
             if (!empty($sql)) {
                 $user = Model\User::getMini($id);
                 if (Model\User::query($sql, array(':user' => $id))) {
                     // mensaje de ok y volvemos a la gestion del usuario
                     //                            Message::Info('Ha <strong>' . $log_action . '</strong> al usuario <strong>'.$user->name.'</strong> CORRECTAMENTE');
                     $log_text = 'El admin %s ha %s al usuario %s';
                     // procesos adicionales
                     switch ($subaction) {
                         case 'admin':
                         case 'noadmin':
                             // @NODESYS : this admin/noadmin subactions are here for NODESYS module extra
                             break;
                         case 'translator':
                             // le ponemos todos los idiomas (excepto el español)
                             $sql = "INSERT INTO user_translang (user, lang) SELECT '{$id}' as user, id as lang FROM `lang` WHERE id != 'es'";
                             Model\User::query($sql);
                             break;
                         case 'notranslator':
                             // quitamos los idiomas
                             $sql = "DELETE FROM user_translang WHERE user = :user";
                             Model\User::query($sql, array(':user' => $id));
                             break;
                     }
                 } else {
                     // mensaje de error y volvemos a la gestion del usuario
                     Message::Error('Ha FALLADO cuando ha <strong>' . $log_action . '</strong> al usuario <strong>' . $id . '</strong>');
                     $log_text = 'Al admin %s le ha <strong>FALLADO</strong> cuando ha %s al usuario %s';
                 }
                 // Evento Feed
                 $log = new Feed();
                 $log->setTarget($user->id, 'user');
                 $log->populate(Text::_('Operación sobre usuario'), '/admin/users', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', $log_action), Feed::item('user', $user->name, $user->id))));
                 $log->doAdmin('user');
                 unset($log);
                 throw new Redirection('/admin/users/manage/' . $id);
             }
             $user = Model\User::get($id);
             $viewData = array('folder' => 'users', 'file' => 'manage', 'user' => $user, 'nodes' => $nodes);
             $viewData['roles'] = Model\User::getRolesList();
             $viewData['langs'] = Lang::getAll();
             // quitamos el español
             unset($viewData['langs']['es']);
             // vista de gestión de usuario
             return new View('view/admin/index.html.php', $viewData);
             break;
             // aplicar idiomas
         // aplicar idiomas
         case 'translang':
             if (!isset($_POST['user'])) {
                 Message::Error(Text::_('Hemos perdido de vista al usuario'));
                 throw new Redirection('/admin/users');
             } else {
                 $user = $_POST['user'];
             }
             $sql = "DELETE FROM user_translang WHERE user = :user";
             Model\User::query($sql, array(':user' => $user));
             $anylang = false;
             foreach ($_POST as $key => $value) {
                 if (\substr($key, 0, \strlen('lang_')) == 'lang_') {
                     $sql = "INSERT INTO user_translang (user, lang) VALUES (:user, :lang)";
                     if (Model\User::query($sql, array(':user' => $user, ':lang' => $value))) {
                         $anylang = true;
                     }
                 }
             }
             if (!$anylang) {
                 Message::Error(Text::_('No se ha seleccionado ningún idioma, este usuario tendrá problemas en su panel de traducción!'));
             } else {
                 Message::Info(Text::_('Se han aplicado al traductor los idiomas seleccionados'));
             }
             throw new Redirection('/admin/users/manage/' . $user);
             break;
         case 'impersonate':
             $user = Model\User::get($id);
             // vista de acceso a suplantación de usuario
             return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'impersonate', 'user' => $user, 'nodes' => $nodes));
             break;
         case 'move':
             $user = Model\User::get($id);
             if ($_SERVER['REQUEST_METHOD'] == 'POST') {
                 $values = array(':id' => $id, ':node' => $_POST['node']);
                 try {
                     $sql = "UPDATE user SET node = :node WHERE id = :id";
                     if (Model\User::query($sql, $values)) {
                         $log_text = 'El admin %s ha <span class="red">movido</span> el usuario %s al nodo %s';
                     } else {
                         $log_text = 'Al admin %s le ha <span class="red">fallado al mover</span> el usuario %s al nodo %s';
                     }
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($user->id, 'user');
                     $log->populate('User cambiado de nodo (admin)', '/admin/users', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $user->name, $user->id), Feed::item('user', $nodes[$_POST['node']]))));
                     Message::Error($log->html);
                     $log->doAdmin('user');
                     unset($log);
                     throw new Redirection('/admin/users');
                 } catch (\PDOException $e) {
                     Message::Error("Ha fallado! " . $e->getMessage());
                 }
             }
             // vista de acceso a suplantación de usuario
             return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'move', 'user' => $user, 'nodes' => $nodes));
             break;
         case 'list':
         default:
             if (!empty($filters['filtered'])) {
                 $users = Model\User::getAll($filters, $node);
             } else {
                 $users = array();
             }
             $status = array('active' => Text::_('Activo'), 'inactive' => Text::_('Inactivo'));
             $interests = Model\User\Interest::getAll();
             $roles = Model\User::getRolesList();
             $roles['user'] = Text::_('Solo usuario');
             $types = array('creators' => Text::_('Impulsores'), 'investors' => Text::_('Cofinanciadores'), 'supporters' => Text::_('Colaboradores'));
             $orders = array('created' => Text::_('Fecha de alta'), 'name' => Text::_('Alias'), 'id' => Text::_('User'), 'amount' => Text::_('Cantidad'), 'projects' => Text::_('Proyectos'));
             // proyectos con aportes válidos
             $projects = Model\Invest::projects(true, $node);
             return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'list', 'users' => $users, 'filters' => $filters, 'status' => $status, 'interests' => $interests, 'roles' => $roles, 'types' => $types, 'nodes' => $nodes, 'projects' => $projects, 'orders' => $orders));
             break;
     }
 }
Beispiel #2
0
 /**
  * @return string
  */
 public function get_users()
 {
     // parameters
     //  skillid -> Skill ID
     //  userid -> user id
     //  username -> user name
     //  interest -> interest
     //  type -> user type
     $params = array();
     if (!empty($_REQUEST['skillid'])) {
         $params['skill'] = $_REQUEST['skillid'];
     }
     if (!empty($_REQUEST['userid'])) {
         $params['id'] = $_REQUEST['id'];
     }
     if (!empty($_REQUEST['username'])) {
         $params['name'] = $_REQUEST['username'];
     }
     if (!empty($_REQUEST['interest'])) {
         $params['interest'] = $_REQUEST['interest'];
     }
     if (!empty($_REQUEST['type'])) {
         switch ($_REQUEST['type']) {
             case 'creators':
                 $params['type'] = 'creators';
                 break;
             case 'investors':
                 $params['type'] = 'investos';
                 break;
             case 'supporters':
                 $params['type'] = 'supporters';
                 break;
             case 'lurkers':
                 $params['type'] = 'lurkers';
                 break;
         }
     }
     if (!empty($params)) {
         $this->result[] = \Goteo\Model\User::getAll($params);
     }
     return $this->output();
 }
Beispiel #3
0
 public static function process($action = 'list', $id = null, $filters = array())
 {
     $node = isset($_SESSION['admin_node']) ? $_SESSION['admin_node'] : \GOTEO_NODE;
     $errors = array();
     switch ($action) {
         case 'add':
             // proyectos que están más allá de edición y con traducción deshabilitada
             $availables = Model\User\Translate::getAvailables('project', $_SESSION['admin_node']);
             if (empty($availables)) {
                 Message::Error(Text::_('No hay más proyectos disponibles para traducir'));
                 throw new Redirection('/admin/translates');
             }
         case 'edit':
         case 'assign':
         case 'unassign':
         case 'send':
             // a ver si tenemos proyecto
             if (empty($id) && !empty($_POST['project'])) {
                 $id = $_POST['project'];
             }
             if (!empty($id)) {
                 $project = Model\Project::getMini($id);
             } elseif ($action != 'add') {
                 Message::Error(Text::_('No hay proyecto sobre el que operar'));
                 throw new Redirection('/admin/translates');
             }
             // asignar o desasignar
             // la id de revision llega en $id
             // la id del usuario llega por get
             $user = $_GET['user'];
             if (!empty($user)) {
                 $userData = Model\User::getMini($user);
                 $assignation = new Model\User\Translate(array('item' => $project->id, 'type' => 'project', 'user' => $user));
                 switch ($action) {
                     case 'assign':
                         // se la ponemos
                         $what = Text::_('Asignado');
                         if ($assignation->save($errors)) {
                             Message::Info(Text::_('Traducción asignada correctamente'));
                             throw new Redirection('/admin/translates/edit/' . $project->id);
                         } else {
                             Message::Error(Text::_('No se ha guardado correctamente. ') . implode(', ', $errors));
                         }
                         break;
                     case 'unassign':
                         // se la quitamos
                         $what = Text::_('Desasignado');
                         if ($assignation->remove($errors)) {
                             Message::Info(Text::_('Traducción desasignada correctamente'));
                             throw new Redirection('/admin/translates/edit/' . $project->id);
                         } else {
                             Message::Error(Text::_('No se ha guardado correctamente. ') . implode(', ', $errors));
                         }
                         break;
                 }
                 if (empty($errors)) {
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($userData->id, 'user');
                     $log->populate($what . ' traduccion (admin)', '/admin/translates', \vsprintf('El admin %s ha %s a %s la traducción del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', $what), Feed::item('user', $userData->name, $userData->id), Feed::item('project', $project->name, $project->id))));
                     $log->doAdmin('admin');
                     unset($log);
                 }
                 $action = 'edit';
             }
             // fin asignar o desasignar
             // añadir o actualizar
             // se guarda el idioma original y si la traducción está abierta o cerrada
             if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['save'])) {
                 if (empty($id)) {
                     Message::Error(Text::_('Hemos perdido de vista el proyecto'));
                     throw new Redirection('/admin/translates');
                 }
                 // ponemos los datos que llegan
                 $sql = "UPDATE project SET lang = :lang, translate = 1 WHERE id = :id";
                 if (Model\Project::query($sql, array(':lang' => $_POST['lang'], ':id' => $id))) {
                     if ($action == 'add') {
                         Message::Info('El proyecto ' . $project->name . ' se ha habilitado para traducir');
                     } else {
                         Message::Info(Text::_('Datos de traducción actualizados'));
                     }
                     if ($action == 'add') {
                         // Evento Feed
                         $log = new Feed();
                         $log->setTarget($project->id);
                         $log->populate(Text::_('proyecto habilitado para traducirse (admin)'), '/admin/translates', \vsprintf('El admin %s ha %s la traducción del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Habilitado'), Feed::item('project', $project->name, $project->id))));
                         $log->doAdmin('admin');
                         unset($log);
                         throw new Redirection('/admin/translates/edit/' . $project->id);
                     } else {
                         throw new Redirection('/admin/translates');
                     }
                 } else {
                     if ($action == 'add') {
                         Message::Error(Text::_('Ha fallado al habilitar la traducción del proyecto ') . $project->name);
                     } else {
                         Message::Error(Text::_('Ha fallado al actualizar los datos de la traducción'));
                     }
                 }
             }
             if ($action == 'send') {
                 // Informar al autor de que la traduccion está habilitada
                 // Obtenemos la plantilla para asunto y contenido
                 $template = Template::get(26);
                 // Sustituimos los datos
                 $subject = str_replace('%PROJECTNAME%', $project->name, $template->title);
                 $search = array('%OWNERNAME%', '%PROJECTNAME%', '%SITEURL%');
                 $replace = array($project->user->name, $project->name, SITE_URL);
                 $content = \str_replace($search, $replace, $template->text);
                 // iniciamos mail
                 $mailHandler = new Mail();
                 $mailHandler->to = $project->user->email;
                 $mailHandler->toName = $project->user->name;
                 // blind copy a goteo desactivado durante las verificaciones
                 //              $mailHandler->bcc = '*****@*****.**';
                 $mailHandler->subject = $subject;
                 $mailHandler->content = $content;
                 $mailHandler->html = true;
                 $mailHandler->template = $template->id;
                 if ($mailHandler->send()) {
                     Message::Info('Se ha enviado un email a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>');
                 } else {
                     Message::Error('Ha fallado al enviar el mail a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>');
                 }
                 unset($mailHandler);
                 $action = 'edit';
             }
             $project->translators = Model\User\Translate::translators($id);
             $translators = Model\User::getAll(array('role' => 'translator'));
             // añadimos al dueño del proyecto en el array de traductores
             array_unshift($translators, $project->user);
             return new View('view/admin/index.html.php', array('folder' => 'translates', 'file' => 'edit', 'action' => $action, 'availables' => $availables, 'translators' => $translators, 'project' => $project));
             break;
         case 'close':
             // la sentencia aqui mismo
             // el campo translate del proyecto $id a false
             $sql = "UPDATE project SET translate = 0 WHERE id = :id";
             if (Model\Project::query($sql, array(':id' => $id))) {
                 Message::Info('La traducción del proyecto ' . $project->name . ' se ha finalizado');
                 Model\Project::query("DELETE FROM user_translate WHERE type = 'project' AND item = :id", array(':id' => $id));
                 // Evento Feed
                 $log = new Feed();
                 $log->setTarget($project->id);
                 $log->populate(Text::_('traducción finalizada (admin)'), '/admin/translates', \vsprintf('El admin %s ha dado por %s la traducción del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Finalizada'), Feed::item('project', $project->name, $project->id))));
                 $log->doAdmin('admin');
                 unset($log);
             } else {
                 Message::Error(Text::_('Falló al finalizar la traducción'));
             }
             break;
     }
     $projects = Model\Project::getTranslates($filters, $node);
     $owners = Model\User::getOwners();
     $translators = Model\User::getAll(array('role' => 'translator'));
     return new View('view/admin/index.html.php', array('folder' => 'translates', 'file' => 'list', 'projects' => $projects, 'filters' => $filters, 'fields' => array('owner', 'translator'), 'owners' => $owners, 'translators' => $translators));
 }
Beispiel #4
0
 public static function process($action = 'list', $id = null, $filters = array())
 {
     $node = isset($_SESSION['admin_node']) ? $_SESSION['admin_node'] : \GOTEO_NODE;
     $errors = array();
     switch ($action) {
         case 'add':
         case 'edit':
             // el get se hace con el id del proyecto
             $review = Model\Review::get($id);
             $project = Model\Project::getMini($review->project);
             if (empty($id) || $action == 'edit' && !$review instanceof Model\Review) {
                 Message::Error(Text::get('admin-reviews-error-noview-revision'));
                 throw new Redirection('/admin/reviews');
             }
             if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['save'])) {
                 // instancia
                 $review->id = $_POST['id'];
                 $review->project = $_POST['project'];
                 $review->to_checker = $_POST['to_checker'];
                 $review->to_owner = $_POST['to_owner'];
                 if ($review->save($errors)) {
                     switch ($action) {
                         case 'add':
                             Message::Info(Text::get('admin-reviews-info-success-revision'));
                             // Evento Feed
                             $log = new Feed();
                             $log->setTarget($project->id);
                             $log->populate(Text::_('valoración iniciada (admin)'), '/admin/reviews', \vsprintf('El admin %s ha %s la valoración de %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', Text::_('Iniciado')), Feed::item('project', $project->name, $project->id))));
                             $log->doAdmin('admin');
                             unset($log);
                             throw new Redirection('/admin/reviews/?project=' . urlencode($project->id));
                             break;
                         case 'edit':
                             Message::Info(Text::get('admin-reviews-info-revision-save'));
                             throw new Redirection('/admin/reviews');
                             break;
                     }
                 } else {
                     Message::Error(Text::get('admin-reviews-error-save-fail'), implode(', ', $errors));
                 }
             }
             return new View('view/admin/index.html.php', array('folder' => 'reviews', 'file' => 'edit', 'action' => $action, 'review' => $review, 'project' => $project));
             break;
         case 'close':
             // el get se hace con el id del proyecto
             $review = Model\Review::getData($id);
             // marcamos la revision como completamente cerrada
             if (Model\Review::close($id, $errors)) {
                 Message::Info(Text::get('admin-reviews-info-reviewclose'));
                 // Evento Feed
                 $log = new Feed();
                 $log->setTarget($review->project);
                 $log->populate(Text::_('valoración finalizada (admin)'), '/admin/reviews', \vsprintf('El admin %s ha dado por %s la valoración de %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', Text::_('Finalizada')), Feed::item('project', $review->name, $review->project))));
                 $log->doAdmin('admin');
                 unset($log);
             } else {
                 Message::Error(Text::get('admin-reviews-error-reviewclose-fail') . implode(', ', $errors));
             }
             throw new Redirection('/admin/reviews');
             break;
         case 'unready':
             // se la reabrimos para que pueda seguir editando
             // la id de revision llega en $id
             // la id del usuario llega por get
             $user = $_GET['user'];
             if (!empty($user)) {
                 $user_rev = new Model\User\Review(array('id' => $id, 'user' => $user));
                 $user_rev->unready($errors);
                 if (!empty($errors)) {
                     Message::Error(implode(', ', $errors));
                 }
             }
             throw new Redirection('/admin/reviews');
             break;
         case 'assign':
             // asignamos la revision a este usuario
             // la id de revision llega en $id
             // la id del usuario llega por get
             $user = $_GET['user'];
             if (!empty($user)) {
                 $assignation = new Model\User\Review(array('id' => $id, 'user' => $user));
                 if ($assignation->save($errors)) {
                     $userData = Model\User::getMini($user);
                     $reviewData = Model\Review::getData($id);
                     Message::Info(Text::get('admin-reviews-info-assigned'));
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($userData->id, 'user');
                     $log->populate(Text::_('asignar revision (admin)'), '/admin/reviews', \vsprintf('El admin %s ha %s a %s la revisión de %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', Text::_('Asignado')), Feed::item('user', $userData->name, $userData->id), Feed::item('project', $reviewData->name, $reviewData->project))));
                     $log->setTarget($userData->id, 'user');
                     $log->doAdmin('admin');
                     unset($log);
                 } else {
                     Message::Error(implode(', ', $errors));
                 }
             }
             throw new Redirection('/admin/reviews');
             break;
         case 'unassign':
             // se la quitamos a este revisor
             // la id de revision llega en $id
             // la id del usuario llega por get
             $user = $_GET['user'];
             if (!empty($user)) {
                 $assignation = new Model\User\Review(array('id' => $id, 'user' => $user));
                 if ($assignation->remove($errors)) {
                     $userData = Model\User::getMini($user);
                     $reviewData = Model\Review::getData($id);
                     Message::Info(Text::get('admin-reviews-info-deallocated'));
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($userData->id, 'user');
                     $log->populate(Text::_('Desasignar revision (admin)'), '/admin/reviews', \vsprintf('El admin %s ha %s a %s la revisión de %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', Text::_('Desasignado')), Feed::item('user', $userData->name, $userData->id), Feed::item('project', $reviewData->name, $reviewData->project))));
                     $log->doAdmin('admin');
                     unset($log);
                 } else {
                     Message::Error(implode(', ', $errors));
                 }
             }
             throw new Redirection('/admin/reviews');
             break;
         case 'report':
             // mostramos los detalles de revision
             // ojo que este id es la id del proyecto, no de la revision
             $review = Model\Review::get($id);
             $review = Model\Review::getData($review->id);
             $evaluation = array();
             foreach ($review->checkers as $user => $user_data) {
                 $evaluation[$user] = Model\Review::getEvaluation($review->id, $user);
             }
             return new View('view/admin/index.html.php', array('folder' => 'reviews', 'file' => 'report', 'review' => $review, 'evaluation' => $evaluation));
             break;
     }
     // si hay proyecto filtrado, no filtramos estado
     if (!empty($filters['project'])) {
         unset($filters['status']);
     }
     $list = Model\Review::getList($filters, $node);
     $projects = Model\Review::getProjects($node);
     $status = array('unstarted' => Text::_('No iniciada'), 'open' => Text::_('Abierta'), 'closed' => Text::_('Cerrada'));
     $checkers = Model\User::getAll(array('role' => 'checker'));
     return new View('view/admin/index.html.php', array('folder' => 'reviews', 'file' => 'list', 'list' => $list, 'filters' => $filters, 'projects' => $projects, 'status' => $status, 'checkers' => $checkers));
 }