GemsTracker/gemstracker-library

View on GitHub
classes/Gems/Default/GroupAction.php

Summary

Maintainability
B
5 hrs
Test Coverage
F
0%
<?php

/**
 *
 * @package    Gems
 * @subpackage Default
 * @author     Matijs de Jong <mjong@magnafacta.nl>
 * @copyright  Copyright (c) 2011 Erasmus MC
 * @license    New BSD License
 */

/**
 *
 *
 * @package    Gems
 * @subpackage Default
 * @copyright  Copyright (c) 2011 Erasmus MC
 * @license    New BSD License
 * @since      Class available since version 1.1
 */
class Gems_Default_GroupAction extends \Gems_Controller_ModelSnippetActionAbstract
{
    /**
     * The parameters used for the autofilter action.
     *
     * When the value is a function name of that object, then that functions is executed
     * with the array key as single parameter and the return value is set as the used value
     * - unless the key is an integer in which case the code is executed but the return value
     * is not stored.
     *
     * @var array Mixed key => value array for snippet initialization
     */
    protected $autofilterParameters = array(
        'columns'     => 'getBrowseColumns',
        'extraSort'   => [
            'ggp_name' => SORT_ASC,
            ],
        );

    /**
     * Variable to set tags for cache cleanup after changes
     *
     * @var array
     */
    public $cacheTags = array('group', 'groups');

    /**
     * The snippets used for the create and edit actions.
     *
     * @var mixed String or array of snippets name
     */
    protected $createEditSnippets = 'Group_GroupFormSnippet';

    /**
     *
     * @var \Gems_User_User
     */
    public $currentUser;

    /**
     * The snippets used for the delete action.
     *
     * @var mixed String or array of snippets name
     */
    protected $deleteSnippets = 'Group_GroupDeleteSnippet';

    /**
     *
     * @var \Gems_Loader
     */
    public $loader;

    /**
     *
     * @throws \Exception
     */
    public function changeUiAction()
    {
        $request = $this->getRequest();

        if (! $this->currentUser->hasPrivilege('pr.group.switch', false)) {
            $this->escort->setError(
                    $this->_('No access to page'),
                    403,
                    sprintf($this->_('Access to the %s/%s page is not allowed for your current group: %s.'),
                            $request->getControllerName(),
                            $request->getActionName(),
                            $this->currentUser->getGroup()->getName()),
                    true);
        }

        $group = strtolower($request->getParam('group'));
        $url   = base64_decode($request->getParam('current_uri'));

        if ((! $url) || ('/' !== $url[0])) {
            throw new \Exception($this->_('Illegal group redirect url.'));
        }

        // Throws exception on invalid value
        $this->currentUser->setGroupTemp(intval($group));

        if ($url) {
            $this->getResponse()->setRedirect($url);
        } else {
            $this->currentUser->gotoStartPage($this->menu, $request);
        }
        return;
    }

    /**
     * Creates a model for getModel(). Called only for each new $action.
     *
     * The parameters allow you to easily adapt the model to the current action. The $detailed
     * parameter was added, because the most common use of action is a split between detailed
     * and summarized actions.
     *
     * @param boolean $detailed True when the current action is not in $summarizedActions.
     * @param string $action The current action.
     * @return \MUtil_Model_ModelAbstract
     */
    public function createModel($detailed, $action)
    {
        $dbLookup   = $this->util->getDbLookup();
        $rolesObj   = \Gems_Roles::getInstance();
        $userLoader = $this->loader->getUserLoader();

        $model = new \MUtil_Model_TableModel('gems__groups');

        // Add id for excel export
        if ($action == 'export') {
            $model->set('ggp_id_group', 'label', 'id');
        }

        $model->set('ggp_name', 'label', $this->_('Name'),
                'minlength', 4,
                'size', 15, 
                'translate', true,
                'validator', $model->createUniqueValidator('ggp_name')
                );
        $model->set('ggp_description', 'label', $this->_('Description'),
                'size', 40,
                'translate', true
                );
        $model->set('ggp_role', 'label', $this->_('Role'),
                'multiOptions', $dbLookup->getRoles()
                );
        $model->setOnLoad('ggp_role', [$rolesObj, 'translateToRoleName']);
        $model->setOnSave('ggp_role', [$rolesObj, 'translateToRoleId']);

        $groups = $dbLookup->getGroups();
        unset($groups['']);
        $model->set('ggp_may_set_groups', 'label', $this->_('May set these groups'),
                'elementClass', 'MultiCheckbox',
                'multiOptions', $groups
                );
        $tpa = new \MUtil_Model_Type_ConcatenatedRow(',', ', ');
        $tpa->apply($model, 'ggp_may_set_groups');

        $model->set('ggp_default_group', 'label', $this->_('Default group'),
                'description', $this->_('Default group when creating new staff member'),
                'elementClass', 'Select',
                'multiOptions', $dbLookup->getGroups()
                );

        $yesNo = $this->util->getTranslated()->getYesNo();
        $model->set('ggp_staff_members', 'label', $this->_('Staff'),
                'elementClass', 'Checkbox',
                'multiOptions', $yesNo
                );
        $model->set('ggp_respondent_members', 'label', $this->_('Respondents'),
                'elementClass', 'Checkbox',
                'multiOptions', $yesNo
                );
        $model->set('ggp_allowed_ip_ranges', 'label', $this->_('Login allowed from IP Ranges'),
                'description', $this->_('Separate with | examples: 10.0.0.0-10.0.0.255, 10.10.*.*, 10.10.151.1 or 10.10.151.1/25'),
                'elementClass', 'Textarea',
                'itemDisplay', [$this, 'ipWrap'],
                'rows', 4,
                'validator', new \Gems_Validate_IPRanges()
                );
        $model->setIfExists('ggp_no_2factor_ip_ranges', 'label', $this->_('Two factor Optional IP Ranges'),
                'description', $this->_('Separate with | examples: 10.0.0.0-10.0.0.255, 10.10.*.*, 10.10.151.1 or 10.10.151.1/25'),
                'default', '127.0.0.1|::1',
                'elementClass', 'Textarea',
                'itemDisplay', [$this, 'ipWrap'],
                'rows', 4,
                'validator', new \Gems_Validate_IPRanges()
                );

        $model->setIfExists('ggp_2factor_set', 'label', $this->_('Login with two factor set'),
                'elementClass', 'Radio',
                'multiOptions', $userLoader->getGroupTwoFactorSetOptions(),
                'separator', '<br/>'
                );
        $model->setIfExists('ggp_2factor_not_set', 'label', $this->_('Login without two factor set'),
                'elementClass', 'Radio',
                'multiOptions', $userLoader->getGroupTwoFactorNotSetOptions(),
                'separator', '<br/>'
                );
        $model->set('ggp_group_active', 'label', $this->_('Active'),
                'elementClass', 'Checkbox',
                'multiOptions', $yesNo
                );

        if ($detailed) {
            $html = \MUtil_Html::create()->h4($this->_('Screen settings'));
            $model->set('screensettings', 'label', ' ',
                    'default', $html,
                    'elementClass', 'Html',
                    'value', $html
                    );

            $screenLoader = $this->loader->getScreenLoader();
            $model->set('ggp_respondent_browse', 'label', $this->_('Respondent browse screen'),
                    'default', 'Gems\\Screens\\Respondent\\Browse\\ProjectDefaultBrowse',
                    'elementClass', 'Radio',
                    'multiOptions', $screenLoader->listRespondentBrowseScreens()
                    );
            $screenLoader = $this->loader->getScreenLoader();
            $model->set('ggp_respondent_edit', 'label', $this->_('Respondent edit screen'),
                    'default', 'Gems\\Screens\\Respondent\\Edit\\ProjectDefaultEdit',
                    'elementClass', 'Radio',
                    'multiOptions', $screenLoader->listRespondentEditScreens()
                    );
            $screenLoader = $this->loader->getScreenLoader();
            $model->set('ggp_respondent_show', 'label', $this->_('Respondent show screen'),
                    'default', 'Gems\\Screens\\Respondent\\Show\\GemsProjectDefaultShow',
                    'elementClass', 'Radio',
                    'multiOptions', $screenLoader->listRespondentShowScreens()
                    );

            $maskStore = $this->loader->getUserMaskStore();

            $maskStore->addMaskSettingsToModel($model, 'ggp_mask_settings');
        }

        if ($this->project->translateDatabaseFields()) {
            if ('create' == $action || 'edit' == $action) {
                $this->loader->getModels()->addDatabaseTranslationEditFields($model);
            } else {
                $this->loader->getModels()->addDatabaseTranslations($model);
            }
        }

        \Gems_Model::setChangeFieldsByPrefix($model, 'ggp');

        return $model;
    }

    /**
     * Set column usage to use for the browser.
     *
     * Must be an array of arrays containing the input for TableBridge->setMultisort()
     *
     * @return array or false
     */
    public function getBrowseColumns()
    {
        $br = \MUtil_Html::create('br');
        return [
            ['ggp_name', $br, 'ggp_role'],
            ['ggp_description'],
            ['ggp_may_set_groups'],
            ['ggp_default_group', $br, 'ggp_group_active'],
            ['ggp_staff_members', $br, 'ggp_respondent_members'],
            ['ggp_allowed_ip_ranges'],
            ['ggp_no_2factor_ip_ranges'],
            ['ggp_2factor_not_set', $br, 'ggp_2factor_set'],
            ];
    }

    /**
     * Helper function to get the title for the index action.
     *
     * @return $string
     */
    public function getIndexTitle()
    {
        return $this->_('Administrative groups');
    }

    /**
     * Helper function to allow generalized statements about the items in the model.
     *
     * @param int $count
     * @return $string
     */
    public function getTopic($count = 1)
    {
        return $this->plural('group', 'groups', $count);
    }

    /**
     *
     * @param string $value
     * @return string
     */
    public function ipWrap($value)
    {
        return \MUtil_Lazy::call('str_replace', '|', ' | ', $value);
    }
}