Open Monograph Press  3.3.0
UserGroupGridHandler.inc.php
1 <?php
2 
16 // Import the base GridHandler.
17 import('lib.pkp.classes.controllers.grid.GridHandler');
18 import('lib.pkp.classes.controllers.grid.DataObjectGridCellProvider');
19 import('lib.pkp.classes.workflow.WorkflowStageDAO');
20 
21 // Link action & modal classes
22 import('lib.pkp.classes.linkAction.request.AjaxModal');
23 
25 
27  private $_contextId;
28 
30  private $_userGroup;
31 
32 
36  function __construct() {
37  parent::__construct();
38 
39  $this->addRoleAssignment(
40  array(ROLE_ID_MANAGER),
41  array(
42  'fetchGrid',
43  'fetchCategory',
44  'fetchRow',
45  'addUserGroup',
46  'editUserGroup',
47  'updateUserGroup',
48  'removeUserGroup',
49  'assignStage',
50  'unassignStage'
51  )
52  );
53  }
54 
55  //
56  // Overridden methods from PKPHandler.
57  //
61  function authorize($request, &$args, $roleAssignments) {
62  import('lib.pkp.classes.security.authorization.ContextAccessPolicy');
63  $this->addPolicy(new ContextAccessPolicy($request, $roleAssignments));
64 
65  $operation = $request->getRequestedOp();
66  $workflowStageRequiredOps = array('assignStage', 'unassignStage');
67  if (in_array($operation, $workflowStageRequiredOps)) {
68  import('lib.pkp.classes.security.authorization.internal.WorkflowStageRequiredPolicy');
69  $this->addPolicy(new WorkflowStageRequiredPolicy($request->getUserVar('stageId')));
70  }
71 
72  $userGroupRequiredOps = array_merge($workflowStageRequiredOps, array('editUserGroup', 'updateUserGroup', 'removeUserGroup'));
73  if (in_array($operation, $userGroupRequiredOps)) {
74  // Validate the user group object.
75  $userGroupId = $request->getUserVar('userGroupId');
76  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
77  $userGroup = $userGroupDao->getById($userGroupId);
78 
79  if (!$userGroup) {
80  fatalError('Invalid user group id!');
81  } else {
82  $this->_userGroup = $userGroup;
83  }
84  }
85 
86  return parent::authorize($request, $args, $roleAssignments);
87  }
88 
92  function initialize($request, $args = null) {
93  parent::initialize($request, $args);
94 
95  $context = $request->getContext();
96  $this->_contextId = $context->getId();
97 
98  // Load user-related translations.
100  LOCALE_COMPONENT_PKP_USER,
101  LOCALE_COMPONENT_PKP_MANAGER,
102  LOCALE_COMPONENT_APP_MANAGER,
103  LOCALE_COMPONENT_PKP_SUBMISSION
104  );
105 
106  // Basic grid configuration.
107  $this->setTitle('grid.roles.currentRoles');
108 
109  // Add grid-level actions.
110  $router = $request->getRouter();
111  $this->addAction(
112  new LinkAction(
113  'addUserGroup',
114  new AjaxModal(
115  $router->url($request, null, null, 'addUserGroup'),
116  __('grid.roles.add'),
117  'modal_add_role'
118  ),
119  __('grid.roles.add'),
120  'add_role'
121  )
122  );
123 
124  import('lib.pkp.controllers.grid.settings.roles.UserGroupGridCellProvider');
125  $cellProvider = new UserGroupGridCellProvider();
126 
127  $workflowStagesLocales = WorkflowStageDAO::getWorkflowStageTranslationKeys();
128 
129  // Set array containing the columns info with the same cell provider.
130  $columnsInfo = array(
131  1 => array('id' => 'name', 'title' => 'settings.roles.roleName', 'template' => null),
132  2 => array('id' => 'roleId', 'title' => 'settings.roles.from', 'template' => null)
133  );
134 
135  foreach ($workflowStagesLocales as $stageId => $stageTitleKey) {
136  $columnsInfo[] = array('id' => $stageId, 'title' => $stageTitleKey, 'template' => 'controllers/grid/common/cell/selectStatusCell.tpl');
137  }
138 
139  // Add array columns to the grid.
140  foreach($columnsInfo as $columnInfo) {
141  $this->addColumn(
142  new GridColumn(
143  $columnInfo['id'], $columnInfo['title'], null,
144  $columnInfo['template'], $cellProvider
145  )
146  );
147  }
148  }
149 
153  protected function loadData($request, $filter) {
154  $contextId = $this->_getContextId();
155  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
156 
157  $roleIdFilter = null;
158  $stageIdFilter = null;
159 
160  if (!is_array($filter)) {
161  $filter = array();
162  }
163 
164  if (isset($filter['selectedRoleId'])) {
165  $roleIdFilter = $filter['selectedRoleId'];
166  }
167 
168  if (isset($filter['selectedStageId'])) {
169  $stageIdFilter = $filter['selectedStageId'];
170  }
171 
172  $rangeInfo = $this->getGridRangeInfo($request, $this->getId());
173 
174  if ($stageIdFilter && $stageIdFilter != 0) {
175  return $userGroupDao->getUserGroupsByStage($contextId, $stageIdFilter, $roleIdFilter, $rangeInfo);
176  } else if ($roleIdFilter && $roleIdFilter != 0) {
177  return $userGroupDao->getByRoleId($contextId, $roleIdFilter, false, $rangeInfo);
178  } else {
179  return $userGroupDao->getByContextId($contextId, $rangeInfo);
180  }
181  }
182 
187  protected function getRowInstance() {
188  import('lib.pkp.controllers.grid.settings.roles.UserGroupGridRow');
189  return new UserGroupGridRow();
190  }
191 
195  function renderFilter($request, $filterData = array()) {
196  // Get filter data.
197  $roleDao = DAORegistry::getDAO('RoleDAO'); /* @var $roleDao RoleDAO */
198  $roleOptions = array(0 => 'grid.user.allPermissionLevels') + Application::getRoleNames(true);
199 
200  // Reader roles are not important for stage assignments.
201  if (array_key_exists(ROLE_ID_READER, $roleOptions)) {
202  unset($roleOptions[ROLE_ID_READER]);
203  }
204 
205  $filterData = array('roleOptions' => $roleOptions);
206 
207  $workflowStages = array(0 => 'grid.userGroup.allStages') + WorkflowStageDAO::getWorkflowStageTranslationKeys();
208  $filterData['stageOptions'] = $workflowStages;
209 
210  return parent::renderFilter($request, $filterData);
211  }
212 
217  function getFilterSelectionData($request) {
218  $selectedRoleId = $request->getUserVar('selectedRoleId');
219  $selectedStageId = $request->getUserVar('selectedStageId');
220 
221  // Cast or set to grid filter default value (all roles).
222  $selectedRoleId = (is_null($selectedRoleId) ? 0 : (int)$selectedRoleId);
223  $selectedStageId = (is_null($selectedStageId) ? 0 : (int)$selectedStageId);
224 
225  return array ('selectedRoleId' => $selectedRoleId, 'selectedStageId' => $selectedStageId);
226  }
227 
232  protected function getFilterForm() {
233  return 'controllers/grid/settings/roles/userGroupsGridFilter.tpl';
234  }
235 
239  function initFeatures($request, $args) {
240  import('lib.pkp.classes.controllers.grid.feature.PagingFeature');
241  return array(new PagingFeature());
242  }
243 
244 
245  //
246  // Handler operations.
247  //
253  function addUserGroup($args, $request) {
254  return $this->editUserGroup($args, $request);
255  }
256 
262  function editUserGroup($args, $request) {
263  $userGroupForm = $this->_getUserGroupForm($request);
264 
265  $userGroupForm->initData();
266 
267  return new JSONMessage(true, $userGroupForm->fetch($request));
268  }
269 
276  function updateUserGroup($args, $request) {
277  $userGroupForm = $this->_getUserGroupForm($request);
278 
279  $userGroupForm->readInputData();
280  if($userGroupForm->validate()) {
281  $notificationMgr = new NotificationManager();
282  $notificationMgr->createTrivialNotification($request->getUser()->getId());
283  $userGroupForm->execute();
284  $json = DAO::getDataChangedEvent();
285  $json->setGlobalEvent('userGroupUpdated');
286  return $json;
287  } else {
288  return new JSONMessage(true, $userGroupForm->fetch($request));
289  }
290  }
291 
298  function removeUserGroup($args, $request) {
299  if (!$request->checkCSRF()) return new JSONMessage(false);
300 
301  $user = $request->getUser();
302  $userGroup = $this->_userGroup;
303  $contextId = $this->_getContextId();
304  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
305  $notificationMgr = new NotificationManager();
306 
307  $usersAssignedToUserGroupCount = $userGroupDao->getContextUsersCount($contextId, $userGroup->getId());
308  if ($usersAssignedToUserGroupCount == 0) {
309  if ($userGroupDao->isDefault($userGroup->getId())) {
310  // Can't delete default user groups.
311  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_WARNING,
312  array('contents' => __('grid.userGroup.cantRemoveDefaultUserGroup',
313  array('userGroupName' => $userGroup->getLocalizedName() )
314  )));
315  } else {
316  // We can delete, no user assigned yet.
317  $userGroupDao->deleteObject($userGroup);
318  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS,
319  array('contents' => __('grid.userGroup.removed',
320  array('userGroupName' => $userGroup->getLocalizedName() )
321  )));
322  }
323  } else {
324  // Can't delete while an user
325  // is still assigned to that user group.
326  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_WARNING,
327  array('contents' => __('grid.userGroup.cantRemoveUserGroup',
328  array('userGroupName' => $userGroup->getLocalizedName() , 'usersCount' => $usersAssignedToUserGroupCount)
329  )));
330 
331  }
332 
333  $json = DAO::getDataChangedEvent($userGroup->getId());
334  $json->setGlobalEvent('userGroupUpdated');
335  return $json;
336  }
337 
343  function assignStage($args, $request) {
344  return $this->_toggleAssignment($args, $request);
345  }
346 
352  function unassignStage($args, $request) {
353  return $this->_toggleAssignment($args, $request);
354  }
355 
356  //
357  // Private helper methods.
358  //
359 
366  private function _toggleAssignment($args, $request) {
367  $userGroup = $this->_userGroup;
368  $stageId = $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE);
369  $contextId = $this->_getContextId();
370  $operation = $request->getRequestedOp();
371 
372  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
373 
374  switch($operation) {
375  case 'assignStage':
376  $userGroupDao->assignGroupToStage($contextId, $userGroup->getId(), $stageId);
377  $messageKey = 'grid.userGroup.assignedStage';
378  break;
379  case 'unassignStage':
380  $userGroupDao->removeGroupFromStage($contextId, $userGroup->getId(), $stageId);
381  $messageKey = 'grid.userGroup.unassignedStage';
382  break;
383  }
384 
385  $notificationMgr = new NotificationManager();
386  $user = $request->getUser();
387 
389 
390  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS,
391  array('contents' => __($messageKey,
392  array('userGroupName' => $userGroup->getLocalizedName(), 'stageName' => __($stageLocaleKeys[$stageId]))
393  )));
394 
395  return DAO::getDataChangedEvent($userGroup->getId());
396  }
397 
403  private function _getUserGroupForm($request) {
404  // Get the user group Id.
405  $userGroupId = (int) $request->getUserVar('userGroupId');
406 
407  // Instantiate the files form.
408  import('lib.pkp.controllers.grid.settings.roles.form.UserGroupForm');
409  $contextId = $this->_getContextId();
410  return new UserGroupForm($contextId, $userGroupId);
411  }
412 
417  private function _getContextId() {
418  return $this->_contextId;
419  }
420 }
UserGroupGridHandler\removeUserGroup
removeUserGroup($args, $request)
Definition: UserGroupGridHandler.inc.php:304
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
ContextAccessPolicy
Class to control access to PKP applications' setup components.
Definition: ContextAccessPolicy.inc.php:17
WorkflowStageDAO\getWorkflowStageTranslationKeys
static getWorkflowStageTranslationKeys()
Definition: WorkflowStageDAO.inc.php:73
UserGroupGridHandler\getRowInstance
getRowInstance()
Definition: UserGroupGridHandler.inc.php:193
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
UserGroupGridHandler\unassignStage
unassignStage($args, $request)
Definition: UserGroupGridHandler.inc.php:358
PKPHandler\getId
getId()
Definition: PKPHandler.inc.php:107
UserGroupGridHandler\__construct
__construct()
Definition: UserGroupGridHandler.inc.php:42
UserGroupGridHandler
Handle operations for user group management operations.
Definition: UserGroupGridHandler.inc.php:24
UserGroupForm
Form to add/edit user group.
Definition: UserGroupForm.inc.php:19
UserGroupGridHandler\loadData
loadData($request, $filter)
Definition: UserGroupGridHandler.inc.php:159
UserGroupGridHandler\getFilterForm
getFilterForm()
Definition: UserGroupGridHandler.inc.php:238
UserGroupGridHandler\updateUserGroup
updateUserGroup($args, $request)
Definition: UserGroupGridHandler.inc.php:282
UserGroupGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: UserGroupGridHandler.inc.php:67
GridHandler\addAction
addAction($action, $position=GRID_ACTION_POSITION_ABOVE)
Definition: GridHandler.inc.php:266
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
UserGroupGridHandler\addUserGroup
addUserGroup($args, $request)
Definition: UserGroupGridHandler.inc.php:259
UserGroupGridHandler\renderFilter
renderFilter($request, $filterData=array())
Definition: UserGroupGridHandler.inc.php:201
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
AjaxModal
A modal that retrieves its content from via AJAX.
Definition: AjaxModal.inc.php:18
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
PagingFeature
Add paging functionality to grids.
Definition: PagingFeature.inc.php:19
GridHandler\setTitle
setTitle($title)
Definition: GridHandler.inc.php:215
UserGroupGridHandler\getFilterSelectionData
getFilterSelectionData($request)
Definition: UserGroupGridHandler.inc.php:223
GridHandler\getGridRangeInfo
getGridRangeInfo($request, $rangeName, $contextData=null)
Definition: GridHandler.inc.php:589
UserGroupGridHandler\editUserGroup
editUserGroup($args, $request)
Definition: UserGroupGridHandler.inc.php:268
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
UserGroupGridHandler\assignStage
assignStage($args, $request)
Definition: UserGroupGridHandler.inc.php:349
GridHandler
This class defines basic operations for handling HTML grids. Grids are used to implement a standardiz...
Definition: GridHandler.inc.php:58
NotificationManager
Definition: NotificationManager.inc.php:19
UserGroupGridCellProvider
Cell provider for columns in a user group grid.
Definition: UserGroupGridCellProvider.inc.php:18
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
UserGroupGridHandler\initFeatures
initFeatures($request, $args)
Definition: UserGroupGridHandler.inc.php:245
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
WorkflowStageRequiredPolicy
Policy that ensures that the given workflow stage is valid.
Definition: WorkflowStageRequiredPolicy.inc.php:17
PKPApplication\getRoleNames
static getRoleNames($contextOnly=false, $roleIds=null)
Definition: PKPApplication.inc.php:736
UserGroupGridHandler\initialize
initialize($request, $args=null)
Definition: UserGroupGridHandler.inc.php:98
UserGroupGridRow
User group grid row definition.
Definition: UserGroupGridRow.inc.php:18