diff --git a/VERSIONS_HOTLINE/136299 b/VERSIONS_HOTLINE/136299 new file mode 100644 index 0000000000000000000000000000000000000000..9762b6209e1871a8bdca114deb3c7a6dc81fd5c2 --- /dev/null +++ b/VERSIONS_HOTLINE/136299 @@ -0,0 +1 @@ + - ticket #136299 : Activités : Admin, recherche des participants, les redacteurs portails doivent pouvoir positionner le critère Niveau d'accès à Tous \ No newline at end of file diff --git a/library/Class/SearchCriteria.php b/library/Class/SearchCriteria.php index 0d05d86ac92a41cb3636044d73f4b61802dca83d..01f9915ba840574ac0968d10b029057088e9eb45 100644 --- a/library/Class/SearchCriteria.php +++ b/library/Class/SearchCriteria.php @@ -97,6 +97,14 @@ abstract class Class_SearchCriteria { } + public function findFirstCriteriaByClass($class_name) { + return (new Storm_Collection($this->_criteria)) + ->detect(function ($each) use ($class_name) { + return $each instanceof $class_name; + }); + } + + public function getFormValues() { $composite_values = []; @@ -146,7 +154,8 @@ abstract class Class_SearchCriteria { $this->_search_params = ['wheres' => []]; foreach($this->_criteria as $criteria) - $criteria->acceptSearchVisitor($this); + if ($criteria->shouldFilter($this)) + $criteria->acceptSearchVisitor($this); $wheres = $this->_search_params['wheres']; unset($this->_search_params['wheres']); @@ -193,7 +202,7 @@ abstract class Class_SearchCriteria { return (new Storm_Collection($this->_criteria)) ->detect(function($each) use($model) { - return !$each->modelMatch($model); + return $each->shouldFilter($this) && !$each->modelMatch($model); }) ? false : true; diff --git a/library/Class/SearchCriteria/Abstract.php b/library/Class/SearchCriteria/Abstract.php index deeae1093fc998a91115f63517551948dd6b8c86..dd5a69c2630ba8ed34503cdf1c8f23ce2323cb00 100644 --- a/library/Class/SearchCriteria/Abstract.php +++ b/library/Class/SearchCriteria/Abstract.php @@ -84,7 +84,12 @@ abstract class Class_SearchCriteria_Abstract { } + public function shouldFilter($search_criteria) { + return true; + } + + protected function _isAllValues() { return static::ALL_VALUES == $this->_value; } -} \ No newline at end of file +} diff --git a/library/Class/User/SearchCriteria.php b/library/Class/User/SearchCriteria.php index 6779151bab0b91148c7c976bebe9cc4a9febb79e..07d20aca7a84da7e6038226a275080324dbc0323 100644 --- a/library/Class/User/SearchCriteria.php +++ b/library/Class/User/SearchCriteria.php @@ -26,7 +26,7 @@ class Class_User_SearchCriteria extends Class_SearchCriteria { public function __construct($params) { $this->_criteria = array_filter([new Class_User_SearchCriteriaLibrary($params), - new Class_User_SearchCriteria_RoleLevel($params), + new Class_User_SearchCriteria_RoleLevelLimited($params), new Class_User_SearchCriteriaValidSubscription($params), new Class_User_SearchCriteria_EndSubscriptionDate($params), new Class_User_SearchCriteria_DateFin($params), @@ -61,19 +61,12 @@ class Class_User_SearchCriteriaLibrary extends Class_SearchCriteria_Select { -class Class_User_SearchCriteriaValidSubscription extends Class_SearchCriteria_Abstract { +class Class_User_SearchCriteriaValidSubscription + extends Class_SearchCriteria_Abstract { + protected $_name = 'valid_subscription', - $_value = 0, - $_should_filter = false; - - public function __construct($params) { - parent::__construct($params); - - $this->_should_filter = $this->_value - && (new Class_User_SearchCriteria_RoleLevel($params))->isAbonneSigb(); - } - + $_value = 0; public function buildElement() { return new Zend_Form_Element_Checkbox($this->getName(), @@ -88,17 +81,11 @@ class Class_User_SearchCriteriaValidSubscription extends Class_SearchCriteria_Ab public function acceptSearchVisitor($visitor) { - if (!$this->_should_filter) - return; - $visitor->addWhereParam('STR_TO_DATE(date_fin, \'%Y-%m-%d\') >= CURDATE()'); } public function modelMatch($model) { - if (!$this->_should_filter) - return true; - return $model->isAbonnementValid(); } @@ -108,6 +95,14 @@ class Class_User_SearchCriteriaValidSubscription extends Class_SearchCriteria_Ab ? $this->_element->getLabel() : ''; } + + + public function shouldFilter($search_criteria) { + return $this->_value + && ($role_level = $search_criteria + ->findFirstCriteriaByClass(Class_User_SearchCriteria_RoleLevel::class)) + && $role_level->isAbonneSigb(); + } } diff --git a/library/Class/User/SearchCriteria/EndSubscriptionDate.php b/library/Class/User/SearchCriteria/EndSubscriptionDate.php index 3e6147a1beac629c1d5f63bcd2d414d9bc67cc18..f0d0fb99e19e5438b96eba2e89c3315919125471 100644 --- a/library/Class/User/SearchCriteria/EndSubscriptionDate.php +++ b/library/Class/User/SearchCriteria/EndSubscriptionDate.php @@ -19,21 +19,13 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -class Class_User_SearchCriteria_EndSubscriptionDate extends Class_SearchCriteria_Abstract { +class Class_User_SearchCriteria_EndSubscriptionDate + extends Class_SearchCriteria_Abstract { use Trait_TimeSource; protected $_name = 'end_subscription_days', - $_value = '', - $_should_filter = false; - - public function __construct($params) { - parent::__construct($params); - - $this->_should_filter = $this->_value - && (new Class_User_SearchCriteria_RoleLevel($params))->isAbonneSigb(); - } - + $_value = ''; public function buildElement() { return new Zend_Form_Element_Text($this->getName(), @@ -43,9 +35,6 @@ class Class_User_SearchCriteria_EndSubscriptionDate extends Class_SearchCriteria public function modelMatch($user) { - if (!$this->_should_filter) - return true; - return $user->getDateFin() ? $user->getDateFin() <= $this->addDaysToCurrentDate($this->_value) : true; @@ -53,9 +42,14 @@ class Class_User_SearchCriteria_EndSubscriptionDate extends Class_SearchCriteria public function acceptSearchVisitor($visitor) { - if (!$this->_should_filter) - return; - $visitor->addWhereParam('date_fin!=\'\' and date_fin <=\'' . $this->addDaysToCurrentDate($this->_value).'\''); } + + + public function shouldFilter($search_criteria) { + return $this->_value + && ($role_level = $search_criteria + ->findFirstCriteriaByClass(Class_User_SearchCriteria_RoleLevel::class)) + && $role_level->isAbonneSigb(); + } } diff --git a/library/Class/User/SearchCriteria/RequiredRoleLevel.php b/library/Class/User/SearchCriteria/RequiredRoleLevel.php index b3b01761c146c9d4c2b43ce431461d3ed106880b..6661e4f7aed7491e3f3d6f7cf8f55d206cb10aa4 100644 --- a/library/Class/User/SearchCriteria/RequiredRoleLevel.php +++ b/library/Class/User/SearchCriteria/RequiredRoleLevel.php @@ -19,7 +19,9 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -class Class_User_SearchCriteria_RequiredRoleLevel extends Class_User_SearchCriteria_RoleLevel { + +class Class_User_SearchCriteria_RequiredRoleLevel + extends Class_User_SearchCriteria_RoleLevelLimited { public function buildElement() { return ($element = parent::buildElement()) diff --git a/library/Class/User/SearchCriteria/RoleLevel.php b/library/Class/User/SearchCriteria/RoleLevel.php index b44c989f03d8c352be0d7d3f97cbbf81b7f01f59..b7a53726be7ac4a6d34fd5606e1e6b5946dc9ebd 100644 --- a/library/Class/User/SearchCriteria/RoleLevel.php +++ b/library/Class/User/SearchCriteria/RoleLevel.php @@ -21,17 +21,14 @@ class Class_User_SearchCriteria_RoleLevel extends Class_SearchCriteria_Select { - protected $_name = 'role_level'; + protected $_name = 'role_level'; public function buildElement() { if (!Class_Users::getIdentity()) return; - if ((!Class_Users::getIdentity()->isAdmin()) - && $this->_isAllValues()) - $this->_value = ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB; - + $this->_applyLimit(); return parent::buildElement() ->setLabel($this->_('Niveau d\'accès')) ->setMultiOptions([static::ALL_VALUES => $this->_('Tous')] @@ -45,7 +42,6 @@ class Class_User_SearchCriteria_RoleLevel extends Class_SearchCriteria_Select { } - public function isAbonneSigb() { return ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB == $this->_value; } @@ -65,4 +61,8 @@ class Class_User_SearchCriteria_RoleLevel extends Class_SearchCriteria_Select { Class_ScriptLoader::getInstance()->addJQueryReady(implode($toggles)); } + + + protected function _applyLimit() { + } } diff --git a/library/Class/User/SearchCriteria/RoleLevelLimited.php b/library/Class/User/SearchCriteria/RoleLevelLimited.php new file mode 100644 index 0000000000000000000000000000000000000000..1c5373e520a0ad7d2c68f0fd3384e7bd7b2b2f23 --- /dev/null +++ b/library/Class/User/SearchCriteria/RoleLevelLimited.php @@ -0,0 +1,31 @@ +<?php +/** + * Copyright (c) 2012-2021, Agence Française Informatique (AFI). All rights reserved. + * + * BOKEH is free software; you can redistribute it and/or modify + * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by + * the Free Software Foundation. + * + * There are special exceptions to the terms and conditions of the AGPL as it + * is applied to this software (see README file). + * + * BOKEH is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE + * along with BOKEH; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +class Class_User_SearchCriteria_RoleLevelLimited + extends Class_User_SearchCriteria_RoleLevel { + + protected function _applyLimit() { + if ((!Class_Users::getIdentity()->isAdmin()) + && $this->_isAllValues()) + $this->_value = ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB; + } +} diff --git a/library/Class/UserGroup/Filter.php b/library/Class/UserGroup/Filter.php index 4d645db904b67972e2e166eaa69dca89d0ccdf7c..8ffe3340d87386157adfa94834a8289b211d34fc 100644 --- a/library/Class/UserGroup/Filter.php +++ b/library/Class/UserGroup/Filter.php @@ -23,7 +23,7 @@ class Class_UserGroup_Filter extends Class_User_SearchCriteria { public function __construct($params) { parent::__construct($params); - $this->replaceCriteria(Class_User_SearchCriteria_RoleLevel::class, + $this->replaceCriteria(Class_User_SearchCriteria_RoleLevelLimited::class, new Class_User_SearchCriteria_RequiredRoleLevel($params)); } } diff --git a/tests/application/modules/admin/controllers/SessionActivityControllerTest.php b/tests/application/modules/admin/controllers/SessionActivityControllerTest.php index 4da7ec70e6aa01a8bf55f114cebb4534a2cb5270..b1ba6ef82c1a2e85dfcc3fb3f54d303440c6ecad 100644 --- a/tests/application/modules/admin/controllers/SessionActivityControllerTest.php +++ b/tests/application/modules/admin/controllers/SessionActivityControllerTest.php @@ -230,3 +230,36 @@ class Admin_SessionActivityControllerEditQuotasTest extends Admin_SessionActivit $this->assertNotXPath('//input[@name="effectif_child_min"][@required="required"][@type="number"]'); } } + + + + +/* ticket : #136299 */ +class Admin_SessionActivityControllerDefaultSearchTest + extends Admin_SessionActivityControllerTestCase { + + public function setUp() { + parent::setUp(); + + $user_group = $this->fixture(Class_UserGroup::class, + ['id' => 2020, + 'libelle' => 'Redacteur portail', + 'rights' => [Class_UserGroup::RIGHT_DIRIGER_ACTIVITY]]); + + $logged_user = $this->fixture(Class_Users::class, + ['id' => 6060, + 'login' => 'totoro', + 'password' => '123456']) + ->beModoPortail() + ->setUserGroups([$user_group]); + + ZendAfi_Auth::getInstance()->logUser($logged_user); + $this->dispatch('/admin/session-activity/inscriptions/id/32'); + } + + + /** @test */ + public function niveauAccessShouldBeTousByDefault() { + $this->assertXPath('//select[@id="search_role_level"]/option[@value="all"][@selected="selected"]'); + } +}