Skip to content
Snippets Groups Projects
Commit 4470984b authored by Ghislain Loas's avatar Ghislain Loas
Browse files

dev #47780 RT : refacto permissions

parent cc9328fe
Branches
Tags
3 merge requests!1864Master,!1859Dev#47780 digital ressources plugins,!1840Dev#47780 digital ressources plugins
......@@ -21,21 +21,21 @@
class Admin_UsergroupController extends ZendAfi_Controller_Action {
public function getRessourceDefinitions() {
return [
'model' => [
'class' => 'Class_UserGroup',
'name' => 'user_group',
'order' => 'id'],
'model' => [
'class' => 'Class_UserGroup',
'name' => 'user_group',
'order' => 'id'],
'messages' => [
'successful_save' => $this->_('Groupe "%s" sauvegardé'),
'successful_add' => $this->_('Le groupe "%s" a été sauvegardé'),
'successful_delete' => $this->_('Groupe "%s" supprimé')],
'messages' => [
'successful_save' => $this->_('Groupe "%s" sauvegardé'),
'successful_add' => $this->_('Le groupe "%s" a été sauvegardé'),
'successful_delete' => $this->_('Groupe "%s" supprimé')],
'actions' => [
'add' => ['title' => $this->_("Ajouter un groupe d'utilisateurs")],
'edit' => ['title' => $this->_("Modifier le groupe d'utilisateurs: %s")]],
'actions' => [
'add' => ['title' => $this->_("Ajouter un groupe d'utilisateurs")],
'edit' => ['title' => $this->_("Modifier le groupe d'utilisateurs: %s")]],
'form_class_name' => 'ZendAfi_Form_Admin_UserGroup'];
'form_class_name' => 'ZendAfi_Form_Admin_UserGroup'];
}
......@@ -141,9 +141,9 @@ class Admin_UsergroupController extends ZendAfi_Controller_Action {
protected function _getUrlForActionAndIdName($action, $idName = 'id') {
return $this->view->url(array(
'module' => 'admin',
'controller'=> 'usergroup',
'action' => $action), null, true) . '/' . $idName . '/%s';
'module' => 'admin',
'controller'=> 'usergroup',
'action' => $action), null, true) . '/' . $idName . '/%s';
}
......@@ -205,29 +205,29 @@ class Admin_UsergroupController extends ZendAfi_Controller_Action {
private function _getTreeViewItemActions() {
return
[
[
'url' => $this->_getUrlForActionAndIdName('editmembers'),
'icon' => 'users',
'label' => 'Membres',
'caption' => 'formatedCount'
],
[
'url' => $this->_getUrlForActionAndIdName('edit'),
'icon' => 'edit',
'label' => 'Modifier',
],
[
'url' => $this->_getUrlForActionAndIdName('delete'),
'icon' => 'delete',
'label' => 'Supprimer',
'anchorOptions' => [
'onclick' => "return confirm('Etes-vous sûr de vouloir supprimer ce groupe ?')"
],
]
];
[
'url' => $this->_getUrlForActionAndIdName('editmembers'),
'icon' => 'users',
'label' => 'Membres',
'caption' => 'formatedCount'
],
[
'url' => $this->_getUrlForActionAndIdName('edit'),
'icon' => 'edit',
'label' => 'Modifier',
],
[
'url' => $this->_getUrlForActionAndIdName('delete'),
'icon' => 'delete',
'label' => 'Supprimer',
'anchorOptions' => [
'onclick' => "return confirm('Etes-vous sûr de vouloir supprimer ce groupe ?')"
],
]
];
}
......@@ -265,23 +265,23 @@ class Admin_UsergroupController extends ZendAfi_Controller_Action {
protected function _getPost() {
$post = $this->_request->getPost();
if(!isset($post[ZendAfi_Form_Admin_UserGroup::RIGHTS_PERMISSIONS]))
return $post;
if(isset($post['permissions_access[]']))
$post['permissions_access'] = $this->getPermissions($post);
$rights_permissions = (new Storm_Collection($post[ZendAfi_Form_Admin_UserGroup::RIGHTS_PERMISSIONS]));
$post['rights'] = ZendAfi_Form_Admin_UserGroup::deletePrefix($rights_permissions,
ZendAfi_Form_Admin_UserGroup::RIGHT);
unset($post['permissions_access[]']);
$post['permissions'] = ZendAfi_Form_Admin_UserGroup::deletePrefix($rights_permissions,
ZendAfi_Form_Admin_UserGroup::PERMISSION);
return $post;
}
protected function _getFormValues($model) {
return $model->toArray() + [ 'permissions_access' => $model->getPermissionsAccess() ];
}
protected function getPermissions($post) {
return (new Storm_Model_Collection(Class_Permission::findAllBy(['code' => $post['permissions_access[]']])))
->collect('id')
->getArrayCopy();
return array_merge($model->toArray(),
[ZendAfi_Form_Admin_UserGroup::RIGHTS_PERMISSIONS =>
ZendAfi_Form_Admin_UserGroup::mergeRightsAndPermissionsWithPrefix($model->getRights(),
$model->getPermissions())]);
}
}
......@@ -86,7 +86,7 @@ class Class_DigitalResource extends Class_Entity {
function($configs, $config) use ($closure)
{
$configs[$config->getName()] = $closure($config);
return $configs;
return array_filter($configs);
});
}
......@@ -126,7 +126,8 @@ class Class_DigitalResource extends Class_Entity {
public function getPermissions() {
return $this->pluginsByName(function($config)
{
return $config->getPermissionLabel();
if($config->isEnabled())
return $config->getPermissionLabel();
});
}
......
......@@ -49,14 +49,14 @@ class Class_Migration_DigitalResource_Assimil {
protected function replacePermission($group) {
$old_rights = $group->getRightsToken();
$permissions = $group->getPermissionsAccess();
$permissions = $group->getPermissions();
if((pow(2, static::OLD_ASSIMIL_RIGHT_TOKEN) & $old_rights) === pow(2, static::OLD_ASSIMIL_RIGHT_TOKEN))
$permissions[] = Assimil_Config::getInstance()->getPermission()->getCode();
$permissions[] = Assimil_Config::getInstance()->getPermission();
$group
->setRights($group->getRights())
->setPermissionsAccess($permissions)
->setPermissions($permissions)
->save();
return $group;
......
......@@ -348,24 +348,21 @@ class Class_UserGroup extends Storm_Model_Abstract {
public function setPermissions($permissions) {
$dependents = [];
foreach ($permissions as $permission) {
if (($model = Class_Permission::find($permission))
if (((is_object($permission)) && $model = $permission)
|| ($model = Class_Permission::find($permission))
|| ($model = Class_Permission::findFirstBy(['code' => $permission])))
$dependents[] = $model;
}
return parent::setPermissions($dependents);
}
public function setPermissionsAccess($permissions) {
return $this->setPermissions($permissions);
}
$local_permissions = (new Storm_Model_Collection($this->getPermissions()))
->reject(function($permission)
{
return array_key_exists($permission->getCode(), (new Class_DigitalResource())->getPermissions());
})
->getArrayCopy();
public function getPermissionsAccess() {
return (new Storm_Model_Collection($this->getPermissions()))
->collect('code')
->getArrayCopy();
return parent::setPermissions(array_unique(array_merge($local_permissions,
$dependents)));
}
......
......@@ -21,6 +21,11 @@
class ZendAfi_Form_Admin_UserGroup extends ZendAfi_Form {
const
RIGHT = 'right-',
PERMISSION = 'permission-',
RIGHTS_PERMISSIONS = 'rights_permissions';
public function init() {
parent::init();
......@@ -58,26 +63,15 @@ class ZendAfi_Form_Admin_UserGroup extends ZendAfi_Form {
&& $user->isAdmin()) {
$this->displayRightsGroupVisibleOnlyOnDynamicAndManuelGroup();
$rights = Class_UserGroup::getActivatedRightDefinitionList();
asort($rights);
$this
->addElement('multiCheckbox',
'rights',
ZendAfi_Form_Admin_UserGroup::RIGHTS_PERMISSIONS,
['label' => '',
'multiOptions' => $rights]);
$permissions = (new Class_DigitalResource())->getPermissions();
asort($permissions);
'multiOptions' => $this->getRightsPermissionsOptions()]);
$this
->addElement('multiCheckbox',
'permissions_access',
['multiOptions' => $permissions])
->addDisplayGroup(['rights',
'permissions_access'],
'rights_group',
['legend' => $this->_('Droits')]);
$this->addDisplayGroup([ZendAfi_Form_Admin_UserGroup::RIGHTS_PERMISSIONS],
'rights_group',
['legend' => $this->_('Droits')]);
}
......@@ -117,9 +111,53 @@ class ZendAfi_Form_Admin_UserGroup extends ZendAfi_Form {
->addInlineScript('formSelectToggleVisibilityForElement("input[name=\'group_type\']", "#fieldset-dynamic_filter", ["1"]);');
}
public function displayRightsGroupVisibleOnlyOnDynamicAndManuelGroup() {
Class_ScriptLoader::getInstance()
->addInlineScript('formSelectToggleVisibilityForElement("input[name=\'group_type\']", "#fieldset-rights_group", ["0","1"]);');
}
protected function getRightsPermissionsOptions() {
$rights_permissions = [];
foreach(Class_UserGroup::getActivatedRightDefinitionList() as $key => $right)
$rights_permissions[static::RIGHT . $key] = $right;
foreach((new Class_DigitalResource())->getPermissions() as $key => $permission)
$rights_permissions[static::PERMISSION . $key] = $permission;
asort($rights_permissions);
return $rights_permissions;
}
public static function mergeRightsAndPermissionsWithPrefix($rights, $permissions) {
return
array_merge(static::addPrefix((new Storm_Model_Collection($rights)),
static::RIGHT),
static::addPrefix((new Storm_Model_Collection($permissions))->collect('code'),
static::PERMISSION));
}
public static function addPrefix($collection, $prefix) {
return $collection->injectInto([],
function($items, $item) use ($prefix)
{
$items[] = $prefix . $item;
return $items;
});
}
public static function deletePrefix($collection, $prefix) {
return $collection->injectInto([],
function($items, $item) use ($prefix)
{
if(false !== strpos($item, $prefix))
$items[] = str_replace($prefix, '', $item);
return $items;
});
}
}
?>
\ No newline at end of file
......@@ -142,7 +142,7 @@ class AssimilActivatedAdminTest extends Admin_AbstractControllerTestCase {
/** @test */
public function userGroupPermissionsShouldContainsAssimil() {
$this->dispatch('admin/usergroup/edit/id/1', true);
$this->assertXPath('//label[contains(text(), "accéder à ASSIMIL")]/input[@name="permissions_access[]"][@value="Assimil"]');
$this->assertXPath('//label[contains(text(), "accéder à ASSIMIL")]/input[@name="rights_permissions[]"][@value="permission-Assimil"]');
}
......@@ -153,17 +153,39 @@ class AssimilActivatedAdminTest extends Admin_AbstractControllerTestCase {
'code' => 'Assimil']);
Class_UserGroup::find(1)->setPermissions([1]);
$this->dispatch('admin/usergroup/edit/id/1', true);
$this->assertXPath('//label[contains(text(), "accéder à ASSIMIL")]/input[@name="permissions_access[]"][@value="Assimil"][@checked]');
$this->assertXPath('//label[contains(text(), "accéder à ASSIMIL")]/input[@name="rights_permissions[]"][@value="permission-Assimil"][@checked]');
}
/** @test */
public function userGroupPostShouldSaveUserGroup() {
$this->fixture('Class_Permission',
['id' => 3,
'code' => 'Toto']);
Class_UserGroup::find(1)->setPermissions([3]);
$this->postDispatch('admin/usergroup/edit/id/1',
['permissions_access[]' => 'Assimil',
['rights_permissions' => ['permission-Assimil',
'right-' . Class_UserGroup::RIGHT_SUIVRE_FORMATION,
'right-' . Class_UserGroup::RIGHT_DIRIGER_FORMATION],
'libelle' => 'Group Assimil']);
$this->assertNotEmpty(Class_UserGroup::find(1)->getPermissions());
$this->assertEquals('Assimil', Class_UserGroup::find(1)->getPermissions()[0]->getCode());
$this->assertCount(2, Class_UserGroup::find(1)->getPermissions());
}
/** @test */
public function removeUserGroupPermissionsAssimilShouldRemoveAssimil() {
$this->fixture('Class_Permission',
['id' => 1,
'code' => 'Assimil']);
Class_UserGroup::find(1)->setPermissions([1]);
$this->postDispatch('admin/usergroup/edit/id/1',
['libelle' => 'group',
'rights_permissions' => ['right-' . Class_UserGroup::RIGHT_SUIVRE_FORMATION,
'right-' . Class_UserGroup::RIGHT_DIRIGER_FORMATION]]);
$this->assertEmpty(Class_UserGroup::find(1)->getPermissions());
}
......
......@@ -156,7 +156,7 @@ class Admin_UserGroupControllerCmsPermissionsRevokeTest extends Admin_UserGroupC
$this->postDispatch('admin/usergroup/edit/id/' . $this->_group_search->getId(),
['libelle' => 'Chercheurs',
'rights' => []]);
'rights_permissions' => []]);
}
......@@ -385,7 +385,7 @@ class Admin_UserGroupControllerAddTest extends Admin_UserGroupControllerTestCase
protected function assertRightInputFor($value, $label) {
$this->assertXPathContentContains('//input[@name="rights[]"][@value="' . $value. '"]/parent::label',
$this->assertXPathContentContains('//input[@name="rights_permissions[]"][@value="right-' . $value. '"]/parent::label',
$label);
}
}
......@@ -512,7 +512,7 @@ class Admin_UserGroupControllerEditGroupStagiairesTest extends Admin_UserGroupCo
/** @test */
public function rightSuivreFormationShouldBeChecked() {
$this->assertXPath('//input[@name="rights[]"][@value="0"][@checked="checked"]');
$this->assertXPath('//input[@name="rights_permissions[]"][@value="right-0"][@checked]', $this->response->getBody());
}
......@@ -769,8 +769,8 @@ class Admin_UserGroupControllerEditStagiairesPostDataTest extends Admin_UserGrou
parent::setUp();
$this->postDispatch('admin/usergroup/edit/id/3',
['libelle' => 'étudiants',
'rights' => [Class_UserGroup::RIGHT_SUIVRE_FORMATION,
Class_UserGroup::RIGHT_DIRIGER_FORMATION]]);
'rights_permissions' => ['right-' . Class_UserGroup::RIGHT_SUIVRE_FORMATION,
'right-' . Class_UserGroup::RIGHT_DIRIGER_FORMATION]]);
$this->_group = Class_UserGroup::find(3);
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment