Open Journal Systems  3.3.0
QueryForm.inc.php
1 <?php
2 
16 import('lib.pkp.classes.form.Form');
17 
18 class QueryForm extends Form {
20  var $_assocType;
21 
23  var $_assocId;
24 
26  var $_stageId;
27 
29  var $_query;
30 
32  var $_isNew;
33 
43  function __construct($request, $assocType, $assocId, $stageId, $queryId = null) {
44  parent::__construct('controllers/grid/queries/form/queryForm.tpl');
45  $this->setStageId($stageId);
46 
47  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
48  if (!$queryId) {
49  $this->_isNew = true;
50 
51  // Create a query
52  $query = $queryDao->newDataObject();
53  $query->setAssocType($assocType);
54  $query->setAssocId($assocId);
55  $query->setStageId($stageId);
56  $query->setSequence(REALLY_BIG_NUMBER);
57  $queryDao->insertObject($query);
58  $queryDao->resequence($assocType, $assocId);
59 
60  // Add the current user as a participant by default.
61  $queryDao->insertParticipant($query->getId(), $request->getUser()->getId());
62 
63  // Create a head note
64  $noteDao = DAORegistry::getDAO('NoteDAO'); /* @var $noteDao NoteDAO */
65  $headNote = $noteDao->newDataObject();
66  $headNote->setUserId($request->getUser()->getId());
67  $headNote->setAssocType(ASSOC_TYPE_QUERY);
68  $headNote->setAssocId($query->getId());
69  $headNote->setDateCreated(Core::getCurrentDate());
70  $noteDao->insertObject($headNote);
71  } else {
72  $query = $queryDao->getById($queryId, $assocType, $assocId);
73  assert(isset($query));
74  // New queries will not have a head note.
75  $this->_isNew = !$query->getHeadNote();
76  }
77 
78  $this->setQuery($query);
79 
80  // Validation checks for this form
81  $this->addCheck(new FormValidatorCustom($this, 'users', 'required', 'stageParticipants.notify.warning', function($users) {
82  return count($users) > 1;
83  }));
84  $this->addCheck(new FormValidator($this, 'subject', 'required', 'submission.queries.subjectRequired'));
85  $this->addCheck(new FormValidator($this, 'comment', 'required', 'submission.queries.messageRequired'));
86  $this->addCheck(new FormValidatorPost($this));
87  $this->addCheck(new FormValidatorCSRF($this));
88  }
89 
90  //
91  // Getters and Setters
92  //
97  function getQuery() {
98  return $this->_query;
99  }
100 
105  function setQuery($query) {
106  $this->_query = $query;
107  }
108 
113  function getStageId() {
114  return $this->_stageId;
115  }
116 
121  function setStageId($stageId) {
122  $this->_stageId = $stageId;
123  }
124 
129  function getAssocType() {
130  return $this->getData('assocType');
131  }
132 
137  function setAssocType($assocType) {
138  $this->setData('assocType', $assocType);
139  }
140 
145  function getAssocId() {
146  return $this->getData('assocId');
147  }
148 
153  function setAssocId($assocId) {
154  $this->setData('assocId', $assocId);
155  }
156 
157 
158  //
159  // Overridden template methods
160  //
164  function initData() {
165  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
166  if ($query = $this->getQuery()) {
167  $headNote = $query->getHeadNote();
168  $this->_data = array(
169  'queryId' => $query->getId(),
170  'subject' => $headNote?$headNote->getTitle():null,
171  'comment' => $headNote?$headNote->getContents():null,
172  'userIds' => $queryDao->getParticipantIds($query->getId()),
173  );
174  } else {
175  // set intial defaults for queries.
176  }
177  // in order to be able to use the hook
178  return parent::initData();
179  }
180 
187  function fetch($request, $template = null, $display = false, $actionArgs = array()) {
188  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_EDITOR);
189 
190  $query = $this->getQuery();
191  $headNote = $query->getHeadNote();
192  $user = $request->getUser();
193  $context = $request->getContext();
194 
195  $templateMgr = TemplateManager::getManager($request);
196  $templateMgr->assign(array(
197  'isNew' => $this->_isNew,
198  'noteId' => $headNote->getId(),
199  'actionArgs' => $actionArgs,
200  'csrfToken' => $request->getSession()->getCSRFToken(),
201  ));
202 
203  // Queryies only support ASSOC_TYPE_SUBMISSION so far
204  if ($query->getAssocType() == ASSOC_TYPE_SUBMISSION) {
205 
206  $stageAssignmentDao = DAORegistry::getDAO('StageAssignmentDAO'); /* @var $stageAssignmentDao StageAssignmentDAO */
207 
208  // Get currently selected participants in the query
209  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
210  $assignedParticipants = $query->getId() ? $queryDao->getParticipantIds($query->getId()) : array();
211 
212  // Always include current user, even if not with a stage assignment
213  $includeUsers[] = $user->getId();
214  $excludeUsers = null;
215 
216  // When in review stage, include/exclude users depending on the current users role
217  $reviewAssignments = array();
218  if ($query->getStageId() == WORKFLOW_STAGE_ID_EXTERNAL_REVIEW || $query->getStageId() == WORKFLOW_STAGE_ID_INTERNAL_REVIEW) {
219 
220  // Get all review assignments for current submission
221  $reviewAssignmentDao = DAORegistry::getDAO('ReviewAssignmentDAO'); /* @var $reviewAssignmentDao ReviewAssignmentDAO */
222  $reviewAssignments = $reviewAssignmentDao->getBySubmissionId($query->getAssocId());
223 
224  // Get current users roles
225  $assignedRoles = [];
226  $usersAssignments = $stageAssignmentDao->getBySubmissionAndStageId($query->getAssocId(), $query->getStageId(), null, $user->getId());
227  while ($usersAssignment = $usersAssignments->next()) {
228  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
229  $userGroup = $userGroupDao->getById($usersAssignment->getUserGroupId());
230  $assignedRoles[] = $userGroup->getRoleId();
231  }
232 
233  // if current user is editor, add all reviewers
234  if ($user->hasRole([ROLE_ID_SITE_ADMIN], CONTEXT_SITE) ||
235  array_intersect([ROLE_ID_MANAGER, ROLE_ID_SUB_EDITOR], $assignedRoles)) {
236  foreach ($reviewAssignments as $reviewAssignment) {
237  $includeUsers[] = $reviewAssignment->getReviewerId();
238  }
239  }
240 
241  // if current user is blind reviewer, filter out authors
242  foreach ($reviewAssignments as $reviewAssignment) {
243  if ($reviewAssignment->getReviewerId() == $user->getId() ){
244  if ($reviewAssignment->getReviewMethod() != SUBMISSION_REVIEW_METHOD_OPEN){
245  $authorAssignments = $stageAssignmentDao->getBySubmissionAndRoleId($query->getAssocId(), ROLE_ID_AUTHOR);
246  while ($assignment = $authorAssignments->next()) {
247  $excludeUsers[] = $assignment->getUserId();
248  }
249  }
250  }
251  }
252 
253  // if current user is author, add open reviewers who have accepted the request
254  if (array_intersect(array(ROLE_ID_AUTHOR), $assignedRoles)) {
255  foreach ($reviewAssignments as $reviewAssignment) {
256  if ($reviewAssignment->getReviewMethod() == SUBMISSION_REVIEW_METHOD_OPEN && $reviewAssignment->getDateConfirmed()){
257  $includeUsers[] = $reviewAssignment->getReviewerId();
258  }
259  }
260  }
261  }
262 
263  // Get list of participants to include in query
264  $params = [
265  'contextId' => $context->getId(),
266  'count' => 100, // high upper value
267  'offset' => 0,
268  'assignedToSubmission' => $query->getAssocId(),
269  'assignedToSubmissionStage' => $query->getStageId(),
270  'includeUsers' => $includeUsers,
271  'excludeUsers' => $excludeUsers,
272  ];
273 
274  $userService = Services::get('user');
275  $usersIterator = $userService->getMany($params);
276 
277  $allParticipants = [];
278  if (count($usersIterator)) {
279  $userGroupDao = DAORegistry::getDAO('UserGroupDAO'); /* @var $userGroupDao UserGroupDAO */
280  foreach ($usersIterator as $user) {
281  $allUserGroups = $userGroupDao->getByUserId($user->getId(), $context->getId())->toArray();
282 
283  $userRoles = array();
284  $userAssignments = $stageAssignmentDao->getBySubmissionAndStageId($query->getAssocId(), $query->getStageId(), null, $user->getId())->toArray();
285  foreach ($userAssignments as $userAssignment) {
286  foreach ($allUserGroups as $userGroup) {
287  if ($userGroup->getId() == $userAssignment->getUserGroupId()) {
288  $userRoles[] = $userGroup->getLocalizedName();
289  }
290  }
291  }
292  foreach ($reviewAssignments as $assignment) {
293  if ($assignment->getReviewerId() == $user->getId()) {
294  $userRoles[] = __('user.role.reviewer') . " (" . __($assignment->getReviewMethodKey()) . ")";
295  }
296  }
297  if (!count($userRoles)) {
298  $userRoles[] = __('submission.status.unassigned');
299  }
300  $allParticipants[$user->getId()] = __('submission.query.participantTitle', [
301  'fullName' => $user->getFullName(),
302  'userGroup' => join(__('common.commaListSeparator'), $userRoles),
303  ]);
304  }
305  }
306 
307  $templateMgr->assign([
308  'allParticipants' => $allParticipants,
309  'assignedParticipants' => $assignedParticipants,
310  ]);
311  }
312 
313  return parent::fetch($request, $template, $display);
314  }
315 
320  function readInputData() {
321  $this->readUserVars(array(
322  'subject',
323  'comment',
324  'users',
325  ));
326  }
327 
331  function execute(...$functionArgs) {
332  $request = Application::get()->getRequest();
333  $queryDao = DAORegistry::getDAO('QueryDAO'); /* @var $queryDao QueryDAO */
334  $query = $this->getQuery();
335 
336  $headNote = $query->getHeadNote();
337  $headNote->setTitle($this->getData('subject'));
338  $headNote->setContents($this->getData('comment'));
339 
340  $noteDao = DAORegistry::getDAO('NoteDAO'); /* @var $noteDao NoteDAO */
341  $noteDao->updateObject($headNote);
342 
343  $queryDao->updateObject($query);
344 
345  // Update participants
346  $oldParticipantIds = $queryDao->getParticipantIds($query->getId());
347  $newParticipantIds = $this->getData('users');
348  $queryDao->removeAllParticipants($query->getId());
349  foreach ($newParticipantIds as $userId) {
350  $queryDao->insertParticipant($query->getId(), $userId);
351  }
352 
353  // Update participant notifications
354  $notificationManager = new NotificationManager();
355  $removed = array_diff($oldParticipantIds, $newParticipantIds);
356  $added = array_diff($newParticipantIds, $oldParticipantIds);
357  foreach($removed as $userId) {
358  // Delete this users's notifications relating to this query
359  $notificationDao = DAORegistry::getDAO('NotificationDAO'); /* @var $notificationDao NotificationDAO */
360  $notificationDao->deleteByAssoc(ASSOC_TYPE_QUERY, $query->getId(), $userId);
361  }
362  $currentUser = $request->getUser();
363  foreach($added as $userId) {
364  // Skip sending a message to the current user.
365  if ($currentUser->getId() == $userId) {
366  continue;
367  }
368  $notificationManager->createNotification(
369  $request,
370  $userId,
371  NOTIFICATION_TYPE_NEW_QUERY,
372  $request->getContext()->getId(),
373  ASSOC_TYPE_QUERY,
374  $query->getId(),
375  NOTIFICATION_LEVEL_TASK
376  );
377  }
378 
379  // Stamp the submission status modification date.
380  if ($query->getAssocType() == ASSOC_TYPE_SUBMISSION) {
381  $submission = Services::get('submission')->get($query->getAssocId());
382  $submission->stampLastActivity();
383  $submissionDao = DAORegistry::getDAO('SubmissionDAO'); /* @var $submissionDao SubmissionDAO */
384  $submissionDao->updateObject($submission);
385  }
386 
387  parent::execute(...$functionArgs);
388  }
389 }
QueryForm\setQuery
setQuery($query)
Definition: QueryForm.inc.php:120
QueryForm\$_assocType
$_assocType
Definition: QueryForm.inc.php:23
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
QueryForm\getStageId
getStageId()
Definition: QueryForm.inc.php:128
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
QueryForm\setAssocId
setAssocId($assocId)
Definition: QueryForm.inc.php:168
Form\setData
setData($key, $value=null)
Definition: Form.inc.php:229
Form\readUserVars
readUserVars($vars)
Definition: Form.inc.php:378
QueryForm\setAssocType
setAssocType($assocType)
Definition: QueryForm.inc.php:152
Form\getData
getData($key)
Definition: Form.inc.php:220
FormValidatorPost
Form validation check to make sure the form is POSTed.
Definition: FormValidatorPost.inc.php:18
QueryForm\$_query
$_query
Definition: QueryForm.inc.php:41
QueryForm\getAssocType
getAssocType()
Definition: QueryForm.inc.php:144
QueryForm\__construct
__construct($request, $assocType, $assocId, $stageId, $queryId=null)
Definition: QueryForm.inc.php:58
QueryForm
Form for adding/editing a new query.
Definition: QueryForm.inc.php:18
Seboettg\Collection\count
count()
Definition: ArrayListTrait.php:253
QueryForm\$_isNew
$_isNew
Definition: QueryForm.inc.php:47
QueryForm\getAssocId
getAssocId()
Definition: QueryForm.inc.php:160
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
QueryForm\setStageId
setStageId($stageId)
Definition: QueryForm.inc.php:136
FormValidator
Class to represent a form validation check.
Definition: FormValidator.inc.php:23
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Form\addCheck
addCheck($formValidator)
Definition: Form.inc.php:395
NotificationManager
Definition: NotificationManager.inc.php:19
QueryForm\execute
execute(... $functionArgs)
Definition: QueryForm.inc.php:346
FormValidatorCSRF
Form validation check to make sure the CSRF token is correct.
Definition: FormValidatorCSRF.inc.php:18
Form
Class defining basic operations for handling HTML forms.
Definition: Form.inc.php:47
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
QueryForm\$_stageId
$_stageId
Definition: QueryForm.inc.php:35
FormValidatorCustom
Form validation check with a custom user function performing the validation check.
Definition: FormValidatorCustom.inc.php:18
QueryForm\$_assocId
$_assocId
Definition: QueryForm.inc.php:29
QueryForm\getQuery
getQuery()
Definition: QueryForm.inc.php:112
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49
QueryForm\fetch
fetch($request, $template=null, $display=false, $actionArgs=array())
Definition: QueryForm.inc.php:202
QueryForm\initData
initData()
Definition: QueryForm.inc.php:179
QueryForm\readInputData
readInputData()
Definition: QueryForm.inc.php:335