Open Monograph Press  3.3.0
StageParticipantGridHandler.inc.php
1 <?php
2 
16 // import grid base classes
17 import('lib.pkp.classes.controllers.grid.CategoryGridHandler');
18 
19 // import stageParticipant grid specific classes
20 import('lib.pkp.controllers.grid.users.stageParticipant.StageParticipantGridRow');
21 import('lib.pkp.controllers.grid.users.stageParticipant.StageParticipantGridCategoryRow');
22 import('classes.log.SubmissionEventLogEntry'); // App-specific.
23 
24 import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
25 
30  function __construct() {
31  parent::__construct();
32 
33  // Assistants get read-only access
34  $this->addRoleAssignment(
35  array(ROLE_ID_ASSISTANT),
36  $peOps = array('fetchGrid', 'fetchCategory', 'fetchRow', 'viewNotify', 'fetchTemplateBody', 'sendNotification')
37  );
38 
39  // Managers and Editors additionally get administrative access
40  $this->addRoleAssignment(
41  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR),
42  array_merge($peOps, array('addParticipant', 'deleteParticipant', 'saveParticipant', 'fetchUserList'))
43  );
44  $this->setTitle('editor.submission.stageParticipants');
45  }
46 
47 
48  //
49  // Getters/Setters
50  //
55  function getSubmission() {
56  return $this->getAuthorizedContextObject(ASSOC_TYPE_SUBMISSION);
57  }
58 
63  function getStageId() {
64  return $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE);
65  }
66 
67  //
68  // Overridden methods from PKPHandler
69  //
73  function authorize($request, &$args, $roleAssignments) {
74  $stageId = (int) $request->getUserVar('stageId');
75  import('lib.pkp.classes.security.authorization.WorkflowStageAccessPolicy');
76  $this->addPolicy(new WorkflowStageAccessPolicy($request, $args, $roleAssignments, 'submissionId', $stageId));
77  return parent::authorize($request, $args, $roleAssignments);
78  }
79 
85  protected function _canAdminister() {
86  // If the current role set includes Manager or Editor, grant.
87  return (boolean) array_intersect(
88  array(ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR),
89  $this->getAuthorizedContextObject(ASSOC_TYPE_USER_ROLES)
90  );
91  }
92 
93 
97  function initialize($request, $args = null) {
98  parent::initialize($request, $args);
99 
100  // Load submission-specific translations
102  LOCALE_COMPONENT_APP_EDITOR,
103  LOCALE_COMPONENT_PKP_USER,
104  LOCALE_COMPONENT_APP_DEFAULT,
105  LOCALE_COMPONENT_PKP_DEFAULT,
106  LOCALE_COMPONENT_PKP_SUBMISSION
107  );
108 
109  // Columns
110  import('lib.pkp.controllers.grid.users.stageParticipant.StageParticipantGridCellProvider');
111  $cellProvider = new StageParticipantGridCellProvider();
112  $this->addColumn(new GridColumn(
113  'participants',
114  null,
115  null,
116  null,
117  $cellProvider
118  ));
119  $submission = $this->getSubmission();
120  $submissionId = $submission->getId();
121  if (Validation::isLoggedInAs()) {
122  $router = $request->getRouter();
123  $dispatcher = $router->getDispatcher();
124  $user = $request->getUser();
125  $redirectUrl = $dispatcher->url(
126  $request,
127  ROUTE_PAGE,
128  null,
129  'workflow',
130  'access',
131  $submissionId
132  );
133  import('lib.pkp.classes.linkAction.request.RedirectAction');
134  $this->addAction(
135  new LinkAction(
136  'signOutAsUser',
137  new RedirectAction(
138  $dispatcher->url($request, ROUTE_PAGE, null, 'login', 'signOutAsUser', null, array('redirectUrl' => $redirectUrl))
139  ),
140  __('user.logOutAs').' '. $user->getUsername(),
141  null,
142  __('user.logOutAs')
143  )
144  );
145  }
146 
147  // The "Add stage participant" grid action is available to
148  // Editors and Managers only
149  if ($this->_canAdminister()) {
150  $router = $request->getRouter();
151  $this->addAction(
152  new LinkAction(
153  'requestAccount',
154  new AjaxModal(
155  $router->url($request, null, null, 'addParticipant', null, $this->getRequestArgs()),
156  __('editor.submission.addStageParticipant'),
157  'modal_add_user'
158  ),
159  __('common.assign'),
160  'add_user'
161  )
162  );
163  }
164 
165  $this->setEmptyCategoryRowText('editor.submission.noneAssigned');
166  }
167 
168 
169  //
170  // Overridden methods from [Category]GridHandler
171  //
175  function loadCategoryData($request, &$userGroup, $filter = null) {
176  // Retrieve useful objects.
177  $submission = $this->getSubmission();
178  $stageId = $this->getStageId();
179 
180  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
181  $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId(
182  $submission->getId(),
183  $stageId,
184  $userGroup->getId()
185  );
186 
187  return $stageAssignments->toAssociativeArray();
188  }
189 
193  function getIsSubcomponent() {
194  return true;
195  }
196 
200  protected function getRowInstance() {
201  return new StageParticipantGridRow($this->getSubmission(), $this->getStageId(), $this->_canAdminister());
202  }
203 
207  protected function getCategoryRowInstance() {
208  $submission = $this->getSubmission();
209  return new StageParticipantGridCategoryRow($submission, $this->getStageId());
210  }
211 
216  return 'userGroupId';
217  }
218 
222  function getRequestArgs() {
223  $submission = $this->getSubmission();
224  return array_merge(
225  parent::getRequestArgs(),
226  array(
227  'submissionId' => $submission->getId(),
228  'stageId' => $this->getStageId(),
229  )
230  );
231  }
232 
236  protected function loadData($request, $filter) {
237  $submission = $this->getSubmission();
238  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
239  $stageAssignments = $stageAssignmentDao->getBySubmissionAndStageId(
240  $this->getSubmission()->getId(),
241  $this->getStageId()
242  );
243 
244  // Make a list of the active (non-reviewer) user groups.
245  $userGroupIds = array();
246  while ($stageAssignment = $stageAssignments->next()) {
247  $userGroupIds[] = $stageAssignment->getUserGroupId();
248  }
249 
250  // Fetch the desired user groups as objects.
251  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
252  $context = $request->getContext();
253  $result = array();
254  $userGroups = $userGroupDao->getUserGroupsByStage(
255  $request->getContext()->getId(),
256  $this->getStageId()
257  );
258  while ($userGroup = $userGroups->next()) {
259  if ($userGroup->getRoleId() == ROLE_ID_REVIEWER) continue;
260  if (!in_array($userGroup->getId(), $userGroupIds)) continue;
261  $result[$userGroup->getId()] = $userGroup;
262  }
263  return $result;
264  }
265 
266 
267  //
268  // Public actions
269  //
276  function addParticipant($args, $request) {
277  $submission = $this->getSubmission();
278  $stageId = $this->getStageId();
279  $assignmentId = null;
280  if (array_key_exists('assignmentId', $args)) {
281  $assignmentId = $args['assignmentId'];
282  }
283  $userGroups = $this->getGridDataElements($request);
284 
285  import('lib.pkp.controllers.grid.users.stageParticipant.form.AddParticipantForm');
286  $form = new AddParticipantForm($submission, $stageId, $assignmentId);
287  $form->initData();
288 
289  return new JSONMessage(true, $form->fetch($request));
290  }
291 
298  function saveParticipant($args, $request) {
299  $submission = $this->getSubmission();
300  $stageId = $this->getStageId();
301  $assignmentId = $args['assignmentId'];
302  $userGroups = $this->getGridDataElements($request);
303 
304  import('lib.pkp.controllers.grid.users.stageParticipant.form.AddParticipantForm');
305  $form = new AddParticipantForm($submission, $stageId, $assignmentId);
306  $form->readInputData();
307  if ($form->validate()) {
308  list($userGroupId, $userId, $stageAssignmentId) = $form->execute();
309 
310  $notificationMgr = new NotificationManager();
311 
312  // Check user group role id.
313  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
314  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
315 
316  $userGroup = $userGroupDao->getById($userGroupId);
317  import('classes.workflow.EditorDecisionActionsManager');
318  if ($userGroup->getRoleId() == ROLE_ID_MANAGER) {
319  $notificationMgr->updateNotification(
320  $request,
321  (new EditorDecisionActionsManager())->getStageNotifications(),
322  null,
323  ASSOC_TYPE_SUBMISSION,
324  $submission->getId()
325  );
326  }
327 
329  foreach ($stages as $workingStageId) {
330  // remove the 'editor required' task if we now have an editor assigned
331  if ($stageAssignmentDao->editorAssignedToStage($submission->getId(), $workingStageId)) {
332  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
333  $notificationDao->deleteByAssoc(ASSOC_TYPE_SUBMISSION, $submission->getId(), null, NOTIFICATION_TYPE_EDITOR_ASSIGNMENT_REQUIRED);
334  }
335  }
336 
337  // Create trivial notification.
338  $user = $request->getUser();
339  if ($stageAssignmentId != $assignmentId) { // New assignment added
340  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('notification.addedStageParticipant')));
341  } else {
342  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('notification.editStageParticipant')));
343  }
344 
345 
346  // Log addition.
347  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
348  $assignedUser = $userDao->getById($userId);
349  import('lib.pkp.classes.log.SubmissionLog');
350  SubmissionLog::logEvent($request, $submission, SUBMISSION_LOG_ADD_PARTICIPANT, 'submission.event.participantAdded', array('name' => $assignedUser->getFullName(), 'username' => $assignedUser->getUsername(), 'userGroupName' => $userGroup->getLocalizedName()));
351 
352  return DAO::getDataChangedEvent($userGroupId);
353  } else {
354  return new JSONMessage(true, $form->fetch($request));
355  }
356  }
357 
364  function deleteParticipant($args, $request) {
365  $submission = $this->getSubmission();
366  $stageId = $this->getStageId();
367  $assignmentId = (int) $request->getUserVar('assignmentId');
368 
369  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
370  $stageAssignment = $stageAssignmentDao->getById($assignmentId);
371  if (!$request->checkCSRF() || !$stageAssignment || $stageAssignment->getSubmissionId() != $submission->getId()) {
372  return new JSONMessage(false);
373  }
374 
375  // Delete the assignment
376  $stageAssignmentDao->deleteObject($stageAssignment);
377 
378  // FIXME: perhaps we can just insert the notification on page load
379  // instead of having it there all the time?
380  $notificationMgr = new NotificationManager();
381  import('classes.workflow.EditorDecisionActionsManager');
382  $notificationMgr->updateNotification(
383  $request,
384  (new EditorDecisionActionsManager())->getStageNotifications(),
385  null,
386  ASSOC_TYPE_SUBMISSION,
387  $submission->getId()
388  );
389 
390  if ($stageId == WORKFLOW_STAGE_ID_EDITING ||
391  $stageId == WORKFLOW_STAGE_ID_PRODUCTION) {
392 
393  // Update submission notifications
394  $notificationMgr->updateNotification(
395  $request,
396  array(
397  NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
398  NOTIFICATION_TYPE_AWAITING_COPYEDITS,
399  NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
400  NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
401  ),
402  null,
403  ASSOC_TYPE_SUBMISSION,
404  $submission->getId()
405  );
406  }
407 
408  // Log removal.
409  $userDao = DAORegistry::getDAO('UserDAO'); /* @var $userDao UserDAO */
410  $assignedUser = $userDao->getById($stageAssignment->getUserId());
411  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
412  $userGroup = $userGroupDao->getById($stageAssignment->getUserGroupId());
413  import('lib.pkp.classes.log.SubmissionLog');
414  SubmissionLog::logEvent($request, $submission, SUBMISSION_LOG_REMOVE_PARTICIPANT, 'submission.event.participantRemoved', array('name' => $assignedUser->getFullName(), 'username' => $assignedUser->getUsername(), 'userGroupName' => $userGroup->getLocalizedName()));
415 
416  // Redraw the category
417  return DAO::getDataChangedEvent($stageAssignment->getUserGroupId());
418  }
419 
426  function fetchUserList($args, $request) {
427  $submission = $this->getSubmission();
428  $stageId = $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE);
429 
430  $userGroupId = (int) $request->getUserVar('userGroupId');
431 
432  $userStageAssignmentDao = DAORegistry::getDAO('UserStageAssignmentDAO'); /* @var $userStageAssignmentDao UserStageAssignmentDAO */
433  $users = $userStageAssignmentDao->getUsersNotAssignedToStageInUserGroup($submission->getId(), $stageId, $userGroupId);
434 
435  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
436  $userGroup = $userGroupDao->getById($userGroupId);
437  $roleId = $userGroup->getRoleId();
438 
439  $sectionId = $submission->getSectionId();
440  $contextId = $submission->getContextId();
441 
442  $userList = array();
443  while($user = $users->next()) $userList[$user->getId()] = $user->getFullName();
444  if (count($userList) == 0) {
445  $userList[0] = __('common.noMatches');
446  }
447 
448  return new JSONMessage(true, $userList);
449  }
450 
457  function viewNotify($args, $request) {
458  $this->setupTemplate($request);
459 
460  import('controllers.grid.users.stageParticipant.form.StageParticipantNotifyForm'); // exists in each app.
461  $notifyForm = new StageParticipantNotifyForm($this->getSubmission()->getId(), ASSOC_TYPE_SUBMISSION, $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE));
462  $notifyForm->initData();
463 
464  return new JSONMessage(true, $notifyForm->fetch($request));
465  }
466 
473  function sendNotification($args, $request) {
474  $this->setupTemplate($request);
475 
476  import('controllers.grid.users.stageParticipant.form.StageParticipantNotifyForm'); // exists in each app.
477  $notifyForm = new StageParticipantNotifyForm($this->getSubmission()->getId(), ASSOC_TYPE_SUBMISSION, $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE));
478  $notifyForm->readInputData();
479 
480  if ($notifyForm->validate()) {
481  $noteId = $notifyForm->execute();
482 
483  if ($this->getStageId() == WORKFLOW_STAGE_ID_EDITING ||
484  $this->getStageId() == WORKFLOW_STAGE_ID_PRODUCTION) {
485 
486  // Update submission notifications
487  $notificationMgr = new NotificationManager();
488  $notificationMgr->updateNotification(
489  $request,
490  array(
491  NOTIFICATION_TYPE_ASSIGN_COPYEDITOR,
492  NOTIFICATION_TYPE_AWAITING_COPYEDITS,
493  NOTIFICATION_TYPE_ASSIGN_PRODUCTIONUSER,
494  NOTIFICATION_TYPE_AWAITING_REPRESENTATIONS,
495  ),
496  null,
497  ASSOC_TYPE_SUBMISSION,
498  $this->getSubmission()->getId()
499  );
500  }
501 
502  $json = new JSONMessage(true);
503  $json->setGlobalEvent('stageStatusUpdated');
504  return $json;
505  } else {
506  // Return a JSON string indicating failure
507  return new JSONMessage(false);
508  }
509  }
510 
517  function fetchTemplateBody($args, $request) {
518  $templateId = $request->getUserVar('template');
519  import('lib.pkp.classes.mail.SubmissionMailTemplate');
520  $template = new SubmissionMailTemplate($this->getSubmission(), $templateId);
521  if ($template) {
522  $user = $request->getUser();
523  $dispatcher = $request->getDispatcher();
524  $context = $request->getContext();
525  $template->assignParams(array(
526  'editorialContactSignature' => $user->getContactSignature(),
527  'signatureFullName' => $user->getFullname(),
528  ));
529  $template->replaceParams();
530 
531  import('controllers.grid.users.stageParticipant.form.StageParticipantNotifyForm'); // exists in each app.
532  $notifyForm = new StageParticipantNotifyForm($this->getSubmission()->getId(), ASSOC_TYPE_SUBMISSION, $this->getAuthorizedContextObject(ASSOC_TYPE_WORKFLOW_STAGE));
533  return new JSONMessage(
534  true,
535  array(
536  'body' => $template->getBody(),
537  'variables' => $notifyForm->getEmailVariableNames($templateId),
538  )
539  );
540  }
541  }
542 
547  public function getJSHandler() {
548  return '$.pkp.controllers.grid.users.stageParticipant.StageParticipantGridHandler';
549  }
550 }
551 
552 
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
StageParticipantGridHandler\viewNotify
viewNotify($args, $request)
Definition: StageParticipantGridHandler.inc.php:457
StageParticipantGridHandler
Handle stageParticipant grid requests.
Definition: StageParticipantGridHandler.inc.php:26
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
StageParticipantGridCellProvider
Definition: StageParticipantGridCellProvider.inc.php:18
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
Validation\isLoggedInAs
static isLoggedInAs()
Definition: Validation.inc.php:388
StageParticipantGridHandler\loadData
loadData($request, $filter)
Definition: StageParticipantGridHandler.inc.php:236
StageParticipantGridHandler\initialize
initialize($request, $args=null)
Definition: StageParticipantGridHandler.inc.php:97
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
StageParticipantGridHandler\saveParticipant
saveParticipant($args, $request)
Definition: StageParticipantGridHandler.inc.php:298
SubmissionMailTemplate
Subclass of MailTemplate for sending emails related to submissions.
Definition: SubmissionMailTemplate.inc.php:20
StageParticipantGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: StageParticipantGridHandler.inc.php:73
StageParticipantGridHandler\__construct
__construct()
Definition: StageParticipantGridHandler.inc.php:30
CategoryGridHandler\setEmptyCategoryRowText
setEmptyCategoryRowText($translationKey)
Definition: CategoryGridHandler.inc.php:71
PKPHandler\getId
getId()
Definition: PKPHandler.inc.php:107
SubmissionLog\logEvent
static logEvent($request, $submission, $eventType, $messageKey, $params=array())
Definition: SubmissionLog.inc.php:34
StageParticipantGridHandler\getSubmission
getSubmission()
Definition: StageParticipantGridHandler.inc.php:55
StageParticipantGridHandler\fetchUserList
fetchUserList($args, $request)
Definition: StageParticipantGridHandler.inc.php:426
StageParticipantNotifyForm
Form to notify a user regarding a file.
Definition: StageParticipantNotifyForm.inc.php:19
GridHandler\getGridDataElements
& getGridDataElements($request)
Definition: GridHandler.inc.php:345
GridHandler\addAction
addAction($action, $position=GRID_ACTION_POSITION_ABOVE)
Definition: GridHandler.inc.php:266
StageParticipantGridHandler\addParticipant
addParticipant($args, $request)
Definition: StageParticipantGridHandler.inc.php:276
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
DAO\getDataChangedEvent
static getDataChangedEvent($elementId=null, $parentElementId=null, $content='')
Definition: DAO.inc.php:647
StageParticipantGridHandler\getRequestArgs
getRequestArgs()
Definition: StageParticipantGridHandler.inc.php:222
EditorDecisionActionsManager
Wrapper class for create and assign editor decisions actions to template manager.
Definition: EditorDecisionActionsManager.inc.php:38
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
StageParticipantGridCategoryRow
Stage participant grid category row definition.
Definition: StageParticipantGridCategoryRow.inc.php:21
AjaxModal
A modal that retrieves its content from via AJAX.
Definition: AjaxModal.inc.php:18
StageParticipantGridHandler\loadCategoryData
loadCategoryData($request, &$userGroup, $filter=null)
Definition: StageParticipantGridHandler.inc.php:175
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
StageParticipantGridRow
StageParticipant grid row definition.
Definition: StageParticipantGridRow.inc.php:18
CategoryGridHandler
Class defining basic operations for handling HTML grids with categories.
Definition: CategoryGridHandler.inc.php:23
StageParticipantGridHandler\sendNotification
sendNotification($args, $request)
Definition: StageParticipantGridHandler.inc.php:473
GridHandler\setTitle
setTitle($title)
Definition: GridHandler.inc.php:215
StageParticipantGridHandler\getRowInstance
getRowInstance()
Definition: StageParticipantGridHandler.inc.php:200
RedirectAction
This action request redirects to another page.
Definition: RedirectAction.inc.php:18
StageParticipantGridHandler\getCategoryRowInstance
getCategoryRowInstance()
Definition: StageParticipantGridHandler.inc.php:207
StageParticipantGridHandler\getJSHandler
getJSHandler()
Definition: StageParticipantGridHandler.inc.php:547
AddParticipantForm
Form for adding a stage participant.
Definition: AddParticipantForm.inc.php:18
PKPHandler\getAuthorizedContextObject
& getAuthorizedContextObject($assocType)
Definition: PKPHandler.inc.php:174
WorkflowStageAccessPolicy
Class to control access to OMP's submission workflow stage components.
Definition: WorkflowStageAccessPolicy.inc.php:19
PKPHandler\setupTemplate
setupTemplate($request)
Definition: PKPHandler.inc.php:466
NotificationManager
Definition: NotificationManager.inc.php:19
StageParticipantGridHandler\deleteParticipant
deleteParticipant($args, $request)
Definition: StageParticipantGridHandler.inc.php:364
StageParticipantGridHandler\getCategoryRowIdParameterName
getCategoryRowIdParameterName()
Definition: StageParticipantGridHandler.inc.php:215
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
StageParticipantGridHandler\fetchTemplateBody
fetchTemplateBody($args, $request)
Definition: StageParticipantGridHandler.inc.php:517
Application\getApplicationStages
static getApplicationStages()
Definition: Application.inc.php:182
StageParticipantGridHandler\getIsSubcomponent
getIsSubcomponent()
Definition: StageParticipantGridHandler.inc.php:193
StageParticipantGridHandler\_canAdminister
_canAdminister()
Definition: StageParticipantGridHandler.inc.php:85
StageParticipantGridHandler\getStageId
getStageId()
Definition: StageParticipantGridHandler.inc.php:63